1 package jalview.analysis;
3 import static org.testng.Assert.assertEquals;
4 import static org.testng.Assert.assertSame;
5 import static org.testng.Assert.assertTrue;
7 import jalview.datamodel.Alignment;
8 import jalview.datamodel.AlignmentI;
9 import jalview.datamodel.SearchResultMatchI;
10 import jalview.datamodel.SearchResultsI;
11 import jalview.datamodel.Sequence;
12 import jalview.gui.AlignFrame;
13 import jalview.gui.JvOptionPane;
14 import jalview.io.FileLoader;
15 import jalview.io.FormatAdapter;
17 import java.util.List;
19 import org.testng.annotations.BeforeClass;
20 import org.testng.annotations.Test;
22 public class FinderTest
24 @BeforeClass(alwaysRun = true)
25 public void setUpJvOptionPane()
27 JvOptionPane.setInteractiveMode(false);
28 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
31 private AlignFrame af;
33 private AlignmentI al;
35 @BeforeClass(groups = "Functional")
38 String seqData = "seq1 ABCD--EF-GHI\n" + "seq2 A--BCDefHI\n"
39 + "seq3 --bcdEFH\n" + "seq4 aa---aMMMMMaaa\n";
40 af = new FileLoader().LoadFileWaitTillLoaded(seqData,
42 al = af.getViewport().getAlignment();
46 * Test for find all matches of a regular expression
48 @Test(groups = "Functional")
49 public void testFindAll_regex()
51 Finder f = new Finder(al, null);
53 f.find("E.H"); // 'E, any character, H'
55 // should match seq2 efH and seq3 EFH
56 SearchResultsI sr = f.getSearchResults();
57 assertEquals(sr.getSize(), 2);
58 List<SearchResultMatchI> matches = sr.getResults();
59 assertSame(al.getSequenceAt(1), matches.get(0).getSequence());
60 assertSame(al.getSequenceAt(2), matches.get(1).getSequence());
61 assertEquals(matches.get(0).getStart(), 5);
62 assertEquals(matches.get(0).getEnd(), 7);
63 assertEquals(matches.get(1).getStart(), 4);
64 assertEquals(matches.get(1).getEnd(), 6);
68 * Test for (undocumented) find residue by position
70 @Test(groups = "Functional")
71 public void testFind_residueNumber()
73 Finder f = new Finder(al, null);
77 // seq1 and seq4 have 9 residues; no match in other sequences
78 SearchResultsI sr = f.getSearchResults();
79 assertEquals(sr.getSize(), 2);
80 List<SearchResultMatchI> matches = sr.getResults();
81 assertSame(al.getSequenceAt(0), matches.get(0).getSequence());
82 assertSame(al.getSequenceAt(3), matches.get(1).getSequence());
83 assertEquals(matches.get(0).getStart(), 9);
84 assertEquals(matches.get(0).getEnd(), 9);
85 assertEquals(matches.get(1).getStart(), 9);
86 assertEquals(matches.get(1).getEnd(), 9);
90 * Test for find next action
92 @Test(groups = "Functional")
93 public void testFindNext()
96 * start at second sequence; resIndex of -1
97 * means sequence id / description is searched
99 Finder f = new Finder(al, null, 1, -1);
100 f.find("e"); // matches id
102 assertTrue(f.getSearchResults().isEmpty());
103 assertEquals(f.getIdMatch().size(), 1);
104 assertSame(f.getIdMatch().get(0), al.getSequenceAt(1));
106 // resIndex is now 0 - for use in next find next
107 assertEquals(f.getResIndex(), 0);
108 f = new Finder(al, null, 1, 0);
109 f.find("e"); // matches in sequence
110 assertTrue(f.getIdMatch().isEmpty());
111 assertEquals(f.getSearchResults().getSize(), 1);
112 List<SearchResultMatchI> matches = f.getSearchResults().getResults();
113 assertEquals(matches.get(0).getStart(), 5);
114 assertEquals(matches.get(0).getEnd(), 5);
115 assertSame(matches.get(0).getSequence(), al.getSequenceAt(1));
116 // still in the second sequence
117 assertEquals(f.getSeqIndex(), 1);
118 // next residue position to search from is 5
119 // (used as base 0 by RegEx so the same as 6 if base 1)
120 assertEquals(f.getResIndex(), 5);
122 // find next from end of sequence - finds next sequence id
123 f = new Finder(al, null, 1, 5);
125 assertEquals(f.getIdMatch().size(), 1);
126 assertSame(f.getIdMatch().get(0), al.getSequenceAt(2));
130 * Test for matching within sequence descriptions
132 @Test(groups = "Functional")
133 public void testFindAll_inDescription()
135 AlignmentI al2 = new Alignment(al);
136 al2.getSequenceAt(0).setDescription("BRAF");
137 al2.getSequenceAt(1).setDescription("braf");
138 Finder f = new Finder(al2, null);
140 f.setIncludeDescription(true);
143 assertEquals(f.getIdMatch().size(), 2);
144 assertSame(f.getIdMatch().get(0), al2.getSequenceAt(0));
145 assertSame(f.getIdMatch().get(1), al2.getSequenceAt(1));
146 assertTrue(f.getSearchResults().isEmpty());
151 f = new Finder(al2, null);
153 f.setCaseSensitive(true);
154 f.setIncludeDescription(true);
157 assertEquals(f.getIdMatch().size(), 1);
158 assertSame(f.getIdMatch().get(0), al2.getSequenceAt(0));
159 assertTrue(f.getSearchResults().isEmpty());
162 * match sequence id, description and sequence!
164 al2.getSequenceAt(0).setDescription("the efh sequence");
165 al2.getSequenceAt(0).setName("mouseEFHkinase");
166 al2.getSequenceAt(1).setName("humanEFHkinase");
167 f = new Finder(al2, null);
169 f.setIncludeDescription(true);
172 * sequence matches should have no duplicates
175 assertEquals(f.getIdMatch().size(), 2);
176 assertSame(f.getIdMatch().get(0), al2.getSequenceAt(0));
177 assertSame(f.getIdMatch().get(1), al2.getSequenceAt(1));
179 assertEquals(f.getSearchResults().getSize(), 2);
180 SearchResultMatchI match = f.getSearchResults().getResults().get(0);
181 assertSame(al2.getSequenceAt(1), match.getSequence());
182 assertEquals(5, match.getStart());
183 assertEquals(7, match.getEnd());
184 match = f.getSearchResults().getResults().get(1);
185 assertSame(al2.getSequenceAt(2), match.getSequence());
186 assertEquals(4, match.getStart());
187 assertEquals(6, match.getEnd());
191 * Test for matching within sequence ids
193 @Test(groups = "Functional")
194 public void testFindAll_sequenceIds()
196 Finder f = new Finder(al, null);
203 assertEquals(f.getIdMatch().size(), 1);
204 assertSame(f.getIdMatch().get(0), al.getSequenceAt(0));
205 assertTrue(f.getSearchResults().isEmpty());
210 f = new Finder(al, null);
212 f.setCaseSensitive(true);
214 assertTrue(f.getSearchResults().isEmpty());
217 * match both sequence id and sequence
219 AlignmentI al2 = new Alignment(al);
220 al2.addSequence(new Sequence("aBz", "xyzabZpqrAbZ"));
221 f = new Finder(al2, null);
224 assertEquals(f.getIdMatch().size(), 1);
225 assertSame(f.getIdMatch().get(0), al2.getSequenceAt(4));
226 assertEquals(f.getSearchResults().getSize(), 2);
227 SearchResultMatchI match = f.getSearchResults().getResults().get(0);
228 assertSame(al2.getSequenceAt(4), match.getSequence());
229 assertEquals(4, match.getStart());
230 assertEquals(6, match.getEnd());
231 match = f.getSearchResults().getResults().get(1);
232 assertSame(al2.getSequenceAt(4), match.getSequence());
233 assertEquals(10, match.getStart());
234 assertEquals(12, match.getEnd());
238 * Test finding all matches of a sequence pattern in an alignment
240 @Test(groups = "Functional")
241 public void testFindAll_simpleMatch()
243 Finder f = new Finder(al, null);
247 * case insensitive first
250 SearchResultsI searchResults = f.getSearchResults();
251 assertEquals(searchResults.getSize(), 2);
252 SearchResultMatchI match = searchResults.getResults().get(0);
253 assertSame(al.getSequenceAt(1), match.getSequence());
254 assertEquals(5, match.getStart());
255 assertEquals(7, match.getEnd());
256 match = searchResults.getResults().get(1);
257 assertSame(al.getSequenceAt(2), match.getSequence());
258 assertEquals(4, match.getStart());
259 assertEquals(6, match.getEnd());
264 f = new Finder(al, null);
266 f.setCaseSensitive(true);
268 searchResults = f.getSearchResults();
269 assertEquals(searchResults.getSize(), 2);
270 match = searchResults.getResults().get(0);
271 assertSame(al.getSequenceAt(0), match.getSequence());
272 assertEquals(2, match.getStart());
273 assertEquals(3, match.getEnd());
274 match = searchResults.getResults().get(1);
275 assertSame(al.getSequenceAt(1), match.getSequence());
276 assertEquals(2, match.getStart());
277 assertEquals(3, match.getEnd());
281 * Test for JAL-2302 to verify that sub-matches are not included in a find all
284 @Test(groups = "Functional")
285 public void testFind_maximalResultOnly()
287 Finder f = new Finder(al, null);
290 SearchResultsI searchResults = f.getSearchResults();
291 assertEquals(searchResults.getSize(), 1);
292 SearchResultMatchI match = searchResults.getResults().get(0);
293 assertSame(al.getSequenceAt(3), match.getSequence());
294 assertEquals(4, match.getStart()); // dataset sequence positions
295 assertEquals(8, match.getEnd()); // base 1