/** * 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.subscribers; import io.reactivex.Flowable; import io.reactivex.functions.*; import io.reactivex.internal.fuseable.*; /** * Utility methods that return functional interfaces to support assertions regarding fusion * in a TestSubscriber. *

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

* Use this as follows: *

     * source
     * .to(SubscriberFusion.test(0, QueueSubscription.ANY, false))
     * .assertResult(0);
     * 
* @param the value type * @param initialRequest the initial request amount, non-negative * @param mode the fusion mode to request, see {@link QueueSubscription} constants. * @param cancelled should the TestSubscriber cancelled before the subscription even happens? * @return the new Function instance */ public static Function, TestSubscriber> test( final long initialRequest, final int mode, final boolean cancelled) { return new Function, TestSubscriber>() { @Override public TestSubscriber apply(Flowable t) throws Exception { TestSubscriber ts = new TestSubscriber(initialRequest); ts.setInitialFusionMode(mode); if (cancelled) { ts.cancel(); } t.subscribe(ts); return ts; } }; } /** * Returns a Consumer that asserts on its TestSubscriber 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(TestSubscriber ts) throws Exception { ts.assertFuseable(); } } /** * Returns a Consumer that asserts on its TestSubscriber 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(TestSubscriber ts) throws Exception { ts.assertNotFuseable(); } } /** * Returns a Consumer that asserts on its TestSubscriber parameter that * the upstream is Fuseable (sent a QueueSubscription subclass in onSubscribe) * and the established the given fusion mode. *

* Use this as follows: *

     * source
     * .to(SubscriberFusion.test(0, QueueSubscription.ANY, false))
     * .assertOf(SubscriberFusion.assertFusionMode(QueueSubscription.SYNC));
     * 
* @param the value type * @param mode the expected established fusion mode, see {@link QueueSubscription} constants. * @return the new Consumer instance */ public static Consumer> assertFusionMode(final int mode) { return new Consumer>() { @Override public void accept(TestSubscriber ts) throws Exception { ts.assertFusionMode(mode); } }; } /** * Constructs a TestSubscriber with the given initial request and required fusion mode. * @param the value type * @param initialRequest the initial request, non-negative * @param mode the requested fusion mode, see {@link QueueSubscription} constants * @return the new TestSubscriber */ public static TestSubscriber newTest(long initialRequest, int mode) { TestSubscriber ts = new TestSubscriber(initialRequest); ts.setInitialFusionMode(mode); return ts; } /** * Constructs a TestSubscriber 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 TestSubscriber newTest(int mode) { TestSubscriber ts = new TestSubscriber(); ts.setInitialFusionMode(mode); return ts; } }