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 //  File        : $RCSfile$
9 //
10 //  Version     : $Revision$
11 //
12 //  Description : unit test for class properties facility
13 // ***************************************************************************
14 
15 // Boost.Test
16 #define BOOST_TEST_MODULE Class Properties test
17 #include <boost/test/unit_test.hpp>
18 #include <boost/test/utils/class_properties.hpp>
19 
20 // STL
21 #include <vector>
22 
23 using namespace boost::unit_test;
24 
25 //____________________________________________________________________________//
26 
27 struct A {
operator boolA28     operator bool() const { return true; }
29 } a;
30 
31 struct B {
fooB32     int foo() const { return 1; }
fooB33     int foo()       { return 2; }
34 
operator intB35     operator int() const { return 1; }
36 };
37 
38 BOOST_READONLY_PROPERTY( B*, (C) ) p_b_ptr;
39 
40 class C {
41 public:
init()42     static void init()
43     {
44         p_b_ptr.value = new B;
45     }
46 };
47 
48 BOOST_READONLY_PROPERTY( A*, (D)(E) ) p_a_ptr;
49 
50 class D {
51 public:
init()52     static void init()
53     {
54         p_a_ptr.value = new A;
55     }
56 };
57 
58 class E {
59 public:
reset()60     static void reset()
61     {
62         delete p_a_ptr;
63         p_a_ptr.value = new A;
64     }
65 };
66 
BOOST_AUTO_TEST_CASE(test_readonly_property)67 BOOST_AUTO_TEST_CASE( test_readonly_property )
68 {
69     readonly_property<int> p_zero;
70     readonly_property<int> p_one( 1 );
71     readonly_property<int> p_two( 2 );
72 
73     readonly_property<bool> p_true( true );
74     readonly_property<bool> p_false( false );
75     readonly_property<std::string> p_str( "abcd" );
76     readonly_property<std::string> p_str2( "abc" );
77 
78     readonly_property<B> p_b;
79     readonly_property<A> p_a;
80 
81     BOOST_TEST( p_one );
82     BOOST_TEST( !!p_one );
83 
84     int i = p_one;
85 
86     BOOST_TEST( p_one == i );
87 
88     double d = p_one;
89 
90     BOOST_TEST( p_one == d );
91 
92     BOOST_TEST( p_one != 0 );
93     BOOST_TEST( 0 != p_one );
94     BOOST_TEST( !(p_one == 0) );
95     BOOST_TEST( !(0 == p_one) );
96 
97     float fzero = 0;
98 
99     BOOST_TEST( p_one != fzero );
100     BOOST_TEST( fzero != p_one );
101 
102     BOOST_TEST( p_one >= 1 );
103     BOOST_TEST( 2 > p_one  );
104 
105     BOOST_TEST( !(p_one == p_two) );
106     BOOST_TEST( p_one != p_two );
107     BOOST_TEST( p_one < p_two );
108 
109     BOOST_TEST( p_zero == 0 );
110 
111     BOOST_TEST( (p_one - 1) == 0 );
112     BOOST_TEST( (-p_one + 1) == 0 );
113 
114     BOOST_TEST( p_true );
115     BOOST_TEST( !p_false );
116 
117     BOOST_TEST(( (i > 0) && p_true ));
118     BOOST_TEST(( p_true && (i > 0) ));
119     BOOST_TEST(( (i > 0) || p_false ));
120     BOOST_TEST(( p_false || (i > 0) ));
121 
122     BOOST_TEST(( a && p_true ));
123     BOOST_TEST(( a || p_true ));
124 
125     BOOST_TEST(( p_true && a ));
126     BOOST_TEST(( p_true && a ));
127 
128     std::string s( "abcd" );
129 
130     BOOST_TEST( p_str == s );
131     BOOST_TEST( s == p_str );
132     BOOST_TEST( p_str2 != p_str );
133 
134     BOOST_TEST( p_b->foo() == 1 );
135 
136     BOOST_TEST( (p_one ^ 3) == 2 ); // ^ has lower precedence than ==
137     BOOST_TEST( p_two / 2 == 1 ); // / has higher precedence than ==
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