xref: /freebsd/contrib/kyua/model/test_program_test.cpp (revision b0d29bc47dba79f6f38e67eabadfb4b32ffd9390)
1*b0d29bc4SBrooks Davis // Copyright 2010 The Kyua Authors.
2*b0d29bc4SBrooks Davis // All rights reserved.
3*b0d29bc4SBrooks Davis //
4*b0d29bc4SBrooks Davis // Redistribution and use in source and binary forms, with or without
5*b0d29bc4SBrooks Davis // modification, are permitted provided that the following conditions are
6*b0d29bc4SBrooks Davis // met:
7*b0d29bc4SBrooks Davis //
8*b0d29bc4SBrooks Davis // * Redistributions of source code must retain the above copyright
9*b0d29bc4SBrooks Davis //   notice, this list of conditions and the following disclaimer.
10*b0d29bc4SBrooks Davis // * Redistributions in binary form must reproduce the above copyright
11*b0d29bc4SBrooks Davis //   notice, this list of conditions and the following disclaimer in the
12*b0d29bc4SBrooks Davis //   documentation and/or other materials provided with the distribution.
13*b0d29bc4SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
14*b0d29bc4SBrooks Davis //   may be used to endorse or promote products derived from this software
15*b0d29bc4SBrooks Davis //   without specific prior written permission.
16*b0d29bc4SBrooks Davis //
17*b0d29bc4SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*b0d29bc4SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*b0d29bc4SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*b0d29bc4SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*b0d29bc4SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*b0d29bc4SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*b0d29bc4SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*b0d29bc4SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*b0d29bc4SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*b0d29bc4SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*b0d29bc4SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*b0d29bc4SBrooks Davis 
29*b0d29bc4SBrooks Davis #include "model/test_program.hpp"
30*b0d29bc4SBrooks Davis 
31*b0d29bc4SBrooks Davis extern "C" {
32*b0d29bc4SBrooks Davis #include <sys/stat.h>
33*b0d29bc4SBrooks Davis 
34*b0d29bc4SBrooks Davis #include <signal.h>
35*b0d29bc4SBrooks Davis }
36*b0d29bc4SBrooks Davis 
37*b0d29bc4SBrooks Davis #include <set>
38*b0d29bc4SBrooks Davis #include <sstream>
39*b0d29bc4SBrooks Davis 
40*b0d29bc4SBrooks Davis #include <atf-c++.hpp>
41*b0d29bc4SBrooks Davis 
42*b0d29bc4SBrooks Davis #include "model/exceptions.hpp"
43*b0d29bc4SBrooks Davis #include "model/metadata.hpp"
44*b0d29bc4SBrooks Davis #include "model/test_case.hpp"
45*b0d29bc4SBrooks Davis #include "model/test_result.hpp"
46*b0d29bc4SBrooks Davis #include "utils/env.hpp"
47*b0d29bc4SBrooks Davis #include "utils/format/containers.ipp"
48*b0d29bc4SBrooks Davis #include "utils/format/macros.hpp"
49*b0d29bc4SBrooks Davis #include "utils/fs/operations.hpp"
50*b0d29bc4SBrooks Davis #include "utils/fs/path.hpp"
51*b0d29bc4SBrooks Davis #include "utils/optional.ipp"
52*b0d29bc4SBrooks Davis 
53*b0d29bc4SBrooks Davis namespace fs = utils::fs;
54*b0d29bc4SBrooks Davis 
55*b0d29bc4SBrooks Davis 
56*b0d29bc4SBrooks Davis namespace {
57*b0d29bc4SBrooks Davis 
58*b0d29bc4SBrooks Davis 
59*b0d29bc4SBrooks Davis /// Test program that sets its test cases lazily.
60*b0d29bc4SBrooks Davis ///
61*b0d29bc4SBrooks Davis /// This test class exists to test the behavior of a test_program object when
62*b0d29bc4SBrooks Davis /// the class is extended to offer lazy loading of test cases.  We simulate such
63*b0d29bc4SBrooks Davis /// lazy loading here by storing the list of test cases aside at construction
64*b0d29bc4SBrooks Davis /// time and later setting it lazily the first time test_cases() is called.
65*b0d29bc4SBrooks Davis class lazy_test_program : public model::test_program {
66*b0d29bc4SBrooks Davis     /// Whether set_test_cases() has yet been called or not.
67*b0d29bc4SBrooks Davis     mutable bool _set_test_cases_called;
68*b0d29bc4SBrooks Davis 
69*b0d29bc4SBrooks Davis     /// The list of test cases for this test program.
70*b0d29bc4SBrooks Davis     ///
71*b0d29bc4SBrooks Davis     /// Only use this in the call to set_test_cases().  All other reads of the
72*b0d29bc4SBrooks Davis     /// test cases list should happen via the parent class' test_cases() method.
73*b0d29bc4SBrooks Davis     model::test_cases_map _lazy_test_cases;
74*b0d29bc4SBrooks Davis 
75*b0d29bc4SBrooks Davis public:
76*b0d29bc4SBrooks Davis     /// Constructs a new test program.
77*b0d29bc4SBrooks Davis     ///
78*b0d29bc4SBrooks Davis     /// \param interface_name_ Name of the test program interface.
79*b0d29bc4SBrooks Davis     /// \param binary_ The name of the test program binary relative to root_.
80*b0d29bc4SBrooks Davis     /// \param root_ The root of the test suite containing the test program.
81*b0d29bc4SBrooks Davis     /// \param test_suite_name_ The name of the test suite.
82*b0d29bc4SBrooks Davis     /// \param metadata_ Metadata of the test program.
83*b0d29bc4SBrooks Davis     /// \param test_cases_ The collection of test cases in the test program.
84*b0d29bc4SBrooks Davis     lazy_test_program(const std::string& interface_name_,
85*b0d29bc4SBrooks Davis                       const utils::fs::path& binary_,
86*b0d29bc4SBrooks Davis                       const utils::fs::path& root_,
87*b0d29bc4SBrooks Davis                       const std::string& test_suite_name_,
88*b0d29bc4SBrooks Davis                       const model::metadata& metadata_,
89*b0d29bc4SBrooks Davis                       const model::test_cases_map& test_cases_) :
90*b0d29bc4SBrooks Davis         test_program(interface_name_, binary_, root_, test_suite_name_,
91*b0d29bc4SBrooks Davis                      metadata_, model::test_cases_map()),
92*b0d29bc4SBrooks Davis         _set_test_cases_called(false),
93*b0d29bc4SBrooks Davis         _lazy_test_cases(test_cases_)
94*b0d29bc4SBrooks Davis     {
95*b0d29bc4SBrooks Davis     }
96*b0d29bc4SBrooks Davis 
97*b0d29bc4SBrooks Davis     /// Lazily sets the test cases on the parent and returns them.
98*b0d29bc4SBrooks Davis     ///
99*b0d29bc4SBrooks Davis     /// \return The list of test cases.
100*b0d29bc4SBrooks Davis     const model::test_cases_map&
101*b0d29bc4SBrooks Davis     test_cases(void) const
102*b0d29bc4SBrooks Davis     {
103*b0d29bc4SBrooks Davis         if (!_set_test_cases_called) {
104*b0d29bc4SBrooks Davis             const_cast< lazy_test_program* >(this)->set_test_cases(
105*b0d29bc4SBrooks Davis                 _lazy_test_cases);
106*b0d29bc4SBrooks Davis             _set_test_cases_called = true;
107*b0d29bc4SBrooks Davis         }
108*b0d29bc4SBrooks Davis         return test_program::test_cases();
109*b0d29bc4SBrooks Davis     }
110*b0d29bc4SBrooks Davis };
111*b0d29bc4SBrooks Davis 
112*b0d29bc4SBrooks Davis 
113*b0d29bc4SBrooks Davis }  // anonymous namespace
114*b0d29bc4SBrooks Davis 
115*b0d29bc4SBrooks Davis 
116*b0d29bc4SBrooks Davis /// Runs a ctor_and_getters test.
117*b0d29bc4SBrooks Davis ///
118*b0d29bc4SBrooks Davis /// \tparam TestProgram Either model::test_program or lazy_test_program.
119*b0d29bc4SBrooks Davis template< class TestProgram >
120*b0d29bc4SBrooks Davis static void
121*b0d29bc4SBrooks Davis check_ctor_and_getters(void)
122*b0d29bc4SBrooks Davis {
123*b0d29bc4SBrooks Davis     const model::metadata tp_md = model::metadata_builder()
124*b0d29bc4SBrooks Davis         .add_custom("first", "foo")
125*b0d29bc4SBrooks Davis         .add_custom("second", "bar")
126*b0d29bc4SBrooks Davis         .build();
127*b0d29bc4SBrooks Davis     const model::metadata tc_md = model::metadata_builder()
128*b0d29bc4SBrooks Davis         .add_custom("first", "baz")
129*b0d29bc4SBrooks Davis         .build();
130*b0d29bc4SBrooks Davis 
131*b0d29bc4SBrooks Davis     const TestProgram test_program(
132*b0d29bc4SBrooks Davis         "mock", fs::path("binary"), fs::path("root"), "suite-name", tp_md,
133*b0d29bc4SBrooks Davis         model::test_cases_map_builder().add("foo", tc_md).build());
134*b0d29bc4SBrooks Davis 
135*b0d29bc4SBrooks Davis 
136*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("mock", test_program.interface_name());
137*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("binary"), test_program.relative_path());
138*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::current_path() / "root/binary",
139*b0d29bc4SBrooks Davis                    test_program.absolute_path());
140*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("root"), test_program.root());
141*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("suite-name", test_program.test_suite_name());
142*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(tp_md, test_program.get_metadata());
143*b0d29bc4SBrooks Davis 
144*b0d29bc4SBrooks Davis     const model::metadata exp_tc_md = model::metadata_builder()
145*b0d29bc4SBrooks Davis         .add_custom("first", "baz")
146*b0d29bc4SBrooks Davis         .add_custom("second", "bar")
147*b0d29bc4SBrooks Davis         .build();
148*b0d29bc4SBrooks Davis     const model::test_cases_map exp_tcs = model::test_cases_map_builder()
149*b0d29bc4SBrooks Davis         .add("foo", exp_tc_md)
150*b0d29bc4SBrooks Davis         .build();
151*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(exp_tcs, test_program.test_cases());
152*b0d29bc4SBrooks Davis }
153*b0d29bc4SBrooks Davis 
154*b0d29bc4SBrooks Davis 
155*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(ctor_and_getters);
156*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(ctor_and_getters)
157*b0d29bc4SBrooks Davis {
158*b0d29bc4SBrooks Davis     check_ctor_and_getters< model::test_program >();
159*b0d29bc4SBrooks Davis }
160*b0d29bc4SBrooks Davis 
161*b0d29bc4SBrooks Davis 
162*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(derived__ctor_and_getters);
163*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(derived__ctor_and_getters)
164*b0d29bc4SBrooks Davis {
165*b0d29bc4SBrooks Davis     check_ctor_and_getters< lazy_test_program >();
166*b0d29bc4SBrooks Davis }
167*b0d29bc4SBrooks Davis 
168*b0d29bc4SBrooks Davis 
169*b0d29bc4SBrooks Davis /// Runs a find_ok test.
170*b0d29bc4SBrooks Davis ///
171*b0d29bc4SBrooks Davis /// \tparam TestProgram Either model::test_program or lazy_test_program.
172*b0d29bc4SBrooks Davis template< class TestProgram >
173*b0d29bc4SBrooks Davis static void
174*b0d29bc4SBrooks Davis check_find_ok(void)
175*b0d29bc4SBrooks Davis {
176*b0d29bc4SBrooks Davis     const model::test_case test_case("main", model::metadata_builder().build());
177*b0d29bc4SBrooks Davis 
178*b0d29bc4SBrooks Davis     const TestProgram test_program(
179*b0d29bc4SBrooks Davis         "mock", fs::path("non-existent"), fs::path("."), "suite-name",
180*b0d29bc4SBrooks Davis         model::metadata_builder().build(),
181*b0d29bc4SBrooks Davis         model::test_cases_map_builder().add(test_case).build());
182*b0d29bc4SBrooks Davis 
183*b0d29bc4SBrooks Davis     const model::test_case& found_test_case = test_program.find("main");
184*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(test_case, found_test_case);
185*b0d29bc4SBrooks Davis }
186*b0d29bc4SBrooks Davis 
187*b0d29bc4SBrooks Davis 
188*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(find__ok);
189*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(find__ok)
190*b0d29bc4SBrooks Davis {
191*b0d29bc4SBrooks Davis     check_find_ok< model::test_program >();
192*b0d29bc4SBrooks Davis }
193*b0d29bc4SBrooks Davis 
194*b0d29bc4SBrooks Davis 
195*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(derived__find__ok);
196*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(derived__find__ok)
197*b0d29bc4SBrooks Davis {
198*b0d29bc4SBrooks Davis     check_find_ok< lazy_test_program >();
199*b0d29bc4SBrooks Davis }
200*b0d29bc4SBrooks Davis 
201*b0d29bc4SBrooks Davis 
202*b0d29bc4SBrooks Davis /// Runs a find_missing test.
203*b0d29bc4SBrooks Davis ///
204*b0d29bc4SBrooks Davis /// \tparam TestProgram Either model::test_program or lazy_test_program.
205*b0d29bc4SBrooks Davis template< class TestProgram >
206*b0d29bc4SBrooks Davis static void
207*b0d29bc4SBrooks Davis check_find_missing(void)
208*b0d29bc4SBrooks Davis {
209*b0d29bc4SBrooks Davis     const TestProgram test_program(
210*b0d29bc4SBrooks Davis         "mock", fs::path("non-existent"), fs::path("."), "suite-name",
211*b0d29bc4SBrooks Davis         model::metadata_builder().build(),
212*b0d29bc4SBrooks Davis         model::test_cases_map_builder().add("main").build());
213*b0d29bc4SBrooks Davis 
214*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW_RE(model::not_found_error,
215*b0d29bc4SBrooks Davis                          "case.*abc.*program.*non-existent",
216*b0d29bc4SBrooks Davis                          test_program.find("abc"));
217*b0d29bc4SBrooks Davis }
218*b0d29bc4SBrooks Davis 
219*b0d29bc4SBrooks Davis 
220*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(find__missing);
221*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(find__missing)
222*b0d29bc4SBrooks Davis {
223*b0d29bc4SBrooks Davis     check_find_missing< model::test_program >();
224*b0d29bc4SBrooks Davis }
225*b0d29bc4SBrooks Davis 
226*b0d29bc4SBrooks Davis 
227*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(derived__find__missing);
228*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(derived__find__missing)
229*b0d29bc4SBrooks Davis {
230*b0d29bc4SBrooks Davis     check_find_missing< lazy_test_program >();
231*b0d29bc4SBrooks Davis }
232*b0d29bc4SBrooks Davis 
233*b0d29bc4SBrooks Davis 
234*b0d29bc4SBrooks Davis /// Runs a metadata_inheritance test.
235*b0d29bc4SBrooks Davis ///
236*b0d29bc4SBrooks Davis /// \tparam TestProgram Either model::test_program or lazy_test_program.
237*b0d29bc4SBrooks Davis template< class TestProgram >
238*b0d29bc4SBrooks Davis static void
239*b0d29bc4SBrooks Davis check_metadata_inheritance(void)
240*b0d29bc4SBrooks Davis {
241*b0d29bc4SBrooks Davis     const model::test_cases_map test_cases = model::test_cases_map_builder()
242*b0d29bc4SBrooks Davis         .add("inherit-all")
243*b0d29bc4SBrooks Davis         .add("inherit-some",
244*b0d29bc4SBrooks Davis              model::metadata_builder()
245*b0d29bc4SBrooks Davis              .set_description("Overriden description")
246*b0d29bc4SBrooks Davis              .build())
247*b0d29bc4SBrooks Davis         .add("inherit-none",
248*b0d29bc4SBrooks Davis              model::metadata_builder()
249*b0d29bc4SBrooks Davis              .add_allowed_architecture("overriden-arch")
250*b0d29bc4SBrooks Davis              .add_allowed_platform("overriden-platform")
251*b0d29bc4SBrooks Davis              .set_description("Overriden description")
252*b0d29bc4SBrooks Davis              .build())
253*b0d29bc4SBrooks Davis         .build();
254*b0d29bc4SBrooks Davis 
255*b0d29bc4SBrooks Davis     const model::metadata metadata = model::metadata_builder()
256*b0d29bc4SBrooks Davis         .add_allowed_architecture("base-arch")
257*b0d29bc4SBrooks Davis         .set_description("Base description")
258*b0d29bc4SBrooks Davis         .build();
259*b0d29bc4SBrooks Davis     const TestProgram test_program(
260*b0d29bc4SBrooks Davis         "plain", fs::path("non-existent"), fs::path("."), "suite-name",
261*b0d29bc4SBrooks Davis         metadata, test_cases);
262*b0d29bc4SBrooks Davis 
263*b0d29bc4SBrooks Davis     {
264*b0d29bc4SBrooks Davis         const model::metadata exp_metadata = model::metadata_builder()
265*b0d29bc4SBrooks Davis             .add_allowed_architecture("base-arch")
266*b0d29bc4SBrooks Davis             .set_description("Base description")
267*b0d29bc4SBrooks Davis             .build();
268*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(exp_metadata,
269*b0d29bc4SBrooks Davis                        test_program.find("inherit-all").get_metadata());
270*b0d29bc4SBrooks Davis     }
271*b0d29bc4SBrooks Davis 
272*b0d29bc4SBrooks Davis     {
273*b0d29bc4SBrooks Davis         const model::metadata exp_metadata = model::metadata_builder()
274*b0d29bc4SBrooks Davis             .add_allowed_architecture("base-arch")
275*b0d29bc4SBrooks Davis             .set_description("Overriden description")
276*b0d29bc4SBrooks Davis             .build();
277*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(exp_metadata,
278*b0d29bc4SBrooks Davis                        test_program.find("inherit-some").get_metadata());
279*b0d29bc4SBrooks Davis     }
280*b0d29bc4SBrooks Davis 
281*b0d29bc4SBrooks Davis     {
282*b0d29bc4SBrooks Davis         const model::metadata exp_metadata = model::metadata_builder()
283*b0d29bc4SBrooks Davis             .add_allowed_architecture("overriden-arch")
284*b0d29bc4SBrooks Davis             .add_allowed_platform("overriden-platform")
285*b0d29bc4SBrooks Davis             .set_description("Overriden description")
286*b0d29bc4SBrooks Davis             .build();
287*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(exp_metadata,
288*b0d29bc4SBrooks Davis                        test_program.find("inherit-none").get_metadata());
289*b0d29bc4SBrooks Davis     }
290*b0d29bc4SBrooks Davis }
291*b0d29bc4SBrooks Davis 
292*b0d29bc4SBrooks Davis 
293*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(metadata_inheritance);
294*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(metadata_inheritance)
295*b0d29bc4SBrooks Davis {
296*b0d29bc4SBrooks Davis     check_metadata_inheritance< model::test_program >();
297*b0d29bc4SBrooks Davis }
298*b0d29bc4SBrooks Davis 
299*b0d29bc4SBrooks Davis 
300*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(derived__metadata_inheritance);
301*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(derived__metadata_inheritance)
302*b0d29bc4SBrooks Davis {
303*b0d29bc4SBrooks Davis     check_metadata_inheritance< lazy_test_program >();
304*b0d29bc4SBrooks Davis }
305*b0d29bc4SBrooks Davis 
306*b0d29bc4SBrooks Davis 
307*b0d29bc4SBrooks Davis /// Runs a operators_eq_and_ne__copy test.
308*b0d29bc4SBrooks Davis ///
309*b0d29bc4SBrooks Davis /// \tparam TestProgram Either model::test_program or lazy_test_program.
310*b0d29bc4SBrooks Davis template< class TestProgram >
311*b0d29bc4SBrooks Davis static void
312*b0d29bc4SBrooks Davis check_operators_eq_and_ne__copy(void)
313*b0d29bc4SBrooks Davis {
314*b0d29bc4SBrooks Davis     const TestProgram tp1(
315*b0d29bc4SBrooks Davis         "plain", fs::path("non-existent"), fs::path("."), "suite-name",
316*b0d29bc4SBrooks Davis         model::metadata_builder().build(),
317*b0d29bc4SBrooks Davis         model::test_cases_map());
318*b0d29bc4SBrooks Davis     const TestProgram tp2 = tp1;
319*b0d29bc4SBrooks Davis     ATF_REQUIRE(  tp1 == tp2);
320*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(tp1 != tp2));
321*b0d29bc4SBrooks Davis }
322*b0d29bc4SBrooks Davis 
323*b0d29bc4SBrooks Davis 
324*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__copy);
325*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(operators_eq_and_ne__copy)
326*b0d29bc4SBrooks Davis {
327*b0d29bc4SBrooks Davis     check_operators_eq_and_ne__copy< model::test_program >();
328*b0d29bc4SBrooks Davis }
329*b0d29bc4SBrooks Davis 
330*b0d29bc4SBrooks Davis 
331*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(derived__operators_eq_and_ne__copy);
332*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(derived__operators_eq_and_ne__copy)
333*b0d29bc4SBrooks Davis {
334*b0d29bc4SBrooks Davis     check_operators_eq_and_ne__copy< lazy_test_program >();
335*b0d29bc4SBrooks Davis }
336*b0d29bc4SBrooks Davis 
337*b0d29bc4SBrooks Davis 
338*b0d29bc4SBrooks Davis /// Runs a operators_eq_and_ne__not_copy test.
339*b0d29bc4SBrooks Davis ///
340*b0d29bc4SBrooks Davis /// \tparam TestProgram Either model::test_program or lazy_test_program.
341*b0d29bc4SBrooks Davis template< class TestProgram >
342*b0d29bc4SBrooks Davis static void
343*b0d29bc4SBrooks Davis check_operators_eq_and_ne__not_copy(void)
344*b0d29bc4SBrooks Davis {
345*b0d29bc4SBrooks Davis     const std::string base_interface("plain");
346*b0d29bc4SBrooks Davis     const fs::path base_relative_path("the/test/program");
347*b0d29bc4SBrooks Davis     const fs::path base_root("/the/root");
348*b0d29bc4SBrooks Davis     const std::string base_test_suite("suite-name");
349*b0d29bc4SBrooks Davis     const model::metadata base_metadata = model::metadata_builder()
350*b0d29bc4SBrooks Davis         .add_custom("foo", "bar")
351*b0d29bc4SBrooks Davis         .build();
352*b0d29bc4SBrooks Davis 
353*b0d29bc4SBrooks Davis     const model::test_cases_map base_tcs = model::test_cases_map_builder()
354*b0d29bc4SBrooks Davis         .add("main", model::metadata_builder()
355*b0d29bc4SBrooks Davis              .add_custom("second", "baz")
356*b0d29bc4SBrooks Davis              .build())
357*b0d29bc4SBrooks Davis         .build();
358*b0d29bc4SBrooks Davis 
359*b0d29bc4SBrooks Davis     const TestProgram base_tp(
360*b0d29bc4SBrooks Davis         base_interface, base_relative_path, base_root, base_test_suite,
361*b0d29bc4SBrooks Davis         base_metadata, base_tcs);
362*b0d29bc4SBrooks Davis 
363*b0d29bc4SBrooks Davis     // Construct with all same values.
364*b0d29bc4SBrooks Davis     {
365*b0d29bc4SBrooks Davis         const model::test_cases_map other_tcs = model::test_cases_map_builder()
366*b0d29bc4SBrooks Davis             .add("main", model::metadata_builder()
367*b0d29bc4SBrooks Davis                  .add_custom("second", "baz")
368*b0d29bc4SBrooks Davis                  .build())
369*b0d29bc4SBrooks Davis             .build();
370*b0d29bc4SBrooks Davis 
371*b0d29bc4SBrooks Davis         const TestProgram other_tp(
372*b0d29bc4SBrooks Davis             base_interface, base_relative_path, base_root, base_test_suite,
373*b0d29bc4SBrooks Davis             base_metadata, other_tcs);
374*b0d29bc4SBrooks Davis 
375*b0d29bc4SBrooks Davis         ATF_REQUIRE(  base_tp == other_tp);
376*b0d29bc4SBrooks Davis         ATF_REQUIRE(!(base_tp != other_tp));
377*b0d29bc4SBrooks Davis     }
378*b0d29bc4SBrooks Davis 
379*b0d29bc4SBrooks Davis     // Construct with same final metadata values but using a different
380*b0d29bc4SBrooks Davis     // intermediate representation.  The original test program has one property
381*b0d29bc4SBrooks Davis     // in the base test program definition and another in the test case; here,
382*b0d29bc4SBrooks Davis     // we put both definitions explicitly in the test case.
383*b0d29bc4SBrooks Davis     {
384*b0d29bc4SBrooks Davis         const model::test_cases_map other_tcs = model::test_cases_map_builder()
385*b0d29bc4SBrooks Davis             .add("main", model::metadata_builder()
386*b0d29bc4SBrooks Davis                  .add_custom("foo", "bar")
387*b0d29bc4SBrooks Davis                  .add_custom("second", "baz")
388*b0d29bc4SBrooks Davis                  .build())
389*b0d29bc4SBrooks Davis             .build();
390*b0d29bc4SBrooks Davis 
391*b0d29bc4SBrooks Davis         const TestProgram other_tp(
392*b0d29bc4SBrooks Davis             base_interface, base_relative_path, base_root, base_test_suite,
393*b0d29bc4SBrooks Davis             base_metadata, other_tcs);
394*b0d29bc4SBrooks Davis 
395*b0d29bc4SBrooks Davis         ATF_REQUIRE(  base_tp == other_tp);
396*b0d29bc4SBrooks Davis         ATF_REQUIRE(!(base_tp != other_tp));
397*b0d29bc4SBrooks Davis     }
398*b0d29bc4SBrooks Davis 
399*b0d29bc4SBrooks Davis     // Different interface.
400*b0d29bc4SBrooks Davis     {
401*b0d29bc4SBrooks Davis         const TestProgram other_tp(
402*b0d29bc4SBrooks Davis             "atf", base_relative_path, base_root, base_test_suite,
403*b0d29bc4SBrooks Davis             base_metadata, base_tcs);
404*b0d29bc4SBrooks Davis 
405*b0d29bc4SBrooks Davis         ATF_REQUIRE(!(base_tp == other_tp));
406*b0d29bc4SBrooks Davis         ATF_REQUIRE(  base_tp != other_tp);
407*b0d29bc4SBrooks Davis     }
408*b0d29bc4SBrooks Davis 
409*b0d29bc4SBrooks Davis     // Different relative path.
410*b0d29bc4SBrooks Davis     {
411*b0d29bc4SBrooks Davis         const TestProgram other_tp(
412*b0d29bc4SBrooks Davis             base_interface, fs::path("a/b/c"), base_root, base_test_suite,
413*b0d29bc4SBrooks Davis             base_metadata, base_tcs);
414*b0d29bc4SBrooks Davis 
415*b0d29bc4SBrooks Davis         ATF_REQUIRE(!(base_tp == other_tp));
416*b0d29bc4SBrooks Davis         ATF_REQUIRE(  base_tp != other_tp);
417*b0d29bc4SBrooks Davis     }
418*b0d29bc4SBrooks Davis 
419*b0d29bc4SBrooks Davis     // Different root.
420*b0d29bc4SBrooks Davis     {
421*b0d29bc4SBrooks Davis         const TestProgram other_tp(
422*b0d29bc4SBrooks Davis             base_interface, base_relative_path, fs::path("."), base_test_suite,
423*b0d29bc4SBrooks Davis             base_metadata, base_tcs);
424*b0d29bc4SBrooks Davis 
425*b0d29bc4SBrooks Davis         ATF_REQUIRE(!(base_tp == other_tp));
426*b0d29bc4SBrooks Davis         ATF_REQUIRE(  base_tp != other_tp);
427*b0d29bc4SBrooks Davis     }
428*b0d29bc4SBrooks Davis 
429*b0d29bc4SBrooks Davis     // Different test suite.
430*b0d29bc4SBrooks Davis     {
431*b0d29bc4SBrooks Davis         const TestProgram other_tp(
432*b0d29bc4SBrooks Davis             base_interface, base_relative_path, base_root, "different-suite",
433*b0d29bc4SBrooks Davis             base_metadata, base_tcs);
434*b0d29bc4SBrooks Davis 
435*b0d29bc4SBrooks Davis         ATF_REQUIRE(!(base_tp == other_tp));
436*b0d29bc4SBrooks Davis         ATF_REQUIRE(  base_tp != other_tp);
437*b0d29bc4SBrooks Davis     }
438*b0d29bc4SBrooks Davis 
439*b0d29bc4SBrooks Davis     // Different metadata.
440*b0d29bc4SBrooks Davis     {
441*b0d29bc4SBrooks Davis         const TestProgram other_tp(
442*b0d29bc4SBrooks Davis             base_interface, base_relative_path, base_root, base_test_suite,
443*b0d29bc4SBrooks Davis             model::metadata_builder().build(), base_tcs);
444*b0d29bc4SBrooks Davis 
445*b0d29bc4SBrooks Davis         ATF_REQUIRE(!(base_tp == other_tp));
446*b0d29bc4SBrooks Davis         ATF_REQUIRE(  base_tp != other_tp);
447*b0d29bc4SBrooks Davis     }
448*b0d29bc4SBrooks Davis 
449*b0d29bc4SBrooks Davis     // Different test cases.
450*b0d29bc4SBrooks Davis     {
451*b0d29bc4SBrooks Davis         const model::test_cases_map other_tcs = model::test_cases_map_builder()
452*b0d29bc4SBrooks Davis             .add("foo").build();
453*b0d29bc4SBrooks Davis 
454*b0d29bc4SBrooks Davis         const TestProgram other_tp(
455*b0d29bc4SBrooks Davis             base_interface, base_relative_path, base_root, base_test_suite,
456*b0d29bc4SBrooks Davis             base_metadata, other_tcs);
457*b0d29bc4SBrooks Davis 
458*b0d29bc4SBrooks Davis         ATF_REQUIRE(!(base_tp == other_tp));
459*b0d29bc4SBrooks Davis         ATF_REQUIRE(  base_tp != other_tp);
460*b0d29bc4SBrooks Davis     }
461*b0d29bc4SBrooks Davis }
462*b0d29bc4SBrooks Davis 
463*b0d29bc4SBrooks Davis 
464*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__not_copy);
465*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(operators_eq_and_ne__not_copy)
466*b0d29bc4SBrooks Davis {
467*b0d29bc4SBrooks Davis     check_operators_eq_and_ne__not_copy< model::test_program >();
468*b0d29bc4SBrooks Davis }
469*b0d29bc4SBrooks Davis 
470*b0d29bc4SBrooks Davis 
471*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(derived__operators_eq_and_ne__not_copy);
472*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(derived__operators_eq_and_ne__not_copy)
473*b0d29bc4SBrooks Davis {
474*b0d29bc4SBrooks Davis     check_operators_eq_and_ne__not_copy< lazy_test_program >();
475*b0d29bc4SBrooks Davis }
476*b0d29bc4SBrooks Davis 
477*b0d29bc4SBrooks Davis 
478*b0d29bc4SBrooks Davis /// Runs a operator_lt test.
479*b0d29bc4SBrooks Davis ///
480*b0d29bc4SBrooks Davis /// \tparam TestProgram Either model::test_program or lazy_test_program.
481*b0d29bc4SBrooks Davis template< class TestProgram >
482*b0d29bc4SBrooks Davis static void
483*b0d29bc4SBrooks Davis check_operator_lt(void)
484*b0d29bc4SBrooks Davis {
485*b0d29bc4SBrooks Davis     const TestProgram tp1(
486*b0d29bc4SBrooks Davis         "plain", fs::path("a/b/c"), fs::path("/foo/bar"), "suite-name",
487*b0d29bc4SBrooks Davis         model::metadata_builder().build(),
488*b0d29bc4SBrooks Davis         model::test_cases_map());
489*b0d29bc4SBrooks Davis     const TestProgram tp2(
490*b0d29bc4SBrooks Davis         "atf", fs::path("c"), fs::path("/foo/bar"), "suite-name",
491*b0d29bc4SBrooks Davis         model::metadata_builder().build(),
492*b0d29bc4SBrooks Davis         model::test_cases_map());
493*b0d29bc4SBrooks Davis     const TestProgram tp3(
494*b0d29bc4SBrooks Davis         "plain", fs::path("a/b/c"), fs::path("/abc"), "suite-name",
495*b0d29bc4SBrooks Davis         model::metadata_builder().build(),
496*b0d29bc4SBrooks Davis         model::test_cases_map());
497*b0d29bc4SBrooks Davis 
498*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(tp1 < tp1));
499*b0d29bc4SBrooks Davis 
500*b0d29bc4SBrooks Davis     ATF_REQUIRE(  tp1 < tp2);
501*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(tp2 < tp1));
502*b0d29bc4SBrooks Davis 
503*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(tp1 < tp3));
504*b0d29bc4SBrooks Davis     ATF_REQUIRE(  tp3 < tp1);
505*b0d29bc4SBrooks Davis 
506*b0d29bc4SBrooks Davis     // And now, test the actual reason why we want to have an < overload by
507*b0d29bc4SBrooks Davis     // attempting to put the various programs in a set.
508*b0d29bc4SBrooks Davis     std::set< TestProgram > programs;
509*b0d29bc4SBrooks Davis     programs.insert(tp1);
510*b0d29bc4SBrooks Davis     programs.insert(tp2);
511*b0d29bc4SBrooks Davis     programs.insert(tp3);
512*b0d29bc4SBrooks Davis }
513*b0d29bc4SBrooks Davis 
514*b0d29bc4SBrooks Davis 
515*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(operator_lt);
516*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(operator_lt)
517*b0d29bc4SBrooks Davis {
518*b0d29bc4SBrooks Davis     check_operator_lt< model::test_program >();
519*b0d29bc4SBrooks Davis }
520*b0d29bc4SBrooks Davis 
521*b0d29bc4SBrooks Davis 
522*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(derived__operator_lt);
523*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(derived__operator_lt)
524*b0d29bc4SBrooks Davis {
525*b0d29bc4SBrooks Davis     check_operator_lt< lazy_test_program >();
526*b0d29bc4SBrooks Davis }
527*b0d29bc4SBrooks Davis 
528*b0d29bc4SBrooks Davis 
529*b0d29bc4SBrooks Davis /// Runs a output__no_test_cases test.
530*b0d29bc4SBrooks Davis ///
531*b0d29bc4SBrooks Davis /// \tparam TestProgram Either model::test_program or lazy_test_program.
532*b0d29bc4SBrooks Davis template< class TestProgram >
533*b0d29bc4SBrooks Davis static void
534*b0d29bc4SBrooks Davis check_output__no_test_cases(void)
535*b0d29bc4SBrooks Davis {
536*b0d29bc4SBrooks Davis     TestProgram tp(
537*b0d29bc4SBrooks Davis         "plain", fs::path("binary/path"), fs::path("/the/root"), "suite-name",
538*b0d29bc4SBrooks Davis         model::metadata_builder().add_allowed_architecture("a").build(),
539*b0d29bc4SBrooks Davis         model::test_cases_map());
540*b0d29bc4SBrooks Davis 
541*b0d29bc4SBrooks Davis     std::ostringstream str;
542*b0d29bc4SBrooks Davis     str << tp;
543*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
544*b0d29bc4SBrooks Davis         "test_program{interface='plain', binary='binary/path', "
545*b0d29bc4SBrooks Davis         "root='/the/root', test_suite='suite-name', "
546*b0d29bc4SBrooks Davis         "metadata=metadata{allowed_architectures='a', allowed_platforms='', "
547*b0d29bc4SBrooks Davis         "description='', has_cleanup='false', is_exclusive='false', "
548*b0d29bc4SBrooks Davis         "required_configs='', required_disk_space='0', required_files='', "
549*b0d29bc4SBrooks Davis         "required_memory='0', "
550*b0d29bc4SBrooks Davis         "required_programs='', required_user='', timeout='300'}, "
551*b0d29bc4SBrooks Davis         "test_cases=map()}",
552*b0d29bc4SBrooks Davis         str.str());
553*b0d29bc4SBrooks Davis }
554*b0d29bc4SBrooks Davis 
555*b0d29bc4SBrooks Davis 
556*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(output__no_test_cases);
557*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(output__no_test_cases)
558*b0d29bc4SBrooks Davis {
559*b0d29bc4SBrooks Davis     check_output__no_test_cases< model::test_program >();
560*b0d29bc4SBrooks Davis }
561*b0d29bc4SBrooks Davis 
562*b0d29bc4SBrooks Davis 
563*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(derived__output__no_test_cases);
564*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(derived__output__no_test_cases)
565*b0d29bc4SBrooks Davis {
566*b0d29bc4SBrooks Davis     check_output__no_test_cases< lazy_test_program >();
567*b0d29bc4SBrooks Davis }
568*b0d29bc4SBrooks Davis 
569*b0d29bc4SBrooks Davis 
570*b0d29bc4SBrooks Davis /// Runs a output__some_test_cases test.
571*b0d29bc4SBrooks Davis ///
572*b0d29bc4SBrooks Davis /// \tparam TestProgram Either model::test_program or lazy_test_program.
573*b0d29bc4SBrooks Davis template< class TestProgram >
574*b0d29bc4SBrooks Davis static void
575*b0d29bc4SBrooks Davis check_output__some_test_cases(void)
576*b0d29bc4SBrooks Davis {
577*b0d29bc4SBrooks Davis     const model::test_cases_map test_cases = model::test_cases_map_builder()
578*b0d29bc4SBrooks Davis         .add("the-name", model::metadata_builder()
579*b0d29bc4SBrooks Davis              .add_allowed_platform("foo")
580*b0d29bc4SBrooks Davis              .add_custom("bar", "baz")
581*b0d29bc4SBrooks Davis              .build())
582*b0d29bc4SBrooks Davis         .add("another-name")
583*b0d29bc4SBrooks Davis         .build();
584*b0d29bc4SBrooks Davis 
585*b0d29bc4SBrooks Davis     const TestProgram tp = TestProgram(
586*b0d29bc4SBrooks Davis         "plain", fs::path("binary/path"), fs::path("/the/root"), "suite-name",
587*b0d29bc4SBrooks Davis         model::metadata_builder().add_allowed_architecture("a").build(),
588*b0d29bc4SBrooks Davis         test_cases);
589*b0d29bc4SBrooks Davis 
590*b0d29bc4SBrooks Davis     std::ostringstream str;
591*b0d29bc4SBrooks Davis     str << tp;
592*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(
593*b0d29bc4SBrooks Davis         "test_program{interface='plain', binary='binary/path', "
594*b0d29bc4SBrooks Davis         "root='/the/root', test_suite='suite-name', "
595*b0d29bc4SBrooks Davis         "metadata=metadata{allowed_architectures='a', allowed_platforms='', "
596*b0d29bc4SBrooks Davis         "description='', has_cleanup='false', is_exclusive='false', "
597*b0d29bc4SBrooks Davis         "required_configs='', required_disk_space='0', required_files='', "
598*b0d29bc4SBrooks Davis         "required_memory='0', "
599*b0d29bc4SBrooks Davis         "required_programs='', required_user='', timeout='300'}, "
600*b0d29bc4SBrooks Davis         "test_cases=map("
601*b0d29bc4SBrooks Davis         "another-name=test_case{name='another-name', "
602*b0d29bc4SBrooks Davis         "metadata=metadata{allowed_architectures='a', allowed_platforms='', "
603*b0d29bc4SBrooks Davis         "description='', has_cleanup='false', is_exclusive='false', "
604*b0d29bc4SBrooks Davis         "required_configs='', required_disk_space='0', required_files='', "
605*b0d29bc4SBrooks Davis         "required_memory='0', "
606*b0d29bc4SBrooks Davis         "required_programs='', required_user='', timeout='300'}}, "
607*b0d29bc4SBrooks Davis         "the-name=test_case{name='the-name', "
608*b0d29bc4SBrooks Davis         "metadata=metadata{allowed_architectures='a', allowed_platforms='foo', "
609*b0d29bc4SBrooks Davis         "custom.bar='baz', description='', has_cleanup='false', "
610*b0d29bc4SBrooks Davis         "is_exclusive='false', "
611*b0d29bc4SBrooks Davis         "required_configs='', required_disk_space='0', required_files='', "
612*b0d29bc4SBrooks Davis         "required_memory='0', "
613*b0d29bc4SBrooks Davis         "required_programs='', required_user='', timeout='300'}})}",
614*b0d29bc4SBrooks Davis         str.str());
615*b0d29bc4SBrooks Davis }
616*b0d29bc4SBrooks Davis 
617*b0d29bc4SBrooks Davis 
618*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(output__some_test_cases);
619*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(output__some_test_cases)
620*b0d29bc4SBrooks Davis {
621*b0d29bc4SBrooks Davis     check_output__some_test_cases< model::test_program >();
622*b0d29bc4SBrooks Davis }
623*b0d29bc4SBrooks Davis 
624*b0d29bc4SBrooks Davis 
625*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(derived__output__some_test_cases);
626*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(derived__output__some_test_cases)
627*b0d29bc4SBrooks Davis {
628*b0d29bc4SBrooks Davis     check_output__some_test_cases< lazy_test_program >();
629*b0d29bc4SBrooks Davis }
630*b0d29bc4SBrooks Davis 
631*b0d29bc4SBrooks Davis 
632*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(builder__defaults);
633*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(builder__defaults)
634*b0d29bc4SBrooks Davis {
635*b0d29bc4SBrooks Davis     const model::test_program expected(
636*b0d29bc4SBrooks Davis         "mock", fs::path("non-existent"), fs::path("."), "suite-name",
637*b0d29bc4SBrooks Davis         model::metadata_builder().build(), model::test_cases_map());
638*b0d29bc4SBrooks Davis 
639*b0d29bc4SBrooks Davis     const model::test_program built = model::test_program_builder(
640*b0d29bc4SBrooks Davis         "mock", fs::path("non-existent"), fs::path("."), "suite-name")
641*b0d29bc4SBrooks Davis         .build();
642*b0d29bc4SBrooks Davis 
643*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(built, expected);
644*b0d29bc4SBrooks Davis }
645*b0d29bc4SBrooks Davis 
646*b0d29bc4SBrooks Davis 
647*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(builder__overrides);
648*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(builder__overrides)
649*b0d29bc4SBrooks Davis {
650*b0d29bc4SBrooks Davis     const model::metadata md = model::metadata_builder()
651*b0d29bc4SBrooks Davis         .add_custom("foo", "bar")
652*b0d29bc4SBrooks Davis         .build();
653*b0d29bc4SBrooks Davis     const model::test_cases_map tcs = model::test_cases_map_builder()
654*b0d29bc4SBrooks Davis         .add("first")
655*b0d29bc4SBrooks Davis         .add("second", md)
656*b0d29bc4SBrooks Davis         .build();
657*b0d29bc4SBrooks Davis     const model::test_program expected(
658*b0d29bc4SBrooks Davis         "mock", fs::path("binary"), fs::path("root"), "suite-name", md, tcs);
659*b0d29bc4SBrooks Davis 
660*b0d29bc4SBrooks Davis     const model::test_program built = model::test_program_builder(
661*b0d29bc4SBrooks Davis         "mock", fs::path("binary"), fs::path("root"), "suite-name")
662*b0d29bc4SBrooks Davis         .add_test_case("first")
663*b0d29bc4SBrooks Davis         .add_test_case("second", md)
664*b0d29bc4SBrooks Davis         .set_metadata(md)
665*b0d29bc4SBrooks Davis         .build();
666*b0d29bc4SBrooks Davis 
667*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(built, expected);
668*b0d29bc4SBrooks Davis }
669*b0d29bc4SBrooks Davis 
670*b0d29bc4SBrooks Davis 
671*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(builder__ptr);
672*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(builder__ptr)
673*b0d29bc4SBrooks Davis {
674*b0d29bc4SBrooks Davis     const model::test_program expected(
675*b0d29bc4SBrooks Davis         "mock", fs::path("non-existent"), fs::path("."), "suite-name",
676*b0d29bc4SBrooks Davis         model::metadata_builder().build(), model::test_cases_map());
677*b0d29bc4SBrooks Davis 
678*b0d29bc4SBrooks Davis     const model::test_program_ptr built = model::test_program_builder(
679*b0d29bc4SBrooks Davis         "mock", fs::path("non-existent"), fs::path("."), "suite-name")
680*b0d29bc4SBrooks Davis         .build_ptr();
681*b0d29bc4SBrooks Davis 
682*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(*built, expected);
683*b0d29bc4SBrooks Davis }
684*b0d29bc4SBrooks Davis 
685*b0d29bc4SBrooks Davis 
686*b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs)
687*b0d29bc4SBrooks Davis {
688*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, ctor_and_getters);
689*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, find__ok);
690*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, find__missing);
691*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, metadata_inheritance);
692*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__copy);
693*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__not_copy);
694*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, operator_lt);
695*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, output__no_test_cases);
696*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, output__some_test_cases);
697*b0d29bc4SBrooks Davis 
698*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, derived__ctor_and_getters);
699*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, derived__find__ok);
700*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, derived__find__missing);
701*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, derived__metadata_inheritance);
702*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, derived__operators_eq_and_ne__copy);
703*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, derived__operators_eq_and_ne__not_copy);
704*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, derived__operator_lt);
705*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, derived__output__no_test_cases);
706*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, derived__output__some_test_cases);
707*b0d29bc4SBrooks Davis 
708*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, builder__defaults);
709*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, builder__overrides);
710*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, builder__ptr);
711*b0d29bc4SBrooks Davis }
712