xref: /freebsd/contrib/kyua/engine/googletest_result_test.cpp (revision eb8f69902f7de8012a31a85db2f88a54584f81af)
1*eb8f6990SEnji Cooper // Copyright 2024 The Kyua Authors.
2*eb8f6990SEnji Cooper // All rights reserved.
3*eb8f6990SEnji Cooper //
4*eb8f6990SEnji Cooper // Redistribution and use in source and binary forms, with or without
5*eb8f6990SEnji Cooper // modification, are permitted provided that the following conditions are
6*eb8f6990SEnji Cooper // met:
7*eb8f6990SEnji Cooper //
8*eb8f6990SEnji Cooper // * Redistributions of source code must retain the above copyright
9*eb8f6990SEnji Cooper //   notice, this list of conditions and the following disclaimer.
10*eb8f6990SEnji Cooper // * Redistributions in binary form must reproduce the above copyright
11*eb8f6990SEnji Cooper //   notice, this list of conditions and the following disclaimer in the
12*eb8f6990SEnji Cooper //   documentation and/or other materials provided with the distribution.
13*eb8f6990SEnji Cooper // * Neither the name of Google Inc. nor the names of its contributors
14*eb8f6990SEnji Cooper //   may be used to endorse or promote products derived from this software
15*eb8f6990SEnji Cooper //   without specific prior written permission.
16*eb8f6990SEnji Cooper //
17*eb8f6990SEnji Cooper // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*eb8f6990SEnji Cooper // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*eb8f6990SEnji Cooper // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*eb8f6990SEnji Cooper // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*eb8f6990SEnji Cooper // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*eb8f6990SEnji Cooper // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*eb8f6990SEnji Cooper // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*eb8f6990SEnji Cooper // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*eb8f6990SEnji Cooper // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*eb8f6990SEnji Cooper // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*eb8f6990SEnji Cooper // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*eb8f6990SEnji Cooper 
29*eb8f6990SEnji Cooper #include "engine/googletest_result.hpp"
30*eb8f6990SEnji Cooper 
31*eb8f6990SEnji Cooper extern "C" {
32*eb8f6990SEnji Cooper #include <signal.h>
33*eb8f6990SEnji Cooper }
34*eb8f6990SEnji Cooper 
35*eb8f6990SEnji Cooper #include <cstdlib>
36*eb8f6990SEnji Cooper #include <fstream>
37*eb8f6990SEnji Cooper #include <sstream>
38*eb8f6990SEnji Cooper #include <stdexcept>
39*eb8f6990SEnji Cooper 
40*eb8f6990SEnji Cooper #include <atf-c++.hpp>
41*eb8f6990SEnji Cooper 
42*eb8f6990SEnji Cooper #include "engine/exceptions.hpp"
43*eb8f6990SEnji Cooper #include "model/test_result.hpp"
44*eb8f6990SEnji Cooper #include "utils/format/macros.hpp"
45*eb8f6990SEnji Cooper #include "utils/fs/path.hpp"
46*eb8f6990SEnji Cooper #include "utils/process/status.hpp"
47*eb8f6990SEnji Cooper 
48*eb8f6990SEnji Cooper namespace fs = utils::fs;
49*eb8f6990SEnji Cooper namespace process = utils::process;
50*eb8f6990SEnji Cooper 
51*eb8f6990SEnji Cooper using utils::none;
52*eb8f6990SEnji Cooper using utils::optional;
53*eb8f6990SEnji Cooper 
54*eb8f6990SEnji Cooper 
55*eb8f6990SEnji Cooper namespace {
56*eb8f6990SEnji Cooper 
57*eb8f6990SEnji Cooper 
58*eb8f6990SEnji Cooper /// Performs a test for results::parse() that should succeed.
59*eb8f6990SEnji Cooper ///
60*eb8f6990SEnji Cooper /// \param exp_type The expected type of the result.
61*eb8f6990SEnji Cooper /// \param exp_reason The expected reason describing the result, if any.
62*eb8f6990SEnji Cooper /// \param text The literal input to parse; can include multiple lines.
63*eb8f6990SEnji Cooper static void
64*eb8f6990SEnji Cooper parse_ok_test(const engine::googletest_result::types& exp_type,
65*eb8f6990SEnji Cooper               const char* exp_reason, const char* text)
66*eb8f6990SEnji Cooper {
67*eb8f6990SEnji Cooper     std::istringstream input(text);
68*eb8f6990SEnji Cooper     const engine::googletest_result actual =
69*eb8f6990SEnji Cooper         engine::googletest_result::parse(input);
70*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(exp_type, actual.type());
71*eb8f6990SEnji Cooper     if (exp_reason != NULL) {
72*eb8f6990SEnji Cooper         ATF_REQUIRE(actual.reason());
73*eb8f6990SEnji Cooper         ATF_REQUIRE_EQ(exp_reason, actual.reason().get());
74*eb8f6990SEnji Cooper     } else {
75*eb8f6990SEnji Cooper         ATF_REQUIRE(!actual.reason());
76*eb8f6990SEnji Cooper     }
77*eb8f6990SEnji Cooper }
78*eb8f6990SEnji Cooper 
79*eb8f6990SEnji Cooper 
80*eb8f6990SEnji Cooper /// Wrapper around parse_ok_test to define a test case.
81*eb8f6990SEnji Cooper ///
82*eb8f6990SEnji Cooper /// \param name The name of the test case; will be prefixed with
83*eb8f6990SEnji Cooper ///     "googletest_result__parse__".
84*eb8f6990SEnji Cooper /// \param exp_type The expected type of the result.
85*eb8f6990SEnji Cooper /// \param exp_reason The expected reason describing the result, if any.
86*eb8f6990SEnji Cooper /// \param input The literal input to parse.
87*eb8f6990SEnji Cooper #define PARSE(name, exp_type, exp_reason, input) \
88*eb8f6990SEnji Cooper     ATF_TEST_CASE_WITHOUT_HEAD(googletest_result__parse__ ## name); \
89*eb8f6990SEnji Cooper     ATF_TEST_CASE_BODY(googletest_result__parse__ ## name) \
90*eb8f6990SEnji Cooper     { \
91*eb8f6990SEnji Cooper         parse_ok_test(exp_type, exp_reason, input); \
92*eb8f6990SEnji Cooper     }
93*eb8f6990SEnji Cooper 
94*eb8f6990SEnji Cooper 
95*eb8f6990SEnji Cooper }  // anonymous namespace
96*eb8f6990SEnji Cooper 
97*eb8f6990SEnji Cooper 
98*eb8f6990SEnji Cooper PARSE(broken,
99*eb8f6990SEnji Cooper       engine::googletest_result::broken, "invalid output",
100*eb8f6990SEnji Cooper       "invalid input");
101*eb8f6990SEnji Cooper 
102*eb8f6990SEnji Cooper const char disabled_context[] = (
103*eb8f6990SEnji Cooper "YOU HAVE 1 DISABLED TEST"
104*eb8f6990SEnji Cooper );
105*eb8f6990SEnji Cooper 
106*eb8f6990SEnji Cooper const char disabled_message[] = (
107*eb8f6990SEnji Cooper "[==========] Running 0 tests from 0 test cases.\n"
108*eb8f6990SEnji Cooper "[==========] 0 tests from 0 test cases ran. (0 ms total)\n"
109*eb8f6990SEnji Cooper "[  PASSED  ] 0 tests.\n"
110*eb8f6990SEnji Cooper "\n"
111*eb8f6990SEnji Cooper "  YOU HAVE 1 DISABLED TEST\n"
112*eb8f6990SEnji Cooper "\n"
113*eb8f6990SEnji Cooper "\n"
114*eb8f6990SEnji Cooper );
115*eb8f6990SEnji Cooper 
116*eb8f6990SEnji Cooper PARSE(disabled,
117*eb8f6990SEnji Cooper       engine::googletest_result::disabled, disabled_context,
118*eb8f6990SEnji Cooper       disabled_message);
119*eb8f6990SEnji Cooper 
120*eb8f6990SEnji Cooper const char failed_context[] = (
121*eb8f6990SEnji Cooper "pass_fail_demo.cc:8: Failure\n"
122*eb8f6990SEnji Cooper "Expected equality of these values:\n"
123*eb8f6990SEnji Cooper "  false\n"
124*eb8f6990SEnji Cooper "  true\n"
125*eb8f6990SEnji Cooper );
126*eb8f6990SEnji Cooper 
127*eb8f6990SEnji Cooper const char failed_message[] = (
128*eb8f6990SEnji Cooper "Note: Google Test filter = PassFailTest.Fails\n"
129*eb8f6990SEnji Cooper "[==========] Running 1 test from 1 test case.\n"
130*eb8f6990SEnji Cooper "[----------] Global test environment set-up.\n"
131*eb8f6990SEnji Cooper "[----------] 1 test from PassFailTest\n"
132*eb8f6990SEnji Cooper "[ RUN      ] PassFailTest.Fails\n"
133*eb8f6990SEnji Cooper "pass_fail_demo.cc:8: Failure\n"
134*eb8f6990SEnji Cooper "Expected equality of these values:\n"
135*eb8f6990SEnji Cooper "  false\n"
136*eb8f6990SEnji Cooper "  true\n"
137*eb8f6990SEnji Cooper "[  FAILED  ] PassFailTest.Fails (0 ms)\n"
138*eb8f6990SEnji Cooper "[----------] 1 test from PassFailTest (0 ms total)\n"
139*eb8f6990SEnji Cooper "\n"
140*eb8f6990SEnji Cooper "[----------] Global test environment tear-down\n"
141*eb8f6990SEnji Cooper "[==========] 1 test from 1 test case ran. (0 ms total)\n"
142*eb8f6990SEnji Cooper "[  PASSED  ] 0 tests.\n"
143*eb8f6990SEnji Cooper "[  FAILED  ] 1 test, listed below:\n"
144*eb8f6990SEnji Cooper "[  FAILED  ] PassFailTest.Fails\n"
145*eb8f6990SEnji Cooper "\n"
146*eb8f6990SEnji Cooper " 1 FAILED TEST\n"
147*eb8f6990SEnji Cooper );
148*eb8f6990SEnji Cooper 
149*eb8f6990SEnji Cooper PARSE(failed,
150*eb8f6990SEnji Cooper       engine::googletest_result::failed, failed_context,
151*eb8f6990SEnji Cooper       failed_message);
152*eb8f6990SEnji Cooper 
153*eb8f6990SEnji Cooper const char skipped_message[] = (
154*eb8f6990SEnji Cooper "Note: Google Test filter = SkipTest.DoesSkip\n"
155*eb8f6990SEnji Cooper "[==========] Running 1 test from 1 test suite.\n"
156*eb8f6990SEnji Cooper "[----------] Global test environment set-up.\n"
157*eb8f6990SEnji Cooper "[----------] 1 test from SkipTest\n"
158*eb8f6990SEnji Cooper "[ RUN      ] SkipTest.DoesSkip\n"
159*eb8f6990SEnji Cooper "[  SKIPPED ] SkipTest.DoesSkip (0 ms)\n"
160*eb8f6990SEnji Cooper "[----------] 1 test from SkipTest (0 ms total)\n"
161*eb8f6990SEnji Cooper "\n"
162*eb8f6990SEnji Cooper "[----------] Global test environment tear-down\n"
163*eb8f6990SEnji Cooper "[==========] 1 test from 1 test suite ran. (0 ms total)\n"
164*eb8f6990SEnji Cooper "[  PASSED  ] 0 tests.\n"
165*eb8f6990SEnji Cooper "[  SKIPPED ] 1 test, listed below:\n"
166*eb8f6990SEnji Cooper "[  SKIPPED ] SkipTest.DoesSkip\n"
167*eb8f6990SEnji Cooper );
168*eb8f6990SEnji Cooper 
169*eb8f6990SEnji Cooper PARSE(skipped,
170*eb8f6990SEnji Cooper       engine::googletest_result::skipped,
171*eb8f6990SEnji Cooper       engine::bogus_googletest_skipped_nul_message.c_str(),
172*eb8f6990SEnji Cooper       skipped_message
173*eb8f6990SEnji Cooper );
174*eb8f6990SEnji Cooper 
175*eb8f6990SEnji Cooper const char skipped_with_reason_context[] = (
176*eb8f6990SEnji Cooper "This is a reason\n"
177*eb8f6990SEnji Cooper );
178*eb8f6990SEnji Cooper 
179*eb8f6990SEnji Cooper const char skipped_with_reason_message[] = (
180*eb8f6990SEnji Cooper "Note: Google Test filter = SkipTest.SkipWithReason\n"
181*eb8f6990SEnji Cooper "[==========] Running 1 test from 1 test suite.\n"
182*eb8f6990SEnji Cooper "[----------] Global test environment set-up.\n"
183*eb8f6990SEnji Cooper "[----------] 1 test from SkipTest\n"
184*eb8f6990SEnji Cooper "[ RUN      ] SkipTest.SkipWithReason\n"
185*eb8f6990SEnji Cooper "This is a reason\n"
186*eb8f6990SEnji Cooper "[  SKIPPED ] SkipTest.SkipWithReason (0 ms)\n"
187*eb8f6990SEnji Cooper "[----------] 1 test from SkipTest (0 ms total)\n"
188*eb8f6990SEnji Cooper "\n"
189*eb8f6990SEnji Cooper "[----------] Global test environment tear-down\n"
190*eb8f6990SEnji Cooper "[==========] 1 test from 1 test suite ran. (0 ms total)\n"
191*eb8f6990SEnji Cooper "[  PASSED  ] 0 tests.\n"
192*eb8f6990SEnji Cooper "[  SKIPPED ] 1 test, listed below:\n"
193*eb8f6990SEnji Cooper "[  SKIPPED ] SkipTest.SkipWithReason\n"
194*eb8f6990SEnji Cooper );
195*eb8f6990SEnji Cooper 
196*eb8f6990SEnji Cooper PARSE(skipped_with_reason,
197*eb8f6990SEnji Cooper       engine::googletest_result::skipped, skipped_with_reason_context,
198*eb8f6990SEnji Cooper       skipped_with_reason_message);
199*eb8f6990SEnji Cooper 
200*eb8f6990SEnji Cooper const char successful_message[] = (
201*eb8f6990SEnji Cooper "Note: Google Test filter = PassFailTest.Passes\n"
202*eb8f6990SEnji Cooper "[==========] Running 1 test from 1 test case.\n"
203*eb8f6990SEnji Cooper "[----------] Global test environment set-up.\n"
204*eb8f6990SEnji Cooper "[----------] 1 test from PassFailTest\n"
205*eb8f6990SEnji Cooper "[ RUN      ] PassFailTest.Passes\n"
206*eb8f6990SEnji Cooper "[       OK ] PassFailTest.Passes (0 ms)\n"
207*eb8f6990SEnji Cooper "[----------] 1 test from PassFailTest (0 ms total)\n"
208*eb8f6990SEnji Cooper "\n"
209*eb8f6990SEnji Cooper "[----------] Global test environment tear-down\n"
210*eb8f6990SEnji Cooper "[==========] 1 test from 1 test case ran. (0 ms total)\n"
211*eb8f6990SEnji Cooper "[  PASSED  ] 1 test.\n"
212*eb8f6990SEnji Cooper );
213*eb8f6990SEnji Cooper 
214*eb8f6990SEnji Cooper PARSE(successful,
215*eb8f6990SEnji Cooper       engine::googletest_result::successful, NULL,
216*eb8f6990SEnji Cooper       successful_message);
217*eb8f6990SEnji Cooper 
218*eb8f6990SEnji Cooper const char successful_message2[] = (
219*eb8f6990SEnji Cooper "Note: Google Test filter = ValuesTest.ValuesWorks\n"
220*eb8f6990SEnji Cooper "[==========] Running 1 test from 1 test case.\n"
221*eb8f6990SEnji Cooper "[----------] Global test environment set-up.\n"
222*eb8f6990SEnji Cooper "[----------] 1 test from ValuesTest\n"
223*eb8f6990SEnji Cooper "[ RUN      ] ValuesTest.ValuesWorks\n"
224*eb8f6990SEnji Cooper "[       OK ] ValuesTest.ValuesWorks (0 ms)\n"
225*eb8f6990SEnji Cooper "[----------] 1 test from ValuesTest (0 ms total)\n"
226*eb8f6990SEnji Cooper "        \n"
227*eb8f6990SEnji Cooper "[----------] Global test environment tear-down\n"
228*eb8f6990SEnji Cooper "[==========] 1 test from 1 test case ran. (0 ms total)\n"
229*eb8f6990SEnji Cooper "[  PASSED  ] 1 test.\n"
230*eb8f6990SEnji Cooper );
231*eb8f6990SEnji Cooper 
232*eb8f6990SEnji Cooper PARSE(successful2,
233*eb8f6990SEnji Cooper       engine::googletest_result::successful, NULL,
234*eb8f6990SEnji Cooper       successful_message2);
235*eb8f6990SEnji Cooper 
236*eb8f6990SEnji Cooper const char successful_parameterized_message[] = (
237*eb8f6990SEnji Cooper "Note: Google Test filter = RangeZeroToFive/ParamDerivedTest/0\n"
238*eb8f6990SEnji Cooper "[==========] Running 5 tests from 1 test case.\n"
239*eb8f6990SEnji Cooper "[----------] Global test environment set-up.\n"
240*eb8f6990SEnji Cooper "[----------] 5 tests from RangeZeroToFive/ParamDerivedTest\n"
241*eb8f6990SEnji Cooper "[ RUN      ] RangeZeroToFive/ParamDerivedTest.SeesSequence/0\n"
242*eb8f6990SEnji Cooper "[       OK ] RangeZeroToFive/ParamDerivedTest.SeesSequence/0 (0 ms)\n"
243*eb8f6990SEnji Cooper "[----------] 1 test from RangeZeroToFive/ParamDerivedTest/0 (0 ms total)\n"
244*eb8f6990SEnji Cooper "\n"
245*eb8f6990SEnji Cooper "[----------] Global test environment tear-down\n"
246*eb8f6990SEnji Cooper "[==========] 1 tests from 1 test case ran. (0 ms total)\n"
247*eb8f6990SEnji Cooper "[  PASSED  ] 1 tests.\n"
248*eb8f6990SEnji Cooper );
249*eb8f6990SEnji Cooper 
250*eb8f6990SEnji Cooper PARSE(successful_parameterized,
251*eb8f6990SEnji Cooper       engine::googletest_result::successful, NULL,
252*eb8f6990SEnji Cooper       successful_parameterized_message);
253*eb8f6990SEnji Cooper 
254*eb8f6990SEnji Cooper const char successful_message_with_reason[] = (
255*eb8f6990SEnji Cooper "Note: Google Test filter = PassFailTest.PassesWithReason\n"
256*eb8f6990SEnji Cooper "[==========] Running 1 test from 1 test suite.\n"
257*eb8f6990SEnji Cooper "[----------] Global test environment set-up.\n"
258*eb8f6990SEnji Cooper "[----------] 1 test from PassFailTest\n"
259*eb8f6990SEnji Cooper "[ RUN      ] PassFailTest.PassesWithReason\n"
260*eb8f6990SEnji Cooper "This is a reason\n"
261*eb8f6990SEnji Cooper "[       OK ] PassFailTest.PassesWithReason (0 ms)\n"
262*eb8f6990SEnji Cooper "[----------] 1 test from PassFailTest (0 ms total)\n"
263*eb8f6990SEnji Cooper "\n"
264*eb8f6990SEnji Cooper "[----------] Global test environment tear-down\n"
265*eb8f6990SEnji Cooper "[==========] 1 test from 1 test suite ran. (0 ms total)\n"
266*eb8f6990SEnji Cooper "[  PASSED  ] 1 tests.\n"
267*eb8f6990SEnji Cooper );
268*eb8f6990SEnji Cooper 
269*eb8f6990SEnji Cooper PARSE(successful_with_reason,
270*eb8f6990SEnji Cooper       engine::googletest_result::successful, NULL,
271*eb8f6990SEnji Cooper       successful_message_with_reason);
272*eb8f6990SEnji Cooper 
273*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(googletest_result__load__ok);
274*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(googletest_result__load__ok)
275*eb8f6990SEnji Cooper {
276*eb8f6990SEnji Cooper     std::ofstream output("result.txt");
277*eb8f6990SEnji Cooper     ATF_REQUIRE(output);
278*eb8f6990SEnji Cooper     output << skipped_with_reason_message;
279*eb8f6990SEnji Cooper     output.close();
280*eb8f6990SEnji Cooper 
281*eb8f6990SEnji Cooper     const engine::googletest_result result = engine::googletest_result::load(
282*eb8f6990SEnji Cooper         utils::fs::path("result.txt"));
283*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(engine::googletest_result::skipped, result.type());
284*eb8f6990SEnji Cooper     ATF_REQUIRE(result.reason());
285*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(skipped_with_reason_context, result.reason().get());
286*eb8f6990SEnji Cooper }
287*eb8f6990SEnji Cooper 
288*eb8f6990SEnji Cooper 
289*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(googletest_result__load__missing_file);
290*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(googletest_result__load__missing_file)
291*eb8f6990SEnji Cooper {
292*eb8f6990SEnji Cooper     ATF_REQUIRE_THROW_RE(
293*eb8f6990SEnji Cooper         std::runtime_error, "Cannot open",
294*eb8f6990SEnji Cooper         engine::googletest_result::load(utils::fs::path("result.txt")));
295*eb8f6990SEnji Cooper }
296*eb8f6990SEnji Cooper 
297*eb8f6990SEnji Cooper 
298*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(googletest_result__apply__broken);
299*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(googletest_result__apply__broken)
300*eb8f6990SEnji Cooper {
301*eb8f6990SEnji Cooper     const process::status status = process::status::fake_exited(EXIT_FAILURE);
302*eb8f6990SEnji Cooper     const engine::googletest_result broken(engine::googletest_result::broken,
303*eb8f6990SEnji Cooper                                            "The reason");
304*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(broken, broken.apply(utils::make_optional(status)));
305*eb8f6990SEnji Cooper }
306*eb8f6990SEnji Cooper 
307*eb8f6990SEnji Cooper 
308*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(googletest_result__apply__disabled);
309*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(googletest_result__apply__disabled)
310*eb8f6990SEnji Cooper {
311*eb8f6990SEnji Cooper     const process::status status = process::status::fake_exited(EXIT_SUCCESS);
312*eb8f6990SEnji Cooper     const engine::googletest_result disabled(
313*eb8f6990SEnji Cooper         engine::googletest_result::disabled, "The reason");
314*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(disabled, disabled.apply(utils::make_optional(status)));
315*eb8f6990SEnji Cooper }
316*eb8f6990SEnji Cooper 
317*eb8f6990SEnji Cooper 
318*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(googletest_result__apply__failed);
319*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(googletest_result__apply__failed)
320*eb8f6990SEnji Cooper {
321*eb8f6990SEnji Cooper     const process::status status = process::status::fake_exited(EXIT_FAILURE);
322*eb8f6990SEnji Cooper     const engine::googletest_result failed(engine::googletest_result::failed,
323*eb8f6990SEnji Cooper                                            "The reason");
324*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(failed, failed.apply(utils::make_optional(status)));
325*eb8f6990SEnji Cooper }
326*eb8f6990SEnji Cooper 
327*eb8f6990SEnji Cooper 
328*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(googletest_result__apply__skipped);
329*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(googletest_result__apply__skipped)
330*eb8f6990SEnji Cooper {
331*eb8f6990SEnji Cooper     const process::status status = process::status::fake_exited(EXIT_SUCCESS);
332*eb8f6990SEnji Cooper     const engine::googletest_result skipped(engine::googletest_result::skipped,
333*eb8f6990SEnji Cooper                                             "The reason");
334*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(skipped, skipped.apply(utils::make_optional(status)));
335*eb8f6990SEnji Cooper }
336*eb8f6990SEnji Cooper 
337*eb8f6990SEnji Cooper 
338*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(googletest_result__apply__successful);
339*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(googletest_result__apply__successful)
340*eb8f6990SEnji Cooper {
341*eb8f6990SEnji Cooper     const process::status status = process::status::fake_exited(EXIT_SUCCESS);
342*eb8f6990SEnji Cooper     const engine::googletest_result
343*eb8f6990SEnji Cooper         successful(engine::googletest_result::successful);
344*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(successful, successful.apply(utils::make_optional(status)));
345*eb8f6990SEnji Cooper }
346*eb8f6990SEnji Cooper 
347*eb8f6990SEnji Cooper 
348*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(googletest_result__externalize__broken);
349*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(googletest_result__externalize__broken)
350*eb8f6990SEnji Cooper {
351*eb8f6990SEnji Cooper     const engine::googletest_result raw(engine::googletest_result::broken,
352*eb8f6990SEnji Cooper                                         "The reason");
353*eb8f6990SEnji Cooper     const model::test_result expected(model::test_result_broken,
354*eb8f6990SEnji Cooper                                       "The reason");
355*eb8f6990SEnji Cooper     ATF_REQUIRE(expected == raw.externalize());
356*eb8f6990SEnji Cooper }
357*eb8f6990SEnji Cooper 
358*eb8f6990SEnji Cooper 
359*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(googletest_result__externalize__disabled);
360*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(googletest_result__externalize__disabled)
361*eb8f6990SEnji Cooper {
362*eb8f6990SEnji Cooper     const engine::googletest_result raw(engine::googletest_result::disabled,
363*eb8f6990SEnji Cooper                                         "The reason");
364*eb8f6990SEnji Cooper     const model::test_result expected(model::test_result_skipped,
365*eb8f6990SEnji Cooper                                       "The reason");
366*eb8f6990SEnji Cooper     ATF_REQUIRE(expected == raw.externalize());
367*eb8f6990SEnji Cooper }
368*eb8f6990SEnji Cooper 
369*eb8f6990SEnji Cooper 
370*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(googletest_result__externalize__failed);
371*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(googletest_result__externalize__failed)
372*eb8f6990SEnji Cooper {
373*eb8f6990SEnji Cooper     const engine::googletest_result raw(engine::googletest_result::failed,
374*eb8f6990SEnji Cooper                                         "The reason");
375*eb8f6990SEnji Cooper     const model::test_result expected(model::test_result_failed,
376*eb8f6990SEnji Cooper                                       "The reason");
377*eb8f6990SEnji Cooper     ATF_REQUIRE(expected == raw.externalize());
378*eb8f6990SEnji Cooper }
379*eb8f6990SEnji Cooper 
380*eb8f6990SEnji Cooper 
381*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(googletest_result__externalize__skipped);
382*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(googletest_result__externalize__skipped)
383*eb8f6990SEnji Cooper {
384*eb8f6990SEnji Cooper     const engine::googletest_result raw(engine::googletest_result::skipped,
385*eb8f6990SEnji Cooper                                         "The reason");
386*eb8f6990SEnji Cooper     const model::test_result expected(model::test_result_skipped,
387*eb8f6990SEnji Cooper                                       "The reason");
388*eb8f6990SEnji Cooper     ATF_REQUIRE(expected == raw.externalize());
389*eb8f6990SEnji Cooper }
390*eb8f6990SEnji Cooper 
391*eb8f6990SEnji Cooper 
392*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(googletest_result__externalize__successful);
393*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(googletest_result__externalize__successful)
394*eb8f6990SEnji Cooper {
395*eb8f6990SEnji Cooper     const engine::googletest_result raw(engine::googletest_result::successful);
396*eb8f6990SEnji Cooper     const model::test_result expected(model::test_result_passed);
397*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(expected, raw.externalize());
398*eb8f6990SEnji Cooper }
399*eb8f6990SEnji Cooper 
400*eb8f6990SEnji Cooper 
401*eb8f6990SEnji Cooper ATF_INIT_TEST_CASES(tcs)
402*eb8f6990SEnji Cooper {
403*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__parse__broken);
404*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__parse__disabled);
405*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__parse__failed);
406*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__parse__skipped);
407*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__parse__skipped_with_reason);
408*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__parse__successful);
409*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__parse__successful2);
410*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__parse__successful_parameterized);
411*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__parse__successful_with_reason);
412*eb8f6990SEnji Cooper 
413*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__load__ok);
414*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__load__missing_file);
415*eb8f6990SEnji Cooper 
416*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__apply__broken);
417*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__apply__disabled);
418*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__apply__failed);
419*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__apply__skipped);
420*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__apply__successful);
421*eb8f6990SEnji Cooper 
422*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__externalize__broken);
423*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__externalize__disabled);
424*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__externalize__failed);
425*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__externalize__skipped);
426*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, googletest_result__externalize__successful);
427*eb8f6990SEnji Cooper }
428