1 1.1 jmmv // Copyright 2010 Google Inc. 2 1.1 jmmv // All rights reserved. 3 1.1 jmmv // 4 1.1 jmmv // Redistribution and use in source and binary forms, with or without 5 1.1 jmmv // modification, are permitted provided that the following conditions are 6 1.1 jmmv // met: 7 1.1 jmmv // 8 1.1 jmmv // * Redistributions of source code must retain the above copyright 9 1.1 jmmv // notice, this list of conditions and the following disclaimer. 10 1.1 jmmv // * Redistributions in binary form must reproduce the above copyright 11 1.1 jmmv // notice, this list of conditions and the following disclaimer in the 12 1.1 jmmv // documentation and/or other materials provided with the distribution. 13 1.1 jmmv // * Neither the name of Google Inc. nor the names of its contributors 14 1.1 jmmv // may be used to endorse or promote products derived from this software 15 1.1 jmmv // without specific prior written permission. 16 1.1 jmmv // 17 1.1 jmmv // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 1.1 jmmv // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 1.1 jmmv // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 1.1 jmmv // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 1.1 jmmv // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 1.1 jmmv // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 1.1 jmmv // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 1.1 jmmv // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 1.1 jmmv // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 1.1 jmmv // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 1.1 jmmv // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 1.1 jmmv 29 1.1 jmmv #include "utils/optional.ipp" 30 1.1 jmmv 31 1.1 jmmv #include <iostream> 32 1.1 jmmv #include <sstream> 33 1.1 jmmv 34 1.1 jmmv #include <atf-c++.hpp> 35 1.1 jmmv 36 1.1 jmmv using utils::none; 37 1.1 jmmv using utils::optional; 38 1.1 jmmv 39 1.1 jmmv 40 1.1 jmmv namespace { 41 1.1 jmmv 42 1.1 jmmv 43 1.1 jmmv /// Fake class to capture calls to the new and delete operators. 44 1.1 jmmv class test_alloc { 45 1.1 jmmv public: 46 1.1 jmmv /// Value to disambiguate objects after construction. 47 1.1 jmmv int value; 48 1.1 jmmv 49 1.1 jmmv /// Balance of alive instances of this class in dynamic memory. 50 1.1 jmmv static size_t instances; 51 1.1 jmmv 52 1.1 jmmv /// Constructs a new optional object. 53 1.1 jmmv /// 54 1.1 jmmv /// \param value_ The value to store in this object for disambiguation. 55 1.1 jmmv test_alloc(int value_) : value(value_) 56 1.1 jmmv { 57 1.1 jmmv } 58 1.1 jmmv 59 1.1 jmmv /// Allocates a new object and records its existence. 60 1.1 jmmv /// 61 1.1 jmmv /// \param size The amount of memory to allocate. 62 1.1 jmmv /// 63 1.1 jmmv /// \return A pointer to the allocated memory. 64 1.1 jmmv /// 65 1.1 jmmv /// \throw std::bad_alloc If the memory allocation fails. 66 1.1 jmmv void* 67 1.1 jmmv operator new(size_t size) 68 1.1 jmmv { 69 1.1 jmmv instances++; 70 1.1 jmmv std::cout << "test_alloc::operator new called\n"; 71 1.1 jmmv return ::operator new(size); 72 1.1 jmmv } 73 1.1 jmmv 74 1.1 jmmv /// Deallocates an existing object and unrecords its existence. 75 1.1 jmmv /// 76 1.1 jmmv /// \param mem The pointer to the memory to deallocate. 77 1.1 jmmv void 78 1.1 jmmv operator delete(void* mem) 79 1.1 jmmv { 80 1.1 jmmv instances--; 81 1.1 jmmv std::cout << "test_alloc::operator delete called\n"; 82 1.1 jmmv ::operator delete(mem); 83 1.1 jmmv } 84 1.1 jmmv }; 85 1.1 jmmv 86 1.1 jmmv 87 1.1 jmmv size_t test_alloc::instances = 0; 88 1.1 jmmv 89 1.1 jmmv 90 1.1 jmmv /// Constructs and returns an optional object. 91 1.1 jmmv /// 92 1.1 jmmv /// This is used by tests to validate that returning an object from within a 93 1.1 jmmv /// function works (i.e. the necessary constructors are available). 94 1.1 jmmv /// 95 1.1 jmmv /// \tparam Type The type of the object included in the optional wrapper. 96 1.1 jmmv /// \param value The value to put inside the optional wrapper. 97 1.1 jmmv /// 98 1.1 jmmv /// \return The constructed optional object. 99 1.1 jmmv template< typename Type > 100 1.1 jmmv optional< Type > 101 1.1 jmmv return_optional(const Type& value) 102 1.1 jmmv { 103 1.1 jmmv return optional< Type >(value); 104 1.1 jmmv } 105 1.1 jmmv 106 1.1 jmmv 107 1.1 jmmv } // anonymous namespace 108 1.1 jmmv 109 1.1 jmmv 110 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(ctors__native_type); 111 1.1 jmmv ATF_TEST_CASE_BODY(ctors__native_type) 112 1.1 jmmv { 113 1.1 jmmv const optional< int > no_args; 114 1.1 jmmv ATF_REQUIRE(!no_args); 115 1.1 jmmv 116 1.1 jmmv const optional< int > with_none(none); 117 1.1 jmmv ATF_REQUIRE(!with_none); 118 1.1 jmmv 119 1.1 jmmv const optional< int > with_arg(3); 120 1.1 jmmv ATF_REQUIRE(with_arg); 121 1.1 jmmv ATF_REQUIRE_EQ(3, with_arg.get()); 122 1.1 jmmv 123 1.1 jmmv const optional< int > copy_none(with_none); 124 1.1 jmmv ATF_REQUIRE(!copy_none); 125 1.1 jmmv 126 1.1 jmmv const optional< int > copy_arg(with_arg); 127 1.1 jmmv ATF_REQUIRE(copy_arg); 128 1.1 jmmv ATF_REQUIRE_EQ(3, copy_arg.get()); 129 1.1 jmmv } 130 1.1 jmmv 131 1.1 jmmv 132 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(ctors__complex_type); 133 1.1 jmmv ATF_TEST_CASE_BODY(ctors__complex_type) 134 1.1 jmmv { 135 1.1 jmmv const optional< std::string > no_args; 136 1.1 jmmv ATF_REQUIRE(!no_args); 137 1.1 jmmv 138 1.1 jmmv const optional< std::string > with_none(none); 139 1.1 jmmv ATF_REQUIRE(!with_none); 140 1.1 jmmv 141 1.1 jmmv const optional< std::string > with_arg("foo"); 142 1.1 jmmv ATF_REQUIRE(with_arg); 143 1.1 jmmv ATF_REQUIRE_EQ("foo", with_arg.get()); 144 1.1 jmmv 145 1.1 jmmv const optional< std::string > copy_none(with_none); 146 1.1 jmmv ATF_REQUIRE(!copy_none); 147 1.1 jmmv 148 1.1 jmmv const optional< std::string > copy_arg(with_arg); 149 1.1 jmmv ATF_REQUIRE(copy_arg); 150 1.1 jmmv ATF_REQUIRE_EQ("foo", copy_arg.get()); 151 1.1 jmmv } 152 1.1 jmmv 153 1.1 jmmv 154 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(assign); 155 1.1 jmmv ATF_TEST_CASE_BODY(assign) 156 1.1 jmmv { 157 1.1 jmmv optional< int > from_default; 158 1.1 jmmv from_default = optional< int >(); 159 1.1 jmmv ATF_REQUIRE(!from_default); 160 1.1 jmmv 161 1.1 jmmv optional< int > from_none(3); 162 1.1 jmmv from_none = none; 163 1.1 jmmv ATF_REQUIRE(!from_none); 164 1.1 jmmv 165 1.1 jmmv optional< int > from_int; 166 1.1 jmmv from_int = 6; 167 1.1 jmmv ATF_REQUIRE_EQ(6, from_int.get()); 168 1.1 jmmv } 169 1.1 jmmv 170 1.1 jmmv 171 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(return); 172 1.1 jmmv ATF_TEST_CASE_BODY(return) 173 1.1 jmmv { 174 1.1 jmmv optional< long > from_return(return_optional< long >(123)); 175 1.1 jmmv ATF_REQUIRE(from_return); 176 1.1 jmmv ATF_REQUIRE_EQ(123, from_return.get()); 177 1.1 jmmv } 178 1.1 jmmv 179 1.1 jmmv 180 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(memory); 181 1.1 jmmv ATF_TEST_CASE_BODY(memory) 182 1.1 jmmv { 183 1.1 jmmv ATF_REQUIRE_EQ(0, test_alloc::instances); 184 1.1 jmmv { 185 1.1 jmmv optional< test_alloc > optional1(test_alloc(3)); 186 1.1 jmmv ATF_REQUIRE_EQ(1, test_alloc::instances); 187 1.1 jmmv ATF_REQUIRE_EQ(3, optional1.get().value); 188 1.1 jmmv 189 1.1 jmmv { 190 1.1 jmmv optional< test_alloc > optional2(optional1); 191 1.1 jmmv ATF_REQUIRE_EQ(2, test_alloc::instances); 192 1.1 jmmv ATF_REQUIRE_EQ(3, optional2.get().value); 193 1.1 jmmv 194 1.1 jmmv optional2 = 5; 195 1.1 jmmv ATF_REQUIRE_EQ(2, test_alloc::instances); 196 1.1 jmmv ATF_REQUIRE_EQ(5, optional2.get().value); 197 1.1 jmmv ATF_REQUIRE_EQ(3, optional1.get().value); 198 1.1 jmmv } 199 1.1 jmmv ATF_REQUIRE_EQ(1, test_alloc::instances); 200 1.1 jmmv ATF_REQUIRE_EQ(3, optional1.get().value); 201 1.1 jmmv } 202 1.1 jmmv ATF_REQUIRE_EQ(0, test_alloc::instances); 203 1.1 jmmv } 204 1.1 jmmv 205 1.1 jmmv 206 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(get_default); 207 1.1 jmmv ATF_TEST_CASE_BODY(get_default) 208 1.1 jmmv { 209 1.1 jmmv const std::string def_value = "hello"; 210 1.1 jmmv optional< std::string > optional; 211 1.1 jmmv ATF_REQUIRE(&def_value == &optional.get_default(def_value)); 212 1.1 jmmv optional = "bye"; 213 1.1 jmmv ATF_REQUIRE_EQ("bye", optional.get_default(def_value)); 214 1.1 jmmv } 215 1.1 jmmv 216 1.1 jmmv 217 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(make_optional); 218 1.1 jmmv ATF_TEST_CASE_BODY(make_optional) 219 1.1 jmmv { 220 1.1 jmmv optional< int > opt = utils::make_optional(576); 221 1.1 jmmv ATF_REQUIRE(opt); 222 1.1 jmmv ATF_REQUIRE_EQ(576, opt.get()); 223 1.1 jmmv } 224 1.1 jmmv 225 1.1 jmmv 226 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne); 227 1.1 jmmv ATF_TEST_CASE_BODY(operators_eq_and_ne) 228 1.1 jmmv { 229 1.1 jmmv optional< int > opt1, opt2; 230 1.1 jmmv 231 1.1 jmmv opt1 = none; opt2 = none; 232 1.1 jmmv ATF_REQUIRE( opt1 == opt2); 233 1.1 jmmv ATF_REQUIRE(!(opt1 != opt2)); 234 1.1 jmmv 235 1.1 jmmv opt1 = utils::make_optional(5); opt2 = none; 236 1.1 jmmv ATF_REQUIRE(!(opt1 == opt2)); 237 1.1 jmmv ATF_REQUIRE( opt1 != opt2); 238 1.1 jmmv 239 1.1 jmmv opt1 = none; opt2 = utils::make_optional(5); 240 1.1 jmmv ATF_REQUIRE(!(opt1 == opt2)); 241 1.1 jmmv ATF_REQUIRE( opt1 != opt2); 242 1.1 jmmv 243 1.1 jmmv opt1 = utils::make_optional(5); opt2 = utils::make_optional(5); 244 1.1 jmmv ATF_REQUIRE( opt1 == opt2); 245 1.1 jmmv ATF_REQUIRE(!(opt1 != opt2)); 246 1.1 jmmv 247 1.1 jmmv opt1 = utils::make_optional(6); opt2 = utils::make_optional(5); 248 1.1 jmmv ATF_REQUIRE(!(opt1 == opt2)); 249 1.1 jmmv ATF_REQUIRE( opt1 != opt2); 250 1.1 jmmv } 251 1.1 jmmv 252 1.1 jmmv 253 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(output); 254 1.1 jmmv ATF_TEST_CASE_BODY(output) 255 1.1 jmmv { 256 1.1 jmmv { 257 1.1 jmmv std::ostringstream str; 258 1.1 jmmv str << optional< int >(none); 259 1.1 jmmv ATF_REQUIRE_EQ("none", str.str()); 260 1.1 jmmv } 261 1.1 jmmv { 262 1.1 jmmv std::ostringstream str; 263 1.1 jmmv str << optional< int >(5); 264 1.1 jmmv ATF_REQUIRE_EQ("5", str.str()); 265 1.1 jmmv } 266 1.1 jmmv { 267 1.1 jmmv std::ostringstream str; 268 1.1 jmmv str << optional< std::string >("this is a text"); 269 1.1 jmmv ATF_REQUIRE_EQ("this is a text", str.str()); 270 1.1 jmmv } 271 1.1 jmmv } 272 1.1 jmmv 273 1.1 jmmv 274 1.1 jmmv ATF_INIT_TEST_CASES(tcs) 275 1.1 jmmv { 276 1.1 jmmv ATF_ADD_TEST_CASE(tcs, ctors__native_type); 277 1.1 jmmv ATF_ADD_TEST_CASE(tcs, ctors__complex_type); 278 1.1 jmmv ATF_ADD_TEST_CASE(tcs, assign); 279 1.1 jmmv ATF_ADD_TEST_CASE(tcs, return); 280 1.1 jmmv ATF_ADD_TEST_CASE(tcs, memory); 281 1.1 jmmv ATF_ADD_TEST_CASE(tcs, get_default); 282 1.1 jmmv ATF_ADD_TEST_CASE(tcs, make_optional); 283 1.1 jmmv ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne); 284 1.1 jmmv ATF_ADD_TEST_CASE(tcs, output); 285 1.1 jmmv } 286