Files
arturo/bin/verify-exercises
András B Nagy c9536ab350 Make CI compatible for Unitt 3.x (#207)
* Ignore auto-generated .unitt folders

* Update `acronym` to unitt 3

* Only show detailed output for failing CI tests

* Revert "Update `acronym` to unitt 3"

This reverts commit c4972099e3133ed623cbf8c2131310a07fb5f29c.
2025-10-20 23:04:31 -07:00

92 lines
2.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# Synopsis:
# Verify that each exercise's example/exemplar solution passes the tests.
# You can either verify all exercises or a single exercise.
# Example: verify all exercises
# bin/verify-exercises
# Example: verify single exercise
# bin/verify-exercises two-fer
set -eo pipefail
die() { echo "$*" >&2; exit 1; }
required_tool() {
command -v "${1}" >/dev/null 2>&1 ||
die "${1} is required but not installed. Please install it and make sure it's in your PATH."
}
required_tool jq
required_tool arturo
copy_example_or_exemplar_to_solution() {
jq -c '[.files.solution, .files.exemplar // .files.example] | transpose | map({src: .[1], dst: .[0]}) | .[]' .meta/config.json \
| while read -r src_and_dst; do
cp "$(jq -r '.src' <<< "${src_and_dst}")" "$(jq -r '.dst' <<< "${src_and_dst}")"
done
}
unskip_tests() {
jq -r '.files.test[]' .meta/config.json | while read -r test_file; do
sed -i -E 's/(test|it).skip/\1/g' "${test_file}"
done
}
run_tests() {
set +e
test_output=$(arturo tester.art 2>&1)
result=$?
set -e
if [[ $result -eq 0 ]]; then
echo "All tests passed!"
return 0
else
echo "${test_output}"
return 1
fi
}
verify_exercise() {
local dir
local slug
local tmp_dir
dir=$(realpath "${1}")
slug=$(basename "${dir}")
tmp_dir=$(mktemp -d -t "exercism-verify-${slug}-XXXXX")
echo "Verifying ${slug} exercise..."
(
trap 'rm -rf "$tmp_dir"' EXIT # remove tempdir when subshell ends
cp -r "${dir}/." "${tmp_dir}"
cd "${tmp_dir}"
copy_example_or_exemplar_to_solution
unskip_tests
run_tests
)
}
verify_exercises() {
local exercise_slug
exercise_slug="${1}"
shopt -s nullglob
count=0
for exercise_dir in ./exercises/{concept,practice}/${exercise_slug}/; do
if [[ -d "${exercise_dir}" ]]; then
verify_exercise "${exercise_dir}"
((++count))
fi
done
((count > 0)) || die 'no matching exercises found!'
}
exercise_slug="${1:-*}"
verify_exercises "${exercise_slug}"