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
110 changes: 92 additions & 18 deletions exercises/practice/anagram/AnagramTest.lean
Original file line number Diff line number Diff line change
Expand Up @@ -6,37 +6,111 @@ open LeanTest
def anagramTests : TestSuite :=
(TestSuite.empty "Anagram")
|>.addTest "no matches" (do
return assertEqual [] (Anagram.findAnagrams "diaper" ["hello", "world", "zombies", "pants"]))
return assertEqual [] (Anagram.findAnagrams "diaper" [
"hello",
"world",
"zombies",
"pants"
]))
|>.addTest "detects two anagrams" (do
return assertEqual ["lemons", "melons"] (Anagram.findAnagrams "solemn" ["lemons", "cherry", "melons"]))
return assertEqual [
"lemons",
"melons"
] (Anagram.findAnagrams "solemn" [
"lemons",
"cherry",
"melons"
]))
|>.addTest "does not detect anagram subsets" (do
return assertEqual [] (Anagram.findAnagrams "good" ["dog", "goody"]))
return assertEqual [] (Anagram.findAnagrams "good" [
"dog",
"goody"
]))
|>.addTest "detects anagram" (do
return assertEqual ["inlets"] (Anagram.findAnagrams "listen" ["enlists", "google", "inlets", "banana"]))
return assertEqual [
"inlets"
] (Anagram.findAnagrams "listen" [
"enlists",
"google",
"inlets",
"banana"
]))
|>.addTest "detects three anagrams" (do
return assertEqual ["gallery", "regally", "largely"] (Anagram.findAnagrams "allergy" ["gallery", "ballerina", "regally", "clergy", "largely", "leading"]))
return assertEqual [
"gallery",
"regally",
"largely"
] (Anagram.findAnagrams "allergy" [
"gallery",
"ballerina",
"regally",
"clergy",
"largely",
"leading"
]))
|>.addTest "detects multiple anagrams with different case" (do
return assertEqual ["Eons", "ONES"] (Anagram.findAnagrams "nose" ["Eons", "ONES"]))
return assertEqual [
"Eons",
"ONES"
] (Anagram.findAnagrams "nose" [
"Eons",
"ONES"
]))
|>.addTest "does not detect non-anagrams with identical checksum" (do
return assertEqual [] (Anagram.findAnagrams "mass" ["last"]))
return assertEqual [] (Anagram.findAnagrams "mass" [
"last"
]))
|>.addTest "detects anagrams case-insensitively" (do
return assertEqual ["Carthorse"] (Anagram.findAnagrams "Orchestra" ["cashregister", "Carthorse", "radishes"]))
return assertEqual [
"Carthorse"
] (Anagram.findAnagrams "Orchestra" [
"cashregister",
"Carthorse",
"radishes"
]))
|>.addTest "detects anagrams using case-insensitive subject" (do
return assertEqual ["carthorse"] (Anagram.findAnagrams "Orchestra" ["cashregister", "carthorse", "radishes"]))
return assertEqual [
"carthorse"
] (Anagram.findAnagrams "Orchestra" [
"cashregister",
"carthorse",
"radishes"
]))
|>.addTest "detects anagrams using case-insensitive possible matches" (do
return assertEqual ["Carthorse"] (Anagram.findAnagrams "orchestra" ["cashregister", "Carthorse", "radishes"]))
return assertEqual [
"Carthorse"
] (Anagram.findAnagrams "orchestra" [
"cashregister",
"Carthorse",
"radishes"
]))
|>.addTest "does not detect an anagram if the original word is repeated" (do
return assertEqual [] (Anagram.findAnagrams "go" ["goGoGO"]))
return assertEqual [] (Anagram.findAnagrams "go" [
"goGoGO"
]))
|>.addTest "anagrams must use all letters exactly once" (do
return assertEqual [] (Anagram.findAnagrams "tapper" ["patter"]))
return assertEqual [] (Anagram.findAnagrams "tapper" [
"patter"
]))
|>.addTest "words are not anagrams of themselves" (do
return assertEqual [] (Anagram.findAnagrams "BANANA" ["BANANA"]))
return assertEqual [] (Anagram.findAnagrams "BANANA" [
"BANANA"
]))
|>.addTest "words are not anagrams of themselves even if letter case is partially different" (do
return assertEqual [] (Anagram.findAnagrams "BANANA" ["Banana"]))
return assertEqual [] (Anagram.findAnagrams "BANANA" [
"Banana"
]))
|>.addTest "words are not anagrams of themselves even if letter case is completely different" (do
return assertEqual [] (Anagram.findAnagrams "BANANA" ["banana"]))
return assertEqual [] (Anagram.findAnagrams "BANANA" [
"banana"
]))
|>.addTest "words other than themselves can be anagrams" (do
return assertEqual ["Silent"] (Anagram.findAnagrams "LISTEN" ["LISTEN", "Silent"]))
return assertEqual [
"Silent"
] (Anagram.findAnagrams "LISTEN" [
"LISTEN",
"Silent"
]))

def main : IO UInt32 := do
runTestSuitesWithExitCode [anagramTests]
def main : IO UInt32 := do
runTestSuitesWithExitCode [anagramTests]
17 changes: 8 additions & 9 deletions generators/Generator/Generator/AnagramGenerator.lean
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import Lean.Data.Json
import Std
import Helper

open Lean
open Std
open Helper

namespace AnagramGenerator

Expand All @@ -21,20 +23,17 @@ def genTestCase (exercise : String) (case : TreeMap.Raw String Json) : String :=
let expected := case.get! "expected"
let description := case.get! "description"
|> (·.compress)
let funName := case.get! "property"
|> (·.compress)
|> String.toList
|> (·.filter (·!='"'))
|> List.asString
let funName := getFunName (case.get! "property")
let call := s!"({exercise}.{funName} {subject} {serializeList candidates})"
s!"
|>.addTest {description} (do
return assertEqual {expected} ({exercise}.{funName} {subject} {candidates}))"
return assertEqual {serializeList expected} {call})"

def genEnd (exercise : String) : String :=
s!"

def main : IO UInt32 := do
runTestSuitesWithExitCode [{exercise.decapitalize}Tests]
"
def main : IO UInt32 := do
runTestSuitesWithExitCode [{exercise.decapitalize}Tests]
"

end AnagramGenerator
Loading