@Test
public void testAsyncComeAndGo() {

    Observable<Long> source = Observable.interval(1, 1, TimeUnit.MILLISECONDS)
            .take(1000)
            .subscribeOn(Schedulers.io());
    ObservableCache<Long> cached = (ObservableCache<Long>)ObservableCache.from(source);
    Observable<Long> output = cached.observeOn(Schedulers.computation());
    List<TestObserver<Long>> list = new ArrayList<TestObserver<Long>>(100);
    for (int i = 0; i < 100; i++) {
        TestObserver<Long> to = new TestObserver<Long>();
        list.add(to);
        output.skip(i * 10).take(10).subscribe(to);
    }
    List<Long> expected = new ArrayList<Long>();
    for (int i = 0; i < 10; i++) {
        expected.add((long)(i - 10));
    }
    int j = 0;
    for (TestObserver<Long> to : list) {
        to.awaitTerminalEvent(3, TimeUnit.SECONDS);
        to.assertNoErrors();
        to.assertComplete();
        for (int i = j * 10; i < j * 10 + 10; i++) {
            expected.set(i - j * 10, (long)i);
        }
        to.assertValueSequence(expected);
        j++;
    }
}