diff --git a/bin/validate_one_exercise b/bin/validate_one_exercise index 0a93b2a9..c7f42ee4 100755 --- a/bin/validate_one_exercise +++ b/bin/validate_one_exercise @@ -28,13 +28,12 @@ solution=$(jq -r '.files.example[0]' "$config") # Ensure each exercise has the expected number of commented-out skip lines case ${exercise} in hello-world) expected=0 ;; - pythagorean-triplet) expected=2 ;; *) expected=1 ;; esac # a PCRE: the `\Q...\E` defines a literal segment skip_re='^\s*#+\s*\Q[[ $BATS_RUN_SKIPPED == "true" ]] || skip\E$' num_skip_comments=$(grep -cP "${skip_re}" "${tests}") || true -(( num_skip_comments == expected )) || die "There should be exactly $expected commented skip directive in ${tests}" +(( num_skip_comments == expected )) || die "There should be exactly $expected commented skip directive(s) in ${tests}" echo "Processing $exercise" diff --git a/exercises/practice/pythagorean-triplet/.meta/template.j2 b/exercises/practice/pythagorean-triplet/.meta/template.j2 new file mode 100644 index 00000000..ed532f11 --- /dev/null +++ b/exercises/practice/pythagorean-triplet/.meta/template.j2 @@ -0,0 +1,21 @@ +{{ header }} +{% for idx, case in cases %} +@test "{{ case["description"] }}" { + {% if idx == 0 %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip +{%- if case["input"]["n"] > 10000 %} + + # This test is very time-consuming for a brute force solution. + # Remove the skip and run only for extra credit (or punishment). + [[ $RUN_HARD_TEST == "true" ]] || skip + +{%- endif %} + run bash {{ solution }} {{ case["input"]["n"] }} + assert_success + actual=$( sort -t, -n -k1,1 <<< "$output" ) + expected=$(cat <<'END_EXPECTED' +{{ case["expected"] | map("join", ",") | join("\n") }} +END_EXPECTED +) + assert_equal "$actual" "$expected" +} +{% endfor %} diff --git a/exercises/practice/pythagorean-triplet/pythagorean_triplet.bats b/exercises/practice/pythagorean-triplet/pythagorean_triplet.bats index 3a53c7c8..ce3704ce 100644 --- a/exercises/practice/pythagorean-triplet/pythagorean_triplet.bats +++ b/exercises/practice/pythagorean-triplet/pythagorean_triplet.bats @@ -1,17 +1,18 @@ #!/usr/bin/env bats load bats-extra -# local version: 1.0.0.0 - -# Output your triplets, comma-separated, one per line. - +# generated on 2026-06-29T06:52:43+00:00 +# local version: 2.0.0.0 @test "triplets whose sum is 12" { - #[[ $BATS_RUN_SKIPPED == "true" ]] || skip + # [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash pythagorean_triplet.sh 12 assert_success actual=$( sort -t, -n -k1,1 <<< "$output" ) - expected="3,4,5" + expected=$(cat <<'END_EXPECTED' +3,4,5 +END_EXPECTED +) assert_equal "$actual" "$expected" } @@ -20,7 +21,10 @@ load bats-extra run bash pythagorean_triplet.sh 108 assert_success actual=$( sort -t, -n -k1,1 <<< "$output" ) - expected="27,36,45" + expected=$(cat <<'END_EXPECTED' +27,36,45 +END_EXPECTED +) assert_equal "$actual" "$expected" } @@ -29,7 +33,10 @@ load bats-extra run bash pythagorean_triplet.sh 1000 assert_success actual=$( sort -t, -n -k1,1 <<< "$output" ) - expected="200,375,425" + expected=$(cat <<'END_EXPECTED' +200,375,425 +END_EXPECTED +) assert_equal "$actual" "$expected" } @@ -37,18 +44,24 @@ load bats-extra [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash pythagorean_triplet.sh 1001 assert_success - refute_output -} + actual=$( sort -t, -n -k1,1 <<< "$output" ) + expected=$(cat <<'END_EXPECTED' -# Note: using ANSI-C Quoting here -# see https://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting +END_EXPECTED +) + assert_equal "$actual" "$expected" +} @test "returns all matching triplets" { [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash pythagorean_triplet.sh 90 assert_success actual=$( sort -t, -n -k1,1 <<< "$output" ) - expected=$'9,40,41\n15,36,39' + expected=$(cat <<'END_EXPECTED' +9,40,41 +15,36,39 +END_EXPECTED +) assert_equal "$actual" "$expected" } @@ -57,29 +70,36 @@ load bats-extra run bash pythagorean_triplet.sh 840 assert_success actual=$( sort -t, -n -k1,1 <<< "$output" ) - expected="40,399,401 + expected=$(cat <<'END_EXPECTED' +40,399,401 56,390,394 105,360,375 120,350,370 140,336,364 168,315,357 210,280,350 -240,252,348" +240,252,348 +END_EXPECTED +) assert_equal "$actual" "$expected" } -# This test is very time-consuming for a brute force solution. -# Uncomment and run only for extra credit (or punishment). +@test "triplets for large number" { + [[ $BATS_RUN_SKIPPED == "true" ]] || skip -#@test "triplets for large number" { -# [[ $BATS_RUN_SKIPPED == "true" ]] || skip -# run bash pythagorean_triplet.sh 30000 -# assert_success -# actual=$( sort -t, -n -k1,1 <<< "$output" ) -# expected="1200,14375,14425 -#1875,14000,14125 -#5000,12000,13000 -#6000,11250,12750 -#7500,10000,12500" -# assert_equal "$actual" "$expected" -#} + # This test is very time-consuming for a brute force solution. + # Remove the skip and run only for extra credit (or punishment). + [[ $RUN_HARD_TEST == "true" ]] || skip + run bash pythagorean_triplet.sh 30000 + assert_success + actual=$( sort -t, -n -k1,1 <<< "$output" ) + expected=$(cat <<'END_EXPECTED' +1200,14375,14425 +1875,14000,14125 +5000,12000,13000 +6000,11250,12750 +7500,10000,12500 +END_EXPECTED +) + assert_equal "$actual" "$expected" +}