From 99a09f09c48d5a85c5696bab05e9b76603754278 Mon Sep 17 00:00:00 2001 From: Jim Infield Date: Fri, 30 Jul 2021 15:28:01 -0500 Subject: [PATCH] initial commit --- .exercism/metadata.json | 1 + README.md | 72 +++++++++++++++++++++++++++++++++++++++++ two_fer.sh | 3 ++ two_fer_test.sh | 56 ++++++++++++++++++++++++++++++++ 4 files changed, 132 insertions(+) create mode 100644 .exercism/metadata.json create mode 100644 README.md create mode 100644 two_fer.sh create mode 100644 two_fer_test.sh diff --git a/.exercism/metadata.json b/.exercism/metadata.json new file mode 100644 index 0000000..a96cd39 --- /dev/null +++ b/.exercism/metadata.json @@ -0,0 +1 @@ +{"track":"bash","exercise":"two-fer","id":"0bea95a330fe4689830308cd0e5b3182","url":"https://exercism.io/my/solutions/0bea95a330fe4689830308cd0e5b3182","handle":"jinfield","is_requester":true,"auto_approve":false} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..6051163 --- /dev/null +++ b/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 name, one for me. +``` + +Where "name" 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/two_fer.sh b/two_fer.sh new file mode 100644 index 0000000..2d6d804 --- /dev/null +++ b/two_fer.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +echo "One for ${1:-you}, one for me." diff --git a/two_fer_test.sh b/two_fer_test.sh new file mode 100644 index 0000000..31ad5a8 --- /dev/null +++ b/two_fer_test.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash + +# local version: 1.2.0.1 + +@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 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 == 0 )) + [[ $output == "One for you, one for me." ]] +} + +@test "a name given" { + [[ $BATS_RUN_SKIPPED == "true" ]] || skip + run bash two_fer.sh Alice + (( status == 0 )) + [[ $output == "One for Alice, one for me." ]] +} + +@test "another name given" { + [[ $BATS_RUN_SKIPPED == "true" ]] || skip + run bash two_fer.sh Bob + (( status == 0 )) + [[ $output == "One for Bob, one for me." ]] +} + +# 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 "handle arg with spaces" { + [[ $BATS_RUN_SKIPPED == "true" ]] || skip + run bash two_fer.sh "John Smith" "Mary Ann" + (( status == 0 )) + [[ $output == "One for John Smith, one for me." ]] +} + +@test "handle arg with glob char" { + [[ $BATS_RUN_SKIPPED == "true" ]] || skip + run bash two_fer.sh "* " + (( status == 0 )) + [[ $output == "One for * , one for me." ]] +}