2 // Copyright (C) 2006-2009, 2012 Alexander Nasonov
3 // Copyright (C) 2012 Lorenzo Caminiti
4 // Distributed under the Boost Software License, Version 1.0
5 // (see accompanying file LICENSE_1_0.txt or a copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
7 // Home at http://www.boost.org/libs/scope_exit
9 #include <boost/scope_exit.hpp>
10 #include <boost/config.hpp>
11 #include <boost/typeof/typeof.hpp>
12 #include <boost/typeof/std/string.hpp>
13 #include <boost/detail/lightweight_test.hpp>
20 template<int Dummy = 0>
25 template<int Dummy> long Holder<Dummy>::g_long;
27 void test_non_local(void) {
28 // ... and one local variable as well:
31 BOOST_SCOPE_EXIT(void) {
32 BOOST_TEST(Holder<>::g_long == 3);
33 } BOOST_SCOPE_EXIT_END
35 BOOST_SCOPE_EXIT( (i) ) {
37 BOOST_TEST(Holder<>::g_long == 3);
38 BOOST_TEST(g_str == "try: g_str");
39 } BOOST_SCOPE_EXIT_END
41 BOOST_SCOPE_EXIT( (&i) ) {
43 BOOST_TEST(Holder<>::g_long == 3);
44 BOOST_TEST(g_str == "try: g_str");
45 } BOOST_SCOPE_EXIT_END
51 BOOST_SCOPE_EXIT( (&i) ) {
54 } BOOST_SCOPE_EXIT_END
56 BOOST_SCOPE_EXIT( (&i) ) {
62 } BOOST_SCOPE_EXIT_END
65 BOOST_TEST(g_str == "");
66 BOOST_TEST(Holder<>::g_long == 1);
69 BOOST_TEST(Holder<>::g_long == 2);
70 BOOST_TEST(g_str == "g_str");
71 BOOST_TEST(i == 1); // Check that first declared is executed last.
73 BOOST_SCOPE_EXIT( (&i) ) {
75 BOOST_TEST(Holder<>::g_long == 3);
76 BOOST_TEST(g_str == "try: g_str");
77 } BOOST_SCOPE_EXIT_END
79 BOOST_SCOPE_EXIT( (i) ) {
81 BOOST_TEST(Holder<>::g_long == 3);
82 BOOST_TEST(g_str == "try: g_str");
83 } BOOST_SCOPE_EXIT_END
86 BOOST_SCOPE_EXIT( (&i) ) {
89 } BOOST_SCOPE_EXIT_END
91 BOOST_SCOPE_EXIT( (&i) ) {
94 } BOOST_SCOPE_EXIT_END
97 BOOST_TEST(g_str == "g_str");
98 BOOST_TEST(Holder<>::g_long == 2);
102 BOOST_TEST(Holder<>::g_long == 3);
103 BOOST_TEST(g_str == "try: g_str");
104 BOOST_TEST(i == 3); // Check that first declared is executed last.
108 bool foo(void) { return true; }
110 bool foo2(void) { return false; }
112 void test_types(void) {
113 bool (*pf)(void) = 0;
114 bool (&rf)(void) = foo;
115 bool results[2] = {};
118 BOOST_SCOPE_EXIT( (&results) (&pf) (&rf) ) {
126 BOOST_TEST(results[0] == false);
127 BOOST_TEST(results[1] == false);
130 BOOST_TEST(results[0] == true);
131 BOOST_TEST(results[1] == true);
134 BOOST_SCOPE_EXIT( (&results) (pf) ) {
137 pf = &foo2; // modify a copy
143 BOOST_TEST(results[0] == true);
144 BOOST_TEST(results[1] == true);
148 BOOST_TEST(results[0] == false);
149 BOOST_TEST(results[1] == false);
152 void test_capture_all(void) {
153 #ifndef BOOST_NO_CXX11_LAMBDAS
157 BOOST_SCOPE_EXIT_ALL(=) {
158 i = j = 1; // modify copies
165 BOOST_SCOPE_EXIT_ALL(&) {
176 BOOST_SCOPE_EXIT_ALL(=, &j) {
177 i = 2; // modify a copy
192 return boost::report_errors();