package aima.test.core.unit.environment.wumpusworld;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;
import org.junit.Assert;
import org.junit.Test;
import aima.core.agent.Action;
import aima.core.environment.wumpusworld.AgentPercept;
import aima.core.environment.wumpusworld.AgentPosition;
import aima.core.environment.wumpusworld.HybridWumpusAgent;
import aima.core.environment.wumpusworld.Room;
import aima.core.environment.wumpusworld.action.Climb;
import aima.core.environment.wumpusworld.action.Forward;
import aima.core.environment.wumpusworld.action.Grab;
import aima.core.environment.wumpusworld.action.Shoot;
import aima.core.environment.wumpusworld.action.TurnLeft;
/**
*
* @author Ciaran O'Reilly
*
*/
public class HybridWumpusAgentTest {
@SuppressWarnings("serial")
@Test
public void testPlanRoute() {
HybridWumpusAgent hwa = new HybridWumpusAgent(4);
// Should be a NoOp plan as we are already at the goal.
Assert.assertEquals(Collections.<Action>emptyList(),
hwa.planRoute(new AgentPosition(1, 1, AgentPosition.Orientation.FACING_EAST),
new LinkedHashSet<Room>() {{
add(new Room(1,1));
}},
allRooms(4)
));
Assert.assertEquals(Arrays.asList(
new TurnLeft(AgentPosition.Orientation.FACING_EAST),
new TurnLeft(AgentPosition.Orientation.FACING_NORTH),
new Forward(new AgentPosition(2, 1, AgentPosition.Orientation.FACING_WEST))
),
hwa.planRoute(new AgentPosition(2, 1, AgentPosition.Orientation.FACING_EAST),
new LinkedHashSet<Room>() {{
add(new Room(1,1));
}},
allRooms(4)
));
Assert.assertEquals(Arrays.asList(
new TurnLeft(AgentPosition.Orientation.FACING_EAST),
new Forward(new AgentPosition(3, 1, AgentPosition.Orientation.FACING_NORTH)),
new Forward(new AgentPosition(3, 2, AgentPosition.Orientation.FACING_NORTH)),
new TurnLeft(AgentPosition.Orientation.FACING_NORTH),
new Forward(new AgentPosition(3, 3, AgentPosition.Orientation.FACING_WEST)),
new Forward(new AgentPosition(2, 3, AgentPosition.Orientation.FACING_WEST)),
new TurnLeft(AgentPosition.Orientation.FACING_WEST),
new Forward(new AgentPosition(1, 3, AgentPosition.Orientation.FACING_SOUTH)),
new Forward(new AgentPosition(1, 2, AgentPosition.Orientation.FACING_SOUTH))
),
hwa.planRoute(new AgentPosition(3, 1, AgentPosition.Orientation.FACING_EAST),
new LinkedHashSet<Room>() {{
add(new Room(1,1));
}},
new LinkedHashSet<Room>() {{
addAll(allRooms(4));
remove(new Room(2, 1));
remove(new Room(2, 2));
}}
));
}
@SuppressWarnings("serial")
@Test
public void testPlanShot() {
HybridWumpusAgent hwa = new HybridWumpusAgent(4);
// Should be just shoot as are facing the Wumpus
Assert.assertEquals(Arrays.asList(new Shoot()),
hwa.planShot(new AgentPosition(1, 1, AgentPosition.Orientation.FACING_EAST),
new LinkedHashSet<Room>() {{
add(new Room(3,1));
}},
allRooms(4)
));
Assert.assertEquals(Arrays.asList(
new TurnLeft(AgentPosition.Orientation.FACING_EAST),
new Shoot()
),
hwa.planShot(new AgentPosition(1, 1, AgentPosition.Orientation.FACING_EAST),
new LinkedHashSet<Room>() {{
add(new Room(1,2));
}},
allRooms(4)
));
Assert.assertEquals(Arrays.asList(
new Forward(new AgentPosition(1, 1, AgentPosition.Orientation.FACING_EAST)),
new TurnLeft(AgentPosition.Orientation.FACING_EAST),
new Shoot()
),
hwa.planShot(new AgentPosition(1, 1, AgentPosition.Orientation.FACING_EAST),
new LinkedHashSet<Room>() {{
add(new Room(2,2));
}},
allRooms(4)
));
}
@Test
public void testGrabAndClimb() {
HybridWumpusAgent hwa = new HybridWumpusAgent(2);
// The gold is in the first square
Action a = hwa.execute(new AgentPercept(true, true, true, false, false));
Assert.assertTrue(a instanceof Grab);
a = hwa.execute(new AgentPercept(true, true, true, false, false));
Assert.assertTrue(a instanceof Climb);
}
private static Set<Room> allRooms(int caveXandYDimensions) {
Set<Room> allRooms = new LinkedHashSet<Room>();
for (int x = 1; x <= caveXandYDimensions; x++) {
for (int y = 1; y <= caveXandYDimensions; y++) {
allRooms.add(new Room(x, y));
}
}
return allRooms;
}
}