package com.marverenic.music.utils; import org.junit.Before; import org.junit.Test; import rx.Observable; import rx.observers.TestSubscriber; public class ObservableQueueTest { private ObservableQueue<String> mSubject; @Before public void setUp() { mSubject = new ObservableQueue<>(); } @Test public void testEnqueueOnce() { TestSubscriber<String> subscriber = new TestSubscriber<>(); mSubject.toObservable().subscribe(subscriber); subscriber.assertNoTerminalEvent(); subscriber.assertNoValues(); mSubject.enqueue("Hello world!"); subscriber.assertNoTerminalEvent(); subscriber.assertValue("Hello world!"); } @Test public void testEnqueueSeveralTimes() { TestSubscriber<String> subscriber = new TestSubscriber<>(); mSubject.toObservable().subscribe(subscriber); subscriber.assertNoTerminalEvent(); subscriber.assertNoValues(); mSubject.enqueue("Hello world!"); mSubject.enqueue("My hands are typing words!"); mSubject.enqueue("HAAAAAANDS!"); subscriber.assertNoTerminalEvent(); subscriber.assertValues("Hello world!", "My hands are typing words!", "HAAAAAANDS!"); } @Test public void testValuesPostedAfterLateSubscribe() { TestSubscriber<String> subscriber = new TestSubscriber<>(); mSubject.enqueue("Hello world!"); mSubject.enqueue("My hands are typing words!"); mSubject.enqueue("HAAAAAANDS!"); mSubject.toObservable().subscribe(subscriber); subscriber.assertNoTerminalEvent(); subscriber.assertValues("Hello world!", "My hands are typing words!", "HAAAAAANDS!"); } @Test public void testSubscribeTwice() { TestSubscriber<String> subscriber1 = new TestSubscriber<>(); TestSubscriber<String> subscriber2 = new TestSubscriber<>(); mSubject.toObservable().subscribe(subscriber1); mSubject.enqueue("sub-1 obj-1"); mSubject.enqueue("sub-1 obj-2"); subscriber1.assertNoTerminalEvent(); subscriber1.assertValues("sub-1 obj-1", "sub-1 obj-2"); mSubject.toObservable().subscribe(subscriber2); subscriber1.assertCompleted(); mSubject.enqueue("sub-2 obj-1"); mSubject.enqueue("sub-2 obj-2"); subscriber2.assertNoTerminalEvent(); subscriber2.assertValues("sub-2 obj-1", "sub-2 obj-2"); } @Test public void testEarlyUnsubscribeDoesNotDestroyQueue() { TestSubscriber<String> subscriber1 = new TestSubscriber<>(); TestSubscriber<String> subscriber2 = new TestSubscriber<>(); mSubject.enqueue("Thing 1"); mSubject.enqueue("Thing 2"); mSubject.enqueue("Thing 3"); mSubject.enqueue("Thing 4"); mSubject.toObservable().take(1).subscribe(subscriber1); subscriber1.assertTerminalEvent(); subscriber1.assertValue("Thing 1"); mSubject.toObservable().subscribe(subscriber2); subscriber2.assertNoTerminalEvent(); subscriber2.assertValues("Thing 2", "Thing 3", "Thing 4"); } @Test public void testConsistencyOfEnqueueBeforeSubscribe() { TestSubscriber<String> subscriber = new TestSubscriber<>(); mSubject.enqueue("Hello world!"); mSubject.enqueue("My hands are typing words!"); Observable<String> observable = mSubject.toObservable(); mSubject.enqueue("HAAAAAANDS!"); observable.subscribe(subscriber); subscriber.assertNoTerminalEvent(); subscriber.assertValues("Hello world!", "My hands are typing words!", "HAAAAAANDS!"); } }