From 921d2e1c766ee55f2d0384179cc13eca135b1f51 Mon Sep 17 00:00:00 2001 From: Owen Date: Tue, 31 Mar 2026 09:58:36 +0200 Subject: [PATCH 1/3] add test script that accepts `-- filename` --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 65b104c..90d48e1 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } From 915eacc59664d75d49d447f3a1b65c354dfaed39 Mon Sep 17 00:00:00 2001 From: Owen Date: Tue, 31 Mar 2026 09:58:52 +0200 Subject: [PATCH 2/3] add command to test a single exercise --- Makefile | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Makefile b/Makefile index 3cc6d6a..7fd98f5 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,9 @@ OUTDIR ?= "tmp" # Define the files you want to ensure are synced across all exercises FILES_TO_CHECK = package.json package-lock.json rescript.json .gitignore LICENSE +# Camel to Pascal case utility +TO_PASCAL = $(shell echo "$(1)" | sed -E 's/[-_]/ /g' | awk '{for(i=1;i<=NF;i++)sub(/./,toupper(substr($$i,1,1)),$$i)}1' | sed 's/ //g') + # check all exercise files that need to be in sync check-exercise-files: @for exercise in $(EXERCISES); do \ @@ -113,6 +116,12 @@ endif @node test_templates/$(PASCAL_EXERCISE)_template.res.js || exit 1 npm run res:format-fix +# Test a single exercise - e.g. make test-one EXERCISE=eliuds-eggs +test-one: + $(MAKE) -s check-exercise-files + $(MAKE) -s copy-all-exercises + npm run test:only -- tmp/tests/$(call TO_PASCAL,$(EXERCISE))_test.res.js + test: $(MAKE) -s clean $(MAKE) -s check-exercise-files From fd3548eef1850bc48c7651a24c1b0b53fe7b668e Mon Sep 17 00:00:00 2001 From: Owen Date: Tue, 31 Mar 2026 09:59:09 +0200 Subject: [PATCH 3/3] re-sync package.josn files --- exercises/practice/acronym/package.json | 3 ++- exercises/practice/all-your-base/package.json | 3 ++- exercises/practice/allergies/package.json | 3 ++- exercises/practice/anagram/package.json | 3 ++- exercises/practice/armstrong-numbers/package.json | 3 ++- exercises/practice/atbash-cipher/package.json | 3 ++- exercises/practice/binary-search/package.json | 3 ++- exercises/practice/bob/package.json | 3 ++- exercises/practice/change/package.json | 3 ++- exercises/practice/difference-of-squares/package.json | 3 ++- exercises/practice/eliuds-eggs/package.json | 3 ++- exercises/practice/hello-world/package.json | 3 ++- exercises/practice/isogram/package.json | 3 ++- exercises/practice/leap/package.json | 3 ++- exercises/practice/pangram/package.json | 3 ++- exercises/practice/phone-number/package.json | 3 ++- exercises/practice/prism/package.json | 3 ++- exercises/practice/protein-translation/package.json | 3 ++- exercises/practice/raindrops/package.json | 3 ++- exercises/practice/resistor-color-duo/package.json | 3 ++- exercises/practice/resistor-color-trio/package.json | 3 ++- exercises/practice/resistor-color/package.json | 3 ++- exercises/practice/rna-transcription/package.json | 3 ++- exercises/practice/rotational-cipher/package.json | 3 ++- exercises/practice/space-age/package.json | 3 ++- exercises/practice/strain/package.json | 3 ++- exercises/practice/two-fer/package.json | 3 ++- exercises/practice/word-count/package.json | 3 ++- 28 files changed, 56 insertions(+), 28 deletions(-) diff --git a/exercises/practice/acronym/package.json b/exercises/practice/acronym/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/acronym/package.json +++ b/exercises/practice/acronym/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/all-your-base/package.json b/exercises/practice/all-your-base/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/all-your-base/package.json +++ b/exercises/practice/all-your-base/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/allergies/package.json b/exercises/practice/allergies/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/allergies/package.json +++ b/exercises/practice/allergies/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/anagram/package.json b/exercises/practice/anagram/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/anagram/package.json +++ b/exercises/practice/anagram/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/armstrong-numbers/package.json b/exercises/practice/armstrong-numbers/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/armstrong-numbers/package.json +++ b/exercises/practice/armstrong-numbers/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/atbash-cipher/package.json b/exercises/practice/atbash-cipher/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/atbash-cipher/package.json +++ b/exercises/practice/atbash-cipher/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/binary-search/package.json b/exercises/practice/binary-search/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/binary-search/package.json +++ b/exercises/practice/binary-search/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/bob/package.json b/exercises/practice/bob/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/bob/package.json +++ b/exercises/practice/bob/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/change/package.json b/exercises/practice/change/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/change/package.json +++ b/exercises/practice/change/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/difference-of-squares/package.json b/exercises/practice/difference-of-squares/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/difference-of-squares/package.json +++ b/exercises/practice/difference-of-squares/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/eliuds-eggs/package.json b/exercises/practice/eliuds-eggs/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/eliuds-eggs/package.json +++ b/exercises/practice/eliuds-eggs/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/hello-world/package.json b/exercises/practice/hello-world/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/hello-world/package.json +++ b/exercises/practice/hello-world/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/isogram/package.json b/exercises/practice/isogram/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/isogram/package.json +++ b/exercises/practice/isogram/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/leap/package.json b/exercises/practice/leap/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/leap/package.json +++ b/exercises/practice/leap/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/pangram/package.json b/exercises/practice/pangram/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/pangram/package.json +++ b/exercises/practice/pangram/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/phone-number/package.json b/exercises/practice/phone-number/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/phone-number/package.json +++ b/exercises/practice/phone-number/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/prism/package.json b/exercises/practice/prism/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/prism/package.json +++ b/exercises/practice/prism/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/protein-translation/package.json b/exercises/practice/protein-translation/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/protein-translation/package.json +++ b/exercises/practice/protein-translation/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/raindrops/package.json b/exercises/practice/raindrops/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/raindrops/package.json +++ b/exercises/practice/raindrops/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/resistor-color-duo/package.json b/exercises/practice/resistor-color-duo/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/resistor-color-duo/package.json +++ b/exercises/practice/resistor-color-duo/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/resistor-color-trio/package.json b/exercises/practice/resistor-color-trio/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/resistor-color-trio/package.json +++ b/exercises/practice/resistor-color-trio/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/resistor-color/package.json b/exercises/practice/resistor-color/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/resistor-color/package.json +++ b/exercises/practice/resistor-color/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/rna-transcription/package.json b/exercises/practice/rna-transcription/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/rna-transcription/package.json +++ b/exercises/practice/rna-transcription/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/rotational-cipher/package.json b/exercises/practice/rotational-cipher/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/rotational-cipher/package.json +++ b/exercises/practice/rotational-cipher/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/space-age/package.json b/exercises/practice/space-age/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/space-age/package.json +++ b/exercises/practice/space-age/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/strain/package.json b/exercises/practice/strain/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/strain/package.json +++ b/exercises/practice/strain/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/two-fer/package.json b/exercises/practice/two-fer/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/two-fer/package.json +++ b/exercises/practice/two-fer/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } } diff --git a/exercises/practice/word-count/package.json b/exercises/practice/word-count/package.json index 65b104c..90d48e1 100644 --- a/exercises/practice/word-count/package.json +++ b/exercises/practice/word-count/package.json @@ -20,7 +20,8 @@ "res:start": "rescript build -w", "res:format-check": "rescript format --check", "res:format-fix": "rescript format", - "test": "rescript && retest tests/*.js", + "test": "rescript && retest tmp/tests/*.js", + "test:only": "rescript && retest", "ci": "npm test" } }