lexicon-scoring 0.1.0

Scoring engine for lexicon
Documentation
#[cfg(test)]
mod tests {
    use crate::engine::{DimensionResult, ScoreReport, Verdict};
    use crate::explain::explain_score;

    fn make_result(id: &str, value: f64, passed: bool, explanation: &str) -> DimensionResult {
        DimensionResult {
            dimension_id: id.to_string(),
            value,
            passed,
            explanation: explanation.to_string(),
        }
    }

    #[test]
    fn snapshot_explain_passing_score() {
        let report = ScoreReport {
            total_score: 0.92,
            all_required_passed: true,
            verdict: Verdict::Pass,
            dimensions: vec![
                make_result("correctness", 1.0, true, "all tests passed"),
                make_result("conformance-coverage", 0.85, true, "17/20 semantics covered"),
                make_result("behavior-pass-rate", 0.9, true, "18/20 behaviors pass"),
                make_result("lint-quality", 1.0, true, "no warnings"),
                make_result("doc-completeness", 0.7, true, "advisory only"),
                make_result("panic-safety", 0.8, true, "no panics detected"),
            ],
        };
        let explanation = explain_score(&report);
        insta::assert_snapshot!("explain_passing_score", explanation);
    }

    #[test]
    fn snapshot_explain_failing_score() {
        let report = ScoreReport {
            total_score: 0.35,
            all_required_passed: false,
            verdict: Verdict::Fail,
            dimensions: vec![
                make_result("correctness", 0.0, false, "3 tests failed"),
                make_result("conformance-coverage", 0.5, true, "10/20 semantics covered"),
                make_result("behavior-pass-rate", 0.4, false, "8/20 behaviors pass"),
                make_result("lint-quality", 0.6, true, "12 warnings"),
                make_result("doc-completeness", 0.2, false, "advisory only"),
                make_result("panic-safety", 0.0, false, "2 panics detected"),
            ],
        };
        let explanation = explain_score(&report);
        insta::assert_snapshot!("explain_failing_score", explanation);
    }
}