packages feed

pipes-key-value-csv-0.2.0.0: test/Test/Csv.hs

{-# LANGUAGE 
    DataKinds 
  , FlexibleContexts
  , TemplateHaskell
  #-}

module Test.Csv where

import Prelude hiding (lines)
import Test.Common
import Test.Instances ()
import Test.Types

import Pipes.KeyValueCsv.Common
import Pipes.KeyValueCsv.Csv
import Pipes.KeyValueCsv.Types

import Control.Lens hiding (Const)
import qualified Data.Functor.Identity as Transformers
import Data.Default.Class
import Data.List hiding (lines)
import qualified Data.Text as Text
import Data.Text.Lazy.Builder
import Data.Reflection
import Data.Validation
import Data.Vinyl
import Data.Vinyl.Utils.Compose
import Test.QuickCheck
import qualified Pipes.Prelude as Pipes
import Pipes.Text (fromLazy)

delim :: Char
delim = ','

type TestFields = '[Int, Alphabetic, Quoted]

prop_read :: [Rec Id TestFields] -> Property
prop_read rs = map pure rs === useDelimiter delim parsed
    & counterexample (concat. map Text.unpack $ Pipes.toList pipe)
  where
    pipe :: Producer Text Transformers.Identity ()
    pipe = 
        fromLazy 
      . toLazyText 
      . mconcat 
      . intersperse (singleton '\n')
      $ map (buildDelimited delim) rs
    parsed :: Given Delimiter => [AccValidation [CsvError] (Rec Id TestFields)]
    parsed =
        map rtraverse1
      . Pipes.toList
      . parseCsv def
      $ lines pipe

return []

test :: IO Bool
test = $quickCheckAll