use agent_sdk_foundation::{AgentEvent, SequenceCounter, ThreadId};
proptest::proptest! {
#[test]
fn sequence_counter_is_contiguous_from_any_offset(
offset in 0u64..1_000_000,
count in 0usize..256,
) {
let counter = SequenceCounter::with_offset(offset);
let drawn: Vec<u64> = (0..count).map(|_| counter.next()).collect();
for (i, value) in drawn.iter().enumerate() {
let expected = offset + u64::try_from(i).expect("index fits u64");
proptest::prop_assert_eq!(*value, expected);
}
}
}
mod state_machine {
use agent_sdk_foundation::SequenceCounter;
use proptest::prelude::*;
use proptest_state_machine::{ReferenceStateMachine, StateMachineTest};
#[derive(Clone, Debug)]
enum Transition {
Next,
}
struct CounterModel;
impl ReferenceStateMachine for CounterModel {
type State = u64;
type Transition = Transition;
fn init_state() -> BoxedStrategy<Self::State> {
Just(0u64).boxed()
}
fn transitions(_state: &Self::State) -> BoxedStrategy<Self::Transition> {
Just(Transition::Next).boxed()
}
fn apply(state: Self::State, transition: &Self::Transition) -> Self::State {
match transition {
Transition::Next => state + 1,
}
}
}
struct CounterSut {
counter: SequenceCounter,
expected_next: u64,
}
impl StateMachineTest for CounterSut {
type SystemUnderTest = Self;
type Reference = CounterModel;
fn init_test(_ref_state: &u64) -> Self::SystemUnderTest {
Self {
counter: SequenceCounter::new(),
expected_next: 0,
}
}
fn apply(
mut state: Self::SystemUnderTest,
_ref_state: &u64,
transition: Transition,
) -> Self::SystemUnderTest {
match transition {
Transition::Next => {
let got = state.counter.next();
assert_eq!(
got, state.expected_next,
"counter diverged from reference model",
);
state.expected_next += 1;
}
}
state
}
}
proptest_state_machine::prop_state_machine! {
#[test]
fn sequence_counter_matches_reference_model(
sequential 1..50 => CounterSut
);
}
}
#[test]
fn agent_event_start_serializes_to_stable_shape() {
let event = AgentEvent::Start {
thread_id: ThreadId::from_string("thread-fixture-001"),
turn: 1,
};
insta::assert_json_snapshot!(event);
}