DojoDeveloppement/Mercredi29Fevrier2012
Tests.hs
module Tests
where
import Test.HUnit
euler17 :: Int -> Int
euler17 n = sum $ map (length . letters) [1..n]
terminals 0 = ""
terminals 1 = "one"
terminals 2 = "two"
terminals 20 = "twenty"
terminals 30 = "thirty"
terminals 100 = "onehundred"
letters n | n > 20 = let units = n `mod` 10 in
concatMap terminals [n - units, units] ++ if n > 100 then "and" else ""
letters n = terminals n
main = runTestTT $ TestList [
"The numeral 'one' is three letters long" ~: length "one" ~?= 3,
"The Euler17 value of 1 is therefore 3" ~: euler17 1 ~?= 3,
"The Euler17 value of 2 is (not so obviously) 6" ~: euler17 2 ~?= 6,
"Some terminal cases" ~: TestList [
terminals 1 ~?= "one",
terminals 2 ~?= "two",
terminals 20 ~?= "twenty"
],
"Decomposing larger numbers" ~: TestList [
letters 21 ~?= "twentyone",
letters 22 ~?= "twentytwo",
letters 31 ~?= "thirtyone",
letters 200 ~?= "twohundred"
],
"Some large numbers are terminals" ~: TestList [
letters 30 ~?= "thirty",
letters 100 ~?= "onehundred"
],
"The British and their andses" ~: TestList [
letters 101 ~?= "onehundredoneand"
]
]