/** * Check if an arbitrary Object represents a COMPLETE {@link Signal}. * * @param o the object to check * @return true if object represents the completion signal */ @SuppressWarnings("deprecation") static boolean isComplete(Object o) { return o == ImmutableSignal.ON_COMPLETE || (o instanceof Signal && ((Signal) o).getType() == SignalType.ON_COMPLETE); }
/** * Check if a arbitrary Object represents an ERROR {@link Signal}. * * @param o the object to check * @return true if object represents the error signal */ static boolean isError(Object o) { return o instanceof Signal && ((Signal) o).getType() == SignalType.ON_ERROR; }
/** * Indicates whether this signal represents an {@code onError} event. * * @return a boolean indicating whether this signal represents an {@code onError} * event */ default boolean isOnError() { return getType() == SignalType.ON_ERROR; }
/** * Indicates whether this signal represents an {@code onSubscribe} event. * * @return a boolean indicating whether this signal represents an {@code onSubscribe} * event */ default boolean isOnSubscribe() { return getType() == SignalType.ON_SUBSCRIBE; }
/** * Indicates whether this signal represents an {@code onComplete} event. * * @return a boolean indicating whether this signal represents an {@code onSubscribe} * event */ default boolean isOnComplete() { return getType() == SignalType.ON_COMPLETE; }
/** * Indicates whether this signal represents an {@code onNext} event. * * @return a boolean indicating whether this signal represents an {@code onNext} event */ default boolean isOnNext() { return getType() == SignalType.ON_NEXT; }
@Test public void nextError() { List<Tuple2<Signal, Context>> signalsAndContext = new ArrayList<>(); Mono.just(0) .map(i -> 10 / i) .doOnEach(s -> signalsAndContext.add(Tuples.of(s,s.getContext()))) .subscriberContext(Context.of("foo", "bar")) .subscribe(); assertThat(signalsAndContext) .hasSize(1) .allSatisfy(t2 -> { assertThat(t2.getT1()) .isNotNull(); assertThat(t2.getT2().getOrDefault("foo", "baz")) .isEqualTo("bar"); }); assertThat(signalsAndContext.stream().map(t2 -> t2.getT1().getType())) .containsExactly(SignalType.ON_ERROR); } }
@Override public boolean equals(@Nullable Object o) { if (this == o) { return true; } if (o == null || !(o instanceof Signal)) { return false; } Signal<?> signal = (Signal<?>) o; if (getType() != signal.getType()) { return false; } if (isOnComplete()) { return true; } if (isOnSubscribe()) { return Objects.equals(this.getSubscription(), signal.getSubscription()); } if (isOnError()) { return Objects.equals(this.getThrowable(), signal.getThrowable()); } if (isOnNext()) { return Objects.equals(this.get(), signal.get()); } return false; }
@Test public void nextComplete() { List<Tuple2<Signal, Context>> signalsAndContext = new ArrayList<>(); Mono.just(1) .hide() .doOnEach(s -> signalsAndContext.add(Tuples.of(s, s.getContext()))) .subscriberContext(Context.of("foo", "bar")) .subscribe(); assertThat(signalsAndContext) .hasSize(2) .allSatisfy(t2 -> { assertThat(t2.getT1()) .isNotNull(); assertThat(t2.getT2().getOrDefault("foo", "baz")) .isEqualTo("bar"); }); assertThat(signalsAndContext.stream().map(t2 -> t2.getT1().getType())) .containsExactly(SignalType.ON_NEXT, SignalType.ON_COMPLETE); }
@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 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 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 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.get()).isEqualTo(1); assertThat(s.getType()).isEqualTo(SignalType.ON_NEXT); assertThat(s.toString()).contains("onNext(1)");
@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 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 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
/** * Check if an arbitrary Object represents a COMPLETE {@link Signal}. * * @param o the object to check * @return true if object represents the completion signal */ @SuppressWarnings("deprecation") static boolean isComplete(Object o) { return o == ImmutableSignal.ON_COMPLETE || (o instanceof Signal && ((Signal) o).getType() == SignalType.ON_COMPLETE); }
/** * Indicates whether this signal represents an {@code onSubscribe} event. * * @return a boolean indicating whether this signal represents an {@code onSubscribe} * event */ default boolean isOnSubscribe() { return getType() == SignalType.ON_SUBSCRIBE; }
/** * Indicates whether this signal represents an {@code onNext} event. * * @return a boolean indicating whether this signal represents an {@code onNext} event */ default boolean isOnNext() { return getType() == SignalType.ON_NEXT; }