// __ _____ _____ _____// __| | __| | | | JSON for Modern C++ (supporting code)// | | |__ | | | | | | version 3.12.0// |_____|_____|_____|_|___| https://github.com/nlohmann/json//// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>// SPDX-License-Identifier: MIT#include "doctest_compatibility.h"#define JSON_TESTS_PRIVATE#include <nlohmann/json.hpp>using nlohmann::json;TEST_CASE("iterators 1"){SECTION("basic behavior"){SECTION("uninitialized"){json::iterator it; // NOLINT(misc-const-correctness)CHECK(it.m_object == nullptr);json::const_iterator cit; // NOLINT(misc-const-correctness)CHECK(cit.m_object == nullptr);}SECTION("boolean"){json j = true;json j_const(j);SECTION("json + begin/end"){json::iterator it = j.begin();CHECK(it != j.end());CHECK(*it == j);it++;CHECK(it != j.begin());CHECK(it == j.end());it--;CHECK(it == j.begin());CHECK(it != j.end());CHECK(*it == j);++it;CHECK(it != j.begin());CHECK(it == j.end());--it;CHECK(it == j.begin());CHECK(it != j.end());CHECK(*it == j);}SECTION("const json + begin/end"){json::const_iterator it = j_const.begin();CHECK(it != j_const.end());CHECK(*it == j_const);it++;CHECK(it != j_const.begin());CHECK(it == j_const.end());it--;CHECK(it == j_const.begin());CHECK(it != j_const.end());CHECK(*it == j_const);++it;CHECK(it != j_const.begin());CHECK(it == j_const.end());--it;CHECK(it == j_const.begin());CHECK(it != j_const.end());CHECK(*it == j_const);}SECTION("json + cbegin/cend"){json::const_iterator it = j.cbegin();CHECK(it != j.cend());CHECK(*it == j);it++;CHECK(it != j.cbegin());CHECK(it == j.cend());it--;CHECK(it == j.cbegin());CHECK(it != j.cend());CHECK(*it == j);++it;CHECK(it != j.cbegin());CHECK(it == j.cend());--it;CHECK(it == j.cbegin());CHECK(it != j.cend());CHECK(*it == j);}SECTION("const json + cbegin/cend"){json::const_iterator it = j_const.cbegin();CHECK(it != j_const.cend());CHECK(*it == j_const);it++;CHECK(it != j_const.cbegin());CHECK(it == j_const.cend());it--;CHECK(it == j_const.cbegin());CHECK(it != j_const.cend());CHECK(*it == j_const);++it;CHECK(it != j_const.cbegin());CHECK(it == j_const.cend());--it;CHECK(it == j_const.cbegin());CHECK(it != j_const.cend());CHECK(*it == j_const);}SECTION("json + rbegin/rend"){json::reverse_iterator it = j.rbegin();CHECK(it != j.rend());CHECK(*it == j);it++;CHECK(it != j.rbegin());CHECK(it == j.rend());it--;CHECK(it == j.rbegin());CHECK(it != j.rend());CHECK(*it == j);++it;CHECK(it != j.rbegin());CHECK(it == j.rend());--it;CHECK(it == j.rbegin());CHECK(it != j.rend());CHECK(*it == j);}SECTION("json + crbegin/crend"){json::const_reverse_iterator it = j.crbegin();CHECK(it != j.crend());CHECK(*it == j);it++;CHECK(it != j.crbegin());CHECK(it == j.crend());it--;CHECK(it == j.crbegin());CHECK(it != j.crend());CHECK(*it == j);++it;CHECK(it != j.crbegin());CHECK(it == j.crend());--it;CHECK(it == j.crbegin());CHECK(it != j.crend());CHECK(*it == j);}SECTION("const json + crbegin/crend"){json::const_reverse_iterator it = j_const.crbegin();CHECK(it != j_const.crend());CHECK(*it == j_const);it++;CHECK(it != j_const.crbegin());CHECK(it == j_const.crend());it--;CHECK(it == j_const.crbegin());CHECK(it != j_const.crend());CHECK(*it == j_const);++it;CHECK(it != j_const.crbegin());CHECK(it == j_const.crend());--it;CHECK(it == j_const.crbegin());CHECK(it != j_const.crend());CHECK(*it == j_const);}SECTION("additional tests"){SECTION("!(begin != begin)"){CHECK(!(j.begin() != j.begin()));}SECTION("!(end != end)"){CHECK(!(j.end() != j.end()));}SECTION("begin < end"){CHECK(j.begin() < j.end());}SECTION("begin <= end"){CHECK(j.begin() <= j.end());}SECTION("end > begin"){CHECK(j.end() > j.begin());}SECTION("end >= begin"){CHECK(j.end() >= j.begin());}SECTION("end == end"){CHECK(j.end() == j.end());}SECTION("end <= end"){CHECK(j.end() <= j.end());}SECTION("begin == begin"){CHECK(j.begin() == j.begin());}SECTION("begin <= begin"){CHECK(j.begin() <= j.begin());}SECTION("begin >= begin"){CHECK(j.begin() >= j.begin());}SECTION("!(begin == end)"){CHECK(!(j.begin() == j.end()));}SECTION("begin != end"){CHECK(j.begin() != j.end());}SECTION("begin+1 == end"){CHECK(j.begin() + 1 == j.end());}SECTION("begin == end-1"){CHECK(j.begin() == j.end() - 1);}SECTION("begin != end+1"){CHECK(j.begin() != j.end() + 1);}SECTION("end != end+1"){CHECK(j.end() != j.end() + 1);}SECTION("begin+1 != begin+2"){CHECK(j.begin() + 1 != j.begin() + 2);}SECTION("begin+1 < begin+2"){CHECK(j.begin() + 1 < j.begin() + 2);}SECTION("begin+1 <= begin+2"){CHECK(j.begin() + 1 <= j.begin() + 2);}SECTION("end+1 != end+2"){CHECK(j.end() + 1 != j.end() + 2);}}SECTION("key/value"){auto it = j.begin();auto cit = j_const.cbegin();CHECK_THROWS_WITH_AS(it.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK(it.value() == json(true));CHECK_THROWS_WITH_AS(cit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK(cit.value() == json(true));auto rit = j.rend();auto crit = j.crend();CHECK_THROWS_WITH_AS(rit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK_THROWS_WITH_AS(rit.value(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);CHECK_THROWS_WITH_AS(crit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK_THROWS_WITH_AS(crit.value(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);}}SECTION("string"){json j = "hello world";json j_const(j);SECTION("json + begin/end"){json::iterator it = j.begin();CHECK(it != j.end());CHECK(*it == j);it++;CHECK(it != j.begin());CHECK(it == j.end());it--;CHECK(it == j.begin());CHECK(it != j.end());CHECK(*it == j);++it;CHECK(it != j.begin());CHECK(it == j.end());--it;CHECK(it == j.begin());CHECK(it != j.end());CHECK(*it == j);}SECTION("const json + begin/end"){json::const_iterator it = j_const.begin();CHECK(it != j_const.end());CHECK(*it == j_const);it++;CHECK(it != j_const.begin());CHECK(it == j_const.end());it--;CHECK(it == j_const.begin());CHECK(it != j_const.end());CHECK(*it == j_const);++it;CHECK(it != j_const.begin());CHECK(it == j_const.end());--it;CHECK(it == j_const.begin());CHECK(it != j_const.end());CHECK(*it == j_const);}SECTION("json + cbegin/cend"){json::const_iterator it = j.cbegin();CHECK(it != j.cend());CHECK(*it == j);it++;CHECK(it != j.cbegin());CHECK(it == j.cend());it--;CHECK(it == j.cbegin());CHECK(it != j.cend());CHECK(*it == j);++it;CHECK(it != j.cbegin());CHECK(it == j.cend());--it;CHECK(it == j.cbegin());CHECK(it != j.cend());CHECK(*it == j);}SECTION("const json + cbegin/cend"){json::const_iterator it = j_const.cbegin();CHECK(it != j_const.cend());CHECK(*it == j_const);it++;CHECK(it != j_const.cbegin());CHECK(it == j_const.cend());it--;CHECK(it == j_const.cbegin());CHECK(it != j_const.cend());CHECK(*it == j_const);++it;CHECK(it != j_const.cbegin());CHECK(it == j_const.cend());--it;CHECK(it == j_const.cbegin());CHECK(it != j_const.cend());CHECK(*it == j_const);}SECTION("json + rbegin/rend"){json::reverse_iterator it = j.rbegin();CHECK(it != j.rend());CHECK(*it == j);it++;CHECK(it != j.rbegin());CHECK(it == j.rend());it--;CHECK(it == j.rbegin());CHECK(it != j.rend());CHECK(*it == j);++it;CHECK(it != j.rbegin());CHECK(it == j.rend());--it;CHECK(it == j.rbegin());CHECK(it != j.rend());CHECK(*it == j);}SECTION("json + crbegin/crend"){json::const_reverse_iterator it = j.crbegin();CHECK(it != j.crend());CHECK(*it == j);it++;CHECK(it != j.crbegin());CHECK(it == j.crend());it--;CHECK(it == j.crbegin());CHECK(it != j.crend());CHECK(*it == j);++it;CHECK(it != j.crbegin());CHECK(it == j.crend());--it;CHECK(it == j.crbegin());CHECK(it != j.crend());CHECK(*it == j);}SECTION("const json + crbegin/crend"){json::const_reverse_iterator it = j_const.crbegin();CHECK(it != j_const.crend());CHECK(*it == j_const);it++;CHECK(it != j_const.crbegin());CHECK(it == j_const.crend());it--;CHECK(it == j_const.crbegin());CHECK(it != j_const.crend());CHECK(*it == j_const);++it;CHECK(it != j_const.crbegin());CHECK(it == j_const.crend());--it;CHECK(it == j_const.crbegin());CHECK(it != j_const.crend());CHECK(*it == j_const);}SECTION("key/value"){auto it = j.begin();auto cit = j_const.cbegin();CHECK_THROWS_WITH_AS(it.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK(it.value() == json("hello world"));CHECK_THROWS_WITH_AS(cit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK(cit.value() == json("hello world"));auto rit = j.rend();auto crit = j.crend();CHECK_THROWS_WITH_AS(rit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK_THROWS_WITH_AS(rit.value(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);CHECK_THROWS_WITH_AS(crit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK_THROWS_WITH_AS(crit.value(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);}}SECTION("array"){json j = {1, 2, 3};json j_const(j);SECTION("json + begin/end"){json::iterator it_begin = j.begin();json::iterator it_end = j.end();auto it = it_begin;CHECK(it != it_end);CHECK(*it == j[0]);it++;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j[1]);++it;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j[2]);++it;CHECK(it != it_begin);CHECK(it == it_end);}SECTION("const json + begin/end"){json::const_iterator it_begin = j_const.begin();json::const_iterator it_end = j_const.end();auto it = it_begin;CHECK(it != it_end);CHECK(*it == j_const[0]);it++;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j_const[1]);++it;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j_const[2]);++it;CHECK(it != it_begin);CHECK(it == it_end);}SECTION("json + cbegin/cend"){json::const_iterator it_begin = j.cbegin();json::const_iterator it_end = j.cend();auto it = it_begin;CHECK(it != it_end);CHECK(*it == j[0]);it++;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j[1]);++it;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j[2]);++it;CHECK(it != it_begin);CHECK(it == it_end);}SECTION("const json + cbegin/cend"){json::const_iterator it_begin = j_const.cbegin();json::const_iterator it_end = j_const.cend();auto it = it_begin;CHECK(it != it_end);CHECK(*it == j[0]);it++;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j[1]);++it;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j[2]);++it;CHECK(it != it_begin);CHECK(it == it_end);}SECTION("json + rbegin/rend"){json::reverse_iterator it_begin = j.rbegin();json::reverse_iterator it_end = j.rend();auto it = it_begin;CHECK(it != it_end);CHECK(*it == j[2]);it++;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j[1]);++it;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j[0]);++it;CHECK(it != it_begin);CHECK(it == it_end);}SECTION("json + crbegin/crend"){json::const_reverse_iterator it_begin = j.crbegin();json::const_reverse_iterator it_end = j.crend();auto it = it_begin;CHECK(it != it_end);CHECK(*it == j[2]);it++;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j[1]);++it;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j[0]);++it;CHECK(it != it_begin);CHECK(it == it_end);}SECTION("const json + crbegin/crend"){json::const_reverse_iterator it_begin = j_const.crbegin();json::const_reverse_iterator it_end = j_const.crend();auto it = it_begin;CHECK(it != it_end);CHECK(*it == j[2]);it++;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j[1]);++it;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j[0]);++it;CHECK(it != it_begin);CHECK(it == it_end);}SECTION("key/value"){auto it = j.begin();auto cit = j_const.cbegin();CHECK_THROWS_WITH_AS(it.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK(it.value() == json(1));CHECK_THROWS_WITH_AS(cit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK(cit.value() == json(1));}}SECTION("object"){json j = {{"A", 1}, {"B", 2}, {"C", 3}};json j_const(j);SECTION("json + begin/end"){json::iterator it_begin = j.begin();json::iterator it_end = j.end();auto it = it_begin;CHECK(it != it_end);CHECK(*it == j["A"]);it++;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j["B"]);++it;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j["C"]);++it;CHECK(it != it_begin);CHECK(it == it_end);}SECTION("const json + begin/end"){json::const_iterator it_begin = j_const.begin();json::const_iterator it_end = j_const.end();auto it = it_begin;CHECK(it != it_end);CHECK(*it == j_const["A"]);it++;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j_const["B"]);++it;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j_const["C"]);++it;CHECK(it != it_begin);CHECK(it == it_end);}SECTION("json + cbegin/cend"){json::const_iterator it_begin = j.cbegin();json::const_iterator it_end = j.cend();auto it = it_begin;CHECK(it != it_end);CHECK(*it == j["A"]);it++;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j["B"]);++it;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j["C"]);++it;CHECK(it != it_begin);CHECK(it == it_end);}SECTION("const json + cbegin/cend"){json::const_iterator it_begin = j_const.cbegin();json::const_iterator it_end = j_const.cend();auto it = it_begin;CHECK(it != it_end);CHECK(*it == j_const["A"]);it++;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j_const["B"]);++it;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j_const["C"]);++it;CHECK(it != it_begin);CHECK(it == it_end);}SECTION("json + rbegin/rend"){json::reverse_iterator it_begin = j.rbegin();json::reverse_iterator it_end = j.rend();auto it = it_begin;CHECK(it != it_end);CHECK(*it == j["C"]);it++;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j["B"]);++it;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j["A"]);++it;CHECK(it != it_begin);CHECK(it == it_end);}SECTION("json + crbegin/crend"){json::const_reverse_iterator it_begin = j.crbegin();json::const_reverse_iterator it_end = j.crend();auto it = it_begin;CHECK(it != it_end);CHECK(*it == j["C"]);it++;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j["B"]);++it;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j["A"]);++it;CHECK(it != it_begin);CHECK(it == it_end);}SECTION("const json + crbegin/crend"){json::const_reverse_iterator it_begin = j_const.crbegin();json::const_reverse_iterator it_end = j_const.crend();auto it = it_begin;CHECK(it != it_end);CHECK(*it == j["C"]);it++;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j["B"]);++it;CHECK(it != it_begin);CHECK(it != it_end);CHECK(*it == j["A"]);++it;CHECK(it != it_begin);CHECK(it == it_end);}SECTION("key/value"){auto it = j.begin();auto cit = j_const.cbegin();CHECK(it.key() == "A");CHECK(it.value() == json(1));CHECK(cit.key() == "A");CHECK(cit.value() == json(1));}}SECTION("number (integer)"){json j = 23;json j_const(j);SECTION("json + begin/end"){json::iterator it = j.begin();CHECK(it != j.end());CHECK(*it == j);it++;CHECK(it != j.begin());CHECK(it == j.end());it--;CHECK(it == j.begin());CHECK(it != j.end());CHECK(*it == j);++it;CHECK(it != j.begin());CHECK(it == j.end());--it;CHECK(it == j.begin());CHECK(it != j.end());CHECK(*it == j);}SECTION("const json + begin/end"){json::const_iterator it = j_const.begin();CHECK(it != j_const.end());CHECK(*it == j_const);it++;CHECK(it != j_const.begin());CHECK(it == j_const.end());it--;CHECK(it == j_const.begin());CHECK(it != j_const.end());CHECK(*it == j_const);++it;CHECK(it != j_const.begin());CHECK(it == j_const.end());--it;CHECK(it == j_const.begin());CHECK(it != j_const.end());CHECK(*it == j_const);}SECTION("json + cbegin/cend"){json::const_iterator it = j.cbegin();CHECK(it != j.cend());CHECK(*it == j);it++;CHECK(it != j.cbegin());CHECK(it == j.cend());it--;CHECK(it == j.cbegin());CHECK(it != j.cend());CHECK(*it == j);++it;CHECK(it != j.cbegin());CHECK(it == j.cend());--it;CHECK(it == j.cbegin());CHECK(it != j.cend());CHECK(*it == j);}SECTION("const json + cbegin/cend"){json::const_iterator it = j_const.cbegin();CHECK(it != j_const.cend());CHECK(*it == j_const);it++;CHECK(it != j_const.cbegin());CHECK(it == j_const.cend());it--;CHECK(it == j_const.cbegin());CHECK(it != j_const.cend());CHECK(*it == j_const);++it;CHECK(it != j_const.cbegin());CHECK(it == j_const.cend());--it;CHECK(it == j_const.cbegin());CHECK(it != j_const.cend());CHECK(*it == j_const);}SECTION("json + rbegin/rend"){json::reverse_iterator it = j.rbegin();CHECK(it != j.rend());CHECK(*it == j);it++;CHECK(it != j.rbegin());CHECK(it == j.rend());it--;CHECK(it == j.rbegin());CHECK(it != j.rend());CHECK(*it == j);++it;CHECK(it != j.rbegin());CHECK(it == j.rend());--it;CHECK(it == j.rbegin());CHECK(it != j.rend());CHECK(*it == j);}SECTION("json + crbegin/crend"){json::const_reverse_iterator it = j.crbegin();CHECK(it != j.crend());CHECK(*it == j);it++;CHECK(it != j.crbegin());CHECK(it == j.crend());it--;CHECK(it == j.crbegin());CHECK(it != j.crend());CHECK(*it == j);++it;CHECK(it != j.crbegin());CHECK(it == j.crend());--it;CHECK(it == j.crbegin());CHECK(it != j.crend());CHECK(*it == j);}SECTION("const json + crbegin/crend"){json::const_reverse_iterator it = j_const.crbegin();CHECK(it != j_const.crend());CHECK(*it == j_const);it++;CHECK(it != j_const.crbegin());CHECK(it == j_const.crend());it--;CHECK(it == j_const.crbegin());CHECK(it != j_const.crend());CHECK(*it == j_const);++it;CHECK(it != j_const.crbegin());CHECK(it == j_const.crend());--it;CHECK(it == j_const.crbegin());CHECK(it != j_const.crend());CHECK(*it == j_const);}SECTION("key/value"){auto it = j.begin();auto cit = j_const.cbegin();CHECK_THROWS_WITH_AS(it.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK(it.value() == json(23));CHECK_THROWS_WITH_AS(cit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK(cit.value() == json(23));auto rit = j.rend();auto crit = j.crend();CHECK_THROWS_WITH_AS(rit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK_THROWS_WITH_AS(rit.value(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);CHECK_THROWS_WITH_AS(crit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK_THROWS_WITH_AS(crit.value(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);}}SECTION("number (unsigned)"){json j = 23u;json j_const(j);SECTION("json + begin/end"){json::iterator it = j.begin();CHECK(it != j.end());CHECK(*it == j);it++;CHECK(it != j.begin());CHECK(it == j.end());it--;CHECK(it == j.begin());CHECK(it != j.end());CHECK(*it == j);++it;CHECK(it != j.begin());CHECK(it == j.end());--it;CHECK(it == j.begin());CHECK(it != j.end());CHECK(*it == j);}SECTION("const json + begin/end"){json::const_iterator it = j_const.begin();CHECK(it != j_const.end());CHECK(*it == j_const);it++;CHECK(it != j_const.begin());CHECK(it == j_const.end());it--;CHECK(it == j_const.begin());CHECK(it != j_const.end());CHECK(*it == j_const);++it;CHECK(it != j_const.begin());CHECK(it == j_const.end());--it;CHECK(it == j_const.begin());CHECK(it != j_const.end());CHECK(*it == j_const);}SECTION("json + cbegin/cend"){json::const_iterator it = j.cbegin();CHECK(it != j.cend());CHECK(*it == j);it++;CHECK(it != j.cbegin());CHECK(it == j.cend());it--;CHECK(it == j.cbegin());CHECK(it != j.cend());CHECK(*it == j);++it;CHECK(it != j.cbegin());CHECK(it == j.cend());--it;CHECK(it == j.cbegin());CHECK(it != j.cend());CHECK(*it == j);}SECTION("const json + cbegin/cend"){json::const_iterator it = j_const.cbegin();CHECK(it != j_const.cend());CHECK(*it == j_const);it++;CHECK(it != j_const.cbegin());CHECK(it == j_const.cend());it--;CHECK(it == j_const.cbegin());CHECK(it != j_const.cend());CHECK(*it == j_const);++it;CHECK(it != j_const.cbegin());CHECK(it == j_const.cend());--it;CHECK(it == j_const.cbegin());CHECK(it != j_const.cend());CHECK(*it == j_const);}SECTION("json + rbegin/rend"){json::reverse_iterator it = j.rbegin();CHECK(it != j.rend());CHECK(*it == j);it++;CHECK(it != j.rbegin());CHECK(it == j.rend());it--;CHECK(it == j.rbegin());CHECK(it != j.rend());CHECK(*it == j);++it;CHECK(it != j.rbegin());CHECK(it == j.rend());--it;CHECK(it == j.rbegin());CHECK(it != j.rend());CHECK(*it == j);}SECTION("json + crbegin/crend"){json::const_reverse_iterator it = j.crbegin();CHECK(it != j.crend());CHECK(*it == j);it++;CHECK(it != j.crbegin());CHECK(it == j.crend());it--;CHECK(it == j.crbegin());CHECK(it != j.crend());CHECK(*it == j);++it;CHECK(it != j.crbegin());CHECK(it == j.crend());--it;CHECK(it == j.crbegin());CHECK(it != j.crend());CHECK(*it == j);}SECTION("const json + crbegin/crend"){json::const_reverse_iterator it = j_const.crbegin();CHECK(it != j_const.crend());CHECK(*it == j_const);it++;CHECK(it != j_const.crbegin());CHECK(it == j_const.crend());it--;CHECK(it == j_const.crbegin());CHECK(it != j_const.crend());CHECK(*it == j_const);++it;CHECK(it != j_const.crbegin());CHECK(it == j_const.crend());--it;CHECK(it == j_const.crbegin());CHECK(it != j_const.crend());CHECK(*it == j_const);}SECTION("key/value"){auto it = j.begin();auto cit = j_const.cbegin();CHECK_THROWS_WITH_AS(it.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK(it.value() == json(23));CHECK_THROWS_WITH_AS(cit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK(cit.value() == json(23));auto rit = j.rend();auto crit = j.crend();CHECK_THROWS_WITH_AS(rit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK_THROWS_WITH_AS(rit.value(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);CHECK_THROWS_WITH_AS(crit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK_THROWS_WITH_AS(crit.value(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);}}SECTION("number (float)"){json j = 23.42;json j_const(j);SECTION("json + begin/end"){json::iterator it = j.begin();CHECK(it != j.end());CHECK(*it == j);it++;CHECK(it != j.begin());CHECK(it == j.end());it--;CHECK(it == j.begin());CHECK(it != j.end());CHECK(*it == j);++it;CHECK(it != j.begin());CHECK(it == j.end());--it;CHECK(it == j.begin());CHECK(it != j.end());CHECK(*it == j);}SECTION("const json + begin/end"){json::const_iterator it = j_const.begin();CHECK(it != j_const.end());CHECK(*it == j_const);it++;CHECK(it != j_const.begin());CHECK(it == j_const.end());it--;CHECK(it == j_const.begin());CHECK(it != j_const.end());CHECK(*it == j_const);++it;CHECK(it != j_const.begin());CHECK(it == j_const.end());--it;CHECK(it == j_const.begin());CHECK(it != j_const.end());CHECK(*it == j_const);}SECTION("json + cbegin/cend"){json::const_iterator it = j.cbegin();CHECK(it != j.cend());CHECK(*it == j);it++;CHECK(it != j.cbegin());CHECK(it == j.cend());it--;CHECK(it == j.cbegin());CHECK(it != j.cend());CHECK(*it == j);++it;CHECK(it != j.cbegin());CHECK(it == j.cend());--it;CHECK(it == j.cbegin());CHECK(it != j.cend());CHECK(*it == j);}SECTION("const json + cbegin/cend"){json::const_iterator it = j_const.cbegin();CHECK(it != j_const.cend());CHECK(*it == j_const);it++;CHECK(it != j_const.cbegin());CHECK(it == j_const.cend());it--;CHECK(it == j_const.cbegin());CHECK(it != j_const.cend());CHECK(*it == j_const);++it;CHECK(it != j_const.cbegin());CHECK(it == j_const.cend());--it;CHECK(it == j_const.cbegin());CHECK(it != j_const.cend());CHECK(*it == j_const);}SECTION("json + rbegin/rend"){json::reverse_iterator it = j.rbegin();CHECK(it != j.rend());CHECK(*it == j);it++;CHECK(it != j.rbegin());CHECK(it == j.rend());it--;CHECK(it == j.rbegin());CHECK(it != j.rend());CHECK(*it == j);++it;CHECK(it != j.rbegin());CHECK(it == j.rend());--it;CHECK(it == j.rbegin());CHECK(it != j.rend());CHECK(*it == j);}SECTION("json + crbegin/crend"){json::const_reverse_iterator it = j.crbegin();CHECK(it != j.crend());CHECK(*it == j);it++;CHECK(it != j.crbegin());CHECK(it == j.crend());it--;CHECK(it == j.crbegin());CHECK(it != j.crend());CHECK(*it == j);++it;CHECK(it != j.crbegin());CHECK(it == j.crend());--it;CHECK(it == j.crbegin());CHECK(it != j.crend());CHECK(*it == j);}SECTION("const json + crbegin/crend"){json::const_reverse_iterator it = j_const.crbegin();CHECK(it != j_const.crend());CHECK(*it == j_const);it++;CHECK(it != j_const.crbegin());CHECK(it == j_const.crend());it--;CHECK(it == j_const.crbegin());CHECK(it != j_const.crend());CHECK(*it == j_const);++it;CHECK(it != j_const.crbegin());CHECK(it == j_const.crend());--it;CHECK(it == j_const.crbegin());CHECK(it != j_const.crend());CHECK(*it == j_const);}SECTION("key/value"){auto it = j.begin();auto cit = j_const.cbegin();CHECK_THROWS_WITH_AS(it.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK(it.value() == json(23.42));CHECK_THROWS_WITH_AS(cit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK(cit.value() == json(23.42));auto rit = j.rend();auto crit = j.crend();CHECK_THROWS_WITH_AS(rit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK_THROWS_WITH_AS(rit.value(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);CHECK_THROWS_WITH_AS(crit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK_THROWS_WITH_AS(crit.value(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);}}SECTION("null"){json j = nullptr;json j_const(j);SECTION("json + begin/end"){const json::iterator it = j.begin();CHECK(it == j.end());}SECTION("const json + begin/end"){const json::const_iterator it_begin = j_const.begin();json::const_iterator it_end = j_const.end();CHECK(it_begin == it_end);}SECTION("json + cbegin/cend"){const json::const_iterator it_begin = j.cbegin();json::const_iterator it_end = j.cend();CHECK(it_begin == it_end);}SECTION("const json + cbegin/cend"){const json::const_iterator it_begin = j_const.cbegin();json::const_iterator it_end = j_const.cend();CHECK(it_begin == it_end);}SECTION("json + rbegin/rend"){const json::reverse_iterator it = j.rbegin();CHECK(it == j.rend());}SECTION("json + crbegin/crend"){const json::const_reverse_iterator it = j.crbegin();CHECK(it == j.crend());}SECTION("const json + crbegin/crend"){const json::const_reverse_iterator it = j_const.crbegin();CHECK(it == j_const.crend());}SECTION("key/value"){auto it = j.begin();auto cit = j_const.cbegin();CHECK_THROWS_WITH_AS(it.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK_THROWS_WITH_AS(it.value(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);CHECK_THROWS_WITH_AS(cit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK_THROWS_WITH_AS(cit.value(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);auto rit = j.rend();auto crit = j.crend();CHECK_THROWS_WITH_AS(rit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK_THROWS_WITH_AS(rit.value(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);CHECK_THROWS_WITH_AS(crit.key(), "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators", json::invalid_iterator&);CHECK_THROWS_WITH_AS(crit.value(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);}}}SECTION("conversion from iterator to const iterator"){SECTION("boolean"){json j = true;json::const_iterator it = j.begin();CHECK(it == j.cbegin());it = j.begin();CHECK(it == j.cbegin());}SECTION("string"){json j = "hello world";json::const_iterator it = j.begin();CHECK(it == j.cbegin());it = j.begin();CHECK(it == j.cbegin());}SECTION("array"){json j = {1, 2, 3};json::const_iterator it = j.begin();CHECK(it == j.cbegin());it = j.begin();CHECK(it == j.cbegin());}SECTION("object"){json j = {{"A", 1}, {"B", 2}, {"C", 3}};json::const_iterator it = j.begin();CHECK(it == j.cbegin());it = j.begin();CHECK(it == j.cbegin());}SECTION("number (integer)"){json j = 23;json::const_iterator it = j.begin();CHECK(it == j.cbegin());it = j.begin();CHECK(it == j.cbegin());}SECTION("number (unsigned)"){json j = 23u;json::const_iterator it = j.begin();CHECK(it == j.cbegin());it = j.begin();CHECK(it == j.cbegin());}SECTION("number (float)"){json j = 23.42;json::const_iterator it = j.begin();CHECK(it == j.cbegin());it = j.begin();CHECK(it == j.cbegin());}SECTION("null"){json j = nullptr;json::const_iterator it = j.begin();CHECK(it == j.cbegin());it = j.begin();CHECK(it == j.cbegin());}}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。