dsv-1.0.0.0: test/DSV/Tests/FileFoldCsv.hs
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}
module DSV.Tests.FileFoldCsv where
import DSV.TestPrelude
import qualified Control.Foldl as L
import Data.Sequence (Seq)
import qualified Data.Sequence as Seq
group :: Group
group = $$(discover)
sumPricesWithoutHeader :: L.Fold (Vector ByteString) Rational
sumPricesWithoutHeader =
L.premap
(viewOr 0 $ byteStringDollarsView <<<- columnNumberView 3)
L.sum
sumPricesWithZippedHeader :: L.Fold (Vector (ByteString, ByteString)) Rational
sumPricesWithZippedHeader =
L.premap
(viewOr 0 $ byteStringDollarsView <<<- lookupView (== "Price"))
L.sum
writeNamesAndCountWithoutHeader :: IORef (Seq ByteString) -> L.FoldM IO (Vector ByteString) Int
writeNamesAndCountWithoutHeader r =
L.mapM_ (traverse_ write . nthVectorElement 4) *>
L.generalize L.length
where
write x = modifyIORef r (<> Seq.singleton x)
writeNamesAndCountWithZippedHeader :: IORef (Seq ByteString) -> L.FoldM IO (Vector (ByteString, ByteString)) Int
writeNamesAndCountWithZippedHeader r =
L.mapM_ (traverse_ write . vectorLookup (== "Product")) *>
L.generalize L.length
where
write x = modifyIORef r (<> Seq.singleton x)
-- Corresponds to the example in the documentation for 'foldCsvFileWithoutHeader'.
prop_foldPrice_withoutHeader_doc = example $
do
result <- liftIO $
do
fp <- getDataFileName "test-data/doc-example-without-header.csv"
foldCsvFileWithoutHeader fp sumPricesWithoutHeader
result === (ParseComplete, 624.84)
-- Corresponds to the example in the documentation for 'foldCsvFileWithoutHeaderM'.
prop_foldPriceM_withoutHeader_doc = example $
do
result <- liftIO $
do
r <- newIORef Seq.empty
fp <- getDataFileName "test-data/doc-example-without-header.csv"
(t, n) <- foldCsvFileWithoutHeaderM fp (writeNamesAndCountWithoutHeader r)
rs <- readIORef r
return (t, toList rs, n)
result === (ParseComplete, ["Dehydrated boulders", "Earthquake pills"], 2)
-- Corresponds to the example in the documentation for 'foldCsvFileIgnoringHeader'.
prop_foldPrice_ignoringHeader_doc = example $
do
result <- liftIO $
do
fp <- getDataFileName "test-data/doc-example-with-header.csv"
foldCsvFileIgnoringHeader fp sumPricesWithoutHeader
result === (ParseComplete, 624.84)
-- Corresponds to the example in the documentation for 'foldCsvFileIgnoringHeaderM'.
prop_foldPriceM_ignoringHeader_doc = example $
do
result <- liftIO $
do
r <- newIORef Seq.empty
fp <- getDataFileName "test-data/doc-example-with-header.csv"
(t, n) <- foldCsvFileIgnoringHeaderM fp (writeNamesAndCountWithoutHeader r)
rs <- readIORef r
return (t, toList rs, n)
result === (ParseComplete, ["Dehydrated boulders", "Earthquake pills"], 2)
-- Corresponds to the example in the documentation for 'foldCsvFileWithZippedHeader'.
prop_foldPrice_withZippedHeader_doc = example $
do
result <- liftIO $
do
fp <- getDataFileName "test-data/doc-example-with-header.csv"
foldCsvFileWithZippedHeader fp sumPricesWithZippedHeader
result === (ParseComplete, 624.84)
-- Corresponds to the example in the documentation for 'foldCsvFileWithZippedHeaderM'.
prop_foldPriceM_withZippedHeader_doc = example $
do
result <- liftIO $
do
r <- newIORef Seq.empty
fp <- getDataFileName "test-data/doc-example-with-header.csv"
(t, n) <- foldCsvFileWithZippedHeaderM fp (writeNamesAndCountWithZippedHeader r)
rs <- readIORef r
return (t, toList rs, n)
result === (ParseComplete, ["Dehydrated boulders", "Earthquake pills"], 2)