Wire Sysio Wire Sysion 1.0.0
Loading...
Searching...
No Matches
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"
21#include <sstream>
22#include <algorithm>
23
24#ifdef __clang__
25RAPIDJSON_DIAG_PUSH
26RAPIDJSON_DIAG_OFF(c++98-compat)
27RAPIDJSON_DIAG_OFF(missing-variable-declarations)
28#endif
29
30using namespace rapidjson;
31
32template <typename DocumentType>
33void 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
78template <typename Allocator, typename StackAllocator>
79void 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
126
127TEST(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("{]");
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("{}");
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
156static 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
174TEST(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
215TEST(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 {
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
256TEST(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;
295 Document::AllocatorType& a = d1.GetAllocator();
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.
346struct 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
359TEST(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
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
370TEST(Document, UserBuffer) {
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
388TEST(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
396 ASSERT_THROW(doc.Accept(writer), AssertException);
397}
398
399// Issue 44: SetStringRaw doesn't work with wchar_t
400TEST(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
421 static_assert(std::is_constructible<Document>::value, "");
422 static_assert(std::is_default_constructible<Document>::value, "");
423#ifndef _MSC_VER
424 static_assert(!std::is_copy_constructible<Document>::value, "");
425#endif
426 static_assert(std::is_move_constructible<Document>::value, "");
427
428 static_assert(!std::is_nothrow_constructible<Document>::value, "");
429 static_assert(!std::is_nothrow_default_constructible<Document>::value, "");
430#ifndef _MSC_VER
431 static_assert(!std::is_nothrow_copy_constructible<Document>::value, "");
432 static_assert(std::is_nothrow_move_constructible<Document>::value, "");
433#endif
434
435 static_assert(std::is_assignable<Document,Document>::value, "");
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
442 static_assert(std::is_nothrow_assignable<Document, Document>::value, "");
443#endif
444 static_assert(!std::is_nothrow_copy_assignable<Document>::value, "");
445#ifndef _MSC_VER
446 static_assert(std::is_nothrow_move_assignable<Document>::value, "");
447#endif
448
449 static_assert( std::is_destructible<Document>::value, "");
450#ifndef _MSC_VER
451 static_assert(std::is_nothrow_destructible<Document>::value, "");
452#endif
453}
454
455#endif
456
457template <typename Allocator>
458struct DocumentMove: public ::testing::Test {
459};
460
461typedef ::testing::Types< CrtAllocator, MemoryPoolAllocator<> > MoveAllocatorTypes;
462TYPED_TEST_CASE(DocumentMove, MoveAllocatorTypes);
463
464TYPED_TEST(DocumentMove, MoveConstructor) {
465 typedef TypeParam 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
498TYPED_TEST(DocumentMove, MoveConstructorParseError) {
499 typedef TypeParam Allocator;
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
535TYPED_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
561TYPED_TEST(DocumentMove, MoveAssignment) {
562 typedef TypeParam 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
597TYPED_TEST(DocumentMove, MoveAssignmentParseError) {
598 typedef TypeParam Allocator;
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
632TYPED_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__
671RAPIDJSON_DIAG_POP
672#endif
Input stream wrapper with dynamically bound encoding and automatic encoding detection.
C-runtime library allocator.
Definition allocators.h:75
Input byte stream wrapper with a statically bound encoding.
Output byte stream wrapper with statically bound encoding.
File byte stream for input using fread().
A document for parsing JSON text as DOM.
Definition document.h:2124
Allocator & GetAllocator()
Get the allocator of this document.
Definition document.h:2412
GenericDocument & Swap(GenericDocument &rhs) RAPIDJSON_NOEXCEPT
Exchange the contents of this document with those of another.
Definition document.h:2206
bool HasParseError() const
Whether a parse error has occurred in the last parsing.
Definition document.h:2388
GenericDocument & Parse(const typename SourceEncoding::Ch *str)
Parse JSON text from a read-only string (with Encoding conversion)
Definition document.h:2325
ParseErrorCode GetParseError() const
Get the ParseErrorCode of last parsing.
Definition document.h:2391
size_t GetStackCapacity() const
Get the capacity of stack in bytes.
Definition document.h:2418
size_t GetErrorOffset() const
Get the position of last parsing error in input, 0 otherwise.
Definition document.h:2394
ParseResult Parse(InputStream &is, Handler &handler)
Parse JSON text.
Definition reader.h:557
const Ch * GetString() const
size_t GetSize() const
Get the size of string in bytes in the string buffer.
Represents a JSON value. Use Value for UTF8 encoding and default allocator.
Definition document.h:578
Default memory allocator used by the parser and DOM.
Definition allocators.h:115
size_t Capacity() const
Computes the total capacity of allocated memory chunks.
Definition allocators.h:171
size_t Size() const
Computes the memory blocks allocated.
Definition allocators.h:181
JSON writer.
Definition writer.h:89
Concept for allocating, resizing and freeing memory block.
Concept for encoding of Unicode characters.
#define D(var, file, col, who, lev,...)
Definition debug.h:44
GenericValue< UTF8<> > Value
GenericValue with UTF8 encoding.
Definition document.h:2110
GenericDocument< UTF8<> > Document
GenericDocument with UTF8 encoding.
Definition document.h:2506
void ParseTest()
void ParseCheck(DocumentType &doc)
#define d1
os_t os
GenericReader< UTF8< char >, UTF8< char >, CrtAllocator > Reader
Definition fwd.h:90
void put()
Definition gen_code.cpp:234
#define EXPECT_EQ(val1, val2)
Definition gtest.h:1954
#define EXPECT_NE(val1, val2)
Definition gtest.h:1958
#define EXPECT_THROW(statement, expected_exception)
Definition gtest.h:1879
#define EXPECT_GT(val1, val2)
Definition gtest.h:1966
#define EXPECT_DOUBLE_EQ(val1, val2)
Definition gtest.h:2063
#define EXPECT_TRUE(condition)
Definition gtest.h:1895
#define EXPECT_STREQ(s1, s2)
Definition gtest.h:2027
#define TEST(test_case_name, test_name)
Definition gtest.h:2275
#define EXPECT_LE(val1, val2)
Definition gtest.h:1960
#define ASSERT_TRUE(condition)
Definition gtest.h:1901
#define EXPECT_FALSE(condition)
Definition gtest.h:1898
#define ASSERT_THROW(statement, expected_exception)
Definition gtest.h:1885
TYPED_TEST(TypedTest, TestA)
TYPED_TEST_CASE(TypedTest, MyTypes)
bip::allocator< T, pinnable_mapped_file::segment_manager > allocator
Definition chainbase.hpp:56
main RapidJSON namespace
void swap(picojson::value &x, picojson::value &y)
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
Definition pointer.h:1181
RAPIDJSON_NAMESPACE_BEGIN typedef unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition rapidjson.h:384
@ kParseDefaultFlags
Default parse flags. Can be customized by defining RAPIDJSON_PARSE_DEFAULT_FLAGS.
Definition reader.h:156
@ kParseValidateEncodingFlag
Validate encoding of JSON strings.
Definition reader.h:148
Dynamically select encoding according to stream's runtime-specified UTF encoding type.
Definition encodings.h:615
Read-only string stream.
Definition stream.h:154
virtual ~OutputStringStream()
Result of parsing (wraps ParseErrorCode)
Definition error.h:106
ParseErrorCode Code() const
Get the error code.
Definition error.h:116
bool IsError() const
Whether the result is an error.
Definition error.h:123
size_t Offset() const
Get the error offset, if IsError(), 0 otherwise.
Definition error.h:118
UTF-8 encoding.
Definition encodings.h:96
int StrCmp(const Ch *s1, const Ch *s2)
Definition unittest.h:67
CK_ULONG d
char * s
uint16_t j
memset(pInfo->slotDescription, ' ', 64)
memcpy((char *) pInfo->slotDescription, s, l)