use crate::helpers::*;
use predicates::str::contains;
use std::fs;
use std::path::Path;
const WITH_SLUG: &str = "slow-powers-eval-1-with_skill__mr-review";
const TWO_GROUPS: &str = r#"{ "skill_name": "mr-review", "evals": [
{ "id": "e1", "prompt": "p1", "expected_output": "o", "files": ["a.txt"] },
{ "id": "e2", "prompt": "p2", "expected_output": "o", "files": ["b.txt"], "isolation": "isolated" } ] }"#;
fn setup_two_groups(root: &Path) -> (std::path::PathBuf, std::path::PathBuf) {
let (skill_dir, cwd) = setup(root, TWO_GROUPS);
fs::write(skill_dir.join("mr-review/evals/a.txt"), "AAA").unwrap();
fs::write(skill_dir.join("mr-review/evals/b.txt"), "BBB").unwrap();
skill_eval()
.current_dir(&cwd)
.args(["run", "--skill-dir"])
.arg(&skill_dir)
.args(["--skill", "mr-review", "--mode", "new-skill", "--dry-run"])
.assert()
.success();
(skill_dir, cwd)
}
fn reset_to(cwd: &Path, skill_dir: &Path, group: &str) -> assert_cmd::assert::Assert {
skill_eval()
.current_dir(env_dir(cwd))
.args(["reset-batch", "--skill-dir"])
.arg(skill_dir)
.args(["--skill", "mr-review", "--workspace-dir"])
.arg(cwd.join(".eval-magic"))
.args(["--iteration", "1", "--group", group])
.assert()
}
#[test]
fn reset_batch_wipes_working_tree_and_reseeds_group_fixtures() {
let tmp = tempfile::TempDir::new().unwrap();
let (skill_dir, cwd) = setup_two_groups(tmp.path());
assert_eq!(read_str(&env_dir(&cwd).join("a.txt")), "AAA");
assert!(!env_dir(&cwd).join("b.txt").exists());
fs::write(env_dir(&cwd).join("stray.txt"), "STRAY").unwrap();
reset_to(&cwd, &skill_dir, "g2").success();
assert_eq!(read_str(&env_dir(&cwd).join("b.txt")), "BBB");
assert!(!env_dir(&cwd).join("a.txt").exists());
assert!(!env_dir(&cwd).join("stray.txt").exists());
assert!(
env_dir(&cwd)
.join(".claude/skills")
.join(WITH_SLUG)
.is_dir(),
"the staged skill survives reset-batch"
);
assert!(env_dir(&cwd).join(".eval-magic-outputs").exists());
}
#[test]
fn reset_batch_can_restore_the_first_group() {
let tmp = tempfile::TempDir::new().unwrap();
let (skill_dir, cwd) = setup_two_groups(tmp.path());
reset_to(&cwd, &skill_dir, "g2").success();
reset_to(&cwd, &skill_dir, "g1").success();
assert_eq!(read_str(&env_dir(&cwd).join("a.txt")), "AAA");
assert!(!env_dir(&cwd).join("b.txt").exists());
}
#[test]
fn reset_batch_rejects_unknown_group() {
let tmp = tempfile::TempDir::new().unwrap();
let (skill_dir, cwd) = setup_two_groups(tmp.path());
reset_to(&cwd, &skill_dir, "g99")
.failure()
.stderr(contains("unknown --group"));
}
#[test]
fn reset_batch_on_single_group_run_explains_it_is_unneeded() {
let tmp = tempfile::TempDir::new().unwrap();
let (skill_dir, cwd) = setup(tmp.path(), DEFAULT_EVALS);
skill_eval()
.current_dir(&cwd)
.args(["run", "--skill-dir"])
.arg(&skill_dir)
.args(["--skill", "mr-review", "--mode", "new-skill", "--dry-run"])
.assert()
.success();
reset_to(&cwd, &skill_dir, "g1")
.failure()
.stderr(contains("single group"));
}