@@ -61,29 +61,29 @@ public void testReservoirDownsampler(final ReservoirDownsamplerTest test ) {
61
61
logger .warn ("Running test: " + test );
62
62
63
63
Utils .resetRandomGenerator ();
64
-
65
64
final ReadsDownsampler downsampler = new ReservoirDownsampler (test .reservoirSize );
66
-
67
65
downsampler .submit (test .createReads ());
68
66
67
+ // after submit, but before signalEndOfInput, all reads are pending, none are finalized
69
68
if ( test .totalReads > 0 ) {
70
- Assert .assertTrue (downsampler .hasFinalizedItems ());
71
- Assert .assertTrue (downsampler .peekFinalized () != null );
72
- Assert .assertFalse (downsampler .hasPendingItems ());
73
- Assert .assertTrue (downsampler .peekPending () == null );
69
+ Assert .assertFalse (downsampler .hasFinalizedItems ());
70
+ Assert .assertNull (downsampler .peekFinalized ());
71
+ Assert .assertTrue (downsampler .hasPendingItems ());
72
+ Assert .assertNotNull (downsampler .peekPending ());
74
73
}
75
74
else {
76
75
Assert .assertFalse (downsampler .hasFinalizedItems () || downsampler .hasPendingItems ());
77
76
Assert .assertTrue (downsampler .peekFinalized () == null && downsampler .peekPending () == null );
78
77
}
79
78
79
+ // after signalEndOfInput, no reads are pending, all are finalized
80
80
downsampler .signalEndOfInput ();
81
81
82
82
if ( test .totalReads > 0 ) {
83
83
Assert .assertTrue (downsampler .hasFinalizedItems ());
84
- Assert .assertTrue (downsampler .peekFinalized () != null );
84
+ Assert .assertNotNull (downsampler .peekFinalized ());
85
85
Assert .assertFalse (downsampler .hasPendingItems ());
86
- Assert .assertTrue (downsampler .peekPending () == null );
86
+ Assert .assertNull (downsampler .peekPending ());
87
87
}
88
88
else {
89
89
Assert .assertFalse (downsampler .hasFinalizedItems () || downsampler .hasPendingItems ());
@@ -102,6 +102,19 @@ public void testReservoirDownsampler(final ReservoirDownsamplerTest test ) {
102
102
103
103
downsampler .resetStats ();
104
104
Assert .assertEquals (downsampler .getNumberOfDiscardedItems (), 0 );
105
+
106
+ // use the same downsampling parameters, but this time consume the reads through a
107
+ // ReadsDownsamplingIterator, and validate that we get the same results as using downsampler directly
108
+ Utils .resetRandomGenerator ();
109
+ final ReadsDownsampler downsamplerForIterator = new ReservoirDownsampler (test .reservoirSize );
110
+ final ReadsDownsamplingIterator downsamplingIterator = new ReadsDownsamplingIterator (
111
+ test .createReads ().iterator (),
112
+ downsamplerForIterator );
113
+ final List <GATKRead > downsampledReadsFromIterator = new ArrayList <>(test .reservoirSize );
114
+ downsamplingIterator .forEach (downsampledReadsFromIterator ::add );
115
+
116
+ Assert .assertEquals (downsamplerForIterator .getNumberOfDiscardedItems (), test .expectedNumDiscardedItems );
117
+ Assert .assertEquals (downsampledReadsFromIterator , downsampledReads );
105
118
}
106
119
107
120
@ Test (expectedExceptions = IllegalArgumentException .class )
@@ -129,4 +142,61 @@ public void testNoNullSignalNoMoreReadsBefore() throws Exception {
129
142
ReadsDownsampler rd = new ReservoirDownsampler (1 , true );
130
143
rd .signalNoMoreReadsBefore (null );
131
144
}
145
+
146
+ // Calling consumeFinalizeItems() before end of input on a non-empty downsampler should
147
+ // return an empty List and not change the state of the downsampler:
148
+ @ Test
149
+ public void testConsumeFinalizedItemsBeforeEndOfInput () {
150
+ final ReservoirDownsampler downsampler = new ReservoirDownsampler (10 , true );
151
+ final GATKRead read = ArtificialReadUtils .createArtificialRead ("100M" );
152
+ downsampler .submit (read );
153
+
154
+ Assert .assertFalse (downsampler .hasFinalizedItems ());
155
+ Assert .assertTrue (downsampler .hasPendingItems ());
156
+
157
+ final List <GATKRead > returnedReads = downsampler .consumeFinalizedItems ();
158
+ Assert .assertTrue (returnedReads .isEmpty ());
159
+
160
+ // The downsampler should still have pending reads after the call to consumeFinalizedItems()
161
+ // (ie., the downsampling process should still be ongoing, and the state of the downsampler
162
+ // should have been preserved):
163
+ Assert .assertFalse (downsampler .hasFinalizedItems ());
164
+ Assert .assertTrue (downsampler .hasPendingItems ());
165
+ }
166
+
167
+ // Calling consumeFinalizedItems() after end of input on an empty downsampler should
168
+ // return an empty List and reset the end of input flag in the downsampler:
169
+ @ Test
170
+ public void testConsumeFinalizedItemsAfterEndOfInputOnEmptyDownsampler () {
171
+ final ReservoirDownsampler downsampler = new ReservoirDownsampler (10 , true );
172
+
173
+ Assert .assertFalse (downsampler .hasFinalizedItems ());
174
+ Assert .assertFalse (downsampler .hasPendingItems ());
175
+
176
+ downsampler .signalEndOfInput ();
177
+
178
+ final List <GATKRead > returnedReads = downsampler .consumeFinalizedItems ();
179
+ Assert .assertTrue (returnedReads .isEmpty ());
180
+
181
+ Assert .assertFalse (downsampler .hasFinalizedItems ());
182
+ Assert .assertFalse (downsampler .hasPendingItems ());
183
+
184
+ // Submitting an additional read after both signalEndOfInput() and consumeFinalizedItems()
185
+ // should succeed (not throw), since the call to consumeFinalizedItems() should reset the
186
+ // end of input flag:
187
+ final GATKRead read = ArtificialReadUtils .createArtificialRead ("100M" );
188
+ downsampler .submit (read );
189
+
190
+ Assert .assertFalse (downsampler .hasFinalizedItems ());
191
+ Assert .assertTrue (downsampler .hasPendingItems ());
192
+ }
193
+
194
+ // Calling submit() directly after signalEndOfInput() should throw:
195
+ @ Test (expectedExceptions = IllegalStateException .class )
196
+ public void testSubmitAfterEndOfInputThrows () {
197
+ final ReservoirDownsampler downsampler = new ReservoirDownsampler (10 , true );
198
+ downsampler .signalEndOfInput ();
199
+ final GATKRead read = ArtificialReadUtils .createArtificialRead ("100M" );
200
+ downsampler .submit (read );
201
+ }
132
202
}
0 commit comments