/** * Creates and returns a {@code Signal} of variety {@code Type.ON_SUBSCRIBE}. * <p> * Note that this variant associates an empty {@link Context} with the {@link Signal}. * * @param <T> the value type * @param subscription the subscription * * @return an {@code OnSubscribe} variety of {@code Signal} */ static <T> Signal<T> subscribe(Subscription subscription) { return subscribe(subscription, Context.empty()); }
@Override public void onSubscribe(Subscription subscription) { Objects.requireNonNull(subscription, "onSubscribe"); if (this.compareAndSet(null, subscription)) { onExpectation(Signal.subscribe(subscription)); if (requestedFusionMode >= Fuseable.NONE) { startFusion(subscription); } else if (initialRequest != 0L) { subscription.request(initialRequest); } } else { subscription.cancel(); if (isCancelled()) { setFailure(null, "an unexpected Subscription has been received: %s; actual: cancelled", subscription); } else { setFailure(null, "an unexpected Subscription has been received: %s; actual: ", subscription, this); } } }
@Test public void subscribeState(){ Signal<Integer> s = Signal.subscribe(Operators.emptySubscription()); assertThat(s.isOnComplete()).isFalse(); assertThat(s.isOnSubscribe()).isTrue(); assertThat(s.hasError()).isFalse(); assertThat(s.hasValue()).isFalse(); assertThat(s).isEqualTo(Signal.subscribe(Operators.emptySubscription())); assertThat(s).isNotEqualTo(Signal.subscribe(Operators.cancelledSubscription())); assertThat(s).isNotEqualTo(Signal.next(1)); assertThat(s).isNotEqualTo(Signal.error(e)); assertThat(s).isNotEqualTo(Signal.complete()); assertThat(s.hashCode()).isEqualTo(Signal.subscribe(Operators.emptySubscription()).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.subscribe(Operators.cancelledSubscription()).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.next(1).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.error(e).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.complete().hashCode()); assertThat(Signal.isComplete(s)).isFalse(); assertThat(Signal.isError(s)).isFalse(); assertThat(s.getSubscription()).isEqualTo(Operators.emptySubscription()); assertThat(s.getType()).isEqualTo(SignalType.ON_SUBSCRIBE); assertThat(s.toString()).contains("onSubscribe"); StepVerifier.create(Flux.<Integer>from(s::accept)) .expectSubscription() .thenCancel() .verify(); }
@Test public void completeState(){ Signal<Integer> s = Signal.complete(); assertThat(s.isOnComplete()).isTrue(); assertThat(s.isOnSubscribe()).isFalse(); assertThat(s.hasError()).isFalse(); assertThat(s.hasValue()).isFalse(); assertThat(s).isEqualTo(Signal.complete()); assertThat(s).isNotEqualTo(Signal.error(e)); assertThat(s).isNotEqualTo(Signal.subscribe(Operators.emptySubscription())); assertThat(s).isNotEqualTo(Signal.next(1)); assertThat(s.hashCode()).isEqualTo(Signal.complete().hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.error(e).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.next(1).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.subscribe(Operators.emptySubscription()).hashCode()); assertThat(Signal.isComplete(s)).isTrue(); assertThat(Signal.isError(s)).isFalse(); assertThat(s.getType()).isEqualTo(SignalType.ON_COMPLETE); assertThat(s.toString()).contains("onComplete"); StepVerifier.create(Flux.<Integer>from(sub -> { sub.onSubscribe(Operators.emptySubscription()); s.accept(sub); })) .verifyComplete(); }
@Test public void subscribeStateWithContext(){ Context context = Context.of("foo", "bar"); Signal<Integer> s = Signal.subscribe(Operators.emptySubscription(), context); assertThat(s.getContext().isEmpty()).as("has context").isFalse(); assertThat(s.isOnComplete()).isFalse(); assertThat(s.isOnSubscribe()).isTrue(); assertThat(s.hasError()).isFalse(); assertThat(s.hasValue()).isFalse(); assertThat(s).isEqualTo(Signal.subscribe(Operators.emptySubscription())); assertThat(s).isNotEqualTo(Signal.subscribe(Operators.cancelledSubscription())); assertThat(s).isNotEqualTo(Signal.next(1)); assertThat(s).isNotEqualTo(Signal.error(e)); assertThat(s).isNotEqualTo(Signal.complete()); assertThat(s.hashCode()).isEqualTo(Signal.subscribe(Operators.emptySubscription()).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.subscribe(Operators.cancelledSubscription()).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.next(1).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.error(e).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.complete().hashCode()); assertThat(Signal.isComplete(s)).isFalse(); assertThat(Signal.isError(s)).isFalse(); assertThat(s.getSubscription()).isEqualTo(Operators.emptySubscription()); assertThat(s.getType()).isEqualTo(SignalType.ON_SUBSCRIBE); assertThat(s.toString()).contains("onSubscribe"); StepVerifier.create(Flux.<Integer>from(s::accept)) .expectSubscription() .thenCancel() .verify(); } @Test
@Test public void errorState(){ Signal<Integer> s = Signal.error(e); assertThat(s.isOnComplete()).isFalse(); assertThat(s.isOnSubscribe()).isFalse(); assertThat(s.hasError()).isTrue(); assertThat(s.hasValue()).isFalse(); assertThat(s).isEqualTo(Signal.error(e)); assertThat(s).isNotEqualTo(Signal.error(new Exception("test2"))); assertThat(s).isNotEqualTo(Signal.complete()); assertThat(s).isNotEqualTo(Signal.subscribe(Operators.emptySubscription())); assertThat(s).isNotEqualTo(Signal.next(1)); assertThat(s.hashCode()).isEqualTo(Signal.error(e).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.error(new Exception("test2")).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.complete().hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.next(1).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.subscribe(Operators.emptySubscription()).hashCode()); assertThat(Signal.isComplete(s)).isFalse(); assertThat(Signal.isError(s)).isTrue(); assertThat(s.getThrowable()).isEqualTo(e); assertThat(s.getType()).isEqualTo(SignalType.ON_ERROR); assertThat(s.toString()).contains("onError"); StepVerifier.create(Flux.<Integer>from(sub -> { sub.onSubscribe(Operators.emptySubscription()); s.accept(sub); })) .verifyErrorMessage("test"); }
@Test public void completeStateWithContext(){ Context context = Context.of("foo", "bar"); Signal<Integer> s = Signal.complete(context); assertThat(s.getContext().isEmpty()).as("has context").isFalse(); assertThat(s.isOnComplete()).isTrue(); assertThat(s.isOnSubscribe()).isFalse(); assertThat(s.hasError()).isFalse(); assertThat(s.hasValue()).isFalse(); assertThat(s).isEqualTo(Signal.complete()); assertThat(s).isNotEqualTo(Signal.error(e)); assertThat(s).isNotEqualTo(Signal.subscribe(Operators.emptySubscription())); assertThat(s).isNotEqualTo(Signal.next(1)); assertThat(s.hashCode()).isEqualTo(Signal.complete().hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.error(e).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.next(1).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.subscribe(Operators.emptySubscription()).hashCode()); assertThat(Signal.isComplete(s)).isTrue(); assertThat(Signal.isError(s)).isFalse(); assertThat(s.getType()).isEqualTo(SignalType.ON_COMPLETE); assertThat(s.toString()).contains("onComplete"); StepVerifier.create(Flux.<Integer>from(sub -> { sub.onSubscribe(Operators.emptySubscription()); s.accept(sub); })) .verifyComplete(); }
@Test public void nextState(){ Signal<Integer> s = Signal.next(1); assertThat(s.isOnComplete()).isFalse(); assertThat(s.isOnSubscribe()).isFalse(); assertThat(s.hasError()).isFalse(); assertThat(s.hasValue()).isTrue(); assertThat(s).isEqualTo(Signal.next(1)); assertThat(s).isNotEqualTo(Signal.next(2)); assertThat(s).isNotEqualTo(Signal.error(e)); assertThat(s).isNotEqualTo(Signal.complete()); assertThat(s).isNotEqualTo(Signal.subscribe(Operators.emptySubscription())); assertThat(s.hashCode()).isEqualTo(Signal.next(1).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.next(2).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.error(e).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.complete().hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.subscribe(Operators.emptySubscription()).hashCode()); assertThat(Signal.isComplete(s)).isFalse(); assertThat(Signal.isError(s)).isFalse(); assertThat(s.get()).isEqualTo(1); assertThat(s.getType()).isEqualTo(SignalType.ON_NEXT); assertThat(s.toString()).contains("onNext(1)"); StepVerifier.create(Flux.<Integer>from(sub -> { sub.onSubscribe(Operators.emptySubscription()); s.accept(sub); })) .expectNext(1) .thenCancel() .verify(); }
assertThat(s).isNotEqualTo(Signal.error(e)); assertThat(s).isNotEqualTo(Signal.complete()); assertThat(s).isNotEqualTo(Signal.subscribe(Operators.emptySubscription())); assertThat(s.hashCode()).isEqualTo(Signal.next(1).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.next(2).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.error(e).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.complete().hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.subscribe(Operators.emptySubscription()).hashCode());
@Test public void errorStateWithContext(){ Context context = Context.of("foo", "bar"); Signal<Integer> s = Signal.error(e, context); assertThat(s.getContext().isEmpty()).as("has context").isFalse(); assertThat(s.isOnComplete()).isFalse(); assertThat(s.isOnSubscribe()).isFalse(); assertThat(s.hasError()).isTrue(); assertThat(s.hasValue()).isFalse(); assertThat(s).isEqualTo(Signal.error(e)); assertThat(s).isNotEqualTo(Signal.error(new Exception("test2"))); assertThat(s).isNotEqualTo(Signal.complete()); assertThat(s).isNotEqualTo(Signal.subscribe(Operators.emptySubscription())); assertThat(s).isNotEqualTo(Signal.next(1)); assertThat(s.hashCode()).isEqualTo(Signal.error(e).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.error(new Exception("test2")).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.complete().hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.next(1).hashCode()); assertThat(s.hashCode()).isNotEqualTo(Signal.subscribe(Operators.emptySubscription()).hashCode()); assertThat(Signal.isComplete(s)).isFalse(); assertThat(Signal.isError(s)).isTrue(); assertThat(s.getThrowable()).isEqualTo(e); assertThat(s.getType()).isEqualTo(SignalType.ON_ERROR); assertThat(s.toString()).contains("onError"); StepVerifier.create(Flux.<Integer>from(sub -> { sub.onSubscribe(Operators.emptySubscription()); s.accept(sub); })) .verifyErrorMessage("test"); }
.producer(1, i -> Signal.subscribe(Operators.emptySubscription())) .receiverEmpty(),
/** * Creates and returns a {@code Signal} of variety {@code Type.ON_SUBSCRIBE}. * <p> * Note that this variant associates an empty {@link Context} with the {@link Signal}. * * @param <T> the value type * @param subscription the subscription * * @return an {@code OnSubscribe} variety of {@code Signal} */ static <T> Signal<T> subscribe(Subscription subscription) { return subscribe(subscription, Context.empty()); }
@Override public void onSubscribe(Subscription subscription) { Objects.requireNonNull(subscription, "onSubscribe"); if (this.compareAndSet(null, subscription)) { onExpectation(Signal.subscribe(subscription)); if (requestedFusionMode >= Fuseable.NONE) { startFusion(subscription); } else if (initialRequest != 0L) { subscription.request(initialRequest); } } else { subscription.cancel(); if (isCancelled()) { setFailure(null, "an unexpected Subscription has been received: %s; actual: cancelled", subscription); } else { setFailure(null, "an unexpected Subscription has been received: %s; actual: ", subscription, this); } } }