1c5f01b2fSopenharmony_ci// __ _____ _____ _____ 2c5f01b2fSopenharmony_ci// __| | __| | | | JSON for Modern C++ (supporting code) 3c5f01b2fSopenharmony_ci// | | |__ | | | | | | version 3.11.2 4c5f01b2fSopenharmony_ci// |_____|_____|_____|_|___| https://github.com/nlohmann/json 5c5f01b2fSopenharmony_ci// 6c5f01b2fSopenharmony_ci// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me> 7c5f01b2fSopenharmony_ci// SPDX-License-Identifier: MIT 8c5f01b2fSopenharmony_ci 9c5f01b2fSopenharmony_ci#include "doctest_compatibility.h" 10c5f01b2fSopenharmony_ci 11c5f01b2fSopenharmony_ci#include <nlohmann/json.hpp> 12c5f01b2fSopenharmony_ciusing json = nlohmann::json; 13c5f01b2fSopenharmony_ciusing ordered_json = nlohmann::ordered_json; 14c5f01b2fSopenharmony_ci 15c5f01b2fSopenharmony_ci#include <set> 16c5f01b2fSopenharmony_ci 17c5f01b2fSopenharmony_ciTEST_CASE("hash<nlohmann::json>") 18c5f01b2fSopenharmony_ci{ 19c5f01b2fSopenharmony_ci // Collect hashes for different JSON values and make sure that they are distinct 20c5f01b2fSopenharmony_ci // We cannot compare against fixed values, because the implementation of 21c5f01b2fSopenharmony_ci // std::hash may differ between compilers. 22c5f01b2fSopenharmony_ci 23c5f01b2fSopenharmony_ci std::set<std::size_t> hashes; 24c5f01b2fSopenharmony_ci 25c5f01b2fSopenharmony_ci // null 26c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json(nullptr))); 27c5f01b2fSopenharmony_ci 28c5f01b2fSopenharmony_ci // boolean 29c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json(true))); 30c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json(false))); 31c5f01b2fSopenharmony_ci 32c5f01b2fSopenharmony_ci // string 33c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json(""))); 34c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json("foo"))); 35c5f01b2fSopenharmony_ci 36c5f01b2fSopenharmony_ci // number 37c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json(0))); 38c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json(static_cast<unsigned>(0)))); 39c5f01b2fSopenharmony_ci 40c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json(-1))); 41c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json(0.0))); 42c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json(42.23))); 43c5f01b2fSopenharmony_ci 44c5f01b2fSopenharmony_ci // array 45c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json::array())); 46c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json::array({1, 2, 3}))); 47c5f01b2fSopenharmony_ci 48c5f01b2fSopenharmony_ci // object 49c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json::object())); 50c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json::object({{"foo", "bar"}}))); 51c5f01b2fSopenharmony_ci 52c5f01b2fSopenharmony_ci // binary 53c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json::binary({}))); 54c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json::binary({}, 0))); 55c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json::binary({}, 42))); 56c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json::binary({1, 2, 3}))); 57c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json::binary({1, 2, 3}, 0))); 58c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json::binary({1, 2, 3}, 42))); 59c5f01b2fSopenharmony_ci 60c5f01b2fSopenharmony_ci // discarded 61c5f01b2fSopenharmony_ci hashes.insert(std::hash<json> {}(json(json::value_t::discarded))); 62c5f01b2fSopenharmony_ci 63c5f01b2fSopenharmony_ci CHECK(hashes.size() == 21); 64c5f01b2fSopenharmony_ci} 65c5f01b2fSopenharmony_ci 66c5f01b2fSopenharmony_ciTEST_CASE("hash<nlohmann::ordered_json>") 67c5f01b2fSopenharmony_ci{ 68c5f01b2fSopenharmony_ci // Collect hashes for different JSON values and make sure that they are distinct 69c5f01b2fSopenharmony_ci // We cannot compare against fixed values, because the implementation of 70c5f01b2fSopenharmony_ci // std::hash may differ between compilers. 71c5f01b2fSopenharmony_ci 72c5f01b2fSopenharmony_ci std::set<std::size_t> hashes; 73c5f01b2fSopenharmony_ci 74c5f01b2fSopenharmony_ci // null 75c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json(nullptr))); 76c5f01b2fSopenharmony_ci 77c5f01b2fSopenharmony_ci // boolean 78c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json(true))); 79c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json(false))); 80c5f01b2fSopenharmony_ci 81c5f01b2fSopenharmony_ci // string 82c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json(""))); 83c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json("foo"))); 84c5f01b2fSopenharmony_ci 85c5f01b2fSopenharmony_ci // number 86c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json(0))); 87c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json(static_cast<unsigned>(0)))); 88c5f01b2fSopenharmony_ci 89c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json(-1))); 90c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json(0.0))); 91c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json(42.23))); 92c5f01b2fSopenharmony_ci 93c5f01b2fSopenharmony_ci // array 94c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json::array())); 95c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json::array({1, 2, 3}))); 96c5f01b2fSopenharmony_ci 97c5f01b2fSopenharmony_ci // object 98c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json::object())); 99c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json::object({{"foo", "bar"}}))); 100c5f01b2fSopenharmony_ci 101c5f01b2fSopenharmony_ci // binary 102c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json::binary({}))); 103c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json::binary({}, 0))); 104c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json::binary({}, 42))); 105c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json::binary({1, 2, 3}))); 106c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json::binary({1, 2, 3}, 0))); 107c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json::binary({1, 2, 3}, 42))); 108c5f01b2fSopenharmony_ci 109c5f01b2fSopenharmony_ci // discarded 110c5f01b2fSopenharmony_ci hashes.insert(std::hash<ordered_json> {}(ordered_json(ordered_json::value_t::discarded))); 111c5f01b2fSopenharmony_ci 112c5f01b2fSopenharmony_ci CHECK(hashes.size() == 21); 113c5f01b2fSopenharmony_ci} 114