fc821b91922c90f041d3b9af5e066156b69dd527
[jalview.git] / test / jalview / commands / EditCommandTest.java
1 package jalview.commands;
2
3 import static org.junit.Assert.assertEquals;
4 import jalview.commands.EditCommand.Action;
5 import jalview.commands.EditCommand.Edit;
6 import jalview.datamodel.Alignment;
7 import jalview.datamodel.AlignmentI;
8 import jalview.datamodel.Sequence;
9 import jalview.datamodel.SequenceI;
10
11 import org.junit.Before;
12 import org.junit.Ignore;
13 import org.junit.Test;
14
15 /**
16  * Unit tests for EditCommand
17  * 
18  * @author gmcarstairs
19  *
20  */
21 public class EditCommandTest
22 {
23
24   private EditCommand testee;
25
26   private SequenceI[] seqs;
27
28   private Alignment al;
29
30   @Before
31   public void setUp()
32   {
33     testee = new EditCommand();
34     seqs = new SequenceI[4];
35     seqs[0] = new Sequence("seq0", "abcdefghjk");
36     seqs[1] = new Sequence("seq1", "fghjklmnopq");
37     seqs[2] = new Sequence("seq2", "qrstuvwxyz");
38     seqs[3] = new Sequence("seq3", "1234567890");
39     al = new Alignment(seqs);
40     al.setGapCharacter('?');
41   }
42
43   /**
44    * Test inserting gap characters
45    */
46   @Test
47   public void testAppendEdit_insertGap()
48   {
49     // set a non-standard gap character to prove it is actually used
50     testee.appendEdit(Action.INSERT_GAP, seqs, 4, 3, al, true);
51     assertEquals("abcd???efghjk", seqs[0].getSequenceAsString());
52     assertEquals("fghj???klmnopq", seqs[1].getSequenceAsString());
53     assertEquals("qrst???uvwxyz", seqs[2].getSequenceAsString());
54     assertEquals("1234???567890", seqs[3].getSequenceAsString());
55
56     // todo: test for handling out of range positions?
57   }
58
59   /**
60    * Test deleting characters from sequences. Note the deleteGap() action does
61    * not check that only gap characters are being removed.
62    */
63   @Test
64   public void testAppendEdit_deleteGap()
65   {
66     testee.appendEdit(Action.DELETE_GAP, seqs, 4, 3, al, true);
67     assertEquals("abcdhjk", seqs[0].getSequenceAsString());
68     assertEquals("fghjnopq", seqs[1].getSequenceAsString());
69     assertEquals("qrstxyz", seqs[2].getSequenceAsString());
70     assertEquals("1234890", seqs[3].getSequenceAsString());
71   }
72
73   /**
74    * Test a cut action. The command should store the cut characters to support
75    * undo.
76    */
77   @Test
78   public void testCut()
79   {
80     Edit ec = testee.new Edit(Action.CUT, seqs, 4, 3, al);
81     testee.cut(ec, new AlignmentI[]
82     { al });
83     assertEquals("abcdhjk", seqs[0].getSequenceAsString());
84     assertEquals("fghjnopq", seqs[1].getSequenceAsString());
85     assertEquals("qrstxyz", seqs[2].getSequenceAsString());
86     assertEquals("1234890", seqs[3].getSequenceAsString());
87
88     assertEquals("efg", new String(ec.string[0]));
89     assertEquals("klm", new String(ec.string[1]));
90     assertEquals("uvw", new String(ec.string[2]));
91     assertEquals("567", new String(ec.string[3]));
92     // TODO: case where whole sequence is deleted as nothing left; etc
93   }
94
95   /**
96    * Test a Paste action, where this adds sequences to an alignment.
97    */
98   @Test
99   @Ignore
100   // TODO fix so it works
101   public void testPaste_addToAlignment()
102   {
103     SequenceI[] newSeqs = new SequenceI[2];
104     newSeqs[0] = new Sequence("newseq0", "ACEFKL");
105     newSeqs[1] = new Sequence("newseq1", "JWMPDH");
106
107     Edit ec = testee.new Edit(Action.PASTE, newSeqs, 0, al.getWidth(), al);
108     testee.paste(ec, new AlignmentI[]
109     { al });
110     assertEquals(6, al.getSequences().size());
111     assertEquals("1234567890", seqs[3].getSequenceAsString());
112     assertEquals("ACEFKL", seqs[4].getSequenceAsString());
113     assertEquals("JWMPDH", seqs[5].getSequenceAsString());
114   }
115
116   /**
117    * Test insertGap followed by undo command
118    */
119   @Test
120   public void testUndo_insertGap()
121   {
122     // Edit ec = testee.new Edit(Action.INSERT_GAP, seqs, 4, 3, '?');
123     testee.appendEdit(Action.INSERT_GAP, seqs, 4, 3, al, true);
124     // check something changed
125     assertEquals("abcd???efghjk", seqs[0].getSequenceAsString());
126     testee.undoCommand(new AlignmentI[]
127     { al });
128     assertEquals("abcdefghjk", seqs[0].getSequenceAsString());
129     assertEquals("fghjklmnopq", seqs[1].getSequenceAsString());
130     assertEquals("qrstuvwxyz", seqs[2].getSequenceAsString());
131     assertEquals("1234567890", seqs[3].getSequenceAsString());
132   }
133
134   /**
135    * Test deleteGap followed by undo command
136    */
137   @Test
138   public void testUndo_deleteGap()
139   {
140     testee.appendEdit(Action.DELETE_GAP, seqs, 4, 3, al, true);
141     // check something changed
142     assertEquals("abcdhjk", seqs[0].getSequenceAsString());
143     testee.undoCommand(new AlignmentI[]
144     { al });
145     // deleteGap doesn't 'remember' deleted characters, only gaps get put back
146     assertEquals("abcd???hjk", seqs[0].getSequenceAsString());
147     assertEquals("fghj???nopq", seqs[1].getSequenceAsString());
148     assertEquals("qrst???xyz", seqs[2].getSequenceAsString());
149     assertEquals("1234???890", seqs[3].getSequenceAsString());
150   }
151
152   /**
153    * Test several commands followed by an undo command
154    */
155   @Test
156   public void testUndo_multipleCommands()
157   {
158     // delete positions 3/4/5 (counting from 1)
159     testee.appendEdit(Action.DELETE_GAP, seqs, 2, 3, al, true);
160     assertEquals("abfghjk", seqs[0].getSequenceAsString());
161     assertEquals("1267890", seqs[3].getSequenceAsString());
162
163     // insert 2 gaps after the second residue
164     testee.appendEdit(Action.INSERT_GAP, seqs, 2, 2, al, true);
165     assertEquals("ab??fghjk", seqs[0].getSequenceAsString());
166     assertEquals("12??67890", seqs[3].getSequenceAsString());
167
168     // delete positions 4/5/6
169     testee.appendEdit(Action.DELETE_GAP, seqs, 3, 3, al, true);
170     assertEquals("ab?hjk", seqs[0].getSequenceAsString());
171     assertEquals("12?890", seqs[3].getSequenceAsString());
172
173     // undo edit commands
174     testee.undoCommand(new AlignmentI[]
175     { al });
176     assertEquals("ab?????hjk", seqs[0].getSequenceAsString());
177     assertEquals("12?????890", seqs[3].getSequenceAsString());
178   }
179
180   /**
181    * Unit test for JAL-1594 bug: click and drag sequence right to insert gaps -
182    * undo did not remove them all.
183    */
184   @Test
185   public void testUndo_multipleInsertGaps()
186   {
187     testee.appendEdit(Action.INSERT_GAP, seqs, 4, 1, al, true);
188     testee.appendEdit(Action.INSERT_GAP, seqs, 5, 1, al, true);
189     testee.appendEdit(Action.INSERT_GAP, seqs, 6, 1, al, true);
190
191     // undo edit commands
192     testee.undoCommand(new AlignmentI[]
193     { al });
194     assertEquals("abcdefghjk", seqs[0].getSequenceAsString());
195     assertEquals("1234567890", seqs[3].getSequenceAsString());
196
197   }
198
199   /**
200    * Test cut followed by undo command
201    */
202   @Test
203   public void testUndo_cut()
204   {
205     testee.appendEdit(Action.CUT, seqs, 4, 3, al, true);
206     // check something changed
207     assertEquals("abcdhjk", seqs[0].getSequenceAsString());
208     testee.undoCommand(new AlignmentI[]
209     { al });
210     assertEquals("abcdefghjk", seqs[0].getSequenceAsString());
211     assertEquals("fghjklmnopq", seqs[1].getSequenceAsString());
212     assertEquals("qrstuvwxyz", seqs[2].getSequenceAsString());
213     assertEquals("1234567890", seqs[3].getSequenceAsString());
214   }
215
216   /**
217    * Test the replace command (used to manually edit a sequence)
218    */
219   @Test
220   public void testReplace()
221   {
222     // seem to need a dataset sequence on the edited sequence here
223     seqs[1].setDatasetSequence(seqs[1]);
224     new EditCommand("", Action.REPLACE, "ZXY", new SequenceI[]
225     { seqs[1] }, 4, 8, al);
226     assertEquals("abcdefghjk", seqs[0].getSequenceAsString());
227     assertEquals("qrstuvwxyz", seqs[2].getSequenceAsString());
228     assertEquals("1234567890", seqs[3].getSequenceAsString());
229     seqs[1] = new Sequence("seq1", "fghjZXYnopq");
230
231   }
232 }