package com.github.davidmoten.rx; import static org.junit.Assert.assertEquals; import java.util.Arrays; import java.util.Date; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import org.junit.Test; import com.github.davidmoten.rx.testing.TestingHelper; import rx.Observable; import rx.Scheduler.Worker; import rx.functions.Action0; import rx.functions.Action1; import rx.functions.Func0; import rx.observers.TestSubscriber; import rx.schedulers.Schedulers; import rx.schedulers.TestScheduler; public class ObsTest { @Test public void testCachedScheduledReset() { TestScheduler scheduler = new TestScheduler(); Worker worker = scheduler.createWorker(); try { final AtomicInteger count = new AtomicInteger(0); Observable<Integer> source = Observable.defer(new Func0<Observable<Integer>>() { @Override public Observable<Integer> call() { return Observable.just(count.incrementAndGet()); } }) // cache .compose(Transformers.<Integer> cache(5, TimeUnit.MINUTES, worker)); assertEquals(1, (int) source.toBlocking().single()); scheduler.advanceTimeBy(1, TimeUnit.MINUTES); assertEquals(1, (int) source.toBlocking().single()); scheduler.advanceTimeBy(1, TimeUnit.MINUTES); assertEquals(1, (int) source.toBlocking().single()); scheduler.advanceTimeBy(3, TimeUnit.MINUTES); assertEquals(2, (int) source.toBlocking().single()); assertEquals(2, (int) source.toBlocking().single()); } finally { worker.unsubscribe(); } } @Test public void testCachedResetableScheduledReset() { TestScheduler scheduler = new TestScheduler(); final AtomicInteger count = new AtomicInteger(0); Observable<Integer> o = Observable.defer(new Func0<Observable<Integer>>() { @Override public Observable<Integer> call() { return Observable.just(count.incrementAndGet()); } }); CloseableObservableWithReset<Integer> cached = Obs.cache(o, 5, TimeUnit.MINUTES, scheduler); assertEquals(1, (int) cached.observable().toBlocking().single()); scheduler.advanceTimeBy(1, TimeUnit.MINUTES); assertEquals(1, (int) cached.observable().toBlocking().single()); cached.reset(); scheduler.advanceTimeBy(5, TimeUnit.MINUTES); assertEquals(2, (int) cached.observable().toBlocking().single()); scheduler.advanceTimeBy(1, TimeUnit.MINUTES); assertEquals(2, (int) cached.observable().toBlocking().single()); cached.reset(); assertEquals(2, (int) cached.observable().toBlocking().single()); scheduler.advanceTimeBy(5, TimeUnit.MINUTES); assertEquals(3, (int) cached.observable().toBlocking().single()); cached.close(); } @Test public void testRepeatingTwo() { assertEquals(Arrays.asList(1000, 1000), Obs.repeating(1000).take(2).toList().toBlocking().single()); } @Test public void testRepeatingZero() { Obs.repeating(1000) // .to(TestingHelper.<Integer> testWithRequest(0)) // .assertNoValues() // .assertNotCompleted() // .requestMore(1) // .assertValue(1000) // .assertNotCompleted(); } public static void main(String[] args) throws InterruptedException { Observable<Date> source = Observable.defer(new Func0<Observable<Date>>() { @Override public Observable<Date> call() { return Observable.just(new Date()).doOnNext(new Action1<Date>() { @Override public void call(Date d) { System.out.println("source emits " + d); } }); } }); final CloseableObservableWithReset<Date> cached = Obs.cache(source, 5, TimeUnit.SECONDS, Schedulers.computation()); Observable<Date> o = cached.observable().doOnSubscribe(new Action0() { @Override public void call() { cached.reset(); } }); for (int i = 0; i < 30; i++) { o.doOnNext(new Action1<Date>() { @Override public void call(Date t) { System.out.println(t); } }).subscribe(); Thread.sleep((i % 5 + 1) * 1000); } cached.close(); } @Test public void testPermutations() { assertEquals(24, (int) Obs.permutations(Observable.range(0, 4).toList().toBlocking().single()) .count().toBlocking().single()); } @Test public void testIntervalLong() { TestSubscriber<Long> ts = TestSubscriber.create(); TestScheduler sched = new TestScheduler(); Obs.intervalLong(1, TimeUnit.SECONDS, sched).subscribe(ts); ts.assertNoValues(); ts.assertNotCompleted(); sched.advanceTimeBy(1, TimeUnit.SECONDS); ts.assertValue(0L); sched.advanceTimeBy(1, TimeUnit.SECONDS); ts.assertValues(0L, 1L); ts.assertNotCompleted(); } }