packages feed

storablevector-0.2.12: tests/Test/Lazy.hs

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) :
   []