package io.trane.future;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.time.Duration;
import java.util.concurrent.atomic.AtomicReference;
import org.junit.Test;
public class NoFutureTest {
Exception ex = new TestException();
Future<Integer> noFuture = new NoFuture<Integer>();
@Test
public void raise() {
noFuture.raise(ex);
}
@Test
public void map() {
assertEquals(noFuture, noFuture.map(i -> i + 1));
}
@Test
public void flatMap() {
assertEquals(noFuture, noFuture.flatMap(i -> Future.value(1)));
}
@Test
public void transform() {
assertEquals(noFuture, noFuture.transform(new Transformer<Integer, Integer>() {
@Override
public Integer onException(Throwable ex) {
return null;
}
@Override
public Integer onValue(Integer value) {
return null;
}
}));
}
@Test
public void transformWith() {
assertEquals(noFuture, noFuture.transformWith(new Transformer<Integer, Future<Integer>>() {
@Override
public Future<Integer> onException(Throwable ex) {
return null;
}
@Override
public Future<Integer> onValue(Integer value) {
return null;
}
}));
}
@Test
public void biMap() {
assertEquals(noFuture, noFuture.biMap(Future.value(1), (i, j) -> i + j));
}
@Test
public void biFlatMap() {
assertEquals(noFuture, noFuture.biFlatMap(Future.value(1), (i, j) -> Future.value(i + j)));
}
@Test
public void ensure() {
assertEquals(noFuture, noFuture.ensure(() -> {
}));
}
@Test
public void onSuccess() {
assertEquals(noFuture, noFuture.onSuccess(i -> {
}));
}
@Test
public void onFailure() {
assertEquals(noFuture, noFuture.onFailure(ex -> {
}));
}
@Test
public void respond() {
assertEquals(noFuture, noFuture.respond(new Responder<Integer>() {
@Override
public void onException(Throwable ex) {
}
@Override
public void onValue(Integer value) {
}
}));
}
@Test
public void rescue() {
assertEquals(noFuture, noFuture.rescue(ex -> Future.value(1)));
}
@Test
public void interruptible() {
Future<Integer> future = Future.value(1);
assertEquals(future, future.interruptible());
}
@Test
public void isDefined() {
assertFalse(noFuture.isDefined());
}
@Test(expected = TimeoutException.class)
public void get() throws CheckedFutureException {
long start = System.currentTimeMillis();
long timeout = 10;
try {
noFuture.get(Duration.ofMillis(timeout));
} catch (TimeoutException ex) {
assertTrue(System.currentTimeMillis() - start >= timeout);
throw ex;
}
}
@Test
public void getInterrupted() throws CheckedFutureException, InterruptedException {
AtomicReference<Throwable> cause = new AtomicReference<>();
Thread t = new Thread() {
@Override
public void run() {
try {
noFuture.get(Duration.ofMinutes(1));
} catch (CheckedFutureException e) {
cause.set(e.getCause());
}
}
};
t.start();
t.interrupt();
t.join();
assertTrue(cause.get() instanceof InterruptedException);
}
@Test
public void join() throws CheckedFutureException {
long start = System.currentTimeMillis();
long timeout = 10;
noFuture.join(Duration.ofMillis(10));
assertTrue(System.currentTimeMillis() - start >= timeout);
}
@Test
public void voided() {
assertEquals(noFuture, noFuture.voided());
}
@Test
public void delayed() {
assertEquals(noFuture, noFuture.delayed(Duration.ofMillis(10), null));
}
@Test(expected = TimeoutException.class)
public void proxyTo() throws CheckedFutureException {
Promise<Integer> p = Promise.apply();
noFuture.proxyTo(p);
p.get(Duration.ofMillis(10));
}
@Test
public void within() {
assertEquals(noFuture, noFuture.within(Duration.ofMillis(10), null));
}
}