@Override public Observable<Movie> apply(List<List<Movie>> listOfLists) { if (listOfLists.size() == 1) { return Observable.fromIterable(listOfLists.get(0)); } else { // diff the two List<Movie> newList = listOfLists.get(1); List<Movie> oldList = new ArrayList<Movie>(listOfLists.get(0)); Set<Movie> delta = new LinkedHashSet<Movie>(); delta.addAll(newList); // remove all that match in old delta.removeAll(oldList); // filter oldList to those that aren't in the newList oldList.removeAll(newList); // for all left in the oldList we'll create DROP events for (@SuppressWarnings("unused") Movie old : oldList) { delta.add(new Movie()); } return Observable.fromIterable(delta); } } };
@Override public Observable<Movie> apply(Observable<HorrorMovie> t) { return Observable.just(new Movie()); } });
@Test public void testConcatCovariance() { HorrorMovie horrorMovie1 = new HorrorMovie(); Movie movie = new Movie(); Media media = new Media(); HorrorMovie horrorMovie2 = new HorrorMovie(); Observable<Media> o1 = Observable.<Media> just(horrorMovie1, movie); Observable<Media> o2 = Observable.just(media, 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(media, values.get(2)); assertEquals(horrorMovie2, values.get(3)); assertEquals(4, values.size()); }
@Test public void testSortedList() { Comparator<Media> SORT_FUNCTION = new Comparator<Media>() { @Override public int compare(Media t1, Media t2) { return 1; } }; // this one would work without the covariance generics Observable<Media> o = Observable.just(new Movie(), new TVSeason(), new Album()); o.toSortedList(SORT_FUNCTION); // this one would NOT work without the covariance generics Observable<Movie> o2 = Observable.just(new Movie(), new ActionMovie(), new HorrorMovie()); o2.toSortedList(SORT_FUNCTION); }
@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()); }
@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<Movie> apply(Observable<HorrorMovie> t) { return Observable.just(new Movie()); } });
@Override public Observable<Movie> call() { return Observable.just( new HorrorMovie(), 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); }
@Test public void testGroupByCompose() { Observable<Movie> movies = Observable.just(new HorrorMovie(), new ActionMovie(), new Movie()); TestObserver<String> to = new TestObserver<String>(); movies
@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()); } }
@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()); }
@Test public void testSortedList() { Comparator<Media> sortFunction = new Comparator<Media>() { @Override public int compare(Media t1, Media t2) { return 1; } }; // this one would work without the covariance generics Observable<Media> o = Observable.just(new Movie(), new TVSeason(), new Album()); o.toSortedList(sortFunction); // this one would NOT work without the covariance generics Observable<Movie> o2 = Observable.just(new Movie(), new ActionMovie(), new HorrorMovie()); o2.toSortedList(sortFunction); }
@Test public void testConcatCovariance3() { HorrorMovie horrorMovie1 = new HorrorMovie(); Movie movie = new Movie(); Media media = new Media(); HorrorMovie horrorMovie2 = new HorrorMovie(); Observable<Movie> o1 = Observable.just(horrorMovie1, movie); 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()); }
@Override public Observable<Movie> call() { return Observable.just( new HorrorMovie(), new Movie() ); } });
@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()); }
@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); }
@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); }
@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()); }