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
16 changes: 8 additions & 8 deletions exercises/practice/acronym/.meta/template.j2
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
{{ header }}
{% for case in cases %}
@test "{{ case["description"] }}" {
{% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash {{ solution }} "{{ case["input"]["phrase"] }}"
assert_success
assert_output "{{ case["expected"] }}"
{% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash {{ solution }} "{{ case["input"]["phrase"] }}"
assert_success
assert_output "{{ case["expected"] }}"
}
{% endfor %}
# bash-specific test: Focus the student's attention on the effects of
# word splitting and filename expansion:
# https://www.gnu.org/software/bash/manual/bash.html#Shell-Expansions

@test "contains shell globbing character" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "Two * Words"
assert_success
assert_output "TW"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "Two * Words"
assert_success
assert_output "TW"
}
82 changes: 41 additions & 41 deletions exercises/practice/acronym/acronym.bats
Original file line number Diff line number Diff line change
@@ -1,78 +1,78 @@
#!/usr/bin/env bats
load bats-extra

# generated on 2026-06-29T16:53:24+00:00
# generated on 2026-08-14T05:27:25+00:00

@test "basic" {
# [[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "Portable Network Graphics"
assert_success
assert_output "PNG"
# [[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "Portable Network Graphics"
assert_success
assert_output "PNG"
}

@test "lowercase words" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "Ruby on Rails"
assert_success
assert_output "ROR"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "Ruby on Rails"
assert_success
assert_output "ROR"
}

@test "punctuation" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "First In, First Out"
assert_success
assert_output "FIFO"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "First In, First Out"
assert_success
assert_output "FIFO"
}

@test "all caps word" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "GNU Image Manipulation Program"
assert_success
assert_output "GIMP"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "GNU Image Manipulation Program"
assert_success
assert_output "GIMP"
}

@test "punctuation without whitespace" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "Complementary metal-oxide semiconductor"
assert_success
assert_output "CMOS"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "Complementary metal-oxide semiconductor"
assert_success
assert_output "CMOS"
}

@test "very long abbreviation" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "Rolling On The Floor Laughing So Hard That My Dogs Came Over And Licked Me"
assert_success
assert_output "ROTFLSHTMDCOALM"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "Rolling On The Floor Laughing So Hard That My Dogs Came Over And Licked Me"
assert_success
assert_output "ROTFLSHTMDCOALM"
}

@test "consecutive delimiters" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "Something - I made up from thin air"
assert_success
assert_output "SIMUFTA"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "Something - I made up from thin air"
assert_success
assert_output "SIMUFTA"
}

@test "apostrophes" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "Halley's Comet"
assert_success
assert_output "HC"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "Halley's Comet"
assert_success
assert_output "HC"
}

@test "underscore emphasis" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "The Road _Not_ Taken"
assert_success
assert_output "TRNT"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "The Road _Not_ Taken"
assert_success
assert_output "TRNT"
}

# bash-specific test: Focus the student's attention on the effects of
# word splitting and filename expansion:
# https://www.gnu.org/software/bash/manual/bash.html#Shell-Expansions

@test "contains shell globbing character" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "Two * Words"
assert_success
assert_output "TW"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash acronym.sh "Two * Words"
assert_success
assert_output "TW"
}
12 changes: 6 additions & 6 deletions exercises/practice/affine-cipher/.meta/template.j2
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
{{ header }}
{% for case in cases %}
@test "{{ case["description"] }}" {
{% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash {{ solution }} {{ case["property"] }} {{ case["input"]["key"]["a"] }} {{ case["input"]["key"]["b"] }} "{{ case["input"]["phrase"] }}"
{% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash {{ solution }} {{ case["property"] }} {{ case["input"]["key"]["a"] }} {{ case["input"]["key"]["b"] }} "{{ case["input"]["phrase"] }}"
{%- if case["expect_error"] %}
assert_failure
assert_output "{{ case["expect_error_msg"] }}"
assert_failure
assert_output "{{ case["expect_error_msg"] }}"
{%- else %}
assert_success
assert_output "{{ case["expected"] }}"
assert_success
assert_output "{{ case["expected"] }}"
{%- endif %}
}
{% endfor %}
131 changes: 66 additions & 65 deletions exercises/practice/affine-cipher/affine_cipher.bats
Original file line number Diff line number Diff line change
@@ -1,116 +1,117 @@
#!/usr/bin/env bats
load bats-extra

# generated on 2026-06-29T16:53:24+00:00
# generated on 2026-08-14T05:27:24+00:00

@test "encode yes" {
# [[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 5 7 "yes"
assert_success
assert_output "xbt"
# [[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 5 7 "yes"
assert_success
assert_output "xbt"
}

@test "encode no" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 15 18 "no"
assert_success
assert_output "fu"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 15 18 "no"
assert_success
assert_output "fu"
}

@test "encode OMG" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 21 3 "OMG"
assert_success
assert_output "lvz"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 21 3 "OMG"
assert_success
assert_output "lvz"
}

@test "encode O M G" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 25 47 "O M G"
assert_success
assert_output "hjp"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 25 47 "O M G"
assert_success
assert_output "hjp"
}

@test "encode mindblowingly" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 11 15 "mindblowingly"
assert_success
assert_output "rzcwa gnxzc dgt"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 11 15 "mindblowingly"
assert_success
assert_output "rzcwa gnxzc dgt"
}

@test "encode numbers" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 3 4 "Testing,1 2 3, testing."
assert_success
assert_output "jqgjc rw123 jqgjc rw"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 3 4 "Testing,1 2 3, testing."
assert_success
assert_output "jqgjc rw123 jqgjc rw"
}

@test "encode deep thought" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 5 17 "Truth is fiction."
assert_success
assert_output "iynia fdqfb ifje"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 5 17 "Truth is fiction."
assert_success
assert_output "iynia fdqfb ifje"
}

@test "encode all the letters" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 17 33 "The quick brown fox jumps over the lazy dog."
assert_success
assert_output "swxtj npvyk lruol iejdc blaxk swxmh qzglf"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 17 33 "The quick brown fox jumps over the lazy dog."
assert_success
assert_output "swxtj npvyk lruol iejdc blaxk swxmh qzglf"
}

@test "encode with a not coprime to m" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 6 17 "This is a test."
assert_failure
assert_output "a and m must be coprime."
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh encode 6 17 "This is a test."
assert_failure
assert_output "a and m must be coprime."
}

@test "decode exercism" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh decode 3 7 "tytgn fjr"
assert_success
assert_output "exercism"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh decode 3 7 "tytgn fjr"
assert_success
assert_output "exercism"
}

@test "decode a sentence" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh decode 19 16 "qdwju nqcro muwhn odqun oppmd aunwd o"
assert_success
assert_output "anobstacleisoftenasteppingstone"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh decode 19 16 "qdwju nqcro muwhn odqun oppmd aunwd o"
assert_success
assert_output "anobstacleisoftenasteppingstone"
}

@test "decode numbers" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh decode 25 7 "odpoz ub123 odpoz ub"
assert_success
assert_output "testing123testing"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh decode 25 7 "odpoz ub123 odpoz ub"
assert_success
assert_output "testing123testing"
}

@test "decode all the letters" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh decode 17 33 "swxtj npvyk lruol iejdc blaxk swxmh qzglf"
assert_success
assert_output "thequickbrownfoxjumpsoverthelazydog"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh decode 17 33 "swxtj npvyk lruol iejdc blaxk swxmh qzglf"
assert_success
assert_output "thequickbrownfoxjumpsoverthelazydog"
}

@test "decode with no spaces in input" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh decode 17 33 "swxtjnpvyklruoliejdcblaxkswxmhqzglf"
assert_success
assert_output "thequickbrownfoxjumpsoverthelazydog"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh decode 17 33 "swxtjnpvyklruoliejdcblaxkswxmhqzglf"
assert_success
assert_output "thequickbrownfoxjumpsoverthelazydog"
}

@test "decode with too many spaces" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh decode 15 16 "vszzm cly yd cg qdp"
assert_success
assert_output "jollygreengiant"
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh decode 15 16 "vszzm cly yd cg qdp"
assert_success
assert_output "jollygreengiant"
}

@test "decode with a not coprime to m" {
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh decode 13 5 "Test"
assert_failure
assert_output "a and m must be coprime."
[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash affine_cipher.sh decode 13 5 "Test"
assert_failure
assert_output "a and m must be coprime."
}

10 changes: 5 additions & 5 deletions exercises/practice/anagram/.meta/template.j2
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
{{ header }}
{% for case in cases %}
@test "{{ case["description"] }}" {
{% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash {{ solution }} "{{ case["input"]["subject"] }}" "{{ case["input"]["candidates"] | join(" ") }}"
assert_success
{% if loop.first %}# {% endif %}[[ $BATS_RUN_SKIPPED == "true" ]] || skip
run bash {{ solution }} "{{ case["input"]["subject"] }}" "{{ case["input"]["candidates"] | join(" ") }}"
assert_success
{%- if case["expected"] | length == 0 %}
refute_output
refute_output
{%- else %}
assert_output "{{ case["expected"] | join(" ") }}"
assert_output "{{ case["expected"] | join(" ") }}"
{%- endif %}
}
{% endfor %}
Loading