package cgeo.geocaching.utils; import static org.assertj.core.api.Java6Assertions.assertThat; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import io.reactivex.Observable; import io.reactivex.disposables.Disposable; import io.reactivex.functions.Action; import io.reactivex.functions.Function; import io.reactivex.subjects.PublishSubject; import junit.framework.TestCase; public class RxUtilsTest extends TestCase { public static void testRememberLast() { final PublishSubject<String> rawObservable = PublishSubject.create(); final Observable<String> observable = RxUtils.rememberLast(rawObservable, "initial"); // Check that the initial value is present, and is kept there assertThat(observable.blockingFirst()).isEqualTo("initial"); assertThat(observable.blockingFirst()).isEqualTo("initial"); // Check that if the observable is not subscribed, changes are not propagated (similar to not keeping the // inner disposable active). rawObservable.onNext("without subscribers"); assertThat(observable.blockingFirst()).isEqualTo("initial"); // Check that new values are propagated and cached final Disposable disposable = observable.subscribe(); rawObservable.onNext("first"); assertThat(observable.blockingFirst()).isEqualTo("first"); disposable.dispose(); assertThat(observable.blockingFirst()).isEqualTo("first"); } public static void testObservableCache() { final AtomicInteger counter = new AtomicInteger(0); final RxUtils.ObservableCache<String, Integer> cache = new RxUtils.ObservableCache<>(new Function<String, Observable<Integer>>() { @Override public Observable<Integer> apply(final String s) { counter.incrementAndGet(); return Observable.just(s.length()); } }); assertThat(cache.get("a").blockingSingle()).isEqualTo(1); assertThat(counter.get()).isEqualTo(1); assertThat(cache.get("a").blockingSingle()).isEqualTo(1); assertThat(counter.get()).isEqualTo(1); assertThat(cache.get("bb").blockingSingle()).isEqualTo(2); assertThat(counter.get()).isEqualTo(2); assertThat(cache.get("bb").blockingSingle()).isEqualTo(2); assertThat(counter.get()).isEqualTo(2); assertThat(cache.get("a").blockingSingle()).isEqualTo(1); assertThat(counter.get()).isEqualTo(2); } public static void testDelayedUnsubscription() { final AtomicBoolean unsubscribed = new AtomicBoolean(false); Observable.never().doOnDispose(new Action() { @Override public void run() { unsubscribed.set(true); } }).lift(new RxUtils.DelayedUnsubscription<>(100, TimeUnit.MILLISECONDS)).subscribe().dispose(); assertThat(unsubscribed.get()).isFalse(); try { Thread.sleep(200); } catch (final InterruptedException ignored) { // ignore for tests } assertThat(unsubscribed.get()).isTrue(); } }