candid-0.1: test/THTests.hs
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE QuasiQuotes #-}
module THTests (thTests) where
import qualified Data.Text as T
import Test.Tasty
import Test.Tasty.HUnit
import Data.Row
import Codec.Candid
thTests :: TestTree
thTests = testGroup "Using TH interface"
[ testCase "demo1: direct" $ do
x <- greet1 .! #greet $ "World"
x @?= "Hello World"
, testCase "demo1: via toCandidService" $ do
x <- greet2 .! #greet $ "World"
x @?= "World"
, testCase "demo2" $ do
x <- demo2 .! #greet $ ("World", True)
x @?= "WorldTrue"
, testCase "demo3" $ do
x <- demo3 .! #greet $ ("World", True)
x @?= "WorldTrue"
]
-- NB: Fields in the wrong order
type Demo1 m = [candid|service : { "greet": (text) -> (text); "a" : () -> () } |]
greet1 :: Monad m => Rec (Demo1 m)
greet1 = #a .== (\() -> return ()) .+ #greet .== (\who -> return $ "Hello " <> who)
greet2 :: forall m. Monad m => Rec (Demo1 m)
greet2 = toCandidService error (\_ x -> return x)
type Demo2 m = [candid| service : { "greet": (text, bool) -> (text); } |]
demo2 :: Monad m => Rec (Demo2 m)
demo2 = #greet .== \(who, b) -> return $ who <> T.pack (show b)
-- NB type definitions:
type Demo3 m = [candid| type t = text; service : { "greet": (t, bool) -> (t); } |]
demo3 :: Monad m => Rec (Demo3 m)
demo3 = demo2