module Main where import System.IO import Control.Concurrent import Control.Exception -- implementation-agnostic tests: import Deadlocks import Smoke import DupChan -- implementation-specific tests: import Unagi import UnagiUnboxed import UnagiBounded import UnagiNoBlocking import UnagiNoBlockingUnboxed -- Other import Atomics import IndexedMVar import Control.Concurrent.Chan.Unagi.Internal(assertionCanary) main :: IO () main = do -- Make sure testing environment is sane: assertionsWorking <- try $ assert False $ return () assertionsWorkingInLib <- assertionCanary case assertionsWorking of Left (AssertionFailed _) | assertionsWorkingInLib -> putStrLn "Assertions: On" _ -> error "Assertions aren't working" procs <- getNumCapabilities if procs < 2 then error "Tests are only effective if more than 1 core is available" else return () hSetBuffering stdout NoBuffering -- ----------------------------------- -- test important properties of our atomic-primops: atomicsMain indexedMVarMain -- do things catch fire? smokeMain -- dupChan tests dupChanMain -- check for deadlocks: deadlocksMain -- implementation-specific tests unagiMain unagiUnboxedMain unagiBoundedMain unagiNoBlockingMain unagiNoBlockingUnboxedMain putStrLn "ALL TESTS PASSED!"