--- /dev/null
+package jalview.datamodel;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class SequenceTest
+{
+ Sequence seq;
+
+ @Before
+ public void setUp()
+ {
+ seq = new Sequence("FER1", "AKPNGVL");
+ }
+ @Test
+ public void testGetAnnotation()
+ {
+ // initial state returns null not an empty array
+ assertNull(seq.getAnnotation());
+ AlignmentAnnotation ann = addAnnotation("label1", "desc1", "calcId1",
+ 1f);
+ AlignmentAnnotation[] anns = seq.getAnnotation();
+ assertEquals(1, anns.length);
+ assertSame(ann, anns[0]);
+
+ // removing all annotations reverts array to null
+ seq.removeAlignmentAnnotation(ann);
+ assertNull(seq.getAnnotation());
+ }
+
+ @Test
+ public void testGetAnnotation_forLabel()
+ {
+ AlignmentAnnotation ann1 = addAnnotation("label1", "desc1", "calcId1", 1f);
+ AlignmentAnnotation ann2 = addAnnotation("label2", "desc2", "calcId2", 1f);
+ AlignmentAnnotation ann3 = addAnnotation("label1", "desc3", "calcId3", 1f);
+ AlignmentAnnotation[] anns = seq.getAnnotation("label1");
+ assertEquals(2, anns.length);
+ assertSame(ann1, anns[0]);
+ assertSame(ann3, anns[1]);
+ }
+
+ private AlignmentAnnotation addAnnotation(String label,
+ String description, String calcId,
+ float value)
+ {
+ final AlignmentAnnotation annotation = new AlignmentAnnotation(label, description,
+ value);
+ annotation.setCalcId(calcId);
+ seq.addAlignmentAnnotation(annotation);
+ return annotation;
+ }
+
+ @Test
+ public void testGetAlignmentAnnotations_forCalcIdAndLabel()
+ {
+ AlignmentAnnotation ann1 = addAnnotation("label1", "desc1", "calcId1",
+ 1f);
+ AlignmentAnnotation ann2 = addAnnotation("label2", "desc2", "calcId2",
+ 1f);
+ AlignmentAnnotation ann3 = addAnnotation("label2", "desc3", "calcId3",
+ 1f);
+ AlignmentAnnotation ann4 = addAnnotation("label2", "desc3", "calcId2",
+ 1f);
+ AlignmentAnnotation ann5 = addAnnotation("label5", "desc3", null,
+ 1f);
+ AlignmentAnnotation ann6 = addAnnotation(null, "desc3", "calcId3",
+ 1f);
+ List<AlignmentAnnotation> anns = seq.getAlignmentAnnotations("calcId2",
+ "label2");
+ assertEquals(2, anns.size());
+ assertSame(ann2, anns.get(0));
+ assertSame(ann4, anns.get(1));
+
+ assertTrue(seq.getAlignmentAnnotations("calcId2", "label3").isEmpty());
+ assertTrue(seq.getAlignmentAnnotations("calcId3", "label5").isEmpty());
+ assertTrue(seq.getAlignmentAnnotations("calcId2", null).isEmpty());
+ assertTrue(seq.getAlignmentAnnotations(null, "label3").isEmpty());
+ assertTrue(seq.getAlignmentAnnotations(null, null).isEmpty());
+ }
+
+ /**
+ * Tests for addAlignmentAnnotation. Note this method has the side-effect of
+ * setting the sequenceRef on the annotation.
+ */
+ @Test
+ public void testAddAlignmentAnnotation()
+ {
+ assertNull(seq.annotation);
+ final AlignmentAnnotation annotation = new AlignmentAnnotation("a",
+ "b", 2d);
+ assertNull(annotation.sequenceRef);
+ seq.addAlignmentAnnotation(annotation);
+ assertSame(seq, annotation.sequenceRef);
+ AlignmentAnnotation[] anns = seq.getAnnotation();
+ assertEquals(1, anns.length);
+ assertSame(annotation, anns[0]);
+ }
+}
--- /dev/null
+package jalview.gui;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.SequenceI;
+import jalview.io.AppletFormatAdapter;
+import jalview.util.MessageManager;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.JMenuItem;
+
+import org.junit.Before;
+import org.junit.Test;
+
+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 jalview.io.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<SequenceI> seqs = new ArrayList<SequenceI>();
+ testee.configureReferenceAnnotationsMenu(menu, seqs);
+ assertFalse(menu.isEnabled());
+ assertEquals(
+ MessageManager.getString("label.add_reference_annotations"),
+ menu.getText());
+ // now try null list
+ menu.setEnabled(true);
+ testee.configureReferenceAnnotationsMenu(menu, seqs);
+ 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();
+ List<SequenceI> seqs = new ArrayList<SequenceI>();
+
+ /*
+ * Initial state is that sequences have annotations, and have dataset
+ * sequences, but the dataset sequences have no annotations. Hence nothing
+ * to add.
+ */
+ 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<SequenceI> seqs = new ArrayList<SequenceI>();
+
+ seqs = parentPanel.getAlignment().getSequences();
+ // copy annotation from sequence to dataset
+ seqs.get(1).getDatasetSequence()
+ .addAlignmentAnnotation(seqs.get(1).getAnnotation()[0]);
+ 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<SequenceI> seqs = new ArrayList<SequenceI>();
+
+ seqs = parentPanel.getAlignment().getSequences();
+ // make up new annotations and add to dataset sequences
+
+ // PDB.secondary structure on Sequence0
+ AlignmentAnnotation annotation = new AlignmentAnnotation(
+ "secondary structure", "", 0);
+ annotation.setCalcId("PBD");
+ seqs.get(0).getDatasetSequence().addAlignmentAnnotation(annotation);
+
+ // PDB.Temp on Sequence1
+ annotation = new AlignmentAnnotation("Temp", "", 0);
+ annotation.setCalcId("PBD");
+ seqs.get(1).getDatasetSequence().addAlignmentAnnotation(annotation);
+
+ // JMOL.secondary structure on Sequence0
+ annotation = new AlignmentAnnotation("secondary structure", "", 0);
+ annotation.setCalcId("JMOL");
+ seqs.get(0).getDatasetSequence().addAlignmentAnnotation(annotation);
+
+ testee.configureReferenceAnnotationsMenu(menu, seqs);
+ assertTrue(menu.isEnabled());
+ String expected = "<html><table width=350 border=0><tr><td>Add annotations for<br/>JMOL/secondary structure<br/>PBD/Temp</td></tr></table></html>";
+ assertEquals(expected, menu.getToolTipText());
+ }
+}