{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralisedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -fno-warn-unused-top-binds #-}
module Main (main) where
import Composite
import Composite.CoRecord hiding (Op)
import Composite.Dhall
import Composite.Dhall.CoRecord ()
import Composite.TH
import Data.Functor.Contravariant
import Data.Functor.Identity
import Data.Text
import Dhall as D hiding (field)
import Test.Tasty
import Test.Tasty.HUnit
withLensesAndProxies
[d|
type A = "a" :-> Text
type B = "b" :-> Int
|]
type RecId = Record '[A, B]
type CoRecId = CoRec Identity '[A, B]
type RecMaybe = Rec Maybe '[A, B]
type RecList = Rec [] '[A, B]
recId :: RecId
recId = "foo" :*: 5 :*: RNil
coRecId :: CoRecId
coRecId = field @A "foo"
coRecId2 :: CoRecId
coRecId2 = field @B 5
recMaybe :: RecMaybe
recMaybe = Just "foo" :^: Just 5 :^: RNil
recList :: RecList
recList = ["foo", "bar"] :^: [5, 4] :^: RNil
newtype Templates = Templates {unTemplates :: Rec TextTemplate '[A, B]}
deriving (FromDhall) via (Rec (Op Text) '[A, B])
tests :: TestTree
tests =
testGroup
"Parsing Tests"
[ testCase "parses Record" $ do
x <- input auto "./test/data/A.dhall"
assertEqual "" recId x,
testCase "parses Maybe Rec" $ do
x <- input auto "./test/data/B.dhall"
assertEqual "" recMaybe x,
testCase "parses Contravariant" $ do
(_ :: Templates) <- input auto "./test/data/C.dhall"
pure (),
testCase "parses List Rec" $ do
x <- input auto "./test/data/D.dhall"
assertEqual "" recList x,
testCase "parses CoRec" $ do
x <- input auto "./test/data/E.dhall"
assertEqual "" coRecId x
y <- input auto "./test/data/F.dhall"
assertEqual "" coRecId2 y
]
main :: IO ()
main = defaultMain tests