@Test public void whenKnownNumberOfValuesIsReducedOnlyFinalValueMadeAvailable() { // "When a known number of values is being reduced, only the final value is made available" // given: "a composable that will accept 2 values and a reduce function" EmitterProcessor<Integer> source = EmitterProcessor.create(); MonoProcessor<Integer> value = source.reduce(new Reduction()) .subscribeWith(MonoProcessor.create()); // when: "the first value is accepted" source.onNext(1); // then: "the reduced value is unknown" assertThat(value.peek()).isNull(); // when: "the second value is accepted" source.onNext(2); source.onComplete(); // then: "the reduced value is known" assertThat(value.peek()).isEqualTo(2); }
@Test public void whenReducingKnownNumberOfValuesOnlyFinalValueIsPassedToConsumers() { // "When reducing a known number of values, only the final value is passed to consumers" // given: "a composable with a known number of values and a reduce function" EmitterProcessor<Integer> source = EmitterProcessor.create(); Mono<Integer> reduced = source.reduce(new Reduction()); List<Integer> values = new ArrayList<>(); reduced.doOnSuccess(values::add).subscribe(); // when: "the expected number of values is accepted" source.onNext(1); source.onNext(2); source.onNext(3); source.onNext(4); source.onNext(5); source.onComplete(); // then: "the consumer only receives the final value" assertThat(values).containsExactly(120); }
@Test public void knownNumberOfValuesCanBeReduced() { // "A known number of values can be reduced" // given: "a composable that will accept 5 values and a reduce function" EmitterProcessor<Integer> source = EmitterProcessor.create(); Mono<Integer> reduced = source.reduce(new Reduction()); MonoProcessor<Integer> value = reduced.subscribeWith(MonoProcessor.create()); // when: "the expected number of values is accepted" source.onNext(1); source.onNext(2); source.onNext(3); source.onNext(4); source.onNext(5); source.onComplete(); // then: "the reduced composable holds the reduced value" assertThat(value.peek()).isEqualTo(120); }