From 83f0260045eef5bb7d726fe18883192a7ae0439f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Sat, 29 Aug 2026 11:31:40 -0700 Subject: [PATCH 1/3] Sync tests --- exercises/practice/bob/.meta/tests.toml | 89 ++++++------- exercises/practice/bob/bob.spec.js | 119 +++++++++--------- exercises/practice/connect/.meta/tests.toml | 19 ++- exercises/practice/connect/connect.spec.js | 20 +++ exercises/practice/line-up/.meta/tests.toml | 18 +++ exercises/practice/line-up/line-up.spec.js | 36 ++++++ .../state-of-tic-tac-toe/.meta/tests.toml | 6 + .../state-of-tic-tac-toe.spec.js | 18 +++ 8 files changed, 222 insertions(+), 103 deletions(-) diff --git a/exercises/practice/bob/.meta/tests.toml b/exercises/practice/bob/.meta/tests.toml index 5299e2895f..c6a4649601 100644 --- a/exercises/practice/bob/.meta/tests.toml +++ b/exercises/practice/bob/.meta/tests.toml @@ -9,17 +9,20 @@ # As user-added comments (using the # character) will be removed when this file # is regenerated, comments can be added via a `comment` key. -[e162fead-606f-437a-a166-d051915cea8e] -description = "stating something" +[8a2e771d-d6f1-4e3f-b6c6-b41495556e37] +description = "asking a question" [73a966dc-8017-47d6-bb32-cf07d1a5fcd9] description = "shouting" -[d6c98afd-df35-4806-b55e-2c457c3ab748] -description = "shouting gibberish" +[a5193c61-4a92-4f68-93e2-f554eb385ec6] +description = "forceful question" -[8a2e771d-d6f1-4e3f-b6c6-b41495556e37] -description = "asking a question" +[bc39f7c6-f543-41be-9a43-fd1c2f753fc0] +description = "silence" + +[e162fead-606f-437a-a166-d051915cea8e] +description = "stating something" [81080c62-4e4d-4066-b30a-48d8d76920d9] description = "asking a numeric question" @@ -27,23 +30,34 @@ description = "asking a numeric question" [2a02716d-685b-4e2e-a804-2adaf281c01e] description = "asking gibberish" -[c02f9179-ab16-4aa7-a8dc-940145c385f7] -description = "talking forcefully" +[bb0011c5-cd52-4a5b-8bfb-a87b6283b0e2] +description = "question with no letters" -[153c0e25-9bb5-4ec5-966e-598463658bcd] -description = "using acronyms in regular speech" +[9bfc677d-ea3a-45f2-be44-35bc8fa3753e] +description = "non-letters with question" -[a5193c61-4a92-4f68-93e2-f554eb385ec6] -description = "forceful question" +[8608c508-f7de-4b17-985b-811878b3cf45] +description = "prattling on" -[a20e0c54-2224-4dde-8b10-bd2cdd4f61bc] -description = "shouting numbers" +[05b304d6-f83b-46e7-81e0-4cd3ca647900] +description = "ending with whitespace" -[f7bc4b92-bdff-421e-a238-ae97f230ccac] -description = "no letters" +[66953780-165b-4e7e-8ce3-4bcb80b6385a] +description = "multiple line question" +include = false -[bb0011c5-cd52-4a5b-8bfb-a87b6283b0e2] -description = "question with no letters" +[2c7278ac-f955-4eb4-bf8f-e33eb4116a15] +description = "multiple line question" +reimplements = "66953780-165b-4e7e-8ce3-4bcb80b6385a" + +[d6c98afd-df35-4806-b55e-2c457c3ab748] +description = "shouting gibberish" + +[3c954328-86fb-4c71-8961-e18d6a5e2517] +description = "shouting a statement containing a question mark" + +[a20e0c54-2224-4dde-8b10-bd2cdd4f61bc] +description = "shouting numbers" [496143c8-1c31-4c01-8a08-88427af85c66] description = "shouting with special characters" @@ -51,40 +65,29 @@ description = "shouting with special characters" [e6793c1c-43bd-4b8d-bc11-499aea73925f] description = "shouting with no exclamation mark" -[aa8097cc-c548-4951-8856-14a404dd236a] -description = "statement containing question mark" - -[9bfc677d-ea3a-45f2-be44-35bc8fa3753e] -description = "non-letters with question" - -[8608c508-f7de-4b17-985b-811878b3cf45] -description = "prattling on" - -[bc39f7c6-f543-41be-9a43-fd1c2f753fc0] -description = "silence" - [d6c47565-372b-4b09-b1dd-c40552b8378b] description = "prolonged silence" [4428f28d-4100-4d85-a902-e5a78cb0ecd3] description = "alternate silence" -[66953780-165b-4e7e-8ce3-4bcb80b6385a] -description = "multiple line question" -include = false +[72bd5ad3-9b2f-4931-a988-dce1f5771de2] +description = "other whitespace" -[5371ef75-d9ea-4103-bcfa-2da973ddec1b] -description = "starting with whitespace" +[c02f9179-ab16-4aa7-a8dc-940145c385f7] +description = "talking forcefully" -[05b304d6-f83b-46e7-81e0-4cd3ca647900] -description = "ending with whitespace" +[153c0e25-9bb5-4ec5-966e-598463658bcd] +description = "using acronyms in regular speech" -[72bd5ad3-9b2f-4931-a988-dce1f5771de2] -description = "other whitespace" +[f7bc4b92-bdff-421e-a238-ae97f230ccac] +description = "no letters" + +[aa8097cc-c548-4951-8856-14a404dd236a] +description = "statement containing question mark" + +[5371ef75-d9ea-4103-bcfa-2da973ddec1b] +description = "starting with whitespace" [12983553-8601-46a8-92fa-fcaa3bc4a2a0] description = "non-question ending with whitespace" - -[2c7278ac-f955-4eb4-bf8f-e33eb4116a15] -description = "multiple line question" -reimplements = "66953780-165b-4e7e-8ce3-4bcb80b6385a" diff --git a/exercises/practice/bob/bob.spec.js b/exercises/practice/bob/bob.spec.js index f423c26044..af65227007 100644 --- a/exercises/practice/bob/bob.spec.js +++ b/exercises/practice/bob/bob.spec.js @@ -2,9 +2,9 @@ import { describe, expect, test, xtest } from '@jest/globals'; import { hey } from './bob'; describe('Bob', () => { - test('stating something', () => { - const result = hey('Tom-ay-to, tom-aaaah-to.'); - expect(result).toEqual('Whatever.'); + test('asking a question', () => { + const result = hey('Does this cryogenic chamber make me look fat?'); + expect(result).toEqual('Sure.'); }); xtest('shouting', () => { @@ -12,14 +12,19 @@ describe('Bob', () => { expect(result).toEqual('Whoa, chill out!'); }); - xtest('shouting gibberish', () => { - const result = hey('FCECDFCAAB'); - expect(result).toEqual('Whoa, chill out!'); + xtest('forceful question', () => { + const result = hey('WHAT THE HELL WERE YOU THINKING?'); + expect(result).toEqual("Calm down, I know what I'm doing!"); }); - xtest('asking a question', () => { - const result = hey('Does this cryogenic chamber make me look fat?'); - expect(result).toEqual('Sure.'); + xtest('silence', () => { + const result = hey(''); + expect(result).toEqual('Fine. Be that way!'); + }); + + xtest('stating something', () => { + const result = hey('Tom-ay-to, tom-aaaah-to.'); + expect(result).toEqual('Whatever.'); }); xtest('asking a numeric question', () => { @@ -32,64 +37,54 @@ describe('Bob', () => { expect(result).toEqual('Sure.'); }); - xtest('talking forcefully', () => { - const result = hey("Let's go make out behind the gym!"); - expect(result).toEqual('Whatever.'); - }); - - xtest('using acronyms in regular speech', () => { - const result = hey("It's OK if you don't want to go to the DMV."); - expect(result).toEqual('Whatever.'); + xtest('question with no letters', () => { + const result = hey('4?'); + expect(result).toEqual('Sure.'); }); - xtest('forceful question', () => { - const result = hey('WHAT THE HELL WERE YOU THINKING?'); - expect(result).toEqual("Calm down, I know what I'm doing!"); + xtest('non-letters with question', () => { + const result = hey(':) ?'); + expect(result).toEqual('Sure.'); }); - xtest('shouting numbers', () => { - const result = hey('1, 2, 3 GO!'); - expect(result).toEqual('Whoa, chill out!'); + xtest('prattling on', () => { + const result = hey('Wait! Hang on. Are you going to be OK?'); + expect(result).toEqual('Sure.'); }); - xtest('no letters', () => { - const result = hey('1, 2, 3'); - expect(result).toEqual('Whatever.'); + xtest('ending with whitespace', () => { + const result = hey('Okay if like my spacebar quite a bit? '); + expect(result).toEqual('Sure.'); }); - xtest('question with no letters', () => { - const result = hey('4?'); + xtest('multiple line question', () => { + const result = hey('\nDoes this cryogenic chamber make\n me look fat?'); expect(result).toEqual('Sure.'); }); - xtest('shouting with special characters', () => { - const result = hey('ZOMG THE %^*@#$(*^ ZOMBIES ARE COMING!!11!!1!'); + xtest('shouting gibberish', () => { + const result = hey('FCECDFCAAB'); expect(result).toEqual('Whoa, chill out!'); }); - xtest('shouting with no exclamation mark', () => { - const result = hey('I HATE YOU'); + xtest('shouting a statement containing a question mark', () => { + const result = hey('DO LIONS EAT PEOPLE? AHHHHH.'); expect(result).toEqual('Whoa, chill out!'); }); - xtest('statement containing question mark', () => { - const result = hey('Ending with a ? means a question.'); - expect(result).toEqual('Whatever.'); - }); - - xtest('non-letters with question', () => { - const result = hey(':) ?'); - expect(result).toEqual('Sure.'); + xtest('shouting numbers', () => { + const result = hey('1, 2, 3 GO!'); + expect(result).toEqual('Whoa, chill out!'); }); - xtest('prattling on', () => { - const result = hey('Wait! Hang on. Are you going to be OK?'); - expect(result).toEqual('Sure.'); + xtest('shouting with special characters', () => { + const result = hey('ZOMG THE %^*@#$(*^ ZOMBIES ARE COMING!!11!!1!'); + expect(result).toEqual('Whoa, chill out!'); }); - xtest('silence', () => { - const result = hey(''); - expect(result).toEqual('Fine. Be that way!'); + xtest('shouting with no exclamation mark', () => { + const result = hey('I HATE YOU'); + expect(result).toEqual('Whoa, chill out!'); }); xtest('prolonged silence', () => { @@ -102,24 +97,34 @@ describe('Bob', () => { expect(result).toEqual('Fine. Be that way!'); }); - xtest('multiple line question', () => { - const result = hey('\nDoes this cryogenic chamber make\n me look fat?'); - expect(result).toEqual('Sure.'); + xtest('other whitespace', () => { + const result = hey('\n\r \t'); + expect(result).toEqual('Fine. Be that way!'); }); - xtest('starting with whitespace', () => { - const result = hey(' hmmmmmmm...'); + xtest('talking forcefully', () => { + const result = hey("Let's go make out behind the gym!"); expect(result).toEqual('Whatever.'); }); - xtest('ending with whitespace', () => { - const result = hey('Okay if like my spacebar quite a bit? '); - expect(result).toEqual('Sure.'); + xtest('using acronyms in regular speech', () => { + const result = hey("It's OK if you don't want to go to the DMV."); + expect(result).toEqual('Whatever.'); }); - xtest('other whitespace', () => { - const result = hey('\n\r \t'); - expect(result).toEqual('Fine. Be that way!'); + xtest('no letters', () => { + const result = hey('1, 2, 3'); + expect(result).toEqual('Whatever.'); + }); + + xtest('statement containing question mark', () => { + const result = hey('Ending with a ? means a question.'); + expect(result).toEqual('Whatever.'); + }); + + xtest('starting with whitespace', () => { + const result = hey(' hmmmmmmm...'); + expect(result).toEqual('Whatever.'); }); xtest('non-question ending with whitespace', () => { diff --git a/exercises/practice/connect/.meta/tests.toml b/exercises/practice/connect/.meta/tests.toml index 59ec615e39..951b87e5c4 100644 --- a/exercises/practice/connect/.meta/tests.toml +++ b/exercises/practice/connect/.meta/tests.toml @@ -1,6 +1,13 @@ -# This is an auto-generated file. Regular comments will be removed when this -# file is regenerated. Regenerating will not touch any manually added keys, -# so comments can be added in a "comment" key. +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. [6eff0df4-3e92-478d-9b54-d3e8b354db56] description = "an empty board has no winner" @@ -23,6 +30,12 @@ description = "nobody wins crossing adjacent angles" [cd61c143-92f6-4a8d-84d9-cb2b359e226b] description = "X wins crossing from left to right" +[495e33ed-30a9-4012-b46e-d7c4d5fe13c3] +description = "X wins with left-hand dead end fork" + +[ab167ab0-4a98-4d0f-a1c0-e1cddddc3d58] +description = "X wins with right-hand dead end fork" + [73d1eda6-16ab-4460-9904-b5f5dd401d0b] description = "O wins crossing from top to bottom" diff --git a/exercises/practice/connect/connect.spec.js b/exercises/practice/connect/connect.spec.js index a5fcca9ac7..e0a79f5e22 100644 --- a/exercises/practice/connect/connect.spec.js +++ b/exercises/practice/connect/connect.spec.js @@ -61,6 +61,26 @@ describe('Judging a game of connect', () => { expect(new Board(board).winner()).toEqual('X'); }); + xtest('X wins with left-hand dead end fork', () => { + const board = [ + '. . X .', + ' X X . .', + ' . X X X', + ' O O O O' + ]; + expect(new Board(board).winner()).toEqual('X'); + }); + + xtest('X wins with right-hand dead end fork', () => { + const board = [ + '. . X X', + ' X X . .', + ' . X X .', + ' O O O O' + ]; + expect(new Board(board).winner()).toEqual('X'); + }); + xtest('O wins crossing from top to bottom', () => { const board = [ '. O . .', diff --git a/exercises/practice/line-up/.meta/tests.toml b/exercises/practice/line-up/.meta/tests.toml index 36fdf1d0cd..dd66fc1585 100644 --- a/exercises/practice/line-up/.meta/tests.toml +++ b/exercises/practice/line-up/.meta/tests.toml @@ -51,9 +51,24 @@ description = "format non-exceptional ordinal numeral 13" [2bdcebc5-c029-4874-b6cc-e9bec80d603a] description = "format exceptional ordinal numeral 21" +[a98e2e22-ab41-4557-a7c2-efedc19c16da] +description = "format exceptional ordinal numeral 22 ending in nd even though it is a multiple of 11" + +[ab45d2fb-e0ee-4016-b605-76917584db0a] +description = "format exceptional ordinal numeral 33 ending in rd even though it is a multiple of 11" + +[c9243603-9f17-45b3-9a41-db9ebdbf08e1] +description = "format exceptional ordinal numeral 52 ending in nd even though it is a multiple of 13" + [74ee2317-0295-49d2-baf0-d56bcefa14e3] description = "format exceptional ordinal numeral 62" +[3f6c408c-4331-42b6-bb6c-3ad0823e568a] +description = "format non-exceptional ordinal numeral 72 ending in nd even though it is a multiple of 12" + +[8db52cd9-9689-413f-a812-6c36fcfd0d07] +description = "format exceptional ordinal numeral 91 ending in st even though it is a multiple of 13" + [b37c332d-7f68-40e3-8503-e43cbd67a0c4] description = "format exceptional ordinal numeral 100" @@ -65,3 +80,6 @@ description = "format non-exceptional ordinal numeral 112" [06b62efe-199e-4ce7-970d-4bf73945713f] description = "format exceptional ordinal numeral 123" + +[6792c54e-59a7-4faf-839a-c4bb61014229] +description = "format large number 972 ending in nd even though it is a multiple of 12" diff --git a/exercises/practice/line-up/line-up.spec.js b/exercises/practice/line-up/line-up.spec.js index 62877284de..467c94b843 100644 --- a/exercises/practice/line-up/line-up.spec.js +++ b/exercises/practice/line-up/line-up.spec.js @@ -86,12 +86,42 @@ describe('Line Up', () => { ); }); + xtest('format exceptional ordinal numeral 22 ending in nd even though it is a multiple of 11', () => { + expect(format('Ingrid', 22)).toBe( + 'Ingrid, you are the 22nd customer we serve today. Thank you!', + ); + }); + + xtest('format exceptional ordinal numeral 33 ending in rd even though it is a multiple of 11', () => { + expect(format('Mario', 33)).toBe( + 'Mario, you are the 33rd customer we serve today. Thank you!', + ); + }); + + xtest('format exceptional ordinal numeral 52 ending in nd even though it is a multiple of 13', () => { + expect(format('Quentin', 52)).toBe( + 'Quentin, you are the 52nd customer we serve today. Thank you!', + ); + }); + xtest('format exceptional ordinal numeral 62', () => { expect(format('Nayra', 62)).toBe( 'Nayra, you are the 62nd customer we serve today. Thank you!', ); }); + xtest('format non-exceptional ordinal numeral 72 ending in nd even though it is a multiple of 12', () => { + expect(format('Ugo', 72)).toBe( + 'Ugo, you are the 72nd customer we serve today. Thank you!', + ); + }); + + xtest('format exceptional ordinal numeral 91 ending in st even though it is a multiple of 13', () => { + expect(format('Boris', 91)).toBe( + 'Boris, you are the 91st customer we serve today. Thank you!', + ); + }); + xtest('format exceptional ordinal numeral 100', () => { expect(format('John', 100)).toBe( 'John, you are the 100th customer we serve today. Thank you!', @@ -115,4 +145,10 @@ describe('Line Up', () => { 'Yma, you are the 123rd customer we serve today. Thank you!', ); }); + + xtest('format large number 972 ending in nd even though it is a multiple of 12', () => { + expect(format('Elias', 972)).toBe( + 'Elias, you are the 972nd customer we serve today. Thank you!', + ); + }); }); 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 8fc25e2118..5f574b2a12 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/state-of-tic-tac-toe.spec.js b/exercises/practice/state-of-tic-tac-toe/state-of-tic-tac-toe.spec.js index d6cdda3750..4810a83954 100644 --- a/exercises/practice/state-of-tic-tac-toe/state-of-tic-tac-toe.spec.js +++ b/exercises/practice/state-of-tic-tac-toe/state-of-tic-tac-toe.spec.js @@ -200,4 +200,22 @@ describe('Invalid boards', () => { const actual = () => gamestate(board); expect(actual).toThrow(expected); }); + + xtest('Invalid board: O kept playing after X wins', () => { + const board = ['OO ', 'XXX', ' O ']; + const expected = new Error( + 'Impossible board: game should have ended after the game was won', + ); + const actual = () => gamestate(board); + expect(actual).toThrow(expected); + }); + + xtest('Invalid board: X kept playing after O wins', () => { + const board = ['XX ', 'OOO', ' XX']; + const expected = new Error( + 'Impossible board: game should have ended after the game was won', + ); + const actual = () => gamestate(board); + expect(actual).toThrow(expected); + }); }); From 8be309f35a29906bd8f6cc9463a150fce9467eeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Sat, 29 Aug 2026 11:33:57 -0700 Subject: [PATCH 2/3] Update `state-of-tic-tac-toe` example --- exercises/practice/state-of-tic-tac-toe/.meta/proof.ci.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exercises/practice/state-of-tic-tac-toe/.meta/proof.ci.js b/exercises/practice/state-of-tic-tac-toe/.meta/proof.ci.js index ac6750df6d..9d774d25ae 100644 --- a/exercises/practice/state-of-tic-tac-toe/.meta/proof.ci.js +++ b/exercises/practice/state-of-tic-tac-toe/.meta/proof.ci.js @@ -27,7 +27,8 @@ export const gamestate = (board) => { throw new Error('Wrong turn order: X went twice'); case numberOfX - numberOfO < 0: throw new Error('Wrong turn order: O started'); - case scorringArray.includes(gridSize) && scorringArray.includes(-gridSize): + case (scorringArray.includes(gridSize) && numberOfX === numberOfO) || + (scorringArray.includes(-gridSize) && numberOfX > numberOfO): throw new Error( 'Impossible board: game should have ended after the game was won', ); From 1728edcbb2c227fa9ceef3fb3e921a59089bf8f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Sat, 29 Aug 2026 11:38:51 -0700 Subject: [PATCH 3/3] Prettier --- exercises/practice/connect/connect.spec.js | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/exercises/practice/connect/connect.spec.js b/exercises/practice/connect/connect.spec.js index e0a79f5e22..2147bf255a 100644 --- a/exercises/practice/connect/connect.spec.js +++ b/exercises/practice/connect/connect.spec.js @@ -62,22 +62,12 @@ describe('Judging a game of connect', () => { }); xtest('X wins with left-hand dead end fork', () => { - const board = [ - '. . X .', - ' X X . .', - ' . X X X', - ' O O O O' - ]; + const board = ['. . X .', ' X X . .', ' . X X X', ' O O O O']; expect(new Board(board).winner()).toEqual('X'); }); xtest('X wins with right-hand dead end fork', () => { - const board = [ - '. . X X', - ' X X . .', - ' . X X .', - ' O O O O' - ]; + const board = ['. . X X', ' X X . .', ' . X X .', ' O O O O']; expect(new Board(board).winner()).toEqual('X'); });