packages feed

time-machine-0.1.0: test/Control/Monad/TimeMachine/CockpitSpec.hs

module Control.Monad.TimeMachine.CockpitSpec ( spec ) where

import Test.Hspec
import Test.Hspec.QuickCheck ( prop )

import Control.Monad.TimeMachine.Cockpit

spec :: Spec
spec = do
    describe "jan/feb/.../dec" $ do
        it "clips too large day, hour and minmute values" $ do
            jan 32 1970 am 12 60 `shouldBe` jan 31 1970 am 11 59
        it "clips too small day, hour and minmute values" $ do
            jan 0 1970 am (-1) (-1) `shouldBe` jan 1 1970 am 0 0

    describe "feb" $ do
        it "can handle common years" $ do
            feb 30 1970 am 0 0 `shouldBe` feb 28 1970 am 0 0
        it "can handle leap years" $ do
            feb 30 1972 am 0 0 `shouldBe` feb 29 1972 am 0 0
        it "can handle exceptional common years" $ do
            feb 30 1900 am 0 0 `shouldBe` feb 28 1900 am 0 0
        it "can handle exceptional leap years" $ do
            feb 30 2000 am 0 0 `shouldBe` feb 29 2000 am 0 0

    describe "hours" $ do
        prop "A hour is equivalent to 60 minutes" $ \n -> do
            n `hours` later == (60 * n) `minutes` later

    describe "days" $ do
        prop "A day is equivalent to 24 hours" $ \n -> do
            n `days` later == (24 * n) `hours` later

    describe "weeks" $ do
        prop "A week is equivalent to 7 days" $ \n -> do
            n `weeks` later == (7 * n) `days` later

    describe "later/ago" $ do
        prop "'-n days later' means 'n days ago'" $ \n -> do
            (-n) `days` later == n `days` ago

    describe "minutesPerSec" $ do
        it "is x60 faster than secondsPerSec" $ do
            at 1 minutesPerSec == at 60 secondsPerSec

    describe "hoursPerSec" $ do
        it "is x60 faster than minutesPerSec" $ do
            at 1 hoursPerSec == at 60 minutesPerSec

    describe "daysDerSec" $ do
        it "is x24 faster than hoursPerSec" $ do
            at 1 daysPerSec == at 24 hoursPerSec