import domain.GameSolver; import domain.HitoriGameMoves; import GUI.GameUIController; import GUI.HitoriBoardPanel; import javafx.scene.control.Button; import org.junit.jupiter.api.*; import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; import org.junit.jupiter.api.extension.ExtendWith; import org.testfx.framework.junit5.ApplicationExtension; import static org.mockito.Mockito.*; import static org.junit.jupiter.api.Assertions.*; @ExtendWith(ApplicationExtension.class) class HitoriBoardPanelTest { private HitoriBoardPanel boardPanel; private HitoriGameMoves gameMoves; private GameSolver gameSolver; private GameUIController controller; private static final int[][] TEST_BOARD = { {1, 2, 1}, {2, 1, 2}, {1, 2, 1} }; @BeforeEach void setUp() { gameMoves = new HitoriGameMoves(TEST_BOARD); gameSolver = new GameSolver(TEST_BOARD); controller = mock(GameUIController.class); boardPanel = new HitoriBoardPanel(gameMoves, gameSolver, controller); } @Test void testInitialization() { assertNotNull(boardPanel); assertEquals(9, boardPanel.getChildren().size()); // 3x3 board = 9 buttons } @Test void testCellCreation() { var children = boardPanel.getChildren(); var firstButton = (Button) children.get(0); assertEquals("1", firstButton.getText()); } @Test void testButtonStyling() { var children = boardPanel.getChildren(); var button = (Button) children.get(0); assertEquals("-fx-background-color: lightgray; -fx-text-fill: black;", button.getStyle()); } @Test void testUpdateBoard() { boardPanel.updateBoard(); assertEquals(9, boardPanel.getChildren().size()); } @Test void testShowErrors() { // Mark some cells as black to create errors gameMoves.markCellAsBlack(0, 0); gameMoves.markCellAsBlack(0, 1); boardPanel.showErrors(); // Verify that error cells are marked red var children = boardPanel.getChildren(); for (var child : children) { Button button = (Button) child; if (button.getStyle().contains("red")) { assertTrue(true); return; } } } @Test void testLeftClickHandling() { when(controller.isPaused()).thenReturn(false); var button = (Button) boardPanel.getChildren().get(0); MouseEvent event = mock(MouseEvent.class); when(event.getButton()).thenReturn(MouseButton.PRIMARY); button.fireEvent(event); verify(controller, times(0)).handleLeftClick(anyInt(), anyInt()); } @Test void testRightClickHandling() { when(controller.isPaused()).thenReturn(false); var button = (Button) boardPanel.getChildren().get(0); MouseEvent event = mock(MouseEvent.class); when(event.getButton()).thenReturn(MouseButton.SECONDARY); button.fireEvent(event); verify(controller, times(0)).handleRightClick(anyInt(), anyInt()); } @Test void testPausedState() { when(controller.isPaused()).thenReturn(true); var button = (Button) boardPanel.getChildren().get(0); MouseEvent event = mock(MouseEvent.class); when(event.getButton()).thenReturn(MouseButton.PRIMARY); button.fireEvent(event); verify(controller, never()).handleLeftClick(anyInt(), anyInt()); } }