static <T> SignalEvent<T> newOnSubscribeStep(ErrorFormatter errorFormatter, String desc){ return new SignalEvent<>((signal, se) -> { if (!signal.isOnSubscribe()) { return errorFormatter.failOptional(se, "expected: onSubscribe(); actual: %s", signal); } else { return Optional.empty(); } }, desc); }
@Override public DefaultStepVerifierBuilder<T> consumeSubscriptionWith( Consumer<? super Subscription> consumer) { Objects.requireNonNull(consumer, "consumer"); if(script.isEmpty() || (script.size() == 1 && script.get(0) == defaultFirstStep)) { this.script.set(0, new SignalEvent<>((signal, se) -> { if (!signal.isOnSubscribe()) { return errorFormatter.failOptional(se, "expected: onSubscribe(); actual: %s", signal); } else { consumer.accept(signal.getSubscription()); return Optional.empty(); } }, "consumeSubscriptionWith")); } else { this.script.add(new SubscriptionConsumerEvent<>(consumer, "consumeSubscriptionWith")); } return this; }
@Override public DefaultStepVerifierBuilder<T> expectSubscriptionMatches( Predicate<? super Subscription> predicate) { Objects.requireNonNull(predicate, "predicate"); this.script.set(0, new SignalEvent<>((signal, se) -> { if (!signal.isOnSubscribe()) { return errorFormatter.failOptional(se, "expected: onSubscribe(); actual: %s", signal); } else if (!predicate.test(signal.getSubscription())) { return errorFormatter.failOptional(se, "predicate failed on subscription: %s", signal.getSubscription()); } else { return Optional.empty(); } }, "expectSubscriptionMatches")); return this; }
@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(); }
/** * Propagate the signal represented by this {@link Signal} instance to a * given {@link Subscriber}. * * @param observer the {@link Subscriber} to play the {@link Signal} on */ @Override default void accept(Subscriber<? super T> observer) { if (isOnNext()) { observer.onNext(get()); } else if (isOnComplete()) { observer.onComplete(); } else if (isOnError()) { observer.onError(getThrowable()); } else if (isOnSubscribe()) { observer.onSubscribe(getSubscription()); } } }
@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(); }
@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(); }
assertThat(s.isOnSubscribe()).isFalse(); assertThat(s.hasError()).isFalse(); assertThat(s.hasValue()).isTrue();
@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 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 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"); }
@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
static <T> SignalEvent<T> newOnSubscribeStep(ErrorFormatter errorFormatter, String desc){ return new SignalEvent<>((signal, se) -> { if (!signal.isOnSubscribe()) { return errorFormatter.failOptional(se, "expected: onSubscribe(); actual: %s", signal); } else { return Optional.empty(); } }, desc); }
@Override public DefaultStepVerifierBuilder<T> consumeSubscriptionWith( Consumer<? super Subscription> consumer) { Objects.requireNonNull(consumer, "consumer"); if(script.isEmpty() || (script.size() == 1 && script.get(0) == defaultFirstStep)) { this.script.set(0, new SignalEvent<>((signal, se) -> { if (!signal.isOnSubscribe()) { return errorFormatter.failOptional(se, "expected: onSubscribe(); actual: %s", signal); } else { consumer.accept(signal.getSubscription()); return Optional.empty(); } }, "consumeSubscriptionWith")); } else { this.script.add(new SubscriptionConsumerEvent<>(consumer, "consumeSubscriptionWith")); } return this; }
@Override public DefaultStepVerifierBuilder<T> expectSubscriptionMatches( Predicate<? super Subscription> predicate) { Objects.requireNonNull(predicate, "predicate"); this.script.set(0, new SignalEvent<>((signal, se) -> { if (!signal.isOnSubscribe()) { return errorFormatter.failOptional(se, "expected: onSubscribe(); actual: %s", signal); } else if (!predicate.test(signal.getSubscription())) { return errorFormatter.failOptional(se, "predicate failed on subscription: %s", signal.getSubscription()); } else { return Optional.empty(); } }, "expectSubscriptionMatches")); return this; }
/** * Propagate the signal represented by this {@link Signal} instance to a * given {@link Subscriber}. * * @param observer the {@link Subscriber} to play the {@link Signal} on */ @Override default void accept(Subscriber<? super T> observer) { if (isOnNext()) { observer.onNext(get()); } else if (isOnComplete()) { observer.onComplete(); } else if (isOnError()) { observer.onError(getThrowable()); } else if (isOnSubscribe()) { observer.onSubscribe(getSubscription()); } } }