2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 package jalview.ws.dbsources;
23 import static org.testng.AssertJUnit.assertEquals;
24 import static org.testng.AssertJUnit.assertFalse;
25 import static org.testng.AssertJUnit.assertNotNull;
26 import static org.testng.AssertJUnit.assertNull;
28 import jalview.datamodel.PDBEntry;
29 import jalview.datamodel.SequenceI;
30 import jalview.datamodel.xdb.uniprot.UniprotEntry;
31 import jalview.datamodel.xdb.uniprot.UniprotFeature;
32 import jalview.gui.JvOptionPane;
34 import java.io.Reader;
35 import java.io.StringReader;
36 import java.util.Vector;
38 import org.testng.Assert;
39 import org.testng.annotations.BeforeClass;
40 import org.testng.annotations.Test;
42 public class UniprotTest
45 @BeforeClass(alwaysRun = true)
46 public void setUpJvOptionPane()
48 JvOptionPane.setInteractiveMode(false);
49 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
52 // adapted from http://www.uniprot.org/uniprot/A9CKP4.xml
53 private static final String UNIPROT_XML = "<?xml version='1.0' encoding='UTF-8'?>"
55 + "<entry dataset=\"TrEMBL\" created=\"2008-01-15\" modified=\"2015-03-04\" version=\"38\">"
56 + "<accession>A9CKP4</accession>"
57 + "<accession>A9CKP5</accession>"
58 + "<name>A9CKP4_AGRT5</name>"
59 + "<name>A9CKP4_AGRT6</name>"
60 + "<protein><recommendedName><fullName>Mitogen-activated protein kinase 13</fullName><fullName>Henry</fullName></recommendedName></protein>"
61 + "<dbReference type=\"PDB\" id=\"2FSQ\"><property type=\"method\" value=\"X-ray\"/><property type=\"resolution\" value=\"1.40\"/></dbReference>"
62 + "<dbReference type=\"PDBsum\" id=\"2FSR\"/>"
63 + "<dbReference type=\"EMBL\" id=\"AE007869\"><property type=\"protein sequence ID\" value=\"AAK85932.1\"/><property type=\"molecule type\" value=\"Genomic_DNA\"/></dbReference>"
64 + "<feature type=\"signal peptide\" evidence=\"7\"><location><begin position=\"1\"/><end position=\"18\"/></location></feature>"
65 + "<feature type=\"propeptide\" description=\"Activation peptide\" id=\"PRO_0000027399\" evidence=\"9 16 17 18\"><location><begin position=\"19\"/><end position=\"20\"/></location></feature>"
66 + "<feature type=\"chain\" description=\"Granzyme B\" id=\"PRO_0000027400\"><location><begin position=\"21\"/><end position=\"247\"/></location></feature>"
67 + "<feature type=\"sequence variant\"><original>M</original><variation>L</variation><location><position position=\"41\"/></location></feature>"
68 + "<feature type=\"sequence variant\" description=\"Pathogenic\"><original>M</original><variation>L</variation><location><position position=\"41\"/></location></feature>"
69 + "<feature type=\"sequence variant\" description=\"Pathogenic\"><original>M</original><location><position position=\"41\"/></location></feature>"
70 + "<feature type=\"sequence variant\" description=\"Foo\"><variation>L</variation><variation>LMV</variation><original>M</original><location><position position=\"42\"/></location></feature>"
71 + "<feature type=\"sequence variant\" description=\"Foo\"><variation>LL</variation><variation>LMV</variation><original>ML</original><location><begin position=\"42\"/><end position=\"43\"/></location></feature>"
72 + "<feature type=\"sequence variant\" description=\"Foo Too\"><variation>LL</variation><variation>LMVK</variation><original>MLML</original><location><begin position=\"42\"/><end position=\"45\"/></location></feature>"
73 + "<sequence length=\"10\" mass=\"27410\" checksum=\"8CB760AACF88FE6C\" modified=\"2008-01-15\" version=\"1\">MHAPL VSKDL</sequence></entry>"
77 * Test the method that unmarshals XML to a Uniprot model
79 @Test(groups = { "Functional" })
80 public void testGetUniprotEntries()
82 Uniprot u = new Uniprot();
83 Reader reader = new StringReader(UNIPROT_XML);
84 Vector<UniprotEntry> entries = u.getUniprotEntries(reader);
85 assertEquals(1, entries.size());
86 UniprotEntry entry = entries.get(0);
87 assertEquals(2, entry.getName().size());
88 assertEquals("A9CKP4_AGRT5", entry.getName().get(0));
89 assertEquals("A9CKP4_AGRT6", entry.getName().get(1));
90 assertEquals(2, entry.getAccession().size());
91 assertEquals("A9CKP4", entry.getAccession().get(0));
92 assertEquals("A9CKP5", entry.getAccession().get(1));
95 * UniprotSequence drops any space characters
97 assertEquals("MHAPLVSKDL", entry.getUniprotSequence().getContent());
99 assertEquals(2, entry.getProtein().getName().size());
100 assertEquals("Mitogen-activated protein kinase 13", entry.getProtein()
102 assertEquals("Henry", entry.getProtein().getName().get(1));
105 * Check sequence features
107 Vector<UniprotFeature> features = entry.getFeature();
108 assertEquals(9, features.size());
109 UniprotFeature sf = features.get(0);
110 assertEquals("signal peptide", sf.getType());
111 assertNull(sf.getDescription());
112 assertNull(sf.getStatus());
113 assertEquals(1, sf.getBegin());
114 assertEquals(18, sf.getEnd());
115 sf = features.get(1);
116 assertEquals("propeptide", sf.getType());
117 assertEquals("Activation peptide", sf.getDescription());
118 assertEquals(19, sf.getPosition());
119 assertEquals(19, sf.getBegin());
120 assertEquals(20, sf.getEnd());
121 sf = features.get(2);
122 assertEquals("chain", sf.getType());
123 assertEquals("Granzyme B", sf.getDescription());
124 assertEquals(21, sf.getPosition());
125 assertEquals(21, sf.getBegin());
126 assertEquals(247, sf.getEnd());
128 sf = features.get(3);
129 assertEquals("sequence variant", sf.getType());
130 assertNull(sf.getDescription());
131 assertEquals(41, sf.getPosition());
132 assertEquals(41, sf.getBegin());
133 assertEquals(41, sf.getEnd());
135 sf = features.get(4);
136 assertEquals("sequence variant", sf.getType());
137 assertEquals("Pathogenic", sf.getDescription());
138 assertEquals(41, sf.getPosition());
139 assertEquals(41, sf.getBegin());
140 assertEquals(41, sf.getEnd());
142 sf = features.get(5);
143 assertEquals("sequence variant", sf.getType());
144 assertEquals("Pathogenic", sf.getDescription());
145 assertEquals(41, sf.getPosition());
146 assertEquals(41, sf.getBegin());
147 assertEquals(41, sf.getEnd());
149 sf = features.get(6);
150 assertEquals("sequence variant", sf.getType());
152 sf.getDescription());
153 assertEquals(42, sf.getPosition());
154 assertEquals(42, sf.getBegin());
155 assertEquals(42, sf.getEnd());
156 Assert.assertEquals(Uniprot.getDescription(sf),
157 "<html>p.Met42Leu" + "<br/> "
158 + "p.Met42LeuMetVal Foo</html>");
160 sf = features.get(7);
161 assertEquals(42, sf.getBegin());
162 assertEquals(43, sf.getEnd());
163 Assert.assertEquals(Uniprot.getDescription(sf),
164 "<html>p.MetLeu42LeuLeu" + "<br/> "
165 + "p.MetLeu42LeuMetVal Foo</html>");
167 sf = features.get(8);
168 assertEquals(42, sf.getBegin());
169 assertEquals(45, sf.getEnd());
170 Assert.assertEquals(Uniprot.getDescription(sf),
171 "<html>p.MLML42LeuLeu" + "<br/> "
172 + "p.MLML42LMVK Foo Too</html>");
175 * Check cross-references
177 Vector<PDBEntry> xrefs = entry.getDbReference();
178 assertEquals(3, xrefs.size());
180 PDBEntry xref = xrefs.get(0);
181 assertEquals("2FSQ", xref.getId());
182 assertEquals("PDB", xref.getType());
183 assertEquals("X-ray", xref.getProperty("method"));
184 assertEquals("1.40", xref.getProperty("resolution"));
187 assertEquals("2FSR", xref.getId());
188 assertEquals("PDBsum", xref.getType());
189 assertFalse(xref.getProperties().hasMoreElements());
192 assertEquals("AE007869", xref.getId());
193 assertEquals("EMBL", xref.getType());
194 assertEquals("AAK85932.1", xref.getProperty("protein sequence ID"));
195 assertEquals("Genomic_DNA", xref.getProperty("molecule type"));
198 @Test(groups = { "Functional" })
199 public void testGetUniprotSequence()
201 UniprotEntry entry = new Uniprot().getUniprotEntries(
202 new StringReader(UNIPROT_XML)).get(0);
203 SequenceI seq = new Uniprot().uniprotEntryToSequenceI(entry);
205 assertEquals(6, seq.getDBRefs().length); // 2*Uniprot, PDB, PDBsum, 2*EMBL
210 * Test the method that formats the sequence id
212 @Test(groups = { "Functional" })
213 public void testGetUniprotEntryId()
215 UniprotEntry entry = new Uniprot().getUniprotEntries(
216 new StringReader(UNIPROT_XML)).get(0);
219 * name formatted with Uniprot Entry name
221 String expectedName = "A9CKP4_AGRT5|A9CKP4_AGRT6";
222 assertEquals(expectedName,
223 Uniprot.getUniprotEntryId(entry));
227 * Test the method that formats the sequence description
229 @Test(groups = { "Functional" })
230 public void testGetUniprotEntryDescription()
232 UniprotEntry entry = new Uniprot().getUniprotEntries(
233 new StringReader(UNIPROT_XML)).get(0);
236 * recommended names concatenated with space separator
238 String expectedDescription = "Mitogen-activated protein kinase 13 Henry";
239 assertEquals(expectedDescription,
240 Uniprot.getUniprotEntryDescription(entry));
243 @Test(groups = { "Functional" })
244 public void testGetDescription()
246 UniprotFeature uf = new UniprotFeature();
247 assertEquals("", Uniprot.getDescription(uf));
249 uf.setDescription("Hello");
250 assertEquals("Hello", Uniprot.getDescription(uf));
254 Vector<String> vars = new Vector<>();
256 uf.setVariation(vars);
257 assertEquals("p.Lys23Tyr Hello", Uniprot.getDescription(uf));
259 // multiple variants generate an html description over more than one line
261 assertEquals("<html>p.Lys23Tyr<br/> p.Lys23Trp Hello</html>",
262 Uniprot.getDescription(uf));
266 * up to 3 bases (original or variant) are shown using 3 letter code
270 uf.setOriginal("KLS");
271 assertEquals("p.LysLeuSer23LysTrpGlu Hello",
272 Uniprot.getDescription(uf));
274 // adding a fourth original base switches to single letter code
275 uf.setOriginal("KLST");
276 assertEquals("p.KLST23LysTrpGlu Hello", Uniprot.getDescription(uf));
278 // adding a fourth variant switches to single letter code
281 assertEquals("p.KLST23KWES Hello", Uniprot.getDescription(uf));
284 vars.add("z"); // unknown variant - fails gracefully
286 assertEquals("p.Lys23z Hello", Uniprot.getDescription(uf));
288 uf.setVariation(null); // variant missing - is ignored
289 assertEquals("Hello", Uniprot.getDescription(uf));