{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} module Immutable.Test ( testSuite ) where import Data.List (sort) import Data.Vector (Vector) import qualified Data.Vector as V import Immutable.Shuffle import System.Random import Test.QuickCheck.Instances.Vector () import Test.QuickCheck.Monadic import Test.Tasty import Test.Tasty.QuickCheck as QC hiding (shuffle) testSuite :: TestTree testSuite = testGroup "" [ localOption (QuickCheckTests 1000) shuffleTestSuite , localOption (QuickCheckTests 1000) shuffleMTestSuite ] shuffleTestSuite :: TestTree shuffleTestSuite = testGroup "shuffle" [ QC.testProperty "Shuffling preserves length and elements" (monadicIO . isPermutation @Int)] shuffleMTestSuite :: TestTree shuffleMTestSuite = testGroup "shuffleM" [ QC.testProperty "Shuffling preserves length and elements" (monadicIO . isPermutationM @Int)] isPermutation :: forall a . (Ord a , Show a, Arbitrary a) => Vector a -> PropertyM IO Property isPermutation v = do gen <- run $ getStdGen let v' = fst $ shuffle v gen let ls = V.toList v let ls' = V.toList v' pure $ (sort ls) === (sort ls') isPermutationM :: forall a . (Ord a , Show a, Arbitrary a) => Vector a -> PropertyM IO Property isPermutationM v = do v' <- run $ shuffleM v let ls = V.toList v let ls' = V.toList v' pure $ (sort ls) === (sort ls')