packages feed

enumerator-0.4.15: tests/EnumeratorTests/Text/Split.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}

-- Copyright (C) 2010 John Millikin <jmillikin@gmail.com>
--
-- See license.txt for details
module EnumeratorTests.Text.Split
	( test_SplitWhen
	, test_Lines
	) where

import qualified Data.List.Split as LS
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import           Test.Chell
import           Test.Chell.QuickCheck

import           Data.Enumerator ((=$))
import qualified Data.Enumerator as E
import qualified Data.Enumerator.List as EL
import qualified Data.Enumerator.Text as ET

import           EnumeratorTests.Text.Util

test_SplitWhen :: Suite
test_SplitWhen = suite "splitWhen"
	[ prop_SplitWhen
	, test_HandleEmpty
	]

prop_SplitWhen :: Suite
prop_SplitWhen = property "model" $ prop_TextX
	(\c -> do
		xs <- ET.splitWhen (== c) =$ EL.consume
		extra <- EL.consume
		return (xs, extra))
	(\c text -> let
		split = LS.split . LS.dropFinalBlank . LS.dropDelims . LS.whenElt
		chars = TL.unpack text
		in Right (map T.pack (split (== c) chars), []))

test_HandleEmpty :: Suite
test_HandleEmpty = assertions "empty" $ do
	$expect $ equal
		([], Nothing)
		(E.runLists_ [[""]] $ do
			xs <- ET.splitWhen (== ',') =$ EL.consume
			extra <- EL.head
			return (xs, extra))

test_Lines :: Suite
test_Lines = assertions "lines" $ do
	$expect $ equal
		["abc", "def"]
		(E.runLists_ [["abc\ndef"]] (ET.lines =$ EL.consume))
	$expect $ equal
		["abc", "def"]
		(E.runLists_ [["abc\ndef\n"]] (ET.lines =$ EL.consume))
	$expect $ equal
		["abc", "def", ""]
		(E.runLists_ [["abc\ndef\n\n"]] (ET.lines =$ EL.consume))