/** * Copyright 2016 Netflix, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See * the License for the specific language governing permissions and limitations under the License. */ package io.reactivex.observers; import io.reactivex.Observable; import io.reactivex.functions.*; import io.reactivex.internal.fuseable.*; /** * Utility methods that return functional interfaces to support assertions regarding fusion * in a TestObserver. *

Don't move this class as it needs package-private access to TestObserver's internals. */ public enum ObserverFusion { ; /** * Returns a function that takes a Flowable and returns a TestObserver that * is set up according to the parameters and is subscribed to the Flowable. *

* Use this as follows: *

     * source
     * .to(ObserverFusion.test(0, QueueDisposable.ANY, false))
     * .assertResult(0);
     * 
* @param the value type * @param mode the fusion mode to request, see {@link QueueDisposable} constants. * @param cancelled should the TestObserver cancelled before the subscription even happens? * @return the new Function instance */ public static Function, TestObserver> test( final int mode, final boolean cancelled) { return new Function, TestObserver>() { @Override public TestObserver apply(Observable t) throws Exception { TestObserver ts = new TestObserver(); ts.setInitialFusionMode(mode); if (cancelled) { ts.cancel(); } t.subscribe(ts); return ts; } }; } /** * Returns a Consumer that asserts on its TestObserver parameter that * the upstream is Fuseable (sent a QueueDisposable subclass in onSubscribe). *

* Use this as follows: *

     * source
     * .to(ObserverFusion.test(0, QueueDisposable.ANY, false))
     * .assertOf(ObserverFusion.assertFuseable());
     * 
* @param the value type * @return the new Consumer instance */ @SuppressWarnings({ "unchecked", "rawtypes" }) public static Consumer> assertFuseable() { return (Consumer)AssertFuseable.INSTANCE; } enum AssertFuseable implements Consumer> { INSTANCE; @Override public void accept(TestObserver ts) throws Exception { ts.assertFuseable(); } } /** * Returns a Consumer that asserts on its TestObserver parameter that * the upstream is not Fuseable (didn't sent a QueueDisposable subclass in onSubscribe). *

* Use this as follows: *

     * source
     * .to(ObserverFusion.test(0, QueueDisposable.ANY, false))
     * .assertOf(ObserverFusion.assertNotFuseable());
     * 
* @param the value type * @return the new Consumer instance */ @SuppressWarnings({ "unchecked", "rawtypes" }) public static Consumer> assertNotFuseable() { return (Consumer)AssertNotFuseable.INSTANCE; } enum AssertNotFuseable implements Consumer> { INSTANCE; @Override public void accept(TestObserver ts) throws Exception { ts.assertNotFuseable(); } } /** * Returns a Consumer that asserts on its TestObserver parameter that * the upstream is Fuseable (sent a QueueDisposable subclass in onSubscribe) * and the established the given fusion mode. *

* Use this as follows: *

     * source
     * .to(ObserverFusion.test(0, QueueDisposable.ANY, false))
     * .assertOf(ObserverFusion.assertFusionMode(QueueDisposable.SYNC));
     * 
* @param the value type * @param mode the expected established fusion mode, see {@link QueueDisposable} constants. * @return the new Consumer instance */ public static Consumer> assertFusionMode(final int mode) { return new Consumer>() { @Override public void accept(TestObserver ts) throws Exception { ts.assertFusionMode(mode); } }; } /** * Constructs a TestObserver with the given required fusion mode. * @param the value type * @param mode the requested fusion mode, see {@link QueueSubscription} constants * @return the new TestSubscriber */ public static TestObserver newTest(int mode) { TestObserver ts = new TestObserver(); ts.setInitialFusionMode(mode); return ts; }}