{-# LANGUAGE DataKinds #-} {-# OPTIONS_GHC -Wno-orphans #-} module Main (main) where import Test.Tasty import Test.Tasty.HUnit import qualified Data.ByteString.Char8 as BS8 import qualified Data.ByteString.Lazy as LBS import qualified Data.Vector as V import Data.Csv (decodeByName, encodeByName, header) import Polytropos import Polytropos.Cassava () type MyRec = Record '[ "x" ':= Int, "y" ':= Int, "z" ':= Int ] -- A heterogeneous row: each field uses its own ToField/FromField instance. type Hetero = Record '[ "n" ':= Int, "w" ':= Word, "m" ':= Int ] myRec :: MyRec myRec = REC { x = 1, y = 2, z = 3 } heteroRec :: Hetero heteroRec = REC { n = 7, w = 9, m = 11 } type RowOf12 = '[ "c00" ':= Int, "c01" ':= Int, "c02" ':= Int, "c03" ':= Int , "c04" ':= Int, "c05" ':= Int, "c06" ':= Int, "c07" ':= Int , "c08" ':= Int, "c09" ':= Int, "c10" ':= Int, "c11" ':= Int ] buildWide :: Int -> Record RowOf12 buildWide n = insertField (Field @"c00") n $ insertField (Field @"c01") n $ insertField (Field @"c02") n $ insertField (Field @"c03") n $ insertField (Field @"c04") n $ insertField (Field @"c05") n $ insertField (Field @"c06") n $ insertField (Field @"c07") n $ insertField (Field @"c08") n $ insertField (Field @"c09") n $ insertField (Field @"c10") n $ insertField (Field @"c11") n $ emptyRecord recNames :: [BS8.ByteString] recNames = map BS8.pack ["x", "y", "z"] wideNames :: [BS8.ByteString] wideNames = map BS8.pack ["c00","c01","c02","c03","c04","c05","c06","c07","c08","c09","c10","c11"] heteroNames :: [BS8.ByteString] heteroNames = map BS8.pack ["n", "w", "m"] main :: IO () main = defaultMain $ testGroup "Cassava Integration" [ testGroup "Named record codecs" [ testCase "roundtrip 3 fields" $ decodeByName (encodeByName (header recNames) [myRec]) @?= Right (header recNames, V.singleton myRec) , testCase "roundtrip 12 fields" $ do let wide = buildWide (42 :: Int) decodeByName (encodeByName (header wideNames) [wide]) @?= Right (header wideNames, V.singleton wide) , testCase "heterogeneous row roundtrip" $ decodeByName (encodeByName (header heteroNames) [heteroRec]) @?= Right (header heteroNames, V.singleton heteroRec) , testCase "encodes header + row shape" $ LBS.toStrict (encodeByName (header recNames) [myRec]) @?= BS8.pack "x,y,z\r\n1,2,3\r\n" ] ]