@Override public DefaultStepVerifier<T> expectErrorMessage(String errorMessage) { SignalEvent<T> event = new SignalEvent<>((signal, se) -> { if (!signal.isOnError()) { return errorFormatter.failOptional(se, "expected: onError(\"%s\"); actual: %s", errorMessage, signal); } else if (!Objects.equals(errorMessage, signal.getThrowable() .getMessage())) { return errorFormatter.failOptional(se, "expected error message: \"%s\"; " + "actual " + "message: %s", errorMessage, signal.getThrowable() .getMessage()); } else { return Optional.empty(); } }, "expectErrorMessage"); this.script.add(event); return build(); }
boolean onSignal(Signal<T> actualSignal) { SignalEvent<T> signalEvent = (SignalEvent<T>) this.script.poll(); Optional<AssertionError> error = signalEvent.test(actualSignal); if (error.isPresent()) { Exceptions.addThrowable(ERRORS, this, error.get()); // #55 ensure the onError is added as a suppressed to the AssertionError if(actualSignal.isOnError()) { error.get().addSuppressed(actualSignal.getThrowable()); } maybeCancel(actualSignal); this.completeLatch.countDown(); return true; } if (actualSignal.isOnNext()) { unasserted--; } return false; }
@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 DefaultStepVerifier<T> expectErrorMessage(String errorMessage) { SignalEvent<T> event = new SignalEvent<>((signal, se) -> { if (!signal.isOnError()) { return errorFormatter.failOptional(se, "expected: onError(\"%s\"); actual: %s", errorMessage, signal); } else if (!Objects.equals(errorMessage, signal.getThrowable() .getMessage())) { return errorFormatter.failOptional(se, "expected error message: \"%s\"; " + "actual " + "message: %s", errorMessage, signal.getThrowable() .getMessage()); } else { return Optional.empty(); } }, "expectErrorMessage"); this.script.add(event); return build(); }
private DefaultStepVerifier<T> consumeErrorWith(Consumer<Throwable> assertionConsumer, String description, boolean wrap) { Objects.requireNonNull(assertionConsumer, "assertionConsumer"); SignalEvent<T> event = new SignalEvent<>((signal, se) -> { if (!signal.isOnError()) { return errorFormatter.failOptional(se, "expected: onError(); actual: %s", signal); } else { try { assertionConsumer.accept(signal.getThrowable()); return Optional.empty(); } catch (AssertionError e) { if (wrap) return errorFormatter.failOptional(se, "assertion failed on exception <%s>: %s", signal.getThrowable(), e.getMessage()); throw e; } } }, description); this.script.add(event); return build(); }
@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; }
@Override public DefaultStepVerifier<T> expectErrorMatches(Predicate<Throwable> predicate) { Objects.requireNonNull(predicate, "predicate"); SignalEvent<T> event = new SignalEvent<>((signal, se) -> { if (!signal.isOnError()) { return errorFormatter.failOptional(se, "expected: onError(); actual: %s", signal); } else if (!predicate.test(signal.getThrowable())) { return errorFormatter.failOptional(se, "predicate failed on exception: %s", signal.getThrowable()); } else { return Optional.empty(); } }, "expectErrorMatches"); this.script.add(event); return build(); }
@Override public DefaultStepVerifier<T> expectError(Class<? extends Throwable> clazz) { Objects.requireNonNull(clazz, "clazz"); SignalEvent<T> event = new SignalEvent<>((signal, se) -> { if (!signal.isOnError()) { return errorFormatter.failOptional(se, "expected: onError(%s); actual: %s", clazz.getSimpleName(), signal); } else if (!clazz.isInstance(signal.getThrowable())) { return errorFormatter.failOptional(se, "expected error of type: %s; actual type: %s", clazz.getSimpleName(), signal.getThrowable()); } else { return Optional.empty(); } }, "expectError(Class)"); this.script.add(event); return build(); }
boolean onSignal(Signal<T> actualSignal) { SignalEvent<T> signalEvent = (SignalEvent<T>) this.script.poll(); Optional<AssertionError> error = signalEvent.test(actualSignal); if (error.isPresent()) { Exceptions.addThrowable(ERRORS, this, error.get()); // #55 ensure the onError is added as a suppressed to the AssertionError if(actualSignal.isOnError()) { error.get().addSuppressed(actualSignal.getThrowable()); } maybeCancel(actualSignal); this.completeLatch.countDown(); return true; } if (actualSignal.isOnNext()) { unasserted--; } return false; }
@Override public DefaultStepVerifierBuilder<T> expectNextMatches( Predicate<? super T> predicate) { Objects.requireNonNull(predicate, "predicate"); checkPotentialHang(1, "expectNextMatches"); SignalEvent<T> event = new SignalEvent<>((signal, se) -> { if (!signal.isOnNext()) { return errorFormatter.failOptional(se, "expected: onNext(); actual: %s", signal); } else if (!predicate.test(signal.get())) { return errorFormatter.failOptional(se, "predicate failed on value: %s", signal.get()); } else { return Optional.empty(); } }, "expectNextMatches"); this.script.add(event); return this; }
private void addExpectedValue(T value) { String desc = String.format("expectNext(%s)", value); checkPotentialHang(1, desc); SignalEvent<T> event = new SignalEvent<>((signal, se) -> { if (!signal.isOnNext()) { return errorFormatter.failOptional(se, "expected: onNext(%s); actual: %s", value, signal); } else if (!Objects.equals(value, signal.get())) { return errorFormatter.failOptional(se, "expected value: %s; actual value: %s", value, signal.get()); } else { return Optional.empty(); } }, desc); this.script.add(event); }
private DefaultStepVerifierBuilder<T> consumeNextWith(Consumer<? super T> consumer, String description) { Objects.requireNonNull(consumer, "consumer"); checkPotentialHang(1, description); SignalEvent<T> event = new SignalEvent<>((signal, se) -> { if (!signal.isOnNext()) { return errorFormatter.failOptional(se, "expected: onNext(); actual: %s", signal); } else { consumer.accept(signal.get()); return Optional.empty(); } }, description); this.script.add(event); return this; }
@Override public DefaultStepVerifier<T> expectError() { SignalEvent<T> event = new SignalEvent<>((signal, se) -> { if (!signal.isOnError()) { return errorFormatter.failOptional(se, "expected: onError(); actual: %s", signal); } else { return Optional.empty(); } }, "expectError()"); this.script.add(event); return build(); }
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 DefaultStepVerifier<T> expectComplete() { SignalEvent<T> event = new SignalEvent<>((signal, se) -> { if (!signal.isOnComplete()) { return errorFormatter.failOptional(se, "expected: onComplete(); actual: %s", signal); } else { return Optional.empty(); } }, "expectComplete"); this.script.add(event); return build(); }
private DefaultStepVerifier<T> consumeErrorWith(Consumer<Throwable> assertionConsumer, String description, boolean wrap) { Objects.requireNonNull(assertionConsumer, "assertionConsumer"); SignalEvent<T> event = new SignalEvent<>((signal, se) -> { if (!signal.isOnError()) { return errorFormatter.failOptional(se, "expected: onError(); actual: %s", signal); } else { try { assertionConsumer.accept(signal.getThrowable()); return Optional.empty(); } catch (AssertionError e) { if (wrap) return errorFormatter.failOptional(se, "assertion failed on exception <%s>: %s", signal.getThrowable(), e.getMessage()); throw e; } } }, description); this.script.add(event); return build(); }
@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; }
@Override public DefaultStepVerifierBuilder<T> expectNextMatches( Predicate<? super T> predicate) { Objects.requireNonNull(predicate, "predicate"); checkPotentialHang(1, "expectNextMatches"); SignalEvent<T> event = new SignalEvent<>((signal, se) -> { if (!signal.isOnNext()) { return errorFormatter.failOptional(se, "expected: onNext(); actual: %s", signal); } else if (!predicate.test(signal.get())) { return errorFormatter.failOptional(se, "predicate failed on value: %s", signal.get()); } else { return Optional.empty(); } }, "expectNextMatches"); this.script.add(event); return this; }
@Override public DefaultStepVerifier<T> expectError(Class<? extends Throwable> clazz) { Objects.requireNonNull(clazz, "clazz"); SignalEvent<T> event = new SignalEvent<>((signal, se) -> { if (!signal.isOnError()) { return errorFormatter.failOptional(se, "expected: onError(%s); actual: %s", clazz.getSimpleName(), signal); } else if (!clazz.isInstance(signal.getThrowable())) { return errorFormatter.failOptional(se, "expected error of type: %s; actual type: %s", clazz.getSimpleName(), signal.getThrowable()); } else { return Optional.empty(); } }, "expectError(Class)"); this.script.add(event); return build(); }