### Question:
SingleSwitchIfEmpty extends CompletionSingle<T> { @Override public void subscribe(Flow.Subscriber<? super T> subscriber) { source.subscribe(new SwitchIfEmptySubscriber<>(subscriber, fallback)); } SingleSwitchIfEmpty(Single<T> source, Single<T> fallback); @Override void subscribe(Flow.Subscriber<? super T> subscriber);  }### Answer:
@Test public void normal() { TestSubscriber<Integer> ts = new TestSubscriber<>(Long.MAX_VALUE); Single.just(1) .switchIfEmpty(Single.just(2)) .subscribe(ts); ts.assertResult(1); }
@Test public void fallback() { TestSubscriber<Integer> ts = new TestSubscriber<>(Long.MAX_VALUE); Single.<Integer>empty() .switchIfEmpty(Single.just(2)) .subscribe(ts); ts.assertResult(2); }
@Test public void fallbackEmpty() { TestSubscriber<Integer> ts = new TestSubscriber<>(Long.MAX_VALUE); AtomicInteger count = new AtomicInteger(); Single.<Integer>empty() .switchIfEmpty(Single.<Integer>empty().onComplete(count::getAndIncrement)) .subscribe(ts); ts.assertResult(); }
@Test public void fallbackBackpressured() { TestSubscriber<Integer> ts = new TestSubscriber<>(); Single.<Integer>empty() .switchIfEmpty(Single.just(2)) .subscribe(ts); ts .assertEmpty() .request(1) .assertResult(2); }
@Test public void error() { TestSubscriber<Integer> ts = new TestSubscriber<>(Long.MAX_VALUE); Single.<Integer>error(new IOException()) .switchIfEmpty(Single.just(2)) .subscribe(ts); ts.assertFailure(IOException.class); }
@Test public void fallbackError() { TestSubscriber<Integer> ts = new TestSubscriber<>(Long.MAX_VALUE); Single.<Integer>empty() .switchIfEmpty(Single.error(new IOException())) .subscribe(ts); ts.assertFailure(IOException.class); }
@Test public void cancel() { SubmissionPublisher<Integer> sp = new SubmissionPublisher<>(Runnable::run, 128); TestSubscriber<Integer> ts = new TestSubscriber<>(Long.MAX_VALUE); Single.create(sp) .switchIfEmpty(Single.just(2)) .subscribe(ts); assertTrue(sp.hasSubscribers()); ts.assertEmpty(); ts.cancel(); assertFalse(sp.hasSubscribers()); }
@Test public void cancelOther() { SubmissionPublisher<Integer> sp = new SubmissionPublisher<>(Runnable::run, 128); TestSubscriber<Integer> ts = new TestSubscriber<>(Long.MAX_VALUE); Single.<Integer>empty() .switchIfEmpty(Single.create(sp)) .subscribe(ts); assertTrue(sp.hasSubscribers()); ts.assertEmpty(); ts.cancel(); assertFalse(sp.hasSubscribers()); }