JAL-3858 improved contactInterval computation and added detailed test coverage for...
[jalview.git] / test / jalview / gui / PopupMenuTest.java
index acef0a1..7636bda 100644 (file)
@@ -24,9 +24,29 @@ 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 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;
+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;
@@ -46,22 +66,6 @@ import jalview.urls.desktop.DesktopUrlProviderFactory;
 import jalview.util.MessageManager;
 import jalview.util.UrlConstants;
 
-import java.awt.Component;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-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;
-
 public class PopupMenuTest
 {
 
@@ -91,18 +95,15 @@ public class PopupMenuTest
   public void setUp() throws IOException
   {
     Cache.loadProperties("test/jalview/io/testProps.jvprops");
-    Cache.initLogger();
+    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 + "$")
-            + "|"
+            + 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");
@@ -198,8 +199,9 @@ public class PopupMenuTest
     testee.configureReferenceAnnotationsMenu(menu, seqs);
     assertTrue(menu.isEnabled());
     String s = MessageManager.getString("label.add_annotations_for");
-    String expected = "<html><style> p.ttip {width: 350; text-align: left; word-wrap: break-word;}</style><p class=\"ttip\">"
-            + s + "<br/>Jmol/secondary structure<br/>PDB/Temp</p></html>";
+    String expected = "<html><style> div.ttip {width:350px;white-space:pre-wrap;padding:2px;overflow-wrap:break-word;}</style>"
+            + "<div class=\"ttip\">" + s
+            + "<br/>Jmol/secondary structure<br/>PDB/Temp </div></html>";
     assertEquals(expected, menu.getToolTipText());
   }
 
@@ -221,8 +223,9 @@ public class PopupMenuTest
     testee.configureReferenceAnnotationsMenu(menu, seqs);
     assertTrue(menu.isEnabled());
     String s = MessageManager.getString("label.add_annotations_for");
-    String expected = "<html><style> p.ttip {width: 350; text-align: left; word-wrap: break-word;}</style><p class=\"ttip\">"
-            + s + "<br/>Jmol/secondary structure<br/>PDB/Temp</p></html>";
+    String expected = "<html><style> div.ttip {width:350px;white-space:pre-wrap;padding:2px;overflow-wrap:break-word;}</style>"
+            + "<div class=\"ttip\">" + s
+            + "<br/>Jmol/secondary structure<br/>PDB/Temp </div></html>";
     assertEquals(expected, menu.getToolTipText());
   }
 
@@ -509,14 +512,14 @@ public class PopupMenuTest
     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)
@@ -586,7 +589,7 @@ public class PopupMenuTest
   {
     // get sequences from the alignment
     List<SequenceI> 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",
@@ -613,7 +616,7 @@ public class PopupMenuTest
     // 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<int[]> it = hidden.iterator();
     assertFalse(it.hasNext());
@@ -690,4 +693,74 @@ public class PopupMenuTest
     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<SequenceFeature> 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("<html>helix 2-6 curly</html>", item.getText());
+    item = menu.getItem(1);
+    assertEquals("<html>chain 1 straight (uniprot)</html>", 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(
+            "<html>helix 2-6 this is a quite extraordinarily long des...</html>",
+            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
+  }
 }