package io.nextop.test.rx; import io.nextop.rx.RxLifecycleBinder; import junit.framework.TestCase; import rx.Observer; import rx.Subscription; import rx.subjects.BehaviorSubject; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; public class RxLifecycleBinderTest extends TestCase { public void testBindAdapter() { final int[] nextCount = {0}; final int[] completedCount = {0}; final int[] errorCount = {0}; final BehaviorSubject<Integer> subject = BehaviorSubject.create(); subject.onNext(0); RxLifecycleBinder.Lifted binder = new RxLifecycleBinder.Lifted(); int d = 4; for (int i = 0; i < d; ++i) { binder.bind(subject).subscribe(new Observer<Integer>() { @Override public void onNext(Integer integer) { ++nextCount[0]; } @Override public void onCompleted() { ++completedCount[0]; } @Override public void onError(Throwable e) { ++errorCount[0]; } }); } assertEquals(0, nextCount[0]); assertEquals(0, completedCount[0]); assertEquals(0, errorCount[0]); // resume it binder.connect(); assertEquals(d, nextCount[0]); assertEquals(0, completedCount[0]); assertEquals(0, errorCount[0]); // pause it, publish some updates binder.disconnect(); subject.onNext(1); subject.onNext(2); assertEquals(d, nextCount[0]); assertEquals(0, completedCount[0]); assertEquals(0, errorCount[0]); // resume it binder.connect(); assertEquals(2 * d, nextCount[0]); assertEquals(0, completedCount[0]); assertEquals(0, errorCount[0]); // pause it, close the source binder.disconnect(); subject.onCompleted(); assertEquals(2 * d, nextCount[0]); assertEquals(0, completedCount[0]); assertEquals(0, errorCount[0]); binder.connect(); assertEquals(2 * d, nextCount[0]); assertEquals(d, completedCount[0]); assertEquals(0, errorCount[0]); } public void testBindSubscription() { final int[] nextCount = {0}; final int[] completedCount = {0}; final int[] errorCount = {0}; final BehaviorSubject<Integer> subject = BehaviorSubject.create(); subject.onNext(0); RxLifecycleBinder.Lifted binder = new RxLifecycleBinder.Lifted(); Collection<Subscription> subscriptions = new LinkedList<Subscription>(); int d = 4; for (int i = 0; i < d; ++i) { // this binds a subscription in flight // versus wrapping the observable Subscription subscription = subject.subscribe(new Observer<Integer>() { @Override public void onNext(Integer integer) { ++nextCount[0]; } @Override public void onCompleted() { ++completedCount[0]; } @Override public void onError(Throwable e) { ++errorCount[0]; } }); subscriptions.add(subscription); binder.bind(subscription); } assertEquals(d, nextCount[0]); assertEquals(0, completedCount[0]); assertEquals(0, errorCount[0]); // resume it binder.connect(); assertEquals(d, nextCount[0]); assertEquals(0, completedCount[0]); assertEquals(0, errorCount[0]); // pause it, publish some updates binder.disconnect(); subject.onNext(1); subject.onNext(2); assertEquals(3 * d, nextCount[0]); assertEquals(0, completedCount[0]); assertEquals(0, errorCount[0]); binder.reset(); for (Subscription subscription : subscriptions) { assertTrue(subscription.isUnsubscribed()); } // unsubscribing does not trigger an onComplete assertEquals(3 * d, nextCount[0]); assertEquals(0, completedCount[0]); assertEquals(0, errorCount[0]); } public void testReset() { final int[] nextCount = {0}; final int[] completedCount = {0}; final int[] errorCount = {0}; final BehaviorSubject<Integer> subject = BehaviorSubject.create(); subject.onNext(0); RxLifecycleBinder.Lifted binder = new RxLifecycleBinder.Lifted(); int d = 4; for (int i = 0; i < d; ++i) { binder.bind(subject).subscribe(new Observer<Integer>() { @Override public void onNext(Integer integer) { ++nextCount[0]; } @Override public void onCompleted() { ++completedCount[0]; } @Override public void onError(Throwable e) { ++errorCount[0]; } }); } assertEquals(0, nextCount[0]); assertEquals(0, completedCount[0]); assertEquals(0, errorCount[0]); // resume it binder.connect(); assertEquals(d, nextCount[0]); assertEquals(0, completedCount[0]); assertEquals(0, errorCount[0]); binder.reset(); assertEquals(d, nextCount[0]); assertEquals(d, completedCount[0]); assertEquals(0, errorCount[0]); } }