@Test(expected = NullPointerException.class) public void ambArrayNull() { Completable.ambArray((Completable[])null); }
/** * 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); }
/** * 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 ambArraySingleNormal() { Completable c = Completable.ambArray(normal.completable); c.blockingAwait(); }
@Test(timeout = 5000) public void ambArrayEmpty() { Completable c = Completable.ambArray(); c.blockingAwait(); }
@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(timeout = 5000) public void ambArrayOneFires() { CompletableSubject ps1 = CompletableSubject.create(); CompletableSubject ps2 = CompletableSubject.create(); Completable c = Completable.ambArray(ps1, ps2); final AtomicBoolean complete = new AtomicBoolean(); c.subscribe(new Action() { @Override public void run() { complete.set(true); } }); Assert.assertTrue("First subject no subscribers", ps1.hasObservers()); Assert.assertTrue("Second subject no subscribers", ps2.hasObservers()); ps1.onComplete(); Assert.assertFalse("First subject has subscribers", ps1.hasObservers()); Assert.assertFalse("Second subject has subscribers", ps2.hasObservers()); Assert.assertTrue("Not completed", complete.get()); }
@Test(timeout = 5000) public void ambArraySecondFires() { CompletableSubject ps1 = CompletableSubject.create(); CompletableSubject ps2 = CompletableSubject.create(); Completable c = Completable.ambArray(ps1, ps2); final AtomicBoolean complete = new AtomicBoolean(); c.subscribe(new Action() { @Override public void run() { complete.set(true); } }); Assert.assertTrue("First subject no subscribers", ps1.hasObservers()); Assert.assertTrue("Second subject no subscribers", ps2.hasObservers()); ps2.onComplete(); Assert.assertFalse("First subject has subscribers", ps1.hasObservers()); Assert.assertFalse("Second subject has subscribers", ps2.hasObservers()); Assert.assertTrue("Not completed", complete.get()); }
@Test(timeout = 5000) public void ambArrayOneFiresError() { CompletableSubject ps1 = CompletableSubject.create(); CompletableSubject ps2 = CompletableSubject.create(); Completable c = Completable.ambArray(ps1, ps2); 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", ps1.hasObservers()); Assert.assertTrue("Second subject no subscribers", ps2.hasObservers()); ps1.onError(new TestException()); Assert.assertFalse("First subject has subscribers", ps1.hasObservers()); Assert.assertFalse("Second subject has subscribers", ps2.hasObservers()); Assert.assertTrue("Not completed", complete.get() instanceof TestException); }
@Test(timeout = 5000) public void ambArraySecondFiresError() { CompletableSubject ps1 = CompletableSubject.create(); CompletableSubject ps2 = CompletableSubject.create(); Completable c = Completable.ambArray(ps1, ps2); 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", ps1.hasObservers()); Assert.assertTrue("Second subject no subscribers", ps2.hasObservers()); ps2.onError(new TestException()); Assert.assertFalse("First subject has subscribers", ps1.hasObservers()); Assert.assertFalse("Second subject has subscribers", ps2.hasObservers()); Assert.assertTrue("Not completed", complete.get() instanceof TestException); }
@Test public void nullSourceSuccessRace() { for (int i = 0; i < 1000; i++) { List<Throwable> errors = TestCommonHelper.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(); } }; TestCommonHelper.race(r1, r2, Schedulers.single()); if (!errors.isEmpty()) { TestCommonHelper.assertError(errors, 0, NullPointerException.class); } } finally { RxJavaCommonPlugins.reset(); } } }