Test to ensure that ReadBasedReferenceOrderedView produces stateless objects

-- Stateless objects are required for nano-scheduling.  This means you can take the RefMetaDataTracker provided by ReadBasedReferenceOrderedView, store it way, get another from the same view, and the original one behaves the same.
This commit is contained in:
Mark DePristo 2012-08-30 10:10:00 -04:00
parent ce3d1f89ea
commit 21dd70ed36
1 changed files with 44 additions and 28 deletions

View File

@ -249,21 +249,23 @@ public class ReadBasedReferenceOrderedViewUnitTest extends BaseTest {
multiSiteTests.add((ReadMetaDataTrackerRODStreamTest)singleTest[0]); multiSiteTests.add((ReadMetaDataTrackerRODStreamTest)singleTest[0]);
} }
// all pairwise tests for ( final boolean testStateless : Arrays.asList(true, false) ) {
for ( List<ReadMetaDataTrackerRODStreamTest> singleTest : Utils.makePermutations(multiSiteTests, 2, false)) { // all pairwise tests
tests.add(new Object[]{singleTest}); for ( List<ReadMetaDataTrackerRODStreamTest> singleTest : Utils.makePermutations(multiSiteTests, 2, false)) {
} tests.add(new Object[]{singleTest, testStateless});
}
// all 3 way pairwise tests // all 3 way pairwise tests
for ( List<ReadMetaDataTrackerRODStreamTest> singleTest : Utils.makePermutations(multiSiteTests, 3, false)) { for ( List<ReadMetaDataTrackerRODStreamTest> singleTest : Utils.makePermutations(multiSiteTests, 3, false)) {
tests.add(new Object[]{singleTest}); tests.add(new Object[]{singleTest, testStateless});
}
} }
return tests.toArray(new Object[][]{}); return tests.toArray(new Object[][]{});
} }
@Test(enabled = true, dataProvider = "ReadMetaDataTrackerTests", dependsOnMethods = "runReadMetaDataTrackerRODStreamTest_multipleQueries") @Test(enabled = true, dataProvider = "ReadMetaDataTrackerTests", dependsOnMethods = "runReadMetaDataTrackerRODStreamTest_multipleQueries")
public void runReadMetaDataTrackerTest(final List<ReadMetaDataTrackerRODStreamTest> RODs) { public void runReadMetaDataTrackerTest(final List<ReadMetaDataTrackerRODStreamTest> RODs, final boolean testStateless) {
final List<String> names = new ArrayList<String>(); final List<String> names = new ArrayList<String>();
final List<PeekableIterator<RODRecordList>> iterators = new ArrayList<PeekableIterator<RODRecordList>>(); final List<PeekableIterator<RODRecordList>> iterators = new ArrayList<PeekableIterator<RODRecordList>>();
final List<GenomeLoc> intervals = new ArrayList<GenomeLoc>(); final List<GenomeLoc> intervals = new ArrayList<GenomeLoc>();
@ -282,31 +284,45 @@ public class ReadBasedReferenceOrderedViewUnitTest extends BaseTest {
final GenomeLoc span = span(intervals); final GenomeLoc span = span(intervals);
final ReadBasedReferenceOrderedView view = new ReadBasedReferenceOrderedView(genomeLocParser, span, names, iterators); final ReadBasedReferenceOrderedView view = new ReadBasedReferenceOrderedView(genomeLocParser, span, names, iterators);
for ( final GenomeLoc interval : intervals ) { if ( testStateless ) {
final RefMetaDataTracker tracker = view.getReferenceOrderedDataForInterval(interval); // test each tracker is well formed, as each is created
for ( final GenomeLoc interval : intervals ) {
final RefMetaDataTracker tracker = view.getReferenceOrderedDataForInterval(interval);
testMetaDataTrackerBindings(tracker, interval, RODs, rodBindings);
}
} else {
// tests all trackers are correct after reading them into an array
// this checks that the trackers are be safely stored away and analyzed later (critical for nano-scheduling)
final List<RefMetaDataTracker> trackers = new ArrayList<RefMetaDataTracker>();
for ( final GenomeLoc interval : intervals ) {
final RefMetaDataTracker tracker = view.getReferenceOrderedDataForInterval(interval);
trackers.add(tracker);
}
for ( int i = 0; i < RODs.size(); i++ ) { for ( int i = 0; i < trackers.size(); i++) {
final ReadMetaDataTrackerRODStreamTest test = RODs.get(i); testMetaDataTrackerBindings(trackers.get(i), intervals.get(i), RODs, rodBindings);
final List<Feature> queryFeaturesList = tracker.getValues(rodBindings.get(i));
final Set<Feature> queryFeatures = new HashSet<Feature>(queryFeaturesList);
final Set<Feature> overlaps = test.getExpectedOverlaps(interval);
Assert.assertEquals(queryFeatures.size(), overlaps.size(), "IntervalOverlappingRODsFromStream didn't return the expected set of overlapping features." +
" Expected size = " + overlaps.size() + " but saw " + queryFeatures.size());
BaseTest.assertEqualsSet(queryFeatures, overlaps, "IntervalOverlappingRODsFromStream didn't return the expected set of overlapping features." +
" Expected = " + Utils.join(",", overlaps) + " but saw " + Utils.join(",", queryFeatures));
} }
} }
} }
/** private void testMetaDataTrackerBindings(final RefMetaDataTracker tracker,
* Created with IntelliJ IDEA. final GenomeLoc interval,
* User: depristo final List<ReadMetaDataTrackerRODStreamTest> RODs,
* Date: 8/29/12 final List<RodBinding<Feature>> rodBindings) {
* Time: 1:19 PM for ( int i = 0; i < RODs.size(); i++ ) {
* To change this template use File | Settings | File Templates. final ReadMetaDataTrackerRODStreamTest test = RODs.get(i);
*/ final List<Feature> queryFeaturesList = tracker.getValues(rodBindings.get(i));
final Set<Feature> queryFeatures = new HashSet<Feature>(queryFeaturesList);
final Set<Feature> overlaps = test.getExpectedOverlaps(interval);
Assert.assertEquals(queryFeatures.size(), overlaps.size(), "IntervalOverlappingRODsFromStream didn't return the expected set of overlapping features." +
" Expected size = " + overlaps.size() + " but saw " + queryFeatures.size());
BaseTest.assertEqualsSet(queryFeatures, overlaps, "IntervalOverlappingRODsFromStream didn't return the expected set of overlapping features." +
" Expected = " + Utils.join(",", overlaps) + " but saw " + Utils.join(",", queryFeatures));
}
}
static class TribbleIteratorFromCollection implements Iterator<RODRecordList> { static class TribbleIteratorFromCollection implements Iterator<RODRecordList> {
// current location // current location
private final String name; private final String name;