{-# 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