webcrank-0.2.0.1: test/ParserTests.hs
{-# LANGUAGE OverlappingInstances #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module ParserTests where
import Control.Applicative
import Data.Attoparsec.ByteString.Char8
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as B
import Data.CaseInsensitive (CI)
import qualified Data.CaseInsensitive as CI
import Test.Tasty
import Test.Tasty.QuickCheck
import Test.Tasty.HUnit
import Webcrank.Internal
instance Arbitrary ByteString where
arbitrary = B.pack <$> arbitrary
instance (Arbitrary s, CI.FoldCase s) => Arbitrary (CI s) where
arbitrary = CI.mk <$> arbitrary
parserTests :: TestTree
parserTests = testGroup "parser tests"
[ csl1Tests
]
testParse :: (Eq a, Show a) => Parser a -> ByteString -> Maybe a -> TestTree
testParse p s e = testCase (show s) (either (const Nothing) Just (parseOnly p s) @?= e)
csl1Tests :: TestTree
csl1Tests = testGroup "csl1"
[ testCsl1 "foo,bar" (Just ["foo", "bar"])
, testCsl1 "foo ,bar," (Just ["foo", "bar"])
, testCsl1 "foo, ,bar,charlie " (Just ["foo", "bar", "charlie"])
, testCsl1 ", foo, ,bar" (Just ["foo", "bar"])
, testCsl1 "" Nothing
, testCsl1 "," Nothing
, testCsl1 ", ," Nothing
]
testCsl1 :: ByteString -> Maybe [ByteString] -> TestTree
testCsl1 = testParse (csl1 tokenP)