package supervision; import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.Props; import akka.actor.Status; import akka.testkit.JavaTestKit; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import java.util.stream.IntStream; import static supervision.Expression.*; public class ArithmeticServiceTest { static ActorSystem system; @BeforeClass public static void setup() { system = ActorSystem.create("BuncherTest"); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; } @Test public void TheArithmeticServiceShouldCalculateConstantExpressionsProperly(){ new JavaTestKit(system) {{ final ActorRef service = system.actorOf(Props.create(ArithmeticService.class)); final ActorRef probe = getRef(); IntStream.range(-2, 3).forEach(x -> { service.tell(new Const(x), probe); expectMsgEquals(x); }); }}; } @Test public void TheArithmeticServiceShouldCalculateAdditionProperly(){ new JavaTestKit(system) {{ final ActorRef service = system.actorOf(Props.create(ArithmeticService.class)); final ActorRef probe = getRef(); IntStream.range(-2, 3).forEach(x -> IntStream.range(-2, 3).forEach(y -> { service.tell(new Add(new Const(x), new Const(y)), probe); expectMsgEquals(x + y); }) ); }}; } @Test public void TheArithmeticServiceShouldCalculateMultiplicationAndDivisionProperly(){ new JavaTestKit(system) {{ final ActorRef service = system.actorOf(Props.create(ArithmeticService.class)); final ActorRef probe = getRef(); IntStream.range(-2, 3).forEach(x -> IntStream.range(-2, 3).forEach(y -> { service.tell(new Multiply(new Const(x), new Const(y)), probe); expectMsgEquals(x * y); }) ); // Skip zero in the second parameter IntStream.range(-2, 3).forEach(x -> IntStream.of(-2, -1, 1, 2).forEach(y -> { service.tell(new Divide(new Const(x), new Const(y)), probe); expectMsgEquals(x / y); }) ); }}; } @Test public void TheArithmeticServiceShouldSurviveIllegalExpressions(){ new JavaTestKit(system) {{ final ActorRef service = system.actorOf(Props.create(ArithmeticService.class)); final ActorRef probe = getRef(); service.tell(new Divide(new Const(1), new Const(0)), probe); expectMsgClass(Status.Failure.class); service.tell(new Add(null, new Const(0)), probe); expectMsgClass(Status.Failure.class); service.tell(new Add(new Const(1), new Const(0)), probe); expectMsgEquals(1); }}; } }