parlov-analysis 0.7.0

Analysis engine trait and signal detection for parlov.
Documentation
use super::*;

#[test]
fn evaluate_3_samples_unstable_probe_not_present() {
    let ds = diff_set_n(&[403, 403, 403], &[404, 200, 404]);
    let SampleDecision::Complete(result, _outcome) = ExistenceAnalyzer.evaluate(&ds) else {
        panic!("expected Complete");
    };
    assert_eq!(result.verdict, OracleVerdict::NotPresent);
    assert_eq!(result.severity, None);
}

#[test]
fn evaluate_3_samples_unstable_baseline_not_present() {
    let ds = diff_set_n(&[403, 200, 403], &[404, 404, 404]);
    let SampleDecision::Complete(result, _outcome) = ExistenceAnalyzer.evaluate(&ds) else {
        panic!("expected Complete");
    };
    assert_eq!(result.verdict, OracleVerdict::NotPresent);
    assert_eq!(result.severity, None);
}

#[test]
fn unstable_result_carries_signal() {
    let ds = diff_set_n(&[403, 403, 403], &[404, 200, 404]);
    let SampleDecision::Complete(result, _outcome) = ExistenceAnalyzer.evaluate(&ds) else {
        panic!("expected Complete");
    };
    assert_eq!(result.verdict, OracleVerdict::NotPresent);
    assert!(
        result.primary_evidence().contains("unstable"),
        "unstable result should carry unstable signal"
    );
}

/// The `unstable_result` path produces `StrategyOutcome::NoSignal`.
#[test]
fn unstable_path_produces_no_signal_outcome() {
    let ds = diff_set_n(&[403, 403, 403], &[404, 200, 404]);
    let SampleDecision::Complete(result, outcome) = ExistenceAnalyzer.evaluate(&ds) else {
        panic!("expected Complete");
    };
    assert_eq!(result.verdict, OracleVerdict::NotPresent);
    assert!(
        matches!(outcome, StrategyOutcome::NoSignal(_)),
        "unstable path must produce NoSignal outcome"
    );
}