/** * 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.flowable; import static org.junit.Assert.*; import org.junit.Test; import io.reactivex.*; import io.reactivex.flowable.FlowableCovarianceTest.*; import io.reactivex.functions.BiFunction; public class FlowableReduceTests { @Test public void reduceIntsFlowable() { Flowable o = Flowable.just(1, 2, 3); int value = o.reduce(new BiFunction() { @Override public Integer apply(Integer t1, Integer t2) { return t1 + t2; } }).toFlowable().blockingSingle(); assertEquals(6, value); } @SuppressWarnings("unused") @Test public void reduceWithObjectsFlowable() { Flowable horrorMovies = Flowable. just(new HorrorMovie()); Flowable reduceResult = horrorMovies.scan(new BiFunction() { @Override public Movie apply(Movie t1, Movie t2) { return t2; } }).takeLast(1); Flowable reduceResult2 = horrorMovies.reduce(new BiFunction() { @Override public Movie apply(Movie t1, Movie t2) { return t2; } }).toFlowable(); assertNotNull(reduceResult2); } /** * Reduce consumes and produces T so can't do covariance. * * https://github.com/ReactiveX/RxJava/issues/360#issuecomment-24203016 */ @Test public void reduceWithCovariantObjectsFlowable() { Flowable horrorMovies = Flowable. just(new HorrorMovie()); Flowable reduceResult2 = horrorMovies.reduce(new BiFunction() { @Override public Movie apply(Movie t1, Movie t2) { return t2; } }).toFlowable(); assertNotNull(reduceResult2); } @Test public void reduceInts() { Flowable o = Flowable.just(1, 2, 3); int value = o.reduce(new BiFunction() { @Override public Integer apply(Integer t1, Integer t2) { return t1 + t2; } }).toFlowable().blockingSingle(); assertEquals(6, value); } @SuppressWarnings("unused") @Test public void reduceWithObjects() { Flowable horrorMovies = Flowable. just(new HorrorMovie()); Flowable reduceResult = horrorMovies.scan(new BiFunction() { @Override public Movie apply(Movie t1, Movie t2) { return t2; } }).takeLast(1); Maybe reduceResult2 = horrorMovies.reduce(new BiFunction() { @Override public Movie apply(Movie t1, Movie t2) { return t2; } }); assertNotNull(reduceResult2); } /** * Reduce consumes and produces T so can't do covariance. * * https://github.com/ReactiveX/RxJava/issues/360#issuecomment-24203016 */ @Test public void reduceWithCovariantObjects() { Flowable horrorMovies = Flowable. just(new HorrorMovie()); Maybe reduceResult2 = horrorMovies.reduce(new BiFunction() { @Override public Movie apply(Movie t1, Movie t2) { return t2; } }); assertNotNull(reduceResult2); } /** * Reduce consumes and produces T so can't do covariance. * * https://github.com/ReactiveX/RxJava/issues/360#issuecomment-24203016 */ @Test public void reduceCovariance() { // must type it to Flowable horrorMovies = Flowable. just(new HorrorMovie()); libraryFunctionActingOnMovieObservables(horrorMovies); } /* * This accepts instead of since `reduce` can't handle covariants */ public void libraryFunctionActingOnMovieObservables(Flowable obs) { obs.reduce(new BiFunction() { @Override public Movie apply(Movie t1, Movie t2) { return t2; } }); } }