temper_std/testing/
mod.rs1use temper_core::AnyValueTrait;
2use temper_core::AsAnyValue;
3use temper_core::Pair;
4pub (crate) fn init() -> temper_core::Result<()> {
5 static INIT_ONCE: std::sync::OnceLock<temper_core::Result<()>> = std::sync::OnceLock::new();
6 INIT_ONCE.get_or_init(| |{
7 Ok(())
8 }).clone()
9}
10struct TestStruct {
11 failed_on_assert: bool, passing: bool, messages: temper_core::ListBuilder<std::sync::Arc<String>>
12}
13#[ derive(Clone)] pub struct Test(std::sync::Arc<std::sync::RwLock<TestStruct>>);
14impl Test {
15pub fn assert(& self, success__38: bool, message__39: std::sync::Arc<dyn Fn () -> std::sync::Arc<String> + std::marker::Send + std::marker::Sync>) {
16 let mut t___353: std::sync::Arc<String>;
17 if ! success__38 {
18 self.0.write().unwrap().passing = false;
19 t___353 = message__39();
20 temper_core::listed::add( & self.0.read().unwrap().messages, t___353.clone(), None);
21 }
22}
23pub fn assert_hard(& self, success__42: bool, message__43: std::sync::Arc<dyn Fn () -> std::sync::Arc<String> + std::marker::Send + std::marker::Sync>) -> temper_core::Result<()> {
24 self.assert(success__42, message__43.clone());
25 if ! success__42 {
26 self.0.write().unwrap().failed_on_assert = true;
27 Err(temper_core::Error::with_optional_message(self.messages_combined())) ? ;
28 }
29 return Ok(());
30}
31pub fn soft_fail_to_hard(& self) -> temper_core::Result<()> {
32 if self.has_unhandled_fail() {
33 self.0.write().unwrap().failed_on_assert = true;
34 Err(temper_core::Error::with_optional_message(self.messages_combined())) ? ;
35 }
36 return Ok(());
37}
38pub fn passing(& self) -> bool {
39 return self.0.read().unwrap().passing;
40}
41pub fn messages(& self) -> temper_core::List<std::sync::Arc<String>> {
42 return temper_core::ListedTrait::to_list( & self.0.read().unwrap().messages);
43}
44pub fn failed_on_assert(& self) -> bool {
45 return self.0.read().unwrap().failed_on_assert;
46}
47pub fn has_unhandled_fail(& self) -> bool {
48 let mut t___224: bool;
49 if self.0.read().unwrap().failed_on_assert {
50 t___224 = true;
51 } else {
52 t___224 = self.0.read().unwrap().passing;
53 }
54 return ! t___224;
55}
56pub fn messages_combined(& self) -> Option<std::sync::Arc<String>> {
57 let return__31: Option<std::sync::Arc<String>>;
58 if temper_core::ListedTrait::is_empty( & self.0.read().unwrap().messages) {
59 return__31 = None;
60 } else {
61 #[ derive(Clone)] struct ClosureGroup___1 {}
62 impl ClosureGroup___1 {
63 fn fn__346(& self, it__59: impl temper_core::ToArcString) -> std::sync::Arc<String> {
64 let it__59 = it__59.to_arc_string();
65 return it__59.clone();
66 }
67 }
68 let closure_group = ClosureGroup___1 {};
69 let fn__346 = {
70 let closure_group = closure_group.clone();
71 std::sync::Arc::new(move | it__59: std::sync::Arc<String> | closure_group.fn__346(it__59))
72 };
73 return__31 = Some(temper_core::listed::join( & self.0.read().unwrap().messages, std::sync::Arc::new(", ".to_string()), & ( * fn__346.clone())));
74}
75return return__31.clone();
76}
77pub fn new() -> Test {
78let failed_on_assert;
79let passing;
80let messages;
81failed_on_assert = false;
82passing = true;
83let mut t___345: temper_core::ListBuilder<std::sync::Arc<String>> = temper_core::listed::new_builder();
84messages = t___345.clone();
85let selfish = Test(std::sync::Arc::new(std::sync::RwLock::new(TestStruct {
86 failed_on_assert, passing, messages
87})));
88return selfish;
89}
90}
91temper_core::impl_any_value_trait!(Test, []);
92pub fn process_test_cases(testCases__64: impl temper_core::ToList<(std::sync::Arc<String>, std::sync::Arc<dyn Fn (Test) -> temper_core::Result<()> + std::marker::Send + std::marker::Sync>)>) -> temper_core::List<(std::sync::Arc<String>, temper_core::List<std::sync::Arc<String>>)> {
93let testCases__64 = testCases__64.to_list();
94#[ derive(Clone)] struct ClosureGroup___2 {}
95impl ClosureGroup___2 {
96fn fn__342(& self, testCase__66: (std::sync::Arc<String>, std::sync::Arc<dyn Fn (Test) -> temper_core::Result<()> + std::marker::Send + std::marker::Sync>)) ->(std::sync::Arc<String>, temper_core::List<std::sync::Arc<String>>) {
97 let mut t___337: bool;
98 let mut t___340: temper_core::List<std::sync::Arc<String>>;
99 let mut t___206: bool;
100 let mut t___208: bool;
101 let key__68: std::sync::Arc<String> = testCase__66.key();
102 let fun__69: std::sync::Arc<dyn Fn (Test) -> temper_core::Result<()> + std::marker::Send + std::marker::Sync> = testCase__66.value();
103 let test__70: Test = Test::new();
104 let mut hadBubble__71: bool = false;
105 'ok___2530: {
106 'orelse___108: {
107 match fun__69(test__70.clone()) {
108 Ok(x) => x,
109 _ => break 'orelse___108
110 };
111 break 'ok___2530;
112 }
113 hadBubble__71 = true;
114 }
115 let messages__72: temper_core::List<std::sync::Arc<String>> = test__70.messages();
116 let failures__73: temper_core::List<std::sync::Arc<String>>;
117 if test__70.passing() {
118 t___206 = ! hadBubble__71;
119 } else {
120 t___206 = false;
121 }
122 if t___206 {
123 failures__73 = std::sync::Arc::new(vec![]);
124 } else {
125 if hadBubble__71 {
126 t___337 = test__70.failed_on_assert();
127 t___208 = ! t___337;
128 } else {
129 t___208 = false;
130 }
131 if t___208 {
132 let allMessages__74: temper_core::ListBuilder<std::sync::Arc<String>> = temper_core::ListedTrait::to_list_builder( & messages__72);
133 temper_core::listed::add( & allMessages__74, std::sync::Arc::new("Bubble".to_string()), None);
134 t___340 = temper_core::ListedTrait::to_list( & allMessages__74);
135 failures__73 = t___340.clone();
136 } else {
137 failures__73 = messages__72.clone();
138 }
139 }
140 return (key__68.clone(), failures__73.clone());
141}
142}
143let closure_group = ClosureGroup___2 {};
144let fn__342 = {
145let closure_group = closure_group.clone();
146std::sync::Arc::new(move | testCase__66: (std::sync::Arc<String>, std::sync::Arc<dyn Fn (Test) -> temper_core::Result<()> + std::marker::Send + std::marker::Sync>) | closure_group.fn__342(testCase__66))
147};
148return temper_core::listed::map( & testCases__64, & ( * fn__342.clone()));
149}
150pub fn report_test_results(testResults__75: impl temper_core::ToList<(std::sync::Arc<String>, temper_core::List<std::sync::Arc<String>>)>, writeLine__76: std::sync::Arc<dyn Fn (std::sync::Arc<String>) + std::marker::Send + std::marker::Sync>) {
151let testResults__75 = testResults__75.to_list();
152let mut t___317: i32;
153writeLine__76(std::sync::Arc::new("<testsuites>".to_string()));
154let total__79: std::sync::Arc<String> = temper_core::int_to_string(temper_core::ListedTrait::len( & testResults__75), None);
155#[ derive(Clone)] struct ClosureGroup___3 {}
156impl ClosureGroup___3 {
157fn fn__309(& self, fails__81: i32, testResult__82: (std::sync::Arc<String>, temper_core::List<std::sync::Arc<String>>)) -> i32 {
158 let mut t___180: i32;
159 if temper_core::ListedTrait::is_empty( & testResult__82.value()) {
160 t___180 = 0;
161 } else {
162 t___180 = 1;
163 }
164 return fails__81.wrapping_add(t___180);
165}
166}
167let closure_group = ClosureGroup___3 {};
168let fn__309 = {
169let closure_group = closure_group.clone();
170std::sync::Arc::new(move | fails__81: i32, testResult__82: (std::sync::Arc<String>, temper_core::List<std::sync::Arc<String>>) | closure_group.fn__309(fails__81, testResult__82))
171};
172let fails__80: std::sync::Arc<String> = temper_core::int_to_string(temper_core::listed::reduce_from( & testResults__75, 0, & ( * fn__309.clone())), None);
173let totals__84: std::sync::Arc<String> = std::sync::Arc::new(format!("tests='{}' failures='{}'", total__79.clone(), fails__80.clone()));
174writeLine__76(std::sync::Arc::new(format!(" <testsuite name='suite' {} time='0.0'>", totals__84.clone())));
175let mut i__88: i32 = 0;
176#[ derive(Clone)] struct ClosureGroup___4 {}
177impl ClosureGroup___4 {
178fn escape__78(& self, s__85: impl temper_core::ToArcString) -> std::sync::Arc<String> {
179 let s__85 = s__85.to_arc_string();
180 let mut t___303: temper_core::List<std::sync::Arc<String>> = temper_core::string::split( & s__85, "'");
181 #[ derive(Clone)] struct ClosureGroup___5 {}
182impl ClosureGroup___5 {
183 fn fn__302(& self, x__87: impl temper_core::ToArcString) -> std::sync::Arc<String> {
184 let x__87 = x__87.to_arc_string();
185 return x__87.clone();
186 }
187}
188let closure_group = ClosureGroup___5 {};
189let fn__302 = {
190 let closure_group = closure_group.clone();
191 std::sync::Arc::new(move | x__87: std::sync::Arc<String> | closure_group.fn__302(x__87))
192};
193return temper_core::listed::join( & t___303, std::sync::Arc::new("'".to_string()), & ( * fn__302.clone()));
194}
195}
196let closure_group = ClosureGroup___4 {};
197let escape__78 = {
198let closure_group = closure_group.clone();
199std::sync::Arc::new(move | s__85: std::sync::Arc<String> | closure_group.escape__78(s__85))
200};
201'loop___2640: loop {
202t___317 = temper_core::ListedTrait::len( & testResults__75);
203if ! (Some(i__88) < Some(t___317)) {
204 break;
205}
206let testResult__89: (std::sync::Arc<String>, temper_core::List<std::sync::Arc<String>>) = temper_core::ListedTrait::get( & testResults__75, i__88);
207let failureMessages__90: temper_core::List<std::sync::Arc<String>> = testResult__89.value();
208let name__91: std::sync::Arc<String> = escape__78(testResult__89.key());
209let basics__92: std::sync::Arc<String> = std::sync::Arc::new(format!("name='{}' classname='{}' time='0.0'", name__91.clone(), name__91.clone()));
210if temper_core::ListedTrait::is_empty( & failureMessages__90) {
211 writeLine__76(std::sync::Arc::new(format!(" <testcase {} />", basics__92.clone())));
212} else {
213 writeLine__76(std::sync::Arc::new(format!(" <testcase {}>", basics__92.clone())));
214 #[ derive(Clone)] struct ClosureGroup___6 {}
215impl ClosureGroup___6 {
216 fn fn__308(& self, it__94: impl temper_core::ToArcString) -> std::sync::Arc<String> {
217 let it__94 = it__94.to_arc_string();
218 return it__94.clone();
219 }
220}
221let closure_group = ClosureGroup___6 {};
222let fn__308 = {
223 let closure_group = closure_group.clone();
224 std::sync::Arc::new(move | it__94: std::sync::Arc<String> | closure_group.fn__308(it__94))
225};
226let message__93: std::sync::Arc<String> = escape__78(temper_core::listed::join( & failureMessages__90, std::sync::Arc::new(", ".to_string()), & ( * fn__308.clone())));
227writeLine__76(std::sync::Arc::new(format!(" <failure message='{}' />", message__93.clone())));
228writeLine__76(std::sync::Arc::new(" </testcase>".to_string()));
229}
230i__88 = i__88.wrapping_add(1);
231}
232writeLine__76(std::sync::Arc::new(" </testsuite>".to_string()));
233writeLine__76(std::sync::Arc::new("</testsuites>".to_string()));
234}
235pub fn run_test_cases(testCases__95: impl temper_core::ToList<(std::sync::Arc<String>, std::sync::Arc<dyn Fn (Test) -> temper_core::Result<()> + std::marker::Send + std::marker::Sync>)>) -> std::sync::Arc<String> {
236let testCases__95 = testCases__95.to_list();
237let report__97: std::sync::Arc<std::sync::RwLock<String>> = std::sync::Arc::new(std::sync::RwLock::new(String::new()));
238let mut t___298: temper_core::List<(std::sync::Arc<String>, temper_core::List<std::sync::Arc<String>>)> = process_test_cases(testCases__95.clone());
239#[ derive(Clone)] struct ClosureGroup___7 {
240report__97: std::sync::Arc<std::sync::RwLock<String>>
241}
242impl ClosureGroup___7 {
243fn fn__296(& self, line__98: impl temper_core::ToArcString) {
244 let line__98 = line__98.to_arc_string();
245 temper_core::string::builder::append( & self.report__97, line__98.clone());
246 temper_core::string::builder::append( & self.report__97, "\x0a");
247}
248}
249let closure_group = ClosureGroup___7 {
250report__97: report__97.clone()
251};
252let fn__296 = {
253let closure_group = closure_group.clone();
254std::sync::Arc::new(move | line__98: std::sync::Arc<String> | closure_group.fn__296(line__98))
255};
256report_test_results(t___298.clone(), fn__296.clone());
257return temper_core::string::builder::to_string( & report__97);
258}
259pub fn run_test(testFun__99: std::sync::Arc<dyn Fn (Test) -> temper_core::Result<()> + std::marker::Send + std::marker::Sync>) -> temper_core::Result<()> {
260let test__101: Test = Test::new();
261'ok___2542: {
262 'orelse___109: {
263 match testFun__99(test__101.clone()) {
264 Ok(x) => x,
265 _ => break 'orelse___109
266 };
267 break 'ok___2542;
268 }
269 #[ derive(Clone)] struct ClosureGroup___8 {}
270impl ClosureGroup___8 {
271 fn fn__290(& self) -> std::sync::Arc<String> {
272 return std::sync::Arc::new("bubble during test running".to_string());
273 }
274}
275let closure_group = ClosureGroup___8 {};
276let fn__290 = {
277 let closure_group = closure_group.clone();
278 std::sync::Arc::new(move | | closure_group.fn__290())
279};
280test__101.assert(false, fn__290.clone());
281}
282test__101.soft_fail_to_hard() ? ;
283return Ok(());
284}