xref: /freebsd-src/contrib/atf/atf-c++/macros_hpp_test.cpp (revision 8f0ea33f2bbf3a6aa80235f0a02fa5f2780c2b17)
1c243e490SMarcel Moolenaar // Copyright (c) 2008 The NetBSD Foundation, Inc.
2c243e490SMarcel Moolenaar // All rights reserved.
3c243e490SMarcel Moolenaar //
4c243e490SMarcel Moolenaar // Redistribution and use in source and binary forms, with or without
5c243e490SMarcel Moolenaar // modification, are permitted provided that the following conditions
6c243e490SMarcel Moolenaar // are met:
7c243e490SMarcel Moolenaar // 1. Redistributions of source code must retain the above copyright
8c243e490SMarcel Moolenaar //    notice, this list of conditions and the following disclaimer.
9c243e490SMarcel Moolenaar // 2. Redistributions in binary form must reproduce the above copyright
10c243e490SMarcel Moolenaar //    notice, this list of conditions and the following disclaimer in the
11c243e490SMarcel Moolenaar //    documentation and/or other materials provided with the distribution.
12c243e490SMarcel Moolenaar //
13c243e490SMarcel Moolenaar // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
14c243e490SMarcel Moolenaar // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
15c243e490SMarcel Moolenaar // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16c243e490SMarcel Moolenaar // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17c243e490SMarcel Moolenaar // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
18c243e490SMarcel Moolenaar // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19c243e490SMarcel Moolenaar // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
20c243e490SMarcel Moolenaar // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21c243e490SMarcel Moolenaar // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22c243e490SMarcel Moolenaar // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23c243e490SMarcel Moolenaar // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
24c243e490SMarcel Moolenaar // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25c243e490SMarcel Moolenaar 
26c243e490SMarcel Moolenaar #include <atf-c++/macros.hpp>
27c243e490SMarcel Moolenaar 
28*0677dfd1SJulio Merino #include <stdexcept>
29*0677dfd1SJulio Merino 
30c243e490SMarcel Moolenaar void
atf_check_errno_semicolons(void)31c243e490SMarcel Moolenaar atf_check_errno_semicolons(void)
32c243e490SMarcel Moolenaar {
33c243e490SMarcel Moolenaar     // Check that ATF_CHECK_ERRNO does not contain a semicolon that would
34c243e490SMarcel Moolenaar     // cause an empty-statement that confuses some compilers.
35c243e490SMarcel Moolenaar     ATF_CHECK_ERRNO(1, 1 == 1);
36c243e490SMarcel Moolenaar     ATF_CHECK_ERRNO(2, 2 == 2);
37c243e490SMarcel Moolenaar }
38c243e490SMarcel Moolenaar 
39c243e490SMarcel Moolenaar void
atf_require_inside_if(void)40c243e490SMarcel Moolenaar atf_require_inside_if(void)
41c243e490SMarcel Moolenaar {
42c243e490SMarcel Moolenaar     // Make sure that ATF_REQUIRE can be used inside an if statement that
43c243e490SMarcel Moolenaar     // does not have braces.  Earlier versions of it generated an error
44c243e490SMarcel Moolenaar     // if there was an else clause because they confused the compiler
45c243e490SMarcel Moolenaar     // by defining an unprotected nested if.
46c243e490SMarcel Moolenaar     if (true)
47c243e490SMarcel Moolenaar         ATF_REQUIRE(true);
48c243e490SMarcel Moolenaar     else
49c243e490SMarcel Moolenaar         ATF_REQUIRE(true);
50c243e490SMarcel Moolenaar }
51c243e490SMarcel Moolenaar 
52c243e490SMarcel Moolenaar void
atf_require_eq_inside_if(void)53c243e490SMarcel Moolenaar atf_require_eq_inside_if(void)
54c243e490SMarcel Moolenaar {
55c243e490SMarcel Moolenaar     // Make sure that ATF_REQUIRE_EQ can be used inside an if statement
56c243e490SMarcel Moolenaar     // that does not have braces.  Earlier versions of it generated an
57c243e490SMarcel Moolenaar     // error if there was an else clause because they confused the
58c243e490SMarcel Moolenaar     // compiler by defining an unprotected nested if.
59c243e490SMarcel Moolenaar     if (true)
60c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(true, true);
61c243e490SMarcel Moolenaar     else
62c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(true, true);
63c243e490SMarcel Moolenaar }
64c243e490SMarcel Moolenaar 
65c243e490SMarcel Moolenaar void
atf_require_throw_runtime_error(void)66c243e490SMarcel Moolenaar atf_require_throw_runtime_error(void)
67c243e490SMarcel Moolenaar {
68c243e490SMarcel Moolenaar     // Check that we can pass std::runtime_error to ATF_REQUIRE_THROW.
69c243e490SMarcel Moolenaar     // Earlier versions generated a warning because the macro's code also
70c243e490SMarcel Moolenaar     // attempted to capture this exception, and thus we had a duplicate
71c243e490SMarcel Moolenaar     // catch clause.
72c243e490SMarcel Moolenaar     ATF_REQUIRE_THROW(std::runtime_error, (void)0);
73c243e490SMarcel Moolenaar }
74c243e490SMarcel Moolenaar 
75c243e490SMarcel Moolenaar void
atf_require_throw_inside_if(void)76c243e490SMarcel Moolenaar atf_require_throw_inside_if(void)
77c243e490SMarcel Moolenaar {
78c243e490SMarcel Moolenaar     // Make sure that ATF_REQUIRE_THROW can be used inside an if statement
79c243e490SMarcel Moolenaar     // that does not have braces.  Earlier versions of it generated an
80c243e490SMarcel Moolenaar     // error because a trailing ; after a catch block was not allowed.
81c243e490SMarcel Moolenaar     if (true)
82c243e490SMarcel Moolenaar         ATF_REQUIRE_THROW(std::runtime_error, (void)0);
83c243e490SMarcel Moolenaar     else
84c243e490SMarcel Moolenaar         ATF_REQUIRE_THROW(std::runtime_error, (void)1);
85c243e490SMarcel Moolenaar }
86c243e490SMarcel Moolenaar 
87c243e490SMarcel Moolenaar void
atf_require_errno_semicolons(void)88c243e490SMarcel Moolenaar atf_require_errno_semicolons(void)
89c243e490SMarcel Moolenaar {
90c243e490SMarcel Moolenaar     // Check that ATF_REQUIRE_ERRNO does not contain a semicolon that would
91c243e490SMarcel Moolenaar     // cause an empty-statement that confuses some compilers.
92c243e490SMarcel Moolenaar     ATF_REQUIRE_ERRNO(1, 1 == 1);
93c243e490SMarcel Moolenaar     ATF_REQUIRE_ERRNO(2, 2 == 2);
94c243e490SMarcel Moolenaar }
95c243e490SMarcel Moolenaar 
96c243e490SMarcel Moolenaar // Test case names should not be expanded during instatiation so that they
97c243e490SMarcel Moolenaar // can have the exact same name as macros.
98c243e490SMarcel Moolenaar #define TEST_MACRO_1 invalid + name
99c243e490SMarcel Moolenaar #define TEST_MACRO_2 invalid + name
100c243e490SMarcel Moolenaar #define TEST_MACRO_3 invalid + name
101c243e490SMarcel Moolenaar ATF_TEST_CASE(TEST_MACRO_1);
ATF_TEST_CASE_HEAD(TEST_MACRO_1)102c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(TEST_MACRO_1) { }
ATF_TEST_CASE_BODY(TEST_MACRO_1)103c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(TEST_MACRO_1) { }
instantiate_1(void)104c243e490SMarcel Moolenaar void instantiate_1(void) {
105c243e490SMarcel Moolenaar     ATF_TEST_CASE_USE(TEST_MACRO_1);
106c243e490SMarcel Moolenaar     atf::tests::tc* the_test = new ATF_TEST_CASE_NAME(TEST_MACRO_1)();
107c243e490SMarcel Moolenaar     delete the_test;
108c243e490SMarcel Moolenaar }
109c243e490SMarcel Moolenaar ATF_TEST_CASE_WITH_CLEANUP(TEST_MACRO_2);
ATF_TEST_CASE_HEAD(TEST_MACRO_2)110c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(TEST_MACRO_2) { }
ATF_TEST_CASE_BODY(TEST_MACRO_2)111c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(TEST_MACRO_2) { }
ATF_TEST_CASE_CLEANUP(TEST_MACRO_2)112c243e490SMarcel Moolenaar ATF_TEST_CASE_CLEANUP(TEST_MACRO_2) { }
instatiate_2(void)113c243e490SMarcel Moolenaar void instatiate_2(void) {
114c243e490SMarcel Moolenaar     ATF_TEST_CASE_USE(TEST_MACRO_2);
115c243e490SMarcel Moolenaar     atf::tests::tc* the_test = new ATF_TEST_CASE_NAME(TEST_MACRO_2)();
116c243e490SMarcel Moolenaar     delete the_test;
117c243e490SMarcel Moolenaar }
118c243e490SMarcel Moolenaar ATF_TEST_CASE_WITH_CLEANUP(TEST_MACRO_3);
ATF_TEST_CASE_HEAD(TEST_MACRO_3)119c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(TEST_MACRO_3) { }
ATF_TEST_CASE_BODY(TEST_MACRO_3)120c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(TEST_MACRO_3) { }
ATF_TEST_CASE_CLEANUP(TEST_MACRO_3)121c243e490SMarcel Moolenaar ATF_TEST_CASE_CLEANUP(TEST_MACRO_3) { }
instatiate_3(void)122c243e490SMarcel Moolenaar void instatiate_3(void) {
123c243e490SMarcel Moolenaar     ATF_TEST_CASE_USE(TEST_MACRO_3);
124c243e490SMarcel Moolenaar     atf::tests::tc* the_test = new ATF_TEST_CASE_NAME(TEST_MACRO_3)();
125c243e490SMarcel Moolenaar     delete the_test;
126c243e490SMarcel Moolenaar }
127