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.io.FileLoader;
14 import jalview.io.FormatAdapter;
16 import java.util.List;
18 import org.testng.annotations.BeforeClass;
19 import org.testng.annotations.Test;
21 public class FinderTest
23 private AlignFrame af;
25 private AlignmentI al;
27 @BeforeClass(groups = "Functional")
30 String seqData = "seq1 ABCD--EF-GHI\n" + "seq2 A--BCDefHI\n"
31 + "seq3 --bcdEFH\n" + "seq4 aa---aMMMMMaaa\n";
32 af = new FileLoader().LoadFileWaitTillLoaded(seqData,
34 al = af.getViewport().getAlignment();
38 * Test for find all matches of a regular expression
40 @Test(groups = "Functional")
41 public void testFindAll_regex()
43 Finder f = new Finder(al, null);
45 f.find("E.H"); // 'E, any character, H'
47 // should match seq2 efH and seq3 EFH
48 SearchResultsI sr = f.getSearchResults();
49 assertEquals(sr.getSize(), 2);
50 List<SearchResultMatchI> matches = sr.getResults();
51 assertSame(al.getSequenceAt(1), matches.get(0).getSequence());
52 assertSame(al.getSequenceAt(2), matches.get(1).getSequence());
53 assertEquals(matches.get(0).getStart(), 5);
54 assertEquals(matches.get(0).getEnd(), 7);
55 assertEquals(matches.get(1).getStart(), 4);
56 assertEquals(matches.get(1).getEnd(), 6);
60 * Test for (undocumented) find residue by position
62 @Test(groups = "Functional")
63 public void testFind_residueNumber()
65 Finder f = new Finder(al, null);
69 // seq1 and seq4 have 9 residues; no match in other sequences
70 SearchResultsI sr = f.getSearchResults();
71 assertEquals(sr.getSize(), 2);
72 List<SearchResultMatchI> matches = sr.getResults();
73 assertSame(al.getSequenceAt(0), matches.get(0).getSequence());
74 assertSame(al.getSequenceAt(3), matches.get(1).getSequence());
75 assertEquals(matches.get(0).getStart(), 9);
76 assertEquals(matches.get(0).getEnd(), 9);
77 assertEquals(matches.get(1).getStart(), 9);
78 assertEquals(matches.get(1).getEnd(), 9);
82 * Test for find next action
84 @Test(groups = "Functional")
85 public void testFindNext()
88 * start at second sequence; resIndex of -1
89 * means sequence id / description is searched
91 Finder f = new Finder(al, null, 1, -1);
92 f.find("e"); // matches id
94 assertTrue(f.getSearchResults().isEmpty());
95 assertEquals(f.getIdMatch().size(), 1);
96 assertSame(f.getIdMatch().get(0), al.getSequenceAt(1));
98 // resIndex is now 0 - for use in next find next
99 assertEquals(f.getResIndex(), 0);
100 f = new Finder(al, null, 1, 0);
101 f.find("e"); // matches in sequence
102 assertTrue(f.getIdMatch().isEmpty());
103 assertEquals(f.getSearchResults().getSize(), 1);
104 List<SearchResultMatchI> matches = f.getSearchResults().getResults();
105 assertEquals(matches.get(0).getStart(), 5);
106 assertEquals(matches.get(0).getEnd(), 5);
107 assertSame(matches.get(0).getSequence(), al.getSequenceAt(1));
108 // still in the second sequence
109 assertEquals(f.getSeqIndex(), 1);
110 // next residue position to search from is 5
111 // (used as base 0 by RegEx so the same as 6 if base 1)
112 assertEquals(f.getResIndex(), 5);
114 // find next from end of sequence - finds next sequence id
115 f = new Finder(al, null, 1, 5);
117 assertEquals(f.getIdMatch().size(), 1);
118 assertSame(f.getIdMatch().get(0), al.getSequenceAt(2));
122 * Test for matching within sequence descriptions
124 @Test(groups = "Functional")
125 public void testFindAll_inDescription()
127 AlignmentI al2 = new Alignment(al);
128 al2.getSequenceAt(0).setDescription("BRAF");
129 al2.getSequenceAt(1).setDescription("braf");
130 Finder f = new Finder(al2, null);
132 f.setIncludeDescription(true);
135 assertEquals(f.getIdMatch().size(), 2);
136 assertSame(f.getIdMatch().get(0), al2.getSequenceAt(0));
137 assertSame(f.getIdMatch().get(1), al2.getSequenceAt(1));
138 assertTrue(f.getSearchResults().isEmpty());
143 f = new Finder(al2, null);
145 f.setCaseSensitive(true);
146 f.setIncludeDescription(true);
149 assertEquals(f.getIdMatch().size(), 1);
150 assertSame(f.getIdMatch().get(0), al2.getSequenceAt(0));
151 assertTrue(f.getSearchResults().isEmpty());
154 * match sequence id, description and sequence!
156 al2.getSequenceAt(0).setDescription("the efh sequence");
157 al2.getSequenceAt(0).setName("mouseEFHkinase");
158 al2.getSequenceAt(1).setName("humanEFHkinase");
159 f = new Finder(al2, null);
161 f.setIncludeDescription(true);
164 * sequence matches should have no duplicates
167 assertEquals(f.getIdMatch().size(), 2);
168 assertSame(f.getIdMatch().get(0), al2.getSequenceAt(0));
169 assertSame(f.getIdMatch().get(1), al2.getSequenceAt(1));
171 assertEquals(f.getSearchResults().getSize(), 2);
172 SearchResultMatchI match = f.getSearchResults().getResults().get(0);
173 assertSame(al2.getSequenceAt(1), match.getSequence());
174 assertEquals(5, match.getStart());
175 assertEquals(7, match.getEnd());
176 match = f.getSearchResults().getResults().get(1);
177 assertSame(al2.getSequenceAt(2), match.getSequence());
178 assertEquals(4, match.getStart());
179 assertEquals(6, match.getEnd());
183 * Test for matching within sequence ids
185 @Test(groups = "Functional")
186 public void testFindAll_sequenceIds()
188 Finder f = new Finder(al, null);
195 assertEquals(f.getIdMatch().size(), 1);
196 assertSame(f.getIdMatch().get(0), al.getSequenceAt(0));
197 assertTrue(f.getSearchResults().isEmpty());
202 f = new Finder(al, null);
204 f.setCaseSensitive(true);
206 assertTrue(f.getSearchResults().isEmpty());
209 * match both sequence id and sequence
211 AlignmentI al2 = new Alignment(al);
212 al2.addSequence(new Sequence("aBz", "xyzabZpqrAbZ"));
213 f = new Finder(al2, null);
216 assertEquals(f.getIdMatch().size(), 1);
217 assertSame(f.getIdMatch().get(0), al2.getSequenceAt(4));
218 assertEquals(f.getSearchResults().getSize(), 2);
219 SearchResultMatchI match = f.getSearchResults().getResults().get(0);
220 assertSame(al2.getSequenceAt(4), match.getSequence());
221 assertEquals(4, match.getStart());
222 assertEquals(6, match.getEnd());
223 match = f.getSearchResults().getResults().get(1);
224 assertSame(al2.getSequenceAt(4), match.getSequence());
225 assertEquals(10, match.getStart());
226 assertEquals(12, match.getEnd());
230 * Test finding all matches of a sequence pattern in an alignment
232 @Test(groups = "Functional")
233 public void testFindAll_simpleMatch()
235 Finder f = new Finder(al, null);
239 * case insensitive first
242 SearchResultsI searchResults = f.getSearchResults();
243 assertEquals(searchResults.getSize(), 2);
244 SearchResultMatchI match = searchResults.getResults().get(0);
245 assertSame(al.getSequenceAt(1), match.getSequence());
246 assertEquals(5, match.getStart());
247 assertEquals(7, match.getEnd());
248 match = searchResults.getResults().get(1);
249 assertSame(al.getSequenceAt(2), match.getSequence());
250 assertEquals(4, match.getStart());
251 assertEquals(6, match.getEnd());
256 f = new Finder(al, null);
258 f.setCaseSensitive(true);
260 searchResults = f.getSearchResults();
261 assertEquals(searchResults.getSize(), 2);
262 match = searchResults.getResults().get(0);
263 assertSame(al.getSequenceAt(0), match.getSequence());
264 assertEquals(2, match.getStart());
265 assertEquals(3, match.getEnd());
266 match = searchResults.getResults().get(1);
267 assertSame(al.getSequenceAt(1), match.getSequence());
268 assertEquals(2, match.getStart());
269 assertEquals(3, match.getEnd());
273 * Test for JAL-2302 to verify that sub-matches are not included in a find all
276 @Test(groups = "Functional")
277 public void testFind_maximalResultOnly()
279 Finder f = new Finder(al, null);
282 SearchResultsI searchResults = f.getSearchResults();
283 assertEquals(searchResults.getSize(), 1);
284 SearchResultMatchI match = searchResults.getResults().get(0);
285 assertSame(al.getSequenceAt(3), match.getSequence());
286 assertEquals(4, match.getStart()); // dataset sequence positions
287 assertEquals(8, match.getEnd()); // base 1