-- SPDX-FileCopyrightText: 2020 Tocqueville Group
--
-- SPDX-License-Identifier: LicenseRef-MIT-TQ

module Lorentz.Contracts.Upgradeable.Test
  ( -- * Test predicates
    testUpgradeableContractDoc

    -- * Individual test predicates
  , testSingleVersion
  ) where

import Prelude

import Test.HUnit (assertFailure)

import Lorentz.Contracts.Upgradeable.Common
import Lorentz.Test.Doc

-- | Check that contract documentation mentions version only once.
testSingleVersion :: DocTest
testSingleVersion :: DocTest
testSingleVersion =
  HasCallStack =>
String -> (HasCallStack => ContractDoc -> Assertion) -> DocTest
String -> (HasCallStack => ContractDoc -> Assertion) -> DocTest
mkDocTest String
"Version documented" ((HasCallStack => ContractDoc -> Assertion) -> DocTest)
-> (HasCallStack => ContractDoc -> Assertion) -> DocTest
forall a b. (a -> b) -> a -> b
$
  \ContractDoc
doc ->
    case ContractDoc -> [DVersion]
forall d. DocItem d => ContractDoc -> [d]
allContractDocItems @DVersion ContractDoc
doc of
      [] -> String -> Assertion
forall a. HasCallStack => String -> IO a
assertFailure String
"Contract contains no 'DVersion'"
      [DVersion
_] -> Assertion
forall (f :: * -> *). Applicative f => f ()
pass
      [DVersion]
_ -> String -> Assertion
forall a. HasCallStack => String -> IO a
assertFailure String
"Contract contains several 'DVersion's"

-- | Test all properties of upgradeable contract.
testUpgradeableContractDoc :: [DocTest]
testUpgradeableContractDoc :: [DocTest]
testUpgradeableContractDoc = [[DocTest]] -> [DocTest]
forall a. Monoid a => [a] -> a
mconcat
  [ [DocTest]
testLorentzDoc
  , [ DocTest
testSingleVersion
    ]
  ]