use mockforge_core::reality::{PresetMetadata, RealityConfig, RealityEngine, RealityLevel};
use std::sync::Arc;
use tokio::sync::RwLock;
#[tokio::test]
async fn test_reality_level_creation() {
for level_value in 1..=5 {
let level = RealityLevel::from_value(level_value);
assert!(level.is_some(), "Level {} should be valid", level_value);
let level = level.unwrap();
assert_eq!(level.value(), level_value);
assert!(!level.name().is_empty());
assert!(!level.description().is_empty());
}
assert!(RealityLevel::from_value(0).is_none());
assert!(RealityLevel::from_value(6).is_none());
assert!(RealityLevel::from_value(99).is_none());
}
#[tokio::test]
async fn test_reality_engine_initialization() {
let engine = RealityEngine::new();
assert_eq!(engine.get_level().await, RealityLevel::ModerateRealism);
let config = engine.get_config().await;
assert!(config.chaos.error_rate > 0.0);
assert!(config.latency.base_ms > 0);
assert!(config.mockai.enabled);
}
#[tokio::test]
async fn test_reality_level_changes() {
let engine = Arc::new(RwLock::new(RealityEngine::new()));
{
let engine_guard = engine.write().await;
engine_guard.set_level(RealityLevel::StaticStubs).await;
drop(engine_guard);
let engine_guard = engine.read().await;
assert_eq!(engine_guard.get_level().await, RealityLevel::StaticStubs);
let config = engine_guard.get_config().await;
assert_eq!(config.chaos.error_rate, 0.0);
assert_eq!(config.latency.base_ms, 0);
assert!(!config.mockai.enabled);
}
{
let engine_guard = engine.write().await;
engine_guard.set_level(RealityLevel::ProductionChaos).await;
drop(engine_guard);
let engine_guard = engine.read().await;
assert_eq!(engine_guard.get_level().await, RealityLevel::ProductionChaos);
let config = engine_guard.get_config().await;
assert!(config.chaos.error_rate > 0.1);
assert!(config.latency.base_ms > 100);
assert!(config.mockai.enabled);
}
}
#[tokio::test]
async fn test_reality_config_progression() {
let engine = Arc::new(RwLock::new(RealityEngine::new()));
let mut prev_error_rate = 0.0;
let mut prev_latency = 0;
for level_value in 1..=5 {
let level = RealityLevel::from_value(level_value).unwrap();
{
let engine_guard = engine.write().await;
engine_guard.set_level(level).await;
drop(engine_guard);
let engine_guard = engine.read().await;
let config = engine_guard.get_config().await;
assert!(
config.chaos.error_rate >= prev_error_rate,
"Error rate should increase with level. Level {}: {}, Previous: {}",
level_value,
config.chaos.error_rate,
prev_error_rate
);
assert!(
config.latency.base_ms >= prev_latency,
"Latency should increase with level. Level {}: {}, Previous: {}",
level_value,
config.latency.base_ms,
prev_latency
);
prev_error_rate = config.chaos.error_rate;
prev_latency = config.latency.base_ms;
}
}
}
#[tokio::test]
async fn test_reality_preset_creation() {
let engine = Arc::new(RwLock::new(RealityEngine::new()));
{
let engine_guard = engine.write().await;
engine_guard.set_level(RealityLevel::HighRealism).await;
drop(engine_guard);
}
{
let engine_guard = engine.read().await;
let preset = engine_guard
.create_preset("test-preset".to_string(), Some("Test preset description".to_string()))
.await;
assert_eq!(preset.name, "test-preset");
assert_eq!(preset.description, Some("Test preset description".to_string()));
assert_eq!(preset.config.level, RealityLevel::HighRealism);
assert!(preset.metadata.is_some());
}
}
#[tokio::test]
async fn test_reality_preset_application() {
let engine = Arc::new(RwLock::new(RealityEngine::new()));
let preset = {
let engine_guard = engine.write().await;
engine_guard.set_level(RealityLevel::ProductionChaos).await;
drop(engine_guard);
let engine_guard = engine.read().await;
engine_guard.create_preset("chaos-preset".to_string(), None).await
};
{
let engine_guard = engine.write().await;
engine_guard.set_level(RealityLevel::StaticStubs).await;
drop(engine_guard);
let engine_guard = engine.read().await;
assert_eq!(engine_guard.get_level().await, RealityLevel::StaticStubs);
}
{
let engine_guard = engine.write().await;
engine_guard.apply_preset(preset.clone()).await;
drop(engine_guard);
let engine_guard = engine.read().await;
let config = engine_guard.get_config().await;
assert!(config.chaos.error_rate > 0.1);
assert!(config.latency.base_ms > 100);
assert!(config.mockai.enabled);
}
}
#[tokio::test]
async fn test_reality_config_default() {
let config = RealityConfig::default();
assert!(config.chaos.error_rate > 0.0);
assert!(config.latency.base_ms > 0);
assert!(config.mockai.enabled);
}
#[tokio::test]
async fn test_reality_preset_metadata() {
let metadata = PresetMetadata {
created_at: Some(chrono::Utc::now().to_rfc3339()),
author: Some("test-author".to_string()),
tags: vec!["test".to_string()],
version: Some("1.0".to_string()),
};
assert_eq!(metadata.author, Some("test-author".to_string()));
assert_eq!(metadata.version, Some("1.0".to_string()));
assert!(!metadata.tags.is_empty());
}
#[tokio::test]
async fn test_reality_level_names() {
assert_eq!(RealityLevel::StaticStubs.name(), "Static Stubs");
assert_eq!(RealityLevel::LightSimulation.name(), "Light Simulation");
assert_eq!(RealityLevel::ModerateRealism.name(), "Moderate Realism");
assert_eq!(RealityLevel::HighRealism.name(), "High Realism");
assert_eq!(RealityLevel::ProductionChaos.name(), "Production Chaos");
}
#[tokio::test]
async fn test_reality_level_descriptions() {
for level_value in 1..=5 {
let level = RealityLevel::from_value(level_value).unwrap();
assert!(!level.description().is_empty());
}
}
#[tokio::test]
async fn test_reality_engine_concurrent_access() {
let engine = Arc::new(RwLock::new(RealityEngine::new()));
let handles: Vec<_> = (0..10)
.map(|_| {
let engine = engine.clone();
tokio::spawn(async move {
let engine = engine.read().await;
let _config = engine.get_config().await;
})
})
.collect();
futures::future::join_all(handles).await;
let handles: Vec<_> = (1..=5)
.map(|level_value| {
let engine = engine.clone();
tokio::spawn(async move {
let level = RealityLevel::from_value(level_value).unwrap();
let engine_guard = engine.write().await;
engine_guard.set_level(level).await;
})
})
.collect();
futures::future::join_all(handles).await;
}
#[tokio::test]
async fn test_reality_config_chaos_settings() {
let engine = Arc::new(RwLock::new(RealityEngine::new()));
{
let engine_guard = engine.write().await;
engine_guard.set_level(RealityLevel::StaticStubs).await;
drop(engine_guard);
let engine_guard = engine.read().await;
let config = engine_guard.get_config().await;
assert_eq!(config.chaos.error_rate, 0.0);
assert_eq!(config.chaos.delay_rate, 0.0);
}
{
let engine_guard = engine.write().await;
engine_guard.set_level(RealityLevel::ProductionChaos).await;
drop(engine_guard);
let engine_guard = engine.read().await;
let config = engine_guard.get_config().await;
assert!(config.chaos.error_rate > 0.1);
assert!(config.chaos.delay_rate > 0.2);
}
}
#[tokio::test]
async fn test_reality_config_latency_settings() {
let engine = Arc::new(RwLock::new(RealityEngine::new()));
{
let engine_guard = engine.write().await;
engine_guard.set_level(RealityLevel::StaticStubs).await;
drop(engine_guard);
let engine_guard = engine.read().await;
let config = engine_guard.get_config().await;
assert_eq!(config.latency.base_ms, 0);
assert_eq!(config.latency.jitter_ms, 0);
}
{
let engine_guard = engine.write().await;
engine_guard.set_level(RealityLevel::ProductionChaos).await;
drop(engine_guard);
let engine_guard = engine.read().await;
let config = engine_guard.get_config().await;
assert!(config.latency.base_ms > 100);
assert!(config.latency.jitter_ms > 0);
}
}
#[tokio::test]
async fn test_reality_config_mockai_settings() {
let engine = Arc::new(RwLock::new(RealityEngine::new()));
{
let engine_guard = engine.write().await;
engine_guard.set_level(RealityLevel::StaticStubs).await;
drop(engine_guard);
let engine_guard = engine.read().await;
let config = engine_guard.get_config().await;
assert!(!config.mockai.enabled);
}
for level_value in 2..=5 {
let level = RealityLevel::from_value(level_value).unwrap();
let engine_guard = engine.write().await;
engine_guard.set_level(level).await;
drop(engine_guard);
let engine_guard = engine.read().await;
let config = engine_guard.get_config().await;
assert!(config.mockai.enabled, "Level {} should have MockAI enabled", level_value);
}
}