use super::helpers::*;
use std::time::Duration;
#[test]
fn zero_delay_timer() {
let history = vec![started_event(1)]; let mut engine = create_engine(history);
let result = execute(&mut engine, SingleTimerHandler::new(Duration::ZERO));
assert_continue(&result);
assert!(has_timer_action(&engine), "Timer should be pending");
}
#[test]
fn empty_activity_input() {
let history = vec![
started_event(1), activity_scheduled(2, "Task", ""), activity_completed(3, 2, "result"), ];
let mut engine = create_engine(history);
let result = execute(&mut engine, SingleActivityHandler::new("Task", ""));
assert_completed(&result, "result");
}
#[test]
fn large_result_string() {
let large_result = "x".repeat(1_000_000); let history = vec![
started_event(1), activity_scheduled(2, "Task", "input"), activity_completed(3, 2, &large_result), ];
let mut engine = create_engine(history);
let result = execute(&mut engine, SingleActivityHandler::new("Task", "input"));
assert_completed(&result, &large_result);
}
#[test]
fn handler_invoked_once() {
let history = vec![started_event(1)]; let mut engine = create_engine(history);
let handler = CountingHandler::new(Ok("done".to_string()));
let result = execute(&mut engine, handler.clone());
assert_completed(&result, "done");
assert_eq!(handler.count(), 1, "Handler should be invoked exactly once");
}
#[test]
fn handler_invoked_once_during_replay() {
let history = vec![
started_event(1), activity_scheduled(2, "Task", "input"), activity_completed(3, 2, "result"), ];
let mut engine = create_engine(history);
let _counting = CountingHandler::new(Ok("done".to_string()));
let result = execute(&mut engine, SingleActivityHandler::new("Task", "input"));
assert_completed(&result, "result");
}
#[test]
fn empty_external_event_data() {
let history = vec![
started_event(1), external_subscribed(2, "Event"), external_event(3, "Event", ""), ];
let mut engine = create_engine(history);
let result = execute(&mut engine, WaitExternalHandler::new("Event"));
assert_completed(&result, "");
}
#[test]
fn multiple_external_events_same_name() {
let history = vec![
started_event(1), external_subscribed(2, "Event"), external_event(3, "Event", "first-data"), external_event(4, "Event", "second-data"), ];
let mut engine = create_engine(history);
let result = execute(&mut engine, WaitExternalHandler::new("Event"));
assert_completed(&result, "first-data");
}
#[test]
fn made_progress_after_completion() {
let history = vec![
started_event(1), activity_scheduled(2, "Task", "input"), ];
let mut engine = create_engine(history);
assert!(!engine.made_progress(), "No progress initially");
engine.prep_completions(vec![activity_completed_msg(2, "result")]);
assert!(engine.made_progress(), "Should have progress after completion");
}
#[test]
fn final_history_combines_baseline_and_delta() {
let history = vec![started_event(1)]; let mut engine = create_engine(history);
let result = execute(&mut engine, SingleActivityHandler::new("Task", "input"));
assert_continue(&result);
let final_hist = engine.final_history();
assert_eq!(final_hist.len(), 2, "Should have Started + ActivityScheduled");
assert!(matches!(
&final_hist[0].kind,
duroxide::EventKind::OrchestrationStarted { .. }
));
assert!(matches!(
&final_hist[1].kind,
duroxide::EventKind::ActivityScheduled { .. }
));
}