packages feed

metrics-0.3.0.1: tests/MeterTest.hs

{-# LANGUAGE Rank2Types #-}
module MeterTest where
import Control.Monad
import Control.Monad.Primitive
import Control.Monad.ST
import Data.Metrics.Internal
import Data.Metrics.Meter.Internal
import Data.Metrics.Types
import Data.Primitive.MutVar
import Data.STRef
import Test.QuickCheck
import Test.QuickCheck.Monadic
import System.Posix.Types

smallCount :: Gen Int
smallCount = choose (0, 10000)

increment1s :: forall s. STRef s EpochTime -> ST s EpochTime
increment1s r = do
  modifySTRef r succ
  t <- readSTRef r
  return t

run1sMeter :: (forall s. Meter (ST s) -> ST s a) -> a
run1sMeter f = runST $ do
  r <- newSTRef 0
  m <- mkMeter $ increment1s r
  f m

meterCountTest :: Property
meterCountTest = label "mark increments count" $ monadicST $ do
  x <- pick smallCount
  let c = run1sMeter $ \m -> (replicateM_ x $ mark m) >> count m
  assert $ x == c
-- testMeter
-- testMeterThreaded
-- testOneMinuteRate

testTicks = runST $ do
  r <- newSTRef 0
  m <- mkMeter $ increment1s r
  mark m
  mark m
  mark m
  mark m
  mark m
  md <- readMutVar (fromMeter m)
  x <- readSTRef r
  return $ (meterLastTick md, x)