+ assertSame(match.getSequence(), al.getSequenceAt(0));
+ assertEquals(match.getStart(), 8); // A
+ assertEquals(match.getEnd(), 9); // B
+ match = searchResults.getResults().get(1);
+ assertSame(match.getSequence(), al.getSequenceAt(0));
+ assertEquals(match.getStart(), 12); // E
+ assertEquals(match.getEnd(), 12);
+
+ f = new Finder(av);
+ f.findNext("a.E", false, false, false, true);
+ searchResults = f.getSearchResults();
+ assertEquals(searchResults.getCount(), 1);
+ assertEquals(searchResults.getResults().size(), 2);
+ match = searchResults.getResults().get(0);
+ assertSame(match.getSequence(), al.getSequenceAt(0));
+ assertEquals(match.getStart(), 8); // A
+ assertEquals(match.getEnd(), 9); // B
+ match = searchResults.getResults().get(1);
+ assertSame(match.getSequence(), al.getSequenceAt(0));
+ assertEquals(match.getStart(), 12); // E
+ assertEquals(match.getEnd(), 12);
+
+ f.findNext("a.E", false, false, false, true);
+ searchResults = f.getSearchResults();
+ assertEquals(searchResults.getCount(), 1);
+ assertEquals(searchResults.getResults().size(), 2);
+ match = searchResults.getResults().get(0);
+ assertSame(match.getSequence(), al.getSequenceAt(1));
+ assertEquals(match.getStart(), 1); // a
+ assertEquals(match.getEnd(), 1);
+ match = searchResults.getResults().get(1);
+ assertSame(match.getSequence(), al.getSequenceAt(1));
+ assertEquals(match.getStart(), 4); // D
+ assertEquals(match.getEnd(), 5); // e
+
+ /*
+ * find all matching across two hidden column regions
+ * note one 'match' is returned as three contiguous matches
+ */
+ f.findAll("BEG", false, false, false, true);
+ searchResults = f.getSearchResults();
+ assertEquals(searchResults.getCount(), 1);
+ assertEquals(searchResults.getResults().size(), 3);
+ match = searchResults.getResults().get(0);
+ assertSame(match.getSequence(), al.getSequenceAt(0));
+ assertEquals(match.getStart(), 9); // B
+ assertEquals(match.getEnd(), 9);
+ match = searchResults.getResults().get(1);
+ assertSame(match.getSequence(), al.getSequenceAt(0));
+ assertEquals(match.getStart(), 12); // E
+ assertEquals(match.getEnd(), 12);
+ match = searchResults.getResults().get(2);
+ assertSame(match.getSequence(), al.getSequenceAt(0));
+ assertEquals(match.getStart(), 14); // G
+ assertEquals(match.getEnd(), 14);
+
+ /*
+ * now select columns 0-9 and search for A.*H
+ * this should match in the second sequence (split as 3 matches)
+ * but not the first (as H is outside the selection)
+ */
+ SequenceGroup selection = new SequenceGroup();
+ selection.setStartRes(0);
+ selection.setEndRes(9);
+ al.getSequences().forEach(seq -> selection.addSequence(seq, false));
+ av.setSelectionGroup(selection);
+ f.findAll("A.*H", false, false, false, true);
+ searchResults = f.getSearchResults();
+ assertEquals(searchResults.getCount(), 1);
+ assertEquals(searchResults.getResults().size(), 3);
+ // match made of contiguous matches A, DE, H
+ match = searchResults.getResults().get(0);
+ assertSame(match.getSequence(), al.getSequenceAt(1));
+ assertEquals(match.getStart(), 1); // A
+ assertEquals(match.getEnd(), 1);
+ match = searchResults.getResults().get(1);
+ assertSame(match.getSequence(), al.getSequenceAt(1));
+ assertEquals(match.getStart(), 4); // D
+ assertEquals(match.getEnd(), 5); // E
+ match = searchResults.getResults().get(2);
+ assertSame(match.getSequence(), al.getSequenceAt(1));
+ assertEquals(match.getStart(), 7); // H (there is no G)
+ assertEquals(match.getEnd(), 7);
+ }
+
+ @Test(groups = "Functional")
+ public void testFind_featuresOnly()
+ {
+ Finder f = new Finder(av);
+ // no match when not searching feature descriptions
+ f.findAll("Feature", false, false, false, true);
+ assertEquals(f.getSearchResults().getCount(), 0);
+
+ // no match when case sensitive on feature descriptions
+ f.findAll("feature", true, false, true, true);
+ assertEquals(f.getSearchResults().getCount(), 0);
+
+ // search feature descriptions - all match
+ f.findAll("Feature", false, false, true, true);
+ assertEquals(f.getSearchResults().getCount(), 3);
+
+ List<SequenceI> seqs = f.getSearchResults().getMatchingSubSequences();
+ // assume order is preserved in results
+ assertEquals(al.getSequenceAt(0).getDatasetSequence(),
+ seqs.get(0).getDatasetSequence());
+ assertEquals(seqs.get(0).getStart(), 9);
+ assertEquals(seqs.get(0).getEnd(), 11);
+ assertEquals(al.getSequenceAt(3).getDatasetSequence(),
+ seqs.get(1).getDatasetSequence());
+ assertEquals(seqs.get(1).getStart(), 9);
+ assertEquals(seqs.get(1).getEnd(), 11);
+ assertEquals(al.getSequenceAt(3).getDatasetSequence(),
+ seqs.get(2).getDatasetSequence());
+ assertEquals(seqs.get(2).getStart(), 1);
+ assertEquals(seqs.get(2).getEnd(), 3);
+
+ SequenceI sq = null;
+ // search feature descriptions incrementally
+ // assume same order as before
+ f.findNext("Feature", false, false, true, true);
+ assertEquals(f.getSearchResults().getCount(), 1);
+ sq = f.getSearchResults().getMatchingSubSequences().get(0);
+ assertEquals(sq.getSequenceAsString(),
+ seqs.get(0).getSequenceAsString());
+
+ // ..
+ f.findNext("Feature", false, false, true, true);
+ assertEquals(f.getSearchResults().getCount(), 1);
+ sq = f.getSearchResults().getMatchingSubSequences().get(0);
+ assertEquals(sq.getSequenceAsString(),
+ seqs.get(1).getSequenceAsString());
+
+ // ..
+ f.findNext("Feature", false, false, true, true);
+ assertEquals(f.getSearchResults().getCount(), 1);
+ sq = f.getSearchResults().getMatchingSubSequences().get(0);
+ assertEquals(sq.getSequenceAsString(),
+ seqs.get(2).getSequenceAsString());
+