mod advertised;
mod clone;
mod narrowing;
mod window;
mod writes;
pub use advertised::check_advertised;
pub use clone::check_clone;
pub use narrowing::check_narrowing;
pub use writes::check_advertised_writes;
use vantage_core::Result;
use crate::Capability;
#[derive(Default)]
struct Probe {
failures: Vec<String>,
}
impl Probe {
fn check<T>(&mut self, capability: Capability, method: &str, result: &Result<T>) {
if let Err(e) = result
&& (e.is_unsupported() || e.is_unimplemented())
{
self.fail(format!(
"`{capability}` is advertised but `{method}` refuses it: {e}"
));
}
}
fn check_ok<T>(&mut self, capability: Capability, method: &str, result: &Result<T>) {
match result {
Err(e) if e.is_unsupported() || e.is_unimplemented() => self.fail(format!(
"`{capability}` is advertised but `{method}` refuses it: {e}"
)),
Err(e) => self.fail(format!(
"`{capability}` is advertised but `{method}` fails on a valid fixture: {e}"
)),
Ok(_) => {}
}
}
fn fail(&mut self, failure: String) {
self.failures.push(failure);
}
#[track_caller]
fn finish(self) {
if !self.failures.is_empty() {
panic!(
"{} contract failure(s):\n{}",
self.failures.len(),
self.failures.join("\n")
);
}
}
}