package aima.test.core.unit.search.online; import aima.core.agent.*; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import aima.core.environment.map.ExtendableMap; import aima.core.environment.map.MapEnvironment; import aima.core.environment.map.MapFunctionFactory; import aima.core.environment.map.MapStepCostFunction; import aima.core.search.framework.problem.DefaultGoalTest; import aima.core.search.online.OnlineDFSAgent; import aima.core.search.online.OnlineSearchProblem; public class OnlineDFSAgentTest { ExtendableMap aMap; StringBuffer envChanges; @Before public void setUp() { aMap = new ExtendableMap(); aMap.addBidirectionalLink("A", "B", 5.0); aMap.addBidirectionalLink("A", "C", 6.0); aMap.addBidirectionalLink("B", "D", 4.0); aMap.addBidirectionalLink("B", "E", 7.0); aMap.addBidirectionalLink("D", "F", 4.0); aMap.addBidirectionalLink("D", "G", 8.0); envChanges = new StringBuffer(); } @Test public void testAlreadyAtGoal() { MapEnvironment me = new MapEnvironment(aMap); OnlineDFSAgent agent = new OnlineDFSAgent(new OnlineSearchProblem(MapFunctionFactory.getActionsFunction(aMap), new DefaultGoalTest("A"), new MapStepCostFunction(aMap)), MapFunctionFactory.getPerceptToStateFunction()); me.addAgent(agent, "A"); me.addEnvironmentView(new TestEnvironmentView()); me.stepUntilDone(); Assert.assertEquals("Action[name==NoOp]->", envChanges.toString()); } @Test public void testNormalSearch() { MapEnvironment me = new MapEnvironment(aMap); OnlineDFSAgent agent = new OnlineDFSAgent(new OnlineSearchProblem(MapFunctionFactory.getActionsFunction(aMap), new DefaultGoalTest("G"), new MapStepCostFunction(aMap)), MapFunctionFactory.getPerceptToStateFunction()); me.addAgent(agent, "A"); me.addEnvironmentView(new TestEnvironmentView()); me.stepUntilDone(); Assert.assertEquals( "Action[name==moveTo, location==B]->Action[name==moveTo, location==A]->Action[name==moveTo, location==C]->Action[name==moveTo, location==A]->Action[name==moveTo, location==C]->Action[name==moveTo, location==A]->Action[name==moveTo, location==B]->Action[name==moveTo, location==D]->Action[name==moveTo, location==B]->Action[name==moveTo, location==E]->Action[name==moveTo, location==B]->Action[name==moveTo, location==E]->Action[name==moveTo, location==B]->Action[name==moveTo, location==D]->Action[name==moveTo, location==F]->Action[name==moveTo, location==D]->Action[name==moveTo, location==G]->Action[name==NoOp]->", envChanges.toString()); } @Test public void testNoPath() { aMap = new ExtendableMap(); aMap.addBidirectionalLink("A", "B", 1.0); MapEnvironment me = new MapEnvironment(aMap); OnlineDFSAgent agent = new OnlineDFSAgent(new OnlineSearchProblem(MapFunctionFactory.getActionsFunction(aMap), new DefaultGoalTest("X"), new MapStepCostFunction(aMap)), MapFunctionFactory.getPerceptToStateFunction()); me.addAgent(agent, "A"); me.addEnvironmentView(new TestEnvironmentView()); me.stepUntilDone(); Assert.assertEquals( "Action[name==moveTo, location==B]->Action[name==moveTo, location==A]->Action[name==moveTo, location==B]->Action[name==moveTo, location==A]->Action[name==NoOp]->", envChanges.toString()); } @Test public void testAIMA3eFig4_19() { aMap = new ExtendableMap(); aMap.addBidirectionalLink("1,1", "1,2", 1.0); aMap.addBidirectionalLink("1,1", "2,1", 1.0); aMap.addBidirectionalLink("2,1", "3,1", 1.0); aMap.addBidirectionalLink("2,1", "2,2", 1.0); aMap.addBidirectionalLink("3,1", "3,2", 1.0); aMap.addBidirectionalLink("2,2", "2,3", 1.0); aMap.addBidirectionalLink("3,2", "3,3", 1.0); aMap.addBidirectionalLink("2,3", "1,3", 1.0); MapEnvironment me = new MapEnvironment(aMap); OnlineDFSAgent agent = new OnlineDFSAgent(new OnlineSearchProblem(MapFunctionFactory.getActionsFunction(aMap), new DefaultGoalTest("3,3"), new MapStepCostFunction(aMap)), MapFunctionFactory.getPerceptToStateFunction()); me.addAgent(agent, "1,1"); me.addEnvironmentView(new TestEnvironmentView()); me.stepUntilDone(); Assert.assertEquals( "Action[name==moveTo, location==1,2]->Action[name==moveTo, location==1,1]->Action[name==moveTo, location==2,1]->Action[name==moveTo, location==1,1]->Action[name==moveTo, location==2,1]->Action[name==moveTo, location==2,2]->Action[name==moveTo, location==2,1]->Action[name==moveTo, location==3,1]->Action[name==moveTo, location==2,1]->Action[name==moveTo, location==3,1]->Action[name==moveTo, location==3,2]->Action[name==moveTo, location==3,1]->Action[name==moveTo, location==3,2]->Action[name==moveTo, location==3,3]->Action[name==NoOp]->", envChanges.toString()); } private class TestEnvironmentView implements EnvironmentView { public void notify(String msg) { envChanges.append(msg).append("->"); } public void agentAdded(Agent agent, Environment source) { // Nothing. } public void agentActed(Agent agent, Percept percept, Action action, Environment source) { envChanges.append(action).append("->"); } } }