{-# LANGUAGE DataKinds , FlexibleContexts , OverloadedStrings , TemplateHaskell #-} module Test.KeyValue where import Prelude hiding (lines) import Test.Common import Test.Instances () import Test.Types import Pipes.KeyValueCsv.Common import Pipes.KeyValueCsv.KeyValue 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 Data.Monoid import qualified Data.Text as Text import Data.Text.Lazy.Builder import Data.Reflection import Data.Validation import Data.Vinyl import Data.Vinyl.Functor 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 r = pure r === useDelimiter delim parsed & counterexample (concat. map Text.unpack $ Pipes.toList pipe) where names :: Rec (Const Text) TestFields names = Const "foo" :& Const "bar" :& Const "baz" :& RNil pipe :: Producer Text Transformers.Identity () pipe = fromLazy . toLazyText . mconcat . intersperse (singleton '\n') . zipWith keyValue (map fromText $ recordToList names) $ build r keyValue k v = k <> singleton delim <> v parsed :: Given Delimiter => AccValidation [KeyValueError] (Rec Id TestFields) parsed = rtraverse1 . fst . Transformers.runIdentity . parseKeyValues (def & keyNames .~ names) $ lines pipe return [] test :: IO Bool test = $quickCheckAll