1#![allow(clippy::needless_return)]
25
26use std::sync::Once;
30
31static TEST_INIT: Once = Once::new();
33
34pub mod backend;
35pub mod config;
36pub mod events;
37pub mod frontend;
38mod reporter;
39
40pub fn auto_initialize_for_tests() {
42 TEST_INIT.call_once(|| {
43 let config = config::Config::new();
45 if config.enhanced_output {
46 config.apply();
48 }
49 });
50}
51
52pub use config::initialize;
54
55pub mod matchers {
57 pub use crate::backend::matchers::boolean::BooleanMatchers;
58 pub use crate::backend::matchers::collection::{CollectionExtensions, CollectionMatchers};
59 pub use crate::backend::matchers::equality::EqualityMatchers;
60 pub use crate::backend::matchers::hashmap::HashMapMatchers;
61 pub use crate::backend::matchers::numeric::NumericMatchers;
62 pub use crate::backend::matchers::option::OptionMatchers;
63 pub use crate::backend::matchers::result::ResultMatchers;
64 pub use crate::backend::matchers::string::StringMatchers;
65}
66
67pub mod prelude {
69 pub use crate::backend::Assertion;
70 pub use crate::expect;
71 pub use crate::expect_not;
72
73 pub use crate::matchers::*;
75
76 pub use crate::backend::modifiers::*;
78
79 pub use crate::config;
81 pub use crate::initialize;
82
83 #[cfg(test)]
84 pub use crate::auto_initialize_for_tests;
85}
86
87pub use crate::config::Config;
89pub use crate::reporter::Reporter;
90
91pub fn config() -> Config {
93 Config::new()
94}
95
96#[macro_export]
98macro_rules! expect {
99 ($expr:expr) => {{
100 $crate::auto_initialize_for_tests();
102
103 $crate::backend::Assertion::new($expr, stringify!($expr))
104 }};
105}
106
107#[macro_export]
110macro_rules! expect_not {
111 ($expr:expr) => {{
112 $crate::auto_initialize_for_tests();
114
115 use $crate::backend::modifiers::NotModifier;
116 $crate::backend::Assertion::new($expr, stringify!($expr)).not()
117 }};
118}
119
120#[macro_export]
125macro_rules! fluent_test {
126 () => {
127 #[test]
128 fn _fluent_test_runner() {
129 $crate::auto_initialize_for_tests();
131
132 let enhanced_output = $crate::config::is_enhanced_output_enabled();
134
135 if enhanced_output {
137 struct ReportOnDrop;
139 impl Drop for ReportOnDrop {
140 fn drop(&mut self) {
141 $crate::Reporter::summarize();
142 }
143 }
144
145 let _guard = ReportOnDrop;
146 }
147
148 }
150 };
151}
152
153#[cfg(test)]
155pub mod test_utils {
156 pub use crate::backend::matchers::boolean::BooleanMatchers;
158 pub use crate::backend::matchers::collection::{CollectionExtensions, CollectionMatchers};
159 pub use crate::backend::matchers::equality::EqualityMatchers;
160 pub use crate::backend::matchers::hashmap::HashMapMatchers;
161 pub use crate::backend::matchers::numeric::NumericMatchers;
162 pub use crate::backend::matchers::option::OptionMatchers;
163 pub use crate::backend::matchers::result::ResultMatchers;
164 pub use crate::backend::matchers::string::StringMatchers;
165
166 pub fn setup_tests() {
168 crate::config().enhanced_output(true).apply();
170 }
171
172 #[test]
175 #[ignore]
176 fn _setup_for_tests() {
177 setup_tests();
178 }
179}