{-# LANGUAGE OverloadedStrings #-}
module System.IO.Streams.Tests.Attoparsec (tests) where
import Control.Monad
import Data.Attoparsec.ByteString.Char8
import Data.ByteString.Char8 (ByteString)
import Prelude hiding (takeWhile)
import System.IO.Streams
import System.IO.Streams.Internal.Attoparsec
import System.IO.Streams.Tests.Common
import Test.Framework
import Test.Framework.Providers.HUnit
import Test.HUnit hiding (Test)
tests :: [Test]
tests = [ testParseFromStream
, testParseFromStreamError
, testParseFromStreamError2
, testPartialParse
, testEmbeddedNull
, testTrivials
]
testParser :: Parser (Maybe Int)
testParser = do
end <- atEnd
if end
then return Nothing
else do
_ <- takeWhile (\c -> isSpace c || c == ',')
liftM Just decimal
testParser2 :: Parser (Maybe ByteString)
testParser2 = do
end <- atEnd
if end
then return Nothing
else liftM Just $ string "bork"
testParseFromStream :: Test
testParseFromStream = testCase "attoparsec/parseFromStream" $ do
is <- fromList ["1", "23", ", 4", ", 5, 6, 7"]
x0 <- parseFromStream testParser is
assertEqual "first parse" (Just 123) x0
l <- parserToInputStream testParser is >>= toList
assertEqual "rest" [4, 5, 6, 7] l
toList is >>= assertEqual "double eof" []
testParseFromStreamError :: Test
testParseFromStreamError = testCase "attoparsec/parseFromStreamError" $ do
is <- fromList ["1", "23", ", 4", ",xxxx 5, 6, 7"] >>=
parserToInputStream testParser
expectExceptionH $ toList is
testParseFromStreamError2 :: Test
testParseFromStreamError2 = testCase "attoparsec/parseFromStreamError2" $ do
l <- fromList ["borkbork", "bork"] >>= p
assertEqual "ok" ["bork", "bork", "bork"] l
expectExceptionH $ fromList ["bork", "bo"] >>= p
expectExceptionH $ fromList ["xxxxx"] >>= p
where
p = parserToInputStream testParser2 >=> toList
testPartialParse :: Test
testPartialParse = testCase "attoparsec/partialParse" $ do
is <- fromList ["1,", "2,", "3"]
expectExceptionH $ parseFromStreamInternal parseFunc feedFunc testParser is
where
result = Partial (const result)
parseFunc = const $ const $ result
feedFunc = const $ const $ result
testTrivials :: Test
testTrivials = testCase "attoparsec/trivials" $ do
coverTypeableInstance (undefined :: ParseException)
testEmbeddedNull :: Test
testEmbeddedNull = testCase "attoparsec/embeddedNull" $ do
is <- fromList ["", "1", "23", "", ", 4", ", 5, 6, 7"]
x0 <- parseFromStream testParser is
assertEqual "first parse" (Just 123) x0
l <- parserToInputStream testParser is >>= toList
assertEqual "rest" [4, 5, 6, 7] l