temper_std/testing/
mod.rs

1use 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("&apos;".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}