attoparsec-0.10.0.3: tests/QC/ByteString.hs
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module QC.ByteString (tests) where
import Control.Applicative ((<$>))
import Prelude hiding (takeWhile)
import Test.Framework.Providers.QuickCheck2 (testProperty)
import Test.QuickCheck
import qualified Data.Attoparsec.ByteString as P
import qualified Data.Attoparsec.ByteString.Lazy as PL
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L
instance Arbitrary B.ByteString where
arbitrary = B.pack <$> arbitrary
instance Arbitrary L.ByteString where
arbitrary = sized $ \n -> resize (round (sqrt (toEnum n :: Double)))
((L.fromChunks . map (B.pack . nonEmpty)) <$> arbitrary)
where nonEmpty (NonEmpty a) = a
-- Naming.
{-
label (NonEmpty s) = case parse (anyWord8 <?> s) B.empty of
(_, Left err) -> s `isInfixOf` err
_ -> False
-}
-- Basic byte-level combinators.
maybeP p = PL.maybeResult . PL.parse p
defP p = PL.parse p
satisfy w s = maybeP (P.satisfy (<=w)) (L.cons w s) == Just w
word8 w s = maybeP (P.word8 w) (L.cons w s) == Just w
anyWord8 s
| L.null s = p == Nothing
| otherwise = p == Just (L.head s)
where p = maybeP P.anyWord8 s
notWord8 w (NonEmpty s) = maybeP (P.notWord8 w) bs == if v == w
then Nothing
else Just v
where v = L.head bs
bs = L.pack s
string s t = maybeP (P.string s') (s `L.append` t) == Just s'
where s' = toStrict s
toStrict = B.concat . L.toChunks
skipWhile w s =
let t = L.dropWhile (<=w) s
in case defP (P.skipWhile (<=w)) s of
PL.Done t' () -> t == t'
_ -> False
takeCount (Positive k) s =
case maybeP (P.take k) s of
Nothing -> fromIntegral k > L.length s
Just s' -> fromIntegral k <= L.length s
takeWhile w s =
let (h,t) = L.span (==w) s
in case defP (P.takeWhile (==w)) s of
PL.Done t' h' -> t == t' && toStrict h == h'
_ -> False
takeWhile1 w s =
let s' = L.cons w s
(h,t) = L.span (<=w) s'
in case defP (P.takeWhile1 (<=w)) s' of
PL.Done t' h' -> t == t' && toStrict h == h'
_ -> False
takeTill w s =
let (h,t) = L.break (==w) s
in case defP (P.takeTill (==w)) s of
PL.Done t' h' -> t == t' && toStrict h == h'
_ -> False
takeWhile1_empty = maybeP (P.takeWhile1 undefined) L.empty == Nothing
endOfInput s = maybeP P.endOfInput s == if L.null s
then Just ()
else Nothing
tests = [
testProperty "satisfy" satisfy,
testProperty "word8" word8,
testProperty "notWord8" notWord8,
testProperty "anyWord8" anyWord8,
testProperty "string" string,
testProperty "skipWhile" skipWhile,
testProperty "takeCount" takeCount,
testProperty "takeWhile" takeWhile,
testProperty "takeWhile1" takeWhile1,
testProperty "takeWhile1_empty" takeWhile1_empty,
testProperty "takeTill" takeTill,
testProperty "endOfInput" endOfInput
]