json_value_ut.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  1. #include "json_value.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. #include <util/stream/input.h>
  4. using namespace NJson;
  5. Y_UNIT_TEST_SUITE(TJsonValueTest) {
  6. Y_UNIT_TEST(UndefTest) {
  7. TJsonValue undef;
  8. TJsonValue null(JSON_NULL);
  9. TJsonValue _false(false);
  10. TJsonValue zeroInt(0);
  11. TJsonValue zeroDouble(0.0);
  12. TJsonValue emptyStr("");
  13. TJsonValue emptyArray(JSON_ARRAY);
  14. TJsonValue emptyMap(JSON_MAP);
  15. UNIT_ASSERT(!undef.IsDefined());
  16. UNIT_ASSERT(!null.IsDefined()); // json NULL is undefined too!
  17. UNIT_ASSERT(_false.IsDefined());
  18. UNIT_ASSERT(zeroInt.IsDefined());
  19. UNIT_ASSERT(zeroDouble.IsDefined());
  20. UNIT_ASSERT(emptyStr.IsDefined());
  21. UNIT_ASSERT(emptyArray.IsDefined());
  22. UNIT_ASSERT(emptyMap.IsDefined());
  23. UNIT_ASSERT(undef == TJsonValue());
  24. UNIT_ASSERT(undef != null);
  25. UNIT_ASSERT(undef != _false);
  26. UNIT_ASSERT(undef != zeroInt);
  27. UNIT_ASSERT(undef != zeroDouble);
  28. UNIT_ASSERT(undef != emptyStr);
  29. UNIT_ASSERT(undef != emptyArray);
  30. UNIT_ASSERT(undef != emptyMap);
  31. }
  32. Y_UNIT_TEST(DefaultCompareTest) {
  33. {
  34. TJsonValue lhs;
  35. TJsonValue rhs;
  36. UNIT_ASSERT(lhs == rhs);
  37. UNIT_ASSERT(rhs == lhs);
  38. }
  39. {
  40. TJsonValue lhs;
  41. TJsonValue rhs(JSON_NULL);
  42. UNIT_ASSERT(lhs != rhs);
  43. UNIT_ASSERT(rhs != lhs);
  44. }
  45. }
  46. Y_UNIT_TEST(NullCompareTest) {
  47. TJsonValue lhs(JSON_NULL);
  48. TJsonValue rhs(JSON_NULL);
  49. UNIT_ASSERT(lhs == rhs);
  50. UNIT_ASSERT(rhs == lhs);
  51. }
  52. Y_UNIT_TEST(StringCompareTest) {
  53. {
  54. TJsonValue lhs(JSON_STRING);
  55. TJsonValue rhs(JSON_STRING);
  56. UNIT_ASSERT(lhs == rhs);
  57. UNIT_ASSERT(rhs == lhs);
  58. }
  59. {
  60. TJsonValue lhs("");
  61. TJsonValue rhs("");
  62. UNIT_ASSERT(lhs == rhs);
  63. UNIT_ASSERT(rhs == lhs);
  64. }
  65. {
  66. TJsonValue lhs("abc");
  67. TJsonValue rhs("abc");
  68. UNIT_ASSERT(lhs == rhs);
  69. UNIT_ASSERT(rhs == lhs);
  70. }
  71. {
  72. TJsonValue lhs("1");
  73. TJsonValue rhs(1);
  74. UNIT_ASSERT(lhs != rhs);
  75. UNIT_ASSERT(rhs != lhs);
  76. }
  77. }
  78. Y_UNIT_TEST(ArrayCompareTest) {
  79. {
  80. TJsonValue lhs(JSON_ARRAY);
  81. TJsonValue rhs(JSON_ARRAY);
  82. UNIT_ASSERT(lhs == rhs);
  83. UNIT_ASSERT(rhs == lhs);
  84. }
  85. {
  86. TJsonValue lhs;
  87. TJsonValue rhs;
  88. lhs.AppendValue(TJsonValue());
  89. UNIT_ASSERT(lhs != rhs);
  90. UNIT_ASSERT(rhs != lhs);
  91. }
  92. {
  93. TJsonValue lhs;
  94. TJsonValue rhs;
  95. lhs.AppendValue(1);
  96. lhs.AppendValue("2");
  97. lhs.AppendValue(3.0);
  98. lhs.AppendValue(TJsonValue());
  99. lhs.AppendValue(TJsonValue(JSON_NULL));
  100. rhs.AppendValue(1);
  101. rhs.AppendValue("2");
  102. rhs.AppendValue(3.0);
  103. rhs.AppendValue(TJsonValue());
  104. rhs.AppendValue(TJsonValue(JSON_NULL));
  105. UNIT_ASSERT(lhs == rhs);
  106. UNIT_ASSERT(rhs == lhs);
  107. }
  108. {
  109. TJsonValue lhs;
  110. TJsonValue rhs;
  111. lhs.AppendValue(1);
  112. rhs.AppendValue("1");
  113. UNIT_ASSERT(lhs != rhs);
  114. UNIT_ASSERT(rhs != lhs);
  115. }
  116. }
  117. Y_UNIT_TEST(CompareTest) {
  118. {
  119. TJsonValue lhs;
  120. lhs.InsertValue("null value", TJsonValue(JSON_NULL));
  121. lhs.InsertValue("int key", TJsonValue(10));
  122. lhs.InsertValue("double key", TJsonValue(11.11));
  123. lhs.InsertValue("string key", TJsonValue("string"));
  124. TJsonValue array;
  125. array.AppendValue(1);
  126. array.AppendValue(2);
  127. array.AppendValue(3);
  128. array.AppendValue("string");
  129. lhs.InsertValue("array", array);
  130. lhs.InsertValue("bool key", TJsonValue(true));
  131. TJsonValue rhs;
  132. rhs = lhs;
  133. UNIT_ASSERT(lhs == rhs);
  134. UNIT_ASSERT(rhs == lhs);
  135. }
  136. {
  137. // Insert keys in different orders
  138. const int NUM_KEYS = 1000;
  139. TJsonValue lhs;
  140. for (int i = 0; i < NUM_KEYS; ++i)
  141. lhs.InsertValue(ToString(i), i);
  142. TJsonValue rhs;
  143. for (int i = 0; i < NUM_KEYS; i += 2)
  144. rhs.InsertValue(ToString(i), i);
  145. for (int i = 1; i < NUM_KEYS; i += 2)
  146. rhs.InsertValue(ToString(i), i);
  147. UNIT_ASSERT(lhs == rhs);
  148. UNIT_ASSERT(rhs == lhs);
  149. }
  150. {
  151. TJsonValue lhs;
  152. lhs.InsertValue("null value", TJsonValue(JSON_NULL));
  153. lhs.InsertValue("int key", TJsonValue(10));
  154. lhs.InsertValue("double key", TJsonValue(11.11));
  155. lhs.InsertValue("string key", TJsonValue("string"));
  156. TJsonValue array;
  157. array.AppendValue(1);
  158. array.AppendValue(2);
  159. array.AppendValue(3);
  160. array.AppendValue("string");
  161. lhs.InsertValue("array", array);
  162. lhs.InsertValue("bool key", TJsonValue(true));
  163. TJsonValue rhs;
  164. rhs.InsertValue("null value", TJsonValue(JSON_NULL));
  165. rhs.InsertValue("int key", TJsonValue(10));
  166. rhs.InsertValue("double key", TJsonValue(11.11));
  167. rhs.InsertValue("string key", TJsonValue("string"));
  168. rhs.InsertValue("bool key", TJsonValue(true));
  169. UNIT_ASSERT(lhs != rhs);
  170. UNIT_ASSERT(rhs != lhs);
  171. }
  172. }
  173. Y_UNIT_TEST(SwapTest) {
  174. {
  175. TJsonValue lhs;
  176. lhs.InsertValue("a", "b");
  177. TJsonValue lhsCopy = lhs;
  178. TJsonValue rhs(JSON_NULL);
  179. TJsonValue rhsCopy = rhs;
  180. UNIT_ASSERT(lhs == lhsCopy);
  181. UNIT_ASSERT(rhs == rhsCopy);
  182. lhs.Swap(rhs);
  183. UNIT_ASSERT(rhs == lhsCopy);
  184. UNIT_ASSERT(lhs == rhsCopy);
  185. lhs.Swap(rhs);
  186. UNIT_ASSERT(lhs == lhsCopy);
  187. UNIT_ASSERT(rhs == rhsCopy);
  188. }
  189. }
  190. Y_UNIT_TEST(GetValueByPathTest) {
  191. {
  192. TJsonValue lhs;
  193. TJsonValue first;
  194. TJsonValue second;
  195. TJsonValue last;
  196. first.InsertValue("e", "f");
  197. second.InsertValue("c", first);
  198. last.InsertValue("a", second);
  199. lhs.InsertValue("l", last);
  200. TJsonValue result;
  201. UNIT_ASSERT(lhs.GetValueByPath("l/a/c/e", result, '/'));
  202. UNIT_ASSERT(result.GetStringRobust() == "f");
  203. UNIT_ASSERT(!lhs.GetValueByPath("l/a/c/se", result, '/'));
  204. UNIT_ASSERT(lhs.GetValueByPath("l/a/c", result, '/'));
  205. UNIT_ASSERT(result.GetStringRobust() == "{\"e\":\"f\"}");
  206. // faster TStringBuf version
  207. UNIT_ASSERT_EQUAL(*lhs.GetValueByPath("l", '/'), last);
  208. UNIT_ASSERT_EQUAL(*lhs.GetValueByPath("l/a", '/'), second);
  209. UNIT_ASSERT_EQUAL(*lhs.GetValueByPath("l/a/c", '/'), first);
  210. UNIT_ASSERT_EQUAL(*lhs.GetValueByPath("l.a.c.e", '.'), "f");
  211. UNIT_ASSERT_EQUAL(lhs.GetValueByPath("l/a/c/e/x", '/'), NULL);
  212. UNIT_ASSERT_EQUAL(lhs.GetValueByPath("a/c/e/x", '/'), NULL);
  213. UNIT_ASSERT_EQUAL(lhs.GetValueByPath("nokey", '/'), NULL);
  214. UNIT_ASSERT_EQUAL(*lhs.GetValueByPath("", '/'), lhs); // itself
  215. TJsonValue array;
  216. TJsonValue third;
  217. array[0] = first;
  218. array[1] = second;
  219. third["t"] = array;
  220. UNIT_ASSERT(array.GetValueByPath("[0].e", result));
  221. UNIT_ASSERT(result.GetStringRobust() == "f");
  222. UNIT_ASSERT(third.GetValueByPath("t.[0].e", result));
  223. UNIT_ASSERT(result.GetStringRobust() == "f");
  224. UNIT_ASSERT(third.GetValueByPath("t.[1].c.e", result));
  225. UNIT_ASSERT(result.GetStringRobust() == "f");
  226. UNIT_ASSERT(!third.GetValueByPath("t.[2]", result));
  227. UNIT_ASSERT(third.SetValueByPath("t.[2]", "g"));
  228. UNIT_ASSERT(third.GetValueByPath("t.[2]", result));
  229. UNIT_ASSERT(result.GetStringRobust() == "g");
  230. UNIT_ASSERT(lhs.SetValueByPath("l/a/c/se", "h", '/'));
  231. UNIT_ASSERT(lhs.GetValueByPath("l/a/c/se", result, '/'));
  232. UNIT_ASSERT(result.GetStringRobust() == "h");
  233. }
  234. }
  235. Y_UNIT_TEST(GetValueByPathConstTest) {
  236. TJsonValue lhs;
  237. TJsonValue first;
  238. TJsonValue second;
  239. TJsonValue last;
  240. first.InsertValue("e", "f");
  241. second.InsertValue("c", first);
  242. last.InsertValue("a", second);
  243. lhs.InsertValue("l", last);
  244. {
  245. const TJsonValue* result = lhs.GetValueByPath("l", '/');
  246. UNIT_ASSERT_EQUAL(*result, last);
  247. }
  248. {
  249. const TJsonValue* result = lhs.GetValueByPath("l/a", '/');
  250. UNIT_ASSERT_EQUAL(*result, second);
  251. }
  252. {
  253. const TJsonValue* result = lhs.GetValueByPath("l/a/c", '/');
  254. UNIT_ASSERT_EQUAL(*result, first);
  255. }
  256. {
  257. const TJsonValue* result = lhs.GetValueByPath("l.a.c.e", '.');
  258. UNIT_ASSERT_EQUAL(*result, "f");
  259. }
  260. {
  261. const TJsonValue* result = lhs.GetValueByPath("l/a/c/e/x", '/');
  262. UNIT_ASSERT_EQUAL(result, nullptr);
  263. }
  264. {
  265. const TJsonValue* result = lhs.GetValueByPath("a/c/e/x", '/');
  266. UNIT_ASSERT_EQUAL(result, nullptr);
  267. }
  268. {
  269. const TJsonValue* result = lhs.GetValueByPath("nokey", '/');
  270. UNIT_ASSERT_EQUAL(result, nullptr);
  271. }
  272. {
  273. const TJsonValue* result = lhs.GetValueByPath("", '/');
  274. UNIT_ASSERT_EQUAL(*result, lhs); // itself
  275. }
  276. TJsonValue array;
  277. TJsonValue third;
  278. array[0] = first;
  279. array[1] = second;
  280. third["t"] = array;
  281. UNIT_ASSERT(array.GetValueByPath("[0].e", '.')->GetStringRobust() == "f");
  282. UNIT_ASSERT(third.GetValueByPath("t.[0].e", '.')->GetStringRobust() == "f");
  283. UNIT_ASSERT(third.GetValueByPath("t.[1].c.e", '.')->GetStringRobust() == "f");
  284. }
  285. Y_UNIT_TEST(EraseValueFromArray) {
  286. {
  287. TJsonValue vec;
  288. vec.AppendValue(TJsonValue(0));
  289. vec.AppendValue(TJsonValue(1));
  290. vec.AppendValue(TJsonValue("2"));
  291. vec.AppendValue(TJsonValue("3.14"));
  292. TJsonValue vec1;
  293. vec1.AppendValue(TJsonValue(0));
  294. vec1.AppendValue(TJsonValue("2"));
  295. vec1.AppendValue(TJsonValue("3.14"));
  296. TJsonValue vec2;
  297. vec2.AppendValue(TJsonValue(0));
  298. vec2.AppendValue(TJsonValue("2"));
  299. TJsonValue vec3;
  300. vec3.AppendValue(TJsonValue("2"));
  301. TJsonValue vec4(JSON_ARRAY);
  302. UNIT_ASSERT(vec.IsArray());
  303. UNIT_ASSERT(vec.GetArray().size() == 4);
  304. vec.EraseValue(1);
  305. UNIT_ASSERT(vec.GetArray().size() == 3);
  306. UNIT_ASSERT(vec == vec1);
  307. vec.EraseValue(2);
  308. UNIT_ASSERT(vec.GetArray().size() == 2);
  309. UNIT_ASSERT(vec == vec2);
  310. vec.EraseValue(0);
  311. UNIT_ASSERT(vec.GetArray().size() == 1);
  312. UNIT_ASSERT(vec == vec3);
  313. vec.EraseValue(0);
  314. UNIT_ASSERT(vec.GetArray().size() == 0);
  315. UNIT_ASSERT(vec == vec4);
  316. }
  317. }
  318. Y_UNIT_TEST(NonConstMethodsTest) {
  319. {
  320. TJsonValue src;
  321. TJsonValue value1;
  322. value1.AppendValue(1);
  323. value1.AppendValue(2);
  324. src.InsertValue("key", value1);
  325. src.InsertValue("key1", "HI!");
  326. TJsonValue dst;
  327. TJsonValue value2;
  328. value2.AppendValue(1);
  329. value2.AppendValue(2);
  330. value2.AppendValue(3);
  331. dst.InsertValue("key", value2);
  332. src.GetValueByPath("key", '.')->AppendValue(3);
  333. src.EraseValue("key1");
  334. UNIT_ASSERT(src == dst);
  335. dst.GetValueByPath("key", '.')->EraseValue(0);
  336. UNIT_ASSERT(src != dst);
  337. src.GetValueByPath("key", '.')->EraseValue(0);
  338. UNIT_ASSERT(src == dst);
  339. }
  340. {
  341. TJsonValue src;
  342. TJsonValue value1;
  343. TJsonValue arr1;
  344. value1.InsertValue("key", "value");
  345. arr1.AppendValue(value1);
  346. arr1.AppendValue(value1);
  347. arr1.AppendValue(value1);
  348. src.InsertValue("arr", arr1);
  349. TJsonValue dst;
  350. TJsonValue value2;
  351. TJsonValue arr2;
  352. value2.InsertValue("key", "value");
  353. value2.InsertValue("yek", "eulav");
  354. arr2.AppendValue(value2);
  355. arr2.AppendValue(value2);
  356. arr2.AppendValue(value2);
  357. arr2.AppendValue(value2);
  358. dst.InsertValue("arr", arr2);
  359. src["arr"].AppendValue(value1);
  360. for (auto& node : src["arr"].GetArraySafe()) {
  361. node.InsertValue("yek", "eulav");
  362. }
  363. UNIT_ASSERT(src == dst);
  364. }
  365. {
  366. TJsonValue src;
  367. TJsonValue value1;
  368. TJsonValue arr1;
  369. value1.InsertValue("key", "value");
  370. arr1.AppendValue(value1);
  371. arr1.AppendValue(value1);
  372. arr1.AppendValue(value1);
  373. src.InsertValue("arr", arr1);
  374. TJsonValue dst;
  375. TJsonValue value2;
  376. TJsonValue arr2;
  377. value2.InsertValue("key", "value");
  378. value2.InsertValue("yek", "eulav");
  379. arr2.AppendValue(value2);
  380. arr2.AppendValue(value2);
  381. arr2.AppendValue(value2);
  382. arr2.AppendValue(value2);
  383. dst.InsertValue("arr", arr2);
  384. src["arr"].AppendValue(value1);
  385. for (auto& node : src.GetValueByPath("arr", '.')->GetArraySafe()) {
  386. node.InsertValue("yek", "eulav");
  387. }
  388. UNIT_ASSERT(src == dst);
  389. }
  390. {
  391. TJsonValue json;
  392. json.InsertValue("key", "value");
  393. try {
  394. json.GetArraySafe();
  395. UNIT_ASSERT(false);
  396. } catch (const TJsonException&) {
  397. }
  398. const TJsonValue constJson(json);
  399. try {
  400. constJson.GetArray();
  401. } catch (...) {
  402. UNIT_ASSERT(false);
  403. }
  404. }
  405. {
  406. // Check non-const GetArraySafe()
  407. TJsonValue json{JSON_ARRAY};
  408. json.GetArraySafe().push_back(TJsonValue{"foo"});
  409. TJsonValue expectedJson;
  410. expectedJson.AppendValue(TJsonValue{"foo"});
  411. UNIT_ASSERT(json == expectedJson);
  412. TJsonValue::TArray jsonArray = std::move(json.GetArraySafe());
  413. TJsonValue::TArray expectedArray = {TJsonValue{"foo"}};
  414. UNIT_ASSERT(jsonArray == expectedArray);
  415. }
  416. {
  417. // Check non-const GetMap()
  418. TJsonValue json{JSON_MAP};
  419. json.GetMapSafe()["foo"] = "bar";
  420. TJsonValue expectedJson;
  421. expectedJson.InsertValue("foo", "bar");
  422. UNIT_ASSERT(json == expectedJson);
  423. TJsonValue::TMapType jsonMap = std::move(json.GetMapSafe());
  424. TJsonValue::TMapType expectedMap = {{"foo", TJsonValue{"bar"}}};
  425. UNIT_ASSERT(jsonMap == expectedMap);
  426. }
  427. }
  428. Y_UNIT_TEST(NonexistentFieldAccessTest) {
  429. {
  430. TJsonValue json;
  431. json.InsertValue("some", "key");
  432. UNIT_ASSERT(!json["some"]["weird"]["access"]["sequence"].Has("value"));
  433. UNIT_ASSERT(!json["some"]["weird"]["access"]["sequence"].IsDefined());
  434. UNIT_ASSERT(json["some"].GetType() == JSON_MAP);
  435. }
  436. }
  437. Y_UNIT_TEST(DefaultValuesTest) {
  438. {
  439. TJsonValue json;
  440. json.InsertValue("some", "key");
  441. json.InsertValue("existing", 1.2);
  442. UNIT_ASSERT_VALUES_EQUAL(json["existing"].GetDoubleSafe(), 1.2);
  443. UNIT_ASSERT_VALUES_EQUAL(json["existing"].GetDoubleSafe(15), 1.2);
  444. UNIT_ASSERT_EXCEPTION(json["some"].GetUIntegerSafe(), yexception);
  445. UNIT_ASSERT_EXCEPTION(json["some"].GetUIntegerSafe(12), yexception);
  446. UNIT_ASSERT_EXCEPTION(json["nonexistent"].GetUIntegerSafe(), yexception);
  447. UNIT_ASSERT_VALUES_EQUAL(json["nonexistent"].GetUIntegerSafe(12), 12);
  448. UNIT_ASSERT_VALUES_EQUAL(json["nonexistent"]["more_nonexistent"].GetUIntegerSafe(12), 12);
  449. json.InsertValue("map", TJsonValue(JSON_MAP));
  450. UNIT_ASSERT_VALUES_EQUAL(json["map"]["nonexistent"].GetUIntegerSafe(12), 12);
  451. }
  452. }
  453. Y_UNIT_TEST(GetArrayPointerInArrayTest) {
  454. TJsonValue outer;
  455. {
  456. TJsonValue json;
  457. json.AppendValue(1);
  458. json.AppendValue(2);
  459. json.AppendValue(3);
  460. outer.AppendValue(json);
  461. }
  462. const TJsonValue::TArray* array = nullptr;
  463. GetArrayPointer(outer, 0, &array);
  464. UNIT_ASSERT_VALUES_EQUAL((*array)[1], 2);
  465. }
  466. Y_UNIT_TEST(GetArrayPointerInMapTest) {
  467. TJsonValue outer;
  468. {
  469. TJsonValue json;
  470. json.AppendValue(1);
  471. json.AppendValue(2);
  472. json.AppendValue(3);
  473. outer.InsertValue("x", json);
  474. }
  475. const TJsonValue::TArray* array = nullptr;
  476. GetArrayPointer(outer, "x", &array);
  477. UNIT_ASSERT_VALUES_EQUAL((*array)[1], 2);
  478. }
  479. Y_UNIT_TEST(GetMapPointerInArrayTest) {
  480. TJsonValue outer;
  481. {
  482. TJsonValue json;
  483. json.InsertValue("a", 1);
  484. json.InsertValue("b", 2);
  485. json.InsertValue("c", 3);
  486. outer.AppendValue(json);
  487. }
  488. const TJsonValue::TMapType* map = nullptr;
  489. GetMapPointer(outer, 0, &map);
  490. UNIT_ASSERT_VALUES_EQUAL((*map).at("b"), 2);
  491. }
  492. Y_UNIT_TEST(GetMapPointerInMapTest) {
  493. TJsonValue outer;
  494. {
  495. TJsonValue json;
  496. json.InsertValue("a", 1);
  497. json.InsertValue("b", 2);
  498. json.InsertValue("c", 3);
  499. outer.InsertValue("x", json);
  500. }
  501. const TJsonValue::TMapType* map = nullptr;
  502. GetMapPointer(outer, "x", &map);
  503. UNIT_ASSERT_VALUES_EQUAL((*map).at("b"), 2);
  504. }
  505. Y_UNIT_TEST(GetIntegerRobustBignumStringTest) {
  506. TString value = "1626862681464633683";
  507. TJsonValue json(value);
  508. UNIT_ASSERT_VALUES_EQUAL(json.GetUIntegerRobust(), FromString<ui64>(value));
  509. UNIT_ASSERT_VALUES_EQUAL(json.GetIntegerRobust(), FromString<i64>(value));
  510. }
  511. Y_UNIT_TEST(MoveSubpartToSelf) {
  512. TJsonValue json;
  513. json[0] = "testing 0";
  514. json[1] = "testing 1";
  515. json[2] = "testing 2";
  516. json = std::move(json[1]);
  517. UNIT_ASSERT_VALUES_EQUAL(json.GetString(), "testing 1");
  518. const char* longTestString =
  519. "Testing TJsonValue& operator=(TJsonValue&&) subpart self moving "
  520. "after TJsonValue was constrcuted from TString&&.";
  521. json["hello"] = TString{longTestString};
  522. json = std::move(json["hello"]);
  523. UNIT_ASSERT_VALUES_EQUAL(json.GetString(), longTestString);
  524. }
  525. Y_UNIT_TEST(TJsonArrayMapConstructor) {
  526. TJsonMap emptyMap;
  527. UNIT_ASSERT_VALUES_EQUAL(emptyMap.GetType(), JSON_MAP);
  528. UNIT_ASSERT_VALUES_EQUAL(emptyMap.GetMapSafe().size(), 0);
  529. TJsonArray emptyArray;
  530. UNIT_ASSERT_VALUES_EQUAL(emptyArray.GetType(), JSON_ARRAY);
  531. UNIT_ASSERT_VALUES_EQUAL(emptyArray.GetArraySafe().size(), 0);
  532. TJsonMap filled = {
  533. {"1", 1},
  534. {"2", "2"},
  535. {"3", TJsonArray{3}},
  536. {"4", TJsonMap{{"5", 5}}},
  537. };
  538. UNIT_ASSERT_VALUES_EQUAL(filled.GetType(), JSON_MAP);
  539. UNIT_ASSERT_VALUES_EQUAL(filled["1"], TJsonValue{1});
  540. UNIT_ASSERT_VALUES_EQUAL(filled["2"], TJsonValue{"2"});
  541. UNIT_ASSERT_VALUES_EQUAL(filled["3"].GetArraySafe().size(), 1);
  542. UNIT_ASSERT_VALUES_EQUAL(filled["3"][0], TJsonValue{3});
  543. UNIT_ASSERT_VALUES_EQUAL(filled["4"].GetMapSafe().size(), 1);
  544. UNIT_ASSERT_VALUES_EQUAL(filled["4"]["5"], TJsonValue{5});
  545. }
  546. } // TJsonValueTest