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/stringbuffer.h"
17 #include "rapidjson/writer.h"
18 
19 using namespace rapidjson;
20 
TEST(StringBuffer,InitialSize)21 TEST(StringBuffer, InitialSize) {
22     StringBuffer buffer;
23     EXPECT_EQ(0u, buffer.GetSize());
24     EXPECT_STREQ("", buffer.GetString());
25 }
26 
TEST(StringBuffer,Put)27 TEST(StringBuffer, Put) {
28     StringBuffer buffer;
29     buffer.Put('A');
30 
31     EXPECT_EQ(1u, buffer.GetSize());
32     EXPECT_STREQ("A", buffer.GetString());
33 }
34 
TEST(StringBuffer,Clear)35 TEST(StringBuffer, Clear) {
36     StringBuffer buffer;
37     buffer.Put('A');
38     buffer.Put('B');
39     buffer.Put('C');
40     buffer.Clear();
41 
42     EXPECT_EQ(0u, buffer.GetSize());
43     EXPECT_STREQ("", buffer.GetString());
44 }
45 
TEST(StringBuffer,Push)46 TEST(StringBuffer, Push) {
47     StringBuffer buffer;
48     buffer.Push(5);
49 
50     EXPECT_EQ(5u, buffer.GetSize());
51 
52     // Causes sudden expansion to make the stack's capacity equal to size
53     buffer.Push(65536u);
54     EXPECT_EQ(5u + 65536u, buffer.GetSize());
55 }
56 
TEST(StringBuffer,Pop)57 TEST(StringBuffer, Pop) {
58     StringBuffer buffer;
59     buffer.Put('A');
60     buffer.Put('B');
61     buffer.Put('C');
62     buffer.Put('D');
63     buffer.Put('E');
64     buffer.Pop(3);
65 
66     EXPECT_EQ(2u, buffer.GetSize());
67     EXPECT_STREQ("AB", buffer.GetString());
68 }
69 
70 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
71 
72 #include <type_traits>
73 
TEST(StringBuffer,Traits)74 TEST(StringBuffer, Traits) {
75     static_assert( std::is_constructible<StringBuffer>::value, "");
76     static_assert( std::is_default_constructible<StringBuffer>::value, "");
77 #ifndef _MSC_VER
78     static_assert(!std::is_copy_constructible<StringBuffer>::value, "");
79 #endif
80     static_assert( std::is_move_constructible<StringBuffer>::value, "");
81 
82     static_assert(!std::is_nothrow_constructible<StringBuffer>::value, "");
83     static_assert(!std::is_nothrow_default_constructible<StringBuffer>::value, "");
84 
85 #if !defined(_MSC_VER) || _MSC_VER >= 1800
86     static_assert(!std::is_nothrow_copy_constructible<StringBuffer>::value, "");
87     static_assert(!std::is_nothrow_move_constructible<StringBuffer>::value, "");
88 #endif
89 
90     static_assert( std::is_assignable<StringBuffer,StringBuffer>::value, "");
91 #ifndef _MSC_VER
92     static_assert(!std::is_copy_assignable<StringBuffer>::value, "");
93 #endif
94     static_assert( std::is_move_assignable<StringBuffer>::value, "");
95 
96 #if !defined(_MSC_VER) || _MSC_VER >= 1800
97     static_assert(!std::is_nothrow_assignable<StringBuffer, StringBuffer>::value, "");
98 #endif
99 
100     static_assert(!std::is_nothrow_copy_assignable<StringBuffer>::value, "");
101     static_assert(!std::is_nothrow_move_assignable<StringBuffer>::value, "");
102 
103     static_assert( std::is_destructible<StringBuffer>::value, "");
104 #ifndef _MSC_VER
105     static_assert(std::is_nothrow_destructible<StringBuffer>::value, "");
106 #endif
107 }
108 
TEST(StringBuffer,MoveConstructor)109 TEST(StringBuffer, MoveConstructor) {
110     StringBuffer x;
111     x.Put('A');
112     x.Put('B');
113     x.Put('C');
114     x.Put('D');
115 
116     EXPECT_EQ(4u, x.GetSize());
117     EXPECT_STREQ("ABCD", x.GetString());
118 
119     // StringBuffer y(x); // does not compile (!is_copy_constructible)
120     StringBuffer y(std::move(x));
121     EXPECT_EQ(0u, x.GetSize());
122     EXPECT_EQ(4u, y.GetSize());
123     EXPECT_STREQ("ABCD", y.GetString());
124 
125     // StringBuffer z = y; // does not compile (!is_copy_assignable)
126     StringBuffer z = std::move(y);
127     EXPECT_EQ(0u, y.GetSize());
128     EXPECT_EQ(4u, z.GetSize());
129     EXPECT_STREQ("ABCD", z.GetString());
130 }
131 
TEST(StringBuffer,MoveAssignment)132 TEST(StringBuffer, MoveAssignment) {
133     StringBuffer x;
134     x.Put('A');
135     x.Put('B');
136     x.Put('C');
137     x.Put('D');
138 
139     EXPECT_EQ(4u, x.GetSize());
140     EXPECT_STREQ("ABCD", x.GetString());
141 
142     StringBuffer y;
143     // y = x; // does not compile (!is_copy_assignable)
144     y = std::move(x);
145     EXPECT_EQ(0u, x.GetSize());
146     EXPECT_EQ(4u, y.GetSize());
147     EXPECT_STREQ("ABCD", y.GetString());
148 }
149 
150 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
151