123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- /*
- __ _____ _____ _____
- __| | __| | | | JSON for Modern C++ (test suite)
- | | |__ | | | | | | version 3.7.3
- |_____|_____|_____|_|___| https://github.com/nlohmann/json
- Licensed under the MIT License <http://opensource.org/licenses/MIT>.
- SPDX-License-Identifier: MIT
- Copyright (c) 2013-2019 Niels Lohmann <http://nlohmann.me>.
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
- */
- #include "doctest_compatibility.h"
- #include <nlohmann/json.hpp>
- using nlohmann::json;
- namespace
- {
- // helper function to check std::less<json::value_t>
- // see https://en.cppreference.com/w/cpp/utility/functional/less
- template <typename A, typename B, typename U = std::less<json::value_t>>
- bool f(A a, B b, U u = U())
- {
- return u(a, b);
- }
- }
- TEST_CASE("lexicographical comparison operators")
- {
- SECTION("types")
- {
- std::vector<json::value_t> j_types =
- {
- json::value_t::null,
- json::value_t::boolean,
- json::value_t::number_integer,
- json::value_t::number_unsigned,
- json::value_t::number_float,
- json::value_t::object,
- json::value_t::array,
- json::value_t::string,
- json::value_t::binary
- };
- SECTION("comparison: less")
- {
- std::vector<std::vector<bool>> expected =
- {
- {false, true, true, true, true, true, true, true, true},
- {false, false, true, true, true, true, true, true, true},
- {false, false, false, false, false, true, true, true, true},
- {false, false, false, false, false, true, true, true, true},
- {false, false, false, false, false, true, true, true, true},
- {false, false, false, false, false, false, true, true, true},
- {false, false, false, false, false, false, false, true, true},
- {false, false, false, false, false, false, false, false, true},
- {false, false, false, false, false, false, false, false, false}
- };
- for (size_t i = 0; i < j_types.size(); ++i)
- {
- for (size_t j = 0; j < j_types.size(); ++j)
- {
- CAPTURE(i)
- CAPTURE(j)
- // check precomputed values
- CHECK(operator<(j_types[i], j_types[j]) == expected[i][j]);
- CHECK(f(j_types[i], j_types[j]) == expected[i][j]);
- }
- }
- }
- }
- SECTION("values")
- {
- json j_values =
- {
- nullptr, nullptr,
- -17, 42,
- 8u, 13u,
- 3.14159, 23.42,
- "foo", "bar",
- true, false,
- {1, 2, 3}, {"one", "two", "three"},
- {{"first", 1}, {"second", 2}}, {{"a", "A"}, {"b", {"B"}}},
- json::binary({1, 2, 3}), json::binary({1, 2, 4})
- };
- SECTION("comparison: equal")
- {
- std::vector<std::vector<bool>> expected =
- {
- {true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false},
- {true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false},
- {false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false},
- {false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false},
- {false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false},
- {false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false},
- {false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false},
- {false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false},
- {false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false},
- {false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false},
- {false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false},
- {false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false},
- {false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false},
- {false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false},
- {false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false},
- {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false},
- {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false},
- {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true}
- };
- for (size_t i = 0; i < j_values.size(); ++i)
- {
- for (size_t j = 0; j < j_values.size(); ++j)
- {
- CAPTURE(i)
- CAPTURE(j)
- CAPTURE(j_values[i])
- CAPTURE(j_values[j])
- // check precomputed values
- CHECK( (j_values[i] == j_values[j]) == expected[i][j] );
- }
- }
- // comparison with discarded elements
- json j_discarded(json::value_t::discarded);
- for (size_t i = 0; i < j_values.size(); ++i)
- {
- CHECK( (j_values[i] == j_discarded) == false);
- CHECK( (j_discarded == j_values[i]) == false);
- CHECK( (j_discarded == j_discarded) == false);
- }
- // compare with null pointer
- json j_null;
- CHECK(j_null == nullptr);
- CHECK(nullptr == j_null);
- }
- SECTION("comparison: not equal")
- {
- for (size_t i = 0; i < j_values.size(); ++i)
- {
- for (size_t j = 0; j < j_values.size(); ++j)
- {
- CAPTURE(i)
- CAPTURE(j)
- // check definition
- CHECK( (j_values[i] != j_values[j]) == not(j_values[i] == j_values[j]) );
- }
- }
- // compare with null pointer
- json j_null;
- CHECK( (j_null != nullptr) == false);
- CHECK( (nullptr != j_null) == false);
- CHECK( (j_null != nullptr) == not(j_null == nullptr));
- CHECK( (nullptr != j_null) == not(nullptr == j_null));
- }
- SECTION("comparison: less")
- {
- std::vector<std::vector<bool>> expected =
- {
- {false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true},
- {false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true},
- {false, false, false, true, true, true, true, true, true, true, false, false, true, true, true, true, true, true},
- {false, false, false, false, false, false, false, false, true, true, false, false, true, true, true, true, true, true},
- {false, false, false, true, false, true, false, true, true, true, false, false, true, true, true, true, true, true},
- {false, false, false, true, false, false, false, true, true, true, false, false, true, true, true, true, true, true},
- {false, false, false, true, true, true, false, true, true, true, false, false, true, true, true, true, true, true},
- {false, false, false, true, false, false, false, false, true, true, false, false, true, true, true, true, true, true},
- {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true},
- {false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, true},
- {false, false, true, true, true, true, true, true, true, true, false, false, true, true, true, true, true, true},
- {false, false, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true},
- {false, false, false, false, false, false, false, false, true, true, false, false, false, true, false, false, true, true},
- {false, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, true, true},
- {false, false, false, false, false, false, false, false, true, true, false, false, true, true, false, false, true, true},
- {false, false, false, false, false, false, false, false, true, true, false, false, true, true, true, false, true, true},
- {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true},
- {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}
- };
- for (size_t i = 0; i < j_values.size(); ++i)
- {
- for (size_t j = 0; j < j_values.size(); ++j)
- {
- CAPTURE(i)
- CAPTURE(j)
- CAPTURE(j_values[i])
- CAPTURE(j_values[j])
- // check precomputed values
- CHECK( (j_values[i] < j_values[j]) == expected[i][j] );
- }
- }
- // comparison with discarded elements
- json j_discarded(json::value_t::discarded);
- for (size_t i = 0; i < j_values.size(); ++i)
- {
- CAPTURE(i)
- CHECK( (j_values[i] < j_discarded) == false);
- CHECK( (j_discarded < j_values[i]) == false);
- CHECK( (j_discarded < j_discarded) == false);
- }
- }
- SECTION("comparison: less than or equal equal")
- {
- for (size_t i = 0; i < j_values.size(); ++i)
- {
- for (size_t j = 0; j < j_values.size(); ++j)
- {
- CAPTURE(i)
- CAPTURE(j)
- // check definition
- CHECK( (j_values[i] <= j_values[j]) == not(j_values[j] < j_values[i]) );
- }
- }
- }
- SECTION("comparison: greater than")
- {
- for (size_t i = 0; i < j_values.size(); ++i)
- {
- for (size_t j = 0; j < j_values.size(); ++j)
- {
- CAPTURE(i)
- CAPTURE(j)
- // check definition
- CHECK( (j_values[i] > j_values[j]) == (j_values[j] < j_values[i]) );
- }
- }
- }
- SECTION("comparison: greater than or equal")
- {
- for (size_t i = 0; i < j_values.size(); ++i)
- {
- for (size_t j = 0; j < j_values.size(); ++j)
- {
- CAPTURE(i)
- CAPTURE(j)
- // check definition
- CHECK( (j_values[i] >= j_values[j]) == not(j_values[i] < j_values[j]) );
- }
- }
- }
- }
- }
|