xref: /freebsd/contrib/atf/atf-c++/macros.hpp (revision 8f0ea33f2bbf3a6aa80235f0a02fa5f2780c2b17)
1c243e490SMarcel Moolenaar // Copyright (c) 2007 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 
26*0677dfd1SJulio Merino #if !defined(ATF_CXX_MACROS_HPP)
27*0677dfd1SJulio Merino #define ATF_CXX_MACROS_HPP
28c243e490SMarcel Moolenaar 
29c243e490SMarcel Moolenaar #include <sstream>
30c243e490SMarcel Moolenaar #include <stdexcept>
31c243e490SMarcel Moolenaar #include <vector>
32c243e490SMarcel Moolenaar 
33c243e490SMarcel Moolenaar #include <atf-c++/tests.hpp>
34c243e490SMarcel Moolenaar 
35c243e490SMarcel Moolenaar // Do not define inline methods for the test case classes.  Doing so
36c243e490SMarcel Moolenaar // significantly increases the memory requirements of GNU G++ during
37c243e490SMarcel Moolenaar // compilation.
38c243e490SMarcel Moolenaar 
39c243e490SMarcel Moolenaar #define ATF_TEST_CASE_WITHOUT_HEAD(name) \
40c243e490SMarcel Moolenaar     namespace { \
41c243e490SMarcel Moolenaar     class atfu_tc_ ## name : public atf::tests::tc { \
42c243e490SMarcel Moolenaar         void body(void) const; \
43c243e490SMarcel Moolenaar     public: \
44c243e490SMarcel Moolenaar         atfu_tc_ ## name(void); \
45c243e490SMarcel Moolenaar     }; \
46c243e490SMarcel Moolenaar     static atfu_tc_ ## name* atfu_tcptr_ ## name; \
47c243e490SMarcel Moolenaar     atfu_tc_ ## name::atfu_tc_ ## name(void) : atf::tests::tc(#name, false) {} \
48c243e490SMarcel Moolenaar     }
49c243e490SMarcel Moolenaar 
50c243e490SMarcel Moolenaar #define ATF_TEST_CASE(name) \
51c243e490SMarcel Moolenaar     namespace { \
52c243e490SMarcel Moolenaar     class atfu_tc_ ## name : public atf::tests::tc { \
53c243e490SMarcel Moolenaar         void head(void); \
54c243e490SMarcel Moolenaar         void body(void) const; \
55c243e490SMarcel Moolenaar     public: \
56c243e490SMarcel Moolenaar         atfu_tc_ ## name(void); \
57c243e490SMarcel Moolenaar     }; \
58c243e490SMarcel Moolenaar     static atfu_tc_ ## name* atfu_tcptr_ ## name; \
59c243e490SMarcel Moolenaar     atfu_tc_ ## name::atfu_tc_ ## name(void) : atf::tests::tc(#name, false) {} \
60c243e490SMarcel Moolenaar     }
61c243e490SMarcel Moolenaar 
62c243e490SMarcel Moolenaar #define ATF_TEST_CASE_WITH_CLEANUP(name) \
63c243e490SMarcel Moolenaar     namespace { \
64c243e490SMarcel Moolenaar     class atfu_tc_ ## name : public atf::tests::tc { \
65c243e490SMarcel Moolenaar         void head(void); \
66c243e490SMarcel Moolenaar         void body(void) const; \
67c243e490SMarcel Moolenaar         void cleanup(void) const; \
68c243e490SMarcel Moolenaar     public: \
69c243e490SMarcel Moolenaar         atfu_tc_ ## name(void); \
70c243e490SMarcel Moolenaar     }; \
71c243e490SMarcel Moolenaar     static atfu_tc_ ## name* atfu_tcptr_ ## name; \
72c243e490SMarcel Moolenaar     atfu_tc_ ## name::atfu_tc_ ## name(void) : atf::tests::tc(#name, true) {} \
73c243e490SMarcel Moolenaar     }
74c243e490SMarcel Moolenaar 
75c243e490SMarcel Moolenaar #define ATF_TEST_CASE_NAME(name) atfu_tc_ ## name
76c243e490SMarcel Moolenaar #define ATF_TEST_CASE_USE(name) (atfu_tcptr_ ## name) = NULL
77c243e490SMarcel Moolenaar 
78c243e490SMarcel Moolenaar #define ATF_TEST_CASE_HEAD(name) \
79c243e490SMarcel Moolenaar     void \
80c243e490SMarcel Moolenaar     atfu_tc_ ## name::head(void)
81c243e490SMarcel Moolenaar 
82c243e490SMarcel Moolenaar #define ATF_TEST_CASE_BODY(name) \
83c243e490SMarcel Moolenaar     void \
84c243e490SMarcel Moolenaar     atfu_tc_ ## name::body(void) \
85c243e490SMarcel Moolenaar         const
86c243e490SMarcel Moolenaar 
87c243e490SMarcel Moolenaar #define ATF_TEST_CASE_CLEANUP(name) \
88c243e490SMarcel Moolenaar     void \
89c243e490SMarcel Moolenaar     atfu_tc_ ## name::cleanup(void) \
90c243e490SMarcel Moolenaar         const
91c243e490SMarcel Moolenaar 
92c243e490SMarcel Moolenaar #define ATF_FAIL(reason) atf::tests::tc::fail(reason)
93c243e490SMarcel Moolenaar 
94c243e490SMarcel Moolenaar #define ATF_SKIP(reason) atf::tests::tc::skip(reason)
95c243e490SMarcel Moolenaar 
96c243e490SMarcel Moolenaar #define ATF_PASS() atf::tests::tc::pass()
97c243e490SMarcel Moolenaar 
98*0677dfd1SJulio Merino #define ATF_REQUIRE(expression) \
99c243e490SMarcel Moolenaar     do { \
100*0677dfd1SJulio Merino         if (!(expression)) { \
101c243e490SMarcel Moolenaar             std::ostringstream atfu_ss; \
102*0677dfd1SJulio Merino             atfu_ss << "Line " << __LINE__ << ": " << #expression \
103*0677dfd1SJulio Merino                     << " not met"; \
104c243e490SMarcel Moolenaar             atf::tests::tc::fail(atfu_ss.str()); \
105c243e490SMarcel Moolenaar         } \
106c243e490SMarcel Moolenaar     } while (false)
107c243e490SMarcel Moolenaar 
108*0677dfd1SJulio Merino #define ATF_REQUIRE_EQ(expected, actual) \
109c243e490SMarcel Moolenaar     do { \
110*0677dfd1SJulio Merino         if ((expected) != (actual)) { \
111c243e490SMarcel Moolenaar             std::ostringstream atfu_ss; \
112*0677dfd1SJulio Merino             atfu_ss << "Line " << __LINE__ << ": " \
113*0677dfd1SJulio Merino                     << #expected << " != " << #actual \
114*0677dfd1SJulio Merino                     << " (" << (expected) << " != " << (actual) << ")"; \
115c243e490SMarcel Moolenaar             atf::tests::tc::fail(atfu_ss.str()); \
116c243e490SMarcel Moolenaar         } \
117c243e490SMarcel Moolenaar     } while (false)
118c243e490SMarcel Moolenaar 
119c243e490SMarcel Moolenaar #define ATF_REQUIRE_IN(element, collection) \
120c243e490SMarcel Moolenaar     ATF_REQUIRE((collection).find(element) != (collection).end())
121c243e490SMarcel Moolenaar 
122c243e490SMarcel Moolenaar #define ATF_REQUIRE_NOT_IN(element, collection) \
123c243e490SMarcel Moolenaar     ATF_REQUIRE((collection).find(element) == (collection).end())
124c243e490SMarcel Moolenaar 
125c243e490SMarcel Moolenaar #define ATF_REQUIRE_MATCH(regexp, string) \
126c243e490SMarcel Moolenaar     do { \
127c243e490SMarcel Moolenaar         if (!atf::tests::detail::match(regexp, string)) { \
128c243e490SMarcel Moolenaar             std::ostringstream atfu_ss; \
129c243e490SMarcel Moolenaar             atfu_ss << "Line " << __LINE__ << ": '" << string << "' does not " \
130c243e490SMarcel Moolenaar                     << "match regexp '" << regexp << "'"; \
131c243e490SMarcel Moolenaar             atf::tests::tc::fail(atfu_ss.str()); \
132c243e490SMarcel Moolenaar         } \
133c243e490SMarcel Moolenaar     } while (false)
134c243e490SMarcel Moolenaar 
135*0677dfd1SJulio Merino #define ATF_REQUIRE_THROW(expected_exception, statement) \
136c243e490SMarcel Moolenaar     do { \
137c243e490SMarcel Moolenaar         try { \
138*0677dfd1SJulio Merino             statement; \
139c243e490SMarcel Moolenaar             std::ostringstream atfu_ss; \
140*0677dfd1SJulio Merino             atfu_ss << "Line " << __LINE__ \
141*0677dfd1SJulio Merino                     << ": " #statement " did not throw " #expected_exception \
142*0677dfd1SJulio Merino                        " as expected"; \
143c243e490SMarcel Moolenaar             atf::tests::tc::fail(atfu_ss.str()); \
144*0677dfd1SJulio Merino         } catch (const expected_exception&) { \
145c243e490SMarcel Moolenaar         } catch (const std::exception& atfu_e) { \
146c243e490SMarcel Moolenaar             std::ostringstream atfu_ss; \
147*0677dfd1SJulio Merino             atfu_ss << "Line " << __LINE__ << ": " #statement " threw an " \
148*0677dfd1SJulio Merino                        "unexpected error (not " #expected_exception "): " \
149*0677dfd1SJulio Merino                     << atfu_e.what(); \
150c243e490SMarcel Moolenaar             atf::tests::tc::fail(atfu_ss.str()); \
151c243e490SMarcel Moolenaar         } catch (...) { \
152c243e490SMarcel Moolenaar             std::ostringstream atfu_ss; \
153*0677dfd1SJulio Merino             atfu_ss << "Line " << __LINE__ << ": " #statement " threw an " \
154*0677dfd1SJulio Merino                        "unexpected error (not " #expected_exception ")"; \
155c243e490SMarcel Moolenaar             atf::tests::tc::fail(atfu_ss.str()); \
156c243e490SMarcel Moolenaar         } \
157c243e490SMarcel Moolenaar     } while (false)
158c243e490SMarcel Moolenaar 
159*0677dfd1SJulio Merino #define ATF_REQUIRE_THROW_RE(expected_exception, regexp, statement) \
160c243e490SMarcel Moolenaar     do { \
161c243e490SMarcel Moolenaar         try { \
162*0677dfd1SJulio Merino             statement; \
163c243e490SMarcel Moolenaar             std::ostringstream atfu_ss; \
164*0677dfd1SJulio Merino             atfu_ss << "Line " << __LINE__ \
165*0677dfd1SJulio Merino                     << ": " #statement " did not throw " #expected_exception \
166*0677dfd1SJulio Merino                        " as expected"; \
167c243e490SMarcel Moolenaar             atf::tests::tc::fail(atfu_ss.str()); \
168*0677dfd1SJulio Merino         } catch (const expected_exception& e) { \
169c243e490SMarcel Moolenaar             if (!atf::tests::detail::match(regexp, e.what())) { \
170c243e490SMarcel Moolenaar                 std::ostringstream atfu_ss; \
171*0677dfd1SJulio Merino                 atfu_ss << "Line " << __LINE__ \
172*0677dfd1SJulio Merino                         << ": " #statement " threw " #expected_exception "(" \
173c243e490SMarcel Moolenaar                         << e.what() << "), but does not match '" << regexp \
174c243e490SMarcel Moolenaar                         << "'"; \
175c243e490SMarcel Moolenaar                 atf::tests::tc::fail(atfu_ss.str()); \
176c243e490SMarcel Moolenaar             } \
177c243e490SMarcel Moolenaar         } catch (const std::exception& atfu_e) { \
178c243e490SMarcel Moolenaar             std::ostringstream atfu_ss; \
179*0677dfd1SJulio Merino             atfu_ss << "Line " << __LINE__ << ": " #statement " threw an " \
180*0677dfd1SJulio Merino                         "unexpected error (not " #expected_exception "): " \
181*0677dfd1SJulio Merino                     << atfu_e.what(); \
182c243e490SMarcel Moolenaar             atf::tests::tc::fail(atfu_ss.str()); \
183c243e490SMarcel Moolenaar         } catch (...) { \
184c243e490SMarcel Moolenaar             std::ostringstream atfu_ss; \
185*0677dfd1SJulio Merino             atfu_ss << "Line " << __LINE__ << ": " #statement " threw an " \
186*0677dfd1SJulio Merino                         "unexpected error (not " #expected_exception ")"; \
187c243e490SMarcel Moolenaar             atf::tests::tc::fail(atfu_ss.str()); \
188c243e490SMarcel Moolenaar         } \
189c243e490SMarcel Moolenaar     } while (false)
190c243e490SMarcel Moolenaar 
191*0677dfd1SJulio Merino #define ATF_CHECK_ERRNO(expected_errno, bool_expr) \
192*0677dfd1SJulio Merino     atf::tests::tc::check_errno(__FILE__, __LINE__, expected_errno, \
193*0677dfd1SJulio Merino                                 #bool_expr, bool_expr)
194c243e490SMarcel Moolenaar 
195*0677dfd1SJulio Merino #define ATF_REQUIRE_ERRNO(expected_errno, bool_expr) \
196*0677dfd1SJulio Merino     atf::tests::tc::require_errno(__FILE__, __LINE__, expected_errno, \
197*0677dfd1SJulio Merino                                   #bool_expr, bool_expr)
198c243e490SMarcel Moolenaar 
199c243e490SMarcel Moolenaar #define ATF_INIT_TEST_CASES(tcs) \
200c243e490SMarcel Moolenaar     namespace atf { \
201c243e490SMarcel Moolenaar         namespace tests { \
202*0677dfd1SJulio Merino             int run_tp(int, char**, \
203c243e490SMarcel Moolenaar                        void (*)(std::vector< atf::tests::tc * >&)); \
204c243e490SMarcel Moolenaar         } \
205c243e490SMarcel Moolenaar     } \
206c243e490SMarcel Moolenaar     \
207c243e490SMarcel Moolenaar     static void atfu_init_tcs(std::vector< atf::tests::tc * >&); \
208c243e490SMarcel Moolenaar     \
209c243e490SMarcel Moolenaar     int \
210*0677dfd1SJulio Merino     main(int argc, char** argv) \
211c243e490SMarcel Moolenaar     { \
212c243e490SMarcel Moolenaar         return atf::tests::run_tp(argc, argv, atfu_init_tcs); \
213c243e490SMarcel Moolenaar     } \
214c243e490SMarcel Moolenaar     \
215c243e490SMarcel Moolenaar     static \
216c243e490SMarcel Moolenaar     void \
217c243e490SMarcel Moolenaar     atfu_init_tcs(std::vector< atf::tests::tc * >& tcs)
218c243e490SMarcel Moolenaar 
219c243e490SMarcel Moolenaar #define ATF_ADD_TEST_CASE(tcs, tcname) \
220c243e490SMarcel Moolenaar     do { \
221c243e490SMarcel Moolenaar         atfu_tcptr_ ## tcname = new atfu_tc_ ## tcname(); \
222c243e490SMarcel Moolenaar         (tcs).push_back(atfu_tcptr_ ## tcname); \
223c243e490SMarcel Moolenaar     } while (0);
224c243e490SMarcel Moolenaar 
225*0677dfd1SJulio Merino #endif // !defined(ATF_CXX_MACROS_HPP)
226