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)64BOOST_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)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