package com.github.davidmoten.rx.subjects; import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.List; import org.junit.Test; import rx.Notification; import rx.Notification.Kind; import rx.Subscriber; import rx.functions.Action1; public class PublishSubjectSingleSubscriberTest { @Test public void testCanCallWithoutBeingSubscribed() { PublishSubjectSingleSubscriber<Integer> subject = PublishSubjectSingleSubscriber.create(); subject.onNext(1); subject.onError(new RuntimeException()); subject.onCompleted(); } @Test public void testOnNextThenComplete() { PublishSubjectSingleSubscriber<Integer> subject = PublishSubjectSingleSubscriber.create(); final List<Notification<Integer>> list = new ArrayList<Notification<Integer>>(); subject.materialize().forEach(new Action1<Notification<Integer>>() { @Override public void call(Notification<Integer> n) { list.add(n); } }); subject.onNext(1); subject.onCompleted(); assertEquals(2, list.size()); assertEquals(1, (int) list.get(0).getValue()); assertEquals(Kind.OnCompleted, list.get(1).getKind()); } @Test public void testError() { PublishSubjectSingleSubscriber<Integer> subject = PublishSubjectSingleSubscriber.create(); final List<Notification<Integer>> list = new ArrayList<Notification<Integer>>(); subject.materialize().forEach(new Action1<Notification<Integer>>() { @Override public void call(Notification<Integer> n) { list.add(n); } }); subject.onNext(1); RuntimeException e = new RuntimeException(); subject.onError(e); assertEquals(2, list.size()); assertEquals(1, (int) list.get(0).getValue()); assertEquals(Kind.OnError, list.get(1).getKind()); assertEquals(e, list.get(1).getThrowable()); } @Test public void testCanOnlySubscribeOnce() { PublishSubjectSingleSubscriber<Integer> subject = PublishSubjectSingleSubscriber.create(); final List<Notification<Integer>> list = new ArrayList<Notification<Integer>>(); subject.materialize().forEach(new Action1<Notification<Integer>>() { @Override public void call(Notification<Integer> n) { list.add(n); } }); subject.materialize().forEach(new Action1<Notification<Integer>>() { @Override public void call(Notification<Integer> n) { list.add(n); } }); assertEquals(1, list.size()); assertEquals(Kind.OnError, list.get(0).getKind()); assertEquals(PublishSubjectSingleSubscriber.ONLY_ONE_SUBSCRIPTION_IS_ALLOWED, list.get(0).getThrowable().getMessage()); } @Test(expected = IllegalArgumentException.class) public void testThrowsExceptionWhenSubscribedWithNull() { PublishSubjectSingleSubscriber.create().subscribe((Subscriber<Object>) null); } }