Fixed use of Zobrist hash for positional superko detection.
This commit is contained in:
33
test/net/woodyfolsom/msproj/GameStateTest.java
Normal file
33
test/net/woodyfolsom/msproj/GameStateTest.java
Normal file
@@ -0,0 +1,33 @@
|
||||
package net.woodyfolsom.msproj;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class GameStateTest {
|
||||
|
||||
@Test
|
||||
public void testGetEmptyCoords() {
|
||||
GameState gameState = new GameState(3);
|
||||
|
||||
gameState.playStone(Player.BLACK, "A1");
|
||||
gameState.playStone(Player.WHITE, "A2");
|
||||
gameState.playStone(Player.BLACK, "A3");
|
||||
|
||||
List<String> validMoves = gameState.getEmptyCoords();
|
||||
|
||||
assertFalse(validMoves.contains("A1"));
|
||||
assertFalse(validMoves.contains("A2"));
|
||||
assertFalse(validMoves.contains("A3"));
|
||||
|
||||
assertTrue(validMoves.contains("B1"));
|
||||
assertTrue(validMoves.contains("B2"));
|
||||
assertTrue(validMoves.contains("B3"));
|
||||
assertTrue(validMoves.contains("C1"));
|
||||
assertTrue(validMoves.contains("C2"));
|
||||
assertTrue(validMoves.contains("C3"));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,8 +1,14 @@
|
||||
package net.woodyfolsom.msproj;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import net.woodyfolsom.msproj.policy.ActionGenerator;
|
||||
import net.woodyfolsom.msproj.policy.ValidMoveGenerator;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class IllegalMoveTest {
|
||||
@@ -63,4 +69,27 @@ public class IllegalMoveTest {
|
||||
System.out.println(gameState);
|
||||
assertFalse("Play by WHITE at J1 should have failed.",gameState.playStone(Player.WHITE, Action.getInstance("J1")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIllegalMoveSuicide() {
|
||||
GameState gameState = new GameState(3);
|
||||
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("A1"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("B1"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("B2"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("A3"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("B3"));
|
||||
|
||||
System.out.println("State before move: ");
|
||||
System.out.println(gameState);
|
||||
assertFalse("Play by BLACK at A2 should have failed.",gameState.playStone(Player.BLACK, Action.getInstance("A2")));
|
||||
List<Action> validMoves = new ValidMoveGenerator().getActions(new GameConfig(), gameState, Player.BLACK, ActionGenerator.ALL_ACTIONS);
|
||||
assertEquals(4, validMoves.size());
|
||||
assertTrue(validMoves.contains(Action.PASS));
|
||||
assertTrue(validMoves.contains(Action.getInstance("C1")));
|
||||
assertTrue(validMoves.contains(Action.getInstance("C2")));
|
||||
assertTrue(validMoves.contains(Action.getInstance("C3")));
|
||||
|
||||
assertFalse(validMoves.contains(Action.getInstance("A2")));
|
||||
}
|
||||
}
|
||||
@@ -14,4 +14,56 @@ public class LegalMoveTest {
|
||||
assertTrue(gameState.playStone(Player.WHITE, Action.getInstance("B2")));
|
||||
System.out.println(gameState);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLegalMove2Liberties() {
|
||||
//Unit test based on illegal move from 9x9 game using MonteCarloUCT
|
||||
//Illegal move detected by gokgs.com server
|
||||
GameState gameState = new GameState(9);
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("G5"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("G7"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("F6"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("H6"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("C7"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("D7"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("E7"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("F7"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("G8"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("H9"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("J7"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("E5"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("F4"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("G3"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("D4"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("E3"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("B4"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("C3"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("D2"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("E1"));
|
||||
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("H8"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("H7"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("D9"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("D8"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("E8"));
|
||||
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("A7"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("A6"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("B8"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("B7"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("B6"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("C5"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("D5"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("D6"));
|
||||
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("A3"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("B3"));
|
||||
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("B1"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("F1"));
|
||||
|
||||
System.out.println("State before move: ");
|
||||
System.out.println(gameState);
|
||||
assertTrue("Play by WHITE at H5 should not have failed.",gameState.playStone(Player.WHITE, Action.getInstance("H5")));
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,8 @@
|
||||
package net.woodyfolsom.msproj.policy;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -34,22 +36,15 @@ public class RandomTest {
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("A3"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("A4"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("B1"));;
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("B2"));
|
||||
|
||||
//gameState.playStone('B', 3, GameBoard.BLACK_STONE);
|
||||
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("B4"));
|
||||
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("B2"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("B4"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("C2"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("C3"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("C4"));
|
||||
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("C4"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("D4"));
|
||||
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("C1"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("D2"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("D3"));
|
||||
|
||||
System.out.println("State before random WHITE move selection:");
|
||||
System.out.println(gameState);
|
||||
//This is correct - checked vs. MFOG
|
||||
@@ -61,4 +56,55 @@ public class RandomTest {
|
||||
|
||||
System.out.println(gameState);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIllegalMoveSuicide() {
|
||||
GameState gameState = new GameState(3);
|
||||
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("A1"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("B1"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("B2"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("A3"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("B3"));
|
||||
|
||||
System.out.println("State before move: ");
|
||||
System.out.println(gameState);
|
||||
RandomMovePolicy randomMovePolicy = new RandomMovePolicy();
|
||||
|
||||
//There is only a minute chance (5E-7) that RandomMoveGenerator fails to return an invalid move with probability 1/4
|
||||
//after 50 calls, if this bug recurs.
|
||||
for (int i = 0; i < 50; i++) {
|
||||
Action action = randomMovePolicy.getAction(new GameConfig(),gameState,Player.BLACK);
|
||||
//System.out.println(action);
|
||||
assertFalse("RandomMovePolicy returned illegal suicide move A2",action.equals(Action.getInstance("A2")));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIllegalMoveKo() {
|
||||
GameState gameState = new GameState(4);
|
||||
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("B1"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("A2"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("C2"));
|
||||
gameState.playStone(Player.WHITE, Action.getInstance("B3"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("A3"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("C3"));
|
||||
gameState.playStone(Player.BLACK, Action.getInstance("B4"));
|
||||
|
||||
System.out.println("State before move: ");
|
||||
System.out.println(gameState);
|
||||
assertTrue(gameState.playStone(Player.BLACK, Action.getInstance("B2")));
|
||||
System.out.println("State after move: ");
|
||||
System.out.println(gameState);
|
||||
|
||||
RandomMovePolicy randomMovePolicy = new RandomMovePolicy();
|
||||
//Test that after 50 moves, the policy never returns B3, which would be a Ko violation
|
||||
for (int i = 0; i < 50; i++) {
|
||||
Action action = randomMovePolicy.getAction(new GameConfig(),gameState,Player.WHITE);
|
||||
//System.out.println(action);
|
||||
assertFalse(action.equals(Action.NONE));
|
||||
assertFalse("RandomMovePolicy returned Ko violation move B3",action.equals(Action.getInstance("B3")));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user