package com.github.davidmoten.rx.internal.operators; import java.io.IOException; import java.util.*; import org.junit.*; import com.github.davidmoten.rx.Transformers; import rx.Observable; import rx.functions.Func1; import rx.internal.util.*; import rx.observers.TestSubscriber; public class OperatorBufferPredicateBoundaryTest { @Test public void bufferWhilePredicateNull() { try { Observable.empty().compose(Transformers.bufferWhile(null)); Assert.fail("Didn't throw NullPointerException"); } catch (NullPointerException ex) { Assert.assertEquals("predicate", ex.getMessage()); } } @Test public void bufferUntilPredicateNull() { try { Observable.empty().compose(Transformers.bufferUntil(null)); Assert.fail("Didn't throw NullPointerException"); } catch (NullPointerException ex) { Assert.assertEquals("predicate", ex.getMessage()); } } @Test public void bufferWhileCapacityHintInvalid() { try { Observable.empty().compose(Transformers.bufferWhile(UtilityFunctions.alwaysTrue(), -99)); Assert.fail("Didn't throw IllegalArgumentException"); } catch (IllegalArgumentException ex) { Assert.assertEquals("capacityHint > 0 required but it was -99", ex.getMessage()); } } @Test public void bufferUntilCapacityHintInvalid() { try { Observable.empty().compose(Transformers.bufferUntil(UtilityFunctions.alwaysTrue(), -99)); Assert.fail("Didn't throw IllegalArgumentException"); } catch (IllegalArgumentException ex) { Assert.assertEquals("capacityHint > 0 required but it was -99", ex.getMessage()); } } @SuppressWarnings("unchecked") @Test public void bufferWhileWith1() { TestSubscriber<List<Integer>> ts = new TestSubscriber<List<Integer>>(); Observable.range(1, 10) .compose(Transformers.bufferWhile(UtilityFunctions.<Integer>alwaysTrue())) .subscribe(ts); ts.assertValues( Arrays.asList(1), Arrays.asList(2), Arrays.asList(3), Arrays.asList(4), Arrays.asList(5), Arrays.asList(6), Arrays.asList(7), Arrays.asList(8), Arrays.asList(9), Arrays.asList(10) ); ts.assertNoErrors(); ts.assertCompleted(); } @SuppressWarnings("unchecked") @Test public void bufferWhileWith5() { TestSubscriber<List<Integer>> ts = new TestSubscriber<List<Integer>>(); Observable.range(1, 10) .compose(Transformers.bufferWhile(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer v) { return v == 5; } })) .subscribe(ts); ts.assertValues( Arrays.asList(1, 2, 3, 4), Arrays.asList(5, 6, 7, 8, 9, 10) ); ts.assertNoErrors(); ts.assertCompleted(); } @SuppressWarnings("unchecked") @Test public void bufferWhileWith20() { TestSubscriber<List<Integer>> ts = new TestSubscriber<List<Integer>>(); Observable.range(1, 10) .compose(Transformers.bufferWhile(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer v) { return v == 20; } })) .subscribe(ts); ts.assertValues( Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) ); ts.assertNoErrors(); ts.assertCompleted(); } @SuppressWarnings("unchecked") @Test public void bufferUntilWith1() { TestSubscriber<List<Integer>> ts = new TestSubscriber<List<Integer>>(); Observable.range(1, 10) .compose(Transformers.bufferUntil(UtilityFunctions.<Integer>alwaysTrue())) .subscribe(ts); ts.assertValues( Arrays.asList(1), Arrays.asList(2), Arrays.asList(3), Arrays.asList(4), Arrays.asList(5), Arrays.asList(6), Arrays.asList(7), Arrays.asList(8), Arrays.asList(9), Arrays.asList(10) ); ts.assertNoErrors(); ts.assertCompleted(); } @SuppressWarnings("unchecked") @Test public void bufferUntilWith5() { TestSubscriber<List<Integer>> ts = new TestSubscriber<List<Integer>>(); Observable.range(1, 10) .compose(Transformers.bufferUntil(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer v) { return v == 5; } })) .subscribe(ts); ts.assertValues( Arrays.asList(1, 2, 3, 4, 5), Arrays.asList(6, 7, 8, 9, 10) ); ts.assertNoErrors(); ts.assertCompleted(); } @SuppressWarnings("unchecked") @Test public void bufferUntilWith20() { TestSubscriber<List<Integer>> ts = new TestSubscriber<List<Integer>>(); Observable.range(1, 10) .compose(Transformers.bufferUntil(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer v) { return v == 20; } })) .subscribe(ts); ts.assertValues( Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) ); ts.assertNoErrors(); ts.assertCompleted(); } @SuppressWarnings("unchecked") @Test public void bufferWhileSomeNull() { TestSubscriber<List<Integer>> ts = new TestSubscriber<List<Integer>>(); Observable.just(1, 2, 3, null, 4, 5) .compose(Transformers.bufferUntil(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer v) { return v != null && v == 20; } })) .subscribe(ts); ts.assertValues( Arrays.asList(1, 2, 3, null, 4, 5) ); ts.assertNoErrors(); ts.assertCompleted(); } @SuppressWarnings("unchecked") @Test public void bufferUntilSomeNull() { TestSubscriber<List<Integer>> ts = new TestSubscriber<List<Integer>>(); Observable.just(1, 2, 3, null, 4, 5) .compose(Transformers.bufferUntil(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer v) { return v != null && v == 20; } })) .subscribe(ts); ts.assertValues( Arrays.asList(1, 2, 3, null, 4, 5) ); ts.assertNoErrors(); ts.assertCompleted(); } @Test public void bufferWhilePredicateThrows() { TestSubscriber<List<Integer>> ts = new TestSubscriber<List<Integer>>(); Observable.just(1, 2, 3, null, 4, 5) .compose(Transformers.bufferWhile(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer v) { return v == 20; } })) .subscribe(ts); ts.assertNoValues(); ts.assertError(NullPointerException.class); ts.assertNotCompleted(); } @Test public void bufferUntilPredicateThrows() { TestSubscriber<List<Integer>> ts = new TestSubscriber<List<Integer>>(); Observable.just(1, 2, 3, null, 4, 5) .compose(Transformers.bufferUntil(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer v) { return v == 20; } })) .subscribe(ts); ts.assertNoValues(); ts.assertError(NullPointerException.class); ts.assertNotCompleted(); } @Test public void emptySourceBufferWhile() { TestSubscriber<List<Integer>> ts = new TestSubscriber<List<Integer>>(); Observable.<Integer>empty() .compose(Transformers.bufferWhile(UtilityFunctions.<Integer>alwaysTrue())) .subscribe(ts); ts.assertNoValues(); ts.assertNoErrors(); ts.assertCompleted(); } @Test public void emptySourceBufferUntil() { TestSubscriber<List<Integer>> ts = new TestSubscriber<List<Integer>>(); Observable.<Integer>empty() .compose(Transformers.bufferUntil(UtilityFunctions.<Integer>alwaysTrue())) .subscribe(ts); ts.assertNoValues(); ts.assertNoErrors(); ts.assertCompleted(); } @Test public void errorSourceBufferWhile() { TestSubscriber<List<Integer>> ts = new TestSubscriber<List<Integer>>(); Observable.<Integer>error(new IOException()) .compose(Transformers.bufferWhile(UtilityFunctions.<Integer>alwaysTrue())) .subscribe(ts); ts.assertNoValues(); ts.assertError(IOException.class); ts.assertNotCompleted(); } @Test public void errorSourceBufferUntil() { TestSubscriber<List<Integer>> ts = new TestSubscriber<List<Integer>>(); Observable.<Integer>error(new IOException()) .compose(Transformers.bufferUntil(UtilityFunctions.<Integer>alwaysTrue())) .subscribe(ts); ts.assertNoValues(); ts.assertError(IOException.class); ts.assertNotCompleted(); } @SuppressWarnings("unchecked") @Test public void bufferWhileBackpressure() { TestSubscriber<List<Integer>> ts = TestSubscriber.create(0); Observable.range(1, RxRingBuffer.SIZE * 4) .compose(Transformers.bufferWhile(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer v) { return (v % 3) == 0; } })).subscribe(ts); ts.assertNoValues(); ts.assertNoErrors(); ts.assertNotCompleted(); ts.requestMore(1); ts.assertValue(Arrays.asList(1, 2)); ts.requestMore(1); ts.assertValues( Arrays.asList(1, 2), Arrays.asList(3, 4, 5) ); ts.assertNoErrors(); ts.assertNotCompleted(); ts.requestMore(1); ts.assertValues( Arrays.asList(1, 2), Arrays.asList(3, 4, 5), Arrays.asList(6, 7, 8) ); ts.assertNoErrors(); ts.assertNotCompleted(); ts.requestMore(Long.MAX_VALUE); ts.assertValueCount((RxRingBuffer.SIZE * 4) / 3 + 1); ts.assertNoErrors(); ts.assertCompleted(); } @SuppressWarnings("unchecked") @Test public void bufferUntilBackpressure() { TestSubscriber<List<Integer>> ts = TestSubscriber.create(0); Observable.range(1, RxRingBuffer.SIZE * 4) .compose(Transformers.bufferUntil(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer v) { return (v % 3) == 0; } })).subscribe(ts); ts.assertNoValues(); ts.assertNoErrors(); ts.assertNotCompleted(); ts.requestMore(1); ts.assertValue(Arrays.asList(1, 2, 3)); ts.requestMore(1); ts.assertValues( Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6) ); ts.assertNoErrors(); ts.assertNotCompleted(); ts.requestMore(1); ts.assertValues( Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6), Arrays.asList(7, 8, 9) ); ts.assertNoErrors(); ts.assertNotCompleted(); ts.requestMore(Long.MAX_VALUE); ts.assertValueCount((RxRingBuffer.SIZE * 4) / 3 + 1); ts.assertNoErrors(); ts.assertCompleted(); } @Test public void bufferWhileBackpressureFullBuffer() { TestSubscriber<List<Integer>> ts = TestSubscriber.create(0); int count = RxRingBuffer.SIZE * 4; Observable.range(1, count) .compose(Transformers.bufferWhile(UtilityFunctions.<Integer>alwaysFalse())) .subscribe(ts); ts.assertNoValues(); ts.assertNoErrors(); ts.assertNotCompleted(); ts.requestMore(1); ts.assertValueCount(1); ts.assertNoErrors(); ts.assertCompleted(); Assert.assertEquals(count, ts.getOnNextEvents().get(0).size()); } @Test public void bufferUntilBackpressureFullBuffer() { TestSubscriber<List<Integer>> ts = TestSubscriber.create(0); int count = RxRingBuffer.SIZE * 4; Observable.range(1, count) .compose(Transformers.bufferUntil(UtilityFunctions.<Integer>alwaysFalse())) .subscribe(ts); ts.assertNoValues(); ts.assertNoErrors(); ts.assertNotCompleted(); ts.requestMore(1); ts.assertValueCount(1); ts.assertNoErrors(); ts.assertCompleted(); Assert.assertEquals(count, ts.getOnNextEvents().get(0).size()); } }