alarmclock-0.5.0.1: test/Spec.hs
{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import Test.Hspec
import Control.Concurrent
import Control.Concurrent.AlarmClock.TimeScale
import Data.Proxy
import Data.Time
main :: IO ()
main = hspec $ describe "Control.Concurrent.AlarmClock" $ do
describe "Timescale" $ do
let beforeTimescaleTest :: TimeScale t => IO (t,t)
beforeTimescaleTest = do
putStrLn "getting first time"
t0 <- getAbsoluteTime
threadDelay 500000
putStrLn "getting second time"
t1 <- getAbsoluteTime
putStrLn "got times"
return (t0, t1)
timescaleSpec :: (TimeScale t, Eq t, Show t) => Proxy t -> SpecWith (t,t)
timescaleSpec _ = do
describe "earlierOf" $ do
it "picks the first if earlier" $ \(t0,t1) -> earlierOf t0 t1 `shouldBe` t0
it "picks the second if earlier" $ \(t0,t1) -> earlierOf t1 t0 `shouldBe` t0
describe "microsecondsDiff" $ do
it "finds a difference of at least 500ms"
$ \(t0,t1) -> microsecondsDiff t1 t0 `shouldSatisfy` (>= 500000)
it "finds a difference of no more than 600ms"
$ \(t0,t1) -> microsecondsDiff t1 t0 `shouldSatisfy` (<= 600000)
it "finds a negative difference if args reversed"
$ \(t0,t1) -> microsecondsDiff t0 t1 `shouldSatisfy` (<= (-500000))
describe "UTCTime" $ beforeAll beforeTimescaleTest $ timescaleSpec (Proxy :: Proxy UTCTime)
describe "Monotonic" $ beforeAll beforeTimescaleTest $ timescaleSpec (Proxy :: Proxy MonotonicTime)
return ()