summary refs log tree commit diff stats
path: root/raku/anagram/anagram.rakutest
diff options
context:
space:
mode:
Diffstat (limited to 'raku/anagram/anagram.rakutest')
-rw-r--r--raku/anagram/anagram.rakutest223
1 files changed, 223 insertions, 0 deletions
diff --git a/raku/anagram/anagram.rakutest b/raku/anagram/anagram.rakutest
new file mode 100644
index 0000000..6aa62c6
--- /dev/null
+++ b/raku/anagram/anagram.rakutest
@@ -0,0 +1,223 @@
+#!/usr/bin/env raku
+use Test;
+use JSON::Fast;
+use lib $?FILE.IO.dirname;
+use Anagram;
+plan 14;
+
+my @test-cases = from-json($=pod.pop.contents).List;
+for @test-cases -> %case {
+  cmp-ok match-anagrams( |%case<input>:p ),
+    '~~', %case<expected>.Set, %case<description>;
+}
+
+=head2 Test Cases
+=begin code
+[
+  {
+    "description": "no matches",
+    "expected": [
+    ],
+    "input": {
+      "candidates": [
+        "hello",
+        "world",
+        "zombies",
+        "pants"
+      ],
+      "subject": "diaper"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "detects two anagrams",
+    "expected": [
+      "stream",
+      "maters"
+    ],
+    "input": {
+      "candidates": [
+        "stream",
+        "pigeon",
+        "maters"
+      ],
+      "subject": "master"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "does not detect anagram subsets",
+    "expected": [
+    ],
+    "input": {
+      "candidates": [
+        "dog",
+        "goody"
+      ],
+      "subject": "good"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "detects anagram",
+    "expected": [
+      "inlets"
+    ],
+    "input": {
+      "candidates": [
+        "enlists",
+        "google",
+        "inlets",
+        "banana"
+      ],
+      "subject": "listen"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "detects three anagrams",
+    "expected": [
+      "gallery",
+      "regally",
+      "largely"
+    ],
+    "input": {
+      "candidates": [
+        "gallery",
+        "ballerina",
+        "regally",
+        "clergy",
+        "largely",
+        "leading"
+      ],
+      "subject": "allergy"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "detects multiple anagrams with different case",
+    "expected": [
+      "Eons",
+      "ONES"
+    ],
+    "input": {
+      "candidates": [
+        "Eons",
+        "ONES"
+      ],
+      "subject": "nose"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "does not detect non-anagrams with identical checksum",
+    "expected": [
+    ],
+    "input": {
+      "candidates": [
+        "last"
+      ],
+      "subject": "mass"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "detects anagrams case-insensitively",
+    "expected": [
+      "Carthorse"
+    ],
+    "input": {
+      "candidates": [
+        "cashregister",
+        "Carthorse",
+        "radishes"
+      ],
+      "subject": "Orchestra"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "detects anagrams using case-insensitive subject",
+    "expected": [
+      "carthorse"
+    ],
+    "input": {
+      "candidates": [
+        "cashregister",
+        "carthorse",
+        "radishes"
+      ],
+      "subject": "Orchestra"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "detects anagrams using case-insensitive possible matches",
+    "expected": [
+      "Carthorse"
+    ],
+    "input": {
+      "candidates": [
+        "cashregister",
+        "Carthorse",
+        "radishes"
+      ],
+      "subject": "orchestra"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "does not detect an anagram if the original word is repeated",
+    "expected": [
+    ],
+    "input": {
+      "candidates": [
+        "go Go GO"
+      ],
+      "subject": "go"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "anagrams must use all letters exactly once",
+    "expected": [
+    ],
+    "input": {
+      "candidates": [
+        "patter"
+      ],
+      "subject": "tapper"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "words are not anagrams of themselves (case-insensitive)",
+    "expected": [
+    ],
+    "input": {
+      "candidates": [
+        "BANANA",
+        "Banana",
+        "banana"
+      ],
+      "subject": "BANANA"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "words other than themselves can be anagrams",
+    "expected": [
+      "Silent"
+    ],
+    "input": {
+      "candidates": [
+        "Listen",
+        "Silent",
+        "LISTEN"
+      ],
+      "subject": "LISTEN"
+    },
+    "property": "findAnagrams"
+  }
+]
+=end code