--- /dev/null
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.util;
+
+import static jalview.util.UrlConstants.DB_ACCESSION;
+import static jalview.util.UrlConstants.SEQUENCE_ID;
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertNull;
+import static org.testng.AssertJUnit.assertTrue;
+
+import jalview.datamodel.DBRefEntry;
+import jalview.datamodel.DBRefSource;
+import jalview.datamodel.Sequence;
+import jalview.gui.JvOptionPane;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class UrlLinkTest
+{
+
+ @BeforeClass(alwaysRun = true)
+ public void setUpJvOptionPane()
+ {
+ JvOptionPane.setInteractiveMode(false);
+ JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
+ }
+
+ final static String DB = "Test";
+
+ final static String URL_PREFIX = "http://www.jalview.org/";
+
+ final static String URL_SUFFIX = "/blah";
+
+ final static String SEP = "|";
+
+ final static String DELIM = "$";
+
+ final static String REGEX_NESTED = "=/^(?:Label:)?(?:(?:gi\\|(\\d+))|([^:]+))/=";
+
+ final static String REGEX_RUBBISH = "=/[0-9]++/=";
+
+ /**
+ * Test URL link creation when the input string has no regex
+ */
+ @Test(groups = { "Functional" })
+ public void testUrlLinkCreationNoRegex()
+ {
+ // SEQUENCE_ID
+ UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + SEQUENCE_ID
+ + DELIM + URL_SUFFIX);
+ assertEquals(DB, ul.getTarget());
+ assertEquals(DB, ul.getLabel());
+ assertEquals(URL_PREFIX, ul.getUrlPrefix());
+ assertEquals(URL_SUFFIX, ul.getUrlSuffix());
+ assertTrue(ul.isDynamic());
+ assertFalse(ul.usesDBAccession());
+ assertNull(ul.getRegexReplace());
+ assertTrue(ul.isValid());
+ assertNull(ul.getInvalidMessage());
+
+ // DB_ACCESSION
+ ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + DB_ACCESSION + DELIM
+ + URL_SUFFIX);
+ assertEquals(DB, ul.getTarget());
+ assertEquals(DB, ul.getLabel());
+ assertEquals(URL_PREFIX, ul.getUrlPrefix());
+ assertEquals(URL_SUFFIX, ul.getUrlSuffix());
+ assertTrue(ul.isDynamic());
+ assertTrue(ul.usesDBAccession());
+ assertNull(ul.getRegexReplace());
+ assertTrue(ul.isValid());
+ assertNull(ul.getInvalidMessage());
+
+ // Not dynamic
+ ul = new UrlLink(DB + SEP + URL_PREFIX + URL_SUFFIX.substring(1));
+ assertEquals(DB, ul.getTarget());
+ assertEquals(DB, ul.getLabel());
+ assertEquals(URL_PREFIX + URL_SUFFIX.substring(1), ul.getUrlPrefix());
+ assertFalse(ul.isDynamic());
+ assertFalse(ul.usesDBAccession());
+ assertNull(ul.getRegexReplace());
+ assertTrue(ul.isValid());
+ assertNull(ul.getInvalidMessage());
+ }
+
+ /**
+ * Test URL link creation when the input string has regex
+ */
+ @Test(groups = { "Functional" })
+ public void testUrlLinkCreationWithRegex()
+ {
+ // SEQUENCE_ID
+ UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + SEQUENCE_ID
+ + REGEX_NESTED + DELIM + URL_SUFFIX);
+ assertEquals(DB, ul.getTarget());
+ assertEquals(DB, ul.getLabel());
+ assertEquals(URL_PREFIX, ul.getUrlPrefix());
+ assertEquals(URL_SUFFIX, ul.getUrlSuffix());
+ assertTrue(ul.isDynamic());
+ assertFalse(ul.usesDBAccession());
+ assertEquals(REGEX_NESTED.substring(2, REGEX_NESTED.length() - 2),
+ ul.getRegexReplace());
+ assertTrue(ul.isValid());
+ assertNull(ul.getInvalidMessage());
+
+ // DB_ACCESSION
+ ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + DB_ACCESSION
+ + REGEX_NESTED + DELIM + URL_SUFFIX);
+ assertEquals(DB, ul.getTarget());
+ assertEquals(DB, ul.getLabel());
+ assertEquals(URL_PREFIX, ul.getUrlPrefix());
+ assertEquals(URL_SUFFIX, ul.getUrlSuffix());
+ assertTrue(ul.isDynamic());
+ assertTrue(ul.usesDBAccession());
+ assertEquals(REGEX_NESTED.substring(2, REGEX_NESTED.length() - 2),
+ ul.getRegexReplace());
+ assertTrue(ul.isValid());
+ assertNull(ul.getInvalidMessage());
+
+ // invalid regex
+ ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + DB_ACCESSION
+ + REGEX_RUBBISH + DELIM + URL_SUFFIX);
+ assertEquals(DB, ul.getTarget());
+ assertEquals(DB, ul.getLabel());
+ assertEquals(URL_PREFIX, ul.getUrlPrefix());
+ assertEquals(URL_SUFFIX, ul.getUrlSuffix());
+ assertTrue(ul.isDynamic());
+ assertTrue(ul.usesDBAccession());
+ assertEquals(REGEX_RUBBISH.substring(2, REGEX_RUBBISH.length() - 2),
+ ul.getRegexReplace());
+ assertFalse(ul.isValid());
+ assertEquals(
+ "Invalid Regular Expression : '"
+ + REGEX_RUBBISH.substring(2, REGEX_RUBBISH.length() - 2)
+ + "'\n",
+ ul.getInvalidMessage());
+ }
+
+ /**
+ * Test construction of link by substituting sequence id or name
+ */
+ @Test(groups = { "Functional" })
+ public void testMakeUrlNoRegex()
+ {
+ // Single non-regex
+ UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + SEQUENCE_ID
+ + DELIM + URL_SUFFIX);
+ String idstring = "FER_CAPAA";
+ String[] urls = ul.makeUrls(idstring, true);
+
+ assertEquals(2, urls.length);
+ assertEquals(idstring, urls[0]);
+ assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]);
+
+ urls = ul.makeUrls(idstring, false);
+
+ assertEquals(2, urls.length);
+ assertEquals(idstring, urls[0]);
+ assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]);
+ }
+
+ /**
+ * Test construction of link by substituting sequence id or name using regular
+ * expression
+ */
+ @Test(groups = { "Functional" })
+ public void testMakeUrlWithRegex()
+ {
+ // Unused regex
+ UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + DB_ACCESSION
+ + REGEX_NESTED + DELIM + URL_SUFFIX);
+ String idstring = "FER_CAPAA";
+ String[] urls = ul.makeUrls(idstring, true);
+
+ assertEquals(2, urls.length);
+ assertEquals(idstring, urls[0]);
+ assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]);
+ assertTrue(ul.isValid());
+ assertNull(ul.getInvalidMessage());
+
+ urls = ul.makeUrls(idstring, false);
+
+ assertEquals(2, urls.length);
+ assertEquals(idstring, urls[0]);
+ assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]);
+ assertTrue(ul.isValid());
+ assertNull(ul.getInvalidMessage());
+
+ // nested regex
+ idstring = "Label:gi|9234|pdb|102L|A";
+ urls = ul.makeUrls(idstring, true);
+
+ assertEquals(2, urls.length);
+ assertEquals("9234", urls[0]);
+ assertEquals(URL_PREFIX + "9234" + URL_SUFFIX, urls[1]);
+ assertTrue(ul.isValid());
+ assertNull(ul.getInvalidMessage());
+
+ urls = ul.makeUrls(idstring, false);
+
+ assertEquals(2, urls.length);
+ assertEquals("9234", urls[0]);
+ assertEquals(URL_PREFIX + "9234" + URL_SUFFIX, urls[1]);
+ assertTrue(ul.isValid());
+ assertNull(ul.getInvalidMessage());
+
+ // unmatched regex
+ idstring = "this does not match";
+ urls = ul.makeUrls(idstring, true);
+
+ assertEquals(2, urls.length);
+ assertEquals(idstring, urls[0]);
+ assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]);
+ assertTrue(ul.isValid());
+ assertNull(ul.getInvalidMessage());
+
+ urls = ul.makeUrls(idstring, false);
+
+ assertEquals(2, urls.length);
+ assertEquals(idstring, urls[0]);
+ assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]);
+ assertTrue(ul.isValid());
+ assertNull(ul.getInvalidMessage());
+
+ // empty idstring
+ idstring = "";
+ urls = ul.makeUrls(idstring, true);
+
+ assertNull(urls);
+
+ urls = ul.makeUrls(idstring, false);
+
+ assertEquals(2, urls.length);
+ assertEquals("", urls[0]);
+ assertEquals(URL_PREFIX + URL_SUFFIX, urls[1]);
+ assertTrue(ul.isValid());
+ assertNull(ul.getInvalidMessage());
+ }
+
+ /**
+ * Test creating links with null sequence
+ */
+ @Test(groups = { "Functional" })
+ public void testCreateLinksFromNullSequence()
+ {
+ UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + SEQUENCE_ID
+ + DELIM + URL_SUFFIX);
+
+ Map<String, List<String>> linkset = new LinkedHashMap<String, List<String>>();
+ ul.createLinksFromSeq(null, linkset);
+
+ String key = DB + SEP + URL_PREFIX;
+ assertEquals(1, linkset.size());
+ assertTrue(linkset.containsKey(key));
+ assertEquals(DB, linkset.get(key).get(0));
+ assertEquals(DB, linkset.get(key).get(1));
+ assertEquals(null, linkset.get(key).get(2));
+ assertEquals(URL_PREFIX, linkset.get(key).get(3));
+ }
+
+ /**
+ * Test creating links with non-dynamic urlLink
+ */
+ @Test(groups = { "Functional" })
+ public void testCreateLinksForNonDynamic()
+ {
+ UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + URL_SUFFIX);
+
+ Map<String, List<String>> linkset = new LinkedHashMap<String, List<String>>();
+ ul.createLinksFromSeq(null, linkset);
+
+ String key = DB + SEP + URL_PREFIX + URL_SUFFIX;
+ assertEquals(1, linkset.size());
+ assertTrue(linkset.containsKey(key));
+ assertEquals(DB, linkset.get(key).get(0));
+ assertEquals(DB, linkset.get(key).get(1));
+ assertEquals(null, linkset.get(key).get(2));
+ assertEquals(URL_PREFIX + URL_SUFFIX, linkset.get(key).get(3));
+ }
+
+ /**
+ * Test creating links
+ */
+ @Test(groups = { "Functional" })
+ public void testCreateLinksFromSequence()
+ {
+
+ // create list of links and list of DBRefs
+ List<String> links = new ArrayList<String>();
+ List<DBRefEntry> refs = new ArrayList<DBRefEntry>();
+
+ // links as might be added into Preferences | Connections dialog
+ links.add("EMBL-EBI Search | http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$"
+ + SEQUENCE_ID + "$");
+ links.add("UNIPROT | http://www.uniprot.org/uniprot/$" + DB_ACCESSION
+ + "$");
+ links.add("INTERPRO | http://www.ebi.ac.uk/interpro/entry/$"
+ + DB_ACCESSION + "$");
+
+ // make seq0 dbrefs
+ refs.add(new DBRefEntry(DBRefSource.UNIPROT, "1", "P83527"));
+ refs.add(new DBRefEntry("INTERPRO", "1", "IPR001041"));
+ refs.add(new DBRefEntry("INTERPRO", "1", "IPR006058"));
+ refs.add(new DBRefEntry("INTERPRO", "1", "IPR012675"));
+
+ Sequence seq0 = new Sequence("FER1", "AKPNGVL");
+
+ // add all the dbrefs to the sequence
+ seq0.addDBRef(refs.get(0));
+ seq0.addDBRef(refs.get(1));
+ seq0.addDBRef(refs.get(2));
+ seq0.addDBRef(refs.get(3));
+ seq0.createDatasetSequence();
+
+ // Test where link takes a sequence id as replacement
+ UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + SEQUENCE_ID
+ + DELIM + URL_SUFFIX);
+
+ Map<String, List<String>> linkset = new LinkedHashMap<String, List<String>>();
+ ul.createLinksFromSeq(seq0, linkset);
+
+ String key = seq0.getName() + SEP + URL_PREFIX + seq0.getName()
+ + URL_SUFFIX;
+ assertEquals(1, linkset.size());
+ assertTrue(linkset.containsKey(key));
+ assertEquals(DB, linkset.get(key).get(0));
+ assertEquals(DB, linkset.get(key).get(1));
+ assertEquals(seq0.getName(), linkset.get(key).get(2));
+ assertEquals(URL_PREFIX + seq0.getName() + URL_SUFFIX, linkset.get(key)
+ .get(3));
+
+ // Test where link takes a db annotation id and only has one dbref
+ ul = new UrlLink(links.get(1));
+ linkset = new LinkedHashMap<String, List<String>>();
+ ul.createLinksFromSeq(seq0, linkset);
+
+ key = "P83527|http://www.uniprot.org/uniprot/P83527";
+ assertEquals(linkset.size(), 1);
+ assertTrue(linkset.containsKey(key));
+ assertEquals(DBRefSource.UNIPROT, linkset.get(key).get(0));
+ assertEquals(DBRefSource.UNIPROT + SEP + "P83527", linkset.get(key)
+ .get(1));
+ assertEquals("P83527", linkset.get(key).get(2));
+ assertEquals("http://www.uniprot.org/uniprot/P83527", linkset.get(key)
+ .get(3));
+
+ // Test where link takes a db annotation id and has multiple dbrefs
+ ul = new UrlLink(links.get(2));
+ linkset = new LinkedHashMap<String, List<String>>();
+ ul.createLinksFromSeq(seq0, linkset);
+ assertEquals(3, linkset.size());
+
+ // check each link made it in correctly
+ key = "IPR001041|http://www.ebi.ac.uk/interpro/entry/IPR001041";
+ assertTrue(linkset.containsKey(key));
+ assertEquals("INTERPRO", linkset.get(key).get(0));
+ assertEquals("INTERPRO" + SEP + "IPR001041", linkset.get(key).get(1));
+ assertEquals("IPR001041", linkset.get(key).get(2));
+ assertEquals("http://www.ebi.ac.uk/interpro/entry/IPR001041", linkset
+ .get(key).get(3));
+
+ key = "IPR006058|http://www.ebi.ac.uk/interpro/entry/IPR006058";
+ assertTrue(linkset.containsKey(key));
+ assertEquals("INTERPRO", linkset.get(key).get(0));
+ assertEquals("INTERPRO" + SEP + "IPR006058", linkset.get(key).get(1));
+ assertEquals("IPR006058", linkset.get(key).get(2));
+ assertEquals("http://www.ebi.ac.uk/interpro/entry/IPR006058", linkset
+ .get(key).get(3));
+
+ key = "IPR012675|http://www.ebi.ac.uk/interpro/entry/IPR012675";
+ assertTrue(linkset.containsKey(key));
+ assertEquals("INTERPRO", linkset.get(key).get(0));
+ assertEquals("INTERPRO" + SEP + "IPR012675", linkset.get(key).get(1));
+ assertEquals("IPR012675", linkset.get(key).get(2));
+ assertEquals("http://www.ebi.ac.uk/interpro/entry/IPR012675", linkset
+ .get(key).get(3));
+
+ // Test where there are no matching dbrefs for the link
+ ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + DB_ACCESSION + DELIM
+ + URL_SUFFIX);
+ linkset = new LinkedHashMap<String, List<String>>();
+ ul.createLinksFromSeq(seq0, linkset);
+ assertTrue(linkset.isEmpty());
+ }
+
+ /**
+ * Test links where label and target are both included
+ */
+ @Test(groups = { "Functional" })
+ public void testLinksWithTargets()
+ {
+ UrlLink ul = new UrlLink(
+ "Protein Data Bank | http://www.identifiers.org/pdb/$"
+ + DB_ACCESSION + "$" + " | pdb");
+
+ assertEquals("Protein Data Bank", ul.getLabel());
+ assertEquals("pdb", ul.getTarget());
+ assertEquals("http://www.identifiers.org/pdb/$" + DB_ACCESSION + "$",
+ ul.getUrlWithToken());
+
+ assertEquals("Protein Data Bank|http://www.identifiers.org/pdb/$"
+ + DB_ACCESSION + "$" + "|pdb", ul.toStringWithTarget());
+
+ ul = new UrlLink("Protein Data Bank",
+ "http://www.identifiers.org/pdb/$" + DB_ACCESSION + "$", "pdb");
+
+ assertEquals("Protein Data Bank", ul.getLabel());
+ assertEquals("pdb", ul.getTarget());
+ assertEquals("http://www.identifiers.org/pdb/$" + DB_ACCESSION + "$",
+ ul.getUrlWithToken());
+
+ assertEquals("Protein Data Bank|http://www.identifiers.org/pdb/$"
+ + DB_ACCESSION + "$" + "|pdb", ul.toStringWithTarget());
+
+ }
+
+}