1 /* 2 __ _____ _____ _____ 3 __| | __| | | | JSON for Modern C++ (test suite) 4 | | |__ | | | | | | version 3.10.0 5 |_____|_____|_____|_|___| https://github.com/nlohmann/json 6 7 Licensed under the MIT License <http://opensource.org/licenses/MIT>. 8 SPDX-License-Identifier: MIT 9 Copyright (c) 2013-2019 Niels Lohmann <http://nlohmann.me>. 10 11 Permission is hereby granted, free of charge, to any person obtaining a copy 12 of this software and associated documentation files (the "Software"), to deal 13 in the Software without restriction, including without limitation the rights 14 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 copies of the Software, and to permit persons to whom the Software is 16 furnished to do so, subject to the following conditions: 17 18 The above copyright notice and this permission notice shall be included in all 19 copies or substantial portions of the Software. 20 21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 27 SOFTWARE. 28 */ 29 30 #include "doctest_compatibility.h" 31 32 #define JSON_TESTS_PRIVATE 33 #include <nlohmann/json.hpp> 34 using nlohmann::json; 35 36 TEST_CASE("iterator class") 37 { 38 SECTION("construction") 39 { 40 SECTION("constructor") 41 { 42 SECTION("null") 43 { 44 json j(json::value_t::null); 45 json::iterator it(&j); 46 } 47 48 SECTION("object") 49 { 50 json j(json::value_t::object); 51 json::iterator it(&j); 52 } 53 54 SECTION("array") 55 { 56 json j(json::value_t::array); 57 json::iterator it(&j); 58 } 59 } 60 61 SECTION("copy assignment") 62 { 63 json j(json::value_t::null); 64 json::iterator it(&j); 65 json::iterator it2(&j); 66 it2 = it; 67 } 68 } 69 70 SECTION("initialization") 71 { 72 SECTION("set_begin") 73 { 74 SECTION("null") 75 { 76 json j(json::value_t::null); 77 json::iterator it(&j); 78 it.set_begin(); 79 CHECK((it == j.begin())); 80 } 81 82 SECTION("object") 83 { 84 json j(json::value_t::object); 85 json::iterator it(&j); 86 it.set_begin(); 87 CHECK((it == j.begin())); 88 } 89 90 SECTION("array") 91 { 92 json j(json::value_t::array); 93 json::iterator it(&j); 94 it.set_begin(); 95 CHECK((it == j.begin())); 96 } 97 } 98 99 SECTION("set_end") 100 { 101 SECTION("null") 102 { 103 json j(json::value_t::null); 104 json::iterator it(&j); 105 it.set_end(); 106 CHECK((it == j.end())); 107 } 108 109 SECTION("object") 110 { 111 json j(json::value_t::object); 112 json::iterator it(&j); 113 it.set_end(); 114 CHECK((it == j.end())); 115 } 116 117 SECTION("array") 118 { 119 json j(json::value_t::array); 120 json::iterator it(&j); 121 it.set_end(); 122 CHECK((it == j.end())); 123 } 124 } 125 } 126 127 SECTION("element access") 128 { 129 SECTION("operator*") 130 { 131 SECTION("null") 132 { 133 json j(json::value_t::null); 134 json::iterator it = j.begin(); 135 CHECK_THROWS_AS(*it, json::invalid_iterator&); 136 CHECK_THROWS_WITH(*it, "[json.exception.invalid_iterator.214] cannot get value"); 137 } 138 139 SECTION("number") 140 { 141 json j(17); 142 json::iterator it = j.begin(); 143 CHECK(*it == json(17)); 144 it = j.end(); 145 CHECK_THROWS_AS(*it, json::invalid_iterator&); 146 CHECK_THROWS_WITH(*it, "[json.exception.invalid_iterator.214] cannot get value"); 147 } 148 149 SECTION("object") 150 { 151 json j({{"foo", "bar"}}); 152 json::iterator it = j.begin(); 153 CHECK(*it == json("bar")); 154 } 155 156 SECTION("array") 157 { 158 json j({1, 2, 3, 4}); 159 json::iterator it = j.begin(); 160 CHECK(*it == json(1)); 161 } 162 } 163 164 SECTION("operator->") 165 { 166 SECTION("null") 167 { 168 json j(json::value_t::null); 169 json::iterator it = j.begin(); 170 CHECK_THROWS_AS(std::string(it->type_name()), json::invalid_iterator&); 171 CHECK_THROWS_WITH(std::string(it->type_name()), "[json.exception.invalid_iterator.214] cannot get value"); 172 } 173 174 SECTION("number") 175 { 176 json j(17); 177 json::iterator it = j.begin(); 178 CHECK(std::string(it->type_name()) == "number"); 179 it = j.end(); 180 CHECK_THROWS_AS(std::string(it->type_name()), json::invalid_iterator&); 181 CHECK_THROWS_WITH(std::string(it->type_name()), "[json.exception.invalid_iterator.214] cannot get value"); 182 } 183 184 SECTION("object") 185 { 186 json j({{"foo", "bar"}}); 187 json::iterator it = j.begin(); 188 CHECK(std::string(it->type_name()) == "string"); 189 } 190 191 SECTION("array") 192 { 193 json j({1, 2, 3, 4}); 194 json::iterator it = j.begin(); 195 CHECK(std::string(it->type_name()) == "number"); 196 } 197 } 198 } 199 200 SECTION("increment/decrement") 201 { 202 SECTION("post-increment") 203 { 204 SECTION("null") 205 { 206 json j(json::value_t::null); 207 json::iterator it = j.begin(); 208 CHECK((it.m_it.primitive_iterator.m_it == 1)); 209 it++; 210 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1)); 211 } 212 213 SECTION("number") 214 { 215 json j(17); 216 json::iterator it = j.begin(); 217 CHECK((it.m_it.primitive_iterator.m_it == 0)); 218 it++; 219 CHECK((it.m_it.primitive_iterator.m_it == 1)); 220 it++; 221 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1)); 222 } 223 224 SECTION("object") 225 { 226 json j({{"foo", "bar"}}); 227 json::iterator it = j.begin(); 228 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin())); 229 it++; 230 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end())); 231 } 232 233 SECTION("array") 234 { 235 json j({1, 2, 3, 4}); 236 json::iterator it = j.begin(); 237 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin())); 238 it++; 239 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin())); 240 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end())); 241 it++; 242 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin())); 243 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end())); 244 it++; 245 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin())); 246 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end())); 247 it++; 248 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin())); 249 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end())); 250 } 251 } 252 253 SECTION("pre-increment") 254 { 255 SECTION("null") 256 { 257 json j(json::value_t::null); 258 json::iterator it = j.begin(); 259 CHECK((it.m_it.primitive_iterator.m_it == 1)); 260 ++it; 261 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1)); 262 } 263 264 SECTION("number") 265 { 266 json j(17); 267 json::iterator it = j.begin(); 268 CHECK((it.m_it.primitive_iterator.m_it == 0)); 269 ++it; 270 CHECK((it.m_it.primitive_iterator.m_it == 1)); 271 ++it; 272 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1)); 273 } 274 275 SECTION("object") 276 { 277 json j({{"foo", "bar"}}); 278 json::iterator it = j.begin(); 279 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin())); 280 ++it; 281 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end())); 282 } 283 284 SECTION("array") 285 { 286 json j({1, 2, 3, 4}); 287 json::iterator it = j.begin(); 288 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin())); 289 ++it; 290 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin())); 291 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end())); 292 ++it; 293 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin())); 294 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end())); 295 ++it; 296 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin())); 297 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end())); 298 ++it; 299 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin())); 300 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end())); 301 } 302 } 303 304 SECTION("post-decrement") 305 { 306 SECTION("null") 307 { 308 json j(json::value_t::null); 309 json::iterator it = j.end(); 310 CHECK((it.m_it.primitive_iterator.m_it == 1)); 311 } 312 313 SECTION("number") 314 { 315 json j(17); 316 json::iterator it = j.end(); 317 CHECK((it.m_it.primitive_iterator.m_it == 1)); 318 it--; 319 CHECK((it.m_it.primitive_iterator.m_it == 0)); 320 it--; 321 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1)); 322 } 323 324 SECTION("object") 325 { 326 json j({{"foo", "bar"}}); 327 json::iterator it = j.end(); 328 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end())); 329 it--; 330 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin())); 331 } 332 333 SECTION("array") 334 { 335 json j({1, 2, 3, 4}); 336 json::iterator it = j.end(); 337 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end())); 338 it--; 339 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin())); 340 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end())); 341 it--; 342 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin())); 343 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end())); 344 it--; 345 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin())); 346 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end())); 347 it--; 348 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin())); 349 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end())); 350 } 351 } 352 353 SECTION("pre-decrement") 354 { 355 SECTION("null") 356 { 357 json j(json::value_t::null); 358 json::iterator it = j.end(); 359 CHECK((it.m_it.primitive_iterator.m_it == 1)); 360 } 361 362 SECTION("number") 363 { 364 json j(17); 365 json::iterator it = j.end(); 366 CHECK((it.m_it.primitive_iterator.m_it == 1)); 367 --it; 368 CHECK((it.m_it.primitive_iterator.m_it == 0)); 369 --it; 370 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1)); 371 } 372 373 SECTION("object") 374 { 375 json j({{"foo", "bar"}}); 376 json::iterator it = j.end(); 377 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end())); 378 --it; 379 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin())); 380 } 381 382 SECTION("array") 383 { 384 json j({1, 2, 3, 4}); 385 json::iterator it = j.end(); 386 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end())); 387 --it; 388 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin())); 389 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end())); 390 --it; 391 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin())); 392 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end())); 393 --it; 394 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin())); 395 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end())); 396 --it; 397 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin())); 398 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end())); 399 } 400 } 401 } 402 } 403