• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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