packages feed

polysemy-time-0.1.3.2: test/Polysemy/Time/Test/GhcTimeTest.hs

module Polysemy.Time.Test.GhcTimeTest where

import Data.Time (Day, UTCTime)
import Polysemy.Test (UnitTest, assert, assertEq, runTestAuto)
import Polysemy.Test.Data.Hedgehog (Hedgehog)

import Polysemy.Time.Calendar (mkDatetime, year)
import qualified Polysemy.Time.Data.Time as Time
import Polysemy.Time.Data.Time (Time)
import Polysemy.Time.Data.TimeUnit (Days (Days), Seconds (Seconds))
import Polysemy.Time.Ghc (interpretTimeGhc, interpretTimeGhcAt)

prog ::
  ∀ t d r .
  Ord t =>
  Members [Time t d, Hedgehog IO] r =>
  Sem r ()
prog = do
  time1 <- Time.now @t @d
  time2 <- Time.now @t @d
  assert @IO (time1 < time2)

test_ghcTime :: UnitTest
test_ghcTime =
  runTestAuto do
    interpretTimeGhc (prog @UTCTime @Day)

testTime :: UTCTime
testTime =
  mkDatetime 1845 12 31 23 59 59

test_ghcTimeAt :: UnitTest
test_ghcTimeAt =
  runTestAuto do
    interpretTimeGhcAt testTime do
      Time.sleep @UTCTime @Day (Seconds 1)
      time <- Time.now @UTCTime @Day
      assertEq @_ @IO 1846 (year time)
      Time.adjust @UTCTime @Day (Days 366)
      time1 <- Time.now @UTCTime @Day
      assertEq @_ @IO 1847 (year time1)