package org.threadly.concurrent.future;
import static org.junit.Assert.*;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.RunnableFuture;
import org.junit.Test;
import org.threadly.concurrent.DoNothingRunnable;
import org.threadly.test.concurrent.TestRunnable;
@SuppressWarnings("javadoc")
public class ExecuteOnGetFutureTaskTest extends ListenableFutureTaskTest {
@Override
protected ExecuteOnGetFutureFactory makeFutureFactory() {
return new Factory();
}
@Override
protected <T> ListenableFutureTask<T> makeFutureTask(Runnable runnable, T result) {
return new ExecuteOnGetFutureTask<>(runnable, result);
}
@Override
protected <T> ListenableFutureTask<T> makeFutureTask(Callable<T> task) {
return new ExecuteOnGetFutureTask<>(task);
}
@Test
public void executeInvokedByGetTest() throws InterruptedException, ExecutionException {
TestRunnable tr = new TestRunnable();
ExecuteOnGetFutureTask<?> geft = new ExecuteOnGetFutureTask<>(tr);
geft.get();
assertTrue(tr.ranOnce());
}
@Test
public void executeOnceTest() throws InterruptedException, ExecutionException {
TestRunnable tr = new TestRunnable();
ExecuteOnGetFutureTask<?> geft = new ExecuteOnGetFutureTask<>(tr);
geft.get();
geft.run();
geft.get(); // multiple get calls should not execute again either
geft.run();
assertTrue(tr.ranOnce());
}
private class Factory implements ExecuteOnGetFutureFactory {
@Override
public RunnableFuture<?> make(Runnable run) {
return new ExecuteOnGetFutureTask<>(run);
}
@Override
public <T> RunnableFuture<T> make(Runnable run, T result) {
return new ExecuteOnGetFutureTask<>(run, result);
}
@Override
public <T> RunnableFuture<T> make(Callable<T> callable) {
return new ExecuteOnGetFutureTask<>(callable);
}
@Override
public ListenableFuture<?> makeCanceled() {
ListenableFutureTask<?> lft = new ExecuteOnGetFutureTask<>(DoNothingRunnable.instance());
lft.cancel(false);
return lft;
}
@Override
public ListenableFuture<?> makeWithFailure(Exception t) {
ListenableFutureTask<?> lft = new ExecuteOnGetFutureTask<>(() -> { throw t; });
lft.run();
return lft;
}
@Override
public <T> ListenableFuture<T> makeWithResult(T result) {
ListenableFutureTask<T> lft = new ExecuteOnGetFutureTask<>(() -> result);
lft.run();
return lft;
}
}
}