1 package jalview.commands;
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;
11 import org.junit.Before;
12 import org.junit.Ignore;
13 import org.junit.Test;
16 * Unit tests for EditCommand
21 public class EditCommandTest
24 private EditCommand testee;
26 private SequenceI[] seqs;
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('?');
44 * Test inserting gap characters
47 public void testAppendEdit_insertGap()
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());
56 // todo: test for handling out of range positions?
60 * Test deleting characters from sequences. Note the deleteGap() action does
61 * not check that only gap characters are being removed.
64 public void testAppendEdit_deleteGap()
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());
74 * Test a cut action. The command should store the cut characters to support
80 Edit ec = testee.new Edit(Action.CUT, seqs, 4, 3, al);
81 testee.cut(ec, new AlignmentI[]
83 assertEquals("abcdhjk", seqs[0].getSequenceAsString());
84 assertEquals("fghjnopq", seqs[1].getSequenceAsString());
85 assertEquals("qrstxyz", seqs[2].getSequenceAsString());
86 assertEquals("1234890", seqs[3].getSequenceAsString());
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
96 * Test a Paste action, where this adds sequences to an alignment.
100 // TODO fix so it works
101 public void testPaste_addToAlignment()
103 SequenceI[] newSeqs = new SequenceI[2];
104 newSeqs[0] = new Sequence("newseq0", "ACEFKL");
105 newSeqs[1] = new Sequence("newseq1", "JWMPDH");
107 Edit ec = testee.new Edit(Action.PASTE, newSeqs, 0, al.getWidth(), al);
108 testee.paste(ec, new AlignmentI[]
110 assertEquals(6, al.getSequences().size());
111 assertEquals("1234567890", seqs[3].getSequenceAsString());
112 assertEquals("ACEFKL", seqs[4].getSequenceAsString());
113 assertEquals("JWMPDH", seqs[5].getSequenceAsString());
117 * Test insertGap followed by undo command
120 public void testUndo_insertGap()
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[]
128 assertEquals("abcdefghjk", seqs[0].getSequenceAsString());
129 assertEquals("fghjklmnopq", seqs[1].getSequenceAsString());
130 assertEquals("qrstuvwxyz", seqs[2].getSequenceAsString());
131 assertEquals("1234567890", seqs[3].getSequenceAsString());
135 * Test deleteGap followed by undo command
138 public void testUndo_deleteGap()
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[]
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());
153 * Test several commands followed by an undo command
156 public void testUndo_multipleCommands()
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());
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());
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());
173 // undo edit commands
174 testee.undoCommand(new AlignmentI[]
176 assertEquals("ab?????hjk", seqs[0].getSequenceAsString());
177 assertEquals("12?????890", seqs[3].getSequenceAsString());
181 * Unit test for JAL-1594 bug: click and drag sequence right to insert gaps -
182 * undo did not remove them all.
185 public void testUndo_multipleInsertGaps()
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);
191 // undo edit commands
192 testee.undoCommand(new AlignmentI[]
194 assertEquals("abcdefghjk", seqs[0].getSequenceAsString());
195 assertEquals("1234567890", seqs[3].getSequenceAsString());
200 * Test cut followed by undo command
203 public void testUndo_cut()
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[]
210 assertEquals("abcdefghjk", seqs[0].getSequenceAsString());
211 assertEquals("fghjklmnopq", seqs[1].getSequenceAsString());
212 assertEquals("qrstuvwxyz", seqs[2].getSequenceAsString());
213 assertEquals("1234567890", seqs[3].getSequenceAsString());
217 * Test the replace command (used to manually edit a sequence)
220 public void testReplace()
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");