packages feed

morley-0.4.0: test/Test/Interpreter/ContractOp.hs

-- | Module, containing spec to test contract_op.tz contract.
module Test.Interpreter.ContractOp
  ( test_contract_op
  ) where

import qualified Data.Map as M
import Test.QuickCheck (Property, (===))
import Test.Tasty (TestTree)
import Test.Tasty.QuickCheck (testProperty)

import Michelson.Interpret (ContractEnv(..), ContractReturn)
import Michelson.Test (contractProp, dummyContractEnv, failedProp, testTreesWithTypedContract)
import Michelson.Typed (Contract, ToT, fromVal)
import Michelson.Untyped (CT(..), T(..), Type(..), noAnn)
import Tezos.Address

-- | Spec to test compare.tz contract.
test_contract_op :: IO [TestTree]
test_contract_op =
  testTreesWithTypedContract "contracts/contract_op.tz" $ \contract -> pure
  [ testProperty "contract not found" $
      contractProp' False [] contract
  , testProperty "contract found, expected parameter is int :q, actual is int :q" $
      contractProp' True [(addr, intQ)] contract
  , testProperty "contract found, expected parameter int :q, actual int" $
      contractProp' True [(addr, int)] contract
  , testProperty "contract found, but expected parameter is int :p, actual is int :q" $
      contractProp' False [(addr, intP)] contract
  , testProperty "contract found, but expected parameter is int :p, actual is string" $
      contractProp' False [(addr, string)] contract
  ]
  where
    intQ = Type (Tc CInt) "q"
    int = Type (Tc CInt) noAnn
    intP = Type (Tc CInt) "p"
    string = Type (Tc CString) noAnn

    addr = unsafeParseContractHash "KT1WsLzQ61xtMNJHfwgCHh2RnALGgFAzeSx9"

    validate
      :: Bool
      -> ContractReturn (ToT Bool)
      -> Property
    validate ex (Right ([], fromVal -> l), _) = l === ex
    validate _ (Left _, _) = failedProp "Unexpected fail in interepreter"
    validate _ _ = failedProp "Unexpected result of script execution"

    contractProp' :: Bool -> [(ContractHash, Type)] -> Contract (ToT Address) (ToT Bool) -> Property
    contractProp' res ctrs contract =
      contractProp
        contract
        (validate res)
        dummyContractEnv {ceContracts = M.fromList ctrs}
        (ContractAddress addr)
        False