package jalview.gui;
import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+import jalview.commands.EditCommand;
+import jalview.commands.EditCommand.Action;
+import jalview.commands.EditCommand.Edit;
import jalview.datamodel.Alignment;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.Sequence;
import jalview.datamodel.SequenceI;
+import jalview.util.MessageManager;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
}
@Test(groups = "Functional")
- public void testSetStatusReturnsPosOrMinusOne()
+ public void testSetStatusReturnsNearestResiduePosition()
{
- SequenceI seq1 = new Sequence("Seq1", "ABCDEFGHIJ");
- SequenceI seq2 = new Sequence("Seq2", "AB--EFGHIJ");
+ SequenceI seq1 = new Sequence("Seq1", "AACDE");
+ SequenceI seq2 = new Sequence("Seq2", "AA--E");
AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 });
AlignFrame alignFrame = new AlignFrame(al, al.getWidth(),
al.getHeight());
AlignmentI visAl = alignFrame.getViewport().getAlignment();
+
+ // Test either side of gap
assertEquals(
alignFrame.alignPanel.getSeqPanel().setStatusMessage(
visAl.getSequenceAt(1), 1, 1), 2);
+ assertEquals(alignFrame.statusBar.getText(),
+ "Sequence 2 ID: Seq2 Residue: ALA (2)");
assertEquals(
-
alignFrame.alignPanel.getSeqPanel().setStatusMessage(
- visAl.getSequenceAt(1), 2, 1), -1);
+ visAl.getSequenceAt(1), 4, 1), 3);
+ assertEquals(alignFrame.statusBar.getText(),
+ "Sequence 2 ID: Seq2 Residue: GLU (3)");
+ // no status message at a gap, returns next residue position to the right
assertEquals(
alignFrame.alignPanel.getSeqPanel().setStatusMessage(
- visAl.getSequenceAt(1), 3, 1), -1);
+ visAl.getSequenceAt(1), 2, 1), 3);
+ assertEquals(alignFrame.statusBar.getText(), "Sequence 2 ID: Seq2");
assertEquals(
alignFrame.alignPanel.getSeqPanel().setStatusMessage(
- visAl.getSequenceAt(1), 4, 1), 3);
+ visAl.getSequenceAt(1), 3, 1), 3);
+ assertEquals(alignFrame.statusBar.getText(), "Sequence 2 ID: Seq2");
+ }
+
+ @Test(groups = "Functional")
+ public void testAmbiguousAminoAcidGetsStatusMessage()
+ {
+ SequenceI seq1 = new Sequence("Seq1", "ABCDE");
+ SequenceI seq2 = new Sequence("Seq2", "AB--E");
+ AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 });
+ AlignFrame alignFrame = new AlignFrame(al, al.getWidth(),
+ al.getHeight());
+ AlignmentI visAl = alignFrame.getViewport().getAlignment();
+
+ assertEquals(
+ alignFrame.alignPanel.getSeqPanel().setStatusMessage(
+ visAl.getSequenceAt(1), 1, 1), 2);
+ assertEquals(alignFrame.statusBar.getText(),
+ "Sequence 2 ID: Seq2 Residue: B (2)");
+ }
+
+ @Test(groups = "Functional")
+ public void testGetEditStatusMessage()
+ {
+ assertNull(SeqPanel.getEditStatusMessage(null));
+
+ EditCommand edit = new EditCommand(); // empty
+ assertNull(SeqPanel.getEditStatusMessage(edit));
+
+ SequenceI[] seqs = new SequenceI[] { new Sequence("a", "b") };
+
+ // 1 gap
+ edit.addEdit(edit.new Edit(Action.INSERT_GAP, seqs, 1, 1, '-'));
+ String expected = MessageManager.formatMessage("label.insert_gap", "1");
+ assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
+
+ // 3 more gaps makes +4
+ edit.addEdit(edit.new Edit(Action.INSERT_GAP, seqs, 1, 3, '-'));
+ expected = MessageManager.formatMessage("label.insert_gaps", "4");
+ assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
+
+ // 2 deletes makes + 2
+ edit.addEdit(edit.new Edit(Action.DELETE_GAP, seqs, 1, 2, '-'));
+ expected = MessageManager.formatMessage("label.insert_gaps", "2");
+ assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
+
+ // 2 more deletes makes 0 - no text
+ edit.addEdit(edit.new Edit(Action.DELETE_GAP, seqs, 1, 2, '-'));
+ assertNull(SeqPanel.getEditStatusMessage(edit));
+
+ // 1 more delete makes 1 delete
+ edit.addEdit(edit.new Edit(Action.DELETE_GAP, seqs, 1, 1, '-'));
+ expected = MessageManager.formatMessage("label.delete_gap", "1");
+ assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
+
+ // 1 more delete makes 2 deletes
+ edit.addEdit(edit.new Edit(Action.DELETE_GAP, seqs, 1, 1, '-'));
+ expected = MessageManager.formatMessage("label.delete_gaps", "2");
+ assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
+ }
+
+ /**
+ * Tests that simulate 'locked editing', where an inserted gap is balanced by
+ * a gap deletion in the selection group, and vice versa
+ */
+ @Test(groups = "Functional")
+ public void testGetEditStatusMessage_lockedEditing()
+ {
+ EditCommand edit = new EditCommand(); // empty
+ SequenceI[] seqs = new SequenceI[] { new Sequence("a", "b") };
+
+ // 1 gap inserted, balanced by 1 delete
+ Edit e1 = edit.new Edit(Action.INSERT_GAP, seqs, 1, 1, '-');
+ edit.addEdit(e1);
+ Edit e2 = edit.new Edit(Action.DELETE_GAP, seqs, 5, 1, '-');
+ e2.setSystemGenerated(true);
+ edit.addEdit(e2);
+ String expected = MessageManager.formatMessage("label.insert_gap", "1");
+ assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
+
+ // 2 more gaps makes +3
+ Edit e3 = edit.new Edit(Action.INSERT_GAP, seqs, 1, 2, '-');
+ edit.addEdit(e3);
+ Edit e4 = edit.new Edit(Action.DELETE_GAP, seqs, 5, 2, '-');
+ e4.setSystemGenerated(true);
+ edit.addEdit(e4);
+ expected = MessageManager.formatMessage("label.insert_gaps", "3");
+ assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
+
+ // 2 deletes makes + 1
+ Edit e5 = edit.new Edit(Action.DELETE_GAP, seqs, 1, 2, '-');
+ edit.addEdit(e5);
+ Edit e6 = edit.new Edit(Action.INSERT_GAP, seqs, 5, 2, '-');
+ e6.setSystemGenerated(true);
+ edit.addEdit(e6);
+ expected = MessageManager.formatMessage("label.insert_gap", "1");
+ assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
+
+ // 1 more delete makes 0 - no text
+ Edit e7 = edit.new Edit(Action.DELETE_GAP, seqs, 1, 1, '-');
+ edit.addEdit(e7);
+ Edit e8 = edit.new Edit(Action.INSERT_GAP, seqs, 5, 1, '-');
+ e8.setSystemGenerated(true);
+ edit.addEdit(e8);
+ expected = MessageManager.formatMessage("label.insert_gaps", "2");
+ assertNull(SeqPanel.getEditStatusMessage(edit));
+
+ // 1 more delete makes 1 delete
+ Edit e9 = edit.new Edit(Action.DELETE_GAP, seqs, 1, 1, '-');
+ edit.addEdit(e9);
+ Edit e10 = edit.new Edit(Action.INSERT_GAP, seqs, 5, 1, '-');
+ e10.setSystemGenerated(true);
+ edit.addEdit(e10);
+ expected = MessageManager.formatMessage("label.delete_gap", "1");
+ assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
+
+ // 2 more deletes makes 3 deletes
+ Edit e11 = edit.new Edit(Action.DELETE_GAP, seqs, 1, 2, '-');
+ edit.addEdit(e11);
+ Edit e12 = edit.new Edit(Action.INSERT_GAP, seqs, 5, 2, '-');
+ e12.setSystemGenerated(true);
+ edit.addEdit(e12);
+ expected = MessageManager.formatMessage("label.delete_gaps", "3");
+ assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
}
}