@Override protected Subject<Integer> create() { return BehaviorSubject.create(); }
@Test public void noReentrantDispose() { final AtomicInteger disposeCalled = new AtomicInteger(); final BehaviorSubject<Integer> s = BehaviorSubject.create(); s.doOnDispose(new Action() { @Override public void run() throws Exception { disposeCalled.incrementAndGet(); s.onNext(2); } }) .firstOrError() .subscribe() .dispose(); assertEquals(1, disposeCalled.get()); } }
@Test public void testStartEmptyCompleteWithOne() { BehaviorSubject<Integer> source = BehaviorSubject.create(); final Observer<Object> o = TestHelper.mockObserver(); source.onNext(1); source.onComplete(); source.onNext(2); source.subscribe(o); verify(o).onComplete(); verify(o, never()).onError(any(Throwable.class)); verify(o, never()).onNext(any()); }
@Test public void testStartEmpty() { BehaviorSubject<Integer> source = BehaviorSubject.create(); final Observer<Object> o = TestHelper.mockObserver(); InOrder inOrder = inOrder(o); source.subscribe(o); inOrder.verify(o, never()).onNext(any()); inOrder.verify(o, never()).onComplete(); source.onNext(1); source.onComplete(); source.onNext(2); verify(o, never()).onError(any(Throwable.class)); inOrder.verify(o).onNext(1); inOrder.verify(o).onComplete(); inOrder.verifyNoMoreInteractions(); }
@Test public void testStartEmptyThenAddOne() { BehaviorSubject<Integer> source = BehaviorSubject.create(); final Observer<Object> o = TestHelper.mockObserver(); InOrder inOrder = inOrder(o); source.onNext(1); source.subscribe(o); inOrder.verify(o).onNext(1); source.onComplete(); source.onNext(2); inOrder.verify(o).onComplete(); inOrder.verifyNoMoreInteractions(); verify(o, never()).onError(any(Throwable.class)); }
@Test public void addRemoveRace() { for (int i = 0; i < TestHelper.RACE_DEFAULT_LOOPS; i++) { final BehaviorSubject<Object> p = BehaviorSubject.create(); final TestObserver<Object> to = p.test(); Runnable r1 = new Runnable() { @Override public void run() { p.test(); } }; Runnable r2 = new Runnable() { @Override public void run() { to.cancel(); } }; TestHelper.race(r1, r2); } }
@Test public void disconnectBeforeConnect() { BehaviorSubject<Integer> subject = BehaviorSubject.create(); Observable<Integer> observable = subject .replay(1) .refCount(); observable.takeUntil(Observable.just(1)).test(); subject.onNext(2); observable.take(1).test().assertResult(2); } }
@Test public void cancelOnArrival() { BehaviorSubject<Object> p = BehaviorSubject.create(); assertFalse(p.hasObservers()); p.test(true).assertEmpty(); assertFalse(p.hasObservers()); }
@Test public void cancelOnArrival2() { BehaviorSubject<Object> p = BehaviorSubject.create(); TestObserver<Object> to = p.test(); p.test(true).assertEmpty(); p.onNext(1); p.onComplete(); to.assertResult(1); }
@Test public void onErrorAfterComplete() { BehaviorSubject<Object> p = BehaviorSubject.create(); p.onComplete(); List<Throwable> errors = TestHelper.trackPluginErrors(); try { p.onError(new TestException()); TestHelper.assertUndeliverable(errors, 0, TestException.class); } finally { RxJavaPlugins.reset(); } }
@Test public void emittingEmitNext() { BehaviorSubject<Integer> bs = BehaviorSubject.create(); bs.onNext(1); TestObserver<Integer> to = new TestObserver<Integer>(); final BehaviorDisposable<Integer> bd = new BehaviorDisposable<Integer>(to, bs); to.onSubscribe(bd); bd.emitting = true; bd.emitNext(2, 1); bd.emitNext(3, 2); assertNotNull(bd.queue); } }
@Test public void onSubscribe() { BehaviorSubject<Object> p = BehaviorSubject.create(); Disposable bs = Disposables.empty(); p.onSubscribe(bs); assertFalse(bs.isDisposed()); p.onComplete(); bs = Disposables.empty(); p.onSubscribe(bs); assertTrue(bs.isDisposed()); }
@Test public void behaviorDisposableDisposeState() { BehaviorSubject<Integer> bs = BehaviorSubject.create(); bs.onNext(1); TestObserver<Integer> to = new TestObserver<Integer>(); BehaviorDisposable<Integer> bd = new BehaviorDisposable<Integer>(to, bs); to.onSubscribe(bd); assertFalse(bd.isDisposed()); bd.dispose(); assertTrue(bd.isDisposed()); bd.dispose(); assertTrue(bd.isDisposed()); assertTrue(bd.test(2)); bd.emitFirst(); to.assertEmpty(); bd.emitNext(2, 0); }
@Test public void testCurrentStateMethodsEmpty() { BehaviorSubject<Object> as = BehaviorSubject.create(); assertFalse(as.hasValue()); assertFalse(as.hasThrowable()); assertFalse(as.hasComplete()); assertNull(as.getValue()); assertNull(as.getThrowable()); as.onComplete(); assertFalse(as.hasValue()); assertFalse(as.hasThrowable()); assertTrue(as.hasComplete()); assertNull(as.getValue()); assertNull(as.getThrowable()); }
@Test public void testCurrentStateMethodsError() { BehaviorSubject<Object> as = BehaviorSubject.create(); assertFalse(as.hasValue()); assertFalse(as.hasThrowable()); assertFalse(as.hasComplete()); assertNull(as.getValue()); assertNull(as.getThrowable()); as.onError(new TestException()); assertFalse(as.hasValue()); assertTrue(as.hasThrowable()); assertFalse(as.hasComplete()); assertNull(as.getValue()); assertTrue(as.getThrowable() instanceof TestException); }
@SuppressWarnings("deprecation") @Test public void testBehaviorSubjectIncompleteEmpty() { BehaviorSubject<Integer> async = BehaviorSubject.create(); Subject<Integer> serial = async.toSerialized(); assertFalse(serial.hasObservers()); assertFalse(serial.hasComplete()); assertFalse(serial.hasThrowable()); assertNull(serial.getThrowable()); assertNull(async.getValue()); assertFalse(async.hasValue()); assertArrayEquals(new Object[] { }, async.getValues()); assertArrayEquals(new Integer[] { }, async.getValues(new Integer[0])); assertArrayEquals(new Integer[] { null }, async.getValues(new Integer[] { 0 })); assertArrayEquals(new Integer[] { null, 0 }, async.getValues(new Integer[] { 0, 0 })); }
@SuppressWarnings("deprecation") @Test public void testBehaviorSubjectValueRelayIncomplete() { BehaviorSubject<Integer> async = BehaviorSubject.create(); async.onNext(1); Subject<Integer> serial = async.toSerialized(); assertFalse(serial.hasObservers()); assertFalse(serial.hasComplete()); assertFalse(serial.hasThrowable()); assertNull(serial.getThrowable()); assertEquals((Integer)1, async.getValue()); assertTrue(async.hasValue()); assertArrayEquals(new Object[] { 1 }, async.getValues()); assertArrayEquals(new Integer[] { 1 }, async.getValues(new Integer[0])); assertArrayEquals(new Integer[] { 1 }, async.getValues(new Integer[] { 0 })); assertArrayEquals(new Integer[] { 1, null }, async.getValues(new Integer[] { 0, 0 })); }
@SuppressWarnings("deprecation") @Test public void testBehaviorSubjectEmpty() { BehaviorSubject<Integer> async = BehaviorSubject.create(); async.onComplete(); Subject<Integer> serial = async.toSerialized(); assertFalse(serial.hasObservers()); assertTrue(serial.hasComplete()); assertFalse(serial.hasThrowable()); assertNull(serial.getThrowable()); assertNull(async.getValue()); assertFalse(async.hasValue()); assertArrayEquals(new Object[] { }, async.getValues()); assertArrayEquals(new Integer[] { }, async.getValues(new Integer[0])); assertArrayEquals(new Integer[] { null }, async.getValues(new Integer[] { 0 })); assertArrayEquals(new Integer[] { null, 0 }, async.getValues(new Integer[] { 0, 0 })); }
@SuppressWarnings("deprecation") @Test public void testBehaviorSubjectValueRelay() { BehaviorSubject<Integer> async = BehaviorSubject.create(); async.onNext(1); async.onComplete(); Subject<Integer> serial = async.toSerialized(); assertFalse(serial.hasObservers()); assertTrue(serial.hasComplete()); assertFalse(serial.hasThrowable()); assertNull(serial.getThrowable()); assertNull(async.getValue()); assertFalse(async.hasValue()); assertArrayEquals(new Object[] { }, async.getValues()); assertArrayEquals(new Integer[] { }, async.getValues(new Integer[0])); assertArrayEquals(new Integer[] { null }, async.getValues(new Integer[] { 0 })); assertArrayEquals(new Integer[] { null, 0 }, async.getValues(new Integer[] { 0, 0 })); }
@SuppressWarnings("deprecation") @Test public void testBehaviorSubjectError() { BehaviorSubject<Integer> async = BehaviorSubject.create(); TestException te = new TestException(); async.onError(te); Subject<Integer> serial = async.toSerialized(); assertFalse(serial.hasObservers()); assertFalse(serial.hasComplete()); assertTrue(serial.hasThrowable()); assertSame(te, serial.getThrowable()); assertNull(async.getValue()); assertFalse(async.hasValue()); assertArrayEquals(new Object[] { }, async.getValues()); assertArrayEquals(new Integer[] { }, async.getValues(new Integer[0])); assertArrayEquals(new Integer[] { null }, async.getValues(new Integer[] { 0 })); assertArrayEquals(new Integer[] { null, 0 }, async.getValues(new Integer[] { 0, 0 })); }