packages feed

aeson-schemas-1.3.4: test/Tests/GetQQ/TH.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}

module Tests.GetQQ.TH where

import Control.DeepSeq (deepseq)
import Data.Aeson.QQ (aesonQQ)
import Language.Haskell.TH.Quote (QuasiQuoter (..))
import Language.Haskell.TH.TestUtils (
  MockedMode (..),
  QMode (..),
  QState (..),
  runTestQ,
  runTestQErr,
 )

import Data.Aeson.Schema (Object, get, schema)
import TestUtils (mkExpQQ, parseValue)
import TestUtils.DeepSeq ()

-- For testing namespaced object
testData :: Object [schema| { foo: Maybe Int } |]
testData = parseValue [aesonQQ| { "foo": null } |]

qState :: QState 'FullyMocked
qState =
  QState
    { mode = MockQ
    , knownNames = []
    , reifyInfo = []
    }

{- | Run the `get` quasiquoter at both runtime and compile-time, to get coverage.

 The `get` Quasiquoter doesn't reify anything, so this should work.
-}
runGet :: QuasiQuoter
runGet = mkExpQQ $ \s -> [|runTestQ qState (quoteExp get s) `deepseq` $(quoteExp get s)|]

getErr :: QuasiQuoter
getErr = mkExpQQ $ \s -> [|runTestQErr qState (quoteExp get s)|]