use super::types::{Agreement, Equivalence, Holding, Order};
use crate::report::{FailureClass, FindingCause, FindingLocation, TrialConclusion, TrialFinding};
use core::cmp::Ordering;
use core::panic::Location;
#[must_use]
#[track_caller]
pub fn raised_here() -> FindingLocation {
let raised = Location::caller();
FindingLocation::at(raised.file(), raised.line())
}
#[must_use]
#[track_caller]
pub fn concluded(holding: Holding, class: FailureClass, cause: FindingCause) -> TrialConclusion {
match holding {
Holding::Holds => TrialConclusion::Passed,
Holding::Fails => {
TrialConclusion::Refused(TrialFinding::established(class, cause, raised_here(), None))
}
}
}
#[must_use]
#[track_caller]
pub fn agreement<Value>(
same: Equivalence<Value>,
left: &Value,
right: &Value,
cause: FindingCause,
) -> TrialConclusion {
let holding = match same(left, right) {
Agreement::Agrees => Holding::Holds,
Agreement::Differs => Holding::Fails,
};
concluded(holding, FailureClass::PropertyDisagreement, cause)
}
#[must_use]
#[track_caller]
pub fn ranking<Value>(
order: Order<Value>,
lower: &Value,
upper: &Value,
cause: FindingCause,
) -> TrialConclusion {
let holding = match order(lower, upper) {
Ordering::Less | Ordering::Equal => Holding::Holds,
Ordering::Greater => Holding::Fails,
};
concluded(holding, FailureClass::PropertyDisagreement, cause)
}
#[must_use]
#[track_caller]
pub fn admitted<Answer, Refusal>(
outcome: &Result<Answer, Refusal>,
cause: FindingCause,
) -> TrialConclusion {
let holding = match *outcome {
Ok(_) => Holding::Holds,
Err(_) => Holding::Fails,
};
concluded(holding, FailureClass::RefusedByCheck, cause)
}
#[must_use]
#[track_caller]
pub fn refused<Answer, Refusal>(
outcome: &Result<Answer, Refusal>,
cause: FindingCause,
) -> TrialConclusion {
let holding = match *outcome {
Ok(_) => Holding::Fails,
Err(_) => Holding::Holds,
};
concluded(holding, FailureClass::RefusedByCheck, cause)
}