#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RegressionOutcome {
Pass,
NotVerified,
Fail,
}
impl RegressionOutcome {
pub fn as_str(self) -> &'static str {
match self {
RegressionOutcome::Pass => "PASS",
RegressionOutcome::NotVerified => "NOT_VERIFIED",
RegressionOutcome::Fail => "FAIL",
}
}
}
pub fn classify_regression_outcome(status: &str, reason: &str) -> RegressionOutcome {
match (status, reason) {
("PASS", _) => RegressionOutcome::Pass,
(_, "MISSING_BASELINE" | "INCOMPARABLE_ENVIRONMENT") => RegressionOutcome::NotVerified,
_ => RegressionOutcome::Fail,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn tests_long_classify_cases_match_expect_str() {
assert_eq!(
classify_regression_outcome("PASS", ""),
RegressionOutcome::Pass
);
assert_eq!(
classify_regression_outcome("FAIL", "MISSING_BASELINE"),
RegressionOutcome::NotVerified
);
assert_eq!(
classify_regression_outcome("FAIL", "INCOMPARABLE_ENVIRONMENT"),
RegressionOutcome::NotVerified
);
assert_eq!(
classify_regression_outcome("FAIL", "REGRESSION_DETECTED"),
RegressionOutcome::Fail
);
assert_eq!(
classify_regression_outcome("FAIL", "Benchmark run failed"),
RegressionOutcome::Fail
);
assert_eq!(classify_regression_outcome("", ""), RegressionOutcome::Fail);
assert_eq!(
classify_regression_outcome("SKIP_CAPABILITY", "whatever"),
RegressionOutcome::Fail
);
}
#[test]
fn outcome_strings_are_the_dashboard_verdicts() {
assert_eq!(RegressionOutcome::Pass.as_str(), "PASS");
assert_eq!(RegressionOutcome::NotVerified.as_str(), "NOT_VERIFIED");
assert_eq!(RegressionOutcome::Fail.as_str(), "FAIL");
}
#[test]
fn any_status_with_missing_baseline_reason_is_not_verified() {
assert_eq!(
classify_regression_outcome("FAIL", "MISSING_BASELINE"),
RegressionOutcome::NotVerified
);
assert_eq!(
classify_regression_outcome("NOT_RUN", "MISSING_BASELINE"),
RegressionOutcome::NotVerified
);
}
#[test]
fn pass_with_garbage_reason_is_still_pass() {
assert_eq!(
classify_regression_outcome("PASS", "MISSING_BASELINE"),
RegressionOutcome::Pass
);
}
}