/** * Copyright (c) 2016-present, RxJava Contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.reactivex.internal.operators.flowable; import org.junit.*; import io.reactivex.*; import io.reactivex.functions.Predicate; import io.reactivex.internal.functions.Functions; import io.reactivex.internal.fuseable.ScalarCallable; import io.reactivex.subscribers.TestSubscriber; public class FlowableFromArrayTest { Flowable<Integer> create(int n) { Integer[] array = new Integer[n]; for (int i = 0; i < n; i++) { array[i] = i; } return Flowable.fromArray(array); } @Test public void simple() { TestSubscriber<Integer> ts = new TestSubscriber<Integer>(); create(1000).subscribe(ts); ts.assertNoErrors(); ts.assertValueCount(1000); ts.assertComplete(); } @Test public void backpressure() { TestSubscriber<Integer> ts = TestSubscriber.create(0); create(1000).subscribe(ts); ts.assertNoErrors(); ts.assertNoValues(); ts.assertNotComplete(); ts.request(10); ts.assertNoErrors(); ts.assertValueCount(10); ts.assertNotComplete(); ts.request(1000); ts.assertNoErrors(); ts.assertValueCount(1000); ts.assertComplete(); } @Test public void conditionalBackpressure() { TestSubscriber<Integer> ts = TestSubscriber.create(0); create(1000) .filter(Functions.alwaysTrue()) .subscribe(ts); ts.assertNoErrors(); ts.assertNoValues(); ts.assertNotComplete(); ts.request(10); ts.assertNoErrors(); ts.assertValueCount(10); ts.assertNotComplete(); ts.request(1000); ts.assertNoErrors(); ts.assertValueCount(1000); ts.assertComplete(); } @Test public void empty() { Assert.assertSame(Flowable.empty(), Flowable.fromArray(new Object[0])); } @Test public void just() { Flowable<Integer> source = Flowable.fromArray(new Integer[] { 1 }); Assert.assertTrue(source.getClass().toString(), source instanceof ScalarCallable); } @Test public void just10Arguments() { Flowable.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) .test() .assertResult(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); } @Test public void badRequest() { TestHelper.assertBadRequestReported(Flowable.just(1, 2, 3)); } @Test public void conditionalOneIsNull() { Flowable.fromArray(new Integer[] { null, 1 }) .filter(Functions.alwaysTrue()) .test() .assertFailure(NullPointerException.class); } @Test public void conditionalOneIsNullSlowPath() { Flowable.fromArray(new Integer[] { null, 1 }) .filter(Functions.alwaysTrue()) .test(2L) .assertFailure(NullPointerException.class); } @Test public void conditionalOneByOne() { Flowable.fromArray(new Integer[] { 1, 2, 3, 4, 5 }) .filter(Functions.alwaysTrue()) .rebatchRequests(1) .test() .assertResult(1, 2, 3, 4, 5); } @Test public void conditionalFiltered() { Flowable.fromArray(new Integer[] { 1, 2, 3, 4, 5 }) .filter(new Predicate<Integer>() { @Override public boolean test(Integer v) throws Exception { return v % 2 == 0; } }) .test() .assertResult(2, 4); } @Test public void conditionalSlowPathCancel() { Flowable.fromArray(new Integer[] { 1, 2, 3, 4, 5 }) .filter(Functions.alwaysTrue()) .subscribeWith(new TestSubscriber<Integer>(5L) { @Override public void onNext(Integer t) { super.onNext(t); if (t == 1) { cancel(); onComplete(); } } }) .assertResult(1); } @Test public void conditionalSlowPathSkipCancel() { Flowable.fromArray(new Integer[] { 1, 2, 3, 4, 5 }) .filter(new Predicate<Integer>() { @Override public boolean test(Integer v) throws Exception { return v < 2; } }) .subscribeWith(new TestSubscriber<Integer>(5L) { @Override public void onNext(Integer t) { super.onNext(t); if (t == 1) { cancel(); onComplete(); } } }) .assertResult(1); } }