packages feed

cauldron-0.7.0.0: test/argsTests.hs

{-# LANGUAGE ApplicativeDo #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoFieldSelectors #-}

module Main (main) where

import Cauldron
import Cauldron.Args
import Control.Exception
import Data.Dynamic
import Data.Function ((&))
import Data.Proxy
import Data.Typeable (typeRep)
import Test.Tasty
import Test.Tasty.HUnit

type Text = String

data A = A

data B = B

data C = C

makeC :: A -> B -> ([Text], C)
makeC _ _ = (["monoid"], C)

argsForC :: Args (Regs C)
argsForC = do
  ~(reg1, bean) <- makeC <$> arg <*> arg
  tell1 <- foretellReg
  pure do
    tell1 reg1
    pure bean

data L1 = L1

data L2 = L2

makeL2 :: L1 -> L2
makeL2 !L1 = L2

throwyArgs :: Args L2
throwyArgs = makeL2 <$> arg

tests :: TestTree
tests =
  testGroup
    "All"
    [ testCase "withRegs" do
        let (beans, C) =
              argsForC
                & runArgs (taste $ fromDynList [toDyn A, toDyn B])
                & runRegs (getRegsReps argsForC)
        Just m <- pure do taste @[Text] beans
        assertEqual
          "monoid"
          ["monoid"]
          m,
      testCase "throwy" do
        r <- try $ evaluate $ runArgs Nothing throwyArgs
        case r of
          Left (LazilyReadBeanMissing tr) | tr == (typeRep (Proxy @L1)) -> pure ()
          _ -> assertFailure "expected exception did not happen"
    ]

main :: IO ()
main = defaultMain tests