|
16 | 16 | import static org.junit.Assert.*;
|
17 | 17 |
|
18 | 18 | import java.util.*;
|
| 19 | +import java.util.concurrent.TimeUnit; |
19 | 20 |
|
20 | 21 | import org.junit.*;
|
21 | 22 |
|
22 | 23 | import io.reactivex.Observable;
|
23 | 24 | import io.reactivex.ObservableSource;
|
24 | 25 | import io.reactivex.Observer;
|
25 |
| -import io.reactivex.disposables.Disposables; |
| 26 | +import io.reactivex.disposables.*; |
26 | 27 | import io.reactivex.exceptions.TestException;
|
27 | 28 | import io.reactivex.internal.operators.observable.BlockingObservableIterable.BlockingObservableIterator;
|
| 29 | +import io.reactivex.schedulers.Schedulers; |
| 30 | +import io.reactivex.subjects.PublishSubject; |
28 | 31 |
|
29 | 32 | public class BlockingObservableToIteratorTest {
|
30 | 33 |
|
@@ -119,4 +122,28 @@ public void remove() {
|
119 | 122 | BlockingObservableIterator<Integer> it = new BlockingObservableIterator<Integer>(128);
|
120 | 123 | it.remove();
|
121 | 124 | }
|
| 125 | + |
| 126 | + @Test(expected = NoSuchElementException.class) |
| 127 | + public void disposedIteratorHasNextReturns() { |
| 128 | + Iterator<Integer> it = PublishSubject.<Integer>create() |
| 129 | + .blockingIterable().iterator(); |
| 130 | + ((Disposable)it).dispose(); |
| 131 | + assertFalse(it.hasNext()); |
| 132 | + it.next(); |
| 133 | + } |
| 134 | + |
| 135 | + @Test |
| 136 | + public void asyncDisposeUnblocks() { |
| 137 | + final Iterator<Integer> it = PublishSubject.<Integer>create() |
| 138 | + .blockingIterable().iterator(); |
| 139 | + |
| 140 | + Schedulers.single().scheduleDirect(new Runnable() { |
| 141 | + @Override |
| 142 | + public void run() { |
| 143 | + ((Disposable)it).dispose(); |
| 144 | + } |
| 145 | + }, 1, TimeUnit.SECONDS); |
| 146 | + |
| 147 | + assertFalse(it.hasNext()); |
| 148 | + } |
122 | 149 | }
|
0 commit comments