Home | History | Annotate | Download | only in unittest
      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 
     21 TEST(StringBuffer, InitialSize) {
     22     StringBuffer buffer;
     23     EXPECT_EQ(0u, buffer.GetSize());
     24     EXPECT_STREQ("", buffer.GetString());
     25 }
     26 
     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 
     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 
     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 
     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 
     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 
    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 
    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