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