weavatrix-refactor-plan 0.1.1

Evidence metadata, validation profiles, and canonical fingerprints for Weavatrix refactor plans
Documentation
use blazingly_json::Value;
use serde::Deserialize;
use weavatrix_refactor_plan::{RefactorPlanLimits, parse_refactor_plan, validate_planner_plan};

#[derive(Deserialize)]
struct Case {
    id: String,
    consumer: bool,
    planner: bool,
    #[serde(default)]
    plan: Option<Value>,
    #[serde(default)]
    source: Option<String>,
}

#[test]
fn schema_corpus_and_runtime_profiles_have_declared_outcomes() {
    let corpus = include_str!("fixtures/refactor-plan-conformance.jsonl");
    let mut count = 0;
    for line in corpus.lines().filter(|line| !line.trim().is_empty()) {
        let case: Case = blazingly_json::from_str(line).unwrap();
        let bytes = case.source.map_or_else(
            || blazingly_json::to_vec(case.plan.as_ref().unwrap()).unwrap(),
            String::into_bytes,
        );
        let parsed = parse_refactor_plan(&bytes, RefactorPlanLimits::default());
        assert_eq!(parsed.is_ok(), case.consumer, "{} consumer", case.id);
        if let Ok(plan) = parsed {
            assert_eq!(
                validate_planner_plan(&plan, RefactorPlanLimits::default()).is_ok(),
                case.planner,
                "{} planner",
                case.id
            );
        } else {
            assert!(!case.planner, "{} cannot be planner-valid", case.id);
        }
        count += 1;
    }
    assert_eq!(count, 8);
}