X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=test%2Fjalview%2Fgui%2FPopupMenuTest.java;h=7636bdafb636ef7d1d10db714add807160eb263c;hb=57738a1f3c19b1c3a00bd3ac5108f8cd0af32f99;hp=f984dfcc727e9fd546ebcb6b2c0d52d6c5980c48;hpb=fddf3084802b37e5cee17829e32692a4aac3e60d;p=jalview.git diff --git a/test/jalview/gui/PopupMenuTest.java b/test/jalview/gui/PopupMenuTest.java index f984dfc..7636bda 100644 --- a/test/jalview/gui/PopupMenuTest.java +++ b/test/jalview/gui/PopupMenuTest.java @@ -1,19 +1,39 @@ +/* + * 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 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.assertNotNull; +import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertTrue; -import jalview.datamodel.AlignmentAnnotation; -import jalview.datamodel.AlignmentI; -import jalview.datamodel.Annotation; -import jalview.datamodel.SequenceI; -import jalview.io.AppletFormatAdapter; -import jalview.io.FormatAdapter; - import java.awt.Component; +import java.awt.Container; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; import java.util.List; import javax.swing.JMenu; @@ -21,11 +41,41 @@ 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; +import jalview.bin.Cache; +import jalview.bin.Console; +import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.Annotation; +import jalview.datamodel.ColumnSelection; +import jalview.datamodel.DBRefEntry; +import jalview.datamodel.DBRefSource; +import jalview.datamodel.HiddenColumns; +import jalview.datamodel.Sequence; +import jalview.datamodel.SequenceFeature; +import jalview.datamodel.SequenceGroup; +import jalview.datamodel.SequenceI; +import jalview.io.DataSourceType; +import jalview.io.FileFormat; +import jalview.io.FormatAdapter; +import jalview.urls.api.UrlProviderFactoryI; +import jalview.urls.desktop.DesktopUrlProviderFactory; +import jalview.util.MessageManager; +import jalview.util.UrlConstants; + 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" @@ -41,30 +91,48 @@ public class PopupMenuTest PopupMenu testee = null; - @BeforeMethod + @BeforeMethod(alwaysRun = true) public void setUp() throws IOException { + Cache.loadProperties("test/jalview/io/testProps.jvprops"); + Console.initLogger(); + + String inMenuString = ("EMBL-EBI Search | http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$" + + SEQUENCE_ID + "$" + "|" + + "UNIPROT | http://www.uniprot.org/uniprot/$" + DB_ACCESSION + + "$") + "|" + + ("INTERPRO | http://www.ebi.ac.uk/interpro/entry/$" + + DB_ACCESSION + "$") + + "|" + + // Gene3D entry tests for case (in)sensitivity + ("Gene3D | http://gene3d.biochem.ucl.ac.uk/Gene3D/search?sterm=$" + + DB_ACCESSION + "$&mode=protein"); + + UrlProviderFactoryI factory = new DesktopUrlProviderFactory( + UrlConstants.DEFAULT_LABEL, inMenuString, ""); + Preferences.sequenceUrlLinks = factory.createUrlProvider(); + alignment = new FormatAdapter().readFile(TEST_DATA, - AppletFormatAdapter.PASTE, "FASTA"); + DataSourceType.PASTE, FileFormat.Fasta); AlignFrame af = new AlignFrame(alignment, 700, 500); parentPanel = new AlignmentPanel(af, af.getViewport()); - testee = new PopupMenu(parentPanel, null, null); + testee = new PopupMenu(parentPanel, alignment.getSequenceAt(0), null); int i = 0; for (SequenceI seq : alignment.getSequences()) { - final AlignmentAnnotation annotation = new AlignmentAnnotation("label" + i, - "desc" + i, i); + final AlignmentAnnotation annotation = new AlignmentAnnotation( + "label" + i, "desc" + i, i); annotation.setCalcId("calcId" + i); seq.addAlignmentAnnotation(annotation); annotation.setSequenceRef(seq); } } - @Test(groups ={ "Functional" }) + @Test(groups = { "Functional" }) public void testConfigureReferenceAnnotationsMenu_noSequenceSelected() { JMenuItem menu = new JMenuItem(); - List seqs = new ArrayList(); + List seqs = new ArrayList<>(); testee.configureReferenceAnnotationsMenu(menu, seqs); assertFalse(menu.isEnabled()); // now try null list @@ -78,7 +146,7 @@ public class PopupMenuTest * are no reference annotations to add to the alignment. The menu item should * be disabled. */ - @Test(groups ={ "Functional" }) + @Test(groups = { "Functional" }) public void testConfigureReferenceAnnotationsMenu_noReferenceAnnotations() { JMenuItem menu = new JMenuItem(); @@ -99,7 +167,7 @@ public class PopupMenuTest * reference annotations are already on the alignment. The menu item should be * disabled. */ - @Test(groups ={ "Functional" }) + @Test(groups = { "Functional" }) public void testConfigureReferenceAnnotationsMenu_alreadyAdded() { JMenuItem menu = new JMenuItem(); @@ -119,7 +187,7 @@ public class PopupMenuTest * The menu item should be enabled, and acquire a tooltip which lists the * annotation sources (calcIds) and type (labels). */ - @Test(groups ={ "Functional" }) + @Test(groups = { "Functional" }) public void testConfigureReferenceAnnotationsMenu() { JMenuItem menu = new JMenuItem(); @@ -130,7 +198,10 @@ public class PopupMenuTest testee.configureReferenceAnnotationsMenu(menu, seqs); assertTrue(menu.isEnabled()); - String expected = "
Add annotations for
JMOL/secondary structure
PBD/Temp
"; + String s = MessageManager.getString("label.add_annotations_for"); + String expected = "" + + "
" + s + + "
Jmol/secondary structure
PDB/Temp
"; assertEquals(expected, menu.getToolTipText()); } @@ -140,7 +211,7 @@ public class PopupMenuTest * 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" }) + @Test(groups = { "Functional" }) public void testConfigureReferenceAnnotationsMenu_notOnAlignment() { JMenuItem menu = new JMenuItem(); @@ -151,7 +222,10 @@ public class PopupMenuTest testee.configureReferenceAnnotationsMenu(menu, seqs); assertTrue(menu.isEnabled()); - String expected = "
Add annotations for
JMOL/secondary structure
PBD/Temp
"; + String s = MessageManager.getString("label.add_annotations_for"); + String expected = "" + + "
" + s + + "
Jmol/secondary structure
PDB/Temp
"; assertEquals(expected, menu.getToolTipText()); } @@ -169,7 +243,7 @@ public class PopupMenuTest // PDB.secondary structure on Sequence0 AlignmentAnnotation annotation = new AlignmentAnnotation( "secondary structure", "", 0); - annotation.setCalcId("PBD"); + annotation.setCalcId("PDB"); seqs.get(0).getDatasetSequence().addAlignmentAnnotation(annotation); if (addToSequence) { @@ -182,7 +256,7 @@ public class PopupMenuTest // PDB.Temp on Sequence1 annotation = new AlignmentAnnotation("Temp", "", 0); - annotation.setCalcId("PBD"); + annotation.setCalcId("PDB"); seqs.get(1).getDatasetSequence().addAlignmentAnnotation(annotation); if (addToSequence) { @@ -195,7 +269,7 @@ public class PopupMenuTest // JMOL.secondary structure on Sequence0 annotation = new AlignmentAnnotation("secondary structure", "", 0); - annotation.setCalcId("JMOL"); + annotation.setCalcId("Jmol"); seqs.get(0).getDatasetSequence().addAlignmentAnnotation(annotation); if (addToSequence) { @@ -219,7 +293,7 @@ public class PopupMenuTest * The menu item should be enabled, and acquire a tooltip which lists the * annotation sources (calcIds) and type (labels). */ - @Test(groups ={ "Functional" }) + @Test(groups = { "Functional" }) public void testConfigureReferenceAnnotationsMenu_twoViews() { } @@ -228,7 +302,7 @@ public class PopupMenuTest * Test for building menu options including 'show' and 'hide' annotation * types. */ - @Test(groups ={ "Functional" }) + @Test(groups = { "Functional" }) public void testBuildAnnotationTypesMenus() { JMenu showMenu = new JMenu(); @@ -239,32 +313,29 @@ public class PopupMenuTest // PDB.secondary structure on Sequence0 AlignmentAnnotation annotation = new AlignmentAnnotation( - "secondary structure", "", new Annotation[] - {}); + "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 = 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 = 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 = new AlignmentAnnotation("Temp", "", new Annotation[] {}); annotation.setCalcId("PDB"); annotation.visible = true; seqs.get(1).addAlignmentAnnotation(annotation); @@ -284,8 +355,8 @@ public class PopupMenuTest assertEquals(4, showOptions.length); // includes 'All' and separator assertEquals(4, hideOptions.length); - assertEquals("All", - ((JMenuItem) showOptions[0]).getText()); + 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()); @@ -295,8 +366,7 @@ public class PopupMenuTest assertEquals("SSP", ((JMenuItem) showOptions[3]).getText()); assertEquals("JPred", ((JMenuItem) showOptions[3]).getToolTipText()); - assertEquals("All", - ((JMenuItem) hideOptions[0]).getText()); + assertEquals(all, ((JMenuItem) hideOptions[0]).getText()); assertTrue(hideOptions[1] instanceof JPopupMenu.Separator); assertEquals(JSeparator.HORIZONTAL, ((JSeparator) hideOptions[1]).getOrientation()); @@ -310,7 +380,7 @@ public class PopupMenuTest /** * Test for building menu options with only 'hide' annotation types enabled. */ - @Test(groups ={ "Functional" }) + @Test(groups = { "Functional" }) public void testBuildAnnotationTypesMenus_showDisabled() { JMenu showMenu = new JMenu(); @@ -321,16 +391,14 @@ public class PopupMenuTest // PDB.secondary structure on Sequence0 AlignmentAnnotation annotation = new AlignmentAnnotation( - "secondary structure", "", new Annotation[] - {}); + "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 = new AlignmentAnnotation("Temp", "", new Annotation[] {}); annotation.setCalcId("PDB"); annotation.visible = true; seqs.get(1).addAlignmentAnnotation(annotation); @@ -350,12 +418,13 @@ public class PopupMenuTest assertEquals(2, showOptions.length); // includes 'All' and separator assertEquals(4, hideOptions.length); - assertEquals("All", ((JMenuItem) showOptions[0]).getText()); + 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()); + assertEquals(all, ((JMenuItem) hideOptions[0]).getText()); assertTrue(hideOptions[1] instanceof JPopupMenu.Separator); assertEquals(JSeparator.HORIZONTAL, ((JSeparator) hideOptions[1]).getOrientation()); @@ -369,7 +438,7 @@ public class PopupMenuTest /** * Test for building menu options with only 'show' annotation types enabled. */ - @Test(groups ={ "Functional" }) + @Test(groups = { "Functional" }) public void testBuildAnnotationTypesMenus_hideDisabled() { JMenu showMenu = new JMenu(); @@ -380,16 +449,14 @@ public class PopupMenuTest // PDB.secondary structure on Sequence0 AlignmentAnnotation annotation = new AlignmentAnnotation( - "secondary structure", "", new Annotation[] - {}); + "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 = new AlignmentAnnotation("Temp", "", new Annotation[] {}); annotation.setCalcId("PDB2"); annotation.visible = false; seqs.get(1).addAlignmentAnnotation(annotation); @@ -409,7 +476,8 @@ public class PopupMenuTest assertEquals(4, showOptions.length); // includes 'All' and separator assertEquals(2, hideOptions.length); - assertEquals("All", ((JMenuItem) showOptions[0]).getText()); + 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()); @@ -419,9 +487,280 @@ public class PopupMenuTest assertEquals("Temp", ((JMenuItem) showOptions[3]).getText()); assertEquals("PDB2", ((JMenuItem) showOptions[3]).getToolTipText()); - assertEquals("All", ((JMenuItem) hideOptions[0]).getText()); + 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 + } }