X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=test%2Fjalview%2Fgui%2FPopupMenuTest.java;h=c448169fe6b9efef4497549e1c9b50bb330c456c;hb=5f4e1e4c330b045e9c8bce28ee132a0fca3834d8;hp=64215bbb401d91dc62cb87212c5e2539b11dfc5b;hpb=292693e3249053709335de76d20eddd857f377fe;p=jalview.git diff --git a/test/jalview/gui/PopupMenuTest.java b/test/jalview/gui/PopupMenuTest.java index 64215bb..c448169 100644 --- a/test/jalview/gui/PopupMenuTest.java +++ b/test/jalview/gui/PopupMenuTest.java @@ -1,31 +1,66 @@ +/* + * 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.gui; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static jalview.util.UrlConstants.DB_ACCESSION; +import static jalview.util.UrlConstants.SEQUENCE_ID; +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertTrue; + import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; -import jalview.datamodel.SequenceGroup; +import jalview.datamodel.Annotation; +import jalview.datamodel.DBRefEntry; +import jalview.datamodel.DBRefSource; +import jalview.datamodel.Sequence; import jalview.datamodel.SequenceI; import jalview.io.AppletFormatAdapter; +import jalview.io.FormatAdapter; +import jalview.util.MessageManager; +import java.awt.Component; import java.io.IOException; -import java.util.BitSet; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; -import java.util.Map; -import org.junit.Before; -import org.junit.Test; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.JSeparator; + +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; -/** - * Unit tests for PopupMenu - * - * @author gmcarstairs - * - */ public class PopupMenuTest { + + @BeforeClass(alwaysRun = true) + public void setUpJvOptionPane() + { + JvOptionPane.setInteractiveMode(false); + JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION); + } + // 4 sequences x 13 positions final static String TEST_DATA = ">FER_CAPAA Ferredoxin\n" + "TIETHKEAELVG-\n" @@ -35,285 +70,489 @@ public class PopupMenuTest + "TIETHKEEELTA-\n" + ">Q93XJ9_SOLTU Ferredoxin I precursor\n" + "TIETHKEEELTA-\n"; - private static final int SEQ_ANN_COUNT = 10; - - private static final int AUTO_ANNS = 3; - AlignmentI alignment; AlignmentPanel parentPanel; - @Before + PopupMenu testee = null; + + @BeforeMethod(alwaysRun = true) public void setUp() throws IOException { - AlignmentI al = new jalview.io.FormatAdapter().readFile(TEST_DATA, + alignment = new FormatAdapter().readFile(TEST_DATA, AppletFormatAdapter.PASTE, "FASTA"); - AlignFrame af = new AlignFrame(al, 700, 500); + AlignFrame af = new AlignFrame(alignment, 700, 500); parentPanel = new AlignmentPanel(af, af.getViewport()); - alignment = parentPanel.getAlignment(); - - AlignmentAnnotation[] anns = new AlignmentAnnotation[SEQ_ANN_COUNT]; - for (int i = 0; i < anns.length; i++) + testee = new PopupMenu(parentPanel, null, null); + int i = 0; + for (SequenceI seq : alignment.getSequences()) { - anns[i] = new AlignmentAnnotation("Label" + i, null, 0d); - anns[i].setCalcId("CalcId" + i); - anns[i].visible = true; - alignment.addAnnotation(anns[i]); + final AlignmentAnnotation annotation = new AlignmentAnnotation( + "label" + i, "desc" + i, i); + annotation.setCalcId("calcId" + i); + seq.addAlignmentAnnotation(annotation); + annotation.setSequenceRef(seq); } } + @Test(groups = { "Functional" }) + public void testConfigureReferenceAnnotationsMenu_noSequenceSelected() + { + JMenuItem menu = new JMenuItem(); + List seqs = new ArrayList(); + testee.configureReferenceAnnotationsMenu(menu, seqs); + assertFalse(menu.isEnabled()); + // now try null list + menu.setEnabled(true); + testee.configureReferenceAnnotationsMenu(menu, null); + assertFalse(menu.isEnabled()); + } + /** - * Test method that determines visible graph groups. + * Test building the 'add reference annotations' menu for the case where there + * are no reference annotations to add to the alignment. The menu item should + * be disabled. */ - @Test - public void testGetVisibleGraphGroups() + @Test(groups = { "Functional" }) + public void testConfigureReferenceAnnotationsMenu_noReferenceAnnotations() { - AlignmentAnnotation[] anns = alignment.getAlignmentAnnotation(); - /* - * a bar graph group is not included - */ - anns[0].graph = AlignmentAnnotation.BAR_GRAPH; - anns[0].graphGroup = 1; - anns[0].visible = true; + JMenuItem menu = new JMenuItem(); /* - * a line graph group is included as long as one of its members is visible + * Initial state is that sequences have annotations, and have dataset + * sequences, but the dataset sequences have no annotations. Hence nothing + * to add. */ - anns[1].graph = AlignmentAnnotation.LINE_GRAPH; - anns[1].graphGroup = 5; - anns[1].visible = false; - anns[2].graph = AlignmentAnnotation.LINE_GRAPH; - anns[2].graphGroup = 5; - anns[2].visible = true; + List seqs = parentPanel.getAlignment().getSequences(); - /* - * a line graph group with no visible rows is not included - */ - anns[3].graph = AlignmentAnnotation.LINE_GRAPH; - anns[3].graphGroup = 3; - anns[3].visible = false; - - // a visible line graph with no graph group is not included - anns[4].graph = AlignmentAnnotation.LINE_GRAPH; - anns[4].graphGroup = -1; - anns[4].visible = true; - - BitSet result = PopupMenu.getVisibleLineGraphGroups(anns); - assertTrue(result.get(5)); - assertFalse(result.get(0)); - assertFalse(result.get(1)); - assertFalse(result.get(2)); - assertFalse(result.get(3)); + testee.configureReferenceAnnotationsMenu(menu, seqs); + assertFalse(menu.isEnabled()); } /** - * Test a mixture of show/hidden annotations in/outside selection group. + * Test building the 'add reference annotations' menu for the case where all + * reference annotations are already on the alignment. The menu item should be + * disabled. */ - @Test - public void testGetAnnotationTypesForShowHide_forSelectionGroup() + @Test(groups = { "Functional" }) + public void testConfigureReferenceAnnotationsMenu_alreadyAdded() { - Map>> shownTypes = new HashMap>>(); - Map>> hiddenTypes = new HashMap>>(); - AlignmentAnnotation[] anns = alignment.getAlignmentAnnotation(); - BitSet visibleGraphGroups = new BitSet(); - selectSequences(0, 3); - SequenceI[] seqs = parentPanel.getAlignment().getSequencesArray(); + JMenuItem menu = new JMenuItem(); + List seqs = parentPanel.getAlignment().getSequences(); - /* - * Configure annotation properties for test (offsetting for auto-calculated - * rows). - */ - // not in selection group (should be ignored): - // hidden annotation Label4 not in selection group - anns[AUTO_ANNS + 4].sequenceRef = seqs[2]; - anns[AUTO_ANNS + 4].visible = false; - anns[AUTO_ANNS + 7].sequenceRef = seqs[1]; - anns[AUTO_ANNS + 7].visible = true; + // make up new annotations and add to dataset sequences, sequences and + // alignment + attachReferenceAnnotations(seqs, true, true); - /* - * in selection group, hidden: - */ - anns[AUTO_ANNS + 2].sequenceRef = seqs[3]; // CalcId2/Label2 - anns[AUTO_ANNS + 2].visible = false; - anns[AUTO_ANNS + 3].sequenceRef = seqs[3]; // CalcId3/Label2 - anns[AUTO_ANNS + 3].visible = false; - anns[AUTO_ANNS + 3].label = "Label2"; - anns[AUTO_ANNS + 4].sequenceRef = seqs[3]; // CalcId2/Label3 - anns[AUTO_ANNS + 4].visible = false; - anns[AUTO_ANNS + 4].label = "Label3"; - anns[AUTO_ANNS + 4].setCalcId("CalcId2"); - anns[AUTO_ANNS + 8].sequenceRef = seqs[0]; // CalcId9/Label9 - anns[AUTO_ANNS + 8].visible = false; - anns[AUTO_ANNS + 8].label = "Label9"; - anns[AUTO_ANNS + 8].setCalcId("CalcId9"); - /* - * in selection group, visible - */ - anns[AUTO_ANNS + 6].sequenceRef = seqs[0]; // CalcId6/Label6 - anns[AUTO_ANNS + 6].visible = true; - anns[AUTO_ANNS + 9].sequenceRef = seqs[3]; // CalcId9/Label9 - anns[AUTO_ANNS + 9].visible = true; - - PopupMenu.getAnnotationTypesForShowHide(shownTypes, hiddenTypes, - visibleGraphGroups, anns, parentPanel.av.getSelectionGroup()); - - // check results; note CalcId9/Label9 is both hidden and shown (for - // different sequences) so should be in both - // shown: CalcId6/Label6 and CalcId9/Label9 - assertEquals(2, shownTypes.size()); - assertEquals(1, shownTypes.get("CalcId6").size()); - assertEquals(1, shownTypes.get("CalcId6").get(0).size()); - assertEquals("Label6", shownTypes.get("CalcId6").get(0).get(0)); - assertEquals(1, shownTypes.get("CalcId9").size()); - assertEquals(1, shownTypes.get("CalcId9").get(0).size()); - assertEquals("Label9", shownTypes.get("CalcId9").get(0).get(0)); - - // hidden: CalcId2/Label2, CalcId2/Label3, CalcId3/Label2, CalcId9/Label9 - assertEquals(3, hiddenTypes.size()); - assertEquals(2, hiddenTypes.get("CalcId2").size()); - assertEquals(1, hiddenTypes.get("CalcId2").get(0).size()); - assertEquals("Label2", hiddenTypes.get("CalcId2").get(0).get(0)); - assertEquals(1, hiddenTypes.get("CalcId2").get(1).size()); - assertEquals("Label3", hiddenTypes.get("CalcId2").get(1).get(0)); - assertEquals(1, hiddenTypes.get("CalcId3").size()); - assertEquals(1, hiddenTypes.get("CalcId3").get(0).size()); - assertEquals("Label2", hiddenTypes.get("CalcId3").get(0).get(0)); - assertEquals(1, hiddenTypes.get("CalcId9").size()); - assertEquals(1, hiddenTypes.get("CalcId9").get(0).size()); - assertEquals("Label9", hiddenTypes.get("CalcId9").get(0).get(0)); - - consoleDebug(shownTypes, hiddenTypes); + testee.configureReferenceAnnotationsMenu(menu, seqs); + assertFalse(menu.isEnabled()); + } + + /** + * Test building the 'add reference annotations' menu for the case where + * several reference annotations are on the dataset but not on the sequences. + * 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() + { + JMenuItem menu = new JMenuItem(); + List 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()); } /** - * This output is not part of the test but may help make sense of it... + * Generate annotations and add to dataset sequences and (optionally) + * sequences and/or alignment * - * @param shownTypes - * @param hiddenTypes + * @param seqs + * @param addToSequence + * @param addToAlignment */ - protected void consoleDebug(Map>> shownTypes, - Map>> hiddenTypes) + private void attachReferenceAnnotations(List seqs, + boolean addToSequence, boolean addToAlignment) { - for (String calcId : shownTypes.keySet()) + // PDB.secondary structure on Sequence0 + AlignmentAnnotation annotation = new AlignmentAnnotation( + "secondary structure", "", 0); + annotation.setCalcId("PDB"); + seqs.get(0).getDatasetSequence().addAlignmentAnnotation(annotation); + if (addToSequence) { - System.out.println("Visible annotation types for calcId=" + calcId); - for (List type : shownTypes.get(calcId)) - { - System.out.println(" " + type); - } + seqs.get(0).addAlignmentAnnotation(annotation); } - for (String calcId : hiddenTypes.keySet()) + if (addToAlignment) { - System.out.println("Hidden annotation types for calcId=" + calcId); - for (List type : hiddenTypes.get(calcId)) - { - System.out.println(" " + type); - } + 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 case where there are 'grouped' annotations, visible and hidden, within - * and without the selection group. + * Test for building menu options including 'show' and 'hide' annotation + * types. */ - @Test - public void testGetAnnotationTypesForShowHide_withGraphGroups() + @Test(groups = { "Functional" }) + public void testBuildAnnotationTypesMenus() { - final int GROUP_4 = 4; - final int GROUP_5 = 5; - final int GROUP_6 = 6; - - Map>> shownTypes = new HashMap>>(); - Map>> hiddenTypes = new HashMap>>(); - AlignmentAnnotation[] anns = alignment.getAlignmentAnnotation(); - BitSet visibleGraphGroups = new BitSet(); - visibleGraphGroups.set(GROUP_4); - visibleGraphGroups.set(GROUP_6); - selectSequences(0, 3); - SequenceI[] seqs = parentPanel.getAlignment().getSequencesArray(); + 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); /* - * Configure annotation properties for test (offsetting for auto-calculated - * rows). + * Expect menu options to show "secondary structure" and "SSP", and to hide + * "secondary structure" and "Temp". Tooltip should be calcId. */ - // annotations for selection group and graph group - // hidden annotations Label2, Label3, in (hidden) group 5 - anns[AUTO_ANNS + 2].sequenceRef = seqs[3]; - anns[AUTO_ANNS + 2].visible = false; - anns[AUTO_ANNS + 2].graph = AlignmentAnnotation.LINE_GRAPH; - anns[AUTO_ANNS + 2].graphGroup = GROUP_5; // not a visible group - anns[AUTO_ANNS + 3].sequenceRef = seqs[0]; - anns[AUTO_ANNS + 3].visible = false; - anns[AUTO_ANNS + 3].graph = AlignmentAnnotation.LINE_GRAPH; - anns[AUTO_ANNS + 3].graphGroup = GROUP_5; - // need to ensure annotations have the same calcId as well - anns[AUTO_ANNS + 3].setCalcId("CalcId2"); - - // annotations Label1 (hidden), Label5 (visible) in group 6 (visible) - anns[AUTO_ANNS + 1].sequenceRef = seqs[3]; - // being in a visible group should take precedence over this visibility - anns[AUTO_ANNS + 1].visible = false; - anns[AUTO_ANNS + 1].graph = AlignmentAnnotation.LINE_GRAPH; - anns[AUTO_ANNS + 1].graphGroup = GROUP_6; - anns[AUTO_ANNS + 5].sequenceRef = seqs[0]; - anns[AUTO_ANNS + 5].visible = true; // visibleGraphGroups overrides this - anns[AUTO_ANNS + 5].graph = AlignmentAnnotation.LINE_GRAPH; - anns[AUTO_ANNS + 5].graphGroup = GROUP_6; - anns[AUTO_ANNS + 5].setCalcId("CalcId1"); - - // annotations outwith selection group - should be ignored - // hidden grouped annotations - anns[AUTO_ANNS + 6].sequenceRef = seqs[2]; - anns[AUTO_ANNS + 6].visible = false; - anns[AUTO_ANNS + 6].graph = AlignmentAnnotation.LINE_GRAPH; - anns[AUTO_ANNS + 6].graphGroup = GROUP_4; - anns[AUTO_ANNS + 8].sequenceRef = seqs[1]; - anns[AUTO_ANNS + 8].visible = false; - anns[AUTO_ANNS + 8].graph = AlignmentAnnotation.LINE_GRAPH; - anns[AUTO_ANNS + 8].graphGroup = GROUP_4; - // visible grouped annotations Label7, Label9 - anns[AUTO_ANNS + 7].sequenceRef = seqs[2]; - anns[AUTO_ANNS + 7].visible = true; - anns[AUTO_ANNS + 7].graph = AlignmentAnnotation.LINE_GRAPH; - anns[AUTO_ANNS + 7].graphGroup = GROUP_4; - anns[AUTO_ANNS + 9].sequenceRef = seqs[1]; - anns[AUTO_ANNS + 9].visible = true; - anns[AUTO_ANNS + 9].graph = AlignmentAnnotation.LINE_GRAPH; - anns[AUTO_ANNS + 9].graphGroup = GROUP_4; - - PopupMenu.getAnnotationTypesForShowHide(shownTypes, hiddenTypes, - visibleGraphGroups, anns, parentPanel.av.getSelectionGroup()); - - consoleDebug(shownTypes, hiddenTypes); - - // CalcId1 / Label1, Label5 (only) should be 'shown', as a compound type - assertEquals(1, shownTypes.get("CalcId1").size()); - assertEquals(2, shownTypes.get("CalcId1").get(0).size()); - assertEquals("Label1", shownTypes.get("CalcId1").get(0).get(0)); - assertEquals("Label5", shownTypes.get("CalcId1").get(0).get(1)); - - // CalcId2 / Label2, Label3 (only) should be 'hidden' - assertEquals(1, hiddenTypes.get("CalcId2").size()); - assertEquals(2, hiddenTypes.get("CalcId2").get(0).size()); - assertEquals("Label2", hiddenTypes.get("CalcId2").get(0).get(0)); - assertEquals("Label3", hiddenTypes.get("CalcId2").get(0).get(1)); + 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); + 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()); } /** - * Add a sequence group to the alignment with the specified sequences (base 0) - * in it - * - * @param i - * @param more + * Test for building menu options with only 'hide' annotation types enabled. */ - private void selectSequences(int... selected) + @Test(groups = { "Functional" }) + public void testBuildAnnotationTypesMenus_showDisabled() { - SequenceI[] seqs = parentPanel.getAlignment().getSequencesArray(); - SequenceGroup sg = new SequenceGroup(); - for (int i : selected) + 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); + 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); + 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 + seqs.get(0).addDBRef(refs.get(0)); + + seqs.get(0).addDBRef(refs.get(1)); + seqs.get(0).addDBRef(refs.get(2)); + seqs.get(0).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 + testee = new PopupMenu(parentPanel, (Sequence) seqs.get(0), links); + 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++) { - sg.addSequence(seqs[i], false); + assertEquals(refs.get(i - 1).getSource(), ((JMenuItem) linkItems[i]) + .getText().split("\\|")[0]); + assertEquals(refs.get(i - 1).getAccessionId(), + ((JMenuItem) linkItems[i]) + .getText().split("\\|")[1]); } - parentPanel.av.setSelectionGroup(sg); + + // get the Popup Menu for second sequence + testee = new PopupMenu(parentPanel, (Sequence) seqs.get(1), links); + 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++) + { + assertEquals(refs.get(i + 3).getSource(), ((JMenuItem) linkItems[i]) + .getText().split("\\|")[0].toUpperCase()); + assertEquals(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, (Sequence) seqs.get(0), + nomatchlinks); + seqItems = testee.sequenceMenu.getMenuComponents(); + linkMenu = (JMenu) seqItems[6]; + assertFalse(linkMenu.isEnabled()); + } }