module Chapter14RecursiveMultiplication where import Test.Hspec recursiveMultiplication :: (Ord a, Eq a, Num a) => a -> a -> a recursiveMultiplication first second = go first second 0 where go x y count | y < 1 = count + (x * y) | otherwise = go x (y - 1) count + x main :: IO () main = hspec $ do describe "recursiveMultiplication" $ do it "9001 * 0 is not over 9000" $ do recursiveMultiplication 9001 0 `shouldBe` (0 :: Int) it "1 * 234 is 234" $ do recursiveMultiplication 1 234 `shouldBe` (234 :: Int) it "22 * 4 is 88" $ do recursiveMultiplication 22 4 `shouldBe` (88 :: Int) it "is zero when the first number is 0" $ do recursiveMultiplication 0 3 `shouldBe` 0 it "is zero when the second number is 0" $ do recursiveMultiplication 9 0 `shouldBe` 0 it "1 is identity when it comes first" $ do recursiveMultiplication 9 1 `shouldBe` 9 it "1 is identity when it comes second" $ do recursiveMultiplication 1 9 `shouldBe` 9 it "multiplies big numbers correctly" $ do recursiveMultiplication 99 98 `shouldBe` 9702 it "multiplies small numbers correctly" $ do recursiveMultiplication 7 3 `shouldBe` 21