pub use self::test_assertion::*;
pub use self::expected_outcome::*;
pub use self::test_metrics::*;
pub use self::test_execution_context::*;
pub use self::test_result::*;
pub use self::test_scenario::*;
pub use self::mock_configuration::*;
pub use self::di_configuration::*;
pub use self::di_container::*;
pub use self::repository_call::*;
pub use self::mock_repository_behavior::*;
pub use self::mock_continuation_repository::*;
pub use self::mock_effect_response::*;
pub use self::mock_monadic_computation::*;
pub use self::effect_call::*;
pub use self::mock_effect_behavior::*;
pub use self::mock_effect_interpreter::*;
pub use self::environment_call::*;
pub use self::mock_environment_behavior::*;
pub use self::mock_environment_manager::*;
pub use self::effect_handler_call::*;
pub use self::mock_handler_behavior::*;
pub use self::mock_effect_handler::*;
pub use self::test_fixture::*;
pub use self::test_fixture_builder::*;
pub mod test_assertion;
pub mod expected_outcome;
pub mod test_metrics;
pub mod test_execution_context;
pub mod test_result;
pub mod test_scenario;
pub mod mock_configuration;
pub mod di_configuration;
pub mod di_container;
pub mod repository_call;
pub mod mock_repository_behavior;
pub mod mock_continuation_repository;
pub mod mock_effect_response;
pub mod mock_monadic_computation;
pub mod effect_call;
pub mod mock_effect_behavior;
pub mod mock_effect_interpreter;
pub mod environment_call;
pub mod mock_environment_behavior;
pub mod mock_environment_manager;
pub mod effect_handler_call;
pub mod mock_handler_behavior;
pub mod mock_effect_handler;
pub mod test_fixture;
pub mod test_fixture_builder;
use crate::eval::{
Value, Environment,
monadic_architecture::{
MonadicEvaluationInput, MonadicEvaluationResult,
},
};
use crate::diagnostics::Result;
use std::collections::HashMap;
use std::sync::Arc;
pub type MockResponseStorage = Arc<std::sync::Mutex<HashMap<(crate::effects::Effect, Vec<Value>), MockEffectResponse>>>;
pub fn create_basic_scenario(name: &str, input: MonadicEvaluationInput) -> TestScenario {
TestScenario {
name: name.to_string(),
description: format!("Basic test scenario: {name}"),
input,
expected_outcome: ExpectedOutcome::SuccessAny,
mock_configs: HashMap::new(),
assertions: Vec::new(),
}
}
pub fn create_call_cc_scenario(
name: &str,
input: MonadicEvaluationInput,
expected_continuations: usize,
) -> TestScenario {
let mut scenario = create_basic_scenario(name, input);
scenario.description = format!("Call/cc test scenario: {name}");
scenario.assertions.push(TestAssertion::ContinuationsCaptured(expected_continuations));
scenario
}
pub fn create_io_scenario(
name: &str,
input: MonadicEvaluationInput,
expected_io_ops: usize,
) -> TestScenario {
let mut scenario = create_basic_scenario(name, input);
scenario.description = format!("IO test scenario: {name}");
scenario.assertions.push(TestAssertion::MethodCalled("io_operation".to_string(), expected_io_ops));
scenario
}
pub fn create_performance_scenario(
name: &str,
input: MonadicEvaluationInput,
max_time_ms: u64,
max_memory_bytes: usize,
) -> TestScenario {
let mut scenario = create_basic_scenario(name, input);
scenario.description = format!("Performance test scenario: {name}");
scenario.assertions.push(TestAssertion::PerformanceWithin {
max_time_ms,
max_memory_bytes,
});
scenario
}
#[cfg(test)]
mod tests {
use super::*;
use crate::ast::{Expr, Literal};
use crate::diagnostics::Span;
use crate::eval::operational_semantics::EvaluationContext;
use crate::eval::continuation_domain::ContinuationRepository;
use crate::eval::monadic_architecture::effect_interpreter::EffectInterpreter;
use std::rc::Rc;
#[test]
#[ignore] fn test_di_container() {
let mut container = DIContainer::new();
let _mock_repo = MockContinuationRepository::new();
}
#[test]
#[ignore] fn test_mock_continuation_repository() {
let mut mock_repo = MockContinuationRepository::new();
let env = Rc::new(Environment::new(None, 0));
let context = EvaluationContext::empty(env.clone());
let capture_service = crate::eval::continuation_domain::ContinuationCaptureService::new();
let continuation = capture_service.capture_continuation(
&context,
Span::default(),
0,
).unwrap();
let id = mock_repo.store(continuation.clone()).unwrap();
assert_eq!(mock_repo.storage_size(), 1);
let found = mock_repo.find_by_id(id);
assert!(found.is_some());
let calls = mock_repo.call_log();
assert_eq!(calls.len(), 2); }
#[test]
fn test_test_fixture_builder() {
let fixture = TestFixtureBuilder::new()
.with_mock_continuation_repository(MockRepositoryBehavior::default())
.with_mock_effect_interpreter(MockEffectBehavior::default())
.build();
assert!(fixture.container.has_dependency("continuation_repository"));
assert!(fixture.container.has_dependency("effect_interpreter"));
}
#[test]
fn test_mock_effect_interpreter() {
let interpreter = MockEffectInterpreter::new();
interpreter.add_response(crate::effects::Effect::IO, MockEffectResponse::Value(Value::string("test".to_string())));
let effect_computation = crate::effects::EffectfulComputation::IO {
action: crate::effects::continuation_monad::ContIOAction::Write(Value::string("test".to_string())),
};
}
}