ripr 0.8.0

Find static mutation-exposure gaps before expensive mutation testing
Documentation
pub const START_HERE_ACTIONABLE_GAP: &str = "actionable_gap";
pub const START_HERE_CLEAN: &str = "clean";
pub const START_HERE_NO_ACTIONABLE_GAP: &str = "no_actionable_gap";
pub const START_HERE_MISSING_ARTIFACTS: &str = "missing_artifacts";
pub const START_HERE_STALE_EVIDENCE: &str = "stale_evidence";
pub const START_HERE_WRONG_ROOT: &str = "wrong_root";
pub const START_HERE_LANGUAGE_DISABLED: &str = "language_disabled";
pub const START_HERE_ADAPTER_UNAVAILABLE: &str = "adapter_unavailable";
pub const START_HERE_PREVIEW_DISABLED: &str = "preview_disabled";
pub const START_HERE_PREVIEW_LIMITED: &str = "preview_limited";
pub const START_HERE_MALFORMED_ARTIFACT: &str = "malformed_artifact";
pub const START_HERE_TIMEOUT_PARTIAL: &str = "timeout_partial";
pub const START_HERE_SERVER_UNAVAILABLE: &str = "server_unavailable";
pub const START_HERE_UNSUPPORTED_SCHEMA: &str = "unsupported_schema";
pub const START_HERE_UNSAFE_PATH: &str = "unsafe_path";
pub const START_HERE_UNSAFE_COMMAND: &str = "unsafe_command";

pub const START_HERE_OUTPUT_STATES: &[&str] = &[
    START_HERE_ACTIONABLE_GAP,
    START_HERE_CLEAN,
    START_HERE_NO_ACTIONABLE_GAP,
    START_HERE_MISSING_ARTIFACTS,
    START_HERE_STALE_EVIDENCE,
    START_HERE_WRONG_ROOT,
    START_HERE_LANGUAGE_DISABLED,
    START_HERE_ADAPTER_UNAVAILABLE,
    START_HERE_PREVIEW_DISABLED,
    START_HERE_PREVIEW_LIMITED,
    START_HERE_MALFORMED_ARTIFACT,
    START_HERE_TIMEOUT_PARTIAL,
    START_HERE_SERVER_UNAVAILABLE,
    START_HERE_UNSUPPORTED_SCHEMA,
    START_HERE_UNSAFE_PATH,
    START_HERE_UNSAFE_COMMAND,
];

pub fn normalize_start_here_output_state(state: &str) -> &'static str {
    match state {
        "top_gap" | "actionable" | "actionable_gap" => START_HERE_ACTIONABLE_GAP,
        "empty_diff" | "clean" => START_HERE_CLEAN,
        "no_action" | "no_actionable_gap" | "no_actionable_seam" => START_HERE_NO_ACTIONABLE_GAP,
        "missing_artifact" | "missing_required_input" | "blocked_artifact" => {
            START_HERE_MISSING_ARTIFACTS
        }
        "stale_artifact" | "stale_input" | "stale" => START_HERE_STALE_EVIDENCE,
        "wrong_root" => START_HERE_WRONG_ROOT,
        "disabled_language" | "language_disabled" => START_HERE_LANGUAGE_DISABLED,
        "adapter_unavailable" | "preview_adapter_unavailable" => START_HERE_ADAPTER_UNAVAILABLE,
        "preview_disabled" => START_HERE_PREVIEW_DISABLED,
        "preview_limited" | "static_limit_only" | "report_only_static_limit" => {
            START_HERE_PREVIEW_LIMITED
        }
        "malformed_artifact" | "malformed" => START_HERE_MALFORMED_ARTIFACT,
        "timeout" | "timed_out" | "timeout_partial" => START_HERE_TIMEOUT_PARTIAL,
        "server_unavailable" | "server_missing" => START_HERE_SERVER_UNAVAILABLE,
        "unsupported_schema" => START_HERE_UNSUPPORTED_SCHEMA,
        "unsafe_path" => START_HERE_UNSAFE_PATH,
        "unsafe_command" => START_HERE_UNSAFE_COMMAND,
        _ => START_HERE_MISSING_ARTIFACTS,
    }
}

pub fn start_here_output_state_is_known(state: &str) -> bool {
    START_HERE_OUTPUT_STATES.contains(&state)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn normalizes_no_output_and_fail_closed_states() {
        for (raw, expected) in [
            ("empty_diff", START_HERE_CLEAN),
            ("no_action", START_HERE_NO_ACTIONABLE_GAP),
            ("missing_artifact", START_HERE_MISSING_ARTIFACTS),
            ("blocked_artifact", START_HERE_MISSING_ARTIFACTS),
            ("stale_artifact", START_HERE_STALE_EVIDENCE),
            ("wrong_root", START_HERE_WRONG_ROOT),
            ("disabled_language", START_HERE_LANGUAGE_DISABLED),
            ("adapter_unavailable", START_HERE_ADAPTER_UNAVAILABLE),
            ("preview_disabled", START_HERE_PREVIEW_DISABLED),
            ("preview_limited", START_HERE_PREVIEW_LIMITED),
            ("malformed_artifact", START_HERE_MALFORMED_ARTIFACT),
            ("timeout", START_HERE_TIMEOUT_PARTIAL),
            ("server_missing", START_HERE_SERVER_UNAVAILABLE),
            ("unsupported_schema", START_HERE_UNSUPPORTED_SCHEMA),
            ("unsafe_path", START_HERE_UNSAFE_PATH),
            ("unsafe_command", START_HERE_UNSAFE_COMMAND),
        ] {
            assert_eq!(normalize_start_here_output_state(raw), expected);
            assert!(start_here_output_state_is_known(expected));
        }
    }
}