exercism

Exercism solutions.
Log | Files | Refs

commit c747fb0b7a0eea742d156f54555cd8b0cf0557d1
parent 9495e66bcf4910aec2cc899ad8280e8acf0d5eeb
Author: dwrz <dwrz@dwrz.net>
Date:   Wed, 26 Jun 2019 06:57:27 +0000

Add bash/two-fer

Diffstat:
Abash/two-fer/README.md | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abash/two-fer/two_fer.sh | 9+++++++++
Abash/two-fer/two_fer_test.sh | 40++++++++++++++++++++++++++++++++++++++++
3 files changed, 121 insertions(+), 0 deletions(-)

diff --git a/bash/two-fer/README.md b/bash/two-fer/README.md @@ -0,0 +1,72 @@ +# Two Fer + +`Two-fer` or `2-fer` is short for two for one. One for you and one for me. + +Given a name, return a string with the message: + +```text +One for X, one for me. +``` + +Where X is the given name. + +However, if the name is missing, return the string: + +```text +One for you, one for me. +``` + +Here are some examples: + +|Name |String to return +|:-------|:------------------ +|Alice |One for Alice, one for me. +|Bob |One for Bob, one for me. +| |One for you, one for me. +|Zaphod |One for Zaphod, one for me. + + +Run the tests with: + +```bash +bats two_fer_test.sh +``` + +After the first test(s) pass, continue by commenting out or removing the +`[[ $BATS_RUN_SKIPPED == true ]] || skip` +annotations prepending other tests. + +To run all tests, including the ones with `skip` annotations, run: + +```bash +BATS_RUN_SKIPPED=true bats two_fer_test.sh +``` + +## Source + +[https://github.com/exercism/problem-specifications/issues/757](https://github.com/exercism/problem-specifications/issues/757) + + +## External utilities +`Bash` is a language to write "scripts" -- programs that can call +external tools, such as +[`sed`](https://www.gnu.org/software/sed/), +[`awk`](https://www.gnu.org/software/gawk/), +[`date`](https://www.gnu.org/software/coreutils/manual/html_node/date-invocation.html) +and even programs written in other programming languages, +like [`Python`](https://www.python.org/). +This track does not restrict the usage of these utilities, and as long +as your solution is portable between systems and does not require +installation of third party applications, feel free to use them to solve +the exercise. + +For an extra challenge, if you would like to have a better understanding +of the language, try to re-implement the solution in pure `Bash`, +without using any external tools. Note that there are some types of +problems that bash cannot solve, such as performing floating point +arithmetic and manipulating dates: for those, you must call out to an +external tool. + +## Submitting Incomplete Solutions +It's possible to submit an incomplete solution so you can see how others +have completed the exercise. diff --git a/bash/two-fer/two_fer.sh b/bash/two-fer/two_fer.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +name="you" + +if [ "$#" -ge 1 ]; then + name=$1 +fi + +echo "One for $name, one for me." diff --git a/bash/two-fer/two_fer_test.sh b/bash/two-fer/two_fer_test.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +@test "no name given" { + #[[ $BATS_RUN_SKIPPED == true ]] || skip + + # The above line controls whether to skip the test. + # Normally, we skip every test except for the first one + # (the first one is always commented out). This allows for + # a person to focus on solving a test at a time: you can + # comment out or delete the + # `[[ $BATS_RUN_SKIPPED == true ]] || skip` + # line to run the test when you are ready. + # + # You can also run the all the tests by setting the + # `$BATS_RUN_SKIPPED` environment variable, like this: + # + # $ BATS_RUN_SKIPPED=true bats two_fer_test.sh + + run bash two_fer.sh + [ "$status" -eq 0 ] + [ "$output" == "One for you, one for me." ] +} + +@test "a name given" { + run bash two_fer.sh Alice + [ "$status" -eq 0 ] + [ "$output" == "One for Alice, one for me." ] +} + +@test "another name given" { + run bash two_fer.sh Bob + [ "$status" -eq 0 ] + [ "$output" == "One for Bob, one for me." ] +} + +@test "handle arg1 properly" { + run bash two_fer.sh "John Smith" "Mary Ann" + [ "$status" -eq 0 ] + [ "$output" == "One for John Smith, one for me." ] +}