packages feed

foldl-transduce-attoparsec-0.1.0.0: tests/tests.hs

{-# 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"]))
        ]   
    ]