Safe Haskell | None |
---|---|
Language | Haskell2010 |
Module containing some utilities for testing Michelson contracts using Haskell testing frameworks (hspec and QuickCheck in particular). It's Morley testing EDSL.
Synopsis
- specWithContract :: (Typeable cp, Typeable st) => FilePath -> ((UntypedContract, Contract cp st) -> Spec) -> Spec
- specWithTypedContract :: (Typeable cp, Typeable st) => FilePath -> (Contract cp st -> Spec) -> Spec
- specWithUntypedContract :: FilePath -> (UntypedContract -> Spec) -> Spec
- type ContractReturn s st = (Either MichelsonFailed ([Operation Instr], Val Instr st), InterpreterState s)
- type ContractPropValidator st prop = ContractReturn MorleyLogs st -> prop
- contractProp :: (ToVal param, ToVal storage, ToT param ~ cp, ToT storage ~ st, Typeable cp, Typeable st) => Contract cp st -> ContractPropValidator st prop -> ContractEnv -> param -> storage -> prop
- contractPropVal :: (Typeable cp, Typeable st) => Contract cp st -> ContractPropValidator st prop -> ContractEnv -> Val Instr cp -> Val Instr st -> prop
- type IntegrationalValidator = Either (InterpreterError -> Bool) SuccessValidator
- type SuccessValidator = GState -> [GStateUpdate] -> Either Text ()
- type IntegrationalScenario = IntegrationalScenarioM Validated
- integrationalTestExpectation :: IntegrationalScenario -> Expectation
- integrationalTestProperty :: IntegrationalScenario -> Property
- originate :: UntypedContract -> UntypedValue -> Mutez -> IntegrationalScenarioM Address
- transfer :: TxData -> Address -> IntegrationalScenarioM ()
- validate :: IntegrationalValidator -> IntegrationalScenario
- setMaxSteps :: RemainingSteps -> IntegrationalScenarioM ()
- setNow :: Timestamp -> IntegrationalScenarioM ()
- composeValidators :: SuccessValidator -> SuccessValidator -> SuccessValidator
- composeValidatorsList :: [SuccessValidator] -> SuccessValidator
- expectAnySuccess :: SuccessValidator
- expectStorageUpdate :: Address -> (UntypedValue -> Either Text ()) -> SuccessValidator
- expectStorageUpdateConst :: Address -> UntypedValue -> SuccessValidator
- expectBalance :: Address -> Mutez -> SuccessValidator
- expectStorageConst :: Address -> UntypedValue -> SuccessValidator
- expectGasExhaustion :: InterpreterError -> Bool
- expectMichelsonFailed :: Address -> InterpreterError -> Bool
- data TxData = TxData {
- tdSenderAddress :: !Address
- tdParameter :: !UntypedValue
- tdAmount :: !Mutez
- genesisAddress :: Address
- failedProp :: Text -> Property
- succeededProp :: Property
- qcIsLeft :: Show b => Either a b -> Property
- qcIsRight :: Show a => Either a b -> Property
- dummyContractEnv :: ContractEnv
- minTimestamp :: Timestamp
- maxTimestamp :: Timestamp
- midTimestamp :: Timestamp
Importing a contract
specWithContract :: (Typeable cp, Typeable st) => FilePath -> ((UntypedContract, Contract cp st) -> Spec) -> Spec Source #
Import contract and use it in the spec. Both versions of contract are passed to the callback function (untyped and typed).
If contract's import failed, a spec with single failing expectation will be generated (so tests will run unexceptionally, but a failing result will notify about problem).
specWithTypedContract :: (Typeable cp, Typeable st) => FilePath -> (Contract cp st -> Spec) -> Spec Source #
A version of specWithContract
which passes only the typed
representation of the contract.
specWithUntypedContract :: FilePath -> (UntypedContract -> Spec) -> Spec Source #
Unit testing
type ContractReturn s st = (Either MichelsonFailed ([Operation Instr], Val Instr st), InterpreterState s) Source #
type ContractPropValidator st prop = ContractReturn MorleyLogs st -> prop Source #
Type for contract execution validation.
It's a function which is supplied with contract execution output (failure or new storage with operation list).
Function returns a property which type is designated by type variable prop
and might be Property
or Expectation
or anything else relevant.
contractProp :: (ToVal param, ToVal storage, ToT param ~ cp, ToT storage ~ st, Typeable cp, Typeable st) => Contract cp st -> ContractPropValidator st prop -> ContractEnv -> param -> storage -> prop Source #
Contract's property tester against given input. Takes contract environment, initial storage and parameter, interprets contract on this input and invokes validation function.
contractPropVal :: (Typeable cp, Typeable st) => Contract cp st -> ContractPropValidator st prop -> ContractEnv -> Val Instr cp -> Val Instr st -> prop Source #
Version of contractProp
which takes Val
as arguments instead
of regular Haskell values.
Integrational testing
Testing engine
type IntegrationalValidator = Either (InterpreterError -> Bool) SuccessValidator Source #
Validator for integrational testing.
If an error is expected, it should be Left
with validator for errors.
Otherwise it should check final global state and its updates.
type SuccessValidator = GState -> [GStateUpdate] -> Either Text () Source #
Validator for integrational testing that expects successful execution.
type IntegrationalScenario = IntegrationalScenarioM Validated Source #
integrationalTestExpectation :: IntegrationalScenario -> Expectation Source #
Integrational test that executes given operations and validates
them using given validator. It can fail using Expectation
capability.
It starts with initGState
and some reasonable dummy values for
gas limit and current timestamp. You can update blockchain state
by performing some operations.
integrationalTestProperty :: IntegrationalScenario -> Property Source #
Integrational test similar to integrationalTestExpectation
.
It can fail using Property
capability.
It can be used with QuickCheck's forAll
to make a
property-based test with arbitrary data.
originate :: UntypedContract -> UntypedValue -> Mutez -> IntegrationalScenarioM Address Source #
Originate a contract with given initial storage and balance. Its address is returned.
transfer :: TxData -> Address -> IntegrationalScenarioM () Source #
Transfer tokens to given address.
validate :: IntegrationalValidator -> IntegrationalScenario Source #
Execute all operations that were added to the scenarion since
last validate
call. If validator fails, the execution will be aborted.
setMaxSteps :: RemainingSteps -> IntegrationalScenarioM () Source #
Make all further interpreter calls (which are triggered by the
validate
function) use given gas limit.
setNow :: Timestamp -> IntegrationalScenarioM () Source #
Make all further interpreter calls (which are triggered by the
validate
function) use given timestamp as the current one.
Validators
composeValidators :: SuccessValidator -> SuccessValidator -> SuccessValidator Source #
Compose two success validators.
For example:
expectBalance bal addr composeValidators
expectStorageUpdateConst addr2 ValueUnit
composeValidatorsList :: [SuccessValidator] -> SuccessValidator Source #
Compose a list of success validators.
expectAnySuccess :: SuccessValidator Source #
SuccessValidator
that always passes.
expectStorageUpdate :: Address -> (UntypedValue -> Either Text ()) -> SuccessValidator Source #
Check that storage value is updated for given address. Takes a predicate that is used to check the value.
It works even if updates are not filtered (i. e. a value can be updated more than once).
expectStorageUpdateConst :: Address -> UntypedValue -> SuccessValidator Source #
Like expectStorageUpdate
, but expects a constant.
expectBalance :: Address -> Mutez -> SuccessValidator Source #
Check that eventually address has some particular balance.
expectStorageConst :: Address -> UntypedValue -> SuccessValidator Source #
Check that eventually address has some particular storage value.
expectGasExhaustion :: InterpreterError -> Bool Source #
Check that interpreter failed due to gas exhaustion.
expectMichelsonFailed :: Address -> InterpreterError -> Bool Source #
Expect that interpretation of contract with given address ended with [FAILED].
Various
Data associated with a particular transaction.
TxData | |
|
genesisAddress :: Address Source #
Initially this address has a lot of money.
General utilities
succeededProp :: Property Source #
A Property
that always succeeds.
Dummy values
dummyContractEnv :: ContractEnv Source #
Dummy ContractEnv
with some reasonable hardcoded values. You
can override values you are interested in using record update
syntax.
Arbitrary data
minTimestamp :: Timestamp Source #
Minimal (earliest) timestamp used for Arbitrary (CVal 'CTimestamp)
maxTimestamp :: Timestamp Source #
Maximal (latest) timestamp used for Arbitrary (CVal 'CTimestamp)
midTimestamp :: Timestamp Source #
Median of minTimestamp
and maxTimestamp
.
Useful for testing (exactly half of generated dates will be before and after
this date).