package lab.games; import static org.junit.Assert.*; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import org.junit.Test; public class ModelTest { @Test(timeout=1000) public void testisFilled() { try { Model model = new Model(); Class clazz = model.getClass(); Method method = clazz.getDeclaredMethod("isFilledRecursive", int.class); method.setAccessible(true); assertTrue("isFilledRecursive(Model.COLUMN) is incorrect", (Boolean) method.invoke(model, Model.COLUMN)); assertFalse("isFilledRecursive(0) is incorrect", (Boolean) method.invoke(model, 0)); Field field = clazz.getDeclaredField("slots"); field.setAccessible(true); int[][] slots = (int[][]) field.get(model); for (int row = Model.ROW - 1; row >= 0; row--) { for (int column = 0; column < Model.COLUMN; column++) { slots[row][column] = Model.PLAYER; if (row == 0 && column == Model.COLUMN - 1) { assertTrue("isFilledRecursive(0) is incorrect", (Boolean) method.invoke(model, 0)); } else { assertFalse("isFilledRecursive(0) is incorrect", (Boolean) method.invoke(model, 0)); } } } } catch (NoSuchMethodException | SecurityException | InvocationTargetException | IllegalAccessException | NoSuchFieldException | IllegalArgumentException e) { if (e.getCause() instanceof IndexOutOfBoundsException) { fail("isFilledRecursive can take Model.COLUMN as its argument"); } else { System.out.println("Something went wrong. Please contact your instructor"); e.printStackTrace(); } } } @Test(timeout=1000) public void testDrop() { try { Model model = new Model(); Class clazz = model.getClass(); Method method = clazz.getDeclaredMethod("dropRecursive", int.class, int.class, int.class); method.setAccessible(true); Field field = clazz.getDeclaredField("slots"); field.setAccessible(true); int[][] slots = (int[][]) field.get(model); for (int row = 0; row < Model.ROW; row++) { for (int column = 0; column < Model.COLUMN; column++) { assertEquals("dropRecursive is incorrect", 0, slots[row][column]); assertEquals("dropRecursive is incorrect", row, method.invoke(model, column, row, Model.PLAYER)); assertEquals("dropRecursive is incorrect", Model.PLAYER, slots[row][column]); } } } catch (NoSuchMethodException | SecurityException | InvocationTargetException | IllegalAccessException | NoSuchFieldException | IllegalArgumentException e) { System.out.println("Something went wrong. Please contact your instructor"); e.printStackTrace(); } } @Test(timeout=1000) public void testHorizontal() { try { Model model = new Model(); Class clazz = model.getClass(); Method method = clazz.getDeclaredMethod("horizontalRecursive", int.class, int.class); method.setAccessible(true); assertFalse("horizontal(Model.ROW) is incorrect", (Boolean) method.invoke(model, Model.PLAYER, Model.ROW)); Field field = clazz.getDeclaredField("slots"); field.setAccessible(true); int[][] slots = (int[][]) field.get(model); for (int row = 0; row < Model.ROW; row++) { for (int column = 0; column < Model.COLUMN; column++) { slots[row][column] = Model.PLAYER; } assertTrue("horizontalRecursive is incorrect", (Boolean) method.invoke(model, Model.PLAYER, row)); assertFalse("horizontalRecursive is incorrect", (Boolean) method.invoke(model, Model.COMPUTER, row)); for (int column = 0; column < Model.COLUMN; column += Model.CONNECTED - 1) { slots[row][column] = Model.COMPUTER; } assertFalse("horizontalRecursive is incorrect", (Boolean) method.invoke(model, Model.PLAYER, row)); } } catch (NoSuchMethodException | SecurityException | InvocationTargetException | IllegalAccessException | NoSuchFieldException | IllegalArgumentException e) { if (e.getCause() instanceof IndexOutOfBoundsException) { fail("horizontalRecursive can take Model.ROW as its argument"); } else { System.out.println("Something went wrong. Please contact your instructor"); e.printStackTrace(); } } } }