|
Hegel 0.11.4
Property-based testing for C++
|
Stateful (model-based) property testing. More...
Classes | |
| class | VariablesGenerator |
| class | Pool |
| A pool of previously generated values. A pool lets data flow from one rule to another, so a rule can act on a handle or identifier that an earlier rule produced rather than on a freshly drawn value. More... | |
| class | Rule |
| A rule is one possible action in a stateful test. More... | |
| class | Invariant |
| An invariant is a predicate that must hold at any point in the stateful test. They are evaluated on the initial state and after every valid step. The invariant function should throw when the invariant is violated. More... | |
| struct | StateMachineParams |
| Arguments for the StateMachine constructor. More... | |
| class | StateMachine |
| Base class for a state machine. Holds the state and declares the rules and the invariants that act on it. More... | |
| struct | RunParams |
| Options for run. More... | |
| class | Generator |
| The base class of all generators. More... | |
| struct | IGenerator |
| Base interface for generators. More... | |
Functions | |
Variable pools | |
| template<typename T> | |
| Generator< T > | values_consumed (Pool< T > &p) |
| Returns a value from the pool and removes it. | |
| template<typename T> | |
| Generator< T > | values_reusable (Pool< T > &p) |
| Returns a value from the pool without removing it. | |
| template<typename M> | |
| void | run (M &machine, TestCase &tc, const RunParams ¶ms={}) |
Executes a stateful test by repeatedly applying randomly chosen rules from machine to it and checking machine's invariants before the first step and after every valid step. Rules mutate machine in place. Raises std::invalid_argument if the machine declares no rules. | |
Stateful (model-based) property testing.
A stateful test exercises a system through a sequence of randomly chosen actions ("rules") applied to a state machine. Derive a machine from StateMachine and define its rules(). Each Rule is a name and a step function that performs one application of the rule, drawing any arguments it needs from the test case and mutating the machine. Invariants are predicates on the machine evaluated before any step is run and after every successful step. An invariant must throw when violated.
To run a state machine, pass an instance to run inside a hegel::test. Examples in this documentation assume the alias namespace gs = hegel::generators;.
Example: an integer stack.
| void hegel::stateful::run | ( | M & | machine, |
| TestCase & | tc, | ||
| const RunParams & | params = {} ) |
Executes a stateful test by repeatedly applying randomly chosen rules from machine to it and checking machine's invariants before the first step and after every valid step. Rules mutate machine in place. Raises std::invalid_argument if the machine declares no rules.
On a failing replay, each applied rule prints as "Step N: <name>". A violated invariant prints "Invariant <name> violated after step M" or "Invariant <name> violated in the initial state".
| M | The state-machine type, deriving from StateMachine |
| machine | The state machine, initialized by the caller and mutated by its rules |
| tc | The test case object |
| params | Options for the run. See RunParams. |
Returns a value from the pool and removes it.
| T | Element type |
| p | The pool to draw from |
Returns a value from the pool without removing it.
| T | Element type |
| p | The pool to draw from |