{-# LANGUAGE OverloadedStrings #-} module System.IO.Streams.Tests.Vector (tests) where ------------------------------------------------------------------------------ import Control.Monad hiding (mapM) import qualified Data.Vector as V import Prelude hiding (mapM, read) import Test.Framework import Test.Framework.Providers.HUnit import Test.HUnit hiding (Test) ------------------------------------------------------------------------------ import qualified System.IO.Streams as S import System.IO.Streams.List import System.IO.Streams.Vector ------------------------------------------------------------------------------ import System.IO.Streams.Tests.Common (expectExceptionH) ------------------------------------------------------------------------------ tests :: [Test] tests = [ testChunk , testWrite , testVectorOutputStream , testFromTo , testOutputToMutableVector , testToMutableVector ] ------------------------------------------------------------------------------ testChunk :: Test testChunk = testCase "vector/chunkVector" $ do let zeroLen :: IO ([V.Vector Int]) zeroLen = fromList [1..10::Int] >>= chunkVector 0 >>= toList expectExceptionH zeroLen fromList [1..10 :: Int] >>= chunkVector 3 >>= toList >>= assertEqual "chunkVector" (map V.fromList [ [1,2,3] , [4,5,6] , [7,8,9] , [10] ]) fromList [1..12 :: Int] >>= chunkVector 3 >>= toList >>= assertEqual "chunkVector2" (map V.fromList [ [1,2,3] , [4,5,6] , [7,8,9] , [10,11,12] ]) ------------------------------------------------------------------------------ testWrite :: Test testWrite = testCase "vector/writeVector" $ outputToVector act >>= assertEqual "testWrite" (V.fromList [1..10::Int]) where act str = do writeVector (V.fromList [1..10]) str S.write Nothing str S.write Nothing str ------------------------------------------------------------------------------ testVectorOutputStream :: Test testVectorOutputStream = testCase "vector/vectorOutputStream" $ test1 >> test2 where test1 = do (os, flush) <- vectorOutputStream fromList [1,2,3::Int] >>= S.connectTo os flush >>= assertEqual "v1" (V.fromList [1,2,3::Int]) S.write (Just 4) os flush >>= assertEqual "v2" V.empty test2 = do (os, flush) <- mutableVectorOutputStream fromList [1,2,3::Int] >>= S.supplyTo os flush >>= V.unsafeFreeze >>= assertEqual "v1" (V.fromList [1,2,3::Int]) S.write (Just 4) os flush >>= V.unsafeFreeze >>= assertEqual "v2" (V.singleton (4::Int)) ------------------------------------------------------------------------------ testFromTo :: Test testFromTo = testCase "vector/fromVector" $ do fromVector V.empty >>= toVector >>= assertEqual "f1" (V.empty :: V.Vector Int) fromVector vtest >>= toVector >>= assertEqual "f2" vtest where vtest = V.fromList [1..100::Int] ------------------------------------------------------------------------------ testOutputToMutableVector :: Test testOutputToMutableVector = testCase "vector/outputToMutableVector" $ do is <- S.fromList [1::Int,2,3] outputToMutableVector (S.connect is) >>= V.unsafeFreeze >>= assertEqual "outputToMutableVector" (V.fromList [1,2,3]) ------------------------------------------------------------------------------ testToMutableVector :: Test testToMutableVector = testCase "vector/toMutableVector" $ do is <- S.fromList [1::Int,2,3] toMutableVector is >>= V.unsafeFreeze >>= assertEqual "toMutableVector" (V.fromList [1,2,3])