@Override public CompletableSource apply(Completable upstream) { return Completable.ambArray(upstream, observable.flatMapCompletable(Functions.CANCEL_COMPLETABLE)); }
@Override public CompletableSource apply(Completable upstream) { return Completable.ambArray(upstream, mObservable.flatMapCompletable( new Function<Object, CompletableSource>() { @Override public CompletableSource apply(Object t) throws Exception { return Completable.complete(); } })); } }
@Override public CompletableSource apply(Completable upstream) { return Completable.ambArray(upstream, mObservable.flatMapCompletable( new Function<Object, CompletableSource>() { @Override public CompletableSource apply(Object t) throws Exception { return Completable.complete(); } })); } }
@Override public CompletableSource apply(Completable upstream) { return Completable.ambArray(upstream, mObservable.flatMapCompletable( new Function<Object, CompletableSource>() { @Override public CompletableSource apply(Object t) throws Exception { return Completable.complete(); } })); } }
@Test(expected = NullPointerException.class) public void ambArrayNull() { Completable.ambArray((Completable[])null); }
@Test(timeout = 5000) public void ambArrayEmpty() { Completable c = Completable.ambArray(); c.blockingAwait(); }
@Test(timeout = 5000) public void ambArraySingleNormal() { Completable c = Completable.ambArray(normal.completable); c.blockingAwait(); }
/** * Returns a Completable that emits the a terminated event of either this Completable * or the other Completable whichever fires first. * <p> * <img width="640" height="484" src="https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/Completable.ambWith.png" alt=""> * <dl> * <dt><b>Scheduler:</b></dt> * <dd>{@code ambWith} does not operate by default on a particular {@link Scheduler}.</dd> * </dl> * @param other the other Completable, not null. A subscription to this provided source will occur after subscribing * to the current source. * @return the new Completable instance * @throws NullPointerException if other is null */ @CheckReturnValue @NonNull @SchedulerSupport(SchedulerSupport.NONE) public final Completable ambWith(CompletableSource other) { ObjectHelper.requireNonNull(other, "other is null"); return ambArray(this, other); }
/** * Returns a Completable that emits the a terminated event of either this Completable * or the other Completable whichever fires first. * <dl> * <dt><b>Scheduler:</b></dt> * <dd>{@code ambWith} does not operate by default on a particular {@link Scheduler}.</dd> * </dl> * @param other the other Completable, not null. A subscription to this provided source will occur after subscribing * to the current source. * @return the new Completable instance * @throws NullPointerException if other is null */ @CheckReturnValue @SchedulerSupport(SchedulerSupport.NONE) public final Completable ambWith(CompletableSource other) { ObjectHelper.requireNonNull(other, "other is null"); return ambArray(this, other); }
@Test(timeout = 5000) public void ambArraySingleError() { Completable.ambArray(error.completable) .test() .assertError(TestException.class); }
@Test(timeout = 5000) public void ambMultipleOneIsNull() { Completable.ambArray(null, normal.completable) .test() .assertError(NullPointerException.class); }
@Test public void ambArrayOrder() { Completable error = Completable.error(new RuntimeException()); Completable.ambArray(Completable.complete(), error).test().assertComplete(); }
@Test public void noWinnerCompleteDispose() throws Exception { for (int i = 0; i < TestHelper.RACE_LONG_LOOPS; i++) { final AtomicBoolean interrupted = new AtomicBoolean(); final CountDownLatch cdl = new CountDownLatch(1); Completable.ambArray( Completable.complete() .subscribeOn(Schedulers.single()) .observeOn(Schedulers.computation()), Completable.never() ) .subscribe(new Action() { @Override public void run() throws Exception { interrupted.set(Thread.currentThread().isInterrupted()); cdl.countDown(); } }); assertTrue(cdl.await(500, TimeUnit.SECONDS)); assertFalse("Interrupted!", interrupted.get()); } } }
@Test public void noWinnerErrorDispose() throws Exception { final TestException ex = new TestException(); for (int i = 0; i < TestHelper.RACE_LONG_LOOPS; i++) { final AtomicBoolean interrupted = new AtomicBoolean(); final CountDownLatch cdl = new CountDownLatch(1); Completable.ambArray( Completable.error(ex) .subscribeOn(Schedulers.single()) .observeOn(Schedulers.computation()), Completable.never() ) .subscribe(Functions.EMPTY_ACTION, new Consumer<Throwable>() { @Override public void accept(Throwable e) throws Exception { interrupted.set(Thread.currentThread().isInterrupted()); cdl.countDown(); } }); assertTrue(cdl.await(500, TimeUnit.SECONDS)); assertFalse("Interrupted!", interrupted.get()); } }
@Test public void nullSourceSuccessRace() { for (int i = 0; i < TestHelper.RACE_DEFAULT_LOOPS; i++) { List<Throwable> errors = TestHelper.trackPluginErrors(); try { final Subject<Integer> ps = ReplaySubject.create(); ps.onNext(1); final Completable source = Completable.ambArray(ps.ignoreElements(), Completable.never(), Completable.never(), null); Runnable r1 = new Runnable() { @Override public void run() { source.test(); } }; Runnable r2 = new Runnable() { @Override public void run() { ps.onComplete(); } }; TestHelper.race(r1, r2); if (!errors.isEmpty()) { TestHelper.assertError(errors, 0, NullPointerException.class); } } finally { RxJavaPlugins.reset(); } } }
@Test(timeout = 5000) public void ambArraySecondFires() { PublishProcessor<Object> pp1 = PublishProcessor.create(); PublishProcessor<Object> pp2 = PublishProcessor.create(); Completable c1 = Completable.fromPublisher(pp1); Completable c2 = Completable.fromPublisher(pp2); Completable c = Completable.ambArray(c1, c2); final AtomicBoolean complete = new AtomicBoolean(); c.subscribe(new Action() { @Override public void run() { complete.set(true); } }); Assert.assertTrue("First subject no subscribers", pp1.hasSubscribers()); Assert.assertTrue("Second subject no subscribers", pp2.hasSubscribers()); pp2.onComplete(); Assert.assertFalse("First subject has subscribers", pp1.hasSubscribers()); Assert.assertFalse("Second subject has subscribers", pp2.hasSubscribers()); Assert.assertTrue("Not completed", complete.get()); }
@Test(timeout = 5000) public void ambArrayOneFires() { PublishProcessor<Object> pp1 = PublishProcessor.create(); PublishProcessor<Object> pp2 = PublishProcessor.create(); Completable c1 = Completable.fromPublisher(pp1); Completable c2 = Completable.fromPublisher(pp2); Completable c = Completable.ambArray(c1, c2); final AtomicBoolean complete = new AtomicBoolean(); c.subscribe(new Action() { @Override public void run() { complete.set(true); } }); Assert.assertTrue("First subject no subscribers", pp1.hasSubscribers()); Assert.assertTrue("Second subject no subscribers", pp2.hasSubscribers()); pp1.onComplete(); Assert.assertFalse("First subject has subscribers", pp1.hasSubscribers()); Assert.assertFalse("Second subject has subscribers", pp2.hasSubscribers()); Assert.assertTrue("Not completed", complete.get()); }
@Test(timeout = 5000) public void ambArraySecondFiresError() { PublishProcessor<Object> pp1 = PublishProcessor.create(); PublishProcessor<Object> pp2 = PublishProcessor.create(); Completable c1 = Completable.fromPublisher(pp1); Completable c2 = Completable.fromPublisher(pp2); Completable c = Completable.ambArray(c1, c2); final AtomicReference<Throwable> complete = new AtomicReference<Throwable>(); c.subscribe(Functions.EMPTY_ACTION, new Consumer<Throwable>() { @Override public void accept(Throwable v) { complete.set(v); } }); Assert.assertTrue("First subject no subscribers", pp1.hasSubscribers()); Assert.assertTrue("Second subject no subscribers", pp2.hasSubscribers()); pp2.onError(new TestException()); Assert.assertFalse("First subject has subscribers", pp1.hasSubscribers()); Assert.assertFalse("Second subject has subscribers", pp2.hasSubscribers()); Assert.assertTrue("Not completed", complete.get() instanceof TestException); }
@Test(timeout = 5000) public void ambArrayOneFiresError() { PublishProcessor<Object> pp1 = PublishProcessor.create(); PublishProcessor<Object> pp2 = PublishProcessor.create(); Completable c1 = Completable.fromPublisher(pp1); Completable c2 = Completable.fromPublisher(pp2); Completable c = Completable.ambArray(c1, c2); final AtomicReference<Throwable> complete = new AtomicReference<Throwable>(); c.subscribe(Functions.EMPTY_ACTION, new Consumer<Throwable>() { @Override public void accept(Throwable v) { complete.set(v); } }); Assert.assertTrue("First subject no subscribers", pp1.hasSubscribers()); Assert.assertTrue("Second subject no subscribers", pp2.hasSubscribers()); pp1.onError(new TestException()); Assert.assertFalse("First subject has subscribers", pp1.hasSubscribers()); Assert.assertFalse("Second subject has subscribers", pp2.hasSubscribers()); Assert.assertTrue("Not completed", complete.get() instanceof TestException); }
@Override public CompletableSource apply(Completable upstream) { return Completable.ambArray(upstream, observable.flatMapCompletable(Functions.CANCEL_COMPLETABLE)); }