-- |
-- Module: Main
-- Copyright: (c) 2010 Ertugrul Soeylemez
-- License: BSD3
-- Maintainer: Ertugrul Soeylemez <es@ertes.de>
-- Stability: experimental
--
-- Test program.
{-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-}
{-# OPTIONS_GHC -F -pgmF htfpp #-}
module Main where
import qualified Data.ByteString.Char8 as BC
import qualified Data.Enumerator as E
import qualified Data.Enumerator.List as EL
import qualified Data.Text as T
import Control.ContStuff
import Data.ByteString (ByteString)
import Data.Enumerator (Iteratee, enumList, ($$), (=$))
import Data.Enumerator.NetLines
import Data.Enumerator.NetLines.Class (Splittable)
import Data.Text (Text)
import System.Environment
import System.Exit
import System.Random
import Test.Framework
type Bs = ByteString
type MBs = Maybe ByteString
type MT = Maybe Text
iterEqual ::
(Eq b, Show b, Splittable str) => b -> Iteratee str IO b -> Assertion
iterEqual expectedResult iter = do
mLine <- E.run iter
case mLine of
Right actualResult -> assertEqual actualResult expectedResult
Left exp -> assertFailure ("Iteratee exception: " ++ show exp)
test_netLine_empty :: Assertion
test_netLine_empty = do
iterEqual (Nothing :: MBs) (netLine 512)
iterEqual (Nothing :: MT) (netLine 512)
test_netLine_single :: Assertion
test_netLine_single = do
iterEqual (Just "abc") (enumList 1 ["abc" :: Bs] $$ netLine 8)
iterEqual (Just "abc") (enumList 1 ["abc\nabc" :: Bs] $$ netLine 8)
iterEqual (Just "12345678") (enumList 1 ["12345678" :: Bs] $$ netLine 8)
iterEqual (Just "12345678") (enumList 1 ["12345678\n123" :: Bs] $$ netLine 8)
iterEqual (Just "12345678") (enumList 1 ["123456789" :: Bs] $$ netLine 8)
iterEqual (Just "12345678") (enumList 1 ["123456789\n123" :: Bs] $$ netLine 8)
iterEqual (Just "abc") (enumList 1 ["abc" :: Text] $$ netLine 8)
iterEqual (Just "abc") (enumList 1 ["abc\nabc" :: Text] $$ netLine 8)
iterEqual (Just "12345678") (enumList 1 ["12345678" :: Text] $$ netLine 8)
iterEqual (Just "12345678") (enumList 1 ["12345678\n123" :: Text] $$ netLine 8)
iterEqual (Just "12345678") (enumList 1 ["123456789" :: Text] $$ netLine 8)
iterEqual (Just "12345678") (enumList 1 ["123456789\n123" :: Text] $$ netLine 8)
test_netLine_multiple :: Assertion
test_netLine_multiple = do
iterEqual [Just "abc" :: MBs, Just "def", Nothing, Nothing]
(enumList 2 ["abc\n", "defghi\n"] $$ replicateM 4 (netLine 3))
iterEqual [Just "abc" :: MT, Just "def", Nothing, Nothing]
(enumList 2 ["abc\n", "defghi\n"] $$ replicateM 4 (netLine 3))
iterEqual [Just "äöü" :: MT, Just "üßa", Nothing, Nothing]
(enumList 2 ["äöü\n", "üßabc\n"] $$ replicateM 4 (netLine 3))
test_netLine_longStream :: Assertion
test_netLine_longStream = do
input <- replicateM 100000 (randomRIO ('\0', '\300'))
let bsInputs = takeWhile (not . BC.null) . map (BC.pack . take 32) . iterate (drop 32) . filter (<= '\255') $ input
txInputs = takeWhile (not . T.null) . map (T.pack . take 32) . iterate (drop 32) $ input
bsExpected = map BC.pack . filter (not . null) . map (take 16) . asciiLines . filter (/= '\r') . filter (<= '\255') $ input
txExpected = map T.pack . filter (not . null) . map (take 16) . asciiLines . filter (/= '\r') $ input
asciiLines xs =
case break (== '\n') xs of
("", "") -> []
(pfx, "") -> [pfx]
(pfx, '\n':sfx) -> pfx : asciiLines sfx
_ -> undefined
iterEqual bsExpected (enumList 16 bsInputs $$ netLines 16 =$ EL.consume)
iterEqual txExpected (enumList 16 txInputs $$ netLines 16 =$ EL.consume)
main :: IO ()
main =
getArgs >>=
flip runTestWithArgs allHTFTests >>=
exitWith