From 21932d74b47fbea2c1d4186c831ca861b1fc914e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Wed, 7 Jan 2026 16:53:36 -0800 Subject: [PATCH 1/5] Update existing tests to match problem-specs --- exercises/practice/strain/strain.test.ts | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/exercises/practice/strain/strain.test.ts b/exercises/practice/strain/strain.test.ts index 20eb49d08..a9a1d1316 100644 --- a/exercises/practice/strain/strain.test.ts +++ b/exercises/practice/strain/strain.test.ts @@ -3,11 +3,11 @@ import { keep, discard } from './strain.ts' describe('strain', () => { it('keeps on empty array returns empty array', () => { - expect(keep([], (e: number) => e < 10)).toEqual([]) + expect(keep([], (e: number) => true)).toEqual([]) }) xit('keeps everything', () => { - expect(keep([1, 2, 3], (e: number) => e < 10)).toEqual([1, 2, 3]) + expect(keep([1, 3, 5], (e: number) => true)).toEqual([1, 3, 5]) }) xit('keeps first and last', () => { @@ -15,18 +15,16 @@ describe('strain', () => { }) xit('keeps neither first nor last', () => { - expect(keep([1, 2, 3, 4, 5], (e: number) => e % 2 === 0)).toEqual([ - 2, 4, - ]) + expect(keep([1, 2, 3], (e: number) => e % 2 === 0)).toEqual([2]) }) xit('keeps strings', () => { - const words = 'apple zebra banana zombies cherimoya zelot'.split(' ') + const words = ['apple', 'zebra', 'banana', 'zombies', 'cherimoya', 'zealot'] const result = keep( words, (word: string) => word.indexOf('z') === 0 ) - expect(result).toEqual('zebra zombies zelot'.split(' ')) + expect(result).toEqual(['zebra', 'zombies', 'zealot']) }) xit('keeps arrays', () => { @@ -49,11 +47,11 @@ describe('strain', () => { }) xit('empty discard', () => { - expect(discard([], (e: number) => e < 10)).toEqual([]) + expect(discard([], (e: number) => true)).toEqual([]) }) it('discards nothing', () => { - expect(discard([1, 2, 3], (e: number) => e > 10)).toEqual([1, 2, 3]) + expect(discard([1, 3, 5], (e: number) => false)).toEqual([1, 3, 5]) }) xit('discards first and last', () => { @@ -61,17 +59,17 @@ describe('strain', () => { }) xit('discards neither first nor last', () => { - const result = discard([1, 2, 3, 4, 5], (e: number) => e % 2 === 0) - expect(result).toEqual([1, 3, 5]) + const result = discard([1, 2, 3], (e: number) => e % 2 === 0) + expect(result).toEqual([1, 3]) }) xit('discards strings', () => { - const words = 'apple zebra banana zombies cherimoya zelot'.split(' ') + const words = ['apple', 'zebra', 'banana', 'zombies', 'cherimoya', 'zealot'] const result = discard( words, (word: string) => word.indexOf('z') === 0 ) - expect(result).toEqual('apple banana cherimoya'.split(' ')) + expect(result).toEqual(['apple', 'banana', 'cherimoya']) }) xit('discards arrays', () => { From b8c2144965f1199376bf902e110e2b059b7023ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Wed, 7 Jan 2026 16:56:10 -0800 Subject: [PATCH 2/5] Add missing tests --- exercises/practice/strain/.meta/tests.toml | 52 ++++++++++++++++++++++ exercises/practice/strain/strain.test.ts | 8 ++++ 2 files changed, 60 insertions(+) create mode 100644 exercises/practice/strain/.meta/tests.toml diff --git a/exercises/practice/strain/.meta/tests.toml b/exercises/practice/strain/.meta/tests.toml new file mode 100644 index 000000000..3a617b4a9 --- /dev/null +++ b/exercises/practice/strain/.meta/tests.toml @@ -0,0 +1,52 @@ +# 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. + +[26af8c32-ba6a-4eb3-aa0a-ebd8f136e003] +description = "keep on empty list returns empty list" + +[f535cb4d-e99b-472a-bd52-9fa0ffccf454] +description = "keeps everything" + +[950b8e8e-f628-42a8-85e2-9b30f09cde38] +description = "keeps nothing" + +[92694259-6e76-470c-af87-156bdf75018a] +description = "keeps first and last" + +[938f7867-bfc7-449e-a21b-7b00cbb56994] +description = "keeps neither first nor last" + +[8908e351-4437-4d2b-a0f7-770811e48816] +description = "keeps strings" + +[2728036b-102a-4f1e-a3ef-eac6160d876a] +description = "keeps lists" + +[ef16beb9-8d84-451a-996a-14e80607fce6] +description = "discard on empty list returns empty list" + +[2f42f9bc-8e06-4afe-a222-051b5d8cd12a] +description = "discards everything" + +[ca990fdd-08c2-4f95-aa50-e0f5e1d6802b] +description = "discards nothing" + +[71595dae-d283-48ca-a52b-45fa96819d2f] +description = "discards first and last" + +[ae141f79-f86d-4567-b407-919eaca0f3dd] +description = "discards neither first nor last" + +[daf25b36-a59f-4f29-bcfe-302eb4e43609] +description = "discards strings" + +[a38d03f9-95ad-4459-80d1-48e937e4acaf] +description = "discards lists" diff --git a/exercises/practice/strain/strain.test.ts b/exercises/practice/strain/strain.test.ts index a9a1d1316..66e7f1e23 100644 --- a/exercises/practice/strain/strain.test.ts +++ b/exercises/practice/strain/strain.test.ts @@ -10,6 +10,10 @@ describe('strain', () => { expect(keep([1, 3, 5], (e: number) => true)).toEqual([1, 3, 5]) }) + xit('keeps nothing', () => { + expect(keep([1, 3, 5], (e: number) => false)).toEqual([]) + }) + xit('keeps first and last', () => { expect(keep([1, 2, 3], (e: number) => e % 2 === 1)).toEqual([1, 3]) }) @@ -50,6 +54,10 @@ describe('strain', () => { expect(discard([], (e: number) => true)).toEqual([]) }) + xit('discards everything', () => { + expect(discard([1, 3, 5], (e: number) => true)).toEqual([]) + }) + it('discards nothing', () => { expect(discard([1, 3, 5], (e: number) => false)).toEqual([1, 3, 5]) }) From 453585e8e17684fc55f722ffa78fb99c32ecad3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Wed, 7 Jan 2026 17:18:31 -0800 Subject: [PATCH 3/5] Add `predicate` variables --- exercises/practice/strain/strain.test.ts | 52 +++++++++++++----------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/exercises/practice/strain/strain.test.ts b/exercises/practice/strain/strain.test.ts index 66e7f1e23..4e2c0945a 100644 --- a/exercises/practice/strain/strain.test.ts +++ b/exercises/practice/strain/strain.test.ts @@ -3,31 +3,34 @@ import { keep, discard } from './strain.ts' describe('strain', () => { it('keeps on empty array returns empty array', () => { - expect(keep([], (e: number) => true)).toEqual([]) + const predicate = (e: number): boolean => true + expect(keep([], predicate)).toEqual([]) }) xit('keeps everything', () => { - expect(keep([1, 3, 5], (e: number) => true)).toEqual([1, 3, 5]) + const predicate = (e: number): boolean => true + expect(keep([1, 3, 5], predicate)).toEqual([1, 3, 5]) }) xit('keeps nothing', () => { - expect(keep([1, 3, 5], (e: number) => false)).toEqual([]) + const predicate = (e: number): boolean => false + expect(keep([1, 3, 5], predicate)).toEqual([]) }) xit('keeps first and last', () => { - expect(keep([1, 2, 3], (e: number) => e % 2 === 1)).toEqual([1, 3]) + const predicate = (e: number): boolean => e % 2 === 1 + expect(keep([1, 2, 3], predicate)).toEqual([1, 3]) }) xit('keeps neither first nor last', () => { - expect(keep([1, 2, 3], (e: number) => e % 2 === 0)).toEqual([2]) + const predicate = (e: number): boolean => e % 2 === 0 + expect(keep([1, 2, 3], predicate)).toEqual([2]) }) xit('keeps strings', () => { const words = ['apple', 'zebra', 'banana', 'zombies', 'cherimoya', 'zealot'] - const result = keep( - words, - (word: string) => word.indexOf('z') === 0 - ) + const predicate = (word: string): boolean => word.indexOf('z') === 0 + const result = keep(words, predicate) expect(result).toEqual(['zebra', 'zombies', 'zealot']) }) @@ -41,7 +44,8 @@ describe('strain', () => { [2, 2, 1], [1, 2, 5], ] - const result = keep(rows, (row: number[]) => row.indexOf(5) > -1) + const predicate = (row: number[]) => row.indexOf(5) > -1 + const result = keep(rows, predicate) expect(result).toEqual([ [5, 5, 5], [5, 1, 2], @@ -51,32 +55,35 @@ describe('strain', () => { }) xit('empty discard', () => { - expect(discard([], (e: number) => true)).toEqual([]) + const predicate = (e: number): boolean => true + expect(discard([], predicate)).toEqual([]) }) xit('discards everything', () => { - expect(discard([1, 3, 5], (e: number) => true)).toEqual([]) + const predicate = (e: number): boolean => true + expect(discard([1, 3, 5], predicate)).toEqual([]) }) it('discards nothing', () => { - expect(discard([1, 3, 5], (e: number) => false)).toEqual([1, 3, 5]) + const predicate = (e: number): boolean => false + expect(discard([1, 3, 5], predicate)).toEqual([1, 3, 5]) }) xit('discards first and last', () => { - expect(discard([1, 2, 3], (e: number) => e % 2 === 1)).toEqual([2]) + const predicate = (e: number): boolean => e % 2 === 1 + expect(discard([1, 2, 3], predicate)).toEqual([2]) }) xit('discards neither first nor last', () => { - const result = discard([1, 2, 3], (e: number) => e % 2 === 0) + const predicate = (e: number): boolean => e % 2 === 0 + const result = discard([1, 2, 3], predicate) expect(result).toEqual([1, 3]) }) xit('discards strings', () => { const words = ['apple', 'zebra', 'banana', 'zombies', 'cherimoya', 'zealot'] - const result = discard( - words, - (word: string) => word.indexOf('z') === 0 - ) + const predicate = (word: string) => word.indexOf('z') === 0 + const result = discard(words, predicate) expect(result).toEqual(['apple', 'banana', 'cherimoya']) }) @@ -90,10 +97,9 @@ describe('strain', () => { [2, 2, 1], [1, 2, 5], ] - const result = discard( - rows, - (row: number[]) => row.indexOf(5) > -1 - ) + + const predicate = (row: number[]) => row.indexOf(5) > -1 + const result = discard(rows, predicate) expect(result).toEqual([ [1, 2, 3], [2, 1, 2], From 4d95249698874240376ac80c33d531e8245f7aec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Wed, 7 Jan 2026 17:21:54 -0800 Subject: [PATCH 4/5] Add missing return types for some predicates --- exercises/practice/strain/strain.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exercises/practice/strain/strain.test.ts b/exercises/practice/strain/strain.test.ts index 4e2c0945a..24547e54c 100644 --- a/exercises/practice/strain/strain.test.ts +++ b/exercises/practice/strain/strain.test.ts @@ -44,7 +44,7 @@ describe('strain', () => { [2, 2, 1], [1, 2, 5], ] - const predicate = (row: number[]) => row.indexOf(5) > -1 + const predicate = (row: number[]): boolean => row.indexOf(5) > -1 const result = keep(rows, predicate) expect(result).toEqual([ [5, 5, 5], @@ -82,7 +82,7 @@ describe('strain', () => { xit('discards strings', () => { const words = ['apple', 'zebra', 'banana', 'zombies', 'cherimoya', 'zealot'] - const predicate = (word: string) => word.indexOf('z') === 0 + const predicate = (word: string): boolean => word.indexOf('z') === 0 const result = discard(words, predicate) expect(result).toEqual(['apple', 'banana', 'cherimoya']) }) @@ -98,7 +98,7 @@ describe('strain', () => { [1, 2, 5], ] - const predicate = (row: number[]) => row.indexOf(5) > -1 + const predicate = (row: number[]): boolean => row.indexOf(5) > -1 const result = discard(rows, predicate) expect(result).toEqual([ [1, 2, 3], From 64b4b8675eac8adf1d92ed6252053b8ad59755c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Mon, 19 Jan 2026 22:25:05 -0800 Subject: [PATCH 5/5] Fix unused predicate parameters --- exercises/practice/strain/strain.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/exercises/practice/strain/strain.test.ts b/exercises/practice/strain/strain.test.ts index 24547e54c..fc9ca1d2d 100644 --- a/exercises/practice/strain/strain.test.ts +++ b/exercises/practice/strain/strain.test.ts @@ -3,17 +3,17 @@ import { keep, discard } from './strain.ts' describe('strain', () => { it('keeps on empty array returns empty array', () => { - const predicate = (e: number): boolean => true + const predicate = (_: number): boolean => true expect(keep([], predicate)).toEqual([]) }) xit('keeps everything', () => { - const predicate = (e: number): boolean => true + const predicate = (_: number): boolean => true expect(keep([1, 3, 5], predicate)).toEqual([1, 3, 5]) }) xit('keeps nothing', () => { - const predicate = (e: number): boolean => false + const predicate = (_: number): boolean => false expect(keep([1, 3, 5], predicate)).toEqual([]) }) @@ -55,17 +55,17 @@ describe('strain', () => { }) xit('empty discard', () => { - const predicate = (e: number): boolean => true + const predicate = (_: number): boolean => true expect(discard([], predicate)).toEqual([]) }) xit('discards everything', () => { - const predicate = (e: number): boolean => true + const predicate = (_: number): boolean => true expect(discard([1, 3, 5], predicate)).toEqual([]) }) it('discards nothing', () => { - const predicate = (e: number): boolean => false + const predicate = (_: number): boolean => false expect(discard([1, 3, 5], predicate)).toEqual([1, 3, 5]) })