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)67BOOST_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)159BOOST_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