TestJSON.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  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/DeprecatedString.h>
  8. #include <AK/HashMap.h>
  9. #include <AK/JsonObject.h>
  10. #include <AK/JsonValue.h>
  11. #include <AK/StringBuilder.h>
  12. TEST_CASE(load_form)
  13. {
  14. DeprecatedString 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"sv).to_deprecated_string();
  38. EXPECT_EQ(name, "Form1");
  39. auto widgets = form_json.as_object().get("widgets"sv).as_array();
  40. widgets.for_each([&](JsonValue const& widget_value) {
  41. auto& widget_object = widget_value.as_object();
  42. auto widget_class = widget_object.get("class"sv).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("\"\""sv).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\""sv).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\""sv).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.is_error(), false);
  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_deprecated_string(), "{\"test\":\"baz\"}");
  98. }
  99. TEST_CASE(json_u64_roundtrip)
  100. {
  101. auto big_value = 0xffffffffffffffffull;
  102. auto json = JsonValue(big_value).to_deprecated_string();
  103. auto value = JsonValue::from_string(json);
  104. EXPECT_EQ_FORCE(value.is_error(), false);
  105. EXPECT_EQ(value.value().as_u64(), big_value);
  106. }
  107. TEST_CASE(json_parse_empty_string)
  108. {
  109. auto value = JsonValue::from_string(""sv);
  110. EXPECT_EQ(value.is_error(), true);
  111. }
  112. TEST_CASE(json_parse_long_decimals)
  113. {
  114. auto value = JsonValue::from_string("1644452550.6489999294281"sv);
  115. EXPECT_EQ(value.value().as_double(), 1644452550.6489999294281);
  116. }
  117. TEST_CASE(json_parse_number_with_exponent)
  118. {
  119. auto value_without_fraction = JsonValue::from_string("10e5"sv);
  120. EXPECT_EQ(value_without_fraction.value().as_double(), 1000000.0);
  121. auto value_with_fraction = JsonValue::from_string("10.5e5"sv);
  122. EXPECT_EQ(value_with_fraction.value().as_double(), 1050000.0);
  123. }
  124. TEST_CASE(json_parse_special_numbers)
  125. {
  126. #define EXPECT_TO_MATCH_NUMBER_BIT_WISE(string_input, double_input) \
  127. do { \
  128. auto value_or_error = JsonValue::from_string(string_input##sv); \
  129. VERIFY(!value_or_error.is_error()); \
  130. if (value_or_error.is_error()) \
  131. dbgln("got {}", value_or_error.error()); \
  132. EXPECT(value_or_error.value().is_number()); \
  133. EXPECT_EQ(bit_cast<u64>(value_or_error.value().to_double(4321.0)), bit_cast<u64>(static_cast<double>(double_input))); \
  134. } while (false)
  135. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-0", -0.);
  136. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-0.0", -0.0);
  137. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-0.00", -0.00);
  138. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-0e0", -0e0);
  139. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-0e1", -0e1);
  140. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-0e2", -0e2);
  141. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-0e1000", -0e1000);
  142. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-0e-1000", -0e-1000);
  143. EXPECT_TO_MATCH_NUMBER_BIT_WISE("0", 0.);
  144. EXPECT_TO_MATCH_NUMBER_BIT_WISE("0.0", 0.0);
  145. EXPECT_TO_MATCH_NUMBER_BIT_WISE("0.00", 0.00);
  146. EXPECT_TO_MATCH_NUMBER_BIT_WISE("0e0", 0e0);
  147. EXPECT_TO_MATCH_NUMBER_BIT_WISE("0e1", 0e1);
  148. EXPECT_TO_MATCH_NUMBER_BIT_WISE("0e2", 0e2);
  149. EXPECT_TO_MATCH_NUMBER_BIT_WISE("0e1000", 0e1000);
  150. EXPECT_TO_MATCH_NUMBER_BIT_WISE("0e-1000", 0e-1000);
  151. // These technically can be non zero, but not in doubles
  152. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-1e-2000", -0.);
  153. EXPECT_TO_MATCH_NUMBER_BIT_WISE("1e-2000", 0.);
  154. #undef EXPECT_TO_MATCH_NUMBER_BIT_WISE
  155. }
  156. TEST_CASE(json_parse_fails_on_invalid_number)
  157. {
  158. #define EXPECT_JSON_PARSE_TO_FAIL(value) \
  159. EXPECT(JsonValue::from_string(value##sv).is_error());
  160. EXPECT_JSON_PARSE_TO_FAIL("-");
  161. EXPECT_JSON_PARSE_TO_FAIL("00");
  162. EXPECT_JSON_PARSE_TO_FAIL("01");
  163. EXPECT_JSON_PARSE_TO_FAIL("-01");
  164. EXPECT_JSON_PARSE_TO_FAIL(".1");
  165. EXPECT_JSON_PARSE_TO_FAIL("-.1");
  166. EXPECT_JSON_PARSE_TO_FAIL("-,1");
  167. EXPECT_JSON_PARSE_TO_FAIL(".1e1");
  168. EXPECT_JSON_PARSE_TO_FAIL(".1e-1");
  169. EXPECT_JSON_PARSE_TO_FAIL("-.1e1");
  170. EXPECT_JSON_PARSE_TO_FAIL("-.1e-1");
  171. EXPECT_JSON_PARSE_TO_FAIL("1.e1");
  172. EXPECT_JSON_PARSE_TO_FAIL("1.e-1");
  173. EXPECT_JSON_PARSE_TO_FAIL("-1.e1");
  174. EXPECT_JSON_PARSE_TO_FAIL("-1.e-1");
  175. EXPECT_JSON_PARSE_TO_FAIL("1e");
  176. EXPECT_JSON_PARSE_TO_FAIL("1e+");
  177. EXPECT_JSON_PARSE_TO_FAIL("1e-");
  178. EXPECT_JSON_PARSE_TO_FAIL("1e-f");
  179. EXPECT_JSON_PARSE_TO_FAIL("1.e");
  180. EXPECT_JSON_PARSE_TO_FAIL("1.e+");
  181. EXPECT_JSON_PARSE_TO_FAIL("1.e-");
  182. EXPECT_JSON_PARSE_TO_FAIL("1.e-f");
  183. EXPECT_JSON_PARSE_TO_FAIL("1p2");
  184. EXPECT_JSON_PARSE_TO_FAIL("1.p2");
  185. EXPECT_JSON_PARSE_TO_FAIL("0x1.0p2");
  186. EXPECT_JSON_PARSE_TO_FAIL("0x1");
  187. EXPECT_JSON_PARSE_TO_FAIL("0x7");
  188. EXPECT_JSON_PARSE_TO_FAIL("0xA");
  189. EXPECT_JSON_PARSE_TO_FAIL("0x");
  190. EXPECT_JSON_PARSE_TO_FAIL("-0x");
  191. EXPECT_JSON_PARSE_TO_FAIL("0x");
  192. EXPECT_JSON_PARSE_TO_FAIL("1x");
  193. EXPECT_JSON_PARSE_TO_FAIL("100x");
  194. EXPECT_JSON_PARSE_TO_FAIL("1000000000000000000000x");
  195. EXPECT_JSON_PARSE_TO_FAIL("0e2x");
  196. EXPECT_JSON_PARSE_TO_FAIL("0.1e2x");
  197. EXPECT_JSON_PARSE_TO_FAIL("0.1x");
  198. EXPECT_JSON_PARSE_TO_FAIL("1e2x");
  199. EXPECT_JSON_PARSE_TO_FAIL("1.2x");
  200. EXPECT_JSON_PARSE_TO_FAIL("1.2e2x");
  201. EXPECT_JSON_PARSE_TO_FAIL(".0");
  202. EXPECT_JSON_PARSE_TO_FAIL(".e1");
  203. EXPECT_JSON_PARSE_TO_FAIL("-.0");
  204. EXPECT_JSON_PARSE_TO_FAIL("-.e1");
  205. EXPECT_JSON_PARSE_TO_FAIL("+0");
  206. EXPECT_JSON_PARSE_TO_FAIL("+0.0");
  207. EXPECT_JSON_PARSE_TO_FAIL("+0.00");
  208. EXPECT_JSON_PARSE_TO_FAIL("+0e0");
  209. EXPECT_JSON_PARSE_TO_FAIL("+0e1");
  210. EXPECT_JSON_PARSE_TO_FAIL("+0e2");
  211. EXPECT_JSON_PARSE_TO_FAIL("+0e1000");
  212. EXPECT_JSON_PARSE_TO_FAIL("+0e-1000");
  213. EXPECT_JSON_PARSE_TO_FAIL("+10");
  214. EXPECT_JSON_PARSE_TO_FAIL("+10e1");
  215. EXPECT_JSON_PARSE_TO_FAIL("+10.3");
  216. EXPECT_JSON_PARSE_TO_FAIL("+10.3e1");
  217. EXPECT_JSON_PARSE_TO_FAIL("0x1");
  218. EXPECT_JSON_PARSE_TO_FAIL("0x2");
  219. EXPECT_JSON_PARSE_TO_FAIL("0xA");
  220. EXPECT_JSON_PARSE_TO_FAIL("0xB");
  221. EXPECT_JSON_PARSE_TO_FAIL("0xF");
  222. EXPECT_JSON_PARSE_TO_FAIL("0Xf");
  223. EXPECT_JSON_PARSE_TO_FAIL("0X3");
  224. EXPECT_JSON_PARSE_TO_FAIL("10ee1");
  225. EXPECT_JSON_PARSE_TO_FAIL("1e1e1");
  226. // These could be valid within an array but not as the top level value
  227. EXPECT_JSON_PARSE_TO_FAIL("0,0");
  228. EXPECT_JSON_PARSE_TO_FAIL(",1");
  229. EXPECT_JSON_PARSE_TO_FAIL("10e1,");
  230. EXPECT_JSON_PARSE_TO_FAIL("10e,1");
  231. EXPECT_JSON_PARSE_TO_FAIL("10,e1");
  232. EXPECT_JSON_PARSE_TO_FAIL("1,0e1");
  233. EXPECT_JSON_PARSE_TO_FAIL(",10e1");
  234. #undef EXPECT_JSON_PARSE_TO_FAIL
  235. }
  236. struct CustomError {
  237. };
  238. template<typename T>
  239. class CustomErrorOr {
  240. public:
  241. CustomErrorOr(T)
  242. : m_is_error(false)
  243. {
  244. }
  245. CustomErrorOr(CustomError)
  246. : m_is_error(true)
  247. {
  248. }
  249. bool is_error() const { return m_is_error; }
  250. CustomError release_error() { return CustomError {}; }
  251. T release_value() { return T {}; }
  252. private:
  253. bool m_is_error { false };
  254. };
  255. TEST_CASE(fallible_json_object_for_each)
  256. {
  257. DeprecatedString raw_json = R"(
  258. {
  259. "name": "anon",
  260. "home": "/home/anon",
  261. "default_browser": "Ladybird"
  262. })";
  263. auto json = JsonValue::from_string(raw_json).value();
  264. auto const& object = json.as_object();
  265. MUST(object.try_for_each_member([](auto const&, auto const&) -> ErrorOr<void> {
  266. return {};
  267. }));
  268. auto result1 = object.try_for_each_member([](auto const&, auto const&) -> ErrorOr<void> {
  269. return Error::from_string_view("nanananana"sv);
  270. });
  271. EXPECT(result1.is_error());
  272. EXPECT_EQ(result1.error().string_literal(), "nanananana"sv);
  273. auto result2 = object.try_for_each_member([](auto const&, auto const&) -> ErrorOr<void, CustomError> {
  274. return CustomError {};
  275. });
  276. EXPECT(result2.is_error());
  277. EXPECT((IsSame<decltype(result2.release_error()), CustomError>));
  278. auto result3 = object.try_for_each_member([](auto const&, auto const&) -> CustomErrorOr<int> {
  279. return 42;
  280. });
  281. EXPECT(!result3.is_error());
  282. auto result4 = object.try_for_each_member([](auto const&, auto const&) -> CustomErrorOr<int> {
  283. return CustomError {};
  284. });
  285. EXPECT(result4.is_error());
  286. EXPECT((IsSame<decltype(result4.release_error()), CustomError>));
  287. }
  288. TEST_CASE(fallible_json_array_for_each)
  289. {
  290. DeprecatedString raw_json = R"(
  291. [
  292. "anon",
  293. "/home/anon",
  294. "Ladybird"
  295. ])";
  296. auto json = JsonValue::from_string(raw_json).value();
  297. auto const& array = json.as_array();
  298. MUST(array.try_for_each([](auto const&) -> ErrorOr<void> {
  299. return {};
  300. }));
  301. auto result1 = array.try_for_each([](auto const&) -> ErrorOr<void> {
  302. return Error::from_string_view("nanananana"sv);
  303. });
  304. EXPECT(result1.is_error());
  305. EXPECT_EQ(result1.error().string_literal(), "nanananana"sv);
  306. auto result2 = array.try_for_each([](auto const&) -> ErrorOr<void, CustomError> {
  307. return CustomError {};
  308. });
  309. EXPECT(result2.is_error());
  310. EXPECT((IsSame<decltype(result2.release_error()), CustomError>));
  311. auto result3 = array.try_for_each([](auto const&) -> CustomErrorOr<int> {
  312. return 42;
  313. });
  314. EXPECT(!result3.is_error());
  315. auto result4 = array.try_for_each([](auto const&) -> CustomErrorOr<int> {
  316. return CustomError {};
  317. });
  318. EXPECT(result4.is_error());
  319. EXPECT((IsSame<decltype(result4.release_error()), CustomError>));
  320. }
  321. TEST_CASE(json_value_as_integer)
  322. {
  323. // is_integer() should validate based on the value, not the underlying type.
  324. JsonValue value_int { static_cast<int>(42) };
  325. JsonValue value_unsigned { static_cast<unsigned>(42) };
  326. JsonValue value_long { static_cast<long>(42) };
  327. JsonValue value_long_unsigned { static_cast<long unsigned>(42) };
  328. JsonValue value_long_long { static_cast<long long>(42) };
  329. JsonValue value_long_long_unsigned { static_cast<long long unsigned>(42) };
  330. auto check_is_valid_for_all_types = [](JsonValue& value) {
  331. EXPECT(value.is_integer<u8>());
  332. EXPECT_EQ(value.as_integer<u8>(), static_cast<u8>(42));
  333. EXPECT(value.is_integer<u16>());
  334. EXPECT_EQ(value.as_integer<u16>(), static_cast<u16>(42));
  335. EXPECT(value.is_integer<u32>());
  336. EXPECT_EQ(value.as_integer<u32>(), static_cast<u32>(42));
  337. EXPECT(value.is_integer<u64>());
  338. EXPECT_EQ(value.as_integer<u64>(), static_cast<u64>(42));
  339. EXPECT(value.is_integer<i8>());
  340. EXPECT_EQ(value.as_integer<i8>(), static_cast<i8>(42));
  341. EXPECT(value.is_integer<i16>());
  342. EXPECT_EQ(value.as_integer<i16>(), static_cast<i16>(42));
  343. EXPECT(value.is_integer<i32>());
  344. EXPECT_EQ(value.as_integer<i32>(), static_cast<i32>(42));
  345. EXPECT(value.is_integer<i64>());
  346. EXPECT_EQ(value.as_integer<i64>(), static_cast<i64>(42));
  347. };
  348. check_is_valid_for_all_types(value_int);
  349. check_is_valid_for_all_types(value_unsigned);
  350. check_is_valid_for_all_types(value_long);
  351. check_is_valid_for_all_types(value_long_unsigned);
  352. check_is_valid_for_all_types(value_long_long);
  353. check_is_valid_for_all_types(value_long_long_unsigned);
  354. // Negative values should only fit in signed types.
  355. JsonValue negative_value { -42 };
  356. EXPECT(!negative_value.is_integer<u8>());
  357. EXPECT(!negative_value.is_integer<u16>());
  358. EXPECT(!negative_value.is_integer<u32>());
  359. EXPECT(!negative_value.is_integer<u64>());
  360. EXPECT(negative_value.is_integer<i8>());
  361. EXPECT(negative_value.is_integer<i16>());
  362. EXPECT(negative_value.is_integer<i32>());
  363. EXPECT(negative_value.is_integer<i64>());
  364. // 64-bit only
  365. JsonValue very_large_value { INT64_MAX };
  366. EXPECT(!very_large_value.is_integer<u8>());
  367. EXPECT(!very_large_value.is_integer<u16>());
  368. EXPECT(!very_large_value.is_integer<u32>());
  369. EXPECT(very_large_value.is_integer<u64>());
  370. EXPECT(!very_large_value.is_integer<i8>());
  371. EXPECT(!very_large_value.is_integer<i16>());
  372. EXPECT(!very_large_value.is_integer<i32>());
  373. EXPECT(very_large_value.is_integer<i64>());
  374. }