package com.github.scr.j8iterables; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; import org.testng.annotations.Test; import java.util.concurrent.CancellationException; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; /** * Created by scr on 1/27/17. */ @Test public class J8FuturesTest { @Test public void testCoverageTrickForUtilityClass() throws Exception { assertThat(new J8Futures(), notNullValue()); } @Test public void testAsCompletableFutureSuccess() throws Exception { SettableFuture<Integer> settableFuture = SettableFuture.create(); CompletableFuture<Integer> completableFuture = J8Futures.asCompletableFuture(settableFuture); assertThat("completableFuture is done too soon", !completableFuture.isDone()); settableFuture.set(123); assertThat("completableFuture isn't done yet", completableFuture.isDone()); assertThat("completableFuture has exception", !completableFuture.isCompletedExceptionally()); assertThat("completableFuture was cancelled", !completableFuture.isCancelled()); assertThat(completableFuture.get(), is(123)); } @Test(expectedExceptions = CancellationException.class) public void testAsCompletableFutureCancelled() throws Exception { SettableFuture<Integer> settableFuture = SettableFuture.create(); CompletableFuture<Integer> completableFuture = J8Futures.asCompletableFuture(settableFuture); assertThat("completableFuture is done too soon", !completableFuture.isDone()); settableFuture.cancel(true); assertThat("completableFuture isn't done yet", completableFuture.isDone()); assertThat("completableFuture wasn't cancelled", completableFuture.isCancelled()); assertThat("completableFuture isn't exceptional", completableFuture.isCompletedExceptionally()); // Should cause exception completableFuture.get(); } @Test public void testAsListenableFutureSuccess() throws Exception { CompletableFuture<Integer> completableFuture = new CompletableFuture<>(); ListenableFuture<Integer> listenableFuture = J8Futures.asListenableFuture(completableFuture); assertThat("listenableFuture is done too soon", !listenableFuture.isDone()); completableFuture.complete(123); assertThat("listenableFuture isn't done yet", listenableFuture.isDone()); assertThat("listenableFuture was cancelled", !listenableFuture.isCancelled()); assertThat(listenableFuture.get(), is(123)); } @Test(expectedExceptions = CancellationException.class) public void testAsListenableFutureCanceled() throws Exception { CompletableFuture<Integer> completableFuture = new CompletableFuture<>(); ListenableFuture<Integer> listenableFuture = J8Futures.asListenableFuture(completableFuture); assertThat("listenableFuture is done too soon", !listenableFuture.isDone()); completableFuture.cancel(true); assertThat("listenableFuture isn't done yet", listenableFuture.isDone()); assertThat("listenableFuture wasn't cancelled", listenableFuture.isCancelled()); // Should cause exception listenableFuture.get(); } @Test(expectedExceptions = ExecutionException.class) public void testAsListenableFutureExceptional() throws Exception { CompletableFuture<Integer> completableFuture = new CompletableFuture<>(); ListenableFuture<Integer> listenableFuture = J8Futures.asListenableFuture(completableFuture); assertThat("listenableFuture is done too soon", !listenableFuture.isDone()); completableFuture.completeExceptionally(new RuntimeException("Testing")); assertThat("listenableFuture isn't done yet", listenableFuture.isDone()); // Should cause exception listenableFuture.get(); } @Test public void testOverBackSuccess() throws Exception { SettableFuture<Integer> settableFuture = SettableFuture.create(); CompletableFuture<Integer> completableFuture = J8Futures.asCompletableFuture(settableFuture); ListenableFuture<Integer> listenableFuture = J8Futures.asListenableFuture(completableFuture); assertThat("listenableFuture is done too soon", !listenableFuture.isDone()); completableFuture.complete(123); assertThat("listenableFuture isn't done yet", listenableFuture.isDone()); assertThat("listenableFuture was cancelled", !listenableFuture.isCancelled()); assertThat(listenableFuture.get(), is(123)); } @Test(expectedExceptions = CancellationException.class) public void testOverBackCanceled() throws Exception { SettableFuture<Integer> settableFuture = SettableFuture.create(); CompletableFuture<Integer> completableFuture = J8Futures.asCompletableFuture(settableFuture); ListenableFuture<Integer> listenableFuture = J8Futures.asListenableFuture(completableFuture); assertThat("listenableFuture is done too soon", !listenableFuture.isDone()); completableFuture.cancel(true); assertThat("listenableFuture isn't done yet", listenableFuture.isDone()); assertThat("listenableFuture wasn't cancelled", listenableFuture.isCancelled()); // Should cause exception listenableFuture.get(); } @Test(expectedExceptions = ExecutionException.class) public void testOverBackExceptional() throws Exception { SettableFuture<Integer> settableFuture = SettableFuture.create(); CompletableFuture<Integer> completableFuture = J8Futures.asCompletableFuture(settableFuture); ListenableFuture<Integer> listenableFuture = J8Futures.asListenableFuture(completableFuture); assertThat("listenableFuture is done too soon", !listenableFuture.isDone()); completableFuture.completeExceptionally(new RuntimeException("Testing")); assertThat("listenableFuture isn't done yet", listenableFuture.isDone()); // Should cause exception listenableFuture.get(); } }