#![doc = include_str!("../README.md")]
pub use edtest_macros::rstest;
pub use rstest::fixture;
pub use serial_test::serial;
pub use static_assertions::*;
#[macro_export]
macro_rules! set_snapshot_suffix {
($($expr:expr),*) => {
let mut settings = insta::Settings::clone_current();
let raw_suffix = format!($($expr,)*);
let cleaned = $crate::internal::clean_snapshot_suffix(&raw_suffix);
settings.set_snapshot_suffix(cleaned);
let _guard = settings.bind_to_scope();
}
}
#[doc(hidden)]
pub mod internal {
use core::hint::black_box;
use core::sync::atomic::{AtomicUsize, Ordering};
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
static COUNTER: AtomicUsize = AtomicUsize::new(0);
#[doc(hidden)]
pub fn clean_snapshot_suffix(input: &str) -> String {
let mut hasher = DefaultHasher::new();
input.hash(&mut hasher);
let h: u64 = hasher.finish();
format!("{:016x}", h)
}
pub fn on_test_enter(name: &str) {
black_box(name.len());
COUNTER.fetch_add(1, Ordering::Relaxed);
}
pub fn on_test_exit() {
COUNTER.fetch_add(1, Ordering::Relaxed);
}
}
#[doc(hidden)]
pub struct TestGuard;
#[allow(clippy::new_without_default)]
impl TestGuard {
#[inline(always)]
pub fn new() -> Self {
Self
}
}
impl Drop for TestGuard {
fn drop(&mut self) {
internal::on_test_exit();
}
}
#[cfg(test)]
mod tests {
#[test]
fn internal_hooks_execute() {
crate::internal::on_test_enter("sample");
let _g = crate::TestGuard::new();
crate::internal::on_test_exit();
}
#[test]
fn hashes_suffix_general() {
use crate::internal::clean_snapshot_suffix as clean;
let s = "a/b\\c:d*e?f|g<h>i\"j k.";
let h = clean(s);
assert_eq!(h.len(), 16);
assert!(h
.chars()
.all(|c| c.is_ascii_hexdigit() && (c.is_ascii_lowercase() || c.is_ascii_digit())));
assert_eq!(h, clean(s));
assert_ne!(h, clean("different"));
}
#[test]
fn hash_properties_reserved_and_empty() {
use crate::internal::clean_snapshot_suffix as clean;
assert_ne!(clean("CON"), clean("con"));
let e = clean("");
assert_eq!(e.len(), 16);
assert!(e
.chars()
.all(|c| c.is_ascii_hexdigit() && (c.is_ascii_lowercase() || c.is_ascii_digit())));
}
}