use crate::execution::phase::UncheckedActiveExecutor;
use crate::execution::strategy::{ContinueStrategy, ContinuousStrategyResult};
use crate::modeling::model::Model;
#[derive(Clone)]
pub struct AlwaysContinueStrategy;
impl Default for AlwaysContinueStrategy {
fn default() -> Self {
Self::new()
}
}
impl<E, M: Model<E>, RunnerError> ContinueStrategy<E, M, RunnerError> for AlwaysContinueStrategy {
type Err = RunnerError;
fn handle_micro_step_continue(
&mut self,
_model: &M,
unchecked: UncheckedActiveExecutor<E, M>,
) -> ContinuousStrategyResult<E, M, Self::Err> {
Ok(unchecked.into_active_executor())
}
}
impl AlwaysContinueStrategy {
pub fn new() -> Self {
Self
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::context::{ActiveExecutorContext, EventContext};
use crate::event_scheduler::EventScheduler;
use crate::modeling::event::Event;
use crate::modeling::hook::instance::HookDelegate;
use crate::primitive::time::{MicroStep, MicroStepStatus, TickStatus};
use crate::source_handler::SourceHandler;
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
enum TestEvent {}
#[derive(Debug, Clone)]
struct TestModel;
impl Model<TestEvent> for TestModel {
fn handle_event(
&mut self,
_context: &mut EventContext<TestEvent, Self>,
_event: &Event<TestEvent>,
) {
}
}
#[test]
#[allow(clippy::default_constructed_unit_structs)]
fn test_always_continue_strategy_default_and_new() {
let _strategy_new = AlwaysContinueStrategy::new();
let _strategy_default = AlwaysContinueStrategy::default();
}
#[test]
fn test_always_continue_strategy_handle_continue() {
let model = TestModel;
let active_context = ActiveExecutorContext {
current_tick_status: TickStatus::initialize(),
next_micro_step_status: MicroStepStatus::initialize(),
hook_delegate: HookDelegate::new(),
source_handler: SourceHandler::new(),
event_scheduler: EventScheduler::new(),
};
let current_micro_step = MicroStep::zero();
let unchecked_executor = UncheckedActiveExecutor::new(active_context, current_micro_step);
let mut strategy = AlwaysContinueStrategy::new();
let result: ContinuousStrategyResult<TestEvent, TestModel, ()> =
strategy.handle_micro_step_continue(&model, unchecked_executor);
assert!(result.is_ok(), "Continuation strategy failed unexpectedly.");
let returned_context = result.map_err(|e| e.1).unwrap();
assert_eq!(
returned_context.current_tick_status.current(),
crate::primitive::time::SimTime::zero()
);
}
}