package net.ciklum.icfpc11.controller.ai import junit.framework.TestCase import net.ciklum.icfpc11.controller.Controller import net.ciklum.icfpc11.domain.Game import net.ciklum.icfpc11.domain.Player import net.ciklum.icfpc11.parser.Command import static net.ciklum.icfpc11.plan.FunctionTreeBuilder.* import net.ciklum.icfpc11.plan.MovePlanner import static net.ciklum.icfpc11.parser.Application.* import net.ciklum.icfpc11.domain.Card import net.ciklum.icfpc11.domain.greenspoon10.ConstantFunction /** * * @author mym */ class LoopTest extends TestCase { private Controller controller void setUp() { controller = new Controller(Game.push(new Player('p0'), new Player('p1'))) } void tearDown() { Game.pop() } void test_infinite_loop() { def tree = S(get, I) MovePlanner planner = new MovePlanner(0) List commands = planner.plan(tree) commands.each {Command c -> controller.applyCommand(c) } assert tree.toString() == controller.game.currentProponent.getSlot(0).value.toString() controller.applyCommand(new Command(RIGHT, 0, Card.zero)) assertTrue controller.errorHappened assert 'I' == controller.game.currentProponent.getSlot(0).value.toString() } void test_infinite_loop_succ() { def tree = S(S(K(get), K(zero)), succ) MovePlanner planner = new MovePlanner(0) List commands = planner.plan(tree) commands.each {Command c -> controller.applyCommand(c) } assert tree.toString() == controller.game.currentProponent.getSlot(0).value.toString() controller.applyCommand(new Command(RIGHT, 0, Card.zero)) assertTrue controller.errorHappened assert 'I' == controller.game.currentProponent.getSlot(0).value.toString() assert '' == controller.game.currentOpponent.slotsToString() } void test_infinite_loop_succ_dec() { // DO NOT DELETE! IT WORKS! // def tree = S(S(K(S(K(S(K(get), K(n(3)))), dec)), dbl), succ) def tree = S(S(K(S(K(get), K(n(3)))), dec), get) controller.game.currentProponent.getSlot(0).value = ConstantFunction.valueOf(255) controller.game.currentProponent.getSlot(255).value = ConstantFunction.valueOf(0) MovePlanner planner = new MovePlanner(3) List commands = planner.plan(tree) println "The gun costs ${commands.size()}" commands.each {Command c -> controller.applyCommand(c) } assert tree.toString().replace('succ(succ(succ(zero)))', 'const(3)') == controller.game.currentProponent.getSlot(3).value.toString() controller.applyCommand(new Command(RIGHT, 3, Card.zero)) assertTrue controller.errorHappened assert 'I' == controller.game.currentProponent.getSlot(3).value.toString() println controller.game.currentOpponent.slotsToString() assert '' != controller.game.currentOpponent.slotsToString() } }