#![no_std]
#![doc = include_str!("../crate_docs.md")]
#![cfg_attr(docsrs, feature(doc_cfg), doc(auto_cfg))]
#[macro_use]
extern crate alloc;
#[cfg(feature = "std")]
extern crate std;
#[doc(hidden)]
pub extern crate alloc as __alloc;
#[cfg(feature = "test-that-macro")]
extern crate test_that_macro;
#[cfg(test)]
extern crate quickcheck;
#[macro_use]
pub mod assertions;
pub mod description;
pub mod internal;
pub mod matcher;
pub mod matcher_support;
pub mod matchers;
#[cfg(feature = "googletest-compat")]
pub mod compat;
pub mod prelude {
pub use super::OrFailExt;
#[cfg(feature = "googletest-compat")]
#[allow(deprecated)]
pub use super::Result;
pub use super::TestResult;
pub use super::TestResultExt;
#[cfg(feature = "googletest-compat")]
#[allow(deprecated)]
pub use super::compat::IntoTestResult;
pub use super::matcher::Matcher;
pub use super::matcher::MatcherExt;
pub use super::matchers::containers::*;
pub use super::matchers::*;
#[cfg(feature = "std")]
pub use super::verify_current_test_outcome;
pub use super::{assert_that, fail, verify_pred, verify_that};
#[cfg(feature = "non-fatal-assertions")]
pub use super::{expect_pred, expect_that};
}
use alloc::string::String;
#[cfg(feature = "non-fatal-assertions")]
pub use test_that_macro::test;
use internal::test_outcome::{TestAssertionFailure, TestOutcome};
pub type TestResult<T> = core::result::Result<T, TestAssertionFailure>;
#[cfg(feature = "googletest-compat")]
#[cfg_attr(feature = "googletest-migrate", deprecated(note = "Use TestResult instead"))]
pub type Result<T> = TestResult<T>;
#[cfg(feature = "std")]
pub fn verify_current_test_outcome() -> TestResult<()> {
TestOutcome::get_current_test_outcome()
}
pub trait TestResultExt {
fn and_log_failure(self);
fn failure_message(self, message: impl Into<String>) -> Self;
fn with_failure_message(self, provider: impl FnOnce() -> String) -> Self;
}
impl<T> TestResultExt for core::result::Result<T, TestAssertionFailure> {
fn and_log_failure(self) {
TestOutcome::ensure_text_context_present();
if let Err(failure) = self {
failure.log();
}
}
fn failure_message(mut self, message: impl Into<String>) -> Self {
if let Err(ref mut failure) = self {
failure.custom_message = Some(message.into());
}
self
}
fn with_failure_message(mut self, provider: impl FnOnce() -> String) -> Self {
if let Err(ref mut failure) = self {
failure.custom_message = Some(provider());
}
self
}
}
pub trait OrFailExt<T> {
fn or_fail(self) -> TestResult<T>;
}
#[cfg(feature = "anyhow")]
impl<T> OrFailExt<T> for core::result::Result<T, anyhow::Error> {
fn or_fail(self) -> core::result::Result<T, TestAssertionFailure> {
self.map_err(|e| TestAssertionFailure::create(alloc::format!("{e:#}")))
}
}
#[cfg(feature = "proptest")]
impl<OkT, CaseT: core::fmt::Debug> OrFailExt<OkT>
for core::result::Result<OkT, proptest::test_runner::TestError<CaseT>>
{
fn or_fail(self) -> core::result::Result<OkT, TestAssertionFailure> {
self.map_err(|e| TestAssertionFailure::create(alloc::format!("{e}")))
}
}