7f3aef1cdb111a9400ac487aeeb05388b9addcf1
[jalview.git] / test / jalview / gui / SeqPanelTest.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
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.
11  *  
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.
16  * 
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.
20  */
21 package jalview.gui;
22
23 import static org.testng.Assert.assertEquals;
24 import static org.testng.Assert.assertNull;
25
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;
34
35 import org.testng.annotations.BeforeClass;
36 import org.testng.annotations.Test;
37
38 public class SeqPanelTest
39 {
40   AlignFrame af;
41
42   @BeforeClass(alwaysRun = true)
43   public void setUpJvOptionPane()
44   {
45     JvOptionPane.setInteractiveMode(false);
46     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
47   }
48   @Test(groups = "Functional")
49   public void testSetStatusReturnsNearestResiduePosition()
50   {
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(),
55             al.getHeight());
56     AlignmentI visAl = alignFrame.getViewport().getAlignment();
57
58     // Test either side of gap
59     assertEquals(
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)");
64     assertEquals(
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
70     assertEquals(
71             alignFrame.alignPanel.getSeqPanel().setStatusMessage(
72                     visAl.getSequenceAt(1), 2, 1), 3);
73     assertEquals(alignFrame.statusBar.getText(), "Sequence 2 ID: Seq2");
74     assertEquals(
75             alignFrame.alignPanel.getSeqPanel().setStatusMessage(
76                     visAl.getSequenceAt(1), 3, 1), 3);
77     assertEquals(alignFrame.statusBar.getText(), "Sequence 2 ID: Seq2");
78   }
79
80   @Test(groups = "Functional")
81   public void testAmbiguousAminoAcidGetsStatusMessage()
82   {
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(),
87             al.getHeight());
88     AlignmentI visAl = alignFrame.getViewport().getAlignment();
89
90     assertEquals(
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)");
95   }
96
97   @Test(groups = "Functional")
98   public void testGetEditStatusMessage()
99   {
100     assertNull(SeqPanel.getEditStatusMessage(null));
101
102     EditCommand edit = new EditCommand(); // empty
103     assertNull(SeqPanel.getEditStatusMessage(edit));
104
105     SequenceI[] seqs = new SequenceI[] { new Sequence("a", "b") };
106     
107     // 1 gap
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);
111
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);
116
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);
121
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));
125
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);
130
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);
135   }
136
137   /**
138    * Tests that simulate 'locked editing', where an inserted gap is balanced by
139    * a gap deletion in the selection group, and vice versa
140    */
141   @Test(groups = "Functional")
142   public void testGetEditStatusMessage_lockedEditing()
143   {
144     EditCommand edit = new EditCommand(); // empty
145     SequenceI[] seqs = new SequenceI[] { new Sequence("a", "b") };
146     
147     // 1 gap inserted, balanced by 1 delete
148     Edit e1 = edit.new Edit(Action.INSERT_GAP, seqs, 1, 1, '-');
149     edit.addEdit(e1);
150     Edit e2 = edit.new Edit(Action.DELETE_GAP, seqs, 5, 1, '-');
151     e2.setSystemGenerated(true);
152     edit.addEdit(e2);
153     String expected = MessageManager.formatMessage("label.insert_gap", "1");
154     assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
155   
156     // 2 more gaps makes +3
157     Edit e3 = edit.new Edit(Action.INSERT_GAP, seqs, 1, 2, '-');
158     edit.addEdit(e3);
159     Edit e4 = edit.new Edit(Action.DELETE_GAP, seqs, 5, 2, '-');
160     e4.setSystemGenerated(true);
161     edit.addEdit(e4);
162     expected = MessageManager.formatMessage("label.insert_gaps", "3");
163     assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
164   
165     // 2 deletes makes + 1
166     Edit e5 = edit.new Edit(Action.DELETE_GAP, seqs, 1, 2, '-');
167     edit.addEdit(e5);
168     Edit e6 = edit.new Edit(Action.INSERT_GAP, seqs, 5, 2, '-');
169     e6.setSystemGenerated(true);
170     edit.addEdit(e6);
171     expected = MessageManager.formatMessage("label.insert_gap", "1");
172     assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
173   
174     // 1 more delete makes 0 - no text
175     Edit e7 = edit.new Edit(Action.DELETE_GAP, seqs, 1, 1, '-');
176     edit.addEdit(e7);
177     Edit e8 = edit.new Edit(Action.INSERT_GAP, seqs, 5, 1, '-');
178     e8.setSystemGenerated(true);
179     edit.addEdit(e8);
180     expected = MessageManager.formatMessage("label.insert_gaps", "2");
181     assertNull(SeqPanel.getEditStatusMessage(edit));
182   
183     // 1 more delete makes 1 delete
184     Edit e9 = edit.new Edit(Action.DELETE_GAP, seqs, 1, 1, '-');
185     edit.addEdit(e9);
186     Edit e10 = edit.new Edit(Action.INSERT_GAP, seqs, 5, 1, '-');
187     e10.setSystemGenerated(true);
188     edit.addEdit(e10);
189     expected = MessageManager.formatMessage("label.delete_gap", "1");
190     assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
191   
192     // 2 more deletes makes 3 deletes
193     Edit e11 = edit.new Edit(Action.DELETE_GAP, seqs, 1, 2, '-');
194     edit.addEdit(e11);
195     Edit e12 = edit.new Edit(Action.INSERT_GAP, seqs, 5, 2, '-');
196     e12.setSystemGenerated(true);
197     edit.addEdit(e12);
198     expected = MessageManager.formatMessage("label.delete_gaps", "3");
199     assertEquals(SeqPanel.getEditStatusMessage(edit), expected);
200   }
201 }