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.
23 import static jalview.util.UrlConstants.DB_ACCESSION;
24 import static jalview.util.UrlConstants.SEQUENCE_ID;
25 import static org.testng.AssertJUnit.assertEquals;
26 import static org.testng.AssertJUnit.assertFalse;
27 import static org.testng.AssertJUnit.assertNull;
28 import static org.testng.AssertJUnit.assertTrue;
30 import jalview.datamodel.DBRefEntry;
31 import jalview.datamodel.DBRefSource;
32 import jalview.datamodel.Sequence;
33 import jalview.gui.JvOptionPane;
35 import java.util.ArrayList;
36 import java.util.LinkedHashMap;
37 import java.util.List;
40 import org.testng.annotations.BeforeClass;
41 import org.testng.annotations.Test;
43 public class UrlLinkTest
46 @BeforeClass(alwaysRun = true)
47 public void setUpJvOptionPane()
49 JvOptionPane.setInteractiveMode(false);
50 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
53 final static String DB = "Test";
55 final static String URL_PREFIX = "http://www.jalview.org/";
57 final static String URL_SUFFIX = "/blah";
59 final static String SEP = "|";
61 final static String DELIM = "$";
63 final static String REGEX_NESTED = "=/^(?:Label:)?(?:(?:gi\\|(\\d+))|([^:]+))/=";
65 final static String REGEX_RUBBISH = "=/[0-9]++/=";
68 * Test URL link creation when the input string has no regex
70 @Test(groups = { "Functional" })
71 public void testUrlLinkCreationNoRegex()
74 UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + SEQUENCE_ID
75 + DELIM + URL_SUFFIX);
76 assertEquals(DB, ul.getTarget());
77 assertEquals(DB, ul.getLabel());
78 assertEquals(URL_PREFIX, ul.getUrlPrefix());
79 assertEquals(URL_SUFFIX, ul.getUrlSuffix());
80 assertTrue(ul.isDynamic());
81 assertFalse(ul.usesDBAccession());
82 assertNull(ul.getRegexReplace());
83 assertTrue(ul.isValid());
84 assertNull(ul.getInvalidMessage());
87 ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + DB_ACCESSION + DELIM
89 assertEquals(DB, ul.getTarget());
90 assertEquals(DB, ul.getLabel());
91 assertEquals(URL_PREFIX, ul.getUrlPrefix());
92 assertEquals(URL_SUFFIX, ul.getUrlSuffix());
93 assertTrue(ul.isDynamic());
94 assertTrue(ul.usesDBAccession());
95 assertNull(ul.getRegexReplace());
96 assertTrue(ul.isValid());
97 assertNull(ul.getInvalidMessage());
100 ul = new UrlLink(DB + SEP + URL_PREFIX + URL_SUFFIX.substring(1));
101 assertEquals(DB, ul.getTarget());
102 assertEquals(DB, ul.getLabel());
103 assertEquals(URL_PREFIX + URL_SUFFIX.substring(1), ul.getUrlPrefix());
104 assertFalse(ul.isDynamic());
105 assertFalse(ul.usesDBAccession());
106 assertNull(ul.getRegexReplace());
107 assertTrue(ul.isValid());
108 assertNull(ul.getInvalidMessage());
112 * Test URL link creation when the input string has regex
114 @Test(groups = { "Functional" })
115 public void testUrlLinkCreationWithRegex()
118 UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + SEQUENCE_ID
119 + REGEX_NESTED + DELIM + URL_SUFFIX);
120 assertEquals(DB, ul.getTarget());
121 assertEquals(DB, ul.getLabel());
122 assertEquals(URL_PREFIX, ul.getUrlPrefix());
123 assertEquals(URL_SUFFIX, ul.getUrlSuffix());
124 assertTrue(ul.isDynamic());
125 assertFalse(ul.usesDBAccession());
126 assertEquals(REGEX_NESTED.substring(2, REGEX_NESTED.length() - 2),
127 ul.getRegexReplace());
128 assertTrue(ul.isValid());
129 assertNull(ul.getInvalidMessage());
132 ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + DB_ACCESSION
133 + REGEX_NESTED + DELIM + URL_SUFFIX);
134 assertEquals(DB, ul.getTarget());
135 assertEquals(DB, ul.getLabel());
136 assertEquals(URL_PREFIX, ul.getUrlPrefix());
137 assertEquals(URL_SUFFIX, ul.getUrlSuffix());
138 assertTrue(ul.isDynamic());
139 assertTrue(ul.usesDBAccession());
140 assertEquals(REGEX_NESTED.substring(2, REGEX_NESTED.length() - 2),
141 ul.getRegexReplace());
142 assertTrue(ul.isValid());
143 assertNull(ul.getInvalidMessage());
146 ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + DB_ACCESSION
147 + REGEX_RUBBISH + DELIM + URL_SUFFIX);
148 assertEquals(DB, ul.getTarget());
149 assertEquals(DB, ul.getLabel());
150 assertEquals(URL_PREFIX, ul.getUrlPrefix());
151 assertEquals(URL_SUFFIX, ul.getUrlSuffix());
152 assertTrue(ul.isDynamic());
153 assertTrue(ul.usesDBAccession());
154 assertEquals(REGEX_RUBBISH.substring(2, REGEX_RUBBISH.length() - 2),
155 ul.getRegexReplace());
156 assertFalse(ul.isValid());
158 "Invalid Regular Expression : '"
159 + REGEX_RUBBISH.substring(2, REGEX_RUBBISH.length() - 2)
161 ul.getInvalidMessage());
165 * Test construction of link by substituting sequence id or name
167 @Test(groups = { "Functional" })
168 public void testMakeUrlNoRegex()
171 UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + SEQUENCE_ID
172 + DELIM + URL_SUFFIX);
173 String idstring = "FER_CAPAA";
174 String[] urls = ul.makeUrls(idstring, true);
176 assertEquals(2, urls.length);
177 assertEquals(idstring, urls[0]);
178 assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]);
180 urls = ul.makeUrls(idstring, false);
182 assertEquals(2, urls.length);
183 assertEquals(idstring, urls[0]);
184 assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]);
188 * Test construction of link by substituting sequence id or name using regular
191 @Test(groups = { "Functional" })
192 public void testMakeUrlWithRegex()
195 UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + DB_ACCESSION
196 + REGEX_NESTED + DELIM + URL_SUFFIX);
197 String idstring = "FER_CAPAA";
198 String[] urls = ul.makeUrls(idstring, true);
200 assertEquals(2, urls.length);
201 assertEquals(idstring, urls[0]);
202 assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]);
203 assertTrue(ul.isValid());
204 assertNull(ul.getInvalidMessage());
206 urls = ul.makeUrls(idstring, false);
208 assertEquals(2, urls.length);
209 assertEquals(idstring, urls[0]);
210 assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]);
211 assertTrue(ul.isValid());
212 assertNull(ul.getInvalidMessage());
215 idstring = "Label:gi|9234|pdb|102L|A";
216 urls = ul.makeUrls(idstring, true);
218 assertEquals(2, urls.length);
219 assertEquals("9234", urls[0]);
220 assertEquals(URL_PREFIX + "9234" + URL_SUFFIX, urls[1]);
221 assertTrue(ul.isValid());
222 assertNull(ul.getInvalidMessage());
224 urls = ul.makeUrls(idstring, false);
226 assertEquals(2, urls.length);
227 assertEquals("9234", urls[0]);
228 assertEquals(URL_PREFIX + "9234" + URL_SUFFIX, urls[1]);
229 assertTrue(ul.isValid());
230 assertNull(ul.getInvalidMessage());
233 idstring = "this does not match";
234 urls = ul.makeUrls(idstring, true);
236 assertEquals(2, urls.length);
237 assertEquals(idstring, urls[0]);
238 assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]);
239 assertTrue(ul.isValid());
240 assertNull(ul.getInvalidMessage());
242 urls = ul.makeUrls(idstring, false);
244 assertEquals(2, urls.length);
245 assertEquals(idstring, urls[0]);
246 assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]);
247 assertTrue(ul.isValid());
248 assertNull(ul.getInvalidMessage());
252 urls = ul.makeUrls(idstring, true);
256 urls = ul.makeUrls(idstring, false);
258 assertEquals(2, urls.length);
259 assertEquals("", urls[0]);
260 assertEquals(URL_PREFIX + URL_SUFFIX, urls[1]);
261 assertTrue(ul.isValid());
262 assertNull(ul.getInvalidMessage());
266 * Test creating links with null sequence
268 @Test(groups = { "Functional" })
269 public void testCreateLinksFromNullSequence()
271 UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + SEQUENCE_ID
272 + DELIM + URL_SUFFIX);
274 Map<String, List<String>> linkset = new LinkedHashMap<String, List<String>>();
275 ul.createLinksFromSeq(null, linkset);
277 String key = DB + SEP + URL_PREFIX;
278 assertEquals(1, linkset.size());
279 assertTrue(linkset.containsKey(key));
280 assertEquals(DB, linkset.get(key).get(0));
281 assertEquals(DB, linkset.get(key).get(1));
282 assertEquals(null, linkset.get(key).get(2));
283 assertEquals(URL_PREFIX, linkset.get(key).get(3));
287 * Test creating links with non-dynamic urlLink
289 @Test(groups = { "Functional" })
290 public void testCreateLinksForNonDynamic()
292 UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + URL_SUFFIX);
294 Map<String, List<String>> linkset = new LinkedHashMap<String, List<String>>();
295 ul.createLinksFromSeq(null, linkset);
297 String key = DB + SEP + URL_PREFIX + URL_SUFFIX;
298 assertEquals(1, linkset.size());
299 assertTrue(linkset.containsKey(key));
300 assertEquals(DB, linkset.get(key).get(0));
301 assertEquals(DB, linkset.get(key).get(1));
302 assertEquals(null, linkset.get(key).get(2));
303 assertEquals(URL_PREFIX + URL_SUFFIX, linkset.get(key).get(3));
307 * Test creating links
309 @Test(groups = { "Functional" })
310 public void testCreateLinksFromSequence()
313 // create list of links and list of DBRefs
314 List<String> links = new ArrayList<String>();
315 List<DBRefEntry> refs = new ArrayList<DBRefEntry>();
317 // links as might be added into Preferences | Connections dialog
318 links.add("EMBL-EBI Search | http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$"
319 + SEQUENCE_ID + "$");
320 links.add("UNIPROT | http://www.uniprot.org/uniprot/$" + DB_ACCESSION
322 links.add("INTERPRO | http://www.ebi.ac.uk/interpro/entry/$"
323 + DB_ACCESSION + "$");
326 refs.add(new DBRefEntry(DBRefSource.UNIPROT, "1", "P83527"));
327 refs.add(new DBRefEntry("INTERPRO", "1", "IPR001041"));
328 refs.add(new DBRefEntry("INTERPRO", "1", "IPR006058"));
329 refs.add(new DBRefEntry("INTERPRO", "1", "IPR012675"));
331 Sequence seq0 = new Sequence("FER1", "AKPNGVL");
333 // add all the dbrefs to the sequence
334 seq0.addDBRef(refs.get(0));
335 seq0.addDBRef(refs.get(1));
336 seq0.addDBRef(refs.get(2));
337 seq0.addDBRef(refs.get(3));
338 seq0.createDatasetSequence();
340 // Test where link takes a sequence id as replacement
341 UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + SEQUENCE_ID
342 + DELIM + URL_SUFFIX);
344 Map<String, List<String>> linkset = new LinkedHashMap<String, List<String>>();
345 ul.createLinksFromSeq(seq0, linkset);
347 String key = seq0.getName() + SEP + URL_PREFIX + seq0.getName()
349 assertEquals(1, linkset.size());
350 assertTrue(linkset.containsKey(key));
351 assertEquals(DB, linkset.get(key).get(0));
352 assertEquals(DB, linkset.get(key).get(1));
353 assertEquals(seq0.getName(), linkset.get(key).get(2));
354 assertEquals(URL_PREFIX + seq0.getName() + URL_SUFFIX, linkset.get(key)
357 // Test where link takes a db annotation id and only has one dbref
358 ul = new UrlLink(links.get(1));
359 linkset = new LinkedHashMap<String, List<String>>();
360 ul.createLinksFromSeq(seq0, linkset);
362 key = "P83527|http://www.uniprot.org/uniprot/P83527";
363 assertEquals(linkset.size(), 1);
364 assertTrue(linkset.containsKey(key));
365 assertEquals(DBRefSource.UNIPROT, linkset.get(key).get(0));
366 assertEquals(DBRefSource.UNIPROT + SEP + "P83527", linkset.get(key)
368 assertEquals("P83527", linkset.get(key).get(2));
369 assertEquals("http://www.uniprot.org/uniprot/P83527", linkset.get(key)
372 // Test where link takes a db annotation id and has multiple dbrefs
373 ul = new UrlLink(links.get(2));
374 linkset = new LinkedHashMap<String, List<String>>();
375 ul.createLinksFromSeq(seq0, linkset);
376 assertEquals(3, linkset.size());
378 // check each link made it in correctly
379 key = "IPR001041|http://www.ebi.ac.uk/interpro/entry/IPR001041";
380 assertTrue(linkset.containsKey(key));
381 assertEquals("INTERPRO", linkset.get(key).get(0));
382 assertEquals("INTERPRO" + SEP + "IPR001041", linkset.get(key).get(1));
383 assertEquals("IPR001041", linkset.get(key).get(2));
384 assertEquals("http://www.ebi.ac.uk/interpro/entry/IPR001041", linkset
387 key = "IPR006058|http://www.ebi.ac.uk/interpro/entry/IPR006058";
388 assertTrue(linkset.containsKey(key));
389 assertEquals("INTERPRO", linkset.get(key).get(0));
390 assertEquals("INTERPRO" + SEP + "IPR006058", linkset.get(key).get(1));
391 assertEquals("IPR006058", linkset.get(key).get(2));
392 assertEquals("http://www.ebi.ac.uk/interpro/entry/IPR006058", linkset
395 key = "IPR012675|http://www.ebi.ac.uk/interpro/entry/IPR012675";
396 assertTrue(linkset.containsKey(key));
397 assertEquals("INTERPRO", linkset.get(key).get(0));
398 assertEquals("INTERPRO" + SEP + "IPR012675", linkset.get(key).get(1));
399 assertEquals("IPR012675", linkset.get(key).get(2));
400 assertEquals("http://www.ebi.ac.uk/interpro/entry/IPR012675", linkset
403 // Test where there are no matching dbrefs for the link
404 ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + DB_ACCESSION + DELIM
406 linkset = new LinkedHashMap<String, List<String>>();
407 ul.createLinksFromSeq(seq0, linkset);
408 assertTrue(linkset.isEmpty());
412 * Test links where label and target are both included
414 @Test(groups = { "Functional" })
415 public void testLinksWithTargets()
417 UrlLink ul = new UrlLink(
418 "Protein Data Bank | http://www.identifiers.org/pdb/$"
419 + DB_ACCESSION + "$" + " | pdb");
421 assertEquals("Protein Data Bank", ul.getLabel());
422 assertEquals("pdb", ul.getTarget());
423 assertEquals("http://www.identifiers.org/pdb/$" + DB_ACCESSION + "$",
424 ul.getUrlWithToken());
426 assertEquals("Protein Data Bank|http://www.identifiers.org/pdb/$"
427 + DB_ACCESSION + "$" + "|pdb", ul.toStringWithTarget());
429 ul = new UrlLink("Protein Data Bank",
430 "http://www.identifiers.org/pdb/$" + DB_ACCESSION + "$", "pdb");
432 assertEquals("Protein Data Bank", ul.getLabel());
433 assertEquals("pdb", ul.getTarget());
434 assertEquals("http://www.identifiers.org/pdb/$" + DB_ACCESSION + "$",
435 ul.getUrlWithToken());
437 assertEquals("Protein Data Bank|http://www.identifiers.org/pdb/$"
438 + DB_ACCESSION + "$" + "|pdb", ul.toStringWithTarget());