From 5ab3083f30c695ce88b301e6cfb096d3edcc468d Mon Sep 17 00:00:00 2001 From: Isaac Good Date: Sat, 7 Nov 2026 23:21:19 -0800 Subject: [PATCH] Test generator: template and test improvements Part of #908 * Change test line format to valid bash syntax. * Change object ref format in templates. * Use `case.given` when possible. --- .../practice/satellite/.meta/template.j2 | 10 ++--- exercises/practice/satellite/satellite.bats | 21 +++++----- .../practice/save-the-cow/.meta/template.j2 | 14 +++---- .../practice/save-the-cow/save_the_cow.bats | 23 +++++------ exercises/practice/say/.meta/template.j2 | 10 ++--- exercises/practice/say/say.bats | 40 +++++++++---------- .../practice/scrabble-score/.meta/template.j2 | 6 +-- .../scrabble-score/scrabble_score.bats | 25 ++++++------ .../secret-handshake/.meta/template.j2 | 6 +-- .../secret-handshake/secret_handshake.bats | 24 +++++------ exercises/practice/series/.meta/template.j2 | 12 +++--- exercises/practice/series/series.bats | 24 +++++------ exercises/practice/sieve/.meta/template.j2 | 6 +-- exercises/practice/sieve/sieve.bats | 12 +++--- .../practice/space-age/.meta/template.j2 | 10 ++--- exercises/practice/space-age/space_age.bats | 20 +++++----- .../practice/spiral-matrix/.meta/template.j2 | 6 +-- .../practice/spiral-matrix/spiral_matrix.bats | 14 +++---- .../practice/square-root/.meta/template.j2 | 6 +-- .../practice/square-root/square_root.bats | 14 +++---- exercises/practice/sublist/.meta/template.j2 | 6 +-- exercises/practice/sublist/sublist.bats | 38 +++++++++--------- .../sum-of-multiples/.meta/template.j2 | 6 +-- .../sum-of-multiples/sum_of_multiples.bats | 34 ++++++++-------- .../swift-scheduling/.meta/template.j2 | 6 +-- .../swift-scheduling/swift_scheduling.bats | 37 +++++++++-------- 26 files changed, 213 insertions(+), 217 deletions(-) diff --git a/exercises/practice/satellite/.meta/template.j2 b/exercises/practice/satellite/.meta/template.j2 index 5d4c149c..8f65db5e 100644 --- a/exercises/practice/satellite/.meta/template.j2 +++ b/exercises/practice/satellite/.meta/template.j2 @@ -1,16 +1,16 @@ {{ header }} {% for case in cases %} -@test "{{ case["description"] }}" { +{{ case.test_function_start }} {% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip - run bash {{ solution }} "{{ case["input"]["preorder"] | join(" ") }}" "{{ case["input"]["inorder"] | join(" ") }}" -{%- if case["expect_error"] %} + run bash {{ solution }} "{{ case.input.preorder | join(" ") }}" "{{ case.input.inorder | join(" ") }}" +{%- if case.expect_error %} assert_failure shopt -s nocasematch - assert_output "{{ case["expect_error_msg"] }}" + assert_output "{{ case.expect_error_msg }}" {%- else %} assert_success expectedJson=$(cat << END_JSON -{{ case["expected"] | tojson(separators=None, indent=4) | indent(4, first=True) }} +{{ case.expected | tojson(separators=None, indent=4) | indent(4, first=True) }} END_JSON ) # compare without spaces diff --git a/exercises/practice/satellite/satellite.bats b/exercises/practice/satellite/satellite.bats index eb9b246d..0fc87c66 100644 --- a/exercises/practice/satellite/satellite.bats +++ b/exercises/practice/satellite/satellite.bats @@ -1,9 +1,9 @@ #!/usr/bin/env bats load bats-extra -# generated on 2026-08-14T05:27:25+00:00 +# generated on 2026-11-08T06:49:56+00:00 -@test "Empty tree" { +test_empty_tree() { # @test # [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash satellite.sh "" "" assert_success @@ -15,7 +15,7 @@ END_JSON [[ "${output//[[:space:]]/}" == "${expectedJson//[[:space:]]/}" ]] } -@test "Tree with one item" { +test_tree_with_one_item() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash satellite.sh "a" "a" assert_success @@ -31,7 +31,7 @@ END_JSON [[ "${output//[[:space:]]/}" == "${expectedJson//[[:space:]]/}" ]] } -@test "Tree with many items" { +test_tree_with_many_items() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash satellite.sh "a i x f r" "i a f x r" assert_success @@ -63,7 +63,7 @@ END_JSON [[ "${output//[[:space:]]/}" == "${expectedJson//[[:space:]]/}" ]] } -@test "Reject traversals of different length" { +test_reject_traversals_of_different_length() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash satellite.sh "a b" "b a r" assert_failure @@ -71,7 +71,7 @@ END_JSON assert_output "traversals must have the same length" } -@test "Reject inconsistent traversals of same length" { +test_reject_inconsistent_traversals_of_same_length() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash satellite.sh "x y z" "a b c" assert_failure @@ -79,7 +79,7 @@ END_JSON assert_output "traversals must have the same elements" } -@test "Reject traversals with repeated items" { +test_reject_traversals_with_repeated_items() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash satellite.sh "a b a" "b a a" assert_failure @@ -87,7 +87,7 @@ END_JSON assert_output "traversals must contain unique items" } -@test "A degenerate binary tree" { +test_a_degenerate_binary_tree() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash satellite.sh "a b c d" "d c b a" assert_success @@ -115,7 +115,7 @@ END_JSON [[ "${output//[[:space:]]/}" == "${expectedJson//[[:space:]]/}" ]] } -@test "Another degenerate binary tree" { +test_another_degenerate_binary_tree() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash satellite.sh "a b c d" "a b c d" assert_success @@ -143,7 +143,7 @@ END_JSON [[ "${output//[[:space:]]/}" == "${expectedJson//[[:space:]]/}" ]] } -@test "Tree with many more items" { +test_tree_with_many_more_items() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash satellite.sh "a b d g h c e f i" "g d h b a e c i f" assert_success @@ -190,4 +190,3 @@ END_JSON # compare without spaces [[ "${output//[[:space:]]/}" == "${expectedJson//[[:space:]]/}" ]] } - diff --git a/exercises/practice/save-the-cow/.meta/template.j2 b/exercises/practice/save-the-cow/.meta/template.j2 index a95eca34..7337f2c7 100644 --- a/exercises/practice/save-the-cow/.meta/template.j2 +++ b/exercises/practice/save-the-cow/.meta/template.j2 @@ -1,16 +1,16 @@ {{ header }} {% for case in cases %} -@test "{{ case["descriptions"] | join(": ") }}" { +{{ case.test_function_start }} {% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip - run bash {{ solution }} "{{ case["input"]["word"] }}" "{{ case["input"]["guesses"] | join('" "') }}" -{%- if case["expect_error"] %} + run bash {{ solution }} "{{ case.input.word }}" "{{ case.input.guesses | join('" "') }}" +{%- if case.expect_error %} assert_failure - assert_output "{{ case["expect_error_msg"] }}" + assert_output "{{ case.expect_error_msg }}" {%- else %} expected="$(cat << EXPECTED -State: {{ case["expected"]["state"] }} -Masked word: {{ case["expected"]["maskedWord"] }} -Remaining failures: {{ case["expected"]["remainingFailures"] }} +State: {{ case.expected.state }} +Masked word: {{ case.expected.maskedWord }} +Remaining failures: {{ case.expected.remainingFailures }} EXPECTED )" diff --git a/exercises/practice/save-the-cow/save_the_cow.bats b/exercises/practice/save-the-cow/save_the_cow.bats index e3ff5375..a8c1de6f 100644 --- a/exercises/practice/save-the-cow/save_the_cow.bats +++ b/exercises/practice/save-the-cow/save_the_cow.bats @@ -1,9 +1,9 @@ #!/usr/bin/env bats load bats-extra -# generated on 2026-09-13T19:12:55+00:00 +# generated on 2026-11-08T06:49:56+00:00 -@test "Initially 9 failures are allowed and no letters are guessed" { +test_initially_9_failures_are_allowed_and_no_letters_are_guessed() { # @test # [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash save_the_cow.sh "loot" "" expected="$(cat << EXPECTED @@ -17,7 +17,7 @@ EXPECTED assert_output "$expected" } -@test "After 10 failures the game is over" { +test_after_10_failures_the_game_is_over() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash save_the_cow.sh "loot" "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" expected="$(cat << EXPECTED @@ -31,7 +31,7 @@ EXPECTED assert_output "$expected" } -@test "Losing with several correct guesses" { +test_losing_with_several_correct_guesses() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash save_the_cow.sh "loot" "t" "o" "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" expected="$(cat << EXPECTED @@ -45,7 +45,7 @@ EXPECTED assert_output "$expected" } -@test "Feeding a correct letter removes underscores" { +test_feeding_a_correct_letter_removes_underscores() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash save_the_cow.sh "loot" "t" expected="$(cat << EXPECTED @@ -59,7 +59,7 @@ EXPECTED assert_output "$expected" } -@test "Feeding a correct letter twice counts as a failure" { +test_feeding_a_correct_letter_twice_counts_as_a_failure() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash save_the_cow.sh "loot" "t" "t" expected="$(cat << EXPECTED @@ -73,7 +73,7 @@ EXPECTED assert_output "$expected" } -@test "Guessing a repeated letter reveals all instances" { +test_guessing_a_repeated_letter_reveals_all_instances() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash save_the_cow.sh "loot" "t" "t" "o" expected="$(cat << EXPECTED @@ -87,7 +87,7 @@ EXPECTED assert_output "$expected" } -@test "Getting all the letters right makes for a win" { +test_getting_all_the_letters_right_makes_for_a_win() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash save_the_cow.sh "loot" "t" "t" "o" "l" expected="$(cat << EXPECTED @@ -101,7 +101,7 @@ EXPECTED assert_output "$expected" } -@test "Winning on the last guess is still a win" { +test_winning_on_the_last_guess_is_still_a_win() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash save_the_cow.sh "loot" "a" "b" "c" "d" "e" "f" "g" "h" "i" "t" "o" "l" expected="$(cat << EXPECTED @@ -115,17 +115,16 @@ EXPECTED assert_output "$expected" } -@test "Guessing after a lose is error" { +test_guessing_after_a_lose_is_error() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash save_the_cow.sh "loot" "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" assert_failure assert_output "cannot guess after the game is lost" } -@test "Guessing after a win is error" { +test_guessing_after_a_win_is_error() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash save_the_cow.sh "loot" "t" "o" "l" "l" assert_failure assert_output "cannot guess after the game is won" } - diff --git a/exercises/practice/say/.meta/template.j2 b/exercises/practice/say/.meta/template.j2 index f73ab09c..38faf065 100644 --- a/exercises/practice/say/.meta/template.j2 +++ b/exercises/practice/say/.meta/template.j2 @@ -1,14 +1,14 @@ {{ header }} {% for case in cases %} -@test "{{ case["description"] }}" { +{{ case.test_function_start }} {% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip - run bash {{ solution }} {{ case["input"]["number"] }} -{%- if case["expect_error"] %} + run bash {{ solution }} {{ case.given }} +{%- if case.expect_error %} assert_failure - assert_output "{{ case["expect_error_msg"] }}" + assert_output "{{ case.expect_error_msg }}" {%- else %} assert_success - assert_output "{{ case["expected"] }}" + assert_output "{{ case.expected }}" {%- endif %} } {% endfor %} diff --git a/exercises/practice/say/say.bats b/exercises/practice/say/say.bats index 72734e84..67a081c4 100644 --- a/exercises/practice/say/say.bats +++ b/exercises/practice/say/say.bats @@ -1,135 +1,135 @@ #!/usr/bin/env bats load bats-extra -# generated on 2026-06-29T16:53:25+00:00 +# generated on 2026-11-08T06:49:56+00:00 -@test "zero" { +test_zero() { # @test # [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 0 assert_success assert_output "zero" } -@test "one" { +test_one() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 1 assert_success assert_output "one" } -@test "fourteen" { +test_fourteen() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 14 assert_success assert_output "fourteen" } -@test "twenty" { +test_twenty() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 20 assert_success assert_output "twenty" } -@test "twenty-two" { +test_twenty_two() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 22 assert_success assert_output "twenty-two" } -@test "thirty" { +test_thirty() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 30 assert_success assert_output "thirty" } -@test "ninety-nine" { +test_ninety_nine() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 99 assert_success assert_output "ninety-nine" } -@test "one hundred" { +test_one_hundred() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 100 assert_success assert_output "one hundred" } -@test "one hundred twenty-three" { +test_one_hundred_twenty_three() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 123 assert_success assert_output "one hundred twenty-three" } -@test "two hundred" { +test_two_hundred() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 200 assert_success assert_output "two hundred" } -@test "nine hundred ninety-nine" { +test_nine_hundred_ninety_nine() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 999 assert_success assert_output "nine hundred ninety-nine" } -@test "one thousand" { +test_one_thousand() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 1000 assert_success assert_output "one thousand" } -@test "one thousand two hundred thirty-four" { +test_one_thousand_two_hundred_thirty_four() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 1234 assert_success assert_output "one thousand two hundred thirty-four" } -@test "one million" { +test_one_million() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 1000000 assert_success assert_output "one million" } -@test "one million two thousand three hundred forty-five" { +test_one_million_two_thousand_three_hundred_forty_five() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 1002345 assert_success assert_output "one million two thousand three hundred forty-five" } -@test "one billion" { +test_one_billion() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 1000000000 assert_success assert_output "one billion" } -@test "a big number" { +test_a_big_number() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 987654321123 assert_success assert_output "nine hundred eighty-seven billion six hundred fifty-four million three hundred twenty-one thousand one hundred twenty-three" } -@test "numbers below zero are out of range" { +test_numbers_below_zero_are_out_of_range() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh -1 assert_failure assert_output "input out of range" } -@test "numbers above 999,999,999,999 are out of range" { +test_numbers_above_999_999_999_999_are_out_of_range() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash say.sh 1000000000000 assert_failure diff --git a/exercises/practice/scrabble-score/.meta/template.j2 b/exercises/practice/scrabble-score/.meta/template.j2 index 1d721ec0..b1c2eccf 100644 --- a/exercises/practice/scrabble-score/.meta/template.j2 +++ b/exercises/practice/scrabble-score/.meta/template.j2 @@ -1,10 +1,10 @@ {{ header }} {% for case in cases %} -@test '{{ case["description"] }}' { +{{ case.test_function_start }} {% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip - run bash {{ solution }} '{{ case["input"]["word"] }}' + run bash {{ solution }} '{{ case.given }}' assert_success - assert_output "{{ case["expected"] }}" + assert_output "{{ case.expected }}" } {% endfor %} diff --git a/exercises/practice/scrabble-score/scrabble_score.bats b/exercises/practice/scrabble-score/scrabble_score.bats index 47b62b83..acddbe99 100644 --- a/exercises/practice/scrabble-score/scrabble_score.bats +++ b/exercises/practice/scrabble-score/scrabble_score.bats @@ -1,9 +1,9 @@ #!/usr/bin/env bats load bats-extra -# generated on 2026-08-14T05:27:25+00:00 +# generated on 2026-11-08T06:49:56+00:00 -@test 'lowercase letter' { +test_lowercase_letter() { # @test # [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash scrabble_score.sh 'a' @@ -11,7 +11,7 @@ load bats-extra assert_output "1" } -@test 'uppercase letter' { +test_uppercase_letter() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash scrabble_score.sh 'A' @@ -19,7 +19,7 @@ load bats-extra assert_output "1" } -@test 'valuable letter' { +test_valuable_letter() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash scrabble_score.sh 'f' @@ -27,7 +27,7 @@ load bats-extra assert_output "4" } -@test 'short word' { +test_short_word() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash scrabble_score.sh 'at' @@ -35,7 +35,7 @@ load bats-extra assert_output "2" } -@test 'short, valuable word' { +test_short_valuable_word() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash scrabble_score.sh 'zoo' @@ -43,7 +43,7 @@ load bats-extra assert_output "12" } -@test 'medium word' { +test_medium_word() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash scrabble_score.sh 'street' @@ -51,7 +51,7 @@ load bats-extra assert_output "6" } -@test 'medium, valuable word' { +test_medium_valuable_word() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash scrabble_score.sh 'quirky' @@ -59,7 +59,7 @@ load bats-extra assert_output "22" } -@test 'long, mixed-case word' { +test_long_mixed_case_word() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash scrabble_score.sh 'OxyphenButazone' @@ -67,7 +67,7 @@ load bats-extra assert_output "41" } -@test 'english-like word' { +test_english_like_word() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash scrabble_score.sh 'pinata' @@ -75,7 +75,7 @@ load bats-extra assert_output "8" } -@test 'empty input' { +test_empty_input() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash scrabble_score.sh '' @@ -83,11 +83,10 @@ load bats-extra assert_output "0" } -@test 'entire alphabet available' { +test_entire_alphabet_available() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash scrabble_score.sh 'abcdefghijklmnopqrstuvwxyz' assert_success assert_output "87" } - diff --git a/exercises/practice/secret-handshake/.meta/template.j2 b/exercises/practice/secret-handshake/.meta/template.j2 index 75d9ad2c..382bca85 100644 --- a/exercises/practice/secret-handshake/.meta/template.j2 +++ b/exercises/practice/secret-handshake/.meta/template.j2 @@ -1,9 +1,9 @@ {{ header }} {% for case in cases %} -@test "{{ case["description"] }}" { +{{ case.test_function_start }} {% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip - run bash {{ solution }} {{ case["input"]["number"] }} + run bash {{ solution }} {{ case.given }} assert_success - assert_output "{{ case["expected"] | join(",") }}" + assert_output "{{ case.expected | join(",") }}" } {% endfor %} diff --git a/exercises/practice/secret-handshake/secret_handshake.bats b/exercises/practice/secret-handshake/secret_handshake.bats index eab948fb..08782071 100644 --- a/exercises/practice/secret-handshake/secret_handshake.bats +++ b/exercises/practice/secret-handshake/secret_handshake.bats @@ -1,79 +1,79 @@ #!/usr/bin/env bats load bats-extra -# generated on 2026-06-29T16:53:25+00:00 +# generated on 2026-11-08T06:49:56+00:00 -@test "wink for 1" { +test_wink_for_1() { # @test # [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash secret_handshake.sh 1 assert_success assert_output "wink" } -@test "double blink for 10" { +test_double_blink_for_10() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash secret_handshake.sh 2 assert_success assert_output "double blink" } -@test "close your eyes for 100" { +test_close_your_eyes_for_100() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash secret_handshake.sh 4 assert_success assert_output "close your eyes" } -@test "jump for 1000" { +test_jump_for_1000() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash secret_handshake.sh 8 assert_success assert_output "jump" } -@test "combine two actions" { +test_combine_two_actions() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash secret_handshake.sh 3 assert_success assert_output "wink,double blink" } -@test "reverse two actions" { +test_reverse_two_actions() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash secret_handshake.sh 19 assert_success assert_output "double blink,wink" } -@test "reversing one action gives the same action" { +test_reversing_one_action_gives_the_same_action() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash secret_handshake.sh 24 assert_success assert_output "jump" } -@test "reversing no actions still gives no actions" { +test_reversing_no_actions_still_gives_no_actions() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash secret_handshake.sh 16 assert_success assert_output "" } -@test "all possible actions" { +test_all_possible_actions() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash secret_handshake.sh 15 assert_success assert_output "wink,double blink,close your eyes,jump" } -@test "reverse all possible actions" { +test_reverse_all_possible_actions() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash secret_handshake.sh 31 assert_success assert_output "jump,close your eyes,double blink,wink" } -@test "do nothing for zero" { +test_do_nothing_for_zero() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash secret_handshake.sh 0 assert_success diff --git a/exercises/practice/series/.meta/template.j2 b/exercises/practice/series/.meta/template.j2 index 44ef8cf4..497e7bec 100644 --- a/exercises/practice/series/.meta/template.j2 +++ b/exercises/practice/series/.meta/template.j2 @@ -1,15 +1,15 @@ {{ header }} {% for case in cases %} -@test "{{ case["description"] }}" { +{{ case.test_function_start }} {% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip -{%- if case["expect_error"] %} - expected="{{ case["expect_error_msg"] }}" - run bash {{ solution }} "{{ case["input"]["series"] }}" {{ case["input"]["sliceLength"] }} +{%- if case.expect_error %} + expected="{{ case.expect_error_msg }}" + run bash {{ solution }} "{{ case.input.series }}" {{ case.input.sliceLength }} assert_failure assert_output --partial "$expected" {%- else %} - expected="{{ case["expected"] | join(" ") }}" - run bash {{ solution }} "{{ case["input"]["series"] }}" {{ case["input"]["sliceLength"] }} + expected="{{ case.expected | join(" ") }}" + run bash {{ solution }} "{{ case.input.series }}" {{ case.input.sliceLength }} assert_success assert_output "$expected" {%- endif %} diff --git a/exercises/practice/series/series.bats b/exercises/practice/series/series.bats index 02b025ea..7f145e6a 100644 --- a/exercises/practice/series/series.bats +++ b/exercises/practice/series/series.bats @@ -1,9 +1,9 @@ #!/usr/bin/env bats load bats-extra -# generated on 2026-06-29T16:53:25+00:00 +# generated on 2026-11-08T06:49:56+00:00 -@test "slices of one from one" { +test_slices_of_one_from_one() { # @test # [[ $BATS_RUN_SKIPPED == "true" ]] || skip expected="1" run bash series.sh "1" 1 @@ -11,7 +11,7 @@ load bats-extra assert_output "$expected" } -@test "slices of one from two" { +test_slices_of_one_from_two() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip expected="1 2" run bash series.sh "12" 1 @@ -19,7 +19,7 @@ load bats-extra assert_output "$expected" } -@test "slices of two" { +test_slices_of_two() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip expected="35" run bash series.sh "35" 2 @@ -27,7 +27,7 @@ load bats-extra assert_output "$expected" } -@test "slices of two overlap" { +test_slices_of_two_overlap() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip expected="91 14 42" run bash series.sh "9142" 2 @@ -35,7 +35,7 @@ load bats-extra assert_output "$expected" } -@test "slices can include duplicates" { +test_slices_can_include_duplicates() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip expected="777 777 777 777" run bash series.sh "777777" 3 @@ -43,7 +43,7 @@ load bats-extra assert_output "$expected" } -@test "slices of a long series" { +test_slices_of_a_long_series() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip expected="91849 18493 84939 49390 93904 39042 90424 04243" run bash series.sh "918493904243" 5 @@ -51,7 +51,7 @@ load bats-extra assert_output "$expected" } -@test "slice length is too large" { +test_slice_length_is_too_large() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip expected="slice length cannot be greater than series length" run bash series.sh "12345" 6 @@ -59,7 +59,7 @@ load bats-extra assert_output --partial "$expected" } -@test "slice length is way too large" { +test_slice_length_is_way_too_large() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip expected="slice length cannot be greater than series length" run bash series.sh "12345" 42 @@ -67,7 +67,7 @@ load bats-extra assert_output --partial "$expected" } -@test "slice length cannot be zero" { +test_slice_length_cannot_be_zero() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip expected="slice length cannot be zero" run bash series.sh "12345" 0 @@ -75,7 +75,7 @@ load bats-extra assert_output --partial "$expected" } -@test "slice length cannot be negative" { +test_slice_length_cannot_be_negative() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip expected="slice length cannot be negative" run bash series.sh "123" -1 @@ -83,7 +83,7 @@ load bats-extra assert_output --partial "$expected" } -@test "empty series is invalid" { +test_empty_series_is_invalid() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip expected="series cannot be empty" run bash series.sh "" 1 diff --git a/exercises/practice/sieve/.meta/template.j2 b/exercises/practice/sieve/.meta/template.j2 index 5be7a90a..431120b2 100644 --- a/exercises/practice/sieve/.meta/template.j2 +++ b/exercises/practice/sieve/.meta/template.j2 @@ -1,9 +1,9 @@ {{ header }} {% for case in cases %} -@test "{{ case["description"] }}" { +{{ case.test_function_start }} {% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip - expected="{{ case["expected"] | join(" ") }}" - run bash {{ solution }} {{ case["input"]["limit"] }} + expected="{{ case.expected | join(" ") }}" + run bash {{ solution }} {{ case.given }} assert_success assert_output "$expected" } diff --git a/exercises/practice/sieve/sieve.bats b/exercises/practice/sieve/sieve.bats index 96185e93..a34847a9 100644 --- a/exercises/practice/sieve/sieve.bats +++ b/exercises/practice/sieve/sieve.bats @@ -1,9 +1,9 @@ #!/usr/bin/env bats load bats-extra -# generated on 2026-06-29T16:53:25+00:00 +# generated on 2026-11-08T06:49:56+00:00 -@test "no primes under two" { +test_no_primes_under_two() { # @test # [[ $BATS_RUN_SKIPPED == "true" ]] || skip expected="" run bash sieve.sh 1 @@ -11,7 +11,7 @@ load bats-extra assert_output "$expected" } -@test "find first prime" { +test_find_first_prime() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip expected="2" run bash sieve.sh 2 @@ -19,7 +19,7 @@ load bats-extra assert_output "$expected" } -@test "find primes up to 10" { +test_find_primes_up_to_10() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip expected="2 3 5 7" run bash sieve.sh 10 @@ -27,7 +27,7 @@ load bats-extra assert_output "$expected" } -@test "limit is prime" { +test_limit_is_prime() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip expected="2 3 5 7 11 13" run bash sieve.sh 13 @@ -35,7 +35,7 @@ load bats-extra assert_output "$expected" } -@test "find primes up to 1000" { +test_find_primes_up_to_1000() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip expected="2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 991 997" run bash sieve.sh 1000 diff --git a/exercises/practice/space-age/.meta/template.j2 b/exercises/practice/space-age/.meta/template.j2 index bb9253a4..d9dba1f9 100644 --- a/exercises/practice/space-age/.meta/template.j2 +++ b/exercises/practice/space-age/.meta/template.j2 @@ -1,14 +1,14 @@ {{ header }} {% for case in cases %} -@test "{{ case["description"] }}" { +{{ case.test_function_start }} {% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip - run bash {{ solution }} "{{ case["input"]["planet"] }}" {{ case["input"]["seconds"] }} -{%- if case["expect_error"] %} + run bash {{ solution }} "{{ case.input.planet }}" {{ case.input.seconds }} +{%- if case.expect_error %} assert_failure - assert_output --partial "{{ case["expect_error_msg"] }}" + assert_output --partial "{{ case.expect_error_msg }}" {%- else %} assert_success - assert_output {{ case["expected"] }} + assert_output {{ case.expected }} {%- endif %} } {% endfor %} diff --git a/exercises/practice/space-age/space_age.bats b/exercises/practice/space-age/space_age.bats index 91e41ad7..479978e0 100644 --- a/exercises/practice/space-age/space_age.bats +++ b/exercises/practice/space-age/space_age.bats @@ -1,65 +1,65 @@ #!/usr/bin/env bats load bats-extra -# generated on 2026-06-29T16:53:25+00:00 +# generated on 2026-11-08T06:49:56+00:00 -@test "age on Earth" { +test_age_on_earth() { # @test # [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash space_age.sh "Earth" 1000000000 assert_success assert_output 31.69 } -@test "age on Mercury" { +test_age_on_mercury() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash space_age.sh "Mercury" 2134835688 assert_success assert_output 280.88 } -@test "age on Venus" { +test_age_on_venus() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash space_age.sh "Venus" 189839836 assert_success assert_output 9.78 } -@test "age on Mars" { +test_age_on_mars() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash space_age.sh "Mars" 2129871239 assert_success assert_output 35.88 } -@test "age on Jupiter" { +test_age_on_jupiter() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash space_age.sh "Jupiter" 901876382 assert_success assert_output 2.41 } -@test "age on Saturn" { +test_age_on_saturn() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash space_age.sh "Saturn" 2000000000 assert_success assert_output 2.15 } -@test "age on Uranus" { +test_age_on_uranus() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash space_age.sh "Uranus" 1210123456 assert_success assert_output 0.46 } -@test "age on Neptune" { +test_age_on_neptune() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash space_age.sh "Neptune" 1821023456 assert_success assert_output 0.35 } -@test "invalid planet causes error" { +test_invalid_planet_causes_error() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash space_age.sh "Sun" 680804807 assert_failure diff --git a/exercises/practice/spiral-matrix/.meta/template.j2 b/exercises/practice/spiral-matrix/.meta/template.j2 index e353b912..7aa27476 100644 --- a/exercises/practice/spiral-matrix/.meta/template.j2 +++ b/exercises/practice/spiral-matrix/.meta/template.j2 @@ -1,9 +1,9 @@ {{ header }} {% for case in cases %} -@test "{{ case["description"] }}" { +{{ case.test_function_start }} {% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip - run bash {{ solution }} {{ case["input"]["size"] }} - expected="{{ case["expected"] | map("join", " ") | join("\n") }}" + run bash {{ solution }} {{ case.given }} + expected="{{ case.expected | map("join", " ") | join("\n") }}" assert_success assert_output "$expected" } diff --git a/exercises/practice/spiral-matrix/spiral_matrix.bats b/exercises/practice/spiral-matrix/spiral_matrix.bats index 516ac6dc..b86f3045 100644 --- a/exercises/practice/spiral-matrix/spiral_matrix.bats +++ b/exercises/practice/spiral-matrix/spiral_matrix.bats @@ -1,9 +1,9 @@ #!/usr/bin/env bats load bats-extra -# generated on 2026-06-29T16:53:25+00:00 +# generated on 2026-11-08T06:49:56+00:00 -@test "empty spiral" { +test_empty_spiral() { # @test # [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash spiral_matrix.sh 0 expected="" @@ -11,7 +11,7 @@ load bats-extra assert_output "$expected" } -@test "trivial spiral" { +test_trivial_spiral() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash spiral_matrix.sh 1 expected="1" @@ -19,7 +19,7 @@ load bats-extra assert_output "$expected" } -@test "spiral of size 2" { +test_spiral_of_size_2() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash spiral_matrix.sh 2 expected="1 2 @@ -28,7 +28,7 @@ load bats-extra assert_output "$expected" } -@test "spiral of size 3" { +test_spiral_of_size_3() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash spiral_matrix.sh 3 expected="1 2 3 @@ -38,7 +38,7 @@ load bats-extra assert_output "$expected" } -@test "spiral of size 4" { +test_spiral_of_size_4() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash spiral_matrix.sh 4 expected="1 2 3 4 @@ -49,7 +49,7 @@ load bats-extra assert_output "$expected" } -@test "spiral of size 5" { +test_spiral_of_size_5() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash spiral_matrix.sh 5 expected="1 2 3 4 5 diff --git a/exercises/practice/square-root/.meta/template.j2 b/exercises/practice/square-root/.meta/template.j2 index ad5718df..9e3e0aca 100644 --- a/exercises/practice/square-root/.meta/template.j2 +++ b/exercises/practice/square-root/.meta/template.j2 @@ -1,9 +1,9 @@ {{ header }} {% for case in cases %} -@test "{{ case["description"] }}" { +{{ case.test_function_start }} {% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip - run bash {{ solution }} "{{ case["input"]["radicand"] }}" + run bash {{ solution }} "{{ case.given }}" assert_success - assert_output "{{ case["expected"] }}" + assert_output "{{ case.expected }}" } {% endfor %} diff --git a/exercises/practice/square-root/square_root.bats b/exercises/practice/square-root/square_root.bats index d5a58951..0c3c1080 100644 --- a/exercises/practice/square-root/square_root.bats +++ b/exercises/practice/square-root/square_root.bats @@ -1,44 +1,44 @@ #!/usr/bin/env bats load bats-extra -# generated on 2026-06-29T16:53:25+00:00 +# generated on 2026-11-08T06:49:56+00:00 -@test "root of 1" { +test_root_of_1() { # @test # [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash square_root.sh "1" assert_success assert_output "1" } -@test "root of 4" { +test_root_of_4() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash square_root.sh "4" assert_success assert_output "2" } -@test "root of 25" { +test_root_of_25() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash square_root.sh "25" assert_success assert_output "5" } -@test "root of 81" { +test_root_of_81() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash square_root.sh "81" assert_success assert_output "9" } -@test "root of 196" { +test_root_of_196() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash square_root.sh "196" assert_success assert_output "14" } -@test "root of 65025" { +test_root_of_65025() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash square_root.sh "65025" assert_success diff --git a/exercises/practice/sublist/.meta/template.j2 b/exercises/practice/sublist/.meta/template.j2 index a50b5766..f4914520 100644 --- a/exercises/practice/sublist/.meta/template.j2 +++ b/exercises/practice/sublist/.meta/template.j2 @@ -3,10 +3,10 @@ # Lists are ordered and sequential: do not sort or reorder them. # Lists are given in JSON format. {% for case in cases %} -@test "{{ case["description"] }}" { +{{ case.test_function_start }} {% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip - run bash {{ solution }} "{{ case["input"]["listOne"] }}" "{{ case["input"]["listTwo"] }}" + run bash {{ solution }} "{{ case.input.listOne }}" "{{ case.input.listTwo }}" assert_success - assert_output "{{ case["expected"] }}" + assert_output "{{ case.expected }}" } {% endfor %} diff --git a/exercises/practice/sublist/sublist.bats b/exercises/practice/sublist/sublist.bats index b47c378d..d969550a 100644 --- a/exercises/practice/sublist/sublist.bats +++ b/exercises/practice/sublist/sublist.bats @@ -1,131 +1,131 @@ #!/usr/bin/env bats load bats-extra -# generated on 2026-06-29T16:53:25+00:00 +# generated on 2026-11-08T06:49:56+00:00 # Lists are ordered and sequential: do not sort or reorder them. # Lists are given in JSON format. -@test "empty lists" { +test_empty_lists() { # @test # [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[]" "[]" assert_success assert_output "equal" } -@test "empty list within non empty list" { +test_empty_list_within_non_empty_list() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[]" "[1, 2, 3]" assert_success assert_output "sublist" } -@test "non empty list contains empty list" { +test_non_empty_list_contains_empty_list() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[1, 2, 3]" "[]" assert_success assert_output "superlist" } -@test "list equals itself" { +test_list_equals_itself() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[1, 2, 3]" "[1, 2, 3]" assert_success assert_output "equal" } -@test "different lists" { +test_different_lists() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[1, 2, 3]" "[2, 3, 4]" assert_success assert_output "unequal" } -@test "false start" { +test_false_start() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[1, 2, 5]" "[0, 1, 2, 3, 1, 2, 5, 6]" assert_success assert_output "sublist" } -@test "consecutive" { +test_consecutive() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[1, 1, 2]" "[0, 1, 1, 1, 2, 1, 2]" assert_success assert_output "sublist" } -@test "sublist at start" { +test_sublist_at_start() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[0, 1, 2]" "[0, 1, 2, 3, 4, 5]" assert_success assert_output "sublist" } -@test "sublist in middle" { +test_sublist_in_middle() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[2, 3, 4]" "[0, 1, 2, 3, 4, 5]" assert_success assert_output "sublist" } -@test "sublist at end" { +test_sublist_at_end() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[3, 4, 5]" "[0, 1, 2, 3, 4, 5]" assert_success assert_output "sublist" } -@test "at start of superlist" { +test_at_start_of_superlist() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[0, 1, 2, 3, 4, 5]" "[0, 1, 2]" assert_success assert_output "superlist" } -@test "in middle of superlist" { +test_in_middle_of_superlist() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[0, 1, 2, 3, 4, 5]" "[2, 3]" assert_success assert_output "superlist" } -@test "at end of superlist" { +test_at_end_of_superlist() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[0, 1, 2, 3, 4, 5]" "[3, 4, 5]" assert_success assert_output "superlist" } -@test "first list missing element from second list" { +test_first_list_missing_element_from_second_list() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[1, 3]" "[1, 2, 3]" assert_success assert_output "unequal" } -@test "second list missing element from first list" { +test_second_list_missing_element_from_first_list() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[1, 2, 3]" "[1, 3]" assert_success assert_output "unequal" } -@test "first list missing additional digits from second list" { +test_first_list_missing_additional_digits_from_second_list() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[1, 2]" "[1, 22]" assert_success assert_output "unequal" } -@test "order matters to a list" { +test_order_matters_to_a_list() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[1, 2, 3]" "[3, 2, 1]" assert_success assert_output "unequal" } -@test "same digits but different numbers" { +test_same_digits_but_different_numbers() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sublist.sh "[1, 0, 1]" "[10, 1]" assert_success diff --git a/exercises/practice/sum-of-multiples/.meta/template.j2 b/exercises/practice/sum-of-multiples/.meta/template.j2 index 359a23cf..171e73a9 100644 --- a/exercises/practice/sum-of-multiples/.meta/template.j2 +++ b/exercises/practice/sum-of-multiples/.meta/template.j2 @@ -1,9 +1,9 @@ {{ header }} {% for case in cases %} -@test "{{ case["description"] }}" { +{{ case.test_function_start }} {% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip - run bash {{ solution }} {{ case["input"]["limit"] }} {{ case["input"]["factors"] | join(" ") }} + run bash {{ solution }} {{ case.input.limit }} {{ case.input.factors | join(" ") }} assert_success - assert_output "{{ case["expected"] }}" + assert_output "{{ case.expected }}" } {% endfor %} diff --git a/exercises/practice/sum-of-multiples/sum_of_multiples.bats b/exercises/practice/sum-of-multiples/sum_of_multiples.bats index 41ab1c32..e73b5f66 100644 --- a/exercises/practice/sum-of-multiples/sum_of_multiples.bats +++ b/exercises/practice/sum-of-multiples/sum_of_multiples.bats @@ -1,114 +1,114 @@ #!/usr/bin/env bats load bats-extra -# generated on 2026-06-29T16:53:25+00:00 +# generated on 2026-11-08T06:49:56+00:00 -@test "no multiples within limit" { +test_no_multiples_within_limit() { # @test # [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sum_of_multiples.sh 1 3 5 assert_success assert_output "0" } -@test "one factor has multiples within limit" { +test_one_factor_has_multiples_within_limit() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sum_of_multiples.sh 4 3 5 assert_success assert_output "3" } -@test "more than one multiple within limit" { +test_more_than_one_multiple_within_limit() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sum_of_multiples.sh 7 3 assert_success assert_output "9" } -@test "more than one factor with multiples within limit" { +test_more_than_one_factor_with_multiples_within_limit() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sum_of_multiples.sh 10 3 5 assert_success assert_output "23" } -@test "each multiple is only counted once" { +test_each_multiple_is_only_counted_once() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sum_of_multiples.sh 100 3 5 assert_success assert_output "2318" } -@test "a much larger limit" { +test_a_much_larger_limit() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sum_of_multiples.sh 1000 3 5 assert_success assert_output "233168" } -@test "three factors" { +test_three_factors() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sum_of_multiples.sh 20 7 13 17 assert_success assert_output "51" } -@test "factors not relatively prime" { +test_factors_not_relatively_prime() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sum_of_multiples.sh 15 4 6 assert_success assert_output "30" } -@test "some pairs of factors relatively prime and some not" { +test_some_pairs_of_factors_relatively_prime_and_some_not() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sum_of_multiples.sh 150 5 6 8 assert_success assert_output "4419" } -@test "one factor is a multiple of another" { +test_one_factor_is_a_multiple_of_another() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sum_of_multiples.sh 51 5 25 assert_success assert_output "275" } -@test "much larger factors" { +test_much_larger_factors() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sum_of_multiples.sh 10000 43 47 assert_success assert_output "2203160" } -@test "all numbers are multiples of 1" { +test_all_numbers_are_multiples_of_1() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sum_of_multiples.sh 100 1 assert_success assert_output "4950" } -@test "no factors means an empty sum" { +test_no_factors_means_an_empty_sum() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sum_of_multiples.sh 10000 assert_success assert_output "0" } -@test "the only multiple of 0 is 0" { +test_the_only_multiple_of_0_is_0() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sum_of_multiples.sh 1 0 assert_success assert_output "0" } -@test "the factor 0 does not affect the sum of multiples of other factors" { +test_the_factor_0_does_not_affect_the_sum_of_multiples_of_other_factors() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sum_of_multiples.sh 4 3 0 assert_success assert_output "3" } -@test "solutions using include-exclude must extend to cardinality greater than 3" { +test_solutions_using_include_exclude_must_extend_to_cardinality_greater_than_3() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash sum_of_multiples.sh 10000 2 3 5 7 11 assert_success diff --git a/exercises/practice/swift-scheduling/.meta/template.j2 b/exercises/practice/swift-scheduling/.meta/template.j2 index c247aabb..f5b2b518 100644 --- a/exercises/practice/swift-scheduling/.meta/template.j2 +++ b/exercises/practice/swift-scheduling/.meta/template.j2 @@ -1,9 +1,9 @@ {{ header }} {% for case in cases %} -@test "{{ case["description"] }}" { +{{ case.test_function_start }} {% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip - run bash {{ solution }} "{{ case["input"]["description"] }}" "{{ case["input"]["meetingStart"] }}" + run bash {{ solution }} "{{ case.input.description }}" "{{ case.input.meetingStart }}" assert_success - assert_output "{{ case["expected"] }}" + assert_output "{{ case.expected }}" } {% endfor %} diff --git a/exercises/practice/swift-scheduling/swift_scheduling.bats b/exercises/practice/swift-scheduling/swift_scheduling.bats index 6740183c..e98f32a6 100644 --- a/exercises/practice/swift-scheduling/swift_scheduling.bats +++ b/exercises/practice/swift-scheduling/swift_scheduling.bats @@ -1,124 +1,123 @@ #!/usr/bin/env bats load bats-extra -# generated on 2026-08-14T05:27:24+00:00 +# generated on 2026-11-08T06:49:56+00:00 -@test "NOW translates to two hours later" { +test_now_translates_to_two_hours_later() { # @test # [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash swift_scheduling.sh "NOW" "2012-02-13T09:00:00" assert_success assert_output "2012-02-13T11:00:00" } -@test "ASAP before one in the afternoon translates to today at five in the afternoon" { +test_asap_before_one_in_the_afternoon_translates_to_today_at_five_in_the_afternoon() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash swift_scheduling.sh "ASAP" "1999-06-03T09:45:00" assert_success assert_output "1999-06-03T17:00:00" } -@test "ASAP at one in the afternoon translates to tomorrow at one in the afternoon" { +test_asap_at_one_in_the_afternoon_translates_to_tomorrow_at_one_in_the_afternoon() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash swift_scheduling.sh "ASAP" "2008-12-21T13:00:00" assert_success assert_output "2008-12-22T13:00:00" } -@test "ASAP after one in the afternoon translates to tomorrow at one in the afternoon" { +test_asap_after_one_in_the_afternoon_translates_to_tomorrow_at_one_in_the_afternoon() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash swift_scheduling.sh "ASAP" "2008-12-21T14:50:00" assert_success assert_output "2008-12-22T13:00:00" } -@test "EOW on Monday translates to Friday at five in the afternoon" { +test_eow_on_monday_translates_to_friday_at_five_in_the_afternoon() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash swift_scheduling.sh "EOW" "2025-02-03T16:00:00" assert_success assert_output "2025-02-07T17:00:00" } -@test "EOW on Tuesday translates to Friday at five in the afternoon" { +test_eow_on_tuesday_translates_to_friday_at_five_in_the_afternoon() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash swift_scheduling.sh "EOW" "1997-04-29T10:50:00" assert_success assert_output "1997-05-02T17:00:00" } -@test "EOW on Wednesday translates to Friday at five in the afternoon" { +test_eow_on_wednesday_translates_to_friday_at_five_in_the_afternoon() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash swift_scheduling.sh "EOW" "2005-09-14T11:00:00" assert_success assert_output "2005-09-16T17:00:00" } -@test "EOW on Thursday translates to Sunday at eight in the evening" { +test_eow_on_thursday_translates_to_sunday_at_eight_in_the_evening() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash swift_scheduling.sh "EOW" "2011-05-19T08:30:00" assert_success assert_output "2011-05-22T20:00:00" } -@test "EOW on Friday translates to Sunday at eight in the evening" { +test_eow_on_friday_translates_to_sunday_at_eight_in_the_evening() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash swift_scheduling.sh "EOW" "2022-08-05T14:00:00" assert_success assert_output "2022-08-07T20:00:00" } -@test "EOW translates to leap day" { +test_eow_translates_to_leap_day() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash swift_scheduling.sh "EOW" "2008-02-25T10:30:00" assert_success assert_output "2008-02-29T17:00:00" } -@test "2M before the second month of this year translates to the first workday of the second month of this year" { +test_2m_before_the_second_month_of_this_year_translates_to_the_first_workday_of_the_second_month_of_this_year() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash swift_scheduling.sh "2M" "2007-01-02T14:15:00" assert_success assert_output "2007-02-01T08:00:00" } -@test "11M in the eleventh month translates to the first workday of the eleventh month of next year" { +test_11m_in_the_eleventh_month_translates_to_the_first_workday_of_the_eleventh_month_of_next_year() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash swift_scheduling.sh "11M" "2013-11-21T15:30:00" assert_success assert_output "2014-11-03T08:00:00" } -@test "4M in the ninth month translates to the first workday of the fourth month of next year" { +test_4m_in_the_ninth_month_translates_to_the_first_workday_of_the_fourth_month_of_next_year() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash swift_scheduling.sh "4M" "2019-11-18T15:15:00" assert_success assert_output "2020-04-01T08:00:00" } -@test "Q1 in the first quarter translates to the last workday of the first quarter of this year" { +test_q1_in_the_first_quarter_translates_to_the_last_workday_of_the_first_quarter_of_this_year() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash swift_scheduling.sh "Q1" "2003-01-01T10:45:00" assert_success assert_output "2003-03-31T08:00:00" } -@test "Q4 in the second quarter translates to the last workday of the fourth quarter of this year" { +test_q4_in_the_second_quarter_translates_to_the_last_workday_of_the_fourth_quarter_of_this_year() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash swift_scheduling.sh "Q4" "2001-04-09T09:00:00" assert_success assert_output "2001-12-31T08:00:00" } -@test "Q3 in the fourth quarter translates to the last workday of the third quarter of next year" { +test_q3_in_the_fourth_quarter_translates_to_the_last_workday_of_the_third_quarter_of_next_year() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash swift_scheduling.sh "Q3" "2022-10-06T11:00:00" assert_success assert_output "2023-09-29T08:00:00" } -@test "Q2 starting in the last month of the second quarter translates to the last workday of the second quarter of this year" { +test_q2_starting_in_the_last_month_of_the_second_quarter_translates_to_the_last_workday_of_the_second_quarter_of_this_year() { # @test [[ $BATS_RUN_SKIPPED == "true" ]] || skip run bash swift_scheduling.sh "Q2" "2019-06-15T09:50:00" assert_success assert_output "2019-06-28T08:00:00" } -