package de.joshuagleitze.tilinggame.test;
import static de.joshuagleitze.tilinggame.test.TileTestHelper.tile;
import java.util.Arrays;
import java.util.Scanner;
import java.util.stream.IntStream;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import de.joshuagleitze.tilinggame.Board;
public class BoardTestHelper {
final static String EMPTY_BOARD_DEFINITION = "------;------;------;\n------;------;------;\n------;------;------;\n------;------;------;";
final static String VALID_BOARD_DEFINITION = "------;GGY-Y-;----RR;\n------;RGRGYY;GG----;\n--YGGY;G--RGR;-YY---;\n------;---YY-;Y----Y;";
final static String INVALID_BOARD_DEFINITION = "------;-GGY-Y;RR----;\n------;RGRGYY;GG----;\nY--YGG;G--RGR;-YY---;\n------;---YY-;YY----;";
final static String RED_ROUNDTRIP_BOARD_DEFINITION = "------;-R-R--;R-R---;\n--R-R-;------;-R---R;\n---R-R;R---R-;------;\n------;------;------;";
final static int[] ROUNDTRIP = {1, 2, 5, 7, 6, 3};
private BoardTestHelper() {
}
public static Board board(final String definitionString) {
final Scanner definitionScanner = new Scanner(definitionString);
definitionScanner.useDelimiter(";\n?");
final Board resultBoard = new Board();
for (int i = 0; i < 12; i++) {
resultBoard.setTile(i, tile(definitionScanner.next()));
}
definitionScanner.close();
return resultBoard;
}
public static Matcher<String> isCorrectingNewline(final String reference) {
return new org.hamcrest.core.IsEqual<String>(transformNewlines(reference)) {
@Override
public boolean matches(final Object actualValue) {
return super.matches(transformNewlines(actualValue));
};
@Override
public void describeMismatch(final Object item, final Description description) {
super.describeMismatch(transformNewlines(item), description);
}
};
}
private static Object transformNewlines(final Object source) {
if (source instanceof String) {
return transformNewlines((String) source);
}
return source;
}
private static String transformNewlines(final String source) {
return source.replaceAll("\n", System.lineSeparator()).replaceAll(System.lineSeparator() + "$", "");
}
public static int[] concat(final int[] first, final int[]... others) {
IntStream stream = Arrays.stream(first);
for (final int[] array : others) {
stream = IntStream.concat(stream, Arrays.stream(array));
}
return stream.toArray();
}
}