/*
* Copyright 2015 Jacek Marchwicki <jacek.marchwicki@gmail.com>
*
* 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 com.appunite.rx;
import com.google.common.collect.ImmutableList;
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoAnnotations;
import javax.annotation.Nonnull;
import rx.Observable;
import rx.Subscription;
import rx.observers.TestSubscriber;
import rx.subjects.PublishSubject;
import static com.google.common.truth.Truth.assert_;
public class ObservableExtensionsTest {
@Nonnull
private final PublishSubject<String> subject = PublishSubject.create();
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void testBehaviorRefCountWithTwoParallelSchedulers_returnsSameValue() throws Exception {
final Observable<String> refCount = subject.compose(ObservableExtensions.<String>behaviorRefCount());
final TestSubscriber<String> stringSubscriber1 = new TestSubscriber<>();
final TestSubscriber<String> stringSubscriber2 = new TestSubscriber<>();
refCount.subscribe(stringSubscriber1);
refCount.subscribe(stringSubscriber2);
subject.onNext("test1");
assert_().that(stringSubscriber1.getOnNextEvents()).isEqualTo(ImmutableList.of("test1"));
assert_().that(stringSubscriber2.getOnNextEvents()).isEqualTo(ImmutableList.of("test1"));
stringSubscriber1.assertNoErrors();
stringSubscriber2.assertNoErrors();
}
@Test
public void testBehaviorConnectedWithTwoParallelSchedulers_returnsSameValue() throws Exception {
final Observable<String> refCount = subject.compose(ObservableExtensions.<String>behaviorConnected());
final TestSubscriber<String> stringSubscriber1 = new TestSubscriber<>();
final TestSubscriber<String> stringSubscriber2 = new TestSubscriber<>();
refCount.subscribe(stringSubscriber1);
refCount.subscribe(stringSubscriber2);
subject.onNext("test1");
assert_().that(stringSubscriber1.getOnNextEvents()).isEqualTo(ImmutableList.of("test1"));
assert_().that(stringSubscriber2.getOnNextEvents()).isEqualTo(ImmutableList.of("test1"));
stringSubscriber1.assertNoErrors();
stringSubscriber2.assertNoErrors();
}
@Test
public void testBehaviorRefCountNextValueBeforeSubscription_isIgnoredAfterSubscribe() throws Exception {
final Observable<String> connected = subject.compose(ObservableExtensions.<String>behaviorRefCount());
final TestSubscriber<String> stringSubscriber = new TestSubscriber<>();
subject.onNext("test1");
connected.subscribe(stringSubscriber);
assert_().that(stringSubscriber.getOnNextEvents()).isEqualTo(ImmutableList.of());
}
@Test
public void testBehaviorConnectedNextValueBeforeSubscription_returnResultAfterSubscribe() throws Exception {
final Observable<String> connected = subject.compose(ObservableExtensions.<String>behaviorConnected());
connected.subscribe(); // without subscribe behavior will not connect
final TestSubscriber<String> stringSubscriber = new TestSubscriber<>();
subject.onNext("test1");
connected.subscribe(stringSubscriber);
assert_().that(stringSubscriber.getOnNextEvents()).isEqualTo(ImmutableList.of("test1"));
}
@Test
public void testBehaviorRefCountAfterUnsubscribinAllSubscribers_newSchedulerWillNotGetData() throws Exception {
final Observable<String> refCount = subject.compose(ObservableExtensions.<String>behaviorRefCount());
final TestSubscriber<String> stringSubscriber1 = new TestSubscriber<>();
final TestSubscriber<String> stringSubscriber2 = new TestSubscriber<>();
final Subscription s1 = refCount.subscribe(stringSubscriber1);
subject.onNext("test1");
assert_().that(stringSubscriber1.getOnNextEvents()).isEqualTo(ImmutableList.of("test1"));
s1.unsubscribe();
refCount.subscribe(stringSubscriber2);
assert_().that(stringSubscriber2.getOnNextEvents()).isEmpty();
stringSubscriber1.assertNoErrors();
stringSubscriber2.assertNoErrors();
}
@Test
public void testBehaviorConnectedAfterUnsubscribinAllSubscribers_newSchedulerWillGetData() throws Exception {
final Observable<String> refCount = subject.compose(ObservableExtensions.<String>behaviorConnected());
final TestSubscriber<String> stringSubscriber1 = new TestSubscriber<>();
final TestSubscriber<String> stringSubscriber2 = new TestSubscriber<>();
final Subscription s1 = refCount.subscribe(stringSubscriber1);
subject.onNext("test1");
assert_().that(stringSubscriber1.getOnNextEvents()).isEqualTo(ImmutableList.of("test1"));
s1.unsubscribe();
refCount.subscribe(stringSubscriber2);
assert_().that(stringSubscriber2.getOnNextEvents()).isEqualTo(ImmutableList.of("test1"));
stringSubscriber1.assertNoErrors();
stringSubscriber2.assertNoErrors();
}
@Test
public void testBehaviorRefCountAfterSubsribingToAlreadySubscribedScheduler_getSameData() throws Exception {
final Observable<String> refCount = subject.compose(ObservableExtensions.<String>behaviorRefCount());
final TestSubscriber<String> stringSubscriber1 = new TestSubscriber<>();
final TestSubscriber<String> stringSubscriber2 = new TestSubscriber<>();
refCount.subscribe(stringSubscriber1);
subject.onNext("test1");
assert_().that(stringSubscriber1.getOnNextEvents()).isEqualTo(ImmutableList.of("test1"));
stringSubscriber1.assertNoErrors();
refCount.subscribe(stringSubscriber2);
assert_().that(stringSubscriber2.getOnNextEvents()).isEqualTo(ImmutableList.of("test1"));
stringSubscriber2.assertNoErrors();
}
@Test
public void testBehaviorConnectedAfterSubsribingToAlreadySubscribedScheduler_getSameData() throws Exception {
final Observable<String> refCount = subject.compose(ObservableExtensions.<String>behaviorConnected());
final TestSubscriber<String> stringSubscriber1 = new TestSubscriber<>();
final TestSubscriber<String> stringSubscriber2 = new TestSubscriber<>();
refCount.subscribe(stringSubscriber1);
subject.onNext("test1");
assert_().that(stringSubscriber1.getOnNextEvents()).isEqualTo(ImmutableList.of("test1"));
stringSubscriber1.assertNoErrors();
refCount.subscribe(stringSubscriber2);
assert_().that(stringSubscriber2.getOnNextEvents()).isEqualTo(ImmutableList.of("test1"));
stringSubscriber2.assertNoErrors();
}
@Test
public void testBehaviorRefCountAfterGettingTwoDataOnFirstSubscription_newWillOnlyGetLastData() throws Exception {
final Observable<String> refCount = subject.compose(ObservableExtensions.<String>behaviorRefCount());
final TestSubscriber<String> stringSubscriber1 = new TestSubscriber<>();
final TestSubscriber<String> stringSubscriber2 = new TestSubscriber<>();
refCount.subscribe(stringSubscriber1);
subject.onNext("test1");
subject.onNext("test2");
assert_().that(stringSubscriber1.getOnNextEvents()).isEqualTo(ImmutableList.of("test1", "test2"));
stringSubscriber1.assertNoErrors();
refCount.subscribe(stringSubscriber2);
assert_().that(stringSubscriber2.getOnNextEvents()).isEqualTo(ImmutableList.of("test2"));
stringSubscriber2.assertNoErrors();
}
@Test
public void testBehaviorConnectedAfterGettingTwoDataOnFirstSubscription_newWillOnlyGetLastData() throws Exception {
final Observable<String> refCount = subject.compose(ObservableExtensions.<String>behaviorConnected());
final TestSubscriber<String> stringSubscriber1 = new TestSubscriber<>();
final TestSubscriber<String> stringSubscriber2 = new TestSubscriber<>();
refCount.subscribe(stringSubscriber1);
subject.onNext("test1");
subject.onNext("test2");
assert_().that(stringSubscriber1.getOnNextEvents()).isEqualTo(ImmutableList.of("test1", "test2"));
stringSubscriber1.assertNoErrors();
refCount.subscribe(stringSubscriber2);
assert_().that(stringSubscriber2.getOnNextEvents()).isEqualTo(ImmutableList.of("test2"));
stringSubscriber2.assertNoErrors();
}
}