packages feed

criterion-plus-0.1.0: internal-tests/InternalTests.hs

{-# OPTIONS_GHC -F -pgmF htfpp #-}

import Test.Framework
import Test.QuickCheck.Monadic
import CriterionPlus.Prelude.Basic
import CriterionPlus.Prelude.Transformers
import qualified CriterionPlus.Monads as M
import qualified Criterion.Environment as C
import qualified Data.Vector.Unboxed as V

main = htfMain $ htf_thisModulesTests


-- * Tests
-------------------------

test_aMoreComplexPureBenchmarkTakesLonger = do
  replicateM_ 10 $ do
    [a, b] <- runStandoff 100 $ do
      M.subject "shorter" $ do
        M.nf pureCalc 1
      M.subject "longer" $ do
        M.nf pureCalc 4
    assertEqual LT $ compareResults a b

test_aMoreComplexImpureBenchmarkTakesLonger = do
  replicateM_ 10 $ do
    [a, b] <- runStandoff 100 $ do
      M.subject "shorter" $ do
        M.nfIO $ return $ pureCalc 1
      M.subject "longer" $ do
        M.nfIO $ return $ pureCalc 4
    assertEqual LT $ compareResults a b

test_timerControlsDontAffectTheResults = unitTestPending ""


-- * Utils
-------------------------

runStandoff :: Int -> M.Standoff a -> IO [M.SubjectReport]
runStandoff samples = M.runStandoff 1 "test-standoff" env settings where
  -- env = unsafePerformIO $ M.runBenchmark settings $ M.Benchmark $ lift $ ask
  env = C.Environment 0 0
  settings = M.Settings "dist/test" samples

compareResults :: M.SubjectReport -> M.SubjectReport -> Ordering
compareResults = on compare $ \(_, v, _, _) -> V.sum v

pureCalc :: Int -> [Int]
pureCalc a = map (+a) $ enumFromTo 0 $ 10^3*a

apxEqual :: Double -> Double -> Bool
apxEqual a b = a > b * 0.95 && a < b * 1.05