packages feed

hodatime-1.1.0.0: tests/HodaTime/LocalTimeTest.hs

module HodaTime.LocalTimeTest
(
  localTimeTests
)
where

import Test.Tasty
import Test.Tasty.QuickCheck as QC
import Test.Tasty.HUnit
import Data.Maybe (fromJust)

import HodaTime.Util (RandomTime(..))
import Data.HodaTime.LocalTime (localTime, LocalTime, hour, minute, second)
import Data.HodaTime.Period (applyPeriod, hours, minutes, seconds)

localTimeTests :: TestTree
localTimeTests = testGroup "LocalTime Tests" [qcProps, unitTests]

qcProps :: TestTree
qcProps = testGroup "(checked by QuickCheck)" [accessorProps]

unitTests :: TestTree
unitTests = testGroup "Unit tests" [rolloverUnits]

-- properties

accessorProps :: TestTree
accessorProps = testGroup "Accessors"
  [
     QC.testProperty "reads constructed components" $ \(RandomTime h m s) ->
       let value = mkTime h m s in (hour value, minute value, second value) == (h, m, s)
  ]
  where
    mkTime h m s = fromJust (localTime h m s 0)

rolloverUnits :: TestTree
rolloverUnits = testGroup "Rollover"
  [
    testCase "22:57:57 + 2s == 22:57:59" $ applyPeriod (seconds 2) <$> time @?= localTime 22 57 59 0
      ,testCase "22:57:57 + 5s == 22:58:02" $ applyPeriod (seconds 5) <$> time @?= localTime 22 58 2 0
      ,testCase "22:57:57 + 2m == 22:59:57" $ applyPeriod (minutes 2) <$> time @?= localTime 22 59 57 0
      ,testCase "22:57:57 + 5m == 23:02:57" $ applyPeriod (minutes 5) <$> time @?= localTime 23 02 57 0
      ,testCase "22:57:57 + 1h == 23:57:57" $ applyPeriod (hours 1) <$> time @?= localTime 23 57 57 0
      ,testCase "22:57:57 + 3h == 01:57:57" $ applyPeriod (hours 3) <$> time @?= localTime 1 57 57 0
      ,testCase "22:57:57 + 3723s == 00:00:00" $ applyPeriod (seconds 3723) <$> time @?= localTime 0 0 0 0
      ,testCase "22:57:57 + 3725s == 00:00:02" $ applyPeriod (seconds 3725) <$> time @?= localTime 0 0 2 0
  ]
  where
    time :: Maybe LocalTime
    time = localTime 22 57 57 0