package com.github.jhusain.learnrxjava.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static rx.Observable.error; import static rx.Observable.just; import static rx.Observable.range; import java.util.Arrays; import java.util.Collections; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import com.github.jhusain.learnrxjava.ObservableExercises; import com.github.jhusain.learnrxjava.ObservableSolutions; import com.github.jhusain.learnrxjava.types.BoxArt; import com.github.jhusain.learnrxjava.types.JSON; import com.github.jhusain.learnrxjava.types.Movie; import com.github.jhusain.learnrxjava.types.Movies; import org.junit.Test; import rx.Observable; import rx.observers.TestSubscriber; public class ObservableSolutionsTest { public ObservableExercises getImpl() { return new ObservableSolutions(); } @Test public void exerciseHello() { TestSubscriber<String> ts = new TestSubscriber<>(); getImpl().exerciseHello().subscribe(ts); ts.awaitTerminalEvent(); ts.assertNoErrors(); ts.assertReceivedOnNext(Arrays.asList("Hello World!")); } @Test public void exerciseMap() { TestSubscriber<String> ts = new TestSubscriber<>(); getImpl().exerciseMap(just("Hello")).subscribe(ts); ts.awaitTerminalEvent(); ts.assertNoErrors(); assertEquals(1, ts.getOnNextEvents().size()); assertTrue(ts.getOnNextEvents().get(0).startsWith("Hello ")); } @Test public void exerciseFilterMap() { TestSubscriber<String> ts = new TestSubscriber<>(); getImpl().exerciseFilterMap(range(1, 10)).subscribe(ts); ts.awaitTerminalEvent(); ts.assertNoErrors(); ts.assertReceivedOnNext(Arrays.asList("2-Even", "4-Even", "6-Even", "8-Even", "10-Even")); } @Test public void exerciseConcatMap() { TestSubscriber<Integer> ts = new TestSubscriber<>(); Observable<Movies> movies = just( new Movies( "New Releases", // name Arrays.asList( // videos new Movie(70111470, "Die Hard", 4.0), new Movie(654356453, "Bad Boys", 5.0))), new Movies( "Dramas", Arrays.asList( new Movie(65432445, "The Chamber", 4.0), new Movie(675465, "Fracture", 5.0))) ); getImpl().exerciseConcatMap(movies).subscribe(ts); ts.awaitTerminalEvent(); ts.assertNoErrors(); ts.assertReceivedOnNext(Arrays.asList(70111470, 654356453, 65432445, 675465)); } @Test public void exerciseFlatMap() { TestSubscriber<Map<Integer, Integer>> ts = new TestSubscriber<>(); Observable<Movies> movies = just( new Movies( "New Releases", // name Arrays.asList( // videos new Movie(70111470, "Die Hard", 4.0), new Movie(654356453, "Bad Boys", 5.0))), new Movies( "Dramas", Arrays.asList( new Movie(65432445, "The Chamber", 4.0), new Movie(675465, "Fracture", 5.0))) ); Map<Integer, Integer> map = getImpl().exerciseFlatMap(movies).toMap(i -> i).toBlocking().single(); assertTrue(map.containsKey(70111470)); assertTrue(map.containsKey(654356453)); assertTrue(map.containsKey(65432445)); assertTrue(map.containsKey(675465)); } @Test public void exerciseReduce() { TestSubscriber<Integer> ts = new TestSubscriber<>(); getImpl().exerciseReduce(just(3, 6, 8, 9, 4, 12, 4, 2)).subscribe(ts); ts.awaitTerminalEvent(); ts.assertNoErrors(); ts.assertReceivedOnNext(Arrays.asList(12)); } @Test public void exerciseMovie() { TestSubscriber<Map<Integer, JSON>> ts = new TestSubscriber<>(); Observable<Movies> movies = just( new Movies( "New Releases", Arrays.asList( new Movie( 70111470, "Die Hard", 4.0, Collections.emptyList(), Arrays.asList( new BoxArt(150, 200, "http://cdn-0.nflximg.com/images/2891/DieHard150.jpg"), new BoxArt(200, 200, "http://cdn-0.nflximg.com/images/2891/DieHard200.jpg") )), new Movie( 654356453, "Bad Boys", 5.0, Collections.emptyList(), Arrays.asList( new BoxArt(200, 200, "http://cdn-0.nflximg.com/images/2891/BadBoys200.jpg"), new BoxArt(140, 200, "http://cdn-0.nflximg.com/images/2891/BadBoys140.jpg") )) ) ), new Movies( "Thrillers", Arrays.asList( new Movie( 65432445, "The Chamber", 3.0, Collections.emptyList(), Arrays.asList( new BoxArt(130, 200, "http://cdn-0.nflximg.com/images/2891/TheChamber130.jpg"), new BoxArt(200, 200, "http://cdn-0.nflximg.com/images/2891/TheChamber200.jpg") )), new Movie( 675465, "Fracture", 4.0, Collections.emptyList(), Arrays.asList( new BoxArt(200, 200, "http://cdn-0.nflximg.com/images/2891/Fracture200.jpg"), new BoxArt(120, 200, "http://cdn-0.nflximg.com/images/2891/Fracture120.jpg"), new BoxArt(300, 200, "http://cdn-0.nflximg.com/images/2891/Fracture300.jpg") )) ) ) ); Map<Integer, JSON> map = getImpl().exerciseMovie(movies).toMap(i -> (int) i.get("id")).toBlocking().single(); System.out.println(map); assertTrue(map.containsKey(70111470)); assertEquals(map.get(70111470).toString(), "{boxart=http://cdn-0.nflximg.com/images/2891/DieHard150.jpg, id=70111470, title=Die Hard}"); assertTrue(map.containsKey(654356453)); assertEquals(map.get(654356453).toString(), "{boxart=http://cdn-0.nflximg.com/images/2891/BadBoys140.jpg, id=654356453, title=Bad Boys}"); assertTrue(map.containsKey(65432445)); assertEquals(map.get(65432445).toString(), "{boxart=http://cdn-0.nflximg.com/images/2891/TheChamber130.jpg, id=65432445, title=The Chamber}"); assertTrue(map.containsKey(675465)); assertEquals(map.get(675465).toString(), "{boxart=http://cdn-0.nflximg.com/images/2891/Fracture120.jpg, id=675465, title=Fracture}"); } @Test public void exerciseZip() { TestSubscriber<String> ts = new TestSubscriber<>(); getImpl().exerciseZip(just("one", "two", "blue", "red"), just("fish", "fish", "fish", "fish")).subscribe(ts); ts.awaitTerminalEvent(); ts.assertNoErrors(); ts.assertReceivedOnNext(Arrays.asList("one fish", "two fish", "blue fish", "red fish")); } @Test public void handleError() { TestSubscriber<String> ts = new TestSubscriber<>(); getImpl().handleError(error(new RuntimeException("failure"))).subscribe(ts); ts.awaitTerminalEvent(); ts.assertNoErrors(); ts.assertReceivedOnNext(Arrays.asList("default-value")); } @Test public void retry() { TestSubscriber<String> ts = new TestSubscriber<>(); AtomicInteger c = new AtomicInteger(); Observable<String> o = Observable.create(s -> { if (c.incrementAndGet() <= 1) { s.onError(new RuntimeException("fail")); } else { s.onNext("success!"); s.onCompleted(); } }); getImpl().retry(o).subscribe(ts); ts.awaitTerminalEvent(); ts.assertNoErrors(); ts.assertReceivedOnNext(Arrays.asList("success!")); } /** * The data stream fails intermittently so return the stream * with retry capability. */ public Observable<String> retry(Observable<String> data) { return data.retry(); } }