documenttest.cpp
Go to the documentation of this file.
1 // Tencent is pleased to support the open source community by making RapidJSON available.
2 //
3 // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
4 //
5 // Licensed under the MIT License (the "License"); you may not use this file except
6 // in compliance with the License. You may obtain a copy of the License at
7 //
8 // http://opensource.org/licenses/MIT
9 //
10 // Unless required by applicable law or agreed to in writing, software distributed
11 // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12 // CONDITIONS OF ANY KIND, either express or implied. See the License for the
13 // specific language governing permissions and limitations under the License.
14 
15 #include "unittest.h"
16 #include "rapidjson/document.h"
17 #include "rapidjson/writer.h"
20 #include "rapidjson/stringbuffer.h"
21 #include <sstream>
22 #include <algorithm>
23 
24 #ifdef __clang__
25 RAPIDJSON_DIAG_PUSH
26 RAPIDJSON_DIAG_OFF(c++98-compat)
27 RAPIDJSON_DIAG_OFF(missing-variable-declarations)
28 #endif
29 
30 using namespace rapidjson;
31 
32 template <typename DocumentType>
33 void ParseCheck(DocumentType& doc) {
34  typedef typename DocumentType::ValueType ValueType;
35 
36  EXPECT_FALSE(doc.HasParseError());
37  if (doc.HasParseError())
38  printf("Error: %d at %zu\n", static_cast<int>(doc.GetParseError()), doc.GetErrorOffset());
39  EXPECT_TRUE(static_cast<ParseResult>(doc));
40 
41  EXPECT_TRUE(doc.IsObject());
42 
43  EXPECT_TRUE(doc.HasMember("hello"));
44  const ValueType& hello = doc["hello"];
45  EXPECT_TRUE(hello.IsString());
46  EXPECT_STREQ("world", hello.GetString());
47 
48  EXPECT_TRUE(doc.HasMember("t"));
49  const ValueType& t = doc["t"];
50  EXPECT_TRUE(t.IsTrue());
51 
52  EXPECT_TRUE(doc.HasMember("f"));
53  const ValueType& f = doc["f"];
54  EXPECT_TRUE(f.IsFalse());
55 
56  EXPECT_TRUE(doc.HasMember("n"));
57  const ValueType& n = doc["n"];
58  EXPECT_TRUE(n.IsNull());
59 
60  EXPECT_TRUE(doc.HasMember("i"));
61  const ValueType& i = doc["i"];
62  EXPECT_TRUE(i.IsNumber());
63  EXPECT_EQ(123, i.GetInt());
64 
65  EXPECT_TRUE(doc.HasMember("pi"));
66  const ValueType& pi = doc["pi"];
67  EXPECT_TRUE(pi.IsNumber());
68  EXPECT_DOUBLE_EQ(3.1416, pi.GetDouble());
69 
70  EXPECT_TRUE(doc.HasMember("a"));
71  const ValueType& a = doc["a"];
72  EXPECT_TRUE(a.IsArray());
73  EXPECT_EQ(4u, a.Size());
74  for (SizeType j = 0; j < 4; j++)
75  EXPECT_EQ(j + 1, a[j].GetUint());
76 }
77 
78 template <typename Allocator, typename StackAllocator>
79 void ParseTest() {
80  typedef GenericDocument<UTF8<>, Allocator, StackAllocator> DocumentType;
81  DocumentType doc;
82 
83  const char* json = " { \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3, 4] } ";
84 
85  doc.Parse(json);
86  ParseCheck(doc);
87 
88  doc.SetNull();
89  StringStream s(json);
90  doc.template ParseStream<0>(s);
91  ParseCheck(doc);
92 
93  doc.SetNull();
94  char *buffer = strdup(json);
95  doc.ParseInsitu(buffer);
96  ParseCheck(doc);
97  free(buffer);
98 
99  // Parse(const Ch*, size_t)
100  size_t length = strlen(json);
101  buffer = reinterpret_cast<char*>(malloc(length * 2));
102  memcpy(buffer, json, length);
103  memset(buffer + length, 'X', length);
104 #if RAPIDJSON_HAS_STDSTRING
105  std::string s2(buffer, length); // backup buffer
106 #endif
107  doc.SetNull();
108  doc.Parse(buffer, length);
109  free(buffer);
110  ParseCheck(doc);
111 
112 #if RAPIDJSON_HAS_STDSTRING
113  // Parse(std::string)
114  doc.SetNull();
115  doc.Parse(s2);
116  ParseCheck(doc);
117 #endif
118 }
119 
120 TEST(Document, Parse) {
121  ParseTest<MemoryPoolAllocator<>, CrtAllocator>();
122  ParseTest<MemoryPoolAllocator<>, MemoryPoolAllocator<> >();
123  ParseTest<CrtAllocator, MemoryPoolAllocator<> >();
124  ParseTest<CrtAllocator, CrtAllocator>();
125 }
126 
127 TEST(Document, UnchangedOnParseError) {
128  Document doc;
129  doc.SetArray().PushBack(0, doc.GetAllocator());
130 
131  ParseResult noError;
132  EXPECT_TRUE(noError);
133 
134  ParseResult err = doc.Parse("{]");
135  EXPECT_TRUE(doc.HasParseError());
136  EXPECT_NE(err, noError);
137  EXPECT_NE(err.Code(), noError);
138  EXPECT_NE(noError, doc.GetParseError());
139  EXPECT_EQ(err.Code(), doc.GetParseError());
140  EXPECT_EQ(err.Offset(), doc.GetErrorOffset());
141  EXPECT_TRUE(doc.IsArray());
142  EXPECT_EQ(doc.Size(), 1u);
143 
144  err = doc.Parse("{}");
145  EXPECT_FALSE(doc.HasParseError());
146  EXPECT_FALSE(err.IsError());
147  EXPECT_TRUE(err);
148  EXPECT_EQ(err, noError);
149  EXPECT_EQ(err.Code(), noError);
150  EXPECT_EQ(err.Code(), doc.GetParseError());
151  EXPECT_EQ(err.Offset(), doc.GetErrorOffset());
152  EXPECT_TRUE(doc.IsObject());
153  EXPECT_EQ(doc.MemberCount(), 0u);
154 }
155 
156 static FILE* OpenEncodedFile(const char* filename) {
157  const char *paths[] = {
158  "encodings",
159  "bin/encodings",
160  "../bin/encodings",
161  "../../bin/encodings",
162  "../../../bin/encodings"
163  };
164  char buffer[1024];
165  for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) {
166  sprintf(buffer, "%s/%s", paths[i], filename);
167  FILE *fp = fopen(buffer, "rb");
168  if (fp)
169  return fp;
170  }
171  return 0;
172 }
173 
174 TEST(Document, Parse_Encoding) {
175  const char* json = " { \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3, 4] } ";
176 
177  typedef GenericDocument<UTF16<> > DocumentType;
178  DocumentType doc;
179 
180  // Parse<unsigned, SourceEncoding>(const SourceEncoding::Ch*)
181  // doc.Parse<kParseDefaultFlags, UTF8<> >(json);
182  // EXPECT_FALSE(doc.HasParseError());
183  // EXPECT_EQ(0, StrCmp(doc[L"hello"].GetString(), L"world"));
184 
185  // Parse<unsigned, SourceEncoding>(const SourceEncoding::Ch*, size_t)
186  size_t length = strlen(json);
187  char* buffer = reinterpret_cast<char*>(malloc(length * 2));
188  memcpy(buffer, json, length);
189  memset(buffer + length, 'X', length);
190 #if RAPIDJSON_HAS_STDSTRING
191  std::string s2(buffer, length); // backup buffer
192 #endif
193  doc.SetNull();
194  doc.Parse<kParseDefaultFlags, UTF8<> >(buffer, length);
195  free(buffer);
196  EXPECT_FALSE(doc.HasParseError());
197  if (doc.HasParseError())
198  printf("Error: %d at %zu\n", static_cast<int>(doc.GetParseError()), doc.GetErrorOffset());
199  EXPECT_EQ(0, StrCmp(doc[L"hello"].GetString(), L"world"));
200 
201 #if RAPIDJSON_HAS_STDSTRING
202  // Parse<unsigned, SourceEncoding>(std::string)
203  doc.SetNull();
204 
205 #if defined(_MSC_VER) && _MSC_VER < 1800
206  doc.Parse<kParseDefaultFlags, UTF8<> >(s2.c_str()); // VS2010 or below cannot handle templated function overloading. Use const char* instead.
207 #else
208  doc.Parse<kParseDefaultFlags, UTF8<> >(s2);
209 #endif
210  EXPECT_FALSE(doc.HasParseError());
211  EXPECT_EQ(0, StrCmp(doc[L"hello"].GetString(), L"world"));
212 #endif
213 }
214 
215 TEST(Document, ParseStream_EncodedInputStream) {
216  // UTF8 -> UTF16
217  FILE* fp = OpenEncodedFile("utf8.json");
218  char buffer[256];
219  FileReadStream bis(fp, buffer, sizeof(buffer));
221 
223  d.ParseStream<0, UTF8<> >(eis);
224  EXPECT_FALSE(d.HasParseError());
225 
226  fclose(fp);
227 
228  wchar_t expected[] = L"I can eat glass and it doesn't hurt me.";
229  GenericValue<UTF16<> >& v = d[L"en"];
230  EXPECT_TRUE(v.IsString());
231  EXPECT_EQ(sizeof(expected) / sizeof(wchar_t) - 1, v.GetStringLength());
232  EXPECT_EQ(0, StrCmp(expected, v.GetString()));
233 
234  // UTF16 -> UTF8 in memory
235  StringBuffer bos;
236  typedef EncodedOutputStream<UTF8<>, StringBuffer> OutputStream;
237  OutputStream eos(bos, false); // Not writing BOM
238  {
239  Writer<OutputStream, UTF16<>, UTF8<> > writer(eos);
240  d.Accept(writer);
241  }
242 
243  // Condense the original file and compare.
244  fp = OpenEncodedFile("utf8.json");
245  FileReadStream is(fp, buffer, sizeof(buffer));
246  Reader reader;
247  StringBuffer bos2;
248  Writer<StringBuffer> writer2(bos2);
249  reader.Parse(is, writer2);
250  fclose(fp);
251 
252  EXPECT_EQ(bos.GetSize(), bos2.GetSize());
253  EXPECT_EQ(0, memcmp(bos.GetString(), bos2.GetString(), bos2.GetSize()));
254 }
255 
256 TEST(Document, ParseStream_AutoUTFInputStream) {
257  // Any -> UTF8
258  FILE* fp = OpenEncodedFile("utf32be.json");
259  char buffer[256];
260  FileReadStream bis(fp, buffer, sizeof(buffer));
262 
263  Document d;
264  d.ParseStream<0, AutoUTF<unsigned> >(eis);
265  EXPECT_FALSE(d.HasParseError());
266 
267  fclose(fp);
268 
269  char expected[] = "I can eat glass and it doesn't hurt me.";
270  Value& v = d["en"];
271  EXPECT_TRUE(v.IsString());
272  EXPECT_EQ(sizeof(expected) - 1, v.GetStringLength());
273  EXPECT_EQ(0, StrCmp(expected, v.GetString()));
274 
275  // UTF8 -> UTF8 in memory
276  StringBuffer bos;
277  Writer<StringBuffer> writer(bos);
278  d.Accept(writer);
279 
280  // Condense the original file and compare.
281  fp = OpenEncodedFile("utf8.json");
282  FileReadStream is(fp, buffer, sizeof(buffer));
283  Reader reader;
284  StringBuffer bos2;
285  Writer<StringBuffer> writer2(bos2);
286  reader.Parse(is, writer2);
287  fclose(fp);
288 
289  EXPECT_EQ(bos.GetSize(), bos2.GetSize());
290  EXPECT_EQ(0, memcmp(bos.GetString(), bos2.GetString(), bos2.GetSize()));
291 }
292 
294  Document d1;
296 
297  d1.SetArray().PushBack(1, a).PushBack(2, a);
298 
299  Value o;
300  o.SetObject().AddMember("a", 1, a);
301 
302  // Swap between Document and Value
303  d1.Swap(o);
304  EXPECT_TRUE(d1.IsObject());
305  EXPECT_TRUE(o.IsArray());
306 
307  d1.Swap(o);
308  EXPECT_TRUE(d1.IsArray());
309  EXPECT_TRUE(o.IsObject());
310 
311  o.Swap(d1);
312  EXPECT_TRUE(d1.IsObject());
313  EXPECT_TRUE(o.IsArray());
314 
315  // Swap between Document and Document
316  Document d2;
317  d2.SetArray().PushBack(3, a);
318  d1.Swap(d2);
319  EXPECT_TRUE(d1.IsArray());
320  EXPECT_TRUE(d2.IsObject());
321  EXPECT_EQ(&d2.GetAllocator(), &a);
322 
323  // reset value
324  Value().Swap(d1);
325  EXPECT_TRUE(d1.IsNull());
326 
327  // reset document, including allocator
328  Document().Swap(d2);
329  EXPECT_TRUE(d2.IsNull());
330  EXPECT_NE(&d2.GetAllocator(), &a);
331 
332  // testing std::swap compatibility
333  d1.SetBool(true);
334  using std::swap;
335  swap(d1, d2);
336  EXPECT_TRUE(d1.IsNull());
337  EXPECT_TRUE(d2.IsTrue());
338 
339  swap(o, d2);
340  EXPECT_TRUE(o.IsTrue());
341  EXPECT_TRUE(d2.IsArray());
342 }
343 
344 
345 // This should be slow due to assignment in inner-loop.
346 struct OutputStringStream : public std::ostringstream {
347  typedef char Ch;
348 
349  virtual ~OutputStringStream();
350 
351  void Put(char c) {
352  put(c);
353  }
354  void Flush() {}
355 };
356 
358 
359 TEST(Document, AcceptWriter) {
360  Document doc;
361  doc.Parse(" { \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3, 4] } ");
362 
364  Writer<OutputStringStream> writer(os);
365  doc.Accept(writer);
366 
367  EXPECT_EQ("{\"hello\":\"world\",\"t\":true,\"f\":false,\"n\":null,\"i\":123,\"pi\":3.1416,\"a\":[1,2,3,4]}", os.str());
368 }
369 
370 TEST(Document, UserBuffer) {
371  typedef GenericDocument<UTF8<>, MemoryPoolAllocator<>, MemoryPoolAllocator<> > DocumentType;
372  char valueBuffer[4096];
373  char parseBuffer[1024];
374  MemoryPoolAllocator<> valueAllocator(valueBuffer, sizeof(valueBuffer));
375  MemoryPoolAllocator<> parseAllocator(parseBuffer, sizeof(parseBuffer));
376  DocumentType doc(&valueAllocator, sizeof(parseBuffer) / 2, &parseAllocator);
377  doc.Parse(" { \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3, 4] } ");
378  EXPECT_FALSE(doc.HasParseError());
379  EXPECT_LE(valueAllocator.Size(), sizeof(valueBuffer));
380  EXPECT_LE(parseAllocator.Size(), sizeof(parseBuffer));
381 
382  // Cover MemoryPoolAllocator::Capacity()
383  EXPECT_LE(valueAllocator.Size(), valueAllocator.Capacity());
384  EXPECT_LE(parseAllocator.Size(), parseAllocator.Capacity());
385 }
386 
387 // Issue 226: Value of string type should not point to NULL
388 TEST(Document, AssertAcceptInvalidNameType) {
389  Document doc;
390  doc.SetObject();
391  doc.AddMember("a", 0, doc.GetAllocator());
392  doc.FindMember("a")->name.SetNull(); // Change name to non-string type.
393 
395  Writer<OutputStringStream> writer(os);
396  ASSERT_THROW(doc.Accept(writer), AssertException);
397 }
398 
399 // Issue 44: SetStringRaw doesn't work with wchar_t
400 TEST(Document, UTF16_Document) {
402  json.Parse<kParseValidateEncodingFlag>(L"[{\"created_at\":\"Wed Oct 30 17:13:20 +0000 2012\"}]");
403 
404  ASSERT_TRUE(json.IsArray());
405  GenericValue< UTF16<> >& v = json[0];
406  ASSERT_TRUE(v.IsObject());
407 
408  GenericValue< UTF16<> >& s = v[L"created_at"];
409  ASSERT_TRUE(s.IsString());
410 
411  EXPECT_EQ(0, memcmp(L"Wed Oct 30 17:13:20 +0000 2012", s.GetString(), (s.GetStringLength() + 1) * sizeof(wchar_t)));
412 }
413 
414 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
415 
416 #if 0 // Many old compiler does not support these. Turn it off temporaily.
417 
418 #include <type_traits>
419 
420 TEST(Document, Traits) {
421  static_assert(std::is_constructible<Document>::value, "");
423 #ifndef _MSC_VER
425 #endif
427 
430 #ifndef _MSC_VER
433 #endif
434 
436 #ifndef _MSC_VER
437  static_assert(!std::is_copy_assignable<Document>::value, "");
438 #endif
439  static_assert(std::is_move_assignable<Document>::value, "");
440 
441 #ifndef _MSC_VER
443 #endif
445 #ifndef _MSC_VER
447 #endif
448 
449  static_assert( std::is_destructible<Document>::value, "");
450 #ifndef _MSC_VER
452 #endif
453 }
454 
455 #endif
456 
457 template <typename Allocator>
458 struct DocumentMove: public ::testing::Test {
459 };
460 
461 typedef ::testing::Types< CrtAllocator, MemoryPoolAllocator<> > MoveAllocatorTypes;
462 TYPED_TEST_CASE(DocumentMove, MoveAllocatorTypes);
463 
464 TYPED_TEST(DocumentMove, MoveConstructor) {
465  typedef TypeParam Allocator;
466  typedef GenericDocument<UTF8<>, Allocator> D;
467  Allocator allocator;
468 
469  D a(&allocator);
470  a.Parse("[\"one\", \"two\", \"three\"]");
471  EXPECT_FALSE(a.HasParseError());
472  EXPECT_TRUE(a.IsArray());
473  EXPECT_EQ(3u, a.Size());
474  EXPECT_EQ(&a.GetAllocator(), &allocator);
475 
476  // Document b(a); // does not compile (!is_copy_constructible)
477  D b(std::move(a));
478  EXPECT_TRUE(a.IsNull());
479  EXPECT_TRUE(b.IsArray());
480  EXPECT_EQ(3u, b.Size());
481  EXPECT_THROW(a.GetAllocator(), AssertException);
482  EXPECT_EQ(&b.GetAllocator(), &allocator);
483 
484  b.Parse("{\"Foo\": \"Bar\", \"Baz\": 42}");
485  EXPECT_FALSE(b.HasParseError());
486  EXPECT_TRUE(b.IsObject());
487  EXPECT_EQ(2u, b.MemberCount());
488 
489  // Document c = a; // does not compile (!is_copy_constructible)
490  D c = std::move(b);
491  EXPECT_TRUE(b.IsNull());
492  EXPECT_TRUE(c.IsObject());
493  EXPECT_EQ(2u, c.MemberCount());
494  EXPECT_THROW(b.GetAllocator(), AssertException);
495  EXPECT_EQ(&c.GetAllocator(), &allocator);
496 }
497 
498 TYPED_TEST(DocumentMove, MoveConstructorParseError) {
499  typedef TypeParam Allocator;
500  typedef GenericDocument<UTF8<>, Allocator> D;
501 
502  ParseResult noError;
503  D a;
504  a.Parse("{ 4 = 4]");
505  ParseResult error(a.GetParseError(), a.GetErrorOffset());
506  EXPECT_TRUE(a.HasParseError());
507  EXPECT_NE(error, noError);
508  EXPECT_NE(error.Code(), noError);
509  EXPECT_NE(error.Code(), noError.Code());
510  EXPECT_NE(error.Offset(), noError.Offset());
511 
512  D b(std::move(a));
513  EXPECT_FALSE(a.HasParseError());
514  EXPECT_TRUE(b.HasParseError());
515  EXPECT_EQ(a.GetParseError(), noError);
516  EXPECT_EQ(a.GetParseError(), noError.Code());
517  EXPECT_EQ(a.GetErrorOffset(), noError.Offset());
518  EXPECT_EQ(b.GetParseError(), error);
519  EXPECT_EQ(b.GetParseError(), error.Code());
520  EXPECT_EQ(b.GetErrorOffset(), error.Offset());
521 
522  D c(std::move(b));
523  EXPECT_FALSE(b.HasParseError());
524  EXPECT_TRUE(c.HasParseError());
525  EXPECT_EQ(b.GetParseError(), noError.Code());
526  EXPECT_EQ(c.GetParseError(), error.Code());
527  EXPECT_EQ(b.GetErrorOffset(), noError.Offset());
528  EXPECT_EQ(c.GetErrorOffset(), error.Offset());
529 }
530 
531 // This test does not properly use parsing, just for testing.
532 // It must call ClearStack() explicitly to prevent memory leak.
533 // But here we cannot as ClearStack() is private.
534 #if 0
535 TYPED_TEST(DocumentMove, MoveConstructorStack) {
536  typedef TypeParam Allocator;
537  typedef UTF8<> Encoding;
539 
540  Document a;
541  size_t defaultCapacity = a.GetStackCapacity();
542 
543  // Trick Document into getting GetStackCapacity() to return non-zero
545  Reader reader(&a.GetAllocator());
546  GenericStringStream<Encoding> is("[\"one\", \"two\", \"three\"]");
547  reader.template Parse<kParseDefaultFlags>(is, a);
548  size_t capacity = a.GetStackCapacity();
549  EXPECT_GT(capacity, 0u);
550 
551  Document b(std::move(a));
552  EXPECT_EQ(a.GetStackCapacity(), defaultCapacity);
553  EXPECT_EQ(b.GetStackCapacity(), capacity);
554 
555  Document c = std::move(b);
556  EXPECT_EQ(b.GetStackCapacity(), defaultCapacity);
557  EXPECT_EQ(c.GetStackCapacity(), capacity);
558 }
559 #endif
560 
561 TYPED_TEST(DocumentMove, MoveAssignment) {
562  typedef TypeParam Allocator;
563  typedef GenericDocument<UTF8<>, Allocator> D;
564  Allocator allocator;
565 
566  D a(&allocator);
567  a.Parse("[\"one\", \"two\", \"three\"]");
568  EXPECT_FALSE(a.HasParseError());
569  EXPECT_TRUE(a.IsArray());
570  EXPECT_EQ(3u, a.Size());
571  EXPECT_EQ(&a.GetAllocator(), &allocator);
572 
573  // Document b; b = a; // does not compile (!is_copy_assignable)
574  D b;
575  b = std::move(a);
576  EXPECT_TRUE(a.IsNull());
577  EXPECT_TRUE(b.IsArray());
578  EXPECT_EQ(3u, b.Size());
579  EXPECT_THROW(a.GetAllocator(), AssertException);
580  EXPECT_EQ(&b.GetAllocator(), &allocator);
581 
582  b.Parse("{\"Foo\": \"Bar\", \"Baz\": 42}");
583  EXPECT_FALSE(b.HasParseError());
584  EXPECT_TRUE(b.IsObject());
585  EXPECT_EQ(2u, b.MemberCount());
586 
587  // Document c; c = a; // does not compile (see static_assert)
588  D c;
589  c = std::move(b);
590  EXPECT_TRUE(b.IsNull());
591  EXPECT_TRUE(c.IsObject());
592  EXPECT_EQ(2u, c.MemberCount());
593  EXPECT_THROW(b.GetAllocator(), AssertException);
594  EXPECT_EQ(&c.GetAllocator(), &allocator);
595 }
596 
597 TYPED_TEST(DocumentMove, MoveAssignmentParseError) {
598  typedef TypeParam Allocator;
599  typedef GenericDocument<UTF8<>, Allocator> D;
600 
601  ParseResult noError;
602  D a;
603  a.Parse("{ 4 = 4]");
604  ParseResult error(a.GetParseError(), a.GetErrorOffset());
605  EXPECT_TRUE(a.HasParseError());
606  EXPECT_NE(error.Code(), noError.Code());
607  EXPECT_NE(error.Offset(), noError.Offset());
608 
609  D b;
610  b = std::move(a);
611  EXPECT_FALSE(a.HasParseError());
612  EXPECT_TRUE(b.HasParseError());
613  EXPECT_EQ(a.GetParseError(), noError.Code());
614  EXPECT_EQ(b.GetParseError(), error.Code());
615  EXPECT_EQ(a.GetErrorOffset(), noError.Offset());
616  EXPECT_EQ(b.GetErrorOffset(), error.Offset());
617 
618  D c;
619  c = std::move(b);
620  EXPECT_FALSE(b.HasParseError());
621  EXPECT_TRUE(c.HasParseError());
622  EXPECT_EQ(b.GetParseError(), noError.Code());
623  EXPECT_EQ(c.GetParseError(), error.Code());
624  EXPECT_EQ(b.GetErrorOffset(), noError.Offset());
625  EXPECT_EQ(c.GetErrorOffset(), error.Offset());
626 }
627 
628 // This test does not properly use parsing, just for testing.
629 // It must call ClearStack() explicitly to prevent memory leak.
630 // But here we cannot as ClearStack() is private.
631 #if 0
632 TYPED_TEST(DocumentMove, MoveAssignmentStack) {
633  typedef TypeParam Allocator;
634  typedef UTF8<> Encoding;
636 
637  D a;
638  size_t defaultCapacity = a.GetStackCapacity();
639 
640  // Trick Document into getting GetStackCapacity() to return non-zero
642  Reader reader(&a.GetAllocator());
643  GenericStringStream<Encoding> is("[\"one\", \"two\", \"three\"]");
644  reader.template Parse<kParseDefaultFlags>(is, a);
645  size_t capacity = a.GetStackCapacity();
646  EXPECT_GT(capacity, 0u);
647 
648  D b;
649  b = std::move(a);
650  EXPECT_EQ(a.GetStackCapacity(), defaultCapacity);
651  EXPECT_EQ(b.GetStackCapacity(), capacity);
652 
653  D c;
654  c = std::move(b);
655  EXPECT_EQ(b.GetStackCapacity(), defaultCapacity);
656  EXPECT_EQ(c.GetStackCapacity(), capacity);
657 }
658 #endif
659 
660 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
661 
662 // Issue 22: Memory corruption via operator=
663 // Fixed by making unimplemented assignment operator private.
664 //TEST(Document, Assignment) {
665 // Document d1;
666 // Document d2;
667 // d1 = d2;
668 //}
669 
670 #ifdef __clang__
671 RAPIDJSON_DIAG_POP
672 #endif
d
GenericReader< UTF8< char >, UTF8< char >, CrtAllocator > Reader
Definition: fwd.h:88
size_t Capacity() const
Computes the total capacity of allocated memory chunks.
Definition: allocators.h:158
size_t GetSize() const
Get the size of string in bytes in the string buffer.
Definition: stringbuffer.h:82
ParseResult Parse(InputStream &is, Handler &handler)
Parse JSON text.
Definition: reader.h:558
RAPIDJSON_NAMESPACE_BEGIN typedef unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition: rapidjson.h:389
size_t Offset() const
Get the error offset, if IsError(), 0 otherwise.
Definition: error.h:118
JSON writer.
Definition: fwd.h:95
const Ch * GetString() const
Definition: stringbuffer.h:73
f
Read-only string stream.
Definition: fwd.h:47
virtual ~OutputStringStream()
XmlRpcServer s
Output byte stream wrapper with statically bound encoding.
size_t Size() const
Computes the memory blocks allocated.
Definition: allocators.h:168
Represents a JSON value. Use Value for UTF8 encoding and default allocator.
Definition: document.h:67
ParseErrorCode GetParseError() const
Get the ParseErrorCode of last parsing.
Definition: document.h:2362
Concept for encoding of Unicode characters.
Result of parsing (wraps ParseErrorCode)
Definition: error.h:106
A document for parsing JSON text as DOM.
Definition: document.h:70
Default parse flags. Can be customized by defining RAPIDJSON_PARSE_DEFAULT_FLAGS. ...
Definition: reader.h:158
UTF-8 encoding.
Definition: encodings.h:96
void ParseTest()
static const char json[]
GenericValue< UTF8<> > Value
GenericValue with UTF8 encoding.
Definition: document.h:2081
ParseErrorCode Code() const
Get the error code.
Definition: error.h:116
Concept for allocating, resizing and freeing memory block.
Allocator & GetAllocator()
Get the allocator of this document.
Definition: document.h:2383
GenericDocument< UTF8<> > Document
GenericDocument with UTF8 encoding.
Definition: document.h:2477
Input byte stream wrapper with a statically bound encoding.
Definition: encodedstream.h:39
GenericValue< Encoding, Allocator > ValueType
Value type of itself.
Definition: document.h:571
void Swap(T &a, T &b) RAPIDJSON_NOEXCEPT
Custom swap() to avoid dependency on C++ <algorithm> header.
Definition: swap.h:33
GenericDocument & Parse(const typename SourceEncoding::Ch *str)
Parse JSON text from a read-only string (with Encoding conversion)
Definition: document.h:2296
main RapidJSON namespace
Input stream wrapper with dynamically bound encoding and automatic encoding detection.
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
Definition: pointer.h:1121
int StrCmp(const Ch *s1, const Ch *s2)
Definition: unittest.h:67
void ParseCheck(DocumentType &doc)
C-runtime library allocator.
Definition: allocators.h:62
File byte stream for input using fread().
const GenericPointer< typename T::ValueType > T2 value
Definition: pointer.h:1222
size_t GetErrorOffset() const
Get the position of last parsing error in input, 0 otherwise.
Definition: document.h:2365
Validate encoding of JSON strings.
Definition: reader.h:150
TEST(Document, Parse)
static FILE * OpenEncodedFile(const char *filename)
GenericDocument & Swap(GenericDocument &rhs) RAPIDJSON_NOEXCEPT
Exchange the contents of this document with those of another.
Definition: document.h:2177
size_t GetStackCapacity() const
Get the capacity of stack in bytes.
Definition: document.h:2389
bool HasParseError() const
Whether a parse error has occured in the last parsing.
Definition: document.h:2359
GenericDocument & ParseStream(InputStream &is)
Parse JSON text from an input stream (with Encoding conversion)
Definition: document.h:2230


choreo_rapidjson
Author(s):
autogenerated on Thu Jul 18 2019 03:59:09