private void generate(int start, int count) { for (int i = 0; i < count; i++) { sourceProcessor.onNext(i + start); } }
@Override public void onNext(Integer t) { super.onNext(t); if (t == 2) { tp.onNext(3); } } };
@Test public void advancedHot() { DirectProcessor<String> hotSource = DirectProcessor.create(); Flux<String> hotFlux = hotSource.map(String::toUpperCase); hotFlux.subscribe(d -> System.out.println("Subscriber 1 to Hot Source: "+d)); hotSource.onNext("blue"); hotSource.onNext("green"); hotFlux.subscribe(d -> System.out.println("Subscriber 2 to Hot Source: "+d)); hotSource.onNext("orange"); hotSource.onNext("purple"); hotSource.onComplete(); }
@Test(expected = NullPointerException.class) public void onNextNull() { DirectProcessor.create().onNext(null); }
@Test public void allDistinctConditional() { DirectProcessor<Integer> dp = new DirectProcessor<>(); AssertSubscriber<Integer> ts = dp.distinctUntilChanged() .filter(v -> true) .subscribeWith(AssertSubscriber.create()); dp.onNext(1); dp.onNext(2); dp.onNext(3); dp.onComplete(); ts.assertValues(1, 2, 3).assertComplete(); }
@Test public void windowBoundaryComplete() throws Exception { DirectProcessor<Integer> boundary = DirectProcessor.create(); Flux<Flux<Integer>> windows = source.window(boundary); subscribe(windows); generate(0, 3); boundary.onNext(1); generateAndComplete(3, 3); verifyMainComplete(Arrays.asList(0, 1, 2), Arrays.asList(3, 4, 5)); }
@Test public void windowBoundaryMainCancel() throws Exception { DirectProcessor<Integer> boundary = DirectProcessor.create(); Flux<Flux<Integer>> windows = source.window(boundary); subscribe(windows); generate(0, 3); boundary.onNext(1); generate(3, 1); mainSubscriber.cancel(); generate(4, 2); boundary.onNext(1); generate(6, 10); verifyMainCancel(true, Arrays.asList(0, 1, 2), Arrays.asList(3, 4, 5)); }
@Test public void windowBoundaryMainCancelNoNewWindow() throws Exception { DirectProcessor<Integer> boundary = DirectProcessor.create(); Flux<Flux<Integer>> windows = source.window(boundary); subscribe(windows); generate(0, 3); boundary.onNext(1); mainSubscriber.cancel(); generate(3, 1); verifyMainCancelNoNewWindow(1, Arrays.asList(0, 1, 2)); }
@Test public void windowStartEndInnerCancel() throws Exception { DirectProcessor<Integer> start = DirectProcessor.create(); DirectProcessor<Integer> end1 = DirectProcessor.create(); DirectProcessor<Integer> end2 = DirectProcessor.create(); Flux<Flux<Integer>> windows = source.windowWhen(start, v -> v == 1 ? end1 : end2); subscribe(windows); start.onNext(1); generateWithCancel(0, 6, 1); verifyInnerCancel(0, i -> i != 2, Arrays.asList(0, 1)); }
@Test public void mapperReturnsNull() { AssertSubscriber<Object> ts = AssertSubscriber.create(); DirectProcessor<Integer> sp1 = DirectProcessor.create(); sp1.switchMap(v -> null) .subscribe(ts); sp1.onNext(1); ts.assertNoValues() .assertError(NullPointerException.class) .assertNotComplete(); }
@Test public void rightDurationThrows() { AssertSubscriber<Object> ts = AssertSubscriber.create(); DirectProcessor<Integer> source1 = DirectProcessor.create(); DirectProcessor<Integer> source2 = DirectProcessor.create(); Flux<Integer> duration1 = Flux.error(new RuntimeException("Forced failure")); Flux<Integer> m = source1.join(source2, just(Flux.never()), just(duration1), add); m.subscribe(ts); source2.onNext(1); ts.assertErrorMessage("Forced failure") .assertNotComplete() .assertNoValues(); }
@Test public void leftDurationThrows() { AssertSubscriber<Object> ts = AssertSubscriber.create(); DirectProcessor<Integer> source1 = DirectProcessor.create(); DirectProcessor<Integer> source2 = DirectProcessor.create(); Flux<Integer> duration1 = Flux.error(new RuntimeException("Forced failure")); Flux<Integer> m = source1.join(source2, just(duration1), just(Flux.never()), add); m.subscribe(ts); source1.onNext(1); ts.assertErrorMessage("Forced failure") .assertNotComplete() .assertNoValues(); }
@Test public void leftDurationThrows() { AssertSubscriber<Object> ts = AssertSubscriber.create(); DirectProcessor<Integer> source1 = DirectProcessor.create(); DirectProcessor<Integer> source2 = DirectProcessor.create(); Flux<Integer> duration1 = Flux.error(new RuntimeException("Forced failure")); Flux<Flux<Integer>> m = source1.groupJoin(source2, just(duration1), just(Flux.never()), add2); m.subscribe(ts); source1.onNext(1); ts.assertErrorMessage("Forced failure") .assertNotComplete() .assertNoValues(); }
@Test public void subscriberAlreadyCancelled() { AssertSubscriber<Integer> ts = AssertSubscriber.create(); ts.cancel(); DirectProcessor<Integer> tp = DirectProcessor.create(); tp.subscribe(ts); Assert.assertFalse("Subscribers present?", tp.hasDownstreams()); tp.onNext(1); ts.assertNoValues() .assertNotComplete() .assertNoError(); }
@Test public void throttlerReturnsNull() { AssertSubscriber<Integer> ts = AssertSubscriber.create(); DirectProcessor<Integer> sp1 = DirectProcessor.create(); sp1.sampleTimeout(v -> null) .subscribe(ts); sp1.onNext(1); ts.assertNoValues() .assertError(NullPointerException.class) .assertNotComplete(); Assert.assertFalse("sp1 has subscribers?", sp1.hasDownstreams()); }
@Test public void throttlerReturnsNull() { AssertSubscriber<Integer> ts = AssertSubscriber.create(); DirectProcessor<Integer> sp1 = DirectProcessor.create(); sp1.sampleFirst(v -> null) .subscribe(ts); sp1.onNext(1); ts.assertValues(1) .assertError(NullPointerException.class) .assertNotComplete(); Assert.assertFalse("sp1 has subscribers?", sp1.hasDownstreams()); }
@Test public void leftThrows() { AssertSubscriber<Object> ts = AssertSubscriber.create(); DirectProcessor<Integer> source1 = DirectProcessor.create(); DirectProcessor<Integer> source2 = DirectProcessor.create(); Flux<Flux<Integer>> m = source1.groupJoin(source2, just(Flux.never()), just(Flux.never()), add2); m.subscribe(ts); source2.onNext(1); source1.onError(new RuntimeException("Forced failure")); ts.assertErrorMessage("Forced failure") .assertNotComplete() .assertNoValues(); }
@Test public void rightThrows() { AssertSubscriber<Object> ts = AssertSubscriber.create(); DirectProcessor<Integer> source1 = DirectProcessor.create(); DirectProcessor<Integer> source2 = DirectProcessor.create(); Flux<Integer> m = source1.join(source2, just(Flux.never()), just(Flux.never()), add); m.subscribe(ts); source1.onNext(1); source2.onError(new RuntimeException("Forced failure")); ts.assertErrorMessage("Forced failure") .assertNotComplete() .assertNoValues(); }
@Test public void timeoutRequested() { AssertSubscriber<Integer> ts = AssertSubscriber.create(); MonoProcessor<Integer> source = MonoProcessor.create(); DirectProcessor<Integer> tp = DirectProcessor.create(); source.timeout(tp) .subscribe(ts); tp.onNext(1); source.onNext(2); source.onComplete(); ts.assertNoValues() .assertError(TimeoutException.class) .assertNotComplete(); }