blob: 411b25f678f8552c431c25a31707d298aff37df7 [file] [log] [blame] [edit]
// __ _____ _____ _____
// __| | __| | | | JSON for Modern C++ (supporting code)
// | | |__ | | | | | | version 3.11.3
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT
#include "doctest_compatibility.h"
#include <nlohmann/json.hpp>
using json = nlohmann::json;
using ordered_json = nlohmann::ordered_json;
#include <set>
TEST_CASE("hash<nlohmann::json>")
{
// Collect hashes for different JSON values and make sure that they are distinct
// We cannot compare against fixed values, because the implementation of
// std::hash may differ between compilers.
std::set<std::size_t> hashes;
// null
hashes.insert(std::hash<json>{}(json(nullptr)));
// boolean
hashes.insert(std::hash<json>{}(json(true)));
hashes.insert(std::hash<json>{}(json(false)));
// string
hashes.insert(std::hash<json>{}(json("")));
hashes.insert(std::hash<json>{}(json("foo")));
// number
hashes.insert(std::hash<json>{}(json(0)));
hashes.insert(std::hash<json>{}(json(static_cast<unsigned>(0))));
hashes.insert(std::hash<json>{}(json(-1)));
hashes.insert(std::hash<json>{}(json(0.0)));
hashes.insert(std::hash<json>{}(json(42.23)));
// array
hashes.insert(std::hash<json>{}(json::array()));
hashes.insert(std::hash<json>{}(json::array({ 1, 2, 3 })));
// object
hashes.insert(std::hash<json>{}(json::object()));
hashes.insert(std::hash<json>{}(json::object({ { "foo", "bar" } })));
// binary
hashes.insert(std::hash<json>{}(json::binary({})));
hashes.insert(std::hash<json>{}(json::binary({}, 0)));
hashes.insert(std::hash<json>{}(json::binary({}, 42)));
hashes.insert(std::hash<json>{}(json::binary({ 1, 2, 3 })));
hashes.insert(std::hash<json>{}(json::binary({ 1, 2, 3 }, 0)));
hashes.insert(std::hash<json>{}(json::binary({ 1, 2, 3 }, 42)));
// discarded
hashes.insert(std::hash<json>{}(json(json::value_t::discarded)));
CHECK(hashes.size() == 21);
}
TEST_CASE("hash<nlohmann::ordered_json>")
{
// Collect hashes for different JSON values and make sure that they are distinct
// We cannot compare against fixed values, because the implementation of
// std::hash may differ between compilers.
std::set<std::size_t> hashes;
// null
hashes.insert(std::hash<ordered_json>{}(ordered_json(nullptr)));
// boolean
hashes.insert(std::hash<ordered_json>{}(ordered_json(true)));
hashes.insert(std::hash<ordered_json>{}(ordered_json(false)));
// string
hashes.insert(std::hash<ordered_json>{}(ordered_json("")));
hashes.insert(std::hash<ordered_json>{}(ordered_json("foo")));
// number
hashes.insert(std::hash<ordered_json>{}(ordered_json(0)));
hashes.insert(std::hash<ordered_json>{}(ordered_json(static_cast<unsigned>(0))));
hashes.insert(std::hash<ordered_json>{}(ordered_json(-1)));
hashes.insert(std::hash<ordered_json>{}(ordered_json(0.0)));
hashes.insert(std::hash<ordered_json>{}(ordered_json(42.23)));
// array
hashes.insert(std::hash<ordered_json>{}(ordered_json::array()));
hashes.insert(std::hash<ordered_json>{}(ordered_json::array({ 1, 2, 3 })));
// object
hashes.insert(std::hash<ordered_json>{}(ordered_json::object()));
hashes.insert(std::hash<ordered_json>{}(ordered_json::object({ { "foo", "bar" } })));
// binary
hashes.insert(std::hash<ordered_json>{}(ordered_json::binary({})));
hashes.insert(std::hash<ordered_json>{}(ordered_json::binary({}, 0)));
hashes.insert(std::hash<ordered_json>{}(ordered_json::binary({}, 42)));
hashes.insert(std::hash<ordered_json>{}(ordered_json::binary({ 1, 2, 3 })));
hashes.insert(std::hash<ordered_json>{}(ordered_json::binary({ 1, 2, 3 }, 0)));
hashes.insert(std::hash<ordered_json>{}(ordered_json::binary({ 1, 2, 3 }, 42)));
// discarded
hashes.insert(std::hash<ordered_json>{}(ordered_json(ordered_json::value_t::discarded)));
CHECK(hashes.size() == 21);
}