From 4884cb3db4fbd203c81ddb37bb71ed1b9ff1166a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Sun, 30 Aug 2026 22:47:04 -0700 Subject: [PATCH] Sync `state-of-tic-tac-toe` tests --- .../state-of-tic-tac-toe/.meta/Example.fs | 3 ++- .../state-of-tic-tac-toe/.meta/tests.toml | 6 ++++++ .../StateOfTicTacToeTests.fs | 18 ++++++++++++++++++ generators/Generators.fs | 4 ++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/exercises/practice/state-of-tic-tac-toe/.meta/Example.fs b/exercises/practice/state-of-tic-tac-toe/.meta/Example.fs index 02bb246aa..8edbafa90 100644 --- a/exercises/practice/state-of-tic-tac-toe/.meta/Example.fs +++ b/exercises/practice/state-of-tic-tac-toe/.meta/Example.fs @@ -37,7 +37,8 @@ let gameState (board: Board) = Error ConsecutiveMovesBySamePlayer elif numNaughts > numCrosses then Error WrongPlayerStarted - elif won 'X' board && won 'O' board then + elif (won 'X' board && numCrosses <> numNaughts + 1) + || (won 'O' board && numCrosses <> numNaughts) then Error MoveMadeAfterGameWasDone elif won 'X' board || won 'O' board then Ok Win diff --git a/exercises/practice/state-of-tic-tac-toe/.meta/tests.toml b/exercises/practice/state-of-tic-tac-toe/.meta/tests.toml index 8fc25e211..5f574b2a1 100644 --- a/exercises/practice/state-of-tic-tac-toe/.meta/tests.toml +++ b/exercises/practice/state-of-tic-tac-toe/.meta/tests.toml @@ -99,3 +99,9 @@ reimplements = "b1dc8b13-46c4-47db-a96d-aa90eedc4e8d" [4801cda2-f5b7-4c36-8317-3cdd167ac22c] description = "Invalid boards -> Invalid board: players kept playing after a win" + +[5a84757a-fc86-4328-aec9-a5759e6ed35d] +description = "Invalid boards -> Invalid board: O kept playing after X wins" + +[cf25543d-583a-4656-b9ab-f82dc00a4a02] +description = "Invalid boards -> Invalid board: X kept playing after O wins" diff --git a/exercises/practice/state-of-tic-tac-toe/StateOfTicTacToeTests.fs b/exercises/practice/state-of-tic-tac-toe/StateOfTicTacToeTests.fs index 0efb047ee..24cebd448 100644 --- a/exercises/practice/state-of-tic-tac-toe/StateOfTicTacToeTests.fs +++ b/exercises/practice/state-of-tic-tac-toe/StateOfTicTacToeTests.fs @@ -248,3 +248,21 @@ let ``Invalid board: players kept playing after a win`` () = let expected: Result = Error MoveMadeAfterGameWasDone gameState board |> should equal expected +[] +let ``Invalid board: O kept playing after X wins`` () = + let board = + array2D [ ['O'; 'O'; ' ']; + ['X'; 'X'; 'X']; + [' '; 'O'; ' '] ] + let expected: Result = Error MoveMadeAfterGameWasDone + gameState board |> should equal expected + +[] +let ``Invalid board: X kept playing after O wins`` () = + let board = + array2D [ ['X'; 'X'; ' ']; + ['O'; 'O'; 'O']; + [' '; 'X'; 'X'] ] + let expected: Result = Error MoveMadeAfterGameWasDone + gameState board |> should equal expected + diff --git a/generators/Generators.fs b/generators/Generators.fs index b53f0fbc7..a775d70cd 100644 --- a/generators/Generators.fs +++ b/generators/Generators.fs @@ -2145,6 +2145,10 @@ type KillerSudokuHelper() = type StateOfTicTacToe() = inherit ExerciseGenerator() + override this.RenderSut testCase = + let parameters = this.RenderSutParameters testCase |> String.concat " " + $"gameState %s{parameters}" + override _.PropertiesWithIdentifier _ = [ "board"; "expected" ] override _.IdentifierTypeAnnotation(_, key, _) =