packages feed

cassava-conduit-0.4.0.2: quickcheck/Test/Data/Csv/Conduit.hs

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell #-}
-------------------------------------------------------------------
-- |
-- Module       : Test.Data.Csv.Conduit
-- Copyright    : (C) 2016
-- License      : BSD-style (see the file etc/LICENSE.md)
-- Maintainer   : Dom De Re
--
-------------------------------------------------------------------
module Test.Data.Csv.Conduit where

import Data.Csv.Conduit

import qualified Data.ByteString as BS
import Data.Csv (HasHeader(..), defaultDecodeOptions)
import Data.Conduit ((.|), runConduit)
import Data.Conduit.List (sourceList, consume)
import Data.Functor ((<$>))
import Data.List (length)

import Control.Applicative (pure)
import Control.Monad (return)

import Test.Arbitrary (
    intCsvNoTrailingNewline
  , intCsvTrailingNewline
  , diceIt
  )

import Test.QuickCheck (Property, (===), forAll, quickCheckAll)
import Test.QuickCheck.Gen (Gen)

import Prelude (
    IO
  , Bool(..)
  , Either
  , Int
  , ($)
  )

parsesAllRows :: Gen (Int, BS.ByteString) -> Property
parsesAllRows g =
  forAll (diceIt g) $ \(expectedRows, chunks) ->
    let
      result :: Either CsvParseError [[Int]]
      result = runConduit
         $ sourceList chunks
        .| fromCsv defaultDecodeOptions NoHeader
        .| consume
    in (length <$> result) === pure expectedRows

prop_parsesAllRowsWithNewline :: Property
prop_parsesAllRowsWithNewline =
  parsesAllRows intCsvTrailingNewline

prop_parsesAllRowsWithNoNewline :: Property
prop_parsesAllRowsWithNoNewline =
  parsesAllRows intCsvNoTrailingNewline

return []
tests :: IO Bool
tests = $quickCheckAll