packages feed

aeson-schemas-1.3.0: 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) |]