import jalview.bin.Cache;
import jalview.datamodel.Alignment;
import jalview.datamodel.AlignmentI;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.HiddenColumns;
import jalview.datamodel.SearchResultMatchI;
import jalview.datamodel.SearchResultsI;
import jalview.datamodel.Sequence;
Cache.applicationProperties.setProperty("PAD_GAPS",
Boolean.FALSE.toString());
- String seqData = "seq1seq1/8-16 ABCD--EF-GHI\n" + "seq2 A--BCDefHI\n"
+ String seqData = "seq1seq1/8-18 ABCD--EF-GHIJI\n" + "seq2 A--BCDefHI\n"
+ "seq3 --bcdEFH\n" + "seq4 aa---aMMMMMaaa\n";
af = new FileLoader().LoadFileWaitTillLoaded(seqData,
DataSourceType.PASTE);
SearchResultsI sr = f.getSearchResults();
assertEquals(sr.getSize(), 1);
List<SearchResultMatchI> matches = sr.getResults();
- assertSame(al.getSequenceAt(1), matches.get(0).getSequence());
+ assertSame(matches.get(0).getSequence(), al.getSequenceAt(1));
assertEquals(matches.get(0).getStart(), 5);
assertEquals(matches.get(0).getEnd(), 7);
sr = f.getSearchResults();
assertEquals(sr.getSize(), 2);
matches = sr.getResults();
- assertSame(al.getSequenceAt(1), matches.get(0).getSequence());
- assertSame(al.getSequenceAt(2), matches.get(1).getSequence());
+ assertSame(matches.get(0).getSequence(), al.getSequenceAt(1));
+ assertSame(matches.get(1).getSequence(), al.getSequenceAt(2));
assertEquals(matches.get(0).getStart(), 5);
assertEquals(matches.get(0).getEnd(), 7);
assertEquals(matches.get(1).getStart(), 4);
SearchResultsI sr = f.getSearchResults();
assertEquals(sr.getSize(), 1);
List<SearchResultMatchI> matches = sr.getResults();
- assertSame(al.getSequenceAt(0), matches.get(0).getSequence());
+ assertSame(matches.get(0).getSequence(), al.getSequenceAt(0));
assertEquals(matches.get(0).getStart(), 9);
assertEquals(matches.get(0).getEnd(), 9);
sr = f.getSearchResults();
assertEquals(sr.getSize(), 2);
matches = sr.getResults();
- assertSame(al.getSequenceAt(0), matches.get(0).getSequence());
- assertSame(al.getSequenceAt(3), matches.get(1).getSequence());
+ assertSame(matches.get(0).getSequence(), al.getSequenceAt(0));
+ assertSame(matches.get(1).getSequence(), al.getSequenceAt(3));
assertEquals(matches.get(0).getStart(), 9);
assertEquals(matches.get(0).getEnd(), 9);
assertEquals(matches.get(1).getStart(), 9);
public void testFindNext()
{
/*
- * start at second sequence; resIndex of -1
+ * start at second sequence; colIndex of -1
* means sequence id / description is searched
*/
Finder f = new Finder(al, null, 1, -1);
assertEquals(f.getIdMatch().size(), 1);
assertSame(f.getIdMatch().get(0), al.getSequenceAt(1));
- // resIndex is now 0 - for use in next find next
- assertEquals(f.getResIndex(), 0);
+ // colIndex is now 0 - for use in next find next
+ // searching A--BCDefHI
+ assertEquals(f.getColumnIndex(), 0);
f = new Finder(al, null, 1, 0);
f.find("e"); // matches in sequence
assertTrue(f.getIdMatch().isEmpty());
assertEquals(matches.get(0).getEnd(), 5);
assertSame(matches.get(0).getSequence(), al.getSequenceAt(1));
// still in the second sequence
- assertEquals(f.getSeqIndex(), 1);
- // next residue position to search from is 5
- // (used as base 0 by RegEx so the same as 6 if base 1)
- assertEquals(f.getResIndex(), 5);
+ assertEquals(f.getSequenceIndex(), 1);
+ // next column position to search from is 7
+ assertEquals(f.getColumnIndex(), 7);
// find next from end of sequence - finds next sequence id
- f = new Finder(al, null, 1, 5);
+ f = new Finder(al, null, 1, 7);
f.find("e");
assertEquals(f.getIdMatch().size(), 1);
assertSame(f.getIdMatch().get(0), al.getSequenceAt(2));
+ assertTrue(f.getSearchResults().isEmpty());
}
/**
assertEquals(f.getSearchResults().getSize(), 2);
SearchResultMatchI match = f.getSearchResults().getResults().get(0);
- assertSame(al2.getSequenceAt(1), match.getSequence());
- assertEquals(5, match.getStart());
- assertEquals(7, match.getEnd());
+ assertSame(match.getSequence(), al2.getSequenceAt(1));
+ assertEquals(match.getStart(), 5);
+ assertEquals(match.getEnd(), 7);
match = f.getSearchResults().getResults().get(1);
- assertSame(al2.getSequenceAt(2), match.getSequence());
- assertEquals(4, match.getStart());
- assertEquals(6, match.getEnd());
+ assertSame(match.getSequence(), al2.getSequenceAt(2));
+ assertEquals(match.getStart(), 4);
+ assertEquals(match.getEnd(), 6);
}
/**
f.find("SEQ1");
assertEquals(f.getIdMatch().size(), 1);
assertSame(f.getIdMatch().get(0), al.getSequenceAt(0));
- assertTrue(f.getSearchResults().isEmpty());
+ SearchResultsI searchResults = f.getSearchResults();
+ assertTrue(searchResults.isEmpty());
/*
* case sensitive
f.setFindAll(true);
f.setCaseSensitive(true);
f.find("SEQ1");
- assertTrue(f.getSearchResults().isEmpty());
+ searchResults = f.getSearchResults();
+ assertTrue(searchResults.isEmpty());
/*
* match both sequence id and sequence
f.find("ABZ");
assertEquals(f.getIdMatch().size(), 1);
assertSame(f.getIdMatch().get(0), al2.getSequenceAt(4));
- assertEquals(f.getSearchResults().getSize(), 2);
- SearchResultMatchI match = f.getSearchResults().getResults().get(0);
- assertSame(al2.getSequenceAt(4), match.getSequence());
- assertEquals(4, match.getStart());
- assertEquals(6, match.getEnd());
- match = f.getSearchResults().getResults().get(1);
- assertSame(al2.getSequenceAt(4), match.getSequence());
- assertEquals(10, match.getStart());
- assertEquals(12, match.getEnd());
+ searchResults = f.getSearchResults();
+ assertEquals(searchResults.getSize(), 2);
+ SearchResultMatchI match = searchResults.getResults().get(0);
+ assertSame(match.getSequence(), al2.getSequenceAt(4));
+ assertEquals(match.getStart(), 4);
+ assertEquals(match.getEnd(), 6);
+ match = searchResults.getResults().get(1);
+ assertSame(match.getSequence(), al2.getSequenceAt(4));
+ assertEquals(match.getStart(), 10);
+ assertEquals(match.getEnd(), 12);
}
/**
* Test finding next match of a sequence pattern in an alignment
*/
@Test(groups = "Functional")
- public void testFind()
+ public void testFind_findNext()
{
+ /*
+ * efh should be matched in seq2 only
+ */
Finder f = new Finder(al, null);
f.find("EfH");
SearchResultsI searchResults = f.getSearchResults();
assertEquals(searchResults.getSize(), 1);
SearchResultMatchI match = searchResults.getResults().get(0);
- assertSame(al.getSequenceAt(1), match.getSequence());
- assertEquals(5, match.getStart());
- assertEquals(7, match.getEnd());
+ assertSame(match.getSequence(), al.getSequenceAt(1));
+ assertEquals(match.getStart(), 5);
+ assertEquals(match.getEnd(), 7);
+
+ /*
+ * I should be found in seq1 (twice) and seq2 (once)
+ */
+ f = new Finder(al, null);
+ f.find("I"); // find next: seq1/16
+ searchResults = f.getSearchResults();
+ assertEquals(searchResults.getSize(), 1);
+ match = searchResults.getResults().get(0);
+ assertSame(match.getSequence(), al.getSequenceAt(0));
+ assertEquals(match.getStart(), 16);
+ assertEquals(match.getEnd(), 16);
+
+ f.find("I"); // find next: seq1/18
+ searchResults = f.getSearchResults();
+ assertEquals(searchResults.getSize(), 1);
+ match = searchResults.getResults().get(0);
+ assertSame(match.getSequence(), al.getSequenceAt(0));
+ assertEquals(match.getStart(), 18);
+ assertEquals(match.getEnd(), 18);
+
+ f.find("I"); // find next: seq2/8
+ searchResults = f.getSearchResults();
+ assertEquals(searchResults.getSize(), 1);
+ match = searchResults.getResults().get(0);
+ assertSame(match.getSequence(), al.getSequenceAt(1));
+ assertEquals(match.getStart(), 8);
+ assertEquals(match.getEnd(), 8);
+
+ f.find("I");
+ assertTrue(f.getSearchResults().isEmpty());
}
/**
SearchResultsI searchResults = f.getSearchResults();
assertEquals(searchResults.getSize(), 1);
SearchResultMatchI match = searchResults.getResults().get(0);
- assertSame(al.getSequenceAt(3), match.getSequence());
- assertEquals(4, match.getStart()); // dataset sequence positions
- assertEquals(8, match.getEnd()); // base 1
+ assertSame(match.getSequence(), al.getSequenceAt(3));
+ assertEquals(match.getStart(), 4); // dataset sequence positions
+ assertEquals(match.getEnd(), 8); // base 1
}
/**
SearchResultsI searchResults = f.getSearchResults();
assertEquals(searchResults.getSize(), 2);
SearchResultMatchI match = searchResults.getResults().get(0);
- assertSame(al.getSequenceAt(1), match.getSequence());
- assertEquals(5, match.getStart());
- assertEquals(7, match.getEnd());
+ assertSame(match.getSequence(), al.getSequenceAt(1));
+ assertEquals(match.getStart(), 5);
+ assertEquals(match.getEnd(), 7);
+ match = searchResults.getResults().get(1);
+ assertSame(match.getSequence(), al.getSequenceAt(2));
+ assertEquals(match.getStart(), 4);
+ assertEquals(match.getEnd(), 6);
+
+ /*
+ * find all I should find 2 positions in seq1, 1 in seq2
+ */
+ f.find("I");
+ searchResults = f.getSearchResults();
+ assertEquals(searchResults.getSize(), 3);
+ match = searchResults.getResults().get(0);
+ assertSame(match.getSequence(), al.getSequenceAt(0));
+ assertEquals(match.getStart(), 16);
+ assertEquals(match.getEnd(), 16);
match = searchResults.getResults().get(1);
- assertSame(al.getSequenceAt(2), match.getSequence());
- assertEquals(4, match.getStart());
- assertEquals(6, match.getEnd());
+ assertSame(match.getSequence(), al.getSequenceAt(0));
+ assertEquals(match.getStart(), 18);
+ assertEquals(match.getEnd(), 18);
+ match = searchResults.getResults().get(2);
+ assertSame(match.getSequence(), al.getSequenceAt(1));
+ assertEquals(match.getStart(), 8);
+ assertEquals(match.getEnd(), 8);
}
/**
Finder f = new Finder(al, null);
f.setCaseSensitive(true);
f.setFindAll(true);
+
+ /*
+ * BC should match seq1/9-10 and seq2/2-3
+ */
f.find("BC");
SearchResultsI searchResults = f.getSearchResults();
assertEquals(searchResults.getSize(), 2);
SearchResultMatchI match = searchResults.getResults().get(0);
- assertSame(al.getSequenceAt(0), match.getSequence());
+ assertSame(match.getSequence(), al.getSequenceAt(0));
assertEquals(match.getStart(), 9);
assertEquals(match.getEnd(), 10);
match = searchResults.getResults().get(1);
- assertSame(al.getSequenceAt(1), match.getSequence());
+ assertSame(match.getSequence(), al.getSequenceAt(1));
assertEquals(match.getStart(), 2);
assertEquals(match.getEnd(), 3);
+
+ /*
+ * bc should match seq3/1-2
+ */
+ f = new Finder(al, null);
+ f.setCaseSensitive(true);
+ f.setFindAll(true);
+ f.find("bc");
+ searchResults = f.getSearchResults();
+ assertEquals(searchResults.getSize(), 1);
+ match = searchResults.getResults().get(0);
+ assertSame(match.getSequence(), al.getSequenceAt(2));
+ assertEquals(match.getStart(), 1);
+ assertEquals(match.getEnd(), 2);
+
+ f.find("bC");
+ assertTrue(f.getSearchResults().isEmpty());
}
/**
SearchResultsI searchResults = f.getSearchResults();
assertEquals(searchResults.getSize(), 1);
SearchResultMatchI match = searchResults.getResults().get(0);
- assertSame(al.getSequenceAt(1), match.getSequence());
- assertEquals(2, match.getStart());
- assertEquals(2, match.getEnd());
+ assertSame(match.getSequence(), al.getSequenceAt(1));
+ assertEquals(match.getStart(), 2);
+ assertEquals(match.getEnd(), 2);
/*
* a second Find should not return the 'b' in seq3 as outside the selection
searchResults = f.getSearchResults();
assertEquals(searchResults.getSize(), 1);
match = searchResults.getResults().get(0);
- assertSame(al.getSequenceAt(1), match.getSequence());
- assertEquals(4, match.getStart());
- assertEquals(4, match.getEnd());
+ assertSame(match.getSequence(), al.getSequenceAt(1));
+ assertEquals(match.getStart(), 4);
+ assertEquals(match.getEnd(), 4);
f.find("d");
assertTrue(f.getIdMatch().isEmpty());
searchResults = f.getSearchResults();
assertEquals(searchResults.getSize(), 1);
match = searchResults.getResults().get(0);
- assertSame(al.getSequenceAt(2), match.getSequence());
- assertEquals(3, match.getStart());
- assertEquals(3, match.getEnd());
+ assertSame(match.getSequence(), al.getSequenceAt(2));
+ assertEquals(match.getStart(), 3);
+ assertEquals(match.getEnd(), 3);
}
/**
SearchResultsI searchResults = f.getSearchResults();
assertEquals(searchResults.getSize(), 1);
SearchResultMatchI match = searchResults.getResults().get(0);
- assertSame(al.getSequenceAt(2), match.getSequence());
- assertEquals(4, match.getStart());
- assertEquals(4, match.getEnd());
+ assertSame(match.getSequence(), al.getSequenceAt(2));
+ assertEquals(match.getStart(), 4);
+ assertEquals(match.getEnd(), 4);
/*
* search for 'Q' should match two sequence ids only
SearchResultsI searchResults = f.getSearchResults();
assertEquals(searchResults.getSize(), 2);
SearchResultMatchI match = searchResults.getResults().get(0);
- assertSame(al.getSequenceAt(0), match.getSequence());
- assertEquals(16, match.getStart());
- assertEquals(16, match.getEnd());
+ assertSame(match.getSequence(), al.getSequenceAt(0));
+ assertEquals(match.getStart(), 16);
+ assertEquals(match.getEnd(), 16);
match = searchResults.getResults().get(1);
- assertSame(al.getSequenceAt(1), match.getSequence());
- assertEquals(8, match.getStart());
- assertEquals(8, match.getEnd());
+ assertSame(match.getSequence(), al.getSequenceAt(1));
+ assertEquals(match.getStart(), 8);
+ assertEquals(match.getEnd(), 8);
+ }
+
+ /**
+ * Test that find does not report hidden positions
+ */
+ @Test(groups = "Functional")
+ public void testFind_withHiddenColumns()
+ {
+ /*
+ * 0 5 9
+ * ABCD--EF-GHI
+ * A--BCDefHI
+ * --bcdEFH
+ * aa---aMMMMMaaa
+ */
+
+ /*
+ * hide 2-4 (CD- -BC bcd ---)
+ */
+ HiddenColumns hc = new HiddenColumns();
+ hc.hideColumns(2, 4);
+ al.setHiddenColumns(hc);
+
+ /*
+ * find all search for D should ignore hidden positions in seq1 and seq3,
+ * find the visible D in seq2
+ */
+ Finder f = new Finder(al, null);
+ f.setFindAll(true);
+ f.find("D");
+ SearchResultsI searchResults = f.getSearchResults();
+ assertEquals(searchResults.getSize(), 1);
+ SearchResultMatchI match = searchResults.getResults().get(0);
+ assertSame(match.getSequence(), al.getSequenceAt(1));
+ assertEquals(match.getStart(), 4);
+ assertEquals(match.getEnd(), 4);
+
+ /*
+ * hide columns 2-5:
+ * find all 'aaa' should find end of seq4 only
+ */
+ hc.hideColumns(2, 5);
+ f = new Finder(al, null);
+ f.find("aaa");
+ searchResults = f.getSearchResults();
+ assertEquals(searchResults.getSize(), 1);
+ match = searchResults.getResults().get(0);
+ 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.find("BE");
+ 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(al, null);
+ f.find("H");
+ searchResults = f.getSearchResults();
+ assertEquals(searchResults.getSize(), 1);
+ match = searchResults.getResults().get(0);
+ assertSame(match.getSequence(), al.getSequenceAt(2));
+ assertEquals(match.getStart(), 6);
+ assertEquals(match.getEnd(), 6);
}
}