diff --git a/bin/generate_tests b/bin/generate_tests index 3a787b8..9c24367 100755 --- a/bin/generate_tests +++ b/bin/generate_tests @@ -142,31 +142,42 @@ END_PREAMBLE ; def generate_test: + (.expected | type == "object") as $isobj + | (.expected | type == "array") as $isarr + | ($isobj and (.expected | has("error"))) as $iserr + | (if ($isobj or $isarr) + then ($cmd | sub("jq -r";"jq -c")) + else $cmd + end) as $command + | "\n" + "@test \(.description | @sh) {\n" + " " + "[[ $BATS_RUN_SKIPPED == \"true\" ]] || skip\n" + "\n" - + " run \($cmd) << \($Q)END_INPUT\($Q)" + + " run \($command) << \($Q)END_INPUT\($Q)" , if $property then {property, input} else .input end , "END_INPUT\n" - , ( if (.expected | type == "object" and has("error")) + , ( if $iserr then " assert_failure\n" - + " expected=\(.expected.error | @sh)\n" + + " expected=\(.expected.error | @sh)" else " assert_success" , ( .expected - | if type | IN("array","object") - then - " expected=$(cat << \($Q)END_EXPECTED\($Q)" - , . - , "END_EXPECTED\n)" + | if ($isobj or $isarr) + then " expected=\(@json | @sh)" else " expected=\(@sh)" end ) end - , " assert_equal \"$output\" \"$expected\"" + , + if ($isobj and ($iserr | not)) + then + " assert_objects_equal \"$output\" \"$expected\"" + else + " assert_equal \"$output\" \"$expected\"" + end ) , "}" ; @@ -177,14 +188,37 @@ END_PREAMBLE ' "$canonicalData" } \ | awk ' - # skip the first test + # un-skip the first test /BATS_RUN_SKIPPED/ && !seen { sub(/[[]/, "#[") seen = 1 } + # indent the input + /^END_INPUT$/ {indent = 0} + indent {sub(/^/, " ")} + /<< .END_INPUT/ {indent = 1} 1 ' \ | tee "$testFile" + + if grep -q assert_objects_equal "$testFile"; then + local t=$(mktemp) + local func=$(cat <<'END_FUNC' +assert_objects_equal() { + local result=$( + jq -n --argjson actual "$1" \\ + --argjson expected "$2" \\ + '$actual == $expected' + ) + [[ $result == "true" ]] +} +END_FUNC +) + awk -v fn="$func" ' + {print} + /load bats-extra/ { print ""; print fn } + ' "$testFile" > "$t" && mv "$t" "$testFile" + fi } [[ -d ./exercises/practice ]] || die "Run me from the repo root." diff --git a/exercises/practice/etl/test-etl.bats b/exercises/practice/etl/test-etl.bats index 9a8f0ab..13c4ea4 100644 --- a/exercises/practice/etl/test-etl.bats +++ b/exercises/practice/etl/test-etl.bats @@ -1,7 +1,16 @@ #!/usr/bin/env bats -# generated on 2022-11-02T20:59:06Z +# generated on 2023-11-07T18:49:21Z load bats-extra +assert_objects_equal() { + local result=$( + jq -n --argjson actual "$1" \ + --argjson expected "$2" \ + '$actual == $expected' + ) + [[ $result == "true" ]] +} + @test 'single letter' { #[[ $BATS_RUN_SKIPPED == "true" ]] || skip @@ -17,7 +26,7 @@ END_INPUT assert_success expected='{"a":1}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } @test 'single score with multiple letters' { @@ -39,7 +48,7 @@ END_INPUT assert_success expected='{"a":1,"e":1,"i":1,"o":1,"u":1}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } @test 'multiple scores with multiple letters' { @@ -62,7 +71,7 @@ END_INPUT assert_success expected='{"a":1,"d":2,"e":1,"g":2}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } @test 'multiple scores with differing numbers of letters' { @@ -117,6 +126,5 @@ END_INPUT assert_success expected='{"a":1,"b":3,"c":3,"d":2,"e":1,"f":4,"g":2,"h":4,"i":1,"j":8,"k":5,"l":1,"m":3,"n":1,"o":1,"p":3,"q":10,"r":1,"s":1,"t":1,"u":1,"v":4,"w":4,"x":8,"y":4,"z":10}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } - diff --git a/exercises/practice/nucleotide-count/test-nucleotide-count.bats b/exercises/practice/nucleotide-count/test-nucleotide-count.bats index 9a610db..5cde188 100644 --- a/exercises/practice/nucleotide-count/test-nucleotide-count.bats +++ b/exercises/practice/nucleotide-count/test-nucleotide-count.bats @@ -1,7 +1,16 @@ #!/usr/bin/env bats -# generated on 2022-11-02T20:59:33Z +# generated on 2023-11-07T18:49:21Z load bats-extra +assert_objects_equal() { + local result=$( + jq -n --argjson actual "$1" \ + --argjson expected "$2" \ + '$actual == $expected' + ) + [[ $result == "true" ]] +} + @test 'empty strand' { #[[ $BATS_RUN_SKIPPED == "true" ]] || skip @@ -13,7 +22,7 @@ END_INPUT assert_success expected='{"A":0,"C":0,"G":0,"T":0}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } @test 'can count one nucleotide in single-character input' { @@ -27,7 +36,7 @@ END_INPUT assert_success expected='{"A":0,"C":0,"G":1,"T":0}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } @test 'strand with repeated nucleotide' { @@ -41,7 +50,7 @@ END_INPUT assert_success expected='{"A":0,"C":0,"G":7,"T":0}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } @test 'strand with multiple nucleotides' { @@ -55,7 +64,7 @@ END_INPUT assert_success expected='{"A":20,"C":12,"G":17,"T":21}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } @test 'strand with invalid nucleotides' { @@ -71,4 +80,3 @@ END_INPUT expected='Invalid nucleotide in strand' assert_equal "$output" "$expected" } - diff --git a/exercises/practice/satellite/test-satellite.bats b/exercises/practice/satellite/test-satellite.bats index 4e73e41..67f3aa2 100644 --- a/exercises/practice/satellite/test-satellite.bats +++ b/exercises/practice/satellite/test-satellite.bats @@ -1,7 +1,16 @@ #!/usr/bin/env bats -# generated on 2022-11-02T20:59:46Z +# generated on 2023-11-07T18:49:22Z load bats-extra +assert_objects_equal() { + local result=$( + jq -n --argjson actual "$1" \ + --argjson expected "$2" \ + '$actual == $expected' + ) + [[ $result == "true" ]] +} + @test 'Empty tree' { #[[ $BATS_RUN_SKIPPED == "true" ]] || skip @@ -14,7 +23,7 @@ END_INPUT assert_success expected='{}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } @test 'Tree with one item' { @@ -33,7 +42,7 @@ END_INPUT assert_success expected='{"v":"a","l":{},"r":{}}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } @test 'Tree with many items' { @@ -60,7 +69,7 @@ END_INPUT assert_success expected='{"v":"a","l":{"v":"i","l":{},"r":{}},"r":{"v":"x","l":{"v":"f","l":{},"r":{}},"r":{"v":"r","l":{},"r":{}}}}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } @test 'Reject traversals of different length' { @@ -130,4 +139,3 @@ END_INPUT expected='traversals must contain unique items' assert_equal "$output" "$expected" } - diff --git a/exercises/practice/two-bucket/test-two-bucket.bats b/exercises/practice/two-bucket/test-two-bucket.bats index 8e25eaf..7c07a06 100644 --- a/exercises/practice/two-bucket/test-two-bucket.bats +++ b/exercises/practice/two-bucket/test-two-bucket.bats @@ -1,7 +1,16 @@ #!/usr/bin/env bats -# generated on 2022-11-02T20:59:53Z +# generated on 2023-11-07T18:49:23Z load bats-extra +assert_objects_equal() { + local result=$( + jq -n --argjson actual "$1" \ + --argjson expected "$2" \ + '$actual == $expected' + ) + [[ $result == "true" ]] +} + @test 'Measure using bucket one of size 3 and bucket two of size 5 - start with bucket one' { #[[ $BATS_RUN_SKIPPED == "true" ]] || skip @@ -16,7 +25,7 @@ END_INPUT assert_success expected='{"moves":4,"goalBucket":"one","otherBucket":5}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } @test 'Measure using bucket one of size 3 and bucket two of size 5 - start with bucket two' { @@ -33,7 +42,7 @@ END_INPUT assert_success expected='{"moves":8,"goalBucket":"two","otherBucket":3}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } @test 'Measure using bucket one of size 7 and bucket two of size 11 - start with bucket one' { @@ -50,7 +59,7 @@ END_INPUT assert_success expected='{"moves":14,"goalBucket":"one","otherBucket":11}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } @test 'Measure using bucket one of size 7 and bucket two of size 11 - start with bucket two' { @@ -67,7 +76,7 @@ END_INPUT assert_success expected='{"moves":18,"goalBucket":"two","otherBucket":7}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } @test 'Measure one step using bucket one of size 1 and bucket two of size 3 - start with bucket two' { @@ -84,7 +93,7 @@ END_INPUT assert_success expected='{"moves":1,"goalBucket":"two","otherBucket":0}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } @test 'Measure using bucket one of size 2 and bucket two of size 3 - start with bucket one and end with bucket two' { @@ -101,7 +110,7 @@ END_INPUT assert_success expected='{"moves":2,"goalBucket":"two","otherBucket":2}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } @test 'Not possible to reach the goal' { @@ -135,7 +144,7 @@ END_INPUT assert_success expected='{"moves":10,"goalBucket":"two","otherBucket":0}' - assert_equal "$output" "$expected" + assert_objects_equal "$output" "$expected" } @test 'Goal larger than both buckets is impossible' { @@ -154,4 +163,3 @@ END_INPUT expected='impossible' assert_equal "$output" "$expected" } -