Skip to content

Commit ea2146e

Browse files
Allow closures for transitions
1 parent 80838eb commit ea2146e

File tree

1 file changed

+22
-17
lines changed

1 file changed

+22
-17
lines changed

proptest-state-machine/src/strategy.rs

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ use proptest::test_runner::TestRunner;
4242
/// The reference state machine generation runs before the generated transitions
4343
/// are attempted to be executed against the SUT (the concrete state machine)
4444
/// as defined by [`crate::StateMachineTest`].
45-
pub trait ReferenceStateMachine {
45+
pub trait ReferenceStateMachine: 'static {
4646
/// The reference state machine's state type. This should contain the minimum
4747
/// required information needed to implement the state machine. It is used
4848
/// to drive the generations of transitions to decide which transitions are
@@ -140,28 +140,33 @@ pub trait ReferenceStateMachine {
140140
/// any.
141141
pub struct Sequential<State, Transition, StateStrategy, TransitionStrategy> {
142142
size: SizeRange,
143-
init_state: fn() -> StateStrategy,
144-
preconditions: fn(state: &State, transition: &Transition) -> bool,
145-
transitions: fn(state: &State) -> TransitionStrategy,
146-
next: fn(state: State, transition: &Transition) -> State,
143+
init_state: Arc<dyn Fn() -> StateStrategy>,
144+
preconditions: Arc<dyn Fn(&State, &Transition) -> bool>,
145+
transitions: Arc<dyn Fn(&State) -> TransitionStrategy>,
146+
next: Arc<dyn Fn(State, &Transition) -> State>,
147147
}
148148

149149
impl<State, Transition, StateStrategy, TransitionStrategy>
150150
Sequential<State, Transition, StateStrategy, TransitionStrategy>
151+
where
152+
State: 'static,
153+
Transition: 'static,
154+
StateStrategy: 'static,
155+
TransitionStrategy: 'static,
151156
{
152157
pub fn new(
153158
size: SizeRange,
154-
init_state: fn() -> StateStrategy,
155-
preconditions: fn(state: &State, transition: &Transition) -> bool,
156-
transitions: fn(state: &State) -> TransitionStrategy,
157-
next: fn(state: State, transition: &Transition) -> State,
159+
init_state: impl Fn() -> StateStrategy + 'static,
160+
preconditions: impl Fn(&State, &Transition) -> bool + 'static,
161+
transitions: impl Fn(&State) -> TransitionStrategy + 'static,
162+
next: impl Fn(State, &Transition) -> State + 'static,
158163
) -> Self {
159164
Self {
160165
size,
161-
init_state,
162-
preconditions,
163-
transitions,
164-
next,
166+
init_state: Arc::new(init_state),
167+
preconditions: Arc::new(preconditions),
168+
transitions: Arc::new(transitions),
169+
next: Arc::new(next),
165170
}
166171
}
167172
}
@@ -231,8 +236,8 @@ impl<
231236
initial_state,
232237
is_initial_state_shrinkable: true,
233238
last_valid_initial_state,
234-
preconditions: self.preconditions,
235-
next: self.next,
239+
preconditions: self.preconditions.clone(),
240+
next: self.next.clone(),
236241
transitions,
237242
acceptable_transitions,
238243
included_transitions,
@@ -288,9 +293,9 @@ pub struct SequentialValueTree<
288293
/// to back to it in case the shrinking is rejected.
289294
last_valid_initial_state: State,
290295
/// The pre-conditions predicate
291-
preconditions: fn(&State, &Transition) -> bool,
296+
preconditions: Arc<dyn Fn(&State, &Transition) -> bool>,
292297
/// The function from current state and a transition to an updated state
293-
next: fn(State, &Transition) -> State,
298+
next: Arc<dyn Fn(State, &Transition) -> State>,
294299
/// The list of transitions' value trees
295300
transitions: Vec<TransitionValueTree>,
296301
/// The sequence of included transitions with their shrinking state

0 commit comments

Comments
 (0)