6266c5d32f
Rename my //users directory and all places that refer to glittershark to grfn, including nix references and documentation. This may require some extra attention inside of gerrit's database after it lands to allow me to actually push things. Change-Id: I4728b7ec2c60024392c1c1fa6e0d4a59b3e266fa Reviewed-on: https://cl.tvl.fyi/c/depot/+/2933 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in> Reviewed-by: lukegb <lukegb@tvl.fyi> Reviewed-by: glittershark <grfn@gws.fyi>
84 lines
2.9 KiB
Haskell
84 lines
2.9 KiB
Haskell
{-# LANGUAGE PackageImports #-}
|
|
--------------------------------------------------------------------------------
|
|
module Xanthous.Generators.UtilSpec (main, test) where
|
|
--------------------------------------------------------------------------------
|
|
import Test.Prelude
|
|
import System.Random (mkStdGen)
|
|
import Control.Monad.Random (runRandT)
|
|
import Data.Array.ST (STUArray, runSTUArray, thaw)
|
|
import Data.Array.IArray (bounds)
|
|
import Data.Array.MArray (newArray, readArray, writeArray)
|
|
import Data.Array (Array, range, listArray, Ix)
|
|
import Control.Monad.ST (ST, runST)
|
|
import "checkers" Test.QuickCheck.Instances.Array ()
|
|
import Linear.V2
|
|
--------------------------------------------------------------------------------
|
|
import Xanthous.Util
|
|
import Xanthous.Data (width, height)
|
|
import Xanthous.Generators.Util
|
|
--------------------------------------------------------------------------------
|
|
|
|
main :: IO ()
|
|
main = defaultMain test
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
newtype GenArray a b = GenArray (Array a b)
|
|
deriving stock (Show, Eq)
|
|
|
|
instance (Ix a, Arbitrary a, CoArbitrary a, Arbitrary b)
|
|
=> Arbitrary (GenArray a b) where
|
|
arbitrary = GenArray <$> do
|
|
(mkElem :: a -> b) <- arbitrary
|
|
minDims <- arbitrary
|
|
maxDims <- arbitrary
|
|
let bnds = (minDims, maxDims)
|
|
pure $ listArray bnds $ mkElem <$> range bnds
|
|
|
|
test :: TestTree
|
|
test = testGroup "Xanthous.Generators.Util"
|
|
[ testGroup "randInitialize"
|
|
[ testProperty "returns an array of the correct dimensions"
|
|
$ \dims seed aliveChance ->
|
|
let gen = mkStdGen seed
|
|
res = runSTUArray
|
|
$ fmap fst
|
|
$ flip runRandT gen
|
|
$ randInitialize dims aliveChance
|
|
in bounds res === (0, V2 (dims ^. width) (dims ^. height))
|
|
]
|
|
, testGroup "numAliveNeighborsM"
|
|
[ testProperty "maxes out at 8"
|
|
$ \(GenArray (arr :: Array (V2 Word) Bool)) loc ->
|
|
let
|
|
act :: forall s. ST s Word
|
|
act = do
|
|
mArr <- thaw @_ @_ @_ @(STUArray s) arr
|
|
numAliveNeighborsM mArr loc
|
|
res = runST act
|
|
in counterexample (show res) $ between 0 8 res
|
|
]
|
|
, testGroup "numAliveNeighbors"
|
|
[ testProperty "is equivalient to runST . numAliveNeighborsM . thaw" $
|
|
\(GenArray (arr :: Array (V2 Word) Bool)) loc ->
|
|
let
|
|
act :: forall s. ST s Word
|
|
act = do
|
|
mArr <- thaw @_ @_ @_ @(STUArray s) arr
|
|
numAliveNeighborsM mArr loc
|
|
res = runST act
|
|
in numAliveNeighbors arr loc === res
|
|
]
|
|
, testGroup "cloneMArray"
|
|
[ testCase "clones the array" $ runST $
|
|
let
|
|
go :: forall s. ST s Assertion
|
|
go = do
|
|
arr <- newArray @(STUArray s) (0 :: Int, 5) (1 :: Int)
|
|
arr' <- cloneMArray @_ @(STUArray s) arr
|
|
writeArray arr' 0 1234
|
|
x <- readArray arr 0
|
|
pure $ x @?= 1
|
|
in go
|
|
]
|
|
]
|