{-# language BangPatterns #-}
{-# language LambdaCase #-}
{-# language ScopedTypeVariables #-}
{-# language TypeApplications #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
import Data.Chunks (Chunks(ChunksCons,ChunksNil))
import Data.Primitive (SmallArray)
import Data.Proxy (Proxy(Proxy))
import Test.QuickCheck (Arbitrary,Gen)
import Test.QuickCheck.Classes (eqLaws,semigroupLaws)
import Test.QuickCheck.Classes (monoidLaws,isListLaws,foldableLaws)
import Test.Tasty (defaultMain,testGroup,TestTree)
import qualified GHC.Exts as Exts
import qualified Test.QuickCheck as QC
import qualified Test.QuickCheck.Classes as QCC
import qualified Test.Tasty.QuickCheck as TQC
main :: IO ()
main = defaultMain tests
tests :: TestTree
tests = testGroup "Chunks"
[ lawsToTest (eqLaws (Proxy :: Proxy (Chunks Integer)))
, lawsToTest (semigroupLaws (Proxy :: Proxy (Chunks Integer)))
, lawsToTest (monoidLaws (Proxy :: Proxy (Chunks Integer)))
, lawsToTest (isListLaws (Proxy :: Proxy (Chunks Integer)))
, lawsToTest (foldableLaws (Proxy :: Proxy Chunks))
]
lawsToTest :: QCC.Laws -> TestTree
lawsToTest (QCC.Laws name pairs) = testGroup name (map (uncurry TQC.testProperty) pairs)
instance Arbitrary a => Arbitrary (Chunks a) where
arbitrary = QC.choose (0,3 :: Int) >>= \case
0 -> pure ChunksNil
1 -> do
a <- arbitrarySmallArray
pure (ChunksCons a ChunksNil)
2 -> do
a <- arbitrarySmallArray
b <- arbitrarySmallArray
pure (ChunksCons a (ChunksCons b ChunksNil))
3 -> do
a <- arbitrarySmallArray
b <- arbitrarySmallArray
c <- arbitrarySmallArray
pure (ChunksCons a (ChunksCons b (ChunksCons c ChunksNil)))
_ -> error "Chunks.arbitrary: not possible"
instance Arbitrary a => Arbitrary (SmallArray a) where
arbitrary = arbitrarySmallArray
arbitrarySmallArray :: Arbitrary a => Gen (SmallArray a)
arbitrarySmallArray = do
n <- QC.choose (0,2 :: Int)
fmap Exts.fromList (QC.vectorOf n QC.arbitrary)