packages feed

sv-cassava-0.2: tests/tests.hs

{-# LANGUAGE OverloadedStrings #-}

module Main (main) where

import Control.Monad (when)
import Data.ByteString (ByteString)
import qualified Data.Csv as Cassava
import Data.Sv.Cassava
import Data.Sv.Structure.Core (Headedness (Headed, Unheaded))
import qualified Data.Sv.Decode.Core as D
import Data.Text (Text)
import qualified Data.Vector as V
import System.Exit (exitFailure)
import Test.HUnit

data TestRow = TestRow Int Double Text deriving (Eq, Show)

testRowDec :: D.Decode' ByteString TestRow
testRowDec = TestRow <$> D.int <*> D.double <*> D.utf8

bs1 :: ByteString
bs1 = mconcat
  [ "1,5.5,hello\n"
  , "2,-3.54,\n"
  , "3,42.0,\"Text in quotes\"\n"
  ]

bs2 :: ByteString
bs2 = hdr `mappend` bs1
  where
    hdr = "id, number, name\n"

csv1 :: Cassava.Csv
csv1 = V.fromList . fmap V.fromList $
  [ ["1","5.5","hello"]
  , ["2","-3.54", ""]
  , ["3", "42.0", "Text in quotes"]
  ]

decoded1 :: [TestRow]
decoded1 =
  [ TestRow 1 5.5 "hello"
  , TestRow 2 (-3.54) ""
  , TestRow 3 42 "Text in quotes"
  ]

parseTest :: Test
parseTest = TestLabel "parse" . TestCase $
  parseCassava Cassava.defaultDecodeOptions bs1 @?= pure csv1

decodeTest :: Test
decodeTest = TestLabel "decode" . TestCase $
  decodeFromCassava testRowDec csv1 @?= pure decoded1

parseDecodeTest :: Test
parseDecodeTest = TestLabel "parse+decode" . TestList $
  [ TestLabel "unheaded" . TestCase $
      parseDecodeFromCassava testRowDec Unheaded Cassava.defaultDecodeOptions bs1 @?=
        pure decoded1
  , TestLabel "headed" . TestCase $
      parseDecodeFromCassava testRowDec Headed Cassava.defaultDecodeOptions bs2 @?=
        pure decoded1
  ]

tests :: Test
tests = TestList [parseTest, decodeTest, parseDecodeTest]

main :: IO ()
main = do
  cs <- runTestTT tests
  when (errors cs > 0 || failures cs > 0)
    exitFailure