seqs = parentPanel.getAlignment().getSequences();
// make up new annotations and add to dataset sequences
attachReferenceAnnotations(seqs, false, false);
testee.configureReferenceAnnotationsMenu(menu, seqs);
assertTrue(menu.isEnabled());
String s = MessageManager.getString("label.add_annotations_for");
String expected = ""
+ s + "
Jmol/secondary structure
PDB/Temp
";
assertEquals(expected, menu.getToolTipText());
}
/**
* Test building the 'add reference annotations' menu for the case where
* several reference annotations are on the dataset and the sequences but not
* on the alignment. The menu item should be enabled, and acquire a tooltip
* which lists the annotation sources (calcIds) and type (labels).
*/
@Test(groups = { "Functional" })
public void testConfigureReferenceAnnotationsMenu_notOnAlignment()
{
JMenuItem menu = new JMenuItem();
List seqs = parentPanel.getAlignment().getSequences();
// make up new annotations and add to dataset sequences and sequences
attachReferenceAnnotations(seqs, true, false);
testee.configureReferenceAnnotationsMenu(menu, seqs);
assertTrue(menu.isEnabled());
String s = MessageManager.getString("label.add_annotations_for");
String expected = ""
+ s + "
Jmol/secondary structure
PDB/Temp
";
assertEquals(expected, menu.getToolTipText());
}
/**
* Generate annotations and add to dataset sequences and (optionally)
* sequences and/or alignment
*
* @param seqs
* @param addToSequence
* @param addToAlignment
*/
private void attachReferenceAnnotations(List seqs,
boolean addToSequence, boolean addToAlignment)
{
// PDB.secondary structure on Sequence0
AlignmentAnnotation annotation = new AlignmentAnnotation(
"secondary structure", "", 0);
annotation.setCalcId("PDB");
seqs.get(0).getDatasetSequence().addAlignmentAnnotation(annotation);
if (addToSequence)
{
seqs.get(0).addAlignmentAnnotation(annotation);
}
if (addToAlignment)
{
this.alignment.addAnnotation(annotation);
}
// PDB.Temp on Sequence1
annotation = new AlignmentAnnotation("Temp", "", 0);
annotation.setCalcId("PDB");
seqs.get(1).getDatasetSequence().addAlignmentAnnotation(annotation);
if (addToSequence)
{
seqs.get(1).addAlignmentAnnotation(annotation);
}
if (addToAlignment)
{
this.alignment.addAnnotation(annotation);
}
// JMOL.secondary structure on Sequence0
annotation = new AlignmentAnnotation("secondary structure", "", 0);
annotation.setCalcId("Jmol");
seqs.get(0).getDatasetSequence().addAlignmentAnnotation(annotation);
if (addToSequence)
{
seqs.get(0).addAlignmentAnnotation(annotation);
}
if (addToAlignment)
{
this.alignment.addAnnotation(annotation);
}
}
/**
* Test building the 'add reference annotations' menu for the case where there
* are two alignment views:
*
* - in one view, reference annotations have been added (are on the
* datasets, sequences and alignment)
* - in the current view, reference annotations are on the dataset and
* sequence, but not the alignment
*
* The menu item should be enabled, and acquire a tooltip which lists the
* annotation sources (calcIds) and type (labels).
*/
@Test(groups = { "Functional" })
public void testConfigureReferenceAnnotationsMenu_twoViews()
{
}
/**
* Test for building menu options including 'show' and 'hide' annotation
* types.
*/
@Test(groups = { "Functional" })
public void testBuildAnnotationTypesMenus()
{
JMenu showMenu = new JMenu();
JMenu hideMenu = new JMenu();
List seqs = parentPanel.getAlignment().getSequences();
// make up new annotations and add to sequences and to the alignment
// PDB.secondary structure on Sequence0
AlignmentAnnotation annotation = new AlignmentAnnotation(
"secondary structure", "", new Annotation[] {});
annotation.setCalcId("PDB");
annotation.visible = true;
seqs.get(0).addAlignmentAnnotation(annotation);
parentPanel.getAlignment().addAnnotation(annotation);
// JMOL.secondary structure on Sequence0 - hidden
annotation = new AlignmentAnnotation("secondary structure", "",
new Annotation[] {});
annotation.setCalcId("JMOL");
annotation.visible = false;
seqs.get(0).addAlignmentAnnotation(annotation);
parentPanel.getAlignment().addAnnotation(annotation);
// Jpred.SSP on Sequence0 - hidden
annotation = new AlignmentAnnotation("SSP", "", new Annotation[] {});
annotation.setCalcId("JPred");
annotation.visible = false;
seqs.get(0).addAlignmentAnnotation(annotation);
parentPanel.getAlignment().addAnnotation(annotation);
// PDB.Temp on Sequence1
annotation = new AlignmentAnnotation("Temp", "", new Annotation[] {});
annotation.setCalcId("PDB");
annotation.visible = true;
seqs.get(1).addAlignmentAnnotation(annotation);
parentPanel.getAlignment().addAnnotation(annotation);
/*
* Expect menu options to show "secondary structure" and "SSP", and to hide
* "secondary structure" and "Temp". Tooltip should be calcId.
*/
testee.buildAnnotationTypesMenus(showMenu, hideMenu, seqs);
assertTrue(showMenu.isEnabled());
assertTrue(hideMenu.isEnabled());
Component[] showOptions = showMenu.getMenuComponents();
Component[] hideOptions = hideMenu.getMenuComponents();
assertEquals(4, showOptions.length); // includes 'All' and separator
assertEquals(4, hideOptions.length);
String all = MessageManager.getString("label.all");
assertEquals(all, ((JMenuItem) showOptions[0]).getText());
assertTrue(showOptions[1] instanceof JPopupMenu.Separator);
assertEquals(JSeparator.HORIZONTAL,
((JSeparator) showOptions[1]).getOrientation());
assertEquals("secondary structure",
((JMenuItem) showOptions[2]).getText());
assertEquals("JMOL", ((JMenuItem) showOptions[2]).getToolTipText());
assertEquals("SSP", ((JMenuItem) showOptions[3]).getText());
assertEquals("JPred", ((JMenuItem) showOptions[3]).getToolTipText());
assertEquals(all, ((JMenuItem) hideOptions[0]).getText());
assertTrue(hideOptions[1] instanceof JPopupMenu.Separator);
assertEquals(JSeparator.HORIZONTAL,
((JSeparator) hideOptions[1]).getOrientation());
assertEquals("secondary structure",
((JMenuItem) hideOptions[2]).getText());
assertEquals("PDB", ((JMenuItem) hideOptions[2]).getToolTipText());
assertEquals("Temp", ((JMenuItem) hideOptions[3]).getText());
assertEquals("PDB", ((JMenuItem) hideOptions[3]).getToolTipText());
}
/**
* Test for building menu options with only 'hide' annotation types enabled.
*/
@Test(groups = { "Functional" })
public void testBuildAnnotationTypesMenus_showDisabled()
{
JMenu showMenu = new JMenu();
JMenu hideMenu = new JMenu();
List seqs = parentPanel.getAlignment().getSequences();
// make up new annotations and add to sequences and to the alignment
// PDB.secondary structure on Sequence0
AlignmentAnnotation annotation = new AlignmentAnnotation(
"secondary structure", "", new Annotation[] {});
annotation.setCalcId("PDB");
annotation.visible = true;
seqs.get(0).addAlignmentAnnotation(annotation);
parentPanel.getAlignment().addAnnotation(annotation);
// PDB.Temp on Sequence1
annotation = new AlignmentAnnotation("Temp", "", new Annotation[] {});
annotation.setCalcId("PDB");
annotation.visible = true;
seqs.get(1).addAlignmentAnnotation(annotation);
parentPanel.getAlignment().addAnnotation(annotation);
/*
* Expect menu options to hide "secondary structure" and "Temp". Tooltip
* should be calcId. 'Show' menu should be disabled.
*/
testee.buildAnnotationTypesMenus(showMenu, hideMenu, seqs);
assertFalse(showMenu.isEnabled());
assertTrue(hideMenu.isEnabled());
Component[] showOptions = showMenu.getMenuComponents();
Component[] hideOptions = hideMenu.getMenuComponents();
assertEquals(2, showOptions.length); // includes 'All' and separator
assertEquals(4, hideOptions.length);
String all = MessageManager.getString("label.all");
assertEquals(all, ((JMenuItem) showOptions[0]).getText());
assertTrue(showOptions[1] instanceof JPopupMenu.Separator);
assertEquals(JSeparator.HORIZONTAL,
((JSeparator) showOptions[1]).getOrientation());
assertEquals(all, ((JMenuItem) hideOptions[0]).getText());
assertTrue(hideOptions[1] instanceof JPopupMenu.Separator);
assertEquals(JSeparator.HORIZONTAL,
((JSeparator) hideOptions[1]).getOrientation());
assertEquals("secondary structure",
((JMenuItem) hideOptions[2]).getText());
assertEquals("PDB", ((JMenuItem) hideOptions[2]).getToolTipText());
assertEquals("Temp", ((JMenuItem) hideOptions[3]).getText());
assertEquals("PDB", ((JMenuItem) hideOptions[3]).getToolTipText());
}
/**
* Test for building menu options with only 'show' annotation types enabled.
*/
@Test(groups = { "Functional" })
public void testBuildAnnotationTypesMenus_hideDisabled()
{
JMenu showMenu = new JMenu();
JMenu hideMenu = new JMenu();
List seqs = parentPanel.getAlignment().getSequences();
// make up new annotations and add to sequences and to the alignment
// PDB.secondary structure on Sequence0
AlignmentAnnotation annotation = new AlignmentAnnotation(
"secondary structure", "", new Annotation[] {});
annotation.setCalcId("PDB");
annotation.visible = false;
seqs.get(0).addAlignmentAnnotation(annotation);
parentPanel.getAlignment().addAnnotation(annotation);
// PDB.Temp on Sequence1
annotation = new AlignmentAnnotation("Temp", "", new Annotation[] {});
annotation.setCalcId("PDB2");
annotation.visible = false;
seqs.get(1).addAlignmentAnnotation(annotation);
parentPanel.getAlignment().addAnnotation(annotation);
/*
* Expect menu options to show "secondary structure" and "Temp". Tooltip
* should be calcId. 'hide' menu should be disabled.
*/
testee.buildAnnotationTypesMenus(showMenu, hideMenu, seqs);
assertTrue(showMenu.isEnabled());
assertFalse(hideMenu.isEnabled());
Component[] showOptions = showMenu.getMenuComponents();
Component[] hideOptions = hideMenu.getMenuComponents();
assertEquals(4, showOptions.length); // includes 'All' and separator
assertEquals(2, hideOptions.length);
String all = MessageManager.getString("label.all");
assertEquals(all, ((JMenuItem) showOptions[0]).getText());
assertTrue(showOptions[1] instanceof JPopupMenu.Separator);
assertEquals(JSeparator.HORIZONTAL,
((JSeparator) showOptions[1]).getOrientation());
assertEquals("secondary structure",
((JMenuItem) showOptions[2]).getText());
assertEquals("PDB", ((JMenuItem) showOptions[2]).getToolTipText());
assertEquals("Temp", ((JMenuItem) showOptions[3]).getText());
assertEquals("PDB2", ((JMenuItem) showOptions[3]).getToolTipText());
assertEquals(all, ((JMenuItem) hideOptions[0]).getText());
assertTrue(hideOptions[1] instanceof JPopupMenu.Separator);
assertEquals(JSeparator.HORIZONTAL,
((JSeparator) hideOptions[1]).getOrientation());
}
/**
* Test for adding feature links
*/
@Test(groups = { "Functional" })
public void testAddFeatureLinks()
{
// sequences from the alignment
List seqs = parentPanel.getAlignment().getSequences();
// create list of links and list of DBRefs
List links = new ArrayList<>();
List refs = new ArrayList<>();
// 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 + "$");
// Gene3D entry tests for case (in)sensitivity
links.add("Gene3D | http://gene3d.biochem.ucl.ac.uk/Gene3D/search?sterm=$"
+ DB_ACCESSION + "$&mode=protein");
// 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"));
// make seq1 dbrefs
refs.add(new DBRefEntry(DBRefSource.UNIPROT, "1", "Q9ZTS2"));
refs.add(new DBRefEntry("GENE3D", "1", "3.10.20.30"));
// add all the dbrefs to the sequences: Uniprot 1 each, Interpro all 3 to
// seq0, Gene3D to seq1
SequenceI seq = seqs.get(0);
seq.addDBRef(refs.get(0));
seq.addDBRef(refs.get(1));
seq.addDBRef(refs.get(2));
seq.addDBRef(refs.get(3));
seqs.get(1).addDBRef(refs.get(4));
seqs.get(1).addDBRef(refs.get(5));
// get the Popup Menu for first sequence
List noFeatures = Collections. emptyList();
testee = new PopupMenu(parentPanel, seq, noFeatures);
Component[] seqItems = testee.sequenceMenu.getMenuComponents();
JMenu linkMenu = (JMenu) seqItems[6];
Component[] linkItems = linkMenu.getMenuComponents();
// check the number of links are the expected number
assertEquals(5, linkItems.length);
// first entry is EMBL-EBI which just uses sequence id not accession id?
assertEquals("EMBL-EBI Search", ((JMenuItem) linkItems[0]).getText());
// sequence id for each link should match corresponding DB accession id
for (int i = 1; i < 4; i++)
{
String msg = seq.getName() + " link[" + i + "]";
assertEquals(msg, refs.get(i - 1).getSource(),
((JMenuItem) linkItems[i])
.getText().split("\\|")[0]);
assertEquals(msg, refs.get(i - 1).getAccessionId(),
((JMenuItem) linkItems[i])
.getText().split("\\|")[1]);
}
// get the Popup Menu for second sequence
seq = seqs.get(1);
testee = new PopupMenu(parentPanel, seq, noFeatures);
seqItems = testee.sequenceMenu.getMenuComponents();
linkMenu = (JMenu) seqItems[6];
linkItems = linkMenu.getMenuComponents();
// check the number of links are the expected number
assertEquals(3, linkItems.length);
// first entry is EMBL-EBI which just uses sequence id not accession id?
assertEquals("EMBL-EBI Search", ((JMenuItem) linkItems[0]).getText());
// sequence id for each link should match corresponding DB accession id
for (int i = 1; i < 3; i++)
{
String msg = seq.getName() + " link[" + i + "]";
assertEquals(msg, refs.get(i + 3).getSource(),
((JMenuItem) linkItems[i])
.getText().split("\\|")[0].toUpperCase());
assertEquals(msg, refs.get(i + 3).getAccessionId(),
((JMenuItem) linkItems[i]).getText().split("\\|")[1]);
}
// if there are no valid links the Links submenu is disabled
List nomatchlinks = new ArrayList<>();
nomatchlinks.add("NOMATCH | http://www.uniprot.org/uniprot/$"
+ DB_ACCESSION + "$");
testee = new PopupMenu(parentPanel, seq, noFeatures);
seqItems = testee.sequenceMenu.getMenuComponents();
linkMenu = (JMenu) seqItems[6];
assertFalse(linkMenu.isEnabled());
}
/**
* Test for adding feature links
*/
@Test(groups = { "Functional" })
public void testHideInsertions()
{
// get sequences from the alignment
List seqs = parentPanel.getAlignment().getSequences();
// add our own seqs to avoid problems with changes to existing sequences
// (gap at end of sequences varies depending on how tests are run!)
Sequence seqGap1 = new Sequence("GappySeq",
"AAAA----AA-AAAAAAA---AAA-----------AAAAAAAAAA--");
seqGap1.createDatasetSequence();
seqs.add(seqGap1);
Sequence seqGap2 = new Sequence("LessGappySeq",
"AAAAAA-AAAAA---AAA--AAAAA--AAAAAAA-AAAAAA");
seqGap2.createDatasetSequence();
seqs.add(seqGap2);
Sequence seqGap3 = new Sequence("AnotherGapSeq",
"AAAAAA-AAAAAA--AAAAAA-AAAAAAAAAAA---AAAAAAAA");
seqGap3.createDatasetSequence();
seqs.add(seqGap3);
Sequence seqGap4 = new Sequence("NoGaps",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
seqGap4.createDatasetSequence();
seqs.add(seqGap4);
ColumnSelection sel = new ColumnSelection();
parentPanel.av.getAlignment().getHiddenColumns()
.revealAllHiddenColumns(sel);
// get the Popup Menu for 7th sequence - no insertions
testee = new PopupMenu(parentPanel, seqs.get(7), null);
testee.hideInsertions_actionPerformed(null);
HiddenColumns hidden = parentPanel.av.getAlignment().getHiddenColumns();
Iterator it = hidden.iterator();
assertFalse(it.hasNext());
// get the Popup Menu for GappySeq - this time we have insertions
testee = new PopupMenu(parentPanel, seqs.get(4), null);
testee.hideInsertions_actionPerformed(null);
hidden = parentPanel.av.getAlignment().getHiddenColumns();
it = hidden.iterator();
assertTrue(it.hasNext());
int[] region = it.next();
assertEquals(region[0], 4);
assertEquals(region[1], 7);
assertTrue(it.hasNext());
region = it.next();
assertEquals(region[0], 10);
assertEquals(region[1], 10);
assertTrue(it.hasNext());
region = it.next();
assertEquals(region[0], 18);
assertEquals(region[1], 20);
assertTrue(it.hasNext());
region = it.next();
assertEquals(region[0], 24);
assertEquals(region[1], 34);
assertTrue(it.hasNext());
region = it.next();
assertEquals(region[0], 45);
assertEquals(region[1], 46);
assertFalse(it.hasNext());
sel = new ColumnSelection();
hidden.revealAllHiddenColumns(sel);
// make a sequence group and hide insertions within the group
SequenceGroup sg = new SequenceGroup();
sg.setStartRes(8);
sg.setEndRes(42);
sg.addSequence(seqGap2, false);
sg.addSequence(seqGap3, false);
parentPanel.av.setSelectionGroup(sg);
// hide columns outside and within selection
// only hidden columns outside the collection will be retained (unless also
// gaps in the selection)
hidden.hideColumns(1, 10);
hidden.hideColumns(31, 40);
// get the Popup Menu for LessGappySeq in the sequence group
testee = new PopupMenu(parentPanel, seqs.get(5), null);
testee.hideInsertions_actionPerformed(null);
hidden = parentPanel.av.getAlignment().getHiddenColumns();
it = hidden.iterator();
assertTrue(it.hasNext());
region = it.next();
assertEquals(region[0], 1);
assertEquals(region[1], 7);
assertTrue(it.hasNext());
region = it.next();
assertEquals(region[0], 13);
assertEquals(region[1], 14);
assertTrue(it.hasNext());
region = it.next();
assertEquals(region[0], 34);
assertEquals(region[1], 34);
}
}