+ assertSame(match.getSequence(), al.getSequenceAt(3));
+ assertEquals(match.getStart(), 1);
+ assertEquals(match.getEnd(), 3);
+ match = searchResults.getResults().get(1);
+ assertSame(match.getSequence(), al.getSequenceAt(3));
+ assertEquals(match.getStart(), 9);
+ assertEquals(match.getEnd(), 11);
+
+ /*
+ * hide 2-4 (CD- -BC bcd ---)
+ */
+ hc.hideColumns(2, 4);
+
+ /*
+ * find all search for D should ignore hidden positions in seq1 and seq3,
+ * find the visible D in seq2
+ */
+ f = new Finder(av);
+ f.findAll("D", false, false, false, false);
+ searchResults = f.getSearchResults();
+ assertEquals(searchResults.getCount(), 1);
+ match = searchResults.getResults().get(0);
+ assertSame(match.getSequence(), al.getSequenceAt(1));
+ assertEquals(match.getStart(), 4);
+ assertEquals(match.getEnd(), 4);
+
+ /*
+ * search for AD should fail although these are now
+ * consecutive in the visible columns
+ */
+ f = new Finder(av);
+ f.findAll("AD", false, false, false, false);
+ searchResults = f.getSearchResults();
+ assertTrue(searchResults.isEmpty());
+
+ /*
+ * find all 'aaa' should find both start and end of seq4
+ * (first run includes hidden gaps)
+ */
+ f = new Finder(av);
+ f.findAll("aaa", false, false, false, false);
+ searchResults = f.getSearchResults();
+ assertEquals(searchResults.getCount(), 2);
+ match = searchResults.getResults().get(0);
+ assertSame(match.getSequence(), al.getSequenceAt(3));
+ assertEquals(match.getStart(), 1);
+ assertEquals(match.getEnd(), 3);
+ match = searchResults.getResults().get(1);
+ assertSame(match.getSequence(), al.getSequenceAt(3));
+ assertEquals(match.getStart(), 9);
+ assertEquals(match.getEnd(), 11);
+
+ /*
+ * hide columns 2-5:
+ * find all 'aaa' should match twice in seq4
+ * (first match partly hidden, second all visible)
+ */
+ hc.hideColumns(2, 5);
+ f = new Finder(av);
+ f.findAll("aaa", false, false, false, false);
+ searchResults = f.getSearchResults();
+ assertEquals(searchResults.getCount(), 2);
+ match = searchResults.getResults().get(0);
+ assertSame(match.getSequence(), al.getSequenceAt(3));
+ assertEquals(match.getStart(), 1);
+ assertEquals(match.getEnd(), 3);
+ match = searchResults.getResults().get(1);
+ assertSame(match.getSequence(), al.getSequenceAt(3));
+ assertEquals(match.getStart(), 9);
+ assertEquals(match.getEnd(), 11);
+
+ /*
+ * find all 'BE' should not match across hidden columns in seq1
+ */
+ f.findAll("BE", false, false, false, false);
+ assertTrue(f.getSearchResults().isEmpty());
+
+ /*
+ * boundary case: hide columns at end of alignment
+ * search for H should match seq3/6 only
+ */
+ hc.revealAllHiddenColumns(new ColumnSelection());
+ hc.hideColumns(8, 13);
+ f = new Finder(av);
+ f.findNext("H", false, false, false, false);
+ searchResults = f.getSearchResults();
+ assertEquals(searchResults.getCount(), 1);
+ match = searchResults.getResults().get(0);
+ assertSame(match.getSequence(), al.getSequenceAt(2));
+ assertEquals(match.getStart(), 6);
+ assertEquals(match.getEnd(), 6);
+ }
+
+ @Test(groups = "Functional")
+ public void testFind_withHiddenColumnsAndSelection()
+ {
+ /*
+ * 0 5 9
+ * ABCD--EF-GHI
+ * A--BCDefHI
+ * --bcdEFH
+ * aa---aMMMMMaaa
+ */
+
+ /*
+ * hide columns 2-4 and 6-7
+ */
+ HiddenColumns hc = new HiddenColumns();
+ hc.hideColumns(2, 4);
+ hc.hideColumns(6, 7);
+ al.setHiddenColumns(hc);
+
+ /*
+ * select rows 2-3
+ */
+ SequenceGroup sg = new SequenceGroup();
+ sg.addSequence(al.getSequenceAt(1), false);
+ sg.addSequence(al.getSequenceAt(2), false);
+ sg.setStartRes(0);
+ sg.setEndRes(13);
+ av.setSelectionGroup(sg);
+
+ /*
+ * find all search for A or H
+ * should match seq2/1, seq2/7, not seq3/6
+ */
+ Finder f = new Finder(av);
+ f.findAll("[AH]", false, false, false, false);
+ SearchResultsI searchResults = f.getSearchResults();
+ assertEquals(searchResults.getCount(), 2);
+ SearchResultMatchI match = searchResults.getResults().get(0);
+ assertSame(match.getSequence(), al.getSequenceAt(1));
+ assertEquals(match.getStart(), 1);
+ assertEquals(match.getEnd(), 1);
+ match = searchResults.getResults().get(1);
+ assertSame(match.getSequence(), al.getSequenceAt(1));
+ assertEquals(match.getStart(), 7);
+ assertEquals(match.getEnd(), 7);
+ }
+
+ @Test(groups = "Functional")
+ public void testFind_ignoreHiddenColumns()
+ {
+ /*
+ * 0 5 9
+ * ABCD--EF-GHI
+ * A--BCDefHI
+ * --bcdEFH
+ * aa---aMMMMMaaa
+ */
+ HiddenColumns hc = new HiddenColumns();
+ hc.hideColumns(2, 4);
+ hc.hideColumns(7, 7);
+ al.setHiddenColumns(hc);
+
+ /*
+ * now have
+ * 015689
+ * AB-E-GHI
+ * A-DeHI
+ * --EF
+ * aaaMMMMaaa
+ */
+ Finder f = new Finder(av);
+ f.findAll("abe", false, false, false, true); // true = ignore hidden
+ SearchResultsI searchResults = f.getSearchResults();
+
+ /*
+ * match of seq1 ABE made up of AB and E
+ * note only one match is counted
+ */
+ assertEquals(searchResults.getCount(), 1);
+ assertEquals(searchResults.getResults().size(), 2);
+ SearchResultMatchI 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 = 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());
+