package network.correctness;
import java.util.Arrays;
import shef.network.CIL2PFactory;
import shef.network.CIL2PManager;
import shef.network.CIL2PNet;
public class CIL2PConnect4Tests extends AbstractCIL2PCorrectnessTests {
private static final String gameLocation = "connect4";
@Override
protected void setUp() throws Exception {
CIL2PNet cn = CIL2PFactory.fromFileLocation(gameLocation);
cil2p_manager = new CIL2PManager(cn);
super.setUp();
}
@Override
public void testTopology() {
assertEquals(202, cil2p_manager.getPlayInfo()[0]);
assertEquals(8, cil2p_manager.getPlayInfo()[1]);
cil2p_manager.printInfo();
cil2p_manager.printPlayInfo();
}
/**
* test blank board
*/
public void testBlank(){
double[] output = translateConnect4(
"D D D D D D D D " +
"B B B B B B B D " +
"B B B B B B B D " +
"B B B B B B B D " +
"B B B B B B B D " +
"B B B B B B B D " +
"B B B B B B B D " +
"B B B B B B B D " +
"D D D D D D D D", cil2p_manager
);
double[] scores = cil2p_manager.getAllPlayerScores(output);
assertEquals(scores[0], scores[1]);
}
/**
* test simple horizontal win
* RED winner
*/
public void testHorizWin(){
double[] output = translateConnect4(
"D D D D D D D D " +
"B B B B B B B D " +
"B B B B B B B D " +
"B B B B B B B D " +
"B B B B B B B D " +
"B B B B B B B D " +
"B B B B B B B D " +
"R R R R B B B D " +
"D D D D D D D D", cil2p_manager
);
double[] scores = cil2p_manager.getAllPlayerScores(output);
assertTrue(scores[0]>scores[1]);
}
/**
* test horizontal win with a bit more noise going on
* RED winner
*/
public void testHorizNoiseWin(){
CIL2PNet cn = CIL2PFactory.fromFileLocation(gameLocation);
cil2p_manager = new CIL2PManager(cn);
double[] output = translateConnect4(
"D D D D D D D D " +
"B B B B B B B D " +
"B B B B B B B D " +
"B B B B W W W D " +
"B B B R R R R D " +
"B B B W R W R D " +
"B B B R W W W D " +
"B B W R W W R D " +
"D D D D D D D D", cil2p_manager
);
double[] scores = cil2p_manager.getAllPlayerScores(output);
assertTrue(scores[0]>scores[1]);
}
/**
* test vertical win with a bit more noise going on
* RED winner
*/
public void testVerticalNoiseWin(){
double[] output = translateConnect4(
"D D D D D D D D " +
"B B B B B B B D " +
"B B B B B B B D " +
"B B R B W W W D " +
"B B R W R R R D " +
"B B R W R W R D " +
"B B R R W W W D " +
"B B W R W W R D " +
"D D D D D D D D", cil2p_manager
);
double[] scores = cil2p_manager.getAllPlayerScores(output);
assertTrue(scores[0]>scores[1]);
}
/**
* test diag win with a bit more noise going on
* WHITE win
*/
public void testDiagonalNoiseWin(){
double[] output = translateConnect4(
"D D D D D D D D " +
"B B B B B B B D " +
"B B B B B W B D " +
"B B R B W W W D " +
"B B R W R R R D " +
"B B W W R W R D " +
"B B R R W W W D " +
"B B W R W W R D " +
"D D D D D D D D", cil2p_manager
);
double[] scores = cil2p_manager.getAllPlayerScores(output);
assertTrue(scores[0]<scores[1]);
}
/**
* Translate a simple connect4 string into a shef.network input
* @param in the string rep of the board
* @return shef.network input
*/
public static double[] translateConnect4(String input, CIL2PManager manager){
String qString = (manager.getQueryPredicates().toString());
String sString = qString.substring(qString.indexOf("CELL") + 5, qString.lastIndexOf(']')-2);
String[] strings = sString.split("\\ \\), \\(CELL\\ ");
double[] out = new double[strings.length];
String[] in = input.split("\\s");
for(int i = 0; i < strings.length; i++){
// get row, col, val
String[] key = strings[i].split("\\s");
// get index of string ref
int refIndex = 72 - ((Integer.parseInt(key[1])*8) + (9-Integer.parseInt(key[0])));
if(key[2].equalsIgnoreCase(in[refIndex])){
out[i]=1;
}else{
out[i]=-1;
}
}
return out;
}
}