module StringCalculator where import Test.Hspec import Test.QuickCheck import Control.Exception (evaluate) import Data.List.Split (splitOn) calculator' :: String -> Char -> Integer calculator' x c = sum $ coerceString x c calculator :: String -> Integer calculator x = sum $ coerceString x ',' coerceString :: String -> Char -> [Integer] coerceString x c = map (coerce) (splitOn [c] x) where coerce "" = 0 coerce a = read a :: Integer main :: IO () main = hspec $ do describe "String Calculator" $ do it "returns 0 for empty string" $ do calculator "" `shouldBe` 0 it "returns 1 for '1'" $ do calculator "1" `shouldBe` 1 it "returns 2 for '2'" $ do calculator "2" `shouldBe` 2 it "returns 3 for '1,2'" $ do calculator "1,2" `shouldBe` 3 it "returns 6 for '1,2,3'" $ do calculator "1,2,3" `shouldBe` 6 it "can accept a separator" $ do calculator' "1;2;3" ';' `shouldBe` 6 it "can accept a separator" $ do calculator' "1ن2ن3" 'ن' `shouldBe` 6