packages feed

approx-rand-test-0.0.3: tests/tests.hs

module Main where

import Control.Monad.Mersenne.Random (evalRandom)
import System.Random.Mersenne.Pure64 (pureMT)
import qualified Data.Vector.Unboxed as V
import Statistics.Test.ApproxRand
import Test.HUnit (assertEqual)
import Test.Framework
import Test.Framework.Providers.HUnit

tests :: Test
tests = testGroup "Paired approximate randomization tests" $
	concat [statTests, randomizationTests]

main :: IO ()
main = defaultMain [ tests ]

-- Statistics tests

statTests :: [Test]
statTests = [meanDifferenceTest]

meanDifferenceTest :: Test
meanDifferenceTest =
	testEquality "mean difference robot competition"
		(meanDifference cohenRobotsAlpha cohenRobotsBeta) 1.8

-- Approximate andomization tests

randomizationTests :: [Test]
randomizationTests = [pairApproxExactTestScores]

pairApproxExactTestScores :: Test
pairApproxExactTestScores =
	testEquality  "number of extreme values robot competition"
		(length $ filter (>= 1.8) scores) 21
	where
		scores = evalRandom
			(approxRandPairScores meanDifference 1024
				cohenRobotsAlpha cohenRobotsBeta) $
			pureMT 42

-- Helper functions

testEquality :: (Show a, Eq a) => String -> a -> a -> Test
testEquality msg a b = testCase msg $ assertEqual msg a b

-- Example from Cohen, 1995
cohenRobotsAlpha :: V.Vector Double
cohenRobotsAlpha = V.fromList [8,3,9,6,5,8,7,8,9,9]

cohenRobotsBeta :: V.Vector Double
cohenRobotsBeta  = V.fromList [7,0,9,4,5,9,8,3,4,5]