* 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.
92 lines
2.1 KiB
Bash
Executable File
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}"
|