JAL-2920 format/comment tidy
[jalview.git] / test / jalview / ws / dbsources / UniprotTest.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
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.
11  *  
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.
16  * 
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.
20  */
21 package jalview.ws.dbsources;
22
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;
27
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;
33
34 import java.io.Reader;
35 import java.io.StringReader;
36 import java.util.Vector;
37
38 import org.testng.Assert;
39 import org.testng.annotations.BeforeClass;
40 import org.testng.annotations.Test;
41
42 public class UniprotTest
43 {
44
45   @BeforeClass(alwaysRun = true)
46   public void setUpJvOptionPane()
47   {
48     JvOptionPane.setInteractiveMode(false);
49     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
50   }
51
52   // adapted from http://www.uniprot.org/uniprot/A9CKP4.xml
53   private static final String UNIPROT_XML = "<?xml version='1.0' encoding='UTF-8'?>"
54           + "<uniprot>"
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>"
74           + "</uniprot>";
75
76   /**
77    * Test the method that unmarshals XML to a Uniprot model
78    */
79   @Test(groups = { "Functional" })
80   public void testGetUniprotEntries()
81   {
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));
93
94     /*
95      * UniprotSequence drops any space characters
96      */
97     assertEquals("MHAPLVSKDL", entry.getUniprotSequence().getContent());
98
99     assertEquals(2, entry.getProtein().getName().size());
100     assertEquals("Mitogen-activated protein kinase 13", entry.getProtein()
101             .getName().get(0));
102     assertEquals("Henry", entry.getProtein().getName().get(1));
103
104     /*
105      * Check sequence features
106      */
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());
127
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());
134
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());
141
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());
148
149     sf = features.get(6);
150     assertEquals("sequence variant", sf.getType());
151     assertEquals("Foo",
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/>&nbsp;&nbsp;"
158                     + "p.Met42LeuMetVal Foo</html>");
159
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/>&nbsp;&nbsp;"
165                     + "p.MetLeu42LeuMetVal Foo</html>");
166
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/>&nbsp;&nbsp;"
172                     + "p.MLML42LMVK Foo Too</html>");
173
174     /*
175      * Check cross-references
176      */
177     Vector<PDBEntry> xrefs = entry.getDbReference();
178     assertEquals(3, xrefs.size());
179
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"));
185
186     xref = xrefs.get(1);
187     assertEquals("2FSR", xref.getId());
188     assertEquals("PDBsum", xref.getType());
189     assertFalse(xref.getProperties().hasMoreElements());
190
191     xref = xrefs.get(2);
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"));
196   }
197
198   @Test(groups = { "Functional" })
199   public void testGetUniprotSequence()
200   {
201     UniprotEntry entry = new Uniprot().getUniprotEntries(
202             new StringReader(UNIPROT_XML)).get(0);
203     SequenceI seq = new Uniprot().uniprotEntryToSequenceI(entry);
204     assertNotNull(seq);
205     assertEquals(6, seq.getDBRefs().length); // 2*Uniprot, PDB, PDBsum, 2*EMBL
206
207   }
208
209   /**
210    * Test the method that formats the sequence id
211    */
212   @Test(groups = { "Functional" })
213   public void testGetUniprotEntryId()
214   {
215     UniprotEntry entry = new Uniprot().getUniprotEntries(
216             new StringReader(UNIPROT_XML)).get(0);
217
218     /*
219      * name formatted with Uniprot Entry name
220      */
221     String expectedName = "A9CKP4_AGRT5|A9CKP4_AGRT6";
222     assertEquals(expectedName,
223             Uniprot.getUniprotEntryId(entry));
224   }
225
226   /**
227    * Test the method that formats the sequence description
228    */
229   @Test(groups = { "Functional" })
230   public void testGetUniprotEntryDescription()
231   {
232     UniprotEntry entry = new Uniprot().getUniprotEntries(
233             new StringReader(UNIPROT_XML)).get(0);
234
235     /*
236      * recommended names concatenated with space separator
237      */
238     String expectedDescription = "Mitogen-activated protein kinase 13 Henry";
239     assertEquals(expectedDescription,
240             Uniprot.getUniprotEntryDescription(entry));
241   }
242
243   @Test(groups = { "Functional" })
244   public void testGetDescription()
245   {
246     UniprotFeature uf = new UniprotFeature();
247     assertEquals("", Uniprot.getDescription(uf));
248
249     uf.setDescription("Hello");
250     assertEquals("Hello", Uniprot.getDescription(uf));
251
252     uf.setPosition(23);
253     uf.setOriginal("K");
254     Vector<String> vars = new Vector<>();
255     vars.add("y");
256     uf.setVariation(vars);
257     assertEquals("p.Lys23Tyr Hello", Uniprot.getDescription(uf));
258
259     // multiple variants generate an html description over more than one line
260     vars.add("W");
261     assertEquals("<html>p.Lys23Tyr<br/>&nbsp;&nbsp;p.Lys23Trp Hello</html>",
262             Uniprot.getDescription(uf));
263
264     /*
265      * indel cases
266      * up to 3 bases (original or variant) are shown using 3 letter code
267      */
268     vars.clear();
269     vars.add("KWE");
270     uf.setOriginal("KLS");
271     assertEquals("p.LysLeuSer23LysTrpGlu Hello",
272             Uniprot.getDescription(uf));
273
274     // adding a fourth original base switches to single letter code
275     uf.setOriginal("KLST");
276     assertEquals("p.KLST23LysTrpGlu Hello", Uniprot.getDescription(uf));
277
278     // adding a fourth variant switches to single letter code
279     vars.clear();
280     vars.add("KWES");
281     assertEquals("p.KLST23KWES Hello", Uniprot.getDescription(uf));
282
283     vars.clear();
284     vars.add("z"); // unknown variant - fails gracefully
285     uf.setOriginal("K");
286     assertEquals("p.Lys23z Hello", Uniprot.getDescription(uf));
287
288     uf.setVariation(null); // variant missing - is ignored
289     assertEquals("Hello", Uniprot.getDescription(uf));
290   }
291 }