module Test.Lazy (tests) where import qualified Alternative.Lazy as AltLazy import qualified Data.StorableVector.Lazy as VL import qualified Data.StorableVector as V import qualified Data.List.HT as ListHT import qualified Data.List as List import qualified Data.Word as Word import Foreign.Storable (Storable) import Test.QuickCheck (quickCheck) type W = Word.Word16 compactEqual :: VL.ChunkSize -> [V.Vector W] -> Bool compactEqual chunkSize chunks = let xs = VL.fromChunks chunks in VL.unpack xs == VL.unpack (VL.compact chunkSize xs) fromChunksLimited :: (Storable a) => VL.ChunkSize -> [V.Vector a] -> VL.Vector a fromChunksLimited (VL.ChunkSize size) = VL.fromChunks . List.concatMap (V.sliceVertical size) compactLimit :: VL.ChunkSize -> [V.Vector W] -> Bool compactLimit chunkSize = all ((<=chunkSize) . VL.chunkSize . V.length) . VL.chunks . VL.compact chunkSize . fromChunksLimited chunkSize compactMax :: VL.ChunkSize -> [V.Vector W] -> Bool compactMax chunkSize = all ((>chunkSize) . VL.chunkSize) . ListHT.mapAdjacent (+) . map V.length . VL.chunks . VL.compact chunkSize . fromChunksLimited chunkSize compactAlt :: VL.ChunkSize -> [V.Vector W] -> Bool compactAlt chunkSize@(VL.ChunkSize size) chunks = let xs = fromChunksLimited chunkSize chunks in (map sum $ AltLazy.compact3 size $ map V.length $ VL.chunks xs) == (map V.length $ VL.chunks $ VL.compact chunkSize xs) compactAltLens :: (Int -> [Int] -> [[Int]]) -> VL.ChunkSize -> [V.Vector W] -> Bool compactAltLens compactLens chunkSize@(VL.ChunkSize size) chunks = let lens = map V.length $ VL.chunks $ fromChunksLimited chunkSize chunks in AltLazy.compact3 size lens == compactLens size lens tests :: [(String, IO ())] tests = ("compactEqual", quickCheck compactEqual) : ("compactLimit", quickCheck compactLimit) : ("compactMax", quickCheck compactMax) : ("compactAlt", quickCheck compactAlt) : ("compactAlt2", quickCheck $ compactAltLens AltLazy.compact2) : ("compactAlt4", quickCheck $ compactAltLens AltLazy.compact4) : []