#![doc=include_str!("../README.md")]
mod borrow;
mod expectation_list;
pub mod expectations;
mod projection;
mod root;
pub use borrow::BorrowedOrOwned;
pub use expectation_list::ExpectationList;
pub use projection::ExpectProjection;
pub use projection::ProjectedExpectationsBuilder;
pub use root::RootExpectations;
use std::fmt::Debug;
#[doc = include_str!("../README.md")]
#[cfg(doctest)]
pub struct ReadmeDoctests;
#[derive(Clone, Debug)]
pub enum CheckResult {
Pass,
Fail(String),
}
pub trait Expectation<T: Debug> {
fn check(&self, value: &T) -> CheckResult;
}
pub trait ExpectationBuilder<'e> {
type Value: Debug + 'e;
fn to_pass(self, expectation: impl Expectation<Self::Value> + 'e) -> Self;
}
pub fn expect<'e, T: Debug>(value: T) -> RootExpectations<'e, T> {
RootExpectations::new(value)
}
pub fn expect_ref<T: Debug>(value: &'_ T) -> RootExpectations<'_, T> {
RootExpectations::new_ref(value)
}
#[cfg(test)]
pub(crate) mod tests {
use crate::{CheckResult, Expectation};
use std::fmt::Debug;
use std::rc::Rc;
use std::sync::Mutex;
pub(crate) struct TestExpectation {
pub asserted: Rc<Mutex<bool>>,
result: CheckResult,
}
impl TestExpectation {
pub fn new(result: CheckResult) -> (TestExpectation, Rc<Mutex<bool>>) {
let asserted = Rc::new(Mutex::new(false));
(
TestExpectation {
asserted: asserted.clone(),
result,
},
asserted,
)
}
}
impl<T: Debug> Expectation<T> for TestExpectation {
fn check(&self, _: &T) -> CheckResult {
let mut asserted = self.asserted.lock().unwrap();
*asserted = true;
self.result.clone()
}
}
}