module Main (main)
where
import Control.Monad.Primitive
import Control.Monad.ST
import Data.Conduit
import qualified Data.Conduit.List as CL
import Data.Conduit.Vector
import qualified Data.Vector as V
import qualified Data.Vector.Mutable as M
import Test.HUnit
import Test.QuickCheck
import qualified Test.Framework as F
import Test.Framework.Runners.Console (defaultMain)
import Test.Framework.Providers.QuickCheck2
import Test.Framework.Providers.HUnit
-- QuickCheck Properties
testInverse :: [Int] -> Bool
testInverse l = runST $ do let v = V.fromList l
v' <- sourceVector v $$ consumeVector
return $ v == v'
testInverse2 :: [Int] -> Bool
testInverse2 l = runST $ do let v = V.fromList l
v' <- sourceVector v $$ consumeMVector
v'' <- V.unsafeFreeze v'
return $ v == v''
testInverse3 :: [[Int]]-> Bool
testInverse3 ls = runST $ do let vs = map V.fromList ls
let v = V.fromList vs
v' <- sourceVector v $= thawConduit $= freezeConduit $$ consumeVector
return $ v == v'
-- HUnit Cases
testSourceVector' :: [Int] -> IO ()
testSourceVector' l = do let v = V.fromList l
l' <- sourceVector v $$ CL.consume
assertEqual "consumed list" l l'
testSourceVector :: IO ()
testSourceVector = testSourceVector' [1, 2, 6, 3]
testSourceVectorEmpty :: IO ()
testSourceVectorEmpty = testSourceVector' []
testSourceMVector' :: [Int] -> IO ()
testSourceMVector' l = do v <- V.unsafeThaw $ V.fromList l
l' <- sourceMVector v $$ CL.consume
assertEqual "consumed list" l l'
testSourceMVector :: IO ()
testSourceMVector = testSourceMVector' [1, 2, 6, 3]
testSourceMVectorEmpty :: IO ()
testSourceMVectorEmpty = testSourceMVector' []
testConsumeVector' :: V.Vector Int -> IO ()
testConsumeVector' v = do let l = V.toList v
v' <- CL.sourceList l $$ consumeVector
assertEqual "consumed vector" v v'
testConsumeVector :: IO ()
testConsumeVector = testConsumeVector' (V.fromList [1, 2, 6, 3])
testConsumeVectorEmpty :: IO ()
testConsumeVectorEmpty = testConsumeVector' V.empty
testConsumeMVector' :: M.MVector (PrimState IO) Int -> IO ()
testConsumeMVector' v = do i <- V.freeze v
let l = V.toList i
v' <- CL.sourceList l $$ consumeMVector
i' <- V.unsafeFreeze v'
assertEqual "consumed vector" i i'
testConsumeMVector :: IO ()
testConsumeMVector = do m <- V.unsafeThaw . V.fromList $ [1, 2, 6, 3]
testConsumeMVector' m
testConsumeMVectorEmpty :: IO ()
testConsumeMVectorEmpty = do m <- V.unsafeThaw V.empty
testConsumeMVector' m
tests :: [F.Test]
tests = [F.testGroup "Properties"
[testProperty "Inverse" testInverse,
testProperty "Inverse2" testInverse2,
testProperty "Inverse3" testInverse3
],
F.testGroup "Cases" [
testCase "sourceVector" testSourceVector,
testCase "sourceVector (empty)" testSourceVectorEmpty,
testCase "sourceMVector" testSourceMVector,
testCase "sourceMVector (empty)" testSourceMVectorEmpty,
testCase "consumeVector" testConsumeVector,
testCase "consumeVector (empty)" testConsumeVectorEmpty,
testCase "consumeMVector" testConsumeMVector,
testCase "consumeMVector (empty)" testConsumeMVectorEmpty
]
]
main :: IO ()
main = defaultMain tests