{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE DataKinds #-} import Control.Monad import Data.Data import Data.Foldable import Data.IORef import Data.List import System.Exit import System.IO import Options.Generic import Generic.Random.Data import Generic.Random.Internal.Data import Test.Tree import Test.Stats eps, del :: Double eps = 0.01 del = 0.001 -- | Periodically print stuff so that Travis does not think we're stuck. counting x gen = do modifyIORef x (+ 1) readIORef x >>= \x -> when (x `mod` 1000 == 0) $ putStr "." >> hFlush stdout gen -- | Invocation: stack test [--test-arguments TEST_SIZE] type Input = Maybe (Int "Test size") main = do n_ <- getRecord "Test program" :: IO Input success <- newIORef True let n = maybe 10 unHelpful n_ range = tolerance epsilon n for_ [ ( "reject " , generatorSR , expected Nothing range eps del ) , ( "rejectSimple " , generatorR' , expected (Just (fromIntegral n)) range eps del ) ] $ \(name, g, kdist) -> do putStrLn $ name ++ show n let gen = (fmap size . asMonadRandom . g) n x <- newIORef 0 (expectedDist, estimatedDist, diff) <- runExperiment kdist (counting x gen) putStrLn "" when (diff > eps) $ do writeIORef success False putStrLn $ "FAIL > " ++ show diff print expectedDist print estimatedDist {- let k = 80000 eps = 0.1 gen = (fmap size . asMonadRandom . generatorP') n putStrLn $ "pointed " ++ show n x <- newIORef 0 sizes <- replicateM k (counting x gen) putStrLn "" let diff = abs (mean sizes - fromIntegral (n `div` 2)) when (diff > eps) $ do writeIORef success False putStrLn $ "FAIL > " ++ show diff -} success <- readIORef success unless success exitFailure