{-# LANGUAGE DataKinds #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralisedNewtypeDeriving #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE ViewPatterns #-} {-# OPTIONS_GHC -fno-warn-unused-top-binds #-} module Main (main) where import Composite import Composite.Csv import Composite.TH import Data.ByteString.Lazy as LBS import Data.Csv import Data.Proxy import Data.Text import Data.Text.Encoding import Data.Vector import Test.Tasty import Test.Tasty.HUnit withLensesAndProxies [d| type A = "A" :-> Text type B = "B" :-> Double type C = "C" :-> Text type D = "D" :-> Int |] type RecMaybe = Rec Maybe '[A, B, C, D] deriving newtype instance FromField A deriving newtype instance FromField B deriving newtype instance FromField C deriving newtype instance FromField D deriving newtype instance ToField A deriving newtype instance ToField B deriving newtype instance ToField C deriving newtype instance ToField D deriving via (TF Maybe '[A, B, C, D]) instance FromNamedRecord RecMaybe deriving via (TF Maybe '[A, B, C, D]) instance ToNamedRecord RecMaybe rec1 :: RecMaybe rec1 = Just "foo" :^: Just 5e-4 :^: Nothing :^: Just 5 :^: RNil rec2 :: RecMaybe rec2 = Just "bar" :^: Just 100e-10 :^: Just "quux" :^: Just 4 :^: RNil testData :: [RecMaybe] testData = [rec1, rec2] tests :: TestTree tests = testGroup "Parsing Tests" [ testCase "parses Record" $ do a <- LBS.readFile "./test/data/A.csv" let Right (x, toList -> xs) = decodeByName a assertEqual "" testData xs b <- LBS.readFile "./test/data/B.csv" let Right (y, toList -> ys) = decodeByName b assertEqual "" xs ys let a' = encodeByName x xs let Right (a'', toList -> xs') = decodeByName a' assertEqual "" xs xs' let b' = encodeByName (extractRecHeader (Proxy @RecMaybe)) ys let Right (b'', toList -> ys') = decodeByName b' assertEqual "" xs ys' ] main :: IO () main = defaultMain tests