malvin 0.2.4

Non-interactive research and coding agent
use super::restore_router_iteration_dotfiles;
use crate::session_dotfile_backup::{
    DotfileBackupState, GitignoreBackup, SessionDotfileBackups, VisionBackup, VisionFileBackup,
};

#[test]
fn restore_router_iteration_keeps_agent_vision_edits() {
    crate::test_utils::with_isolated_home(|_| {
        let tmp = tempfile::tempdir().expect("tmpdir");
        let work = tmp.path();
        std::fs::write(work.join("VISION.md"), "baseline prine:\n").expect("write");
        let anchor = SessionDotfileBackups::snapshot(work).expect("anchor");
        std::fs::write(
            work.join("VISION.md"),
            "- `pi:` models should look basically the same as `cursor:` models.\n",
        )
        .expect("edit");
        let merged = restore_router_iteration_dotfiles(work, &anchor).expect("restore");
        let text = std::fs::read_to_string(work.join("VISION.md")).expect("read");
        assert!(
            text.contains("`pi:`") && !text.contains("prine:"),
            "expected agent VISION edit kept, got: {text:?}"
        );
        assert!(matches!(merged.vision, VisionBackup::Present { .. }));
    });
}

#[test]
fn restore_router_iteration_restores_deleted_vision() {
    crate::test_utils::with_isolated_home(|_| {
        let tmp = tempfile::tempdir().expect("tmpdir");
        let work = tmp.path();
        std::fs::write(work.join("VISION.md"), "keep me\n").expect("write");
        let anchor = SessionDotfileBackups::snapshot(work).expect("anchor");
        std::fs::remove_file(work.join("VISION.md")).expect("delete");
        let _ = restore_router_iteration_dotfiles(work, &anchor).expect("restore");
        let text = std::fs::read_to_string(work.join("VISION.md")).expect("read");
        assert_eq!(text, "keep me\n");
    });
}

#[test]
fn kiss_witness_restore_router_iteration_dotfiles() {
    let _ = restore_router_iteration_dotfiles;
    let _ = stringify!(RouterAgentLoopInput);
    let _ = stringify!(RouterAgentLoopOutcome);
    let empty = SessionDotfileBackups {
        malvin_checks: DotfileBackupState::Missing,
        gitignore: GitignoreBackup::Missing,
        vision: VisionBackup::Missing,
        malvin_config_workspace: DotfileBackupState::Missing,
    };
    let _ = matches!(empty.vision, VisionBackup::Missing);
    let _ = VisionFileBackup {
        rel: std::path::PathBuf::from("VISION.md"),
        bytes: b"x".to_vec(),
    };
}