use ember_tune_rs::engine::formatters::throttled::{ThrottledConfig, ThrottledTranslator}; use ember_tune_rs::agent_analyst::{OptimizationMatrix, SystemProfile, FanCurvePoint}; use ember_tune_rs::agent_integrator::ServiceIntegrator; use std::fs; use tempfile::tempdir; #[test] fn test_throttled_merge_preserves_undervolt() { let existing = r#"[GENERAL] Update_Interval_ms: 1000 [UNDERVOLT] # CPU core undervolt CORE: -100 # GPU undervolt GPU: -50 [AC] PL1_Tdp_W: 15 PL2_Tdp_W: 25 "#; let config = ThrottledConfig { pl1_limit: 22.0, pl2_limit: 28.0, trip_temp: 95.0, }; let merged = ThrottledTranslator::merge_conf(existing, &config); assert!(merged.contains("CORE: -100")); assert!(merged.contains("GPU: -50")); assert!(merged.contains("PL1_Tdp_W: 22")); assert!(merged.contains("PL2_Tdp_W: 28")); assert!(merged.contains("Trip_Temp_C: 95")); assert!(merged.contains("[UNDERVOLT]")); } #[test] fn test_i8kmon_merge_preserves_settings() { let dir = tempdir().unwrap(); let config_path = dir.path().join("i8kmon.conf"); let existing = r#"set config(gen_shadow) 1 set config(i8k_ignore_dmi) 1 set config(daemon) 1 set config(0) {0 0 60 50} "#; fs::write(&config_path, existing).unwrap(); let matrix = OptimizationMatrix { silent: SystemProfile { name: "Silent".to_string(), pl1_watts: 10.0, pl2_watts: 12.0, fan_curve: vec![] }, balanced: SystemProfile { name: "Balanced".to_string(), pl1_watts: 20.0, pl2_watts: 25.0, fan_curve: vec![ FanCurvePoint { temp_on: 70.0, temp_off: 60.0, pwm_percent: 50 } ] }, performance: SystemProfile { name: "Perf".to_string(), pl1_watts: 30.0, pl2_watts: 35.0, fan_curve: vec![] }, thermal_resistance_kw: 1.5, ambient_temp: 25.0, }; ServiceIntegrator::generate_i8kmon_config(&matrix, &config_path, Some(&config_path)).unwrap(); let result = fs::read_to_string(&config_path).unwrap(); assert!(result.contains("set config(gen_shadow) 1")); assert!(result.contains("set config(daemon) 1")); assert!(result.contains("set config(0) {1 1 70 -}")); // New config assert!(!result.contains("set config(0) {0 0 60 50}")); // Old config should be gone }