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