valuetest.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. #include "unittest.h"
  2. #include "rapidjson/document.h"
  3. using namespace rapidjson;
  4. TEST(Value, default_constructor) {
  5. Value x;
  6. EXPECT_EQ(kNullType, x.GetType());
  7. EXPECT_TRUE(x.IsNull());
  8. //std::cout << "sizeof(Value): " << sizeof(x) << std::endl;
  9. }
  10. // Should not pass compilation
  11. //TEST(Value, copy_constructor) {
  12. // Value x(1234);
  13. // Value y = x;
  14. //}
  15. TEST(Value, assignment_operator) {
  16. Value x(1234);
  17. Value y;
  18. y = x;
  19. EXPECT_TRUE(x.IsNull()); // move semantic
  20. EXPECT_EQ(1234, y.GetInt());
  21. }
  22. TEST(Value, Null) {
  23. // Default constructor
  24. Value x;
  25. EXPECT_EQ(kNullType, x.GetType());
  26. EXPECT_TRUE(x.IsNull());
  27. EXPECT_FALSE(x.IsTrue());
  28. EXPECT_FALSE(x.IsFalse());
  29. EXPECT_FALSE(x.IsNumber());
  30. EXPECT_FALSE(x.IsString());
  31. EXPECT_FALSE(x.IsObject());
  32. EXPECT_FALSE(x.IsArray());
  33. // Constructor with type
  34. Value y(kNullType);
  35. EXPECT_TRUE(y.IsNull());
  36. // SetNull();
  37. Value z(true);
  38. z.SetNull();
  39. EXPECT_TRUE(z.IsNull());
  40. }
  41. TEST(Value, True) {
  42. // Constructor with bool
  43. Value x(true);
  44. EXPECT_EQ(kTrueType, x.GetType());
  45. EXPECT_TRUE(x.GetBool());
  46. EXPECT_TRUE(x.IsBool());
  47. EXPECT_TRUE(x.IsTrue());
  48. EXPECT_FALSE(x.IsNull());
  49. EXPECT_FALSE(x.IsFalse());
  50. EXPECT_FALSE(x.IsNumber());
  51. EXPECT_FALSE(x.IsString());
  52. EXPECT_FALSE(x.IsObject());
  53. EXPECT_FALSE(x.IsArray());
  54. // Constructor with type
  55. Value y(kTrueType);
  56. EXPECT_TRUE(y.IsTrue());
  57. // SetBool()
  58. Value z;
  59. z.SetBool(true);
  60. EXPECT_TRUE(z.IsTrue());
  61. }
  62. TEST(Value, False) {
  63. // Constructor with bool
  64. Value x(false);
  65. EXPECT_EQ(kFalseType, x.GetType());
  66. EXPECT_TRUE(x.IsBool());
  67. EXPECT_TRUE(x.IsFalse());
  68. EXPECT_FALSE(x.IsNull());
  69. EXPECT_FALSE(x.IsTrue());
  70. EXPECT_FALSE(x.GetBool());
  71. //EXPECT_FALSE((bool)x);
  72. EXPECT_FALSE(x.IsNumber());
  73. EXPECT_FALSE(x.IsString());
  74. EXPECT_FALSE(x.IsObject());
  75. EXPECT_FALSE(x.IsArray());
  76. // Constructor with type
  77. Value y(kFalseType);
  78. EXPECT_TRUE(y.IsFalse());
  79. // SetBool()
  80. Value z;
  81. z.SetBool(false);
  82. EXPECT_TRUE(z.IsFalse());
  83. }
  84. TEST(Value, Int) {
  85. // Constructor with int
  86. Value x(1234);
  87. EXPECT_EQ(kNumberType, x.GetType());
  88. EXPECT_EQ(1234, x.GetInt());
  89. EXPECT_EQ(1234u, x.GetUint());
  90. EXPECT_EQ(1234, x.GetInt64());
  91. EXPECT_EQ(1234u, x.GetUint64());
  92. EXPECT_EQ(1234, x.GetDouble());
  93. //EXPECT_EQ(1234, (int)x);
  94. //EXPECT_EQ(1234, (unsigned)x);
  95. //EXPECT_EQ(1234, (int64_t)x);
  96. //EXPECT_EQ(1234, (uint64_t)x);
  97. //EXPECT_EQ(1234, (double)x);
  98. EXPECT_TRUE(x.IsNumber());
  99. EXPECT_TRUE(x.IsInt());
  100. EXPECT_TRUE(x.IsUint());
  101. EXPECT_TRUE(x.IsInt64());
  102. EXPECT_TRUE(x.IsUint64());
  103. EXPECT_FALSE(x.IsDouble());
  104. EXPECT_FALSE(x.IsNull());
  105. EXPECT_FALSE(x.IsBool());
  106. EXPECT_FALSE(x.IsFalse());
  107. EXPECT_FALSE(x.IsTrue());
  108. EXPECT_FALSE(x.IsString());
  109. EXPECT_FALSE(x.IsObject());
  110. EXPECT_FALSE(x.IsArray());
  111. Value nx(-1234);
  112. EXPECT_EQ(-1234, nx.GetInt());
  113. EXPECT_EQ(-1234, nx.GetInt64());
  114. EXPECT_TRUE(nx.IsInt());
  115. EXPECT_TRUE(nx.IsInt64());
  116. EXPECT_FALSE(nx.IsUint());
  117. EXPECT_FALSE(nx.IsUint64());
  118. // Constructor with type
  119. Value y(kNumberType);
  120. EXPECT_TRUE(y.IsNumber());
  121. EXPECT_TRUE(y.IsInt());
  122. EXPECT_EQ(0, y.GetInt());
  123. // SetInt()
  124. Value z;
  125. z.SetInt(1234);
  126. EXPECT_EQ(1234, z.GetInt());
  127. // operator=(int)
  128. z = 5678;
  129. EXPECT_EQ(5678, z.GetInt());
  130. }
  131. TEST(Value, Uint) {
  132. // Constructor with int
  133. Value x(1234u);
  134. EXPECT_EQ(kNumberType, x.GetType());
  135. EXPECT_EQ(1234, x.GetInt());
  136. EXPECT_EQ(1234u, x.GetUint());
  137. EXPECT_EQ(1234, x.GetInt64());
  138. EXPECT_EQ(1234u, x.GetUint64());
  139. EXPECT_TRUE(x.IsNumber());
  140. EXPECT_TRUE(x.IsInt());
  141. EXPECT_TRUE(x.IsUint());
  142. EXPECT_TRUE(x.IsInt64());
  143. EXPECT_TRUE(x.IsUint64());
  144. EXPECT_EQ(1234.0, x.GetDouble()); // Number can always be cast as double but !IsDouble().
  145. EXPECT_FALSE(x.IsDouble());
  146. EXPECT_FALSE(x.IsNull());
  147. EXPECT_FALSE(x.IsBool());
  148. EXPECT_FALSE(x.IsFalse());
  149. EXPECT_FALSE(x.IsTrue());
  150. EXPECT_FALSE(x.IsString());
  151. EXPECT_FALSE(x.IsObject());
  152. EXPECT_FALSE(x.IsArray());
  153. // SetUint()
  154. Value z;
  155. z.SetUint(1234);
  156. EXPECT_EQ(1234u, z.GetUint());
  157. // operator=(unsigned)
  158. z = 5678u;
  159. EXPECT_EQ(5678u, z.GetUint());
  160. z = 2147483648u; // 2^31, cannot cast as int
  161. EXPECT_EQ(2147483648u, z.GetUint());
  162. EXPECT_FALSE(z.IsInt());
  163. EXPECT_TRUE(z.IsInt64()); // Issue 41: Incorrect parsing of unsigned int number types
  164. }
  165. TEST(Value, Int64) {
  166. // Constructor with int
  167. Value x(int64_t(1234LL));
  168. EXPECT_EQ(kNumberType, x.GetType());
  169. EXPECT_EQ(1234, x.GetInt());
  170. EXPECT_EQ(1234u, x.GetUint());
  171. EXPECT_EQ(1234, x.GetInt64());
  172. EXPECT_EQ(1234u, x.GetUint64());
  173. EXPECT_TRUE(x.IsNumber());
  174. EXPECT_TRUE(x.IsInt());
  175. EXPECT_TRUE(x.IsUint());
  176. EXPECT_TRUE(x.IsInt64());
  177. EXPECT_TRUE(x.IsUint64());
  178. EXPECT_FALSE(x.IsDouble());
  179. EXPECT_FALSE(x.IsNull());
  180. EXPECT_FALSE(x.IsBool());
  181. EXPECT_FALSE(x.IsFalse());
  182. EXPECT_FALSE(x.IsTrue());
  183. EXPECT_FALSE(x.IsString());
  184. EXPECT_FALSE(x.IsObject());
  185. EXPECT_FALSE(x.IsArray());
  186. Value nx(int64_t(-1234LL));
  187. EXPECT_EQ(-1234, nx.GetInt());
  188. EXPECT_EQ(-1234, nx.GetInt64());
  189. EXPECT_TRUE(nx.IsInt());
  190. EXPECT_TRUE(nx.IsInt64());
  191. EXPECT_FALSE(nx.IsUint());
  192. EXPECT_FALSE(nx.IsUint64());
  193. // SetInt64()
  194. Value z;
  195. z.SetInt64(1234);
  196. EXPECT_EQ(1234, z.GetInt64());
  197. z.SetInt64(2147483648LL); // 2^31, cannot cast as int
  198. EXPECT_FALSE(z.IsInt());
  199. EXPECT_TRUE(z.IsUint());
  200. z.SetInt64(4294967296LL); // 2^32, cannot cast as uint
  201. EXPECT_FALSE(z.IsInt());
  202. EXPECT_FALSE(z.IsUint());
  203. }
  204. TEST(Value, Uint64) {
  205. // Constructor with int
  206. Value x(uint64_t(1234LL));
  207. EXPECT_EQ(kNumberType, x.GetType());
  208. EXPECT_EQ(1234, x.GetInt());
  209. EXPECT_EQ(1234u, x.GetUint());
  210. EXPECT_EQ(1234, x.GetInt64());
  211. EXPECT_EQ(1234u, x.GetUint64());
  212. EXPECT_TRUE(x.IsNumber());
  213. EXPECT_TRUE(x.IsInt());
  214. EXPECT_TRUE(x.IsUint());
  215. EXPECT_TRUE(x.IsInt64());
  216. EXPECT_TRUE(x.IsUint64());
  217. EXPECT_FALSE(x.IsDouble());
  218. EXPECT_FALSE(x.IsNull());
  219. EXPECT_FALSE(x.IsBool());
  220. EXPECT_FALSE(x.IsFalse());
  221. EXPECT_FALSE(x.IsTrue());
  222. EXPECT_FALSE(x.IsString());
  223. EXPECT_FALSE(x.IsObject());
  224. EXPECT_FALSE(x.IsArray());
  225. // SetUint64()
  226. Value z;
  227. z.SetUint64(1234);
  228. EXPECT_EQ(1234u, z.GetUint64());
  229. z.SetUint64(2147483648LL); // 2^31, cannot cast as int
  230. EXPECT_FALSE(z.IsInt());
  231. EXPECT_TRUE(z.IsUint());
  232. EXPECT_TRUE(z.IsInt64());
  233. z.SetUint64(4294967296LL); // 2^32, cannot cast as uint
  234. EXPECT_FALSE(z.IsInt());
  235. EXPECT_FALSE(z.IsUint());
  236. EXPECT_TRUE(z.IsInt64());
  237. z.SetUint64(9223372036854775808uLL); // 2^63 cannot cast as int64
  238. EXPECT_FALSE(z.IsInt64());
  239. // Issue 48
  240. EXPECT_EQ(9223372036854775808uLL, z.GetUint64());
  241. }
  242. TEST(Value, Double) {
  243. // Constructor with double
  244. Value x(12.34);
  245. EXPECT_EQ(kNumberType, x.GetType());
  246. EXPECT_EQ(12.34, x.GetDouble());
  247. EXPECT_TRUE(x.IsNumber());
  248. EXPECT_TRUE(x.IsDouble());
  249. EXPECT_FALSE(x.IsInt());
  250. EXPECT_FALSE(x.IsNull());
  251. EXPECT_FALSE(x.IsBool());
  252. EXPECT_FALSE(x.IsFalse());
  253. EXPECT_FALSE(x.IsTrue());
  254. EXPECT_FALSE(x.IsString());
  255. EXPECT_FALSE(x.IsObject());
  256. EXPECT_FALSE(x.IsArray());
  257. // SetDouble()
  258. Value z;
  259. z.SetDouble(12.34);
  260. EXPECT_EQ(12.34, z.GetDouble());
  261. z = 56.78;
  262. EXPECT_EQ(56.78, z.GetDouble());
  263. }
  264. TEST(Value, String) {
  265. // Constructor with const string
  266. Value x("Hello", 5);
  267. EXPECT_EQ(kStringType, x.GetType());
  268. EXPECT_TRUE(x.IsString());
  269. EXPECT_STREQ("Hello", x.GetString());
  270. EXPECT_EQ(5u, x.GetStringLength());
  271. EXPECT_FALSE(x.IsNumber());
  272. EXPECT_FALSE(x.IsNull());
  273. EXPECT_FALSE(x.IsBool());
  274. EXPECT_FALSE(x.IsFalse());
  275. EXPECT_FALSE(x.IsTrue());
  276. EXPECT_FALSE(x.IsObject());
  277. EXPECT_FALSE(x.IsArray());
  278. // Constructor with copy string
  279. MemoryPoolAllocator<> allocator;
  280. Value c(x.GetString(), x.GetStringLength(), allocator);
  281. //x.SetString("World");
  282. x.SetString("World", 5);
  283. EXPECT_STREQ("Hello", c.GetString());
  284. EXPECT_EQ(5u, c.GetStringLength());
  285. // Constructor with type
  286. Value y(kStringType);
  287. EXPECT_TRUE(y.IsString());
  288. EXPECT_EQ(0, y.GetString());
  289. EXPECT_EQ(0u, y.GetStringLength());
  290. // SetConsttring()
  291. Value z;
  292. //z.SetString("Hello");
  293. z.SetString("Hello", 5);
  294. EXPECT_STREQ("Hello", z.GetString());
  295. EXPECT_EQ(5u, z.GetStringLength());
  296. // SetString()
  297. char s[] = "World";
  298. Value w;
  299. w.SetString(s, (SizeType)strlen(s), allocator);
  300. s[0] = '\0';
  301. EXPECT_STREQ("World", w.GetString());
  302. EXPECT_EQ(5u, w.GetStringLength());
  303. }
  304. TEST(Value, Array) {
  305. Value x(kArrayType);
  306. const Value& y = x;
  307. Value::AllocatorType allocator;
  308. EXPECT_EQ(kArrayType, x.GetType());
  309. EXPECT_TRUE(x.IsArray());
  310. EXPECT_TRUE(x.Empty());
  311. EXPECT_EQ(0u, x.Size());
  312. EXPECT_TRUE(y.IsArray());
  313. EXPECT_TRUE(y.Empty());
  314. EXPECT_EQ(0u, y.Size());
  315. EXPECT_FALSE(x.IsNull());
  316. EXPECT_FALSE(x.IsBool());
  317. EXPECT_FALSE(x.IsFalse());
  318. EXPECT_FALSE(x.IsTrue());
  319. EXPECT_FALSE(x.IsString());
  320. EXPECT_FALSE(x.IsObject());
  321. // PushBack()
  322. Value v;
  323. x.PushBack(v, allocator);
  324. v.SetBool(true);
  325. x.PushBack(v, allocator);
  326. v.SetBool(false);
  327. x.PushBack(v, allocator);
  328. v.SetInt(123);
  329. x.PushBack(v, allocator);
  330. EXPECT_FALSE(x.Empty());
  331. EXPECT_EQ(4u, x.Size());
  332. EXPECT_FALSE(y.Empty());
  333. EXPECT_EQ(4u, y.Size());
  334. EXPECT_TRUE(x[SizeType(0)].IsNull());
  335. EXPECT_TRUE(x[1u].IsTrue());
  336. EXPECT_TRUE(x[2u].IsFalse());
  337. EXPECT_TRUE(x[3u].IsInt());
  338. EXPECT_EQ(123, x[3u].GetInt());
  339. EXPECT_TRUE(y[SizeType(0)].IsNull());
  340. EXPECT_TRUE(y[1u].IsTrue());
  341. EXPECT_TRUE(y[2u].IsFalse());
  342. EXPECT_TRUE(y[3u].IsInt());
  343. EXPECT_EQ(123, y[3u].GetInt());
  344. // iterator
  345. Value::ValueIterator itr = x.Begin();
  346. EXPECT_TRUE(itr != x.End());
  347. EXPECT_TRUE(itr->IsNull());
  348. ++itr;
  349. EXPECT_TRUE(itr != x.End());
  350. EXPECT_TRUE(itr->IsTrue());
  351. ++itr;
  352. EXPECT_TRUE(itr != x.End());
  353. EXPECT_TRUE(itr->IsFalse());
  354. ++itr;
  355. EXPECT_TRUE(itr != x.End());
  356. EXPECT_TRUE(itr->IsInt());
  357. EXPECT_EQ(123, itr->GetInt());
  358. // const iterator
  359. Value::ConstValueIterator citr = y.Begin();
  360. EXPECT_TRUE(citr != y.End());
  361. EXPECT_TRUE(citr->IsNull());
  362. ++citr;
  363. EXPECT_TRUE(citr != y.End());
  364. EXPECT_TRUE(citr->IsTrue());
  365. ++citr;
  366. EXPECT_TRUE(citr != y.End());
  367. EXPECT_TRUE(citr->IsFalse());
  368. ++citr;
  369. EXPECT_TRUE(citr != y.End());
  370. EXPECT_TRUE(citr->IsInt());
  371. EXPECT_EQ(123, citr->GetInt());
  372. // PopBack()
  373. x.PopBack();
  374. EXPECT_EQ(3u, x.Size());
  375. EXPECT_TRUE(y[SizeType(0)].IsNull());
  376. EXPECT_TRUE(y[1].IsTrue());
  377. EXPECT_TRUE(y[2].IsFalse());
  378. // Clear()
  379. x.Clear();
  380. EXPECT_TRUE(x.Empty());
  381. EXPECT_EQ(0u, x.Size());
  382. EXPECT_TRUE(y.Empty());
  383. EXPECT_EQ(0u, y.Size());
  384. // SetArray()
  385. Value z;
  386. z.SetArray();
  387. EXPECT_TRUE(z.IsArray());
  388. EXPECT_TRUE(z.Empty());
  389. }
  390. TEST(Value, Object) {
  391. Value x(kObjectType);
  392. const Value& y = x; // const version
  393. Value::AllocatorType allocator;
  394. EXPECT_EQ(kObjectType, x.GetType());
  395. EXPECT_TRUE(x.IsObject());
  396. EXPECT_EQ(kObjectType, y.GetType());
  397. EXPECT_TRUE(y.IsObject());
  398. // AddMember()
  399. Value name("A", 1);
  400. Value value("Apple", 5);
  401. x.AddMember(name, value, allocator);
  402. //name.SetString("B");
  403. name.SetString("B", 1);
  404. //value.SetString("Banana");
  405. value.SetString("Banana", 6);
  406. x.AddMember(name, value, allocator);
  407. // HasMember()
  408. EXPECT_TRUE(x.HasMember("A"));
  409. EXPECT_TRUE(x.HasMember("B"));
  410. EXPECT_TRUE(y.HasMember("A"));
  411. EXPECT_TRUE(y.HasMember("B"));
  412. // operator[]
  413. EXPECT_STREQ("Apple", x["A"].GetString());
  414. EXPECT_STREQ("Banana", x["B"].GetString());
  415. // const operator[]
  416. EXPECT_STREQ("Apple", y["A"].GetString());
  417. EXPECT_STREQ("Banana", y["B"].GetString());
  418. // member iterator
  419. Value::MemberIterator itr = x.MemberBegin();
  420. EXPECT_TRUE(itr != x.MemberEnd());
  421. EXPECT_STREQ("A", itr->name.GetString());
  422. EXPECT_STREQ("Apple", itr->value.GetString());
  423. ++itr;
  424. EXPECT_TRUE(itr != x.MemberEnd());
  425. EXPECT_STREQ("B", itr->name.GetString());
  426. EXPECT_STREQ("Banana", itr->value.GetString());
  427. ++itr;
  428. EXPECT_FALSE(itr != x.MemberEnd());
  429. // const member iterator
  430. Value::ConstMemberIterator citr = y.MemberBegin();
  431. EXPECT_TRUE(citr != y.MemberEnd());
  432. EXPECT_STREQ("A", citr->name.GetString());
  433. EXPECT_STREQ("Apple", citr->value.GetString());
  434. ++citr;
  435. EXPECT_TRUE(citr != y.MemberEnd());
  436. EXPECT_STREQ("B", citr->name.GetString());
  437. EXPECT_STREQ("Banana", citr->value.GetString());
  438. ++citr;
  439. EXPECT_FALSE(citr != y.MemberEnd());
  440. // RemoveMember()
  441. x.RemoveMember("A");
  442. EXPECT_FALSE(x.HasMember("A"));
  443. x.RemoveMember("B");
  444. EXPECT_FALSE(x.HasMember("B"));
  445. EXPECT_TRUE(x.MemberBegin() == x.MemberEnd());
  446. // SetObject()
  447. Value z;
  448. z.SetObject();
  449. EXPECT_TRUE(z.IsObject());
  450. }
  451. TEST(Value, BigNestedArray) {
  452. MemoryPoolAllocator<> allocator;
  453. Value x(kArrayType);
  454. static const SizeType n = 200;
  455. for (SizeType i = 0; i < n; i++) {
  456. Value y(kArrayType);
  457. for (SizeType j = 0; j < n; j++) {
  458. Value number((int)(i * n + j));
  459. y.PushBack(number, allocator);
  460. }
  461. x.PushBack(y, allocator);
  462. }
  463. for (SizeType i = 0; i < n; i++)
  464. for (SizeType j = 0; j < n; j++) {
  465. EXPECT_TRUE(x[i][j].IsInt());
  466. EXPECT_EQ((int)(i * n + j), x[i][j].GetInt());
  467. }
  468. }
  469. TEST(Value, BigNestedObject) {
  470. MemoryPoolAllocator<> allocator;
  471. Value x(kObjectType);
  472. static const SizeType n = 200;
  473. for (SizeType i = 0; i < n; i++) {
  474. char name1[10];
  475. sprintf(name1, "%d", i);
  476. Value name(name1, (SizeType)strlen(name1), allocator);
  477. Value object(kObjectType);
  478. for (SizeType j = 0; j < n; j++) {
  479. char name2[10];
  480. sprintf(name2, "%d", j);
  481. Value name(name2, (SizeType)strlen(name2), allocator);
  482. Value number((int)(i * n + j));
  483. object.AddMember(name, number, allocator);
  484. }
  485. x.AddMember(name, object, allocator);
  486. }
  487. for (SizeType i = 0; i < n; i++) {
  488. char name1[10];
  489. sprintf(name1, "%d", i);
  490. for (SizeType j = 0; j < n; j++) {
  491. char name2[10];
  492. sprintf(name2, "%d", j);
  493. x[name1];
  494. EXPECT_EQ((int)(i * n + j), x[name1][name2].GetInt());
  495. }
  496. }
  497. }
  498. // Issue 18: Error removing last element of object
  499. // http://code.google.com/p/rapidjson/issues/detail?id=18
  500. TEST(Value, RemoveLastElement) {
  501. rapidjson::Document doc;
  502. rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();
  503. rapidjson::Value objVal(rapidjson::kObjectType);
  504. objVal.AddMember("var1", 123, allocator);
  505. objVal.AddMember("var2", "444", allocator);
  506. objVal.AddMember("var3", 555, allocator);
  507. EXPECT_TRUE(objVal.HasMember("var3"));
  508. objVal.RemoveMember("var3"); // Assertion here in r61
  509. EXPECT_FALSE(objVal.HasMember("var3"));
  510. }
  511. // Issue 38: Segmentation fault with CrtAllocator
  512. TEST(Document, CrtAllocator) {
  513. typedef GenericValue<UTF8<>, CrtAllocator> V;
  514. V::AllocatorType allocator;
  515. V o(kObjectType);
  516. o.AddMember("x", 1, allocator); // Should not call destructor on uninitialized name/value of newly allocated members.
  517. V a(kArrayType);
  518. a.PushBack(1, allocator); // Should not call destructor on uninitialized Value of newly allocated elements.
  519. }