packages feed

foundation-0.0.20: tests/Test/Foundation/Format/CSV.hs

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
module Test.Foundation.Format.CSV
    ( testFormatCSV
    ) where

import Foundation
import Foundation.Format.CSV
import Foundation.Check
import Foundation.String.Builder (toString)

testFormatCSV :: Test
testFormatCSV = Group "CSV"
    [ Group "field unit tests" $ testFieldEncoding <$> fieldUnitTests
    , Group "row unit tests" $ testRowEncoding <$> rowUnitTests
    ]

  where
    testFieldEncoding (f,r) = Property (show f) $
      let str = toString (fieldStringBuilder f)
       in r === str
    testRowEncoding (row,result) = Property (show row) $
      let str = toString (rowStringBuilder row)
       in result === str

fieldUnitTests :: [(Field, String)]
fieldUnitTests =
    [ (FieldInteger 42, "42")
    , (FieldDouble  1, "1.0")
    , (FieldDouble  0.000001, "1.0e-6")
    , (FieldString  "String" NoEscape, "String")
    , (string "String", "String")
    , (string "with comma,string", "\"with comma,string\"")
    , (FieldString  "multiline\nstring" Escape, "\"multiline\nstring\"")
    , (FieldString  "piece of 12\" by 23\""  DoubleEscape, "\"piece of 12\"\" by 23\"\"\"")
    , (string "supported sizes are: 12\", 13\" and 14\"", "\"supported sizes are: 12\"\", 13\"\" and 14\"\"\"")
    ]

rowUnitTests :: [(Row, String)]
rowUnitTests =
    [ (fromList [toField (42 :: Int), toField ("some string" :: String)], "42,some string")
    , (toRow (42 :: Int, "some string" :: String), "42,some string")
    , ( toRow ( 42 :: Int
              , "some string" :: String
              , "supported sizes are: 12\", 13\" and 14\"" :: String
              )
      , "42,some string,\"supported sizes are: 12\"\", 13\"\" and 14\"\"\""
      )
    , ( toRow ( 42 :: Int
              , "some string" :: String
              , "supported sizes are: 12\", 13\" and 14\"" :: String
              , Just 0.000001 :: Maybe Double
              )
      , "42,some string,\"supported sizes are: 12\"\", 13\"\" and 14\"\"\",1.0e-6"
      )
    , ( toRow ( 42 :: Int
              , "some string" :: String
              , "supported sizes are: 12\", 13\" and 14\"" :: String
              , Just 0.000001 :: Maybe Double
              , Nothing       :: Maybe Char
              )
      , "42,some string,\"supported sizes are: 12\"\", 13\"\" and 14\"\"\",1.0e-6,"
      )
    ]