use super::{test_config_agent, test_overrides_with_phases};
use crate::agent::AgentOverrides;
use crate::contracts::{Model, PhaseOverrideConfig, PhaseOverrides, ReasoningEffort, Runner};
use crate::runner::{ResolvedPhaseSettings, resolve_phase_settings_matrix};
#[test]
fn resolved_phase_settings_to_agent_settings_conversion() {
let phase_settings = ResolvedPhaseSettings {
runner: Runner::Codex,
model: Model::Gpt53Codex,
reasoning_effort: Some(ReasoningEffort::High),
runner_cli: crate::runner::ResolvedRunnerCliOptions::default(),
};
let agent_settings = phase_settings.to_agent_settings();
assert_eq!(agent_settings.runner, Runner::Codex);
assert_eq!(agent_settings.model, Model::Gpt53Codex);
assert_eq!(agent_settings.reasoning_effort, Some(ReasoningEffort::High));
}
#[test]
fn per_phase_settings_different_runners_per_phase() {
let config_agent = test_config_agent(
Some(Runner::Claude),
Some(Model::Custom("sonnet".to_string())),
None,
);
let phase_overrides = PhaseOverrides {
phase1: Some(PhaseOverrideConfig {
runner: Some(Runner::Codex),
model: Some(Model::Gpt53Codex),
reasoning_effort: Some(ReasoningEffort::High),
}),
phase2: Some(PhaseOverrideConfig {
runner: Some(Runner::Opencode),
model: Some(Model::Glm47),
reasoning_effort: None,
}),
phase3: Some(PhaseOverrideConfig {
runner: Some(Runner::Gemini),
model: Some(Model::Custom("gemini-pro".to_string())),
reasoning_effort: None,
}),
};
let overrides = test_overrides_with_phases(None, None, None, Some(phase_overrides));
let (matrix, _warnings) =
resolve_phase_settings_matrix(&overrides, &config_agent, None, 3).unwrap();
assert_eq!(matrix.phase1.runner, Runner::Codex);
assert_eq!(matrix.phase1.model, Model::Gpt53Codex);
assert_eq!(matrix.phase1.reasoning_effort, Some(ReasoningEffort::High));
assert_eq!(matrix.phase2.runner, Runner::Opencode);
assert_eq!(matrix.phase2.model, Model::Glm47);
assert_eq!(matrix.phase2.reasoning_effort, None);
assert_eq!(matrix.phase3.runner, Runner::Gemini);
assert_eq!(matrix.phase3.model.as_str(), "gemini-pro");
assert_eq!(matrix.phase3.reasoning_effort, None);
}
#[test]
fn single_pass_uses_phase2_settings() {
let config_agent = test_config_agent(Some(Runner::Claude), None, None);
let phase_overrides = PhaseOverrides {
phase1: Some(PhaseOverrideConfig {
runner: Some(Runner::Codex),
model: Some(Model::Gpt53Codex),
reasoning_effort: None,
}),
phase2: Some(PhaseOverrideConfig {
runner: Some(Runner::Opencode),
model: Some(Model::Glm47),
reasoning_effort: None,
}),
phase3: Some(PhaseOverrideConfig {
runner: Some(Runner::Gemini),
model: None,
reasoning_effort: None,
}),
};
let overrides = test_overrides_with_phases(None, None, None, Some(phase_overrides));
let (matrix, warnings) =
resolve_phase_settings_matrix(&overrides, &config_agent, None, 1).unwrap();
assert_eq!(matrix.phase2.runner, Runner::Opencode);
assert_eq!(matrix.phase2.model, Model::Glm47);
assert!(warnings.unused_phase1);
assert!(!warnings.unused_phase2); assert!(warnings.unused_phase3);
}
#[test]
fn phase2_settings_always_resolved() {
let config_agent = test_config_agent(Some(Runner::Claude), None, None);
let overrides = AgentOverrides::default();
let (matrix, _) = resolve_phase_settings_matrix(&overrides, &config_agent, None, 1).unwrap();
assert_eq!(matrix.phase2.runner, Runner::Claude);
let (matrix, _) = resolve_phase_settings_matrix(&overrides, &config_agent, None, 2).unwrap();
assert_eq!(matrix.phase2.runner, Runner::Claude);
let (matrix, _) = resolve_phase_settings_matrix(&overrides, &config_agent, None, 3).unwrap();
assert_eq!(matrix.phase2.runner, Runner::Claude);
}
#[test]
fn resolution_warnings_collected_correctly() {
let phase_overrides = PhaseOverrides {
phase1: Some(PhaseOverrideConfig {
runner: Some(Runner::Codex),
model: None,
reasoning_effort: None,
}),
phase2: Some(PhaseOverrideConfig {
runner: Some(Runner::Opencode),
model: None,
reasoning_effort: None,
}),
phase3: Some(PhaseOverrideConfig {
runner: Some(Runner::Gemini),
model: None,
reasoning_effort: None,
}),
};
let overrides = test_overrides_with_phases(None, None, None, Some(phase_overrides));
let config_agent = test_config_agent(Some(Runner::Claude), None, None);
let (_, warnings) = resolve_phase_settings_matrix(&overrides, &config_agent, None, 1).unwrap();
assert!(warnings.unused_phase1);
assert!(!warnings.unused_phase2);
assert!(warnings.unused_phase3);
let (_, warnings) = resolve_phase_settings_matrix(&overrides, &config_agent, None, 2).unwrap();
assert!(!warnings.unused_phase1);
assert!(!warnings.unused_phase2);
assert!(warnings.unused_phase3);
let (_, warnings) = resolve_phase_settings_matrix(&overrides, &config_agent, None, 3).unwrap();
assert!(!warnings.unused_phase1);
assert!(!warnings.unused_phase2);
assert!(!warnings.unused_phase3);
}