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 use fluent_test_macros::{after_all, before_all, setup, tear_down, with_fixtures, with_fixtures_module};
57
58#[ctor::dtor]
60fn run_after_all_fixtures() {
61 backend::fixtures::run_after_all_fixtures();
62}
63
64pub mod matchers {
66 pub use crate::backend::matchers::boolean::BooleanMatchers;
67 pub use crate::backend::matchers::collection::{CollectionExtensions, CollectionMatchers};
68 pub use crate::backend::matchers::equality::EqualityMatchers;
69 pub use crate::backend::matchers::hashmap::HashMapMatchers;
70 pub use crate::backend::matchers::numeric::NumericMatchers;
71 pub use crate::backend::matchers::option::OptionMatchers;
72 pub use crate::backend::matchers::result::ResultMatchers;
73 pub use crate::backend::matchers::string::StringMatchers;
74}
75
76pub mod prelude {
78 pub use crate::backend::Assertion;
79 pub use crate::expect;
80 pub use crate::expect_not;
81
82 pub use crate::{after_all, before_all, setup, tear_down, with_fixtures, with_fixtures_module};
84
85 pub use crate::matchers::*;
87
88 pub use crate::backend::modifiers::*;
90
91 pub use crate::config;
93 pub use crate::initialize;
94
95 #[cfg(test)]
96 pub use crate::auto_initialize_for_tests;
97}
98
99pub use crate::config::Config;
101pub use crate::reporter::Reporter;
102
103pub fn config() -> Config {
105 Config::new()
106}
107
108#[macro_export]
110macro_rules! expect {
111 ($expr:expr) => {{
112 $crate::auto_initialize_for_tests();
114
115 $crate::backend::Assertion::new($expr, stringify!($expr))
116 }};
117}
118
119#[macro_export]
122macro_rules! expect_not {
123 ($expr:expr) => {{
124 $crate::auto_initialize_for_tests();
126
127 use $crate::backend::modifiers::NotModifier;
128 $crate::backend::Assertion::new($expr, stringify!($expr)).not()
129 }};
130}
131
132#[macro_export]
137macro_rules! fluent_test {
138 () => {
139 #[test]
140 fn _fluent_test_runner() {
141 $crate::auto_initialize_for_tests();
143
144 let enhanced_output = $crate::config::is_enhanced_output_enabled();
146
147 if enhanced_output {
149 struct ReportOnDrop;
151 impl Drop for ReportOnDrop {
152 fn drop(&mut self) {
153 $crate::Reporter::summarize();
154 }
155 }
156
157 let _guard = ReportOnDrop;
158 }
159
160 }
162 };
163}
164
165#[cfg(test)]
167pub mod test_utils {
168 pub use crate::backend::matchers::boolean::BooleanMatchers;
170 pub use crate::backend::matchers::collection::{CollectionExtensions, CollectionMatchers};
171 pub use crate::backend::matchers::equality::EqualityMatchers;
172 pub use crate::backend::matchers::hashmap::HashMapMatchers;
173 pub use crate::backend::matchers::numeric::NumericMatchers;
174 pub use crate::backend::matchers::option::OptionMatchers;
175 pub use crate::backend::matchers::result::ResultMatchers;
176 pub use crate::backend::matchers::string::StringMatchers;
177
178 pub fn setup_tests() {
180 crate::config().enhanced_output(true).apply();
182 }
183
184 #[test]
187 #[ignore]
188 fn _setup_for_tests() {
189 setup_tests();
190 }
191}