@Test public void testConcatCovariance4() { final HorrorMovie horrorMovie1 = new HorrorMovie(); final Movie movie = new Movie(); Media media = new Media(); HorrorMovie horrorMovie2 = new HorrorMovie(); Observable<Movie> o1 = Observable.unsafeCreate(new ObservableSource<Movie>() { @Override public void subscribe(Observer<? super Movie> o) { o.onNext(horrorMovie1); o.onNext(movie); // o.onNext(new Media()); // correctly doesn't compile o.onComplete(); } }); Observable<Media> o2 = Observable.just(media, horrorMovie2); List<Media> values = Observable.concat(o1, o2).toList().blockingGet(); assertEquals(horrorMovie1, values.get(0)); assertEquals(movie, values.get(1)); assertEquals(media, values.get(2)); assertEquals(horrorMovie2, values.get(3)); assertEquals(4, values.size()); } }
/** * This won't compile if super/extends isn't done correctly on generics. */ @Test public void testCovarianceOfCombineLatest() { Observable<HorrorMovie> horrors = Observable.just(new HorrorMovie()); Observable<CoolRating> ratings = Observable.just(new CoolRating()); Observable.<Movie, CoolRating, Result> combineLatest(horrors, ratings, combine).blockingForEach(action); Observable.<Movie, CoolRating, Result> combineLatest(horrors, ratings, combine).blockingForEach(action); Observable.<Media, Rating, ExtendedResult> combineLatest(horrors, ratings, combine).blockingForEach(extendedAction); Observable.<Media, Rating, Result> combineLatest(horrors, ratings, combine).blockingForEach(action); Observable.<Media, Rating, ExtendedResult> combineLatest(horrors, ratings, combine).blockingForEach(action); Observable.<Movie, CoolRating, Result> combineLatest(horrors, ratings, combine); }
@Override public Observable<Movie> call() { return Observable.just( new HorrorMovie(), new Movie() ); } });
@Override public Observable<HorrorMovie> apply(Observable<Movie> t) { return Observable.just(new HorrorMovie()); } });
@SuppressWarnings("unused") @Test public void testCovarianceOfCompose() { Observable<HorrorMovie> movie = Observable.just(new HorrorMovie()); Observable<Movie> movie2 = movie.compose(new ObservableTransformer<HorrorMovie, Movie>() { @Override public Observable<Movie> apply(Observable<HorrorMovie> t) { return Observable.just(new Movie()); } }); }
@Test public void testMergeCovariance3() { Observable<Movie> o1 = Observable.just(new HorrorMovie(), new Movie()); Observable<Media> o2 = Observable.just(new Media(), new HorrorMovie()); List<Media> values = Observable.merge(o1, o2).toList().blockingGet(); assertTrue(values.get(0) instanceof HorrorMovie); assertTrue(values.get(1) instanceof Movie); assertTrue(values.get(2) != null); assertTrue(values.get(3) instanceof HorrorMovie); }
@SuppressWarnings("unused") @Test public void testCovarianceOfCompose2() { Observable<Movie> movie = Observable.<Movie> just(new HorrorMovie()); Observable<HorrorMovie> movie2 = movie.compose(new ObservableTransformer<Movie, HorrorMovie>() { @Override public Observable<HorrorMovie> apply(Observable<Movie> t) { return Observable.just(new HorrorMovie()); } }); }
/** * 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 <Movie> Observable<Movie> horrorMovies = Observable.<Movie> just(new HorrorMovie()); libraryFunctionActingOnMovieObservables(horrorMovies); }
/** * This won't compile if super/extends isn't done correctly on generics. */ @Test public void testCovarianceOfFrom() { Observable.<Movie> just(new HorrorMovie()); Observable.<Movie> fromIterable(new ArrayList<HorrorMovie>()); // Observable.<HorrorMovie>from(new Movie()); // may not compile }
@Test public void testMergeCovariance2() { Observable<Media> o1 = Observable.just(new HorrorMovie(), new Movie(), new Media()); Observable<Media> o2 = Observable.just(new Media(), new HorrorMovie()); Observable<Observable<Media>> os = Observable.just(o1, o2); List<Media> values = Observable.merge(os).toList().blockingGet(); assertEquals(5, values.size()); }
@Test public void testMergeCovariance() { Observable<Media> o1 = Observable.<Media> just(new HorrorMovie(), new Movie()); Observable<Media> o2 = Observable.just(new Media(), new HorrorMovie()); Observable<Observable<Media>> os = Observable.just(o1, o2); List<Media> values = Observable.merge(os).toList().blockingGet(); assertEquals(4, values.size()); }
/** * This won't compile if super/extends isn't done correctly on generics. */ @Test public void testCovarianceOfMerge() { Observable<HorrorMovie> horrors = Observable.just(new HorrorMovie()); Observable<Observable<HorrorMovie>> metaHorrors = Observable.just(horrors); Observable.<Media> merge(metaHorrors); }
@Test public void testComposeWithDeltaLogic() { List<Movie> list1 = Arrays.asList(new Movie(), new HorrorMovie(), new ActionMovie()); List<Movie> list2 = Arrays.asList(new ActionMovie(), new Movie(), new HorrorMovie(), new ActionMovie()); Observable<List<Movie>> movies = Observable.just(list1, list2); movies.compose(deltaTransformer); }
@Override public Observable<HorrorMovie> apply(Observable<Movie> t) { return Observable.just(new HorrorMovie()).map(new Function<HorrorMovie, HorrorMovie>() { @Override public HorrorMovie apply(HorrorMovie v) { return v; } }); } }
@Test public void testGroupByCompose() { Observable<Movie> movies = Observable.just(new HorrorMovie(), new ActionMovie(), new Movie()); TestObserver<String> to = new TestObserver<String>(); movies
@SuppressWarnings("unused") @Test public void reduceWithObjectsObservable() { Observable<Movie> horrorMovies = Observable.<Movie> just(new HorrorMovie()); Observable<Movie> reduceResult = horrorMovies.scan(new BiFunction<Movie, Movie, Movie>() { @Override public Movie apply(Movie t1, Movie t2) { return t2; } }).takeLast(1); Observable<Movie> reduceResult2 = horrorMovies.reduce(new BiFunction<Movie, Movie, Movie>() { @Override public Movie apply(Movie t1, Movie t2) { return t2; } }).toObservable(); assertNotNull(reduceResult2); }
@Test public void testConcatCovariance2() { HorrorMovie horrorMovie1 = new HorrorMovie(); Movie movie = new Movie(); Media media1 = new Media(); Media media2 = new Media(); HorrorMovie horrorMovie2 = new HorrorMovie(); Observable<Media> o1 = Observable.just(horrorMovie1, movie, media1); Observable<Media> o2 = Observable.just(media2, horrorMovie2); Observable<Observable<Media>> os = Observable.just(o1, o2); List<Media> values = Observable.concat(os).toList().blockingGet(); assertEquals(horrorMovie1, values.get(0)); assertEquals(movie, values.get(1)); assertEquals(media1, values.get(2)); assertEquals(media2, values.get(3)); assertEquals(horrorMovie2, values.get(4)); assertEquals(5, values.size()); }
@SuppressWarnings("unused") @Test public void reduceWithObjects() { Observable<Movie> horrorMovies = Observable.<Movie> just(new HorrorMovie()); Observable<Movie> reduceResult = horrorMovies.scan(new BiFunction<Movie, Movie, Movie>() { @Override public Movie apply(Movie t1, Movie t2) { return t2; } }).takeLast(1); Maybe<Movie> reduceResult2 = horrorMovies.reduce(new BiFunction<Movie, Movie, Movie>() { @Override public Movie apply(Movie t1, Movie t2) { return t2; } }); assertNotNull(reduceResult2); }
@Test public void testMergeCovariance4() { Observable<Movie> o1 = Observable.defer(new Callable<Observable<Movie>>() { @Override public Observable<Movie> call() { return Observable.just( new HorrorMovie(), new Movie() ); } }); Observable<Media> o2 = Observable.just(new Media(), new HorrorMovie()); List<Media> values = Observable.merge(o1, o2).toList().blockingGet(); assertTrue(values.get(0) instanceof HorrorMovie); assertTrue(values.get(1) instanceof Movie); assertTrue(values.get(2) != null); assertTrue(values.get(3) instanceof HorrorMovie); }
@SuppressWarnings("unused") @Test public void testCovarianceOfCompose3() { Observable<Movie> movie = Observable.<Movie>just(new HorrorMovie()); Observable<HorrorMovie> movie2 = movie.compose(new ObservableTransformer<Movie, HorrorMovie>() { @Override public Observable<HorrorMovie> apply(Observable<Movie> t) { return Observable.just(new HorrorMovie()).map(new Function<HorrorMovie, HorrorMovie>() { @Override public HorrorMovie apply(HorrorMovie v) { return v; } }); } } ); }