TestJSON.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  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/ByteString.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. ByteString 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_byte_string("name"sv);
  38. EXPECT(name.has_value());
  39. EXPECT_EQ(name.value(), "Form1");
  40. auto widgets = form_json.as_object().get_array("widgets"sv);
  41. EXPECT(widgets.has_value());
  42. widgets->for_each([&](JsonValue const& widget_value) {
  43. auto& widget_object = widget_value.as_object();
  44. auto widget_class = widget_object.get_byte_string("class"sv).value();
  45. widget_object.for_each_member([&]([[maybe_unused]] auto& property_name, [[maybe_unused]] JsonValue const& property_value) {
  46. });
  47. });
  48. }
  49. TEST_CASE(json_empty_string)
  50. {
  51. auto json = JsonValue::from_string("\"\""sv).value();
  52. EXPECT_EQ(json.type(), JsonValue::Type::String);
  53. EXPECT_EQ(json.as_string().is_empty(), true);
  54. }
  55. TEST_CASE(json_string)
  56. {
  57. auto json = JsonValue::from_string("\"A\""sv).value();
  58. EXPECT_EQ(json.type(), JsonValue::Type::String);
  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().length(), size_t { 1 });
  67. EXPECT_EQ(json.as_string() == "A", true);
  68. }
  69. TEST_CASE(json_encoded_surrogates)
  70. {
  71. {
  72. auto json = JsonValue::from_string("\"\\uD83E\\uDD13\""sv).value();
  73. EXPECT_EQ(json.type(), JsonValue::Type::String);
  74. EXPECT_EQ(json.as_string().length(), 4u);
  75. EXPECT_EQ(json.as_string(), "🤓"sv);
  76. }
  77. {
  78. auto json = JsonValue::from_string("\"\\uD83E\""sv).value();
  79. EXPECT_EQ(json.type(), JsonValue::Type::String);
  80. EXPECT_EQ(json.as_string().length(), 3u);
  81. EXPECT_EQ(json.as_string(), "\xED\xA0\xBE"sv);
  82. }
  83. {
  84. auto json = JsonValue::from_string("\"\\uDD13\""sv).value();
  85. EXPECT_EQ(json.type(), JsonValue::Type::String);
  86. EXPECT_EQ(json.as_string().length(), 3u);
  87. EXPECT_EQ(json.as_string(), "\xED\xB4\x93"sv);
  88. }
  89. }
  90. /*
  91. FIXME: Parse JSON from a Utf8View
  92. TEST_CASE(json_utf8_multibyte)
  93. {
  94. auto json_or_error = JsonValue::from_string("\"š\"");
  95. EXPECT_EQ(json_or_error.is_error(), false);
  96. auto& json = json_or_error.value();
  97. EXPECT_EQ(json.type(), JsonValue::Type::String);
  98. EXPECT_EQ(json.as_string().length(), size_t { 2 });
  99. EXPECT_EQ(json.as_string() == "š", true);
  100. EXPECT_EQ(json.as_string() == "\xc5\xa1", true);
  101. }
  102. */
  103. TEST_CASE(json_64_bit_value)
  104. {
  105. auto big_value = 0x12345678aabbccddull;
  106. JsonValue big_json_value(big_value);
  107. EXPECT(big_json_value.is_integer<u64>());
  108. EXPECT_EQ(big_json_value.as_integer<u64>(), big_value);
  109. JsonValue big_json_value_copy = big_json_value;
  110. EXPECT(big_json_value.equals(big_json_value_copy));
  111. }
  112. TEST_CASE(json_duplicate_keys)
  113. {
  114. JsonObject json;
  115. json.set("test", "foo");
  116. json.set("test", "bar");
  117. json.set("test", "baz");
  118. EXPECT_EQ(json.to_byte_string(), "{\"test\":\"baz\"}");
  119. }
  120. TEST_CASE(json_u64_roundtrip)
  121. {
  122. auto big_value = 0xffffffffffffffffull;
  123. auto json = JsonValue(big_value).serialized<StringBuilder>();
  124. auto value = JsonValue::from_string(json);
  125. EXPECT_EQ_FORCE(value.is_error(), false);
  126. EXPECT_EQ(value.value().as_integer<u64>(), big_value);
  127. }
  128. TEST_CASE(json_parse_empty_string)
  129. {
  130. auto value = JsonValue::from_string(""sv);
  131. EXPECT_EQ(value.is_error(), true);
  132. }
  133. TEST_CASE(json_parse_long_decimals)
  134. {
  135. auto value = JsonValue::from_string("1644452550.6489999294281"sv);
  136. EXPECT_EQ(value.value().get_double_with_precision_loss(), 1644452550.6489999294281);
  137. }
  138. TEST_CASE(json_parse_number_with_exponent)
  139. {
  140. auto value_without_fraction = JsonValue::from_string("10e5"sv);
  141. EXPECT_EQ(value_without_fraction.value().get_double_with_precision_loss(), 1000000.0);
  142. auto value_with_fraction = JsonValue::from_string("10.5e5"sv);
  143. EXPECT_EQ(value_with_fraction.value().get_double_with_precision_loss(), 1050000.0);
  144. }
  145. TEST_CASE(json_parse_special_numbers)
  146. {
  147. #define EXPECT_TO_MATCH_NUMBER_BIT_WISE(string_input, double_input) \
  148. do { \
  149. auto value_or_error = JsonValue::from_string(string_input##sv); \
  150. VERIFY(!value_or_error.is_error()); \
  151. if (value_or_error.is_error()) \
  152. dbgln("got {}", value_or_error.error()); \
  153. auto value = value_or_error.release_value(); \
  154. EXPECT(value.is_number()); \
  155. auto value_as_double = value.get_double_with_precision_loss().value(); \
  156. EXPECT_EQ(bit_cast<u64>(value_as_double), bit_cast<u64>(static_cast<double>(double_input))); \
  157. } while (false)
  158. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-0", -0.);
  159. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-0.0", -0.0);
  160. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-0.00", -0.00);
  161. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-0e0", -0e0);
  162. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-0e1", -0e1);
  163. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-0e2", -0e2);
  164. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-0e1000", -0e1000);
  165. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-0e-1000", -0e-1000);
  166. EXPECT_TO_MATCH_NUMBER_BIT_WISE("0", 0.);
  167. EXPECT_TO_MATCH_NUMBER_BIT_WISE("0.0", 0.0);
  168. EXPECT_TO_MATCH_NUMBER_BIT_WISE("0.00", 0.00);
  169. EXPECT_TO_MATCH_NUMBER_BIT_WISE("0e0", 0e0);
  170. EXPECT_TO_MATCH_NUMBER_BIT_WISE("0e1", 0e1);
  171. EXPECT_TO_MATCH_NUMBER_BIT_WISE("0e2", 0e2);
  172. EXPECT_TO_MATCH_NUMBER_BIT_WISE("0e1000", 0e1000);
  173. EXPECT_TO_MATCH_NUMBER_BIT_WISE("0e-1000", 0e-1000);
  174. // These technically can be non zero, but not in doubles
  175. EXPECT_TO_MATCH_NUMBER_BIT_WISE("-1e-2000", -0.);
  176. EXPECT_TO_MATCH_NUMBER_BIT_WISE("1e-2000", 0.);
  177. #undef EXPECT_TO_MATCH_NUMBER_BIT_WISE
  178. }
  179. TEST_CASE(json_parse_fails_on_invalid_number)
  180. {
  181. #define EXPECT_JSON_PARSE_TO_FAIL(value) \
  182. EXPECT(JsonValue::from_string(value##sv).is_error());
  183. EXPECT_JSON_PARSE_TO_FAIL("-");
  184. EXPECT_JSON_PARSE_TO_FAIL("00");
  185. EXPECT_JSON_PARSE_TO_FAIL("01");
  186. EXPECT_JSON_PARSE_TO_FAIL("-01");
  187. EXPECT_JSON_PARSE_TO_FAIL(".1");
  188. EXPECT_JSON_PARSE_TO_FAIL("-.1");
  189. EXPECT_JSON_PARSE_TO_FAIL("-,1");
  190. EXPECT_JSON_PARSE_TO_FAIL(".1e1");
  191. EXPECT_JSON_PARSE_TO_FAIL(".1e-1");
  192. EXPECT_JSON_PARSE_TO_FAIL("-.1e1");
  193. EXPECT_JSON_PARSE_TO_FAIL("-.1e-1");
  194. EXPECT_JSON_PARSE_TO_FAIL("1.e1");
  195. EXPECT_JSON_PARSE_TO_FAIL("1.e-1");
  196. EXPECT_JSON_PARSE_TO_FAIL("-1.e1");
  197. EXPECT_JSON_PARSE_TO_FAIL("-1.e-1");
  198. EXPECT_JSON_PARSE_TO_FAIL("1e");
  199. EXPECT_JSON_PARSE_TO_FAIL("1e+");
  200. EXPECT_JSON_PARSE_TO_FAIL("1e-");
  201. EXPECT_JSON_PARSE_TO_FAIL("1e-f");
  202. EXPECT_JSON_PARSE_TO_FAIL("1.e");
  203. EXPECT_JSON_PARSE_TO_FAIL("1.e+");
  204. EXPECT_JSON_PARSE_TO_FAIL("1.e-");
  205. EXPECT_JSON_PARSE_TO_FAIL("1.e-f");
  206. EXPECT_JSON_PARSE_TO_FAIL("1p2");
  207. EXPECT_JSON_PARSE_TO_FAIL("1.p2");
  208. EXPECT_JSON_PARSE_TO_FAIL("0x1.0p2");
  209. EXPECT_JSON_PARSE_TO_FAIL("0x1");
  210. EXPECT_JSON_PARSE_TO_FAIL("0x7");
  211. EXPECT_JSON_PARSE_TO_FAIL("0xA");
  212. EXPECT_JSON_PARSE_TO_FAIL("0x");
  213. EXPECT_JSON_PARSE_TO_FAIL("-0x");
  214. EXPECT_JSON_PARSE_TO_FAIL("0x");
  215. EXPECT_JSON_PARSE_TO_FAIL("1x");
  216. EXPECT_JSON_PARSE_TO_FAIL("100x");
  217. EXPECT_JSON_PARSE_TO_FAIL("1000000000000000000000x");
  218. EXPECT_JSON_PARSE_TO_FAIL("0e2x");
  219. EXPECT_JSON_PARSE_TO_FAIL("0.1e2x");
  220. EXPECT_JSON_PARSE_TO_FAIL("0.1x");
  221. EXPECT_JSON_PARSE_TO_FAIL("1e2x");
  222. EXPECT_JSON_PARSE_TO_FAIL("1.2x");
  223. EXPECT_JSON_PARSE_TO_FAIL("1.2e2x");
  224. EXPECT_JSON_PARSE_TO_FAIL(".0");
  225. EXPECT_JSON_PARSE_TO_FAIL(".e1");
  226. EXPECT_JSON_PARSE_TO_FAIL("-.0");
  227. EXPECT_JSON_PARSE_TO_FAIL("-.e1");
  228. EXPECT_JSON_PARSE_TO_FAIL("+0");
  229. EXPECT_JSON_PARSE_TO_FAIL("+0.0");
  230. EXPECT_JSON_PARSE_TO_FAIL("+0.00");
  231. EXPECT_JSON_PARSE_TO_FAIL("+0e0");
  232. EXPECT_JSON_PARSE_TO_FAIL("+0e1");
  233. EXPECT_JSON_PARSE_TO_FAIL("+0e2");
  234. EXPECT_JSON_PARSE_TO_FAIL("+0e1000");
  235. EXPECT_JSON_PARSE_TO_FAIL("+0e-1000");
  236. EXPECT_JSON_PARSE_TO_FAIL("+10");
  237. EXPECT_JSON_PARSE_TO_FAIL("+10e1");
  238. EXPECT_JSON_PARSE_TO_FAIL("+10.3");
  239. EXPECT_JSON_PARSE_TO_FAIL("+10.3e1");
  240. EXPECT_JSON_PARSE_TO_FAIL("0x1");
  241. EXPECT_JSON_PARSE_TO_FAIL("0x2");
  242. EXPECT_JSON_PARSE_TO_FAIL("0xA");
  243. EXPECT_JSON_PARSE_TO_FAIL("0xB");
  244. EXPECT_JSON_PARSE_TO_FAIL("0xF");
  245. EXPECT_JSON_PARSE_TO_FAIL("0Xf");
  246. EXPECT_JSON_PARSE_TO_FAIL("0X3");
  247. EXPECT_JSON_PARSE_TO_FAIL("10ee1");
  248. EXPECT_JSON_PARSE_TO_FAIL("1e1e1");
  249. // These could be valid within an array but not as the top level value
  250. EXPECT_JSON_PARSE_TO_FAIL("0,0");
  251. EXPECT_JSON_PARSE_TO_FAIL(",1");
  252. EXPECT_JSON_PARSE_TO_FAIL("10e1,");
  253. EXPECT_JSON_PARSE_TO_FAIL("10e,1");
  254. EXPECT_JSON_PARSE_TO_FAIL("10,e1");
  255. EXPECT_JSON_PARSE_TO_FAIL("1,0e1");
  256. EXPECT_JSON_PARSE_TO_FAIL(",10e1");
  257. #undef EXPECT_JSON_PARSE_TO_FAIL
  258. }
  259. struct CustomError {
  260. };
  261. template<typename T>
  262. class CustomErrorOr {
  263. public:
  264. CustomErrorOr(T)
  265. : m_is_error(false)
  266. {
  267. }
  268. CustomErrorOr(CustomError)
  269. : m_is_error(true)
  270. {
  271. }
  272. bool is_error() const { return m_is_error; }
  273. CustomError release_error() { return CustomError {}; }
  274. T release_value() { return T {}; }
  275. private:
  276. bool m_is_error { false };
  277. };
  278. TEST_CASE(fallible_json_object_for_each)
  279. {
  280. ByteString raw_json = R"(
  281. {
  282. "name": "anon",
  283. "home": "/home/anon",
  284. "default_browser": "Ladybird"
  285. })";
  286. auto json = JsonValue::from_string(raw_json).value();
  287. auto const& object = json.as_object();
  288. MUST(object.try_for_each_member([](auto const&, auto const&) -> ErrorOr<void> {
  289. return {};
  290. }));
  291. auto result1 = object.try_for_each_member([](auto const&, auto const&) -> ErrorOr<void> {
  292. return Error::from_string_literal("nanananana");
  293. });
  294. EXPECT(result1.is_error());
  295. EXPECT_EQ(result1.error().string_literal(), "nanananana"sv);
  296. auto result2 = object.try_for_each_member([](auto const&, auto const&) -> ErrorOr<void, CustomError> {
  297. return CustomError {};
  298. });
  299. EXPECT(result2.is_error());
  300. EXPECT((IsSame<decltype(result2.release_error()), CustomError>));
  301. auto result3 = object.try_for_each_member([](auto const&, auto const&) -> CustomErrorOr<int> {
  302. return 42;
  303. });
  304. EXPECT(!result3.is_error());
  305. auto result4 = object.try_for_each_member([](auto const&, auto const&) -> CustomErrorOr<int> {
  306. return CustomError {};
  307. });
  308. EXPECT(result4.is_error());
  309. EXPECT((IsSame<decltype(result4.release_error()), CustomError>));
  310. }
  311. TEST_CASE(fallible_json_array_for_each)
  312. {
  313. ByteString raw_json = R"(
  314. [
  315. "anon",
  316. "/home/anon",
  317. "Ladybird"
  318. ])";
  319. auto json = JsonValue::from_string(raw_json).value();
  320. auto const& array = json.as_array();
  321. MUST(array.try_for_each([](auto const&) -> ErrorOr<void> {
  322. return {};
  323. }));
  324. auto result1 = array.try_for_each([](auto const&) -> ErrorOr<void> {
  325. return Error::from_string_literal("nanananana");
  326. });
  327. EXPECT(result1.is_error());
  328. EXPECT_EQ(result1.error().string_literal(), "nanananana"sv);
  329. auto result2 = array.try_for_each([](auto const&) -> ErrorOr<void, CustomError> {
  330. return CustomError {};
  331. });
  332. EXPECT(result2.is_error());
  333. EXPECT((IsSame<decltype(result2.release_error()), CustomError>));
  334. auto result3 = array.try_for_each([](auto const&) -> CustomErrorOr<int> {
  335. return 42;
  336. });
  337. EXPECT(!result3.is_error());
  338. auto result4 = array.try_for_each([](auto const&) -> CustomErrorOr<int> {
  339. return CustomError {};
  340. });
  341. EXPECT(result4.is_error());
  342. EXPECT((IsSame<decltype(result4.release_error()), CustomError>));
  343. }
  344. TEST_CASE(json_array_is_empty)
  345. {
  346. auto raw_json = "[]"sv;
  347. auto json_value = MUST(JsonValue::from_string(raw_json));
  348. auto array = json_value.as_array();
  349. EXPECT(array.is_empty());
  350. raw_json = "[1, 2]"sv;
  351. json_value = MUST(JsonValue::from_string(raw_json));
  352. array = json_value.as_array();
  353. EXPECT(!array.is_empty());
  354. }
  355. static JsonArray setup_json_array()
  356. {
  357. auto raw_json = R"([1, 2, "WHF", 802.11, 16])"sv;
  358. auto json_value = MUST(JsonValue::from_string(raw_json));
  359. return json_value.as_array();
  360. }
  361. TEST_CASE(json_array_size)
  362. {
  363. auto array = setup_json_array();
  364. EXPECT_EQ(array.size(), size_t { 5 });
  365. auto empty_json_arr_sv = "[]"sv;
  366. array = MUST(JsonValue::from_string(empty_json_arr_sv)).as_array();
  367. EXPECT_EQ(array.size(), size_t { 0 });
  368. }
  369. TEST_CASE(json_array_at)
  370. {
  371. auto array = setup_json_array();
  372. auto const& element = array.at(1);
  373. EXPECT_EQ(element.as_integer<u8>(), 2);
  374. }
  375. TEST_CASE(json_array_subscript_operator)
  376. {
  377. auto array = setup_json_array();
  378. auto const& element = array[1];
  379. EXPECT_EQ(element.as_integer<u8>(), 2);
  380. }
  381. TEST_CASE(json_array_take)
  382. {
  383. auto array = setup_json_array();
  384. auto const& element = array.take(2);
  385. EXPECT_EQ(array.size(), size_t { 4 });
  386. EXPECT_EQ(element.as_string(), "WHF");
  387. }
  388. TEST_CASE(json_array_must_append)
  389. {
  390. auto array = setup_json_array();
  391. array.must_append(MUST(JsonValue::from_string("32"sv)));
  392. EXPECT_EQ(array.size(), size_t { 6 });
  393. EXPECT_EQ(array.at(array.size() - 1).as_integer<u8>(), 32);
  394. }
  395. TEST_CASE(json_array_try_append)
  396. {
  397. auto array = setup_json_array();
  398. MUST(array.append(MUST(JsonValue::from_string("32"sv))));
  399. EXPECT_EQ(array.size(), size_t { 6 });
  400. EXPECT_EQ(array.at(array.size() - 1).as_integer<u8>(), 32);
  401. }
  402. TEST_CASE(json_array_clear)
  403. {
  404. auto array = setup_json_array();
  405. array.clear();
  406. EXPECT(array.is_empty());
  407. }
  408. TEST_CASE(json_array_set)
  409. {
  410. auto array = setup_json_array();
  411. array.set(1, MUST(JsonValue::from_string("-32"sv)));
  412. EXPECT_EQ(array.size(), size_t { 5 });
  413. EXPECT_EQ(array.at(1).as_integer<i8>(), -32);
  414. }
  415. TEST_CASE(json_array_ensure_capacity)
  416. {
  417. auto array = setup_json_array();
  418. size_t new_capacity { 16 };
  419. array.ensure_capacity(new_capacity);
  420. EXPECT_EQ(array.values().capacity(), new_capacity);
  421. }
  422. TEST_CASE(json_array_for_each)
  423. {
  424. auto raw_json = "[1, 2, 3, 4]"sv;
  425. auto json_value = MUST(JsonValue::from_string(raw_json));
  426. auto array = json_value.as_array();
  427. size_t count { 0 };
  428. array.for_each([&count](JsonValue const& value) {
  429. EXPECT_EQ(value.as_integer<u8>(), ++count);
  430. });
  431. EXPECT_EQ(array.size(), count);
  432. }
  433. TEST_CASE(json_array_serialized)
  434. {
  435. auto raw_json = R"(["Hello",2,3.14,4,"World"])"sv;
  436. auto json_value = MUST(JsonValue::from_string(raw_json));
  437. auto array = json_value.as_array();
  438. auto const& serialized_json = array.serialized<StringBuilder>();
  439. EXPECT_EQ(serialized_json, raw_json);
  440. }
  441. TEST_CASE(json_array_serialize)
  442. {
  443. auto raw_json = R"(["Hello",2,3.14,4,"World"])"sv;
  444. auto json_value = MUST(JsonValue::from_string(raw_json));
  445. auto array = json_value.as_array();
  446. StringBuilder builder {};
  447. array.serialize(builder);
  448. EXPECT_EQ(builder.to_byte_string(), raw_json);
  449. }
  450. TEST_CASE(json_array_values)
  451. {
  452. auto raw_json = "[1, 2, 3, 4]"sv;
  453. auto json_value = MUST(JsonValue::from_string(raw_json));
  454. auto array = json_value.as_array();
  455. auto const& values = array.values();
  456. EXPECT_EQ(values.size(), size_t { 4 });
  457. for (size_t i = 0; i < values.size(); i++)
  458. EXPECT_EQ(array.at(i).as_integer<u8>(), i + 1);
  459. }
  460. TEST_CASE(json_value_as_integer)
  461. {
  462. // is_integer() should validate based on the value, not the underlying type.
  463. JsonValue value_int { static_cast<int>(42) };
  464. JsonValue value_unsigned { static_cast<unsigned>(42) };
  465. JsonValue value_long { static_cast<long>(42) };
  466. JsonValue value_long_unsigned { static_cast<long unsigned>(42) };
  467. JsonValue value_long_long { static_cast<long long>(42) };
  468. JsonValue value_long_long_unsigned { static_cast<long long unsigned>(42) };
  469. auto check_is_valid_for_all_types = [](JsonValue& value) {
  470. EXPECT(value.is_integer<u8>());
  471. EXPECT_EQ(value.as_integer<u8>(), static_cast<u8>(42));
  472. EXPECT(value.is_integer<u16>());
  473. EXPECT_EQ(value.as_integer<u16>(), static_cast<u16>(42));
  474. EXPECT(value.is_integer<u32>());
  475. EXPECT_EQ(value.as_integer<u32>(), static_cast<u32>(42));
  476. EXPECT(value.is_integer<u64>());
  477. EXPECT_EQ(value.as_integer<u64>(), static_cast<u64>(42));
  478. EXPECT(value.is_integer<i8>());
  479. EXPECT_EQ(value.as_integer<i8>(), static_cast<i8>(42));
  480. EXPECT(value.is_integer<i16>());
  481. EXPECT_EQ(value.as_integer<i16>(), static_cast<i16>(42));
  482. EXPECT(value.is_integer<i32>());
  483. EXPECT_EQ(value.as_integer<i32>(), static_cast<i32>(42));
  484. EXPECT(value.is_integer<i64>());
  485. EXPECT_EQ(value.as_integer<i64>(), static_cast<i64>(42));
  486. };
  487. check_is_valid_for_all_types(value_int);
  488. check_is_valid_for_all_types(value_unsigned);
  489. check_is_valid_for_all_types(value_long);
  490. check_is_valid_for_all_types(value_long_unsigned);
  491. check_is_valid_for_all_types(value_long_long);
  492. check_is_valid_for_all_types(value_long_long_unsigned);
  493. // Negative values should only fit in signed types.
  494. JsonValue negative_value { -42 };
  495. EXPECT(!negative_value.is_integer<u8>());
  496. EXPECT(!negative_value.is_integer<u16>());
  497. EXPECT(!negative_value.is_integer<u32>());
  498. EXPECT(!negative_value.is_integer<u64>());
  499. EXPECT(negative_value.is_integer<i8>());
  500. EXPECT(negative_value.is_integer<i16>());
  501. EXPECT(negative_value.is_integer<i32>());
  502. EXPECT(negative_value.is_integer<i64>());
  503. // 64-bit only
  504. JsonValue very_large_value { INT64_MAX };
  505. EXPECT(!very_large_value.is_integer<u8>());
  506. EXPECT(!very_large_value.is_integer<u16>());
  507. EXPECT(!very_large_value.is_integer<u32>());
  508. EXPECT(very_large_value.is_integer<u64>());
  509. EXPECT(!very_large_value.is_integer<i8>());
  510. EXPECT(!very_large_value.is_integer<i16>());
  511. EXPECT(!very_large_value.is_integer<i32>());
  512. EXPECT(very_large_value.is_integer<i64>());
  513. }