2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
23 import static org.testng.Assert.assertEquals;
24 import static org.testng.Assert.assertNull;
26 import jalview.commands.EditCommand;
27 import jalview.commands.EditCommand.Action;
28 import jalview.commands.EditCommand.Edit;
29 import jalview.datamodel.Alignment;
30 import jalview.datamodel.AlignmentI;
31 import jalview.datamodel.Sequence;
32 import jalview.datamodel.SequenceI;
33 import jalview.util.MessageManager;
35 import org.testng.annotations.BeforeClass;
36 import org.testng.annotations.Test;
38 public class SeqPanelTest
42 @BeforeClass(alwaysRun = true)
43 public void setUpJvOptionPane()
45 JvOptionPane.setInteractiveMode(false);
46 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
48 @Test(groups = "Functional")
49 public void testSetStatusReturnsNearestResiduePosition()
51 SequenceI seq1 = new Sequence("Seq1", "AACDE");
52 SequenceI seq2 = new Sequence("Seq2", "AA--E");
53 AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 });
54 AlignFrame alignFrame = new AlignFrame(al, al.getWidth(),
56 AlignmentI visAl = alignFrame.getViewport().getAlignment();
58 // Test either side of gap
60 alignFrame.alignPanel.getSeqPanel().setStatusMessage(
61 visAl.getSequenceAt(1), 1, 1), 2);
62 assertEquals(alignFrame.statusBar.getText(),
63 "Sequence 2 ID: Seq2 Residue: ALA (2)");
65 alignFrame.alignPanel.getSeqPanel().setStatusMessage(
66 visAl.getSequenceAt(1), 4, 1), 3);
67 assertEquals(alignFrame.statusBar.getText(),
68 "Sequence 2 ID: Seq2 Residue: GLU (3)");
69 // no status message at a gap, returns next residue position to the right
71 alignFrame.alignPanel.getSeqPanel().setStatusMessage(
72 visAl.getSequenceAt(1), 2, 1), 3);
73 assertEquals(alignFrame.statusBar.getText(), "Sequence 2 ID: Seq2");
75 alignFrame.alignPanel.getSeqPanel().setStatusMessage(
76 visAl.getSequenceAt(1), 3, 1), 3);
77 assertEquals(alignFrame.statusBar.getText(), "Sequence 2 ID: Seq2");
80 @Test(groups = "Functional")
81 public void testAmbiguousAminoAcidGetsStatusMessage()
83 SequenceI seq1 = new Sequence("Seq1", "ABCDE");
84 SequenceI seq2 = new Sequence("Seq2", "AB--E");
85 AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 });
86 AlignFrame alignFrame = new AlignFrame(al, al.getWidth(),
88 AlignmentI visAl = alignFrame.getViewport().getAlignment();
91 alignFrame.alignPanel.getSeqPanel().setStatusMessage(
92 visAl.getSequenceAt(1), 1, 1), 2);
93 assertEquals(alignFrame.statusBar.getText(),
94 "Sequence 2 ID: Seq2 Residue: B (2)");
97 @Test(groups = "Functional")
98 public void testGetEditStatusMessage()
100 assertNull(SeqPanel.getEditStatusMessage(null));
102 EditCommand edit = new EditCommand(); // empty
103 assertNull(SeqPanel.getEditStatusMessage(edit));
105 SequenceI[] seqs = new SequenceI[] { new Sequence("a", "b") };
108 edit.addEdit(edit.new Edit(Action.INSERT_GAP, seqs, 1, 1, '-'));
109 String expected = MessageManager.formatMessage("label.insert_gap", "1");
110 assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
112 // 3 more gaps makes +4
113 edit.addEdit(edit.new Edit(Action.INSERT_GAP, seqs, 1, 3, '-'));
114 expected = MessageManager.formatMessage("label.insert_gaps", "4");
115 assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
117 // 2 deletes makes + 2
118 edit.addEdit(edit.new Edit(Action.DELETE_GAP, seqs, 1, 2, '-'));
119 expected = MessageManager.formatMessage("label.insert_gaps", "2");
120 assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
122 // 2 more deletes makes 0 - no text
123 edit.addEdit(edit.new Edit(Action.DELETE_GAP, seqs, 1, 2, '-'));
124 assertNull(SeqPanel.getEditStatusMessage(edit));
126 // 1 more delete makes 1 delete
127 edit.addEdit(edit.new Edit(Action.DELETE_GAP, seqs, 1, 1, '-'));
128 expected = MessageManager.formatMessage("label.delete_gap", "1");
129 assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
131 // 1 more delete makes 2 deletes
132 edit.addEdit(edit.new Edit(Action.DELETE_GAP, seqs, 1, 1, '-'));
133 expected = MessageManager.formatMessage("label.delete_gaps", "2");
134 assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
138 * Tests that simulate 'locked editing', where an inserted gap is balanced by
139 * a gap deletion in the selection group, and vice versa
141 @Test(groups = "Functional")
142 public void testGetEditStatusMessage_lockedEditing()
144 EditCommand edit = new EditCommand(); // empty
145 SequenceI[] seqs = new SequenceI[] { new Sequence("a", "b") };
147 // 1 gap inserted, balanced by 1 delete
148 Edit e1 = edit.new Edit(Action.INSERT_GAP, seqs, 1, 1, '-');
150 Edit e2 = edit.new Edit(Action.DELETE_GAP, seqs, 5, 1, '-');
151 e2.setSystemGenerated(true);
153 String expected = MessageManager.formatMessage("label.insert_gap", "1");
154 assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
156 // 2 more gaps makes +3
157 Edit e3 = edit.new Edit(Action.INSERT_GAP, seqs, 1, 2, '-');
159 Edit e4 = edit.new Edit(Action.DELETE_GAP, seqs, 5, 2, '-');
160 e4.setSystemGenerated(true);
162 expected = MessageManager.formatMessage("label.insert_gaps", "3");
163 assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
165 // 2 deletes makes + 1
166 Edit e5 = edit.new Edit(Action.DELETE_GAP, seqs, 1, 2, '-');
168 Edit e6 = edit.new Edit(Action.INSERT_GAP, seqs, 5, 2, '-');
169 e6.setSystemGenerated(true);
171 expected = MessageManager.formatMessage("label.insert_gap", "1");
172 assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
174 // 1 more delete makes 0 - no text
175 Edit e7 = edit.new Edit(Action.DELETE_GAP, seqs, 1, 1, '-');
177 Edit e8 = edit.new Edit(Action.INSERT_GAP, seqs, 5, 1, '-');
178 e8.setSystemGenerated(true);
180 expected = MessageManager.formatMessage("label.insert_gaps", "2");
181 assertNull(SeqPanel.getEditStatusMessage(edit));
183 // 1 more delete makes 1 delete
184 Edit e9 = edit.new Edit(Action.DELETE_GAP, seqs, 1, 1, '-');
186 Edit e10 = edit.new Edit(Action.INSERT_GAP, seqs, 5, 1, '-');
187 e10.setSystemGenerated(true);
189 expected = MessageManager.formatMessage("label.delete_gap", "1");
190 assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
192 // 2 more deletes makes 3 deletes
193 Edit e11 = edit.new Edit(Action.DELETE_GAP, seqs, 1, 2, '-');
195 Edit e12 = edit.new Edit(Action.INSERT_GAP, seqs, 5, 2, '-');
196 e12.setSystemGenerated(true);
198 expected = MessageManager.formatMessage("label.delete_gaps", "3");
199 assertEquals(SeqPanel.getEditStatusMessage(edit), expected);