1 2 // Copyright (C) 2008-2018 Lorenzo Caminiti 3 // Distributed under the Boost Software License, Version 1.0 (see accompanying 4 // file LICENSE_1_0.txt or a copy at http://www.boost.org/LICENSE_1_0.txt). 5 // See: http://www.boost.org/doc/libs/release/libs/contract/doc/html/index.html 6 7 // Test contract compilation on/off (using macro interface). 8 9 #include "../detail/oteststream.hpp" 10 #include "../detail/unprotected_commas.hpp" 11 #include <boost/contract/core/config.hpp> 12 #include <boost/contract/core/virtual.hpp> 13 #include <boost/contract_macro.hpp> 14 #include <boost/detail/lightweight_test.hpp> 15 #include <sstream> 16 17 boost::contract::test::detail::oteststream out; 18 19 struct b { 20 BOOST_CONTRACT_STATIC_INVARIANT({ 21 boost::contract::test::detail::unprotected_commas<void, void, void>:: 22 call(); 23 out << "b::static_inv" << std::endl; 24 }) 25 26 BOOST_CONTRACT_INVARIANT({ 27 boost::contract::test::detail::unprotected_commas<void, void, void>:: 28 call(); 29 out << "b::inv" << std::endl; 30 }) 31 32 virtual void f(int x, boost::contract::virtual_* v = 0) = 0; 33 }; 34 f(int x,boost::contract::virtual_ * v)35 void b::f(int x, boost::contract::virtual_* v) { 36 BOOST_CONTRACT_OLD_PTR( 37 boost::contract::test::detail::unprotected_commas<int, void, void>:: 38 type1 39 )( 40 (boost::contract::test::detail::unprotected_commas<void, void, void>:: 41 same(v)), 42 old_x, 43 (boost::contract::test::detail::unprotected_commas<void, void, void>:: 44 same(x)) 45 ); 46 BOOST_CONTRACT_PUBLIC_FUNCTION( 47 boost::contract::test::detail::unprotected_commas<void, void, void>:: 48 same(v), 49 boost::contract::test::detail::unprotected_commas<void, void, void>:: 50 same(this) 51 ) 52 BOOST_CONTRACT_PRECONDITION([] { 53 boost::contract::test::detail::unprotected_commas< 54 void, void, void>::call(); 55 out << "b::f::pre" << std::endl; 56 }) 57 BOOST_CONTRACT_OLD([] { 58 boost::contract::test::detail::unprotected_commas< 59 void, void, void>::call(); 60 out << "b::f::old" << std::endl; 61 }) 62 BOOST_CONTRACT_POSTCONDITION([] { 63 boost::contract::test::detail::unprotected_commas< 64 void, void, void>::call(); 65 out << "b::f::post" << std::endl; 66 }) 67 ; 68 out << "b::f::body" << std::endl; 69 } 70 71 struct a 72 #define BASES public boost::contract::test::detail::unprotected_commas< \ 73 b, void, void>::type1 74 : BASES 75 { 76 typedef BOOST_CONTRACT_BASE_TYPES(BASES) base_types; 77 BOOST_CONTRACT_OVERRIDE(f) 78 79 BOOST_CONTRACT_STATIC_INVARIANT({ 80 boost::contract::test::detail::unprotected_commas<void, void, void>:: 81 call(); 82 out << "a::static_inv" << std::endl; 83 }) 84 85 BOOST_CONTRACT_INVARIANT({ 86 boost::contract::test::detail::unprotected_commas<void, void, void>:: 87 call(); 88 out << "a::inv" << std::endl; 89 }) 90 fa91 virtual void f(int x, boost::contract::virtual_* v = 0) { 92 BOOST_CONTRACT_OLD_PTR( 93 boost::contract::test::detail::unprotected_commas<int, void, void>:: 94 type1 95 )( 96 (boost::contract::test::detail::unprotected_commas<void, void, 97 void>::same(v)), 98 old_x, 99 (boost::contract::test::detail::unprotected_commas<void, void, 100 void>::same(x)) 101 ); 102 BOOST_CONTRACT_PUBLIC_FUNCTION_OVERRIDE( 103 boost::contract::test::detail::unprotected_commas<override_f, void, 104 void>::type1 105 )( 106 boost::contract::test::detail::unprotected_commas<void, void, void> 107 ::same(v), 108 &a::f, 109 boost::contract::test::detail::unprotected_commas<void, void, void> 110 ::same(this), 111 boost::contract::test::detail::unprotected_commas<void, void, void> 112 ::same(x) 113 ) 114 BOOST_CONTRACT_PRECONDITION([] { 115 boost::contract::test::detail::unprotected_commas< 116 void, void, void>::call(); 117 out << "a::f::pre" << std::endl; 118 }) 119 BOOST_CONTRACT_OLD([] { 120 boost::contract::test::detail::unprotected_commas< 121 void, void, void>::call(); 122 out << "a::f::old" << std::endl; 123 }) 124 BOOST_CONTRACT_POSTCONDITION([] { 125 boost::contract::test::detail::unprotected_commas< 126 void, void, void>::call(); 127 out << "a::f::post" << std::endl; 128 }) 129 ; 130 out << "a::f::body" << std::endl; 131 } 132 }; 133 main()134 int main() { 135 std::ostringstream ok; 136 137 a aa; 138 out.str(""); 139 aa.f(123); 140 ok.str(""); ok 141 #ifndef BOOST_CONTRACT_NO_ENTRY_INVARIANTS 142 << "b::static_inv" << std::endl 143 << "b::inv" << std::endl 144 << "a::static_inv" << std::endl 145 << "a::inv" << std::endl 146 #endif 147 #ifndef BOOST_CONTRACT_NO_PRECONDITIONS 148 << "b::f::pre" << std::endl 149 #endif 150 #ifndef BOOST_CONTRACT_NO_OLDS 151 << "b::f::old" << std::endl 152 << "a::f::old" << std::endl 153 #endif 154 << "a::f::body" << std::endl 155 #ifndef BOOST_CONTRACT_NO_EXIT_INVARIANTS 156 << "b::static_inv" << std::endl 157 << "b::inv" << std::endl 158 << "a::static_inv" << std::endl 159 << "a::inv" << std::endl 160 #endif 161 #ifndef BOOST_CONTRACT_NO_POSTCONDITIONS 162 << "b::f::old" << std::endl // Called by post (so under NO_POST). 163 << "b::f::post" << std::endl 164 << "a::f::post" << std::endl 165 #endif 166 ; 167 BOOST_TEST(out.eq(ok.str())); 168 169 return boost::report_errors(); 170 } 171 172