TestJSON.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibTest/TestCase.h>
  7. #include <AK/HashMap.h>
  8. #include <AK/JsonObject.h>
  9. #include <AK/JsonValue.h>
  10. #include <AK/String.h>
  11. #include <AK/StringBuilder.h>
  12. TEST_CASE(load_form)
  13. {
  14. String raw_form_json = R"(
  15. {
  16. "name": "Form1",
  17. "widgets": [
  18. {
  19. "enabled": true,
  20. "forecolor": "#000000ff",
  21. "ruler_visible": false,
  22. "autofill": false,
  23. "x": 155,
  24. "tooltip": null,
  25. "height": 121,
  26. "width": 126,
  27. "y": 10,
  28. "class": "GTextEditor",
  29. "text": "Hi",
  30. "backcolor": "#c0c0c0ff",
  31. "visible":true
  32. }
  33. ]
  34. })";
  35. JsonValue form_json = JsonValue::from_string(raw_form_json).value();
  36. EXPECT(form_json.is_object());
  37. auto name = form_json.as_object().get("name").to_string();
  38. EXPECT_EQ(name, "Form1");
  39. auto widgets = form_json.as_object().get("widgets").as_array();
  40. widgets.for_each([&](const JsonValue& widget_value) {
  41. auto& widget_object = widget_value.as_object();
  42. auto widget_class = widget_object.get("class").as_string();
  43. widget_object.for_each_member([&]([[maybe_unused]] auto& property_name, [[maybe_unused]] const JsonValue& property_value) {
  44. });
  45. });
  46. }
  47. TEST_CASE(json_empty_string)
  48. {
  49. auto json = JsonValue::from_string("\"\"").value();
  50. EXPECT_EQ(json.type(), JsonValue::Type::String);
  51. EXPECT_EQ(json.as_string().is_null(), false);
  52. EXPECT_EQ(json.as_string().is_empty(), true);
  53. }
  54. TEST_CASE(json_string)
  55. {
  56. auto json = JsonValue::from_string("\"A\"").value();
  57. EXPECT_EQ(json.type(), JsonValue::Type::String);
  58. EXPECT_EQ(json.as_string().is_null(), false);
  59. EXPECT_EQ(json.as_string().length(), size_t { 1 });
  60. EXPECT_EQ(json.as_string() == "A", true);
  61. }
  62. TEST_CASE(json_utf8_character)
  63. {
  64. auto json = JsonValue::from_string("\"\\u0041\"").value();
  65. EXPECT_EQ(json.type(), JsonValue::Type::String);
  66. EXPECT_EQ(json.as_string().is_null(), false);
  67. EXPECT_EQ(json.as_string().length(), size_t { 1 });
  68. EXPECT_EQ(json.as_string() == "A", true);
  69. }
  70. /*
  71. FIXME: Parse JSON from a Utf8View
  72. TEST_CASE(json_utf8_multibyte)
  73. {
  74. auto json_or_error = JsonValue::from_string("\"š\"");
  75. EXPECT_EQ(json_or_error.has_value(), true);
  76. auto& json = json_or_error.value();
  77. EXPECT_EQ(json.type(), JsonValue::Type::String);
  78. EXPECT_EQ(json.as_string().is_null(), false);
  79. EXPECT_EQ(json.as_string().length(), size_t { 2 });
  80. EXPECT_EQ(json.as_string() == "š", true);
  81. EXPECT_EQ(json.as_string() == "\xc5\xa1", true);
  82. }
  83. */
  84. TEST_CASE(json_64_bit_value)
  85. {
  86. auto big_value = 0x12345678aabbccddull;
  87. JsonValue big_json_value(big_value);
  88. JsonValue big_json_value_copy = big_json_value;
  89. EXPECT_EQ(big_json_value.as_u64(), big_json_value_copy.as_u64());
  90. }
  91. TEST_CASE(json_duplicate_keys)
  92. {
  93. JsonObject json;
  94. json.set("test", "foo");
  95. json.set("test", "bar");
  96. json.set("test", "baz");
  97. EXPECT_EQ(json.to_string(), "{\"test\":\"baz\"}");
  98. }
  99. TEST_CASE(json_u64_roundtrip)
  100. {
  101. auto big_value = 0xffffffffffffffffull;
  102. auto json = JsonValue(big_value).to_string();
  103. auto value = JsonValue::from_string(json);
  104. EXPECT_EQ_FORCE(value.has_value(), true);
  105. EXPECT_EQ(value->as_u64(), big_value);
  106. }