" + s
// + "
Jmol/secondary structure
PDB/Temp";
String expected = "" + s
+ "
Jmol/secondary structure
PDB/Temp";
s = menu.getToolTipText();
assertEquals(expected, s);
}
/**
* 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.annotations = new Annotation[] { new Annotation(2f) };
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");
annotation.annotations = new Annotation[] { new Annotation(2f) };
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");
annotation.annotations = new Annotation[] { new Annotation(2f) };
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 sequence id, dbref and feature links
*/
@Test(groups = { "Functional" })
public void testBuildLinkMenu()
{
List seqs = parentPanel.getAlignment().getSequences();
final SequenceI seq0 = seqs.get(0);
final SequenceI seq1 = seqs.get(1);
final List noFeatures = Collections
. emptyList();
final String linkText = MessageManager.getString("action.link");
seq0.addDBRef(new DBRefEntry(DBRefSource.UNIPROT, "1", "P83527"));
seq0.addDBRef(new DBRefEntry("INTERPRO", "1", "IPR001041"));
seq0.addDBRef(new DBRefEntry("INTERPRO", "1", "IPR012675"));
seq0.addDBRef(new DBRefEntry("INTERPRO", "1", "IPR006058"));
seq1.addDBRef(new DBRefEntry(DBRefSource.UNIPROT, "1", "Q9ZTS2"));
seq1.addDBRef(new DBRefEntry("GENE3D", "1", "3.10.20.30"));
/*
* check the Link Menu for the first sequence
*/
JMenu linkMenu = PopupMenu.buildLinkMenu(seq0, noFeatures);
assertEquals(linkText, linkMenu.getText());
Component[] linkItems = linkMenu.getMenuComponents();
/*
* menu items are ordered: SEQUENCE_ID search first, then dbrefs in order
* of database name (and within that by order of dbref addition)
*/
assertEquals(5, linkItems.length);
assertEquals("EMBL-EBI Search", ((JMenuItem) linkItems[0]).getText());
assertEquals("INTERPRO|IPR001041",
((JMenuItem) linkItems[1]).getText());
assertEquals("INTERPRO|IPR012675",
((JMenuItem) linkItems[2]).getText());
assertEquals("INTERPRO|IPR006058",
((JMenuItem) linkItems[3]).getText());
assertEquals("UNIPROT|P83527", ((JMenuItem) linkItems[4]).getText());
/*
* check the Link Menu for the second sequence
* note dbref GENE3D is matched to link Gene3D, the latter is displayed
*/
linkMenu = PopupMenu.buildLinkMenu(seq1, noFeatures);
linkItems = linkMenu.getMenuComponents();
assertEquals(3, linkItems.length);
assertEquals("EMBL-EBI Search", ((JMenuItem) linkItems[0]).getText());
assertEquals("Gene3D|3.10.20.30", ((JMenuItem) linkItems[1]).getText());
assertEquals("UNIPROT|Q9ZTS2", ((JMenuItem) linkItems[2]).getText());
/*
* if there are no valid links the Links submenu is still shown, but
* reduced to the EMBL-EBI lookup only (inserted by
* CustomUrlProvider.choosePrimaryUrl())
*/
String unmatched = "NOMATCH|http://www.uniprot.org/uniprot/$"
+ DB_ACCESSION + "$";
UrlProviderFactoryI factory = new DesktopUrlProviderFactory(null,
unmatched, "");
Preferences.sequenceUrlLinks = factory.createUrlProvider();
linkMenu = PopupMenu.buildLinkMenu(seq1, noFeatures);
linkItems = linkMenu.getMenuComponents();
assertEquals(1, linkItems.length);
assertEquals("EMBL-EBI Search", ((JMenuItem) linkItems[0]).getText());
/*
* if sequence is null, only feature links are shown (alignment popup submenu)
*/
linkMenu = PopupMenu.buildLinkMenu(null, noFeatures);
linkItems = linkMenu.getMenuComponents();
assertEquals(0, linkItems.length);
List features = new ArrayList<>();
SequenceFeature sf = new SequenceFeature("type", "desc", 1, 20, null);
features.add(sf);
linkMenu = PopupMenu.buildLinkMenu(null, features);
linkItems = linkMenu.getMenuComponents();
assertEquals(0, linkItems.length); // feature has no links
sf.addLink("Pfam family|http://pfam.xfam.org/family/PF00111");
linkMenu = PopupMenu.buildLinkMenu(null, features);
linkItems = linkMenu.getMenuComponents();
assertEquals(1, linkItems.length);
JMenuItem item = (JMenuItem) linkItems[0];
assertEquals("Pfam family", item.getText());
// ? no way to verify URL, compiled into link's actionListener
}
@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);
}
@Test(groups = { "Functional" })
public void testAddFeatureDetails()
{
String menuText = MessageManager.getString("label.feature_details");
/*
* with no features, sub-menu should not be created
*/
List features = new ArrayList<>();
SequenceI seq = this.alignment.getSequenceAt(0); // FER_CAPAA/1-12
testee.addFeatureDetails(features, seq, 10);
JMenu menu = findMenu(testee, menuText);
assertNull(menu);
/*
* add some features; the menu item text is wrapped in html, and includes
* feature type, position, description, group (if not null)
*/
SequenceFeature sf1 = new SequenceFeature("helix", "curly", 2, 6, null);
SequenceFeature sf2 = new SequenceFeature("chain", "straight", 1, 1,
"uniprot");
features.add(sf1);
features.add(sf2);
testee.addFeatureDetails(features, seq, 10);
menu = findMenu(testee, menuText);
assertNotNull(menu);
assertEquals(2, menu.getItemCount());
JMenuItem item = menu.getItem(0);
assertEquals("helix 2-6 curly", item.getText());
item = menu.getItem(1);
assertEquals("chain 1 straight (uniprot)", item.getText());
/*
* long feature descriptions are truncated to 40 characters
*/
sf1.setDescription(
"this is a quite extraordinarily long description");
testee.remove(menu); // don't create the sub-menu twice
testee.addFeatureDetails(features, seq, 10);
menu = findMenu(testee, menuText);
item = menu.getItem(0);
assertEquals(
"helix 2-6 this is a quite extraordinarily long des...",
item.getText());
}
/**
* Returns the first component which is a JMenu with the given text
*
* @param c
* @param text
* @return
*/
private JMenu findMenu(Container c, String text)
{
for (int i = 0; i < c.getComponentCount(); i++)
{
Component comp = c.getComponent(i);
if ((comp instanceof JMenu) && ((JMenu) comp).getText().equals(text))
{
return (JMenu) comp;
}
}
return null;
}
@Test(groups = { "Functional" })
public void testAddFeatureDetails_linkedFeatures()
{
// todo tests that verify menu items for complement features
}
}