package org.jooby.internal.mapper;
import static org.easymock.EasyMock.expect;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiConsumer;
import org.jooby.Deferred;
import org.jooby.Deferred.Initializer0;
import org.jooby.test.MockUnit;
import org.jooby.test.MockUnit.Block;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest({CompletableFutureMapper.class, Deferred.class })
public class CompletableFutureMapperTest {
private Block deferred = unit -> {
Deferred deferred = unit.constructor(Deferred.class)
.args(Deferred.Initializer0.class)
.build(unit.capture(Deferred.Initializer0.class));
unit.registerMock(Deferred.class, deferred);
};
@SuppressWarnings({"unchecked", "rawtypes" })
private Block future = unit -> {
CompletableFuture future = unit.get(CompletableFuture.class);
expect(future.whenComplete(unit.capture(BiConsumer.class))).andReturn(future);
};
private Block init0 = unit -> {
Initializer0 next = unit.captured(Deferred.Initializer0.class).iterator().next();
next.run(unit.get(Deferred.class));
};
@SuppressWarnings({"rawtypes", "unchecked" })
@Test
public void resolve() throws Exception {
Object value = new Object();
new MockUnit(CompletableFuture.class)
.expect(deferred)
.expect(future)
.expect(unit -> {
Deferred deferred = unit.get(Deferred.class);
deferred.resolve(value);
})
.run(unit -> {
new CompletableFutureMapper()
.map(unit.get(CompletableFuture.class));
}, init0, unit -> {
BiConsumer next = unit.captured(BiConsumer.class).iterator().next();
next.accept(value, null);
});
}
@SuppressWarnings({"rawtypes", "unchecked" })
@Test
public void reject() throws Exception {
Throwable value = new Throwable();
new MockUnit(CompletableFuture.class)
.expect(deferred)
.expect(future)
.expect(unit -> {
Deferred deferred = unit.get(Deferred.class);
deferred.reject(value);
})
.run(unit -> {
new CompletableFutureMapper()
.map(unit.get(CompletableFuture.class));
}, init0, unit -> {
BiConsumer next = unit.captured(BiConsumer.class).iterator().next();
next.accept(null, value);
});
}
}