Skip to content

Instantly share code, notes, and snippets.

@bChiquet
Created October 9, 2020 19:07
Show Gist options
  • Save bChiquet/984bdcbe2b01241af25e801efd689582 to your computer and use it in GitHub Desktop.
Save bChiquet/984bdcbe2b01241af25e801efd689582 to your computer and use it in GitHub Desktop.
import Test.Hspec
import Data.Function ((&))
main :: IO ()
main = hspec $ do
describe "the car insurance" $ do
it "new drivers pay their full premium" $ do
premium NewDriver `shouldBe` 100
it "drivers get 5% rebate after 1 year" $ do
premium ( NewDriver & OneYearPassed) `shouldBe` 95
it "drivers get 5%*5% rebate after 2 years" $ do
premium (NewDriver & OneYearPassed & OneYearPassed) `shouldBe` 90
it "rounding concerns after 4 years: only keep 2 decimals" $ do
premium (NewDriver & yearsPassed 5) `shouldBe` 76
it "drivers get a 25% penalty after an accident" $ do
premium (NewDriver & Accident) `shouldBe` 125
premium (NewDriver & Accident & Accident) `shouldBe` 156
premium (NewDriver & OneYearPassed & Accident) `shouldBe` 118
premium (NewDriver & OneYearPassed & OneYearPassed & Accident) `shouldBe` 112
it "drivers don't get a bonus after a year with accident" $ do
premium (NewDriver & Accident & OneYearPassed) `shouldBe` 125
premium (NewDriver & Accident & Accident & OneYearPassed) `shouldBe` 156
data Driver = NewDriver
| OneYearPassed Driver
| Accident Driver
yearsPassed :: Int -> Driver -> Driver
yearsPassed n initialDriver = last $ take (n+1) $ iterate OneYearPassed initialDriver
premium :: Driver -> Int
premium (Accident restOfHistory) = premium restOfHistory + (premium restOfHistory `div` 4)
premium (OneYearPassed rest@(Accident _)) = premium rest
premium (OneYearPassed restOfHistory) = (premium restOfHistory * 95) `div` 100
premium NewDriver = 100
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment