{-# LANGUAGE OverloadedStrings #-}
module Main where
import Data.Monoid
import Data.Bifunctor
import Data.Either
import Test.Tasty
import Test.Tasty.HUnit
import Control.Monad
import Control.Applicative
import Control.Monad.Trans.Except
import qualified Data.Text as T
import qualified Data.Attoparsec.Text as A
import qualified Control.Foldl as L
import Control.Foldl.Transduce
import Control.Foldl.Transduce.Attoparsec
main :: IO ()
main = defaultMain tests
stripping :: A.Parser r -> [T.Text] -> Either (ParsingError T.Text) (r,T.Text)
stripping parser ts =
runExcept (L.foldM (transduceM' (stripParse parser) (L.generalize L.mconcat)) ts)
parsing :: A.Parser r -> [T.Text] -> Either (ParsingError T.Text) [r]
parsing parser ts =
runExcept (fmap snd (L.foldM (transduceM' (parses parser) (L.generalize L.list)) ts))
tests :: TestTree
tests =
testGroup "Tests"
[
testGroup "stripPrefix"
[ testCase "empty"
(assertEqual mempty
(Right ((),""))
(stripping (pure ()) [""]))
, testCase "empty2"
(assertEqual mempty
(Right ([],""))
(stripping (many (A.char 'c')) [""]))
, testCase "empty3"
(assertBool mempty
(isLeft (stripping (A.char 'c') [""])))
, testCase "acrossChunks"
(assertEqual mempty
(Right (1111::Int,"aaabb"))
(stripping (A.skipSpace *> A.decimal) [" "," 11", "11aaa", "bb"]))
, testCase "whole"
(assertEqual mempty
(Right ("cccc",""))
(stripping (many (A.char 'c')) ["cc","","cc"]))
, testCase "atEnd"
(assertEqual mempty
(Right (1111::Int,""))
(stripping (A.skipSpace *> A.decimal) [" "," 11", "", "11"]))
]
, testGroup "parses"
[ testCase "empty"
(assertEqual mempty
(Right ([]::[Int]))
(parsing (A.skipSpace *> A.decimal) []))
, testCase "chunks"
(assertEqual mempty
(Right ([1,22,3,4,5]::[Int]))
(parsing (A.skipSpace *> A.decimal) [""," ","1 2","","2",""," 3 4 5"]))
, testCase "whole"
(assertEqual mempty
(Right ([1111]::[Int]))
(parsing (A.skipSpace *> A.decimal) [" 1111"]))
]
]