----------------------------------------------------------------------------
-- |
-- Module : TestMain
-- Copyright : (c) Sergey Vinokurov 2022
-- License : Apache-2.0 (see LICENSE)
-- Maintainer : serg.foo@gmail.com
----------------------------------------------------------------------------
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE NamedFieldPuns #-}
module TestMain (main) where
import Data.Semigroup
import Test.QuickCheck
import Test.Tasty
import Test.Tasty.QuickCheck qualified as QC
import Test.Tasty.Runners qualified as Tasty
import Control.Concurrent.Counter.Lifted.IO qualified as C
import TestUtils
main :: IO ()
main = defaultMain $
localOption (Tasty.NumThreads 1) $
testGroup "All"
[ adjustOption (\(QC.QuickCheckTests x) -> QC.QuickCheckTests (max x 500)) $
QC.testProperty "Correctness" $
\(Threads ts) -> ioProperty $ do
res <- spawnAndCall ts (C.new 0) (\ref t -> runThread t sleep (C.add ref)) >>= C.get
let Sum expected =
foldMap (\Thread{tIncrement, tIterations} -> Sum $ tIncrement * unIterations tIterations) ts
pure $ res === expected
, adjustOption (\(QC.QuickCheckTests x) -> QC.QuickCheckTests (max x 10000)) $
QC.testProperty "Correctness, no delays" $
\(Threads ts) -> ioProperty $ do
res <- spawnAndCall ts (C.new 0) (\ref t -> runThread t (\_ -> pure ()) (C.add ref)) >>= C.get
let Sum expected =
foldMap (\Thread{tIncrement, tIterations} -> Sum $ tIncrement * unIterations tIterations) ts
pure $ res === expected
]