JsonVariant.cpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2025, Benoit BLANCHON
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. #include <limits>
  7. #include "Literals.hpp"
  8. template <typename T>
  9. std::string serialize(T value) {
  10. JsonDocument doc;
  11. doc.to<JsonVariant>().set(value);
  12. std::string output;
  13. serializeJson(doc, output);
  14. return output;
  15. }
  16. TEST_CASE("serializeJson(JsonVariant)") {
  17. SECTION("JsonVariant") {
  18. CHECK(serialize(JsonVariant()) == "null");
  19. }
  20. SECTION("const char*") {
  21. CHECK(serialize(static_cast<const char*>(0)) == "null");
  22. CHECK(serialize("hello") == "\"hello\"");
  23. }
  24. SECTION("std::string") {
  25. CHECK(serialize("hello"_s) == "\"hello\"");
  26. CHECK(serialize("hello \"world\""_s) == "\"hello \\\"world\\\"\"");
  27. CHECK(serialize("hello\\world"_s) == "\"hello\\\\world\"");
  28. CHECK(serialize("fifty/fifty"_s) == "\"fifty/fifty\"");
  29. CHECK(serialize("hello'world"_s) == "\"hello'world\"");
  30. CHECK(serialize("hello\bworld"_s) == "\"hello\\bworld\"");
  31. CHECK(serialize("hello\fworld"_s) == "\"hello\\fworld\"");
  32. CHECK(serialize("hello\nworld"_s) == "\"hello\\nworld\"");
  33. CHECK(serialize("hello\rworld"_s) == "\"hello\\rworld\"");
  34. CHECK(serialize("hello\tworld"_s) == "\"hello\\tworld\"");
  35. CHECK(serialize("hello\0world"_s) == "\"hello\\u0000world\"");
  36. }
  37. SECTION("SerializedValue<const char*>") {
  38. CHECK(serialize(serialized("[1,2]")) == "[1,2]");
  39. }
  40. SECTION("SerializedValue<std::string>") {
  41. CHECK(serialize(serialized("[1,2]"_s)) == "[1,2]");
  42. }
  43. SECTION("double") {
  44. CHECK(serialize(0.0) == "0");
  45. CHECK(serialize(-0.0) == "0");
  46. CHECK(serialize(10.0) == "10");
  47. CHECK(serialize(100.0) == "100");
  48. CHECK(serialize(0.1) == "0.1");
  49. CHECK(serialize(0.01) == "0.01");
  50. CHECK(serialize(3.1415927) == "3.1415927");
  51. CHECK(serialize(-3.1415927) == "-3.1415927");
  52. CHECK(serialize(1.7976931348623157E+308) == "1.79769313e308");
  53. CHECK(serialize(4.94065645841247e-324) == "4.94065646e-324");
  54. }
  55. SECTION("float") {
  56. REQUIRE(sizeof(float) == 4);
  57. CHECK(serialize(3.1415927f) == "3.141593");
  58. CHECK(serialize(-3.1415927f) == "-3.141593");
  59. CHECK(serialize(3.4E+38f) == "3.4e38");
  60. CHECK(serialize(1.17549435e-38f) == "1.175494e-38");
  61. }
  62. SECTION("int") {
  63. CHECK(serialize(0) == "0");
  64. CHECK(serialize(42) == "42");
  65. CHECK(serialize(-42) == "-42");
  66. }
  67. SECTION("unsigned long") {
  68. CHECK(serialize(4294967295UL) == "4294967295");
  69. }
  70. SECTION("bool") {
  71. CHECK(serialize(true) == "true");
  72. CHECK(serialize(false) == "false");
  73. }
  74. #if ARDUINOJSON_USE_LONG_LONG
  75. SECTION("int64_t") {
  76. CHECK(serialize(-9223372036854775807 - 1) == "-9223372036854775808");
  77. CHECK(serialize(9223372036854775807) == "9223372036854775807");
  78. }
  79. SECTION("uint64_t") {
  80. CHECK(serialize(18446744073709551615U) == "18446744073709551615");
  81. }
  82. #endif
  83. }