Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions bin/validate_one_exercise
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
21 changes: 21 additions & 0 deletions exercises/practice/pythagorean-triplet/.meta/template.j2
Original file line number Diff line number Diff line change
@@ -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 %}
78 changes: 49 additions & 29 deletions exercises/practice/pythagorean-triplet/pythagorean_triplet.bats
Original file line number Diff line number Diff line change
@@ -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"
}

Expand All @@ -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"
}

Expand All @@ -29,26 +33,35 @@ 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"
}

@test "no matching triplets for 1001" {
[[ $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"
}

Expand All @@ -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"
}