package jalview.gui; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.awt.Component; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JSeparator; import org.junit.Before; import org.junit.Test; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceI; import jalview.io.AppletFormatAdapter; import jalview.io.FormatAdapter; public class PopupMenuTest { // 4 sequences x 13 positions final static String TEST_DATA = ">FER_CAPAA Ferredoxin\n" + "TIETHKEAELVG-\n" + ">FER_CAPAN Ferredoxin, chloroplast precursor\n" + "TIETHKEAELVG-\n" + ">FER1_SOLLC Ferredoxin-1, chloroplast precursor\n" + "TIETHKEEELTA-\n" + ">Q93XJ9_SOLTU Ferredoxin I precursor\n" + "TIETHKEEELTA-\n"; AlignmentI alignment; AlignmentPanel parentPanel; PopupMenu testee = null; @Before public void setUp() throws IOException { alignment = new FormatAdapter().readFile(TEST_DATA, AppletFormatAdapter.PASTE, "FASTA"); AlignFrame af = new AlignFrame(alignment, 700, 500); parentPanel = new AlignmentPanel(af, af.getViewport()); testee = new PopupMenu(parentPanel, null, null); int i = 0; for (SequenceI seq : alignment.getSequences()) { final AlignmentAnnotation annotation = new AlignmentAnnotation("label" + i, "desc" + i, i); annotation.setCalcId("calcId" + i); seq.addAlignmentAnnotation(annotation); annotation.setSequenceRef(seq); } } @Test 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 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 testConfigureReferenceAnnotationsMenu_noReferenceAnnotations() { JMenuItem menu = new JMenuItem(); /* * Initial state is that sequences have annotations, and have dataset * sequences, but the dataset sequences have no annotations. Hence nothing * to add. */ List seqs = parentPanel.getAlignment().getSequences(); testee.configureReferenceAnnotationsMenu(menu, seqs); assertFalse(menu.isEnabled()); } /** * 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 testConfigureReferenceAnnotationsMenu_alreadyAdded() { JMenuItem menu = new JMenuItem(); List seqs = parentPanel.getAlignment().getSequences(); // make up new annotations and add to dataset sequences, sequences and // alignment attachReferenceAnnotations(seqs, true, true); 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 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 expected = "
Add annotations for
JMOL/secondary structure
PBD/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 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 expected = "
Add annotations for
JMOL/secondary structure
PBD/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("PBD"); 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("PBD"); 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 public void testConfigureReferenceAnnotationsMenu_twoViews() { } /** * Test for building menu options including 'show' and 'hide' annotation * types. */ @Test 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", "", 0); 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", "", 0); annotation.setCalcId("JMOL"); annotation.visible = false; seqs.get(0).addAlignmentAnnotation(annotation); parentPanel.getAlignment().addAnnotation(annotation); // Jpred.SSP on Sequence0 - hidden annotation = new AlignmentAnnotation("SSP", "", 0); annotation.setCalcId("JPred"); annotation.visible = false; seqs.get(0).addAlignmentAnnotation(annotation); parentPanel.getAlignment().addAnnotation(annotation); // PDB.Temp on Sequence1 annotation = new AlignmentAnnotation("Temp", "", 0); 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); 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 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", "", 0); annotation.setCalcId("PDB"); annotation.visible = true; seqs.get(0).addAlignmentAnnotation(annotation); parentPanel.getAlignment().addAnnotation(annotation); // PDB.Temp on Sequence1 annotation = new AlignmentAnnotation("Temp", "", 0); 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 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", "", 0); annotation.setCalcId("PDB"); annotation.visible = false; seqs.get(0).addAlignmentAnnotation(annotation); parentPanel.getAlignment().addAnnotation(annotation); // PDB.Temp on Sequence1 annotation = new AlignmentAnnotation("Temp", "", 0); 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()); } }