unit-hash.cpp 4.0 KB

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