JAL-2316 Unit testing, relax constraint that default url is in menu
authorkiramt <k.mourao@dundee.ac.uk>
Fri, 9 Dec 2016 10:11:49 +0000 (10:11 +0000)
committerkiramt <k.mourao@dundee.ac.uk>
Fri, 9 Dec 2016 10:11:49 +0000 (10:11 +0000)
src/jalview/jbgui/GSequenceLink.java
src/jalview/urls/CustomUrlProvider.java
src/jalview/urls/IdentifiersUrlProvider.java
src/jalview/urls/UrlLinkTableModel.java
src/jalview/urls/UrlProviderImpl.java
test/jalview/urls/UrlLinkTableModelTest.java [new file with mode: 0644]

index 1250bad..9e44096 100755 (executable)
@@ -225,8 +225,6 @@ public class GSequenceLink extends JPanel
     return false;
   }
 
-
-
   public void nameTB_keyTyped(KeyEvent e)
   {
     if (e.getKeyChar() == '|')
index ab84be2..439d551 100644 (file)
@@ -194,20 +194,19 @@ public class CustomUrlProvider extends UrlProviderImpl
   @Override
   public boolean setDefaultUrl(String id)
   {
+    if (id == null)
+    {
+      defaultUrl = null;
+    }
     if (selectedUrls.containsKey(id))
     {
       defaultUrl = id;
     }
     else if (nonselectedUrls.containsKey(id))
     {
-      selectedUrls.put(id, nonselectedUrls.get(id));
-      nonselectedUrls.remove(id);
       defaultUrl = id;
     }
-    else
-    {
-      defaultUrl = null;
-    }
+
     return (defaultUrl != null);
   }
 
@@ -245,7 +244,12 @@ public class CustomUrlProvider extends UrlProviderImpl
   @Override
   public String getDefaultUrl(String seqid)
   {
-    return super.getDefaultUrl(seqid, selectedUrls);
+    String result = super.getDefaultUrl(seqid, selectedUrls);
+    if (result == null)
+    {
+      result = super.getDefaultUrl(seqid, nonselectedUrls);
+    }
+    return result;
   }
 
   @Override
@@ -284,18 +288,17 @@ public class CustomUrlProvider extends UrlProviderImpl
         if (link.getIsSelected())
         {
           selurls.put(link.getId(),
-                  new UrlLink(link.getId() + SEP + link.getUrl()));
-
-          // sort out default and selected ids
-          if (link.getIsDefault())
-          {
-            setDefaultUrl(link.getId());
-          }
+                  new UrlLink(link.getName() + SEP + link.getUrl()));
         }
         else
         {
-          unselurls.put(link.getId(),
-                new UrlLink(link.getId() + SEP + link.getUrl()));
+          unselurls.put(link.getId(), new UrlLink(link.getName() + SEP
+                  + link.getUrl()));
+        }
+        // sort out default and selected ids
+        if (link.getIsDefault())
+        {
+          setDefaultUrl(link.getId());
         }
       }
 
index 45d3863..98a5ee4 100644 (file)
@@ -134,15 +134,16 @@ public class IdentifiersUrlProvider extends UrlProviderImpl
   @Override
   public boolean setDefaultUrl(String id)
   {
-    if (selectedUrls.contains(id))
+    if (id == null)
     {
-      defaultUrl = id;
+      defaultUrl = null;
     }
-    else
+    if (urls.containsKey(id))
     {
-      defaultUrl = null;
+      defaultUrl = id;
     }
-    return selectedUrls.contains(id);
+
+    return urls.containsKey(id);
   }
 
   @Override
@@ -198,10 +199,9 @@ public class IdentifiersUrlProvider extends UrlProviderImpl
       if (isMiriamId(link.getId()))
       {
         // select/deselect links accordingly and set default url
-
-        if (link.getIsSelected())
+        if (urls.containsKey(link.getId()))
         {
-          if (urls.containsKey(link.getId()))
+          if (link.getIsSelected())
           {
             selectedUrls.add(link.getId());
           }
@@ -209,10 +209,8 @@ public class IdentifiersUrlProvider extends UrlProviderImpl
           {
             setDefaultUrl(link.getId());
           }
-
         }
       }
-
     }
   }
 
@@ -231,15 +229,12 @@ public class IdentifiersUrlProvider extends UrlProviderImpl
   @Override
   public String getDefaultTarget(String seqid)
   {
-    // TODO Auto-generated method stub
     return null;
   }
 
   @Override
   public String chooseDefaultUrl()
   {
-    // TODO Auto-generated method stub
     return null;
   }
-
 }
index 0605f02..a18341b 100644 (file)
@@ -38,12 +38,12 @@ import javax.swing.table.AbstractTableModel;
 public class UrlLinkTableModel extends AbstractTableModel
 {
   // local storage of data
-  // use LinkedHashMap to guarantee ordering remains the same, as
-  // we need to maintain a row/col mapping into the HashMap
   private List<UrlLinkDisplay> data;
 
+  // supplier of url data
   private UrlProviderI dataProvider;
 
+  // list of columns to display in table in correct order
   private List<String> displayColumns;
 
   // row in table which is currently the default
@@ -83,6 +83,7 @@ public class UrlLinkTableModel extends AbstractTableModel
       }
     }
 
+    // set up listener which updates data source when table changes
     this.addTableModelListener(new TableModelListener()
     {
       @Override
@@ -129,14 +130,7 @@ public class UrlLinkTableModel extends AbstractTableModel
   @Override
   public void setValueAt(Object aValue, int rowIndex, int columnIndex)
   {
-    if ((columnIndex == UrlLinkDisplay.SELECTED)
-            && (rowIndex == defaultRow))
-    {
-      // Selected urls column: can't deselect default URL
-      // refuse to edit: TODO show message box here
-
-    }
-    else if (columnIndex == UrlLinkDisplay.DEFAULT)
+    if (columnIndex == UrlLinkDisplay.DEFAULT)
     {
       // Default url column: exactly one row must always be true
       if (rowIndex != defaultRow)
@@ -150,11 +144,6 @@ public class UrlLinkTableModel extends AbstractTableModel
         defaultRow = rowIndex;
         data.get(rowIndex).setValue(columnIndex, aValue);
 
-        // default row must also be selected
-        if (!data.get(rowIndex).getIsSelected())
-        {
-          data.get(rowIndex).setValue(UrlLinkDisplay.SELECTED, true);
-        }
         fireTableRowsUpdated(rowIndex, rowIndex);
       }
     }
@@ -188,6 +177,7 @@ public class UrlLinkTableModel extends AbstractTableModel
       defaultRow--;
     }
 
+    // fire update which will update data source
     fireTableRowsDeleted(rowIndex, rowIndex);
   }
 
@@ -197,6 +187,8 @@ public class UrlLinkTableModel extends AbstractTableModel
     UrlLinkDisplay u = new UrlLinkDisplay(name, name, url, true, false);
     int index = data.size();
     data.add(u);
+
+    // fire update which will update data source
     fireTableRowsInserted(index, index);
     return index;
   }
index b846976..2356f1d 100644 (file)
@@ -26,7 +26,6 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map.Entry;
-import java.util.Vector;
 import java.util.regex.Pattern;
 
 /**
@@ -36,36 +35,15 @@ import java.util.regex.Pattern;
  * @version $Revision$
  */
 
-public class UrlProviderImpl implements UrlProviderI
+public abstract class UrlProviderImpl implements UrlProviderI
 {
-  private static final Pattern MIRIAM_PATTERN = Pattern
-          .compile("^MIR:\\d{8}$");
-
   // minimum length of substitution in url link string
   protected static final int MIN_SUBST_LENGTH = 4;
 
-  protected String defaultUrl;
-
-  @Override
-  public Vector<String> getLinksForMenu()
-  {
-    // TODO Auto-generated method stub
-    return null;
-  }
-
-  @Override
-  public String getDefaultUrl(String seqid)
-  {
-    // TODO Auto-generated method stub
-    return null;
-  }
+  private static final Pattern MIRIAM_PATTERN = Pattern
+          .compile("^MIR:\\d{8}$");
 
-  @Override
-  public String getDefaultTarget(String seqid)
-  {
-    // TODO Auto-generated method stub
-    return null;
-  }
+  protected String defaultUrl;
 
   protected String getDefaultUrl(String seqid, HashMap<String, UrlLink> urls)
   {
@@ -77,6 +55,10 @@ public class UrlProviderImpl implements UrlProviderI
     {
       return null;
     }
+    else if (!urls.containsKey(defaultUrl))
+    {
+      return null;
+    }
     else
     {
       String url = null;
@@ -97,27 +79,6 @@ public class UrlProviderImpl implements UrlProviderI
   }
 
   @Override
-  public boolean setDefaultUrl(String id)
-  {
-    // TODO Auto-generated method stub
-    return false;
-  }
-
-  @Override
-  public String writeUrlsAsString(boolean selected)
-  {
-    // TODO Auto-generated method stub
-    return null;
-  }
-
-  @Override
-  public String chooseDefaultUrl()
-  {
-    // TODO Auto-generated method stub
-    return null;
-  }
-
-  @Override
   public List<UrlLinkDisplay> getLinksForTable()
   {
     return null;
@@ -148,12 +109,6 @@ public class UrlProviderImpl implements UrlProviderI
     return displayLinks;
   }
 
-  @Override
-  public void setUrlData(List<UrlLinkDisplay> links)
-  {
-    // deliberately left empty
-  }
-
   protected boolean isMiriamId(String id)
   {
     return MIRIAM_PATTERN.matcher(id).matches();
@@ -164,12 +119,5 @@ public class UrlProviderImpl implements UrlProviderI
   {
     return !isMiriamId(id);
   }
-
-  @Override
-  public String getDefaultUrlId()
-  {
-    // TODO Auto-generated method stub
-    return null;
-  }
-
 }
+
diff --git a/test/jalview/urls/UrlLinkTableModelTest.java b/test/jalview/urls/UrlLinkTableModelTest.java
new file mode 100644 (file)
index 0000000..7c6f28e
--- /dev/null
@@ -0,0 +1,281 @@
+/*
+ * 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.urls;
+
+import static jalview.util.UrlConstants.DB_ACCESSION;
+import static jalview.util.UrlConstants.DELIM;
+import static jalview.util.UrlConstants.SEP;
+
+import jalview.util.MessageManager;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.event.TableModelListener;
+
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+public class UrlLinkTableModelTest {
+
+  private static final String inmenu = "TEST|http://someurl.blah/$DB_ACCESSION$|"
+          + "ANOTHER|http://test/t$SEQUENCE_ID$|"
+          + "TEST2|http://address/$SEQUENCE_ID$|SRS|"
+          + "http://theSRSlink/$SEQUENCE_ID$|"
+          + "MIR:00000005|MIR:00000011|MIR:00000372";
+
+  private static final String notinmenu = "Not1|http://not.in.menu/$DB_ACCESSION$|"
+          + "Not2|http://not.in.menu.either/$DB_ACCESSION$";
+
+  // Test identifiers.org download file
+  private static final String testIdOrgString = "[{\"id\":\"MIR:00000002\",\"name\":\"ChEBI\",\"pattern\":\"^CHEBI:\\d+$\","
+          + "\"definition\":\"Chemical Entities of Biological Interest (ChEBI)\",\"prefix\":\"chebi\","
+          + "\"url\":\"http://identifiers.org/chebi\"},{\"id\":\"MIR:00000005\",\"name\":\"UniProt Knowledgebase\","
+          + "\"pattern\":\"^([A-N,R-Z][0-9]([A-Z][A-Z, 0-9][A-Z, 0-9][0-9]){1,2})|([O,P,Q][0-9][A-Z, 0-9][A-Z, 0-9][A-Z, 0-9][0-9])(\\.\\d+)?$\","
+          + "\"definition\":\"The UniProt Knowledgebase (UniProtKB)\",\"prefix\":\"uniprot\",\"url\":\"http://identifiers.org/uniprot\"},"
+          + "{\"id\":\"MIR:00000011\",\"name\":\"InterPro\",\"pattern\":\"^IPR\\d{6}$\",\"definition\":\"InterPro\",\"prefix\":\"interpro\","
+          + "\"url\":\"http://identifiers.org/interpro\"},"
+          + "{\"id\":\"MIR:00000372\",\"name\":\"ENA\",\"pattern\":\"^[A-Z]+[0-9]+(\\.\\d+)?$\",\"definition\":\"The European Nucleotide Archive (ENA),\""
+          + "\"prefix\":\"ena.embl\",\"url\":\"http://identifiers.org/ena.embl\"}]";
+
+  private UrlProviderI prov;
+
+  @BeforeMethod(alwaysRun = true)
+  public void setup()
+  {
+    // set up UrlProvider data as the source for the TableModel
+    // the data gets updated by the TableModel, so needs to be reinitialised for
+    // each test
+
+    // make a dummy identifiers.org download file
+    File temp = null;
+    try
+    {
+      temp = File.createTempFile("tempfile", ".tmp");
+      temp.deleteOnExit();
+      BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
+      bw.write(testIdOrgString);
+      bw.close();
+    } catch (IOException e)
+    {
+      System.out.println("Error initialising UrlLinkTableModel test: "
+              + e.getMessage());
+    }
+
+    // set up custom and identifiers.org url providers
+    IdOrgSettings.setDownloadLocation(temp.getPath());
+    IdentifiersUrlProvider idprov = new IdentifiersUrlProvider(inmenu);
+    CustomUrlProvider cprov = new CustomUrlProvider(inmenu, notinmenu);
+    List<UrlProviderI> provlist = new ArrayList<UrlProviderI>();
+    provlist.add(idprov);
+    provlist.add(cprov);
+
+    prov = new UrlProvider("MIR:00000005", provlist);
+  }
+
+  /*
+   * Test that the table model is correctly initialised
+   * Display columns and default row are set; data provider listening event set up
+   */
+  @Test
+  public void testInitialisation()
+  {
+    int defaultCol = 3;
+    int nameCol = 0;
+
+    UrlLinkTableModel m = new UrlLinkTableModel(prov);
+
+    // exactly one table model listener
+    TableModelListener[] listeners = m
+            .getListeners(TableModelListener.class);
+    Assert.assertEquals(listeners.length, 1);
+
+    // default row exists, there is exactly 1, and it matches the supplied
+    // default
+    int count = 0;
+    for (int row = 0; row < m.getRowCount(); row++)
+    {
+      boolean isDefault = (boolean) m.getValueAt(row, defaultCol);
+      if (isDefault)
+      {
+        count++;
+        String defaultName = (String) m.getValueAt(row, nameCol);
+        Assert.assertEquals(defaultName, "UniProt Knowledgebase");
+      }
+    }
+    Assert.assertEquals(count, 1);
+  }
+
+  /*
+   * Test row and column counts
+   */
+  @Test
+  public void testCounts()
+  {
+    UrlLinkTableModel m = new UrlLinkTableModel(prov);
+
+    // correct numbers of column and rows
+    Assert.assertEquals(m.getColumnCount(), 4);
+    Assert.assertEquals(m.getRowCount(), 10);
+  }
+
+  /*
+   * Test column access
+   */
+  @Test
+  public void testColumns()
+  {
+    UrlLinkTableModel m = new UrlLinkTableModel(prov);
+
+    // check column names
+    Assert.assertEquals(m.getColumnName(0),
+            MessageManager.formatMessage("label.name"));
+    Assert.assertEquals(m.getColumnName(1),
+            MessageManager.formatMessage("label.url"));
+    Assert.assertEquals(m.getColumnName(2),
+            MessageManager.formatMessage("label.inmenu"));
+    Assert.assertEquals(m.getColumnName(3),
+            MessageManager.formatMessage("label.default"));
+
+    // check column classes
+    Assert.assertEquals(m.getColumnClass(0), String.class);
+    Assert.assertEquals(m.getColumnClass(1), String.class);
+    Assert.assertEquals(m.getColumnClass(2), Boolean.class);
+    Assert.assertEquals(m.getColumnClass(3), Boolean.class);
+  }
+
+  /*
+   * Test row insertion
+   */
+  @Test
+  public void testRowInsert()
+  {
+    UrlLinkTableModel m = new UrlLinkTableModel(prov);
+
+    m.insertRow("newname", "newurl");
+
+    // check table has new row inserted
+    Assert.assertEquals(m.getValueAt(10, 0), "newname");
+    Assert.assertEquals(m.getValueAt(10, 1), "newurl");
+    Assert.assertEquals(m.getValueAt(10, 2), true);
+    Assert.assertEquals(m.getValueAt(10, 3), false);
+
+    // check data source has new row insrte
+    Assert.assertTrue(prov.getLinksForMenu().contains(
+            "newname" + SEP + "newurl"));
+  }
+
+  /*
+   * Test row deletion
+   */
+  @Test
+  public void testRowDelete()
+  {
+    UrlLinkTableModel m = new UrlLinkTableModel(prov);
+
+    // get name and url at row 0
+    String name = (String) m.getValueAt(0, 0);
+    String url = (String) m.getValueAt(0, 1);
+
+    m.removeRow(0);
+
+    // check table no longer has row 0 elements in it
+    for (int row = 0; row < m.getRowCount(); row++)
+    {
+      Assert.assertNotEquals(m.getValueAt(row, 0), name);
+    }
+
+    // check data source likewise
+    Assert.assertFalse(prov.getLinksForMenu().contains(name + SEP + url));
+  }
+
+  /*
+   * Test value setting and getting
+   */
+  @Test
+  public void testValues()
+  {
+    UrlLinkTableModel m = new UrlLinkTableModel(prov);
+
+    // get original default
+    int olddefault;
+    boolean isDefault = false;
+    for (olddefault = 0; olddefault < m.getRowCount() && !isDefault; olddefault++)
+    {
+      isDefault = (boolean) m.getValueAt(olddefault, 3);
+    }
+
+    // set new values, one in each row - uneditable
+    m.setValueAt("namechanged", 6, 0);
+    m.setValueAt("urlchanged", 7, 1);
+    m.setValueAt(false, 8, 2);
+    m.setValueAt(true, 9, 3);
+
+    // check values updated in table
+    Assert.assertEquals(m.getValueAt(6, 0), "namechanged");
+    Assert.assertEquals(m.getValueAt(7, 1), "urlchanged");
+    Assert.assertFalse((boolean) m.getValueAt(8, 2));
+    Assert.assertTrue((boolean) m.getValueAt(9, 3));
+    Assert.assertFalse((boolean) m.getValueAt(olddefault, 3));
+
+    // check default row is exactly one row still
+    for (int row = 0; row < m.getRowCount(); row++)
+    {
+      isDefault = (boolean) m.getValueAt(row, 3);
+
+      // if isDefault is true, row is 9
+      // if isDefault is false, row is not 9
+      Assert.assertFalse(isDefault && !(row == 9));
+    }
+
+    // check table updated
+    Assert.assertTrue(prov.writeUrlsAsString(true).contains("namechanged" +SEP + m.getValueAt(6, 1)));
+    Assert.assertTrue(prov.writeUrlsAsString(true).contains(m.getValueAt(7,0) + SEP + "urlchanged"));
+    Assert.assertTrue(prov.writeUrlsAsString(false).contains(
+            (String) m.getValueAt(8, 0)));
+    Assert.assertEquals(prov.getDefaultUrl("seqid"), m.getValueAt(9, 1)
+            .toString().replace(DELIM + DB_ACCESSION + DELIM, "seqid"));
+
+  }
+
+  /*
+   * Test cell editability
+   */
+  @Test
+  public void testEditable()
+  {
+    UrlLinkTableModel m = new UrlLinkTableModel(prov);
+
+    for (int row = 0; row < m.getRowCount(); row++)
+    {
+      Assert.assertFalse(m.isCellEditable(row, 0));
+      Assert.assertFalse(m.isCellEditable(row, 1));
+      Assert.assertTrue(m.isCellEditable(row, 2));
+      Assert.assertTrue(m.isCellEditable(row, 3));
+    }
+  }
+}