/*
* 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.DELIM;
import static jalview.util.UrlConstants.SEP;
import static jalview.util.UrlConstants.SEQUENCE_ID;
import jalview.urls.api.UrlProviderI;
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$";
private static final String testIdOrgString = "{\"Local\": [{\"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("TEST2", provlist);
}
/*
* Test that the table model is correctly initialised
* Display columns and default row are set; data provider listening event set up
*/
@Test(groups = { "Functional" })
public void testInitialisation()
{
int defaultCol = 4;
int dbCol = 0;
int descCol = 1;
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 defaultDBName = (String) m.getValueAt(row, dbCol);
Assert.assertEquals(defaultDBName, "TEST2");
String defaultDesc = (String) m.getValueAt(row, descCol);
Assert.assertEquals(defaultDesc, "TEST2");
}
}
Assert.assertEquals(count, 1);
}
/*
* Test row and column counts
*/
@Test(groups = { "Functional" })
public void testCounts()
{
UrlLinkTableModel m = new UrlLinkTableModel(prov);
// correct numbers of column and rows
Assert.assertEquals(m.getColumnCount(), 5);
Assert.assertEquals(m.getRowCount(), 10);
}
/*
* Test column access
*/
@Test(groups = { "Functional" })
public void testColumns()
{
UrlLinkTableModel m = new UrlLinkTableModel(prov);
// check column names
Assert.assertEquals(m.getColumnName(0),
MessageManager.formatMessage("label.database"));
Assert.assertEquals(m.getColumnName(1),
MessageManager.formatMessage("label.name"));
Assert.assertEquals(m.getColumnName(2),
MessageManager.formatMessage("label.url"));
Assert.assertEquals(m.getColumnName(3),
MessageManager.formatMessage("label.inmenu"));
Assert.assertEquals(m.getColumnName(4),
MessageManager.formatMessage("label.primary"));
// check column classes
Assert.assertEquals(m.getColumnClass(0), String.class);
Assert.assertEquals(m.getColumnClass(1), String.class);
Assert.assertEquals(m.getColumnClass(2), String.class);
Assert.assertEquals(m.getColumnClass(3), Boolean.class);
Assert.assertEquals(m.getColumnClass(4), Boolean.class);
}
/*
* Test row insertion
*/
@Test(groups = { "Functional" })
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), "newname");
Assert.assertEquals(m.getValueAt(10, 2), "newurl");
Assert.assertEquals(m.getValueAt(10, 3), true);
Assert.assertEquals(m.getValueAt(10, 4), false);
// check data source has new row insrte
Assert.assertTrue(prov.getLinksForMenu().contains(
"newname" + SEP + "newurl"));
}
/*
* Test row deletion
*/
@Test(groups = { "Functional" })
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(groups = { "Functional" })
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
m.setValueAt("dbnamechanged", 6, 0);
m.setValueAt("descchanged", 6, 1);
m.setValueAt("urlchanged", 7, 2);
m.setValueAt(false, 8, 3);
m.setValueAt(true, 6, 4);
m.setValueAt("dbnamechanged", 5, 0);
// check values updated in table
Assert.assertEquals(m.getValueAt(6, 0), "descchanged"); // custom url can't
// change db name
Assert.assertEquals(m.getValueAt(6, 1), "descchanged");
Assert.assertEquals(m.getValueAt(7, 2), "urlchanged");
Assert.assertFalse((boolean) m.getValueAt(8, 3));
Assert.assertTrue((boolean) m.getValueAt(6, 4));
Assert.assertFalse((boolean) m.getValueAt(olddefault, 4));
Assert.assertEquals(m.getValueAt(5, 0), "dbnamechanged");
// check default row is exactly one row still
for (int row = 0; row < m.getRowCount(); row++)
{
isDefault = (boolean) m.getValueAt(row, 4);
// if isDefault is true, row is 9
// if isDefault is false, row is not 9
Assert.assertFalse(isDefault && !(row == 6));
}
// check table updated
Assert.assertTrue(prov.writeUrlsAsString(true).contains(
"descchanged" + SEP + m.getValueAt(6, 2)));
Assert.assertTrue(prov.writeUrlsAsString(true).contains(
m.getValueAt(7, 1) + SEP + "urlchanged"));
Assert.assertTrue(prov.writeUrlsAsString(false).contains(
(String) m.getValueAt(8, 1)));
Assert.assertEquals(prov.getPrimaryUrl("seqid"), m.getValueAt(6, 2)
.toString().replace(DELIM + SEQUENCE_ID + DELIM, "seqid"));
}
/*
* Test cell editability
*/
@Test(groups = { "Functional" })
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.assertFalse(m.isCellEditable(row, 2));
Assert.assertTrue(m.isCellEditable(row, 3));
if ((row == 4) || (row == 6) || (row == 7))
{
Assert.assertTrue(m.isCellEditable(row, 4));
}
else
{
Assert.assertFalse(m.isCellEditable(row, 4));
}
}
}
/*
* Test row 'deletability'
*/
@Test(groups = { "Functional" })
public void testDeletable()
{
UrlLinkTableModel m = new UrlLinkTableModel(prov);
for (int row = 0; row < m.getRowCount(); row++)
{
if (row > 4)
{
Assert.assertTrue(m.isRowDeletable(row));
}
else
{
Assert.assertFalse(m.isRowDeletable(row));
}
}
}
/*
* Test indirect row editability
*/
@Test(groups = { "Functional" })
public void testRowEditable()
{
UrlLinkTableModel m = new UrlLinkTableModel(prov);
for (int row = 0; row < m.getRowCount(); row++)
{
if (row > 3)
{
Assert.assertTrue(m.isRowEditable(row));
}
else
{
Assert.assertFalse(m.isRowEditable(row));
}
}
}
}