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