Repository: exercism/clojure
Pull request #648 (2024-06-27 19:32:06)

allergies: Sync
For #48in24

https://forum.exercism.org/t/48in24-exercise-03-19-allergies/9928

**Edit:** Example solution was also updated so that it passes the new tests


github-actions[bot]: Hello. Thanks for opening a PR on Exercism 🙂

We ask that all changes to Exercism are discussed on our Community Forum before being opened on GitHub. To enforce this, we automatically close all PRs that are submitted. That doesn't mean your PR is rejected but that we want the initial discussion about it to happen on our forum where a wide range of key contributors across the Exercism ecosystem can weigh in.

You can use [this link](https://forum.exercism.org/new-topic?title=allergies:%20Sync&body=For%20#48in24%0D%0A%0D%0Ahttps://forum.exercism.org/t/48in24-exercise-03-19-allergies/9928%0D%0A&category=clojure ) to copy this into a new topic on the forum. If we decide the PR is appropriate, we'll reopen it and continue with it, so please don't delete your local branch.

If you're interested in learning more about this auto-responder, please read [this blog post](https://exercism.org/blog/contribution-guidelines-nov-2023).

---

_Note: If this PR has been pre-approved, please link back to this PR on the forum thread and a maintainer or staff member will reopen it._
github-actions[bot]: This PR touches files which potentially affect the outcome of the tests of an exercise. This will cause all students' solutions to affected exercises to be re-tested.

If this PR does **not** affect the result of the test (or, for example, adds an edge case that is not worth rerunning all tests for), **please add the following to the merge-commit message** which will stops student's tests from re-running. Please copy-paste to avoid typos.
```
[no important files changed]
```

 For more information, refer to the [documentation](https://exercism.org/docs/building/tracks#h-avoiding-triggering-unnecessary-test-runs). If you are unsure whether to add the message or not, please ping `@exercism/maintainers-admin` in a comment. Thank you!
tasxatzial: Please do not merge immediately after opening. There's one more commit I'd like to push.

Patch:
diff --git a/bin/fetch-configlet b/bin/fetch-configlet
index 4800e15..6bef43a 100755
--- a/bin/fetch-configlet
+++ b/bin/fetch-configlet
@@ -24,10 +24,11 @@ get_download_url() {
   local latest='https://api.github.com/repos/exercism/configlet/releases/latest'
   local arch
   case "$(uname -m)" in
-    x86_64) arch='x86-64' ;;
-    *686*)  arch='i386'   ;;
-    *386*)  arch='i386'   ;;
-    *)      arch='x86-64' ;;
+    aarch64|arm64) arch='arm64'  ;;
+    x86_64)        arch='x86-64' ;;
+    *686*)         arch='i386'   ;;
+    *386*)         arch='i386'   ;;
+    *)             arch='x86-64' ;;
   esac
   local suffix="${os}_${arch}.${ext}"
   curl "${curlopts[@]}" --header 'Accept: application/vnd.github.v3+json' "${latest}" |
@@ -47,7 +48,7 @@ main() {
   fi
 
   local os
-  case "$(uname)" in
+  case "$(uname -s)" in
     Darwin*)   os='macos'   ;;
     Linux*)    os='linux'   ;;
     Windows*)  os='windows' ;;
@@ -58,8 +59,8 @@ main() {
 
   local ext
   case "${os}" in
-    windows*) ext='zip'    ;;
-    *)        ext='tar.gz' ;;
+    windows) ext='zip'    ;;
+    *)       ext='tar.gz' ;;
   esac
 
   echo "Fetching configlet..." >&2
@@ -69,16 +70,16 @@ main() {
   curl "${curlopts[@]}" --output "${output_path}" "${download_url}"
 
   case "${ext}" in
-    *zip) unzip "${output_path}" -d "${output_dir}"   ;;
-    *)    tar xzf "${output_path}" -C "${output_dir}" ;;
+    zip) unzip "${output_path}" -d "${output_dir}"   ;;
+    *)   tar xzf "${output_path}" -C "${output_dir}" ;;
   esac
 
   rm -f "${output_path}"
 
   local executable_ext
   case "${os}" in
-    windows*) executable_ext='.exe' ;;
-    *)        executable_ext=''     ;;
+    windows) executable_ext='.exe' ;;
+    *)       executable_ext=''     ;;
   esac
 
   local configlet_path="${output_dir}/configlet${executable_ext}"
diff --git a/exercises/practice/allergies/.docs/instructions.md b/exercises/practice/allergies/.docs/instructions.md
index b8bbd5a..daf8cfd 100644
--- a/exercises/practice/allergies/.docs/instructions.md
+++ b/exercises/practice/allergies/.docs/instructions.md
@@ -2,20 +2,18 @@
 
 Given a person's allergy score, determine whether or not they're allergic to a given item, and their full list of allergies.
 
-An allergy test produces a single numeric score which contains the
-information about all the allergies the person has (that they were
-tested for).
+An allergy test produces a single numeric score which contains the information about all the allergies the person has (that they were tested for).
 
 The list of items (and their value) that were tested are:
 
-* eggs (1)
-* peanuts (2)
-* shellfish (4)
-* strawberries (8)
-* tomatoes (16)
-* chocolate (32)
-* pollen (64)
-* cats (128)
+- eggs (1)
+- peanuts (2)
+- shellfish (4)
+- strawberries (8)
+- tomatoes (16)
+- chocolate (32)
+- pollen (64)
+- cats (128)
 
 So if Tom is allergic to peanuts and chocolate, he gets a score of 34.
 
@@ -24,7 +22,6 @@ Now, given just that score of 34, your program should be able to say:
 - Whether Tom is allergic to any one of those allergens listed above.
 - All the allergens Tom is allergic to.
 
-Note: a given score may include allergens **not** listed above (i.e.
-allergens that score 256, 512, 1024, etc.).  Your program should
-ignore those components of the score.  For example, if the allergy
-score is 257, your program should only report the eggs (1) allergy.
+Note: a given score may include allergens **not** listed above (i.e. allergens that score 256, 512, 1024, etc.).
+Your program should ignore those components of the score.
+For example, if the allergy score is 257, your program should only report the eggs (1) allergy.
diff --git a/exercises/practice/allergies/.meta/config.json b/exercises/practice/allergies/.meta/config.json
index 8323d0c..a137e05 100644
--- a/exercises/practice/allergies/.meta/config.json
+++ b/exercises/practice/allergies/.meta/config.json
@@ -25,6 +25,6 @@
     ]
   },
   "blurb": "Given a person's allergy score, determine whether or not they're allergic to a given item, and their full list of allergies.",
-  "source": "Jumpstart Lab Warm-up",
-  "source_url": "http://jumpstartlab.com"
+  "source": "Exercise by the JumpstartLab team for students at The Turing School of Software and Design.",
+  "source_url": "https://turing.edu"
 }
diff --git a/exercises/practice/allergies/.meta/src/example.clj b/exercises/practice/allergies/.meta/src/example.clj
index cba06a7..03c7b82 100644
--- a/exercises/practice/allergies/.meta/src/example.clj
+++ b/exercises/practice/allergies/.meta/src/example.clj
@@ -3,22 +3,13 @@
 (def ^:private allergens
   [:eggs :peanuts :shellfish :strawberries :tomatoes :chocolate :pollen :cats])
 
-(defn- flagged?
-  [flags index]
-  (-> (bit-shift-right flags index)
-      (bit-and 1)
-      (pos?)))
-
-(defn allergies
-  "Given an 8-bit bitmap of flags, return the list of matching allergens."
-  [flags]
-  (keep-indexed (fn [index allergen]
-                  (when (flagged? flags index)
-                    allergen))
-                allergens))
+(def ^:private allergen->power
+  (zipmap allergens (range (count allergens))))
 
 (defn allergic-to?
-  "Given an 8-bit bitmap of flags and an allergen, return a boolean
-  indicating whether or not the patient is allergic to the given allergen."
-  [flags allergen]
-  (some #{allergen} (allergies flags)))
+  [score allergen]
+  (bit-test score (allergen->power allergen)))
+
+(defn allergies
+  [score]
+  (keep-indexed #(if (bit-test score %1) %2) allergens))
diff --git a/exercises/practice/protein-translation/.docs/instructions.md b/exercises/practice/protein-translation/.docs/instructions.md
index c211345..7dc34d2 100644
--- a/exercises/practice/protein-translation/.docs/instructions.md
+++ b/exercises/practice/protein-translation/.docs/instructions.md
@@ -11,7 +11,8 @@ Codons: `"AUG", "UUU", "UCU"`
 
 Protein: `"Methionine", "Phenylalanine", "Serine"`
 
-There are 64 codons which in turn correspond to 20 amino acids; however, all of the codon sequences and resulting amino acids are not important in this exercise.  If it works for one codon, the program should work for all of them.
+There are 64 codons which in turn correspond to 20 amino acids; however, all of the codon sequences and resulting amino acids are not important in this exercise.
+If it works for one codon, the program should work for all of them.
 However, feel free to expand the list in the test suite to include them all.
 
 There are also three terminating codons (also known as 'STOP' codons); if any of these codons are encountered (by the ribosome), all translation ends and the protein is terminated.
@@ -28,15 +29,17 @@ Note the stop codon `"UAA"` terminates the translation and the final methionine
 
 Below are the codons and resulting Amino Acids needed for the exercise.
 
-Codon                 | Protein
-:---                  | :---
-AUG                   | Methionine
-UUU, UUC              | Phenylalanine
-UUA, UUG              | Leucine
-UCU, UCC, UCA, UCG    | Serine
-UAU, UAC              | Tyrosine
-UGU, UGC              | Cysteine
-UGG                   | Tryptophan
-UAA, UAG, UGA         | STOP
-
-Learn more about [protein translation on Wikipedia](http://en.wikipedia.org/wiki/Translation_(biology))
+| Codon              | Protein       |
+| :----------------- | :------------ |
+| AUG                | Methionine    |
+| UUU, UUC           | Phenylalanine |
+| UUA, UUG           | Leucine       |
+| UCU, UCC, UCA, UCG | Serine        |
+| UAU, UAC           | Tyrosine      |
+| UGU, UGC           | Cysteine      |
+| UGG                | Tryptophan    |
+| UAA, UAG, UGA      | STOP          |
+
+Learn more about [protein translation on Wikipedia][protein-translation].
+
+[protein-translation]: https://en.wikipedia.org/wiki/Translation_(biology)


Test patch:
diff --git a/exercises/practice/allergies/.meta/tests.toml b/exercises/practice/allergies/.meta/tests.toml
index 8a754c2..799ab85 100644
--- a/exercises/practice/allergies/.meta/tests.toml
+++ b/exercises/practice/allergies/.meta/tests.toml
@@ -1,150 +1,160 @@
-# This is an auto-generated file. Regular comments will be removed when this
-# file is regenerated. Regenerating will not touch any manually added keys,
-# so comments can be added in a "comment" key.
+# This is an auto-generated file.
+#
+# Regenerating this file via `configlet sync` will:
+# - Recreate every `description` key/value pair
+# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
+# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
+# - Preserve any other key/value pair
+#
+# As user-added comments (using the # character) will be removed when this file
+# is regenerated, comments can be added via a `comment` key.
 
 [17fc7296-2440-4ac4-ad7b-d07c321bc5a0]
-description = "not allergic to anything"
+description = "testing for eggs allergy -> not allergic to anything"
 
 [07ced27b-1da5-4c2e-8ae2-cb2791437546]
-description = "allergic only to eggs"
+description = "testing for eggs allergy -> allergic only to eggs"
 
 [5035b954-b6fa-4b9b-a487-dae69d8c5f96]
-description = "allergic to eggs and something else"
+description = "testing for eggs allergy -> allergic to eggs and something else"
 
 [64a6a83a-5723-4b5b-a896-663307403310]
-description = "allergic to something, but not eggs"
+description = "testing for eggs allergy -> allergic to something, but not eggs"
 
 [90c8f484-456b-41c4-82ba-2d08d93231c6]
-description = "allergic to everything"
+description = "testing for eggs allergy -> allergic to everything"
 
 [d266a59a-fccc-413b-ac53-d57cb1f0db9d]
-description = "not allergic to anything"
+description = "testing for peanuts allergy -> not allergic to anything"
 
 [ea210a98-860d-46b2-a5bf-50d8995b3f2a]
-description = "allergic only to peanuts"
+description = "testing for peanuts allergy -> allergic only to peanuts"
 
 [eac69ae9-8d14-4291-ac4b-7fd2c73d3a5b]
-description = "allergic to peanuts and something else"
+description = "testing for peanuts allergy -> allergic to peanuts and something else"
 
 [9152058c-ce39-4b16-9b1d-283ec6d25085]
-description = "allergic to something, but not peanuts"
+description = "testing for peanuts allergy -> allergic to something, but not peanuts"
 
 [d2d71fd8-63d5-40f9-a627-fbdaf88caeab]
-description = "allergic to everything"
+description = "testing for peanuts allergy -> allergic to everything"
 
 [b948b0a1-cbf7-4b28-a244-73ff56687c80]
-description = "not allergic to anything"
+description = "testing for shellfish allergy -> not allergic to anything"
 
 [9ce9a6f3-53e9-4923-85e0-73019047c567]
-description = "allergic only to shellfish"
+description = "testing for shellfish allergy -> allergic only to shellfish"
 
 [b272fca5-57ba-4b00-bd0c-43a737ab2131]
-description = "allergic to shellfish and something else"
+description = "testing for shellfish allergy -> allergic to shellfish and something else"
 
 [21ef8e17-c227-494e-8e78-470a1c59c3d8]
-description = "allergic to something, but not shellfish"
+description = "testing for shellfish allergy -> allergic to something, but not shellfish"
 
 [cc789c19-2b5e-4c67-b146-625dc8cfa34e]
-description = "allergic to everything"
+description = "testing for shellfish allergy -> allergic to everything"
 
 [651bde0a-2a74-46c4-ab55-02a0906ca2f5]
-description = "not allergic to anything"
+description = "testing for strawberries allergy -> not allergic to anything"
 
 [b649a750-9703-4f5f-b7f7-91da2c160ece]
-description = "allergic only to strawberries"
+description = "testing for strawberries allergy -> allergic only to strawberries"
 
 [50f5f8f3-3bac-47e6-8dba-2d94470a4bc6]
-description = "allergic to strawberries and something else"
+description = "testing for strawberries allergy -> allergic to strawberries and something else"
 
 [23dd6952-88c9-48d7-a7d5-5d0343deb18d]
-description = "allergic to something, but not strawberries"
+description = "testing for strawberries allergy -> allergic to something, but not strawberries"
 
 [74afaae2-13b6-43a2-837a-286cd42e7d7e]
-description = "allergic to everything"
+description = "testing for strawberries allergy -> allergic to everything"
 
 [c49a91ef-6252-415e-907e-a9d26ef61723]
-description = "not allergic to anything"
+description = "testing for tomatoes allergy -> not allergic to anything"
 
 [b69c5131-b7d0-41ad-a32c-e1b2cc632df8]
-description = "allergic only to tomatoes"
+description = "testing for tomatoes allergy -> allergic only to tomatoes"
 
 [1ca50eb1-f042-4ccf-9050-341521b929ec]
-description = "allergic to tomatoes and something else"
+description = "testing for tomatoes allergy -> allergic to tomatoes and something else"
 
 [e9846baa-456b-4eff-8025-034b9f77bd8e]
-description = "allergic to something, but not tomatoes"
+description = "testing for tomatoes allergy -> allergic to something, but not tomatoes"
 
 [b2414f01-f3ad-4965-8391-e65f54dad35f]
-description = "allergic to everything"
+description = "testing for tomatoes allergy -> allergic to everything"
 
 [978467ab-bda4-49f7-b004-1d011ead947c]
-description = "not allergic to anything"
+description = "testing for chocolate allergy -> not allergic to anything"
 
 [59cf4e49-06ea-4139-a2c1-d7aad28f8cbc]
-description = "allergic only to chocolate"
+description = "testing for chocolate allergy -> allergic only to chocolate"
 
 [b0a7c07b-2db7-4f73-a180-565e07040ef1]
-description = "allergic to chocolate and something else"
+description = "testing for chocolate allergy -> allergic to chocolate and something else"
 
 [f5506893-f1ae-482a-b516-7532ba5ca9d2]
-description = "allergic to something, but not chocolate"
+description = "testing for chocolate allergy -> allergic to something, but not chocolate"
 
 [02debb3d-d7e2-4376-a26b-3c974b6595c6]
-description = "allergic to everything"
+description = "testing for chocolate allergy -> allergic to everything"
 
 [17f4a42b-c91e-41b8-8a76-4797886c2d96]
-description = "not allergic to anything"
+description = "testing for pollen allergy -> not allergic to anything"
 
 [7696eba7-1837-4488-882a-14b7b4e3e399]
-description = "allergic only to pollen"
+description = "testing for pollen allergy -> allergic only to pollen"
 
 [9a49aec5-fa1f-405d-889e-4dfc420db2b6]
-description = "allergic to pollen and something else"
+description = "testing for pollen allergy -> allergic to pollen and something else"
 
 [3cb8e79f-d108-4712-b620-aa146b1954a9]
-description = "allergic to something, but not pollen"
+description = "testing for pollen allergy -> allergic to something, but not pollen"
 
 [1dc3fe57-7c68-4043-9d51-5457128744b2]
-description = "allergic to everything"
+description = "testing for pollen allergy -> allergic to everything"
 
 [d3f523d6-3d50-419b-a222-d4dfd62ce314]
-description = "not allergic to anything"
+description = "testing for cats allergy -> not allergic to anything"
 
 [eba541c3-c886-42d3-baef-c048cb7fcd8f]
-description = "allergic only to cats"
+description = "testing for cats allergy -> allergic only to cats"
 
 [ba718376-26e0-40b7-bbbe-060287637ea5]
-description = "allergic to cats and something else"
+description = "testing for cats allergy -> allergic to cats and something else"
 
 [3c6dbf4a-5277-436f-8b88-15a206f2d6c4]
-description = "allergic to something, but not cats"
+description = "testing for cats allergy -> allergic to something, but not cats"
 
 [1faabb05-2b98-4995-9046-d83e4a48a7c1]
-description = "allergic to everything"
+description = "testing for cats allergy -> allergic to everything"
 
 [f9c1b8e7-7dc5-4887-aa93-cebdcc29dd8f]
-description = "no allergies"
+description = "list when: -> no allergies"
 
 [9e1a4364-09a6-4d94-990f-541a94a4c1e8]
-description = "just eggs"
+description = "list when: -> just eggs"
 
 [8851c973-805e-4283-9e01-d0c0da0e4695]
-description = "just peanuts"
+description = "list when: -> just peanuts"
 
 [2c8943cb-005e-435f-ae11-3e8fb558ea98]
-description = "just strawberries"
+description = "list when: -> just strawberries"
 
 [6fa95d26-044c-48a9-8a7b-9ee46ec32c5c]
-description = "eggs and peanuts"
+description = "list when: -> eggs and peanuts"
 
 [19890e22-f63f-4c5c-a9fb-fb6eacddfe8e]
-description = "more than eggs but not peanuts"
+description = "list when: -> more than eggs but not peanuts"
 
 [4b68f470-067c-44e4-889f-c9fe28917d2f]
-description = "lots of stuff"
+description = "list when: -> lots of stuff"
 
 [0881b7c5-9efa-4530-91bd-68370d054bc7]
-description = "everything"
+description = "list when: -> everything"
 
 [12ce86de-b347-42a0-ab7c-2e0570f0c65b]
-description = "no allergen score parts"
+description = "list when: -> no allergen score parts"
+
+[93c2df3e-4f55-4fed-8116-7513092819cd]
+description = "list when: -> no allergen score parts without highest valid score"
diff --git a/exercises/practice/allergies/test/allergies_test.clj b/exercises/practice/allergies/test/allergies_test.clj
index cda4aae..7d1acd8 100644
--- a/exercises/practice/allergies/test/allergies_test.clj
+++ b/exercises/practice/allergies/test/allergies_test.clj
@@ -1,49 +1,124 @@
 (ns allergies-test
-  (:require [clojure.test :refer [deftest is]]
+  (:require [clojure.test :refer [deftest testing is]]
             allergies))
 
-(deftest no-allergies-at-all
-  (is (= [] (allergies/allergies 0))))
+(deftest testing-for-eggs-allergy
+  (testing "Testing for eggs allergy -> not allergic to anything"
+    (is (false? (allergies/allergic-to? 0 :eggs))))
+  (testing "Testing for eggs allergy -> allergic only to eggs"
+    (is (true? (allergies/allergic-to? 1 :eggs))))
+  (testing "Testing for eggs allergy -> allergic to eggs and something else"
+    (is (true? (allergies/allergic-to? 3 :eggs))))
+  (testing "Testing for eggs allergy -> allergic to something, but not eggs"
+    (is (false? (allergies/allergic-to? 2 :eggs))))
+  (testing "Testing for eggs allergy -> allergic to everything"
+    (is (true? (allergies/allergic-to? 255 :eggs)))))
 
-(deftest allergic-to-just-eggs
-  (is (= [:eggs] (allergies/allergies 1))))
+(deftest testing-for-peanuts-allergy
+  (testing "Testing for peanuts allergy -> not allergic to anything"
+    (is (false? (allergies/allergic-to? 0 :peanuts))))
+  (testing "Testing for peanuts allergy -> allergic only to peanuts"
+    (is (true? (allergies/allergic-to? 2 :peanuts))))
+  (testing "Testing for peanuts allergy -> allergic to peanuts and something else"
+    (is (true? (allergies/allergic-to? 7 :peanuts))))
+  (testing "Testing for peanuts allergy -> allergic to something, but not peanuts"
+    (is (false? (allergies/allergic-to? 5 :peanuts))))
+  (testing "Testing for peanuts allergy -> allergic to everything"
+    (is (true? (allergies/allergic-to? 255 :peanuts)))))
 
-(deftest allergic-to-just-peanuts
-  (is (= [:peanuts] (allergies/allergies 2))))
+(deftest testing-for-shellfish-allergy
+  (testing "Testing for shellfish allergy -> not allergic to anything"
+    (is (false? (allergies/allergic-to? 0 :shellfish))))
+  (testing "Testing for shellfish allergy -> allergic only to shellfish"
+    (is (true? (allergies/allergic-to? 4 :shellfish))))
+  (testing "Testing for shellfish allergy -> allergic to shellfish and something else"
+    (is (true? (allergies/allergic-to? 14 :shellfish))))
+  (testing "Testing for shellfish allergy -> allergic to something, but not shellfish"
+    (is (false? (allergies/allergic-to? 10 :shellfish))))
+  (testing "Testing for shellfish allergy -> allergic to everything"
+    (is (true? (allergies/allergic-to? 255 :shellfish)))))
 
-(deftest allergic-to-just-strawberries
-  (is (= [:strawberries] (allergies/allergies 8))))
+(deftest testing-for-strawberries-allergy
+  (testing "Testing for strawberries allergy -> not allergic to anything"
+    (is (false? (allergies/allergic-to? 0 :strawberries))))
+  (testing "Testing for strawberries allergy -> allergic only to strawberries"
+    (is (true? (allergies/allergic-to? 8 :strawberries))))
+  (testing "Testing for strawberries allergy -> allergic to strawberries and something else"
+    (is (true? (allergies/allergic-to? 28 :strawberries))))
+  (testing "Testing for strawberries allergy -> allergic to something, but not strawberries"
+    (is (false? (allergies/allergic-to? 20 :strawberries))))
+  (testing "Testing for strawberries allergy -> allergic to everything"
+    (is (true? (allergies/allergic-to? 255 :strawberries)))))
 
-(deftest allergic-to-eggs-and-peanuts
-  (is (= [:eggs :peanuts] (allergies/allergies 3))))
+(deftest testing-for-tomatoes-allergy
+  (testing "Testing for tomatoes allergy -> not allergic to anything"
+    (is (false? (allergies/allergic-to? 0 :tomatoes))))
+  (testing "Testing for tomatoes allergy -> allergic only to tomatoes"
+    (is (true? (allergies/allergic-to? 16 :tomatoes))))
+  (testing "Testing for tomatoes allergy -> allergic to tomatoes and something else"
+    (is (true? (allergies/allergic-to? 56 :tomatoes))))
+  (testing "Testing for tomatoes allergy -> allergic to something, but not tomatoes"
+    (is (false? (allergies/allergic-to? 40 :tomatoes))))
+  (testing "Testing for tomatoes allergy -> allergic to everything"
+    (is (true? (allergies/allergic-to? 255 :tomatoes)))))
 
-(deftest allergic-to-more-than-eggs-but-not-peanuts
-  (is (= [:eggs :shellfish] (allergies/allergies 5))))
+(deftest testing-for-chocolate-allergy
+  (testing "Testing for chocolate allergy -> not allergic to anything"
+    (is (false? (allergies/allergic-to? 0 :chocolate))))
+  (testing "Testing for chocolate allergy -> allergic only to chocolate"
+    (is (true? (allergies/allergic-to? 32 :chocolate))))
+  (testing "Testing for chocolate allergy -> allergic to chocolate and something else"
+    (is (true? (allergies/allergic-to? 112 :chocolate))))
+  (testing "Testing for chocolate allergy -> allergic to something, but not chocolate"
+    (is (false? (allergies/allergic-to? 80 :chocolate))))
+  (testing "Testing for chocolate allergy -> allergic to everything"
+    (is (true? (allergies/allergic-to? 255 :chocolate)))))
 
-(deftest allergic-to-lots-of-stuff
-  (is (= [:strawberries :tomatoes :chocolate :pollen :cats]
-         (allergies/allergies 248))))
+(deftest testing-for-pollen-allergy
+  (testing "Testing for pollen allergy -> not allergic to anything"
+    (is (false? (allergies/allergic-to? 0 :pollen))))
+  (testing "Testing for pollen allergy -> allergic only to pollen"
+    (is (true? (allergies/allergic-to? 64 :pollen))))
+  (testing "Testing for pollen allergy -> allergic to pollen and something else"
+    (is (true? (allergies/allergic-to? 224 :pollen))))
+  (testing "Testing for pollen allergy -> allergic to something, but not pollen"
+    (is (false? (allergies/allergic-to? 160 :pollen))))
+  (testing "Testing for pollen allergy -> allergic to everything"
+    (is (true? (allergies/allergic-to? 255 :pollen)))))
 
-(deftest allergic-to-everything
-  (is (= [:eggs :peanuts :shellfish :strawberries
-          :tomatoes :chocolate :pollen :cats]
-         (allergies/allergies 255))))
+(deftest testing-for-cats-allergy
+  (testing "Testing for cats allergy -> not allergic to anything"
+    (is (false? (allergies/allergic-to? 0 :cats))))
+  (testing "Testing for cats allergy -> allergic only to cats"
+    (is (true? (allergies/allergic-to? 128 :cats))))
+  (testing "Testing for cats allergy -> allergic to cats and something else"
+    (is (true? (allergies/allergic-to? 192 :cats))))
+  (testing "Testing for cats allergy -> allergic to something, but not cats"
+    (is (false? (allergies/allergic-to? 64 :cats))))
+  (testing "Testing for cats allergy -> allergic to everything"
+    (is (true? (allergies/allergic-to? 255 :cats)))))
 
-(deftest no-allergies-means-not-allergic-peanuts
-  (is (not (allergies/allergic-to? 0 :peanuts))))
-
-(deftest no-allergies-means-not-allergic-cats
-  (is (not (allergies/allergic-to? 0 :cats))))
-
-(deftest no-allergies-means-not-allergic-strawberries
-  (is (not (allergies/allergic-to? 0 :strawberries))))
-
-(deftest is-allergic-to-eggs
-  (is (allergies/allergic-to? 1 :eggs)))
-
-(deftest allergic-to-eggs-in-addition-to-other-stuff
-  (is (allergies/allergic-to? 5 :eggs)))
-
-(deftest ignore-non-allergen-score-parts
-  (is (= [:eggs :shellfish :strawberries :tomatoes :chocolate :pollen :cats]
-         (allergies/allergies 509))))
+(deftest list-when
+  (testing "List when: no allergies"
+    (is (= [] (allergies/allergies 0))))
+  (testing "List when: allergic to just eggs"
+    (is (= [:eggs] (allergies/allergies 1))))
+  (testing "List when: allergic to just peanuts"
+    (is (= [:peanuts] (allergies/allergies 2))))
+  (testing "List when: allergic to just strawberries"
+    (is (= [:strawberries] (allergies/allergies 8))))
+  (testing "List when: allergic to eggs and peanuts"
+    (is (= [:eggs :peanuts] (allergies/allergies 3))))
+  (testing "List when: allergic to more than eggs but not peanuts"
+    (is (= [:eggs :shellfish] (allergies/allergies 5))))
+  (testing "List when: allergic to lots of stuff"
+    (is (= [:strawberries :tomatoes :chocolate :pollen :cats]
+           (allergies/allergies 248))))
+  (testing "List when: allergic to everything"
+    (is (= [:eggs :peanuts :shellfish :strawberries :tomatoes :chocolate :pollen :cats]
+           (allergies/allergies 255))))
+  (testing "List when: no allergen score parts"
+    (is (= [:eggs :shellfish :strawberries :tomatoes :chocolate :pollen :cats]
+           (allergies/allergies 509))))
+  (testing "List when: no allergen score parts without highest valid score"
+    (is (= [:eggs] (allergies/allergies 257)))))
diff --git a/exercises/practice/protein-translation/.meta/tests.toml b/exercises/practice/protein-translation/.meta/tests.toml
index 02a54c3..10ee1ee 100644
--- a/exercises/practice/protein-translation/.meta/tests.toml
+++ b/exercises/practice/protein-translation/.meta/tests.toml
@@ -1,6 +1,16 @@
-# This is an auto-generated file. Regular comments will be removed when this
-# file is regenerated. Regenerating will not touch any manually added keys,
-# so comments can be added in a "comment" key.
+# This is an auto-generated file.
+#
+# Regenerating this file via `configlet sync` will:
+# - Recreate every `description` key/value pair
+# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
+# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
+# - Preserve any other key/value pair
+#
+# As user-added comments (using the # character) will be removed when this file
+# is regenerated, comments can be added via a `comment` key.
+
+[2c44f7bf-ba20-43f7-a3bf-f2219c0c3f98]
+description = "Empty RNA sequence results in no proteins"
 
 [96d3d44f-34a2-4db4-84cd-fff523e069be]
 description = "Methionine RNA sequence"
@@ -53,6 +63,12 @@ description = "STOP codon RNA sequence 2"
 [9c2ad527-ebc9-4ace-808b-2b6447cb54cb]
 description = "STOP codon RNA sequence 3"
 
+[f4d9d8ee-00a8-47bf-a1e3-1641d4428e54]
+description = "Sequence of two protein codons translates into proteins"
+
+[dd22eef3-b4f1-4ad6-bb0b-27093c090a9d]
+description = "Sequence of two different protein codons translates into proteins"
+
 [d0f295df-fb70-425c-946c-ec2ec185388e]
 description = "Translate RNA strand into correct protein list"
 
@@ -70,3 +86,22 @@ description = "Translation stops if STOP codon in middle of three-codon sequence
 
 [2c2a2a60-401f-4a80-b977-e0715b23b93d]
 description = "Translation stops if STOP codon in middle of six-codon sequence"
+
+[f6f92714-769f-4187-9524-e353e8a41a80]
+description = "Sequence of two non-STOP codons does not translate to a STOP codon"
+
+[1e75ea2a-f907-4994-ae5c-118632a1cb0f]
+description = "Non-existing codon can't translate"
+include = false
+
+[9eac93f3-627a-4c90-8653-6d0a0595bc6f]
+description = "Unknown amino acids, not part of a codon, can't translate"
+reimplements = "1e75ea2a-f907-4994-ae5c-118632a1cb0f"
+include = false
+
+[9d73899f-e68e-4291-b1e2-7bf87c00f024]
+description = "Incomplete RNA sequence can't translate"
+include = false
+
+[43945cf7-9968-402d-ab9f-b8a28750b050]
+description = "Incomplete RNA sequence can translate if valid until a STOP codon"
diff --git a/exercises/practice/protein-translation/test/protein_translation_test.clj b/exercises/practice/protein-translation/test/protein_translation_test.clj
index 05981ed..2b25c7b 100644
--- a/exercises/practice/protein-translation/test/protein_translation_test.clj
+++ b/exercises/practice/protein-translation/test/protein_translation_test.clj
@@ -1,36 +1,138 @@
 (ns protein-translation-test
-  (:require [clojure.test :refer [deftest is are]]
+  (:require [clojure.test :refer [deftest testing is]]
             protein-translation))
 
-(deftest AUG-translates-to-Methionine
-  (is (= "Methionine" (protein-translation/translate-codon "AUG"))))
+(deftest empty-rna-sequence-results-in-no-protein
+  (testing "Empty RNA sequence results in no protein"
+    (is (= [] (protein-translation/translate-rna "")))))
 
-(deftest UGG-translates-to-Tryptophan
-  (is (= "Tryptophan" (protein-translation/translate-codon "UGG"))))
+(deftest methionine-RNA-sequence
+  (testing "Methionine RNA sequence"
+    (is (= ["Methionine"]
+           (protein-translation/translate-rna "AUG")))))
 
-(deftest identifies-Phenylalanine-codons
-  (are [codon] (= "Phenylalanine" (protein-translation/translate-codon codon)) "UUU" "UUC"))
+(deftest phenylalanine-RNA-sequence-1
+  (testing "Phenylalanine RNA sequence 1"
+    (is (= ["Phenylalanine"]
+           (protein-translation/translate-rna "UUU")))))
 
-(deftest identifies-Leucine-codons
-  (are [codon] (= "Leucine" (protein-translation/translate-codon codon)) "UUA" "UUG"))
+(deftest phenylalanine-RNA-sequence-2
+  (testing "Phenylalanine RNA sequence 2"
+    (is (= ["Phenylalanine"]
+           (protein-translation/translate-rna "UUC")))))
 
-(deftest identiefies-Serine-codons
-  (are [codon] (= "Serine" (protein-translation/translate-codon codon)) "UCU" "UCC" "UCA" "UCG"))
+(deftest leucine-RNA-sequence-1
+  (testing "Leucine RNA sequence 1"
+    (is (= ["Leucine"]
+           (protein-translation/translate-rna "UUA")))))
 
-(deftest identiefies-Tyrosine-codons
-  (are [codon] (= "Tyrosine" (protein-translation/translate-codon codon)) "UAU" "UAC"))
+(deftest leucine-RNA-sequence-2
+  (testing "Leucine RNA sequence 2"
+    (is (= ["Leucine"]
+           (protein-translation/translate-rna "UUG")))))
 
-(deftest identifies-Cysteine-codons
-  (are [codon] (= "Cysteine" (protein-translation/translate-codon codon)) "UGU" "UGC"))
+(deftest serine-RNA-sequence-1
+  (testing "Serine RNA sequence 1"
+    (is (= ["Serine"]
+           (protein-translation/translate-rna "UCU")))))
 
-(deftest identifies-stop-codons
-  (are [codon] (= "STOP" (protein-translation/translate-codon codon)) "UAA" "UAG" "UGA"))
+(deftest serine-RNA-sequence-2
+  (testing "Serine RNA sequence 2"
+    (is (= ["Serine"]
+           (protein-translation/translate-rna "UCC")))))
 
-(deftest translates-rna-strand-into-correct-protein
-  (is (= ["Methionine" "Phenylalanine" "Tryptophan"] (protein-translation/translate-rna "AUGUUUUGG"))))
+(deftest serine-RNA-sequence-3
+  (testing "Serine RNA sequence 3"
+    (is (= ["Serine"]
+           (protein-translation/translate-rna "UCA")))))
 
-(deftest stops-translation-if-stop-codon-present
-  (is (= ["Methionine" "Phenylalanine"] (protein-translation/translate-rna "AUGUUUUAA"))))
+(deftest serine-RNA-sequence-4
+  (testing "Serine RNA sequence 4"
+    (is (= ["Serine"]
+           (protein-translation/translate-rna "UCG")))))
 
-(deftest stops-translation-of-longer-strand
-  (is (= ["Tryptophan" "Cysteine" "Tyrosine"] (protein-translation/translate-rna "UGGUGUUAUUAAUGGUUU"))))
+(deftest tyrosine-RNA-sequence-1
+  (testing "Tyrosine RNA sequence 1"
+    (is (= ["Tyrosine"]
+           (protein-translation/translate-rna "UAU")))))
+
+(deftest tyrosine-RNA-sequence-2
+  (testing "Tyrosine RNA sequence 2"
+    (is (= ["Tyrosine"]
+           (protein-translation/translate-rna "UAC")))))
+
+(deftest cysteine-RNA-sequence-1
+  (testing "Cysteine RNA sequence 1"
+    (is (= ["Cysteine"]
+           (protein-translation/translate-rna "UGU")))))
+
+(deftest cysteine-RNA-sequence-2
+  (testing "Cysteine RNA sequence 2"
+    (is (= ["Cysteine"]
+           (protein-translation/translate-rna "UGC")))))
+
+(deftest tryptophan-RNA-sequence
+  (testing "Tryptophan RNA sequence"
+    (is (= ["Tryptophan"]
+           (protein-translation/translate-rna "UGG")))))
+
+(deftest STOP-codon-RNA-sequence-1
+  (testing "STOP codon RNA sequence 1"
+    (is (= [] (protein-translation/translate-rna "UAA")))))
+
+(deftest STOP-codon-RNA-sequence-2
+  (testing "STOP codon RNA sequence 2"
+    (is (= [] (protein-translation/translate-rna "UAG")))))
+
+(deftest STOP-codon-RNA-sequence-3
+  (testing "STOP codon RNA sequence 3"
+    (is (= [] (protein-translation/translate-rna "UGA")))))
+
+(deftest sequence-of-two-protein-codons-translates-into-proteins
+  (testing "Sequence of two protein codons translates into proteins"
+    (is (= ["Phenylalanine", "Phenylalanine"]
+           (protein-translation/translate-rna "UUUUUU")))))
+
+(deftest sequence-of-two-different-protein-codons-translates-into-proteins
+  (testing "Sequence of two different protein codons translates into proteins"
+    (is (= ["Leucine", "Leucine"]
+           (protein-translation/translate-rna "UUAUUG")))))
+
+(deftest translate-RNA-strand-into-correct-protein-list
+  (testing "Translate RNA strand into correct protein list"
+    (is (= ["Methionine", "Phenylalanine", "Tryptophan"]
+           (protein-translation/translate-rna "AUGUUUUGG")))))
+
+(deftest translation-stops-if-STOP-codon-at-beginning-of-sequence
+  (testing "Translation stops if STOP codon at beginning of sequence"
+    (is (= [] (protein-translation/translate-rna "UAGUGG")))))
+
+(deftest translation-stops-if-STOP-codon-at-end-of-two-codon-sequence
+  (testing "Translation stops if STOP codon at end of two-codon sequence"
+    (is (= ["Tryptophan"]
+           (protein-translation/translate-rna "UGGUAG")))))
+
+(deftest translation-stops-if-STOP-codon-at-end-of-three-codon-sequence
+  (testing "Translation stops if STOP codon at end of three-codon sequence"
+    (is (= ["Methionine", "Phenylalanine"]
+           (protein-translation/translate-rna "AUGUUUUAA")))))
+
+(deftest translation-stops-if-STOP-codon-in-middle-of-three-codon-sequence
+  (testing "Translation stops if STOP codon in middle of three-codon sequence"
+    (is (= ["Tryptophan"]
+           (protein-translation/translate-rna "UGGUAGUGG")))))
+
+(deftest translation-stops-if-STOP-codon-in-middle-of-six-codon-sequence
+  (testing "Translation stops if STOP codon in middle of six-codon sequence"
+    (is (= ["Tryptophan", "Cysteine", "Tyrosine"]
+           (protein-translation/translate-rna "UGGUGUUAUUAAUGGUUU")))))
+
+(deftest sequence-of-two-non-STOP-codons-does-not-translate-to-a-STOP-codon
+  (testing "Sequence of two non-STOP codons does not translate to a STOP codon"
+    (is (= ["Methionine", "Methionine"]
+           (protein-translation/translate-rna "AUGAUG")))))
+
+(deftest incomplete-RNA-sequence-can-translate-if-valid-until-a-STOP-codon
+  (testing "Incomplete RNA sequence can translate if valid until a STOP codon"
+    (is (= ["Phenylalanine", "Phenylalanine"]
+           (protein-translation/translate-rna "UUCUUCUAAUGGU")))))