use super::advance::no_resolve;
use super::fixtures::{FixedClock, FixedIdGen, never_stopped, no_launch};
use super::stubs::{StubSleeper, unreachable_adapter};
use super::tool_stub::StubToolExecutor;
use crate::prompt::Deps;
use crate::prompt::dispatch::advance::{AdvanceOutcome, run};
use crate::template::{GitRunner, RealGit};
use crate::workspace::{self, DEFAULT_CONFIG_NAME, agent_ref, fixture, repo_git};
use std::path::Path;
#[test]
fn the_executor_lands_a_marked_retarget_at_its_next_step_boundary() {
let (_h, ws, wt) = crate::prompt::retarget::tests::agent();
let git = RealGit::new();
fixture::amend_config(&ws, &[("souls/worker.md", "the newer soul\n")]);
let target = git
.run_capture(
&repo_git(&ws),
&["rev-parse", &workspace::config_ref(DEFAULT_CONFIG_NAME)],
)
.unwrap()
.trim()
.to_string();
let before = workspace::governing_config(&ws, &agent_ref("a"), &git).unwrap();
assert_ne!(before.trim(), target, "the freeze is real before the mark");
workspace::retarget::write(&ws, "a", &target, &git).unwrap();
let adapter = unreachable_adapter();
let tools = StubToolExecutor::ok();
let sleeper = StubSleeper::default();
let clock = FixedClock::default();
let id_gen = FixedIdGen;
let deps = Deps {
adapter: &adapter,
sleeper: &sleeper,
git: &git,
clock: &clock,
id_gen: &id_gen,
tool_executor: &tools,
config_root: Path::new("/nonexistent"),
adapter_target: None,
stop: never_stopped(),
launcher: no_launch(),
rng: crate::workspace::agent_name::mint::test_rng(),
};
let outcome = run(&ws, "a", None, &deps, &mut no_resolve).unwrap();
assert!(
matches!(outcome, AdvanceOutcome::NothingToDo),
"{outcome:?}"
);
assert_eq!(
workspace::governing_config(&ws, &agent_ref("a"), &git)
.unwrap()
.trim(),
target,
);
assert_eq!(workspace::retarget::read(&ws, "a", &git), None);
assert_eq!(
std::fs::read_to_string(wt.join("soul.md")).unwrap(),
"the newer soul",
);
}