### Question:
MultiSwitchIfEmpty implements Multi<T> { @Override public void subscribe(Flow.Subscriber<? super T> subscriber) { source.subscribe(new SwitchIfEmptyMainSubscriber<>(subscriber, fallback)); } MultiSwitchIfEmpty(Multi<T> source, Flow.Publisher<T> fallback); @Override void subscribe(Flow.Subscriber<? super T> subscriber);  }### Answer:
@Test public void normal() { TestSubscriber<Integer> ts = new TestSubscriber<>(Long.MAX_VALUE); Multi.just(1) .switchIfEmpty(Multi.singleton(2)) .subscribe(ts); ts.assertResult(1); }
@Test public void fallback() { TestSubscriber<Integer> ts = new TestSubscriber<>(Long.MAX_VALUE); Multi.<Integer>empty() .switchIfEmpty(Multi.singleton(2)) .subscribe(ts); ts.assertResult(2); }
@Test public void fallbackBackpressured() { TestSubscriber<Integer> ts = new TestSubscriber<>(); Multi.<Integer>empty() .switchIfEmpty(Multi.singleton(2)) .subscribe(ts); ts .assertEmpty() .request(1) .assertResult(2); }
@Test public void error() { TestSubscriber<Integer> ts = new TestSubscriber<>(Long.MAX_VALUE); Multi.<Integer>error(new IOException()) .switchIfEmpty(Multi.singleton(2)) .subscribe(ts); ts.assertFailure(IOException.class); }
@Test public void fallbackError() { TestSubscriber<Integer> ts = new TestSubscriber<>(Long.MAX_VALUE); Multi.<Integer>empty() .switchIfEmpty(Multi.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); Multi.create(sp) .switchIfEmpty(Multi.singleton(2)) .subscribe(ts); assertTrue(sp.hasSubscribers()); ts.assertEmpty(); ts.cancel(); assertFalse(sp.hasSubscribers()); }
@Test public void cancelFallback() { SubmissionPublisher<Integer> sp = new SubmissionPublisher<>(Runnable::run, 128); TestSubscriber<Integer> ts = new TestSubscriber<>(Long.MAX_VALUE); Multi.<Integer>empty() .switchIfEmpty(Multi.create(sp)) .subscribe(ts); assertTrue(sp.hasSubscribers()); ts.assertEmpty(); ts.cancel(); assertFalse(sp.hasSubscribers()); }