xref: /minix3/external/bsd/bind/dist/unit/atf-src/atf-c++/macros.hpp (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek //
2*00b67f09SDavid van Moolenbroek // Automated Testing Framework (atf)
3*00b67f09SDavid van Moolenbroek //
4*00b67f09SDavid van Moolenbroek // Copyright (c) 2007 The NetBSD Foundation, Inc.
5*00b67f09SDavid van Moolenbroek // All rights reserved.
6*00b67f09SDavid van Moolenbroek //
7*00b67f09SDavid van Moolenbroek // Redistribution and use in source and binary forms, with or without
8*00b67f09SDavid van Moolenbroek // modification, are permitted provided that the following conditions
9*00b67f09SDavid van Moolenbroek // are met:
10*00b67f09SDavid van Moolenbroek // 1. Redistributions of source code must retain the above copyright
11*00b67f09SDavid van Moolenbroek //    notice, this list of conditions and the following disclaimer.
12*00b67f09SDavid van Moolenbroek // 2. Redistributions in binary form must reproduce the above copyright
13*00b67f09SDavid van Moolenbroek //    notice, this list of conditions and the following disclaimer in the
14*00b67f09SDavid van Moolenbroek //    documentation and/or other materials provided with the distribution.
15*00b67f09SDavid van Moolenbroek //
16*00b67f09SDavid van Moolenbroek // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17*00b67f09SDavid van Moolenbroek // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18*00b67f09SDavid van Moolenbroek // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*00b67f09SDavid van Moolenbroek // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*00b67f09SDavid van Moolenbroek // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21*00b67f09SDavid van Moolenbroek // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*00b67f09SDavid van Moolenbroek // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23*00b67f09SDavid van Moolenbroek // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*00b67f09SDavid van Moolenbroek // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25*00b67f09SDavid van Moolenbroek // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26*00b67f09SDavid van Moolenbroek // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*00b67f09SDavid van Moolenbroek // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*00b67f09SDavid van Moolenbroek //
29*00b67f09SDavid van Moolenbroek 
30*00b67f09SDavid van Moolenbroek #if !defined(_ATF_CXX_MACROS_HPP_)
31*00b67f09SDavid van Moolenbroek #define _ATF_CXX_MACROS_HPP_
32*00b67f09SDavid van Moolenbroek 
33*00b67f09SDavid van Moolenbroek #include <sstream>
34*00b67f09SDavid van Moolenbroek #include <stdexcept>
35*00b67f09SDavid van Moolenbroek #include <vector>
36*00b67f09SDavid van Moolenbroek 
37*00b67f09SDavid van Moolenbroek #include <atf-c++/tests.hpp>
38*00b67f09SDavid van Moolenbroek 
39*00b67f09SDavid van Moolenbroek // Do not define inline methods for the test case classes.  Doing so
40*00b67f09SDavid van Moolenbroek // significantly increases the memory requirements of GNU G++ during
41*00b67f09SDavid van Moolenbroek // compilation.
42*00b67f09SDavid van Moolenbroek 
43*00b67f09SDavid van Moolenbroek #define ATF_TEST_CASE_WITHOUT_HEAD(name) \
44*00b67f09SDavid van Moolenbroek     namespace { \
45*00b67f09SDavid van Moolenbroek     class atfu_tc_ ## name : public atf::tests::tc { \
46*00b67f09SDavid van Moolenbroek         void body(void) const; \
47*00b67f09SDavid van Moolenbroek     public: \
48*00b67f09SDavid van Moolenbroek         atfu_tc_ ## name(void); \
49*00b67f09SDavid van Moolenbroek     }; \
50*00b67f09SDavid van Moolenbroek     static atfu_tc_ ## name* atfu_tcptr_ ## name; \
51*00b67f09SDavid van Moolenbroek     atfu_tc_ ## name::atfu_tc_ ## name(void) : atf::tests::tc(#name, false) {} \
52*00b67f09SDavid van Moolenbroek     }
53*00b67f09SDavid van Moolenbroek 
54*00b67f09SDavid van Moolenbroek #define ATF_TEST_CASE(name) \
55*00b67f09SDavid van Moolenbroek     namespace { \
56*00b67f09SDavid van Moolenbroek     class atfu_tc_ ## name : public atf::tests::tc { \
57*00b67f09SDavid van Moolenbroek         void head(void); \
58*00b67f09SDavid van Moolenbroek         void body(void) const; \
59*00b67f09SDavid van Moolenbroek     public: \
60*00b67f09SDavid van Moolenbroek         atfu_tc_ ## name(void); \
61*00b67f09SDavid van Moolenbroek     }; \
62*00b67f09SDavid van Moolenbroek     static atfu_tc_ ## name* atfu_tcptr_ ## name; \
63*00b67f09SDavid van Moolenbroek     atfu_tc_ ## name::atfu_tc_ ## name(void) : atf::tests::tc(#name, false) {} \
64*00b67f09SDavid van Moolenbroek     }
65*00b67f09SDavid van Moolenbroek 
66*00b67f09SDavid van Moolenbroek #define ATF_TEST_CASE_WITH_CLEANUP(name) \
67*00b67f09SDavid van Moolenbroek     namespace { \
68*00b67f09SDavid van Moolenbroek     class atfu_tc_ ## name : public atf::tests::tc { \
69*00b67f09SDavid van Moolenbroek         void head(void); \
70*00b67f09SDavid van Moolenbroek         void body(void) const; \
71*00b67f09SDavid van Moolenbroek         void cleanup(void) const; \
72*00b67f09SDavid van Moolenbroek     public: \
73*00b67f09SDavid van Moolenbroek         atfu_tc_ ## name(void); \
74*00b67f09SDavid van Moolenbroek     }; \
75*00b67f09SDavid van Moolenbroek     static atfu_tc_ ## name* atfu_tcptr_ ## name; \
76*00b67f09SDavid van Moolenbroek     atfu_tc_ ## name::atfu_tc_ ## name(void) : atf::tests::tc(#name, true) {} \
77*00b67f09SDavid van Moolenbroek     }
78*00b67f09SDavid van Moolenbroek 
79*00b67f09SDavid van Moolenbroek #define ATF_TEST_CASE_NAME(name) atfu_tc_ ## name
80*00b67f09SDavid van Moolenbroek #define ATF_TEST_CASE_USE(name) (atfu_tcptr_ ## name) = NULL
81*00b67f09SDavid van Moolenbroek 
82*00b67f09SDavid van Moolenbroek #define ATF_TEST_CASE_HEAD(name) \
83*00b67f09SDavid van Moolenbroek     void \
84*00b67f09SDavid van Moolenbroek     atfu_tc_ ## name::head(void)
85*00b67f09SDavid van Moolenbroek 
86*00b67f09SDavid van Moolenbroek #define ATF_TEST_CASE_BODY(name) \
87*00b67f09SDavid van Moolenbroek     void \
88*00b67f09SDavid van Moolenbroek     atfu_tc_ ## name::body(void) \
89*00b67f09SDavid van Moolenbroek         const
90*00b67f09SDavid van Moolenbroek 
91*00b67f09SDavid van Moolenbroek #define ATF_TEST_CASE_CLEANUP(name) \
92*00b67f09SDavid van Moolenbroek     void \
93*00b67f09SDavid van Moolenbroek     atfu_tc_ ## name::cleanup(void) \
94*00b67f09SDavid van Moolenbroek         const
95*00b67f09SDavid van Moolenbroek 
96*00b67f09SDavid van Moolenbroek #define ATF_FAIL(reason) atf::tests::tc::fail(reason)
97*00b67f09SDavid van Moolenbroek 
98*00b67f09SDavid van Moolenbroek #define ATF_SKIP(reason) atf::tests::tc::skip(reason)
99*00b67f09SDavid van Moolenbroek 
100*00b67f09SDavid van Moolenbroek #define ATF_PASS() atf::tests::tc::pass()
101*00b67f09SDavid van Moolenbroek 
102*00b67f09SDavid van Moolenbroek #define ATF_REQUIRE(x) \
103*00b67f09SDavid van Moolenbroek     do { \
104*00b67f09SDavid van Moolenbroek         if (!(x)) { \
105*00b67f09SDavid van Moolenbroek             std::ostringstream atfu_ss; \
106*00b67f09SDavid van Moolenbroek             atfu_ss << "Line " << __LINE__ << ": " << #x << " not met"; \
107*00b67f09SDavid van Moolenbroek             atf::tests::tc::fail(atfu_ss.str()); \
108*00b67f09SDavid van Moolenbroek         } \
109*00b67f09SDavid van Moolenbroek     } while (false)
110*00b67f09SDavid van Moolenbroek 
111*00b67f09SDavid van Moolenbroek #define ATF_REQUIRE_EQ(x, y) \
112*00b67f09SDavid van Moolenbroek     do { \
113*00b67f09SDavid van Moolenbroek         if ((x) != (y)) { \
114*00b67f09SDavid van Moolenbroek             std::ostringstream atfu_ss; \
115*00b67f09SDavid van Moolenbroek             atfu_ss << "Line " << __LINE__ << ": " << #x << " != " << #y \
116*00b67f09SDavid van Moolenbroek                      << " (" << (x) << " != " << (y) << ")"; \
117*00b67f09SDavid van Moolenbroek             atf::tests::tc::fail(atfu_ss.str()); \
118*00b67f09SDavid van Moolenbroek         } \
119*00b67f09SDavid van Moolenbroek     } while (false)
120*00b67f09SDavid van Moolenbroek 
121*00b67f09SDavid van Moolenbroek #define ATF_REQUIRE_IN(element, collection) \
122*00b67f09SDavid van Moolenbroek     ATF_REQUIRE((collection).find(element) != (collection).end())
123*00b67f09SDavid van Moolenbroek 
124*00b67f09SDavid van Moolenbroek #define ATF_REQUIRE_NOT_IN(element, collection) \
125*00b67f09SDavid van Moolenbroek     ATF_REQUIRE((collection).find(element) == (collection).end())
126*00b67f09SDavid van Moolenbroek 
127*00b67f09SDavid van Moolenbroek #define ATF_REQUIRE_MATCH(regexp, string) \
128*00b67f09SDavid van Moolenbroek     do { \
129*00b67f09SDavid van Moolenbroek         if (!atf::tests::detail::match(regexp, string)) { \
130*00b67f09SDavid van Moolenbroek             std::ostringstream atfu_ss; \
131*00b67f09SDavid van Moolenbroek             atfu_ss << "Line " << __LINE__ << ": '" << string << "' does not " \
132*00b67f09SDavid van Moolenbroek                     << "match regexp '" << regexp << "'"; \
133*00b67f09SDavid van Moolenbroek             atf::tests::tc::fail(atfu_ss.str()); \
134*00b67f09SDavid van Moolenbroek         } \
135*00b67f09SDavid van Moolenbroek     } while (false)
136*00b67f09SDavid van Moolenbroek 
137*00b67f09SDavid van Moolenbroek #define ATF_REQUIRE_THROW(e, x) \
138*00b67f09SDavid van Moolenbroek     do { \
139*00b67f09SDavid van Moolenbroek         try { \
140*00b67f09SDavid van Moolenbroek             x; \
141*00b67f09SDavid van Moolenbroek             std::ostringstream atfu_ss; \
142*00b67f09SDavid van Moolenbroek             atfu_ss << "Line " << __LINE__ << ": " #x " did not throw " \
143*00b67f09SDavid van Moolenbroek                         #e " as expected"; \
144*00b67f09SDavid van Moolenbroek             atf::tests::tc::fail(atfu_ss.str()); \
145*00b67f09SDavid van Moolenbroek         } catch (const e&) { \
146*00b67f09SDavid van Moolenbroek         } catch (const std::exception& atfu_e) { \
147*00b67f09SDavid van Moolenbroek             std::ostringstream atfu_ss; \
148*00b67f09SDavid van Moolenbroek             atfu_ss << "Line " << __LINE__ << ": " #x " threw an " \
149*00b67f09SDavid van Moolenbroek                         "unexpected error (not " #e "): " << atfu_e.what(); \
150*00b67f09SDavid van Moolenbroek             atf::tests::tc::fail(atfu_ss.str()); \
151*00b67f09SDavid van Moolenbroek         } catch (...) { \
152*00b67f09SDavid van Moolenbroek             std::ostringstream atfu_ss; \
153*00b67f09SDavid van Moolenbroek             atfu_ss << "Line " << __LINE__ << ": " #x " threw an " \
154*00b67f09SDavid van Moolenbroek                         "unexpected error (not " #e ")"; \
155*00b67f09SDavid van Moolenbroek             atf::tests::tc::fail(atfu_ss.str()); \
156*00b67f09SDavid van Moolenbroek         } \
157*00b67f09SDavid van Moolenbroek     } while (false)
158*00b67f09SDavid van Moolenbroek 
159*00b67f09SDavid van Moolenbroek #define ATF_REQUIRE_THROW_RE(type, regexp, x) \
160*00b67f09SDavid van Moolenbroek     do { \
161*00b67f09SDavid van Moolenbroek         try { \
162*00b67f09SDavid van Moolenbroek             x; \
163*00b67f09SDavid van Moolenbroek             std::ostringstream atfu_ss; \
164*00b67f09SDavid van Moolenbroek             atfu_ss << "Line " << __LINE__ << ": " #x " did not throw " \
165*00b67f09SDavid van Moolenbroek                         #type " as expected"; \
166*00b67f09SDavid van Moolenbroek             atf::tests::tc::fail(atfu_ss.str()); \
167*00b67f09SDavid van Moolenbroek         } catch (const type& e) { \
168*00b67f09SDavid van Moolenbroek             if (!atf::tests::detail::match(regexp, e.what())) { \
169*00b67f09SDavid van Moolenbroek                 std::ostringstream atfu_ss; \
170*00b67f09SDavid van Moolenbroek                 atfu_ss << "Line " << __LINE__ << ": " #x " threw " #type "(" \
171*00b67f09SDavid van Moolenbroek                         << e.what() << "), but does not match '" << regexp \
172*00b67f09SDavid van Moolenbroek                         << "'"; \
173*00b67f09SDavid van Moolenbroek                 atf::tests::tc::fail(atfu_ss.str()); \
174*00b67f09SDavid van Moolenbroek             } \
175*00b67f09SDavid van Moolenbroek         } catch (const std::exception& atfu_e) { \
176*00b67f09SDavid van Moolenbroek             std::ostringstream atfu_ss; \
177*00b67f09SDavid van Moolenbroek             atfu_ss << "Line " << __LINE__ << ": " #x " threw an " \
178*00b67f09SDavid van Moolenbroek                         "unexpected error (not " #type "): " << atfu_e.what(); \
179*00b67f09SDavid van Moolenbroek             atf::tests::tc::fail(atfu_ss.str()); \
180*00b67f09SDavid van Moolenbroek         } catch (...) { \
181*00b67f09SDavid van Moolenbroek             std::ostringstream atfu_ss; \
182*00b67f09SDavid van Moolenbroek             atfu_ss << "Line " << __LINE__ << ": " #x " threw an " \
183*00b67f09SDavid van Moolenbroek                         "unexpected error (not " #type ")"; \
184*00b67f09SDavid van Moolenbroek             atf::tests::tc::fail(atfu_ss.str()); \
185*00b67f09SDavid van Moolenbroek         } \
186*00b67f09SDavid van Moolenbroek     } while (false)
187*00b67f09SDavid van Moolenbroek 
188*00b67f09SDavid van Moolenbroek #define ATF_CHECK_ERRNO(exp_errno, bool_expr) \
189*00b67f09SDavid van Moolenbroek     atf::tests::tc::check_errno(__FILE__, __LINE__, exp_errno, #bool_expr, \
190*00b67f09SDavid van Moolenbroek                                 bool_expr)
191*00b67f09SDavid van Moolenbroek 
192*00b67f09SDavid van Moolenbroek #define ATF_REQUIRE_ERRNO(exp_errno, bool_expr) \
193*00b67f09SDavid van Moolenbroek     atf::tests::tc::require_errno(__FILE__, __LINE__, exp_errno, #bool_expr, \
194*00b67f09SDavid van Moolenbroek                                   bool_expr)
195*00b67f09SDavid van Moolenbroek 
196*00b67f09SDavid van Moolenbroek #define ATF_INIT_TEST_CASES(tcs) \
197*00b67f09SDavid van Moolenbroek     namespace atf { \
198*00b67f09SDavid van Moolenbroek         namespace tests { \
199*00b67f09SDavid van Moolenbroek             int run_tp(int, char* const*, \
200*00b67f09SDavid van Moolenbroek                        void (*)(std::vector< atf::tests::tc * >&)); \
201*00b67f09SDavid van Moolenbroek         } \
202*00b67f09SDavid van Moolenbroek     } \
203*00b67f09SDavid van Moolenbroek     \
204*00b67f09SDavid van Moolenbroek     static void atfu_init_tcs(std::vector< atf::tests::tc * >&); \
205*00b67f09SDavid van Moolenbroek     \
206*00b67f09SDavid van Moolenbroek     int \
207*00b67f09SDavid van Moolenbroek     main(int argc, char* const* argv) \
208*00b67f09SDavid van Moolenbroek     { \
209*00b67f09SDavid van Moolenbroek         return atf::tests::run_tp(argc, argv, atfu_init_tcs); \
210*00b67f09SDavid van Moolenbroek     } \
211*00b67f09SDavid van Moolenbroek     \
212*00b67f09SDavid van Moolenbroek     static \
213*00b67f09SDavid van Moolenbroek     void \
214*00b67f09SDavid van Moolenbroek     atfu_init_tcs(std::vector< atf::tests::tc * >& tcs)
215*00b67f09SDavid van Moolenbroek 
216*00b67f09SDavid van Moolenbroek #define ATF_ADD_TEST_CASE(tcs, tcname) \
217*00b67f09SDavid van Moolenbroek     do { \
218*00b67f09SDavid van Moolenbroek         atfu_tcptr_ ## tcname = new atfu_tc_ ## tcname(); \
219*00b67f09SDavid van Moolenbroek         (tcs).push_back(atfu_tcptr_ ## tcname); \
220*00b67f09SDavid van Moolenbroek     } while (0);
221*00b67f09SDavid van Moolenbroek 
222*00b67f09SDavid van Moolenbroek #endif // !defined(_ATF_CXX_MACROS_HPP_)
223