/* __ __ __ __ __ ___ * \ \ / / \ \ / / __/ * \ \/ / /\ \ \/ / / * \____/__/ \__\____/__/.ɪᴏ * ᶜᵒᵖʸʳᶦᵍʰᵗ ᵇʸ ᵛᵃᵛʳ ⁻ ˡᶦᶜᵉⁿˢᵉᵈ ᵘⁿᵈᵉʳ ᵗʰᵉ ᵃᵖᵃᶜʰᵉ ˡᶦᶜᵉⁿˢᵉ ᵛᵉʳˢᶦᵒⁿ ᵗʷᵒ ᵈᵒᵗ ᶻᵉʳᵒ */ package io.vavr.concurrent; import io.vavr.control.Try; import org.junit.Test; import static io.vavr.concurrent.Concurrent.zZz; import static org.assertj.core.api.Assertions.assertThat; public class PromiseTest { @Test public void shouldReturnExecutorService() { final Promise<Integer> promise = Promise.successful(42); assertThat(promise.executorService()).isNotNull(); } @Test public void shouldReturnSuccessfulPromise() { final Promise<Integer> promise = Promise.successful(42); assertThat(promise.isCompleted()).isTrue(); assertThat(promise.future().isSuccess()).isTrue(); } @Test public void shouldReturnFailedPromise() { final Promise<Integer> promise = Promise.failed(new RuntimeException()); assertThat(promise.isCompleted()).isTrue(); assertThat(promise.future().isFailure()).isTrue(); } @Test public void shouldReturnPromiseFromTry() { final Promise<Integer> promise = Promise.fromTry(Try.of(() -> 42)); assertThat(promise.isCompleted()).isTrue(); assertThat(promise.future().isSuccess()).isTrue(); } @Test(expected = IllegalStateException.class) public void shouldFailWhenCompleteAgain() { Promise.successful(42).complete(Try.success(0)); } @Test public void shouldTrySuccess() { final Promise<Integer> promise = Promise.make(); assertThat(promise.trySuccess(42)).isTrue(); assertThat(promise.trySuccess(42)).isFalse(); assertThat(promise.future().get()).isEqualTo(42); } @Test public void shouldTryFailure() { final Promise<Integer> promise = Promise.make(); assertThat(promise.tryFailure(new RuntimeException())).isTrue(); assertThat(promise.tryFailure(new RuntimeException())).isFalse(); assertThat(promise.future().isFailure()).isTrue(); } @Test public void shouldConvertToString() { assertThat(Promise.successful("vavr").toString().contains("vavr")).isTrue(); } @Test public void shouldCompletePromiseWithItsOwnFuture() { final Promise<String> promise = Promise.make(ExecutorServices.trivialExecutorService()); promise.completeWith(promise.future()); assertThat(promise.isCompleted()).isFalse(); assertThat(promise.success("ok").isCompleted()).isTrue(); } @Test public void shouldMediateProducerConsumerViaPromise() { final String product = "Coffee"; class Context { String produceSomething() { Concurrent.zZz(); System.out.println("Making " + product); return product; } void continueDoingSomethingUnrelated() { System.out.println("Unreleated stuff"); } void startDoingSomething() { System.out.println("Something else"); } } final Context ctx = new Context(); final Promise<String> producerResult = Promise.make(); final Promise<String> consumerResult = Promise.make(); // producer Future.run(() -> { producerResult.success(ctx.produceSomething()); ctx.continueDoingSomethingUnrelated(); }); // consumer Future.run(() -> { ctx.startDoingSomething(); consumerResult.completeWith(producerResult.future()); }); final String actual = consumerResult.future().get(); assertThat(actual).isEqualTo(product); } }