• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //  (C) Copyright Gennadiy Rozental 2003-2015.
2 //  Distributed under the Boost Software License, Version 1.0.
3 //  (See accompanying file LICENSE_1_0.txt or copy at
4 //  http://www.boost.org/LICENSE_1_0.txt)
5 
6 //  See http://www.boost.org/libs/test for the library home page.
7 //
8 //  Description : unit test for class properties facility
9 //  Note: this file should be compatible with C++03 compilers (features in boost.test v2)
10 // ***************************************************************************
11 
12 // Boost.Test
13 #define BOOST_TEST_MODULE Class Properties test
14 #include <boost/test/unit_test.hpp>
15 #include <boost/test/utils/class_properties.hpp>
16 
17 // STL
18 #include <vector>
19 
20 using namespace boost::unit_test;
21 
22 //____________________________________________________________________________//
23 
24 struct A {
operator boolA25     operator bool() const { return true; }
26 } a;
27 
28 struct B {
fooB29     int foo() const { return 1; }
fooB30     int foo()       { return 2; }
31 
operator intB32     operator int() const { return 1; }
33 };
34 
35 BOOST_READONLY_PROPERTY( B*, (C) ) p_b_ptr;
36 
37 class C {
38 public:
init()39     static void init()
40     {
41         p_b_ptr.value = new B;
42     }
43 };
44 
45 BOOST_READONLY_PROPERTY( A*, (D)(E) ) p_a_ptr;
46 
47 class D {
48 public:
init()49     static void init()
50     {
51         p_a_ptr.value = new A;
52     }
53 };
54 
55 class E {
56 public:
reset()57     static void reset()
58     {
59         delete p_a_ptr;
60         p_a_ptr.value = new A;
61     }
62 };
63 
BOOST_AUTO_TEST_CASE(test_readonly_property)64 BOOST_AUTO_TEST_CASE( test_readonly_property )
65 {
66     readonly_property<int> p_zero;
67     readonly_property<int> p_one( 1 );
68     readonly_property<int> p_two( 2 );
69 
70     readonly_property<bool> p_true( true );
71     readonly_property<bool> p_false( false );
72     readonly_property<std::string> p_str( "abcd" );
73     readonly_property<std::string> p_str2( "abc" );
74 
75     readonly_property<B> p_b;
76     readonly_property<A> p_a;
77 
78     BOOST_TEST( p_one );
79     BOOST_TEST( !!p_one );
80 
81     int i = p_one;
82 
83     BOOST_TEST( p_one == i );
84 
85     double d = p_one;
86 
87     BOOST_TEST( p_one == d );
88 
89     BOOST_TEST( p_one != 0 );
90     BOOST_TEST( 0 != p_one );
91     BOOST_TEST( !(p_one == 0) );
92     BOOST_TEST( !(0 == p_one) );
93 
94     float fzero = 0;
95 
96     BOOST_TEST( p_one != fzero );
97     BOOST_TEST( fzero != p_one );
98 
99     BOOST_TEST( p_one >= 1 );
100     BOOST_TEST( 2 > p_one  );
101 
102     BOOST_TEST( !(p_one == p_two) );
103     BOOST_TEST( p_one != p_two );
104     BOOST_TEST( p_one < p_two );
105 
106     BOOST_TEST( p_zero == 0 );
107 
108     BOOST_TEST( (p_one - 1) == 0 );
109     BOOST_TEST( (-p_one + 1) == 0 );
110 
111     BOOST_TEST( p_true );
112     BOOST_TEST( !p_false );
113 
114     BOOST_TEST(( (i > 0) && p_true ));
115     BOOST_TEST(( p_true && (i > 0) ));
116     BOOST_TEST(( (i > 0) || p_false ));
117     BOOST_TEST(( p_false || (i > 0) ));
118 
119     BOOST_TEST(( a && p_true ));
120     BOOST_TEST(( a || p_true ));
121 
122     BOOST_TEST(( p_true && a ));
123     BOOST_TEST(( p_true && a ));
124 
125     std::string s( "abcd" );
126 
127     BOOST_TEST( p_str == s );
128     BOOST_TEST( s == p_str );
129     BOOST_TEST( p_str2 != p_str );
130 
131     BOOST_TEST( p_b->foo() == 1 );
132 
133     BOOST_TEST( (p_one ^ 3) == 2 ); // ^ has lower precedence than ==
134 #ifndef BOOST_TEST_MACRO_LIMITED_SUPPORT
135     // complex expressions (on the left) not understood by boost.test v3 in C++03 mode
136     BOOST_TEST( p_two / 2 == 1 ); // / has higher precedence than ==
137 #endif
138 
139     BOOST_TEST( !p_b_ptr );
140 
141     C::init();
142     BOOST_TEST( p_b_ptr );
143 
144     BOOST_TEST( !p_a_ptr );
145     D::init();
146     BOOST_TEST( p_a_ptr );
147     E::reset();
148     BOOST_TEST( p_a_ptr );
149 
150     if( p_a_ptr )
151         delete p_a_ptr.get();
152 
153     if( p_b_ptr )
154         delete p_b_ptr.get();
155 }
156 
157 //____________________________________________________________________________//
158 
BOOST_AUTO_TEST_CASE(test_readwrite_property)159 BOOST_AUTO_TEST_CASE( test_readwrite_property )
160 {
161     readwrite_property<int> p_int;
162 
163     BOOST_TEST( !p_int );
164     BOOST_TEST( p_int == 0 );
165     BOOST_TEST( p_int != 1 );
166 
167     BOOST_TEST( p_int < 5 );
168     BOOST_TEST( p_int >= -5 );
169 
170     p_int.value = 2;
171 
172     BOOST_TEST( p_int == 2 );
173     BOOST_TEST( p_int );
174 
175     p_int.set( 3 );
176 
177     BOOST_TEST( p_int == 3 );
178 
179     readwrite_property<B> p_bb1;
180 
181     BOOST_TEST( p_bb1->foo() == 2 );
182 
183     readwrite_property<B> const p_bb2;
184 
185     BOOST_TEST( p_bb2->foo() == 1 );
186 }
187 
188 //____________________________________________________________________________//
189 
190 
191 // EOF
192