From 2db199e42a0ef5cca46c237544aa5c807cdece18 Mon Sep 17 00:00:00 2001 From: kiramt Date: Fri, 9 Dec 2016 10:11:49 +0000 Subject: [PATCH] JAL-2316 Unit testing, relax constraint that default url is in menu --- src/jalview/jbgui/GSequenceLink.java | 2 - src/jalview/urls/CustomUrlProvider.java | 35 ++-- src/jalview/urls/IdentifiersUrlProvider.java | 21 +- src/jalview/urls/UrlLinkTableModel.java | 22 +- src/jalview/urls/UrlProviderImpl.java | 70 +------ test/jalview/urls/UrlLinkTableModelTest.java | 281 ++++++++++++++++++++++++++ 6 files changed, 324 insertions(+), 107 deletions(-) create mode 100644 test/jalview/urls/UrlLinkTableModelTest.java diff --git a/src/jalview/jbgui/GSequenceLink.java b/src/jalview/jbgui/GSequenceLink.java index 1250bad..9e44096 100755 --- a/src/jalview/jbgui/GSequenceLink.java +++ b/src/jalview/jbgui/GSequenceLink.java @@ -225,8 +225,6 @@ public class GSequenceLink extends JPanel return false; } - - public void nameTB_keyTyped(KeyEvent e) { if (e.getKeyChar() == '|') diff --git a/src/jalview/urls/CustomUrlProvider.java b/src/jalview/urls/CustomUrlProvider.java index ab84be2..439d551 100644 --- a/src/jalview/urls/CustomUrlProvider.java +++ b/src/jalview/urls/CustomUrlProvider.java @@ -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()); } } diff --git a/src/jalview/urls/IdentifiersUrlProvider.java b/src/jalview/urls/IdentifiersUrlProvider.java index 45d3863..98a5ee4 100644 --- a/src/jalview/urls/IdentifiersUrlProvider.java +++ b/src/jalview/urls/IdentifiersUrlProvider.java @@ -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; } - } diff --git a/src/jalview/urls/UrlLinkTableModel.java b/src/jalview/urls/UrlLinkTableModel.java index 0605f02..a18341b 100644 --- a/src/jalview/urls/UrlLinkTableModel.java +++ b/src/jalview/urls/UrlLinkTableModel.java @@ -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 data; + // supplier of url data private UrlProviderI dataProvider; + // list of columns to display in table in correct order private List 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; } diff --git a/src/jalview/urls/UrlProviderImpl.java b/src/jalview/urls/UrlProviderImpl.java index b846976..2356f1d 100644 --- a/src/jalview/urls/UrlProviderImpl.java +++ b/src/jalview/urls/UrlProviderImpl.java @@ -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 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 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 getLinksForTable() { return null; @@ -148,12 +109,6 @@ public class UrlProviderImpl implements UrlProviderI return displayLinks; } - @Override - public void setUrlData(List 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 index 0000000..7c6f28e --- /dev/null +++ b/test/jalview/urls/UrlLinkTableModelTest.java @@ -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 . + * 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 provlist = new ArrayList(); + 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)); + } + } +} -- 1.7.10.2