1e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Tencent is pleased to support the open source community by making RapidJSON available. 2e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 3e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. 4e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 5e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Licensed under the MIT License (the "License"); you may not use this file except 6e462795ff5d4c7359f9e8637c10544bb2de70107tturney// in compliance with the License. You may obtain a copy of the License at 7e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 8e462795ff5d4c7359f9e8637c10544bb2de70107tturney// http://opensource.org/licenses/MIT 9e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 10e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Unless required by applicable law or agreed to in writing, software distributed 11e462795ff5d4c7359f9e8637c10544bb2de70107tturney// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 12e462795ff5d4c7359f9e8637c10544bb2de70107tturney// CONDITIONS OF ANY KIND, either express or implied. See the License for the 13e462795ff5d4c7359f9e8637c10544bb2de70107tturney// specific language governing permissions and limitations under the License. 14e462795ff5d4c7359f9e8637c10544bb2de70107tturney 15e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "unittest.h" 16e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "rapidjson/stringbuffer.h" 17e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "rapidjson/writer.h" 18e462795ff5d4c7359f9e8637c10544bb2de70107tturney 19e462795ff5d4c7359f9e8637c10544bb2de70107tturneyusing namespace rapidjson; 20e462795ff5d4c7359f9e8637c10544bb2de70107tturney 21e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST(StringBuffer, InitialSize) { 22e462795ff5d4c7359f9e8637c10544bb2de70107tturney StringBuffer buffer; 23e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(0u, buffer.GetSize()); 24e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_STREQ("", buffer.GetString()); 25e462795ff5d4c7359f9e8637c10544bb2de70107tturney} 26e462795ff5d4c7359f9e8637c10544bb2de70107tturney 27e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST(StringBuffer, Put) { 28e462795ff5d4c7359f9e8637c10544bb2de70107tturney StringBuffer buffer; 29e462795ff5d4c7359f9e8637c10544bb2de70107tturney buffer.Put('A'); 30e462795ff5d4c7359f9e8637c10544bb2de70107tturney 31e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(1u, buffer.GetSize()); 32e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_STREQ("A", buffer.GetString()); 33e462795ff5d4c7359f9e8637c10544bb2de70107tturney} 34e462795ff5d4c7359f9e8637c10544bb2de70107tturney 35e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST(StringBuffer, Clear) { 36e462795ff5d4c7359f9e8637c10544bb2de70107tturney StringBuffer buffer; 37e462795ff5d4c7359f9e8637c10544bb2de70107tturney buffer.Put('A'); 38e462795ff5d4c7359f9e8637c10544bb2de70107tturney buffer.Put('B'); 39e462795ff5d4c7359f9e8637c10544bb2de70107tturney buffer.Put('C'); 40e462795ff5d4c7359f9e8637c10544bb2de70107tturney buffer.Clear(); 41e462795ff5d4c7359f9e8637c10544bb2de70107tturney 42e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(0u, buffer.GetSize()); 43e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_STREQ("", buffer.GetString()); 44e462795ff5d4c7359f9e8637c10544bb2de70107tturney} 45e462795ff5d4c7359f9e8637c10544bb2de70107tturney 46e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST(StringBuffer, Push) { 47e462795ff5d4c7359f9e8637c10544bb2de70107tturney StringBuffer buffer; 48e462795ff5d4c7359f9e8637c10544bb2de70107tturney buffer.Push(5); 49e462795ff5d4c7359f9e8637c10544bb2de70107tturney 50e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(5u, buffer.GetSize()); 51e462795ff5d4c7359f9e8637c10544bb2de70107tturney 52e462795ff5d4c7359f9e8637c10544bb2de70107tturney // Causes sudden expansion to make the stack's capacity equal to size 53e462795ff5d4c7359f9e8637c10544bb2de70107tturney buffer.Push(65536u); 54e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(5u + 65536u, buffer.GetSize()); 55e462795ff5d4c7359f9e8637c10544bb2de70107tturney} 56e462795ff5d4c7359f9e8637c10544bb2de70107tturney 57e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST(StringBuffer, Pop) { 58e462795ff5d4c7359f9e8637c10544bb2de70107tturney StringBuffer buffer; 59e462795ff5d4c7359f9e8637c10544bb2de70107tturney buffer.Put('A'); 60e462795ff5d4c7359f9e8637c10544bb2de70107tturney buffer.Put('B'); 61e462795ff5d4c7359f9e8637c10544bb2de70107tturney buffer.Put('C'); 62e462795ff5d4c7359f9e8637c10544bb2de70107tturney buffer.Put('D'); 63e462795ff5d4c7359f9e8637c10544bb2de70107tturney buffer.Put('E'); 64e462795ff5d4c7359f9e8637c10544bb2de70107tturney buffer.Pop(3); 65e462795ff5d4c7359f9e8637c10544bb2de70107tturney 66e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(2u, buffer.GetSize()); 67e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_STREQ("AB", buffer.GetString()); 68e462795ff5d4c7359f9e8637c10544bb2de70107tturney} 69e462795ff5d4c7359f9e8637c10544bb2de70107tturney 70e462795ff5d4c7359f9e8637c10544bb2de70107tturney#if RAPIDJSON_HAS_CXX11_RVALUE_REFS 71e462795ff5d4c7359f9e8637c10544bb2de70107tturney 72e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include <type_traits> 73e462795ff5d4c7359f9e8637c10544bb2de70107tturney 74e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST(StringBuffer, Traits) { 75e462795ff5d4c7359f9e8637c10544bb2de70107tturney static_assert( std::is_constructible<StringBuffer>::value, ""); 76e462795ff5d4c7359f9e8637c10544bb2de70107tturney static_assert( std::is_default_constructible<StringBuffer>::value, ""); 77e462795ff5d4c7359f9e8637c10544bb2de70107tturney#ifndef _MSC_VER 78e462795ff5d4c7359f9e8637c10544bb2de70107tturney static_assert(!std::is_copy_constructible<StringBuffer>::value, ""); 79e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif 80e462795ff5d4c7359f9e8637c10544bb2de70107tturney static_assert( std::is_move_constructible<StringBuffer>::value, ""); 81e462795ff5d4c7359f9e8637c10544bb2de70107tturney 82e462795ff5d4c7359f9e8637c10544bb2de70107tturney static_assert(!std::is_nothrow_constructible<StringBuffer>::value, ""); 83e462795ff5d4c7359f9e8637c10544bb2de70107tturney static_assert(!std::is_nothrow_default_constructible<StringBuffer>::value, ""); 84e462795ff5d4c7359f9e8637c10544bb2de70107tturney 85e462795ff5d4c7359f9e8637c10544bb2de70107tturney#if !defined(_MSC_VER) || _MSC_VER >= 1800 86e462795ff5d4c7359f9e8637c10544bb2de70107tturney static_assert(!std::is_nothrow_copy_constructible<StringBuffer>::value, ""); 87e462795ff5d4c7359f9e8637c10544bb2de70107tturney static_assert(!std::is_nothrow_move_constructible<StringBuffer>::value, ""); 88e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif 89e462795ff5d4c7359f9e8637c10544bb2de70107tturney 90e462795ff5d4c7359f9e8637c10544bb2de70107tturney static_assert( std::is_assignable<StringBuffer,StringBuffer>::value, ""); 91e462795ff5d4c7359f9e8637c10544bb2de70107tturney#ifndef _MSC_VER 92e462795ff5d4c7359f9e8637c10544bb2de70107tturney static_assert(!std::is_copy_assignable<StringBuffer>::value, ""); 93e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif 94e462795ff5d4c7359f9e8637c10544bb2de70107tturney static_assert( std::is_move_assignable<StringBuffer>::value, ""); 95e462795ff5d4c7359f9e8637c10544bb2de70107tturney 96e462795ff5d4c7359f9e8637c10544bb2de70107tturney#if !defined(_MSC_VER) || _MSC_VER >= 1800 97e462795ff5d4c7359f9e8637c10544bb2de70107tturney static_assert(!std::is_nothrow_assignable<StringBuffer, StringBuffer>::value, ""); 98e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif 99e462795ff5d4c7359f9e8637c10544bb2de70107tturney 100e462795ff5d4c7359f9e8637c10544bb2de70107tturney static_assert(!std::is_nothrow_copy_assignable<StringBuffer>::value, ""); 101e462795ff5d4c7359f9e8637c10544bb2de70107tturney static_assert(!std::is_nothrow_move_assignable<StringBuffer>::value, ""); 102e462795ff5d4c7359f9e8637c10544bb2de70107tturney 103e462795ff5d4c7359f9e8637c10544bb2de70107tturney static_assert( std::is_destructible<StringBuffer>::value, ""); 104e462795ff5d4c7359f9e8637c10544bb2de70107tturney#ifndef _MSC_VER 105e462795ff5d4c7359f9e8637c10544bb2de70107tturney static_assert(std::is_nothrow_destructible<StringBuffer>::value, ""); 106e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif 107e462795ff5d4c7359f9e8637c10544bb2de70107tturney} 108e462795ff5d4c7359f9e8637c10544bb2de70107tturney 109e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST(StringBuffer, MoveConstructor) { 110e462795ff5d4c7359f9e8637c10544bb2de70107tturney StringBuffer x; 111e462795ff5d4c7359f9e8637c10544bb2de70107tturney x.Put('A'); 112e462795ff5d4c7359f9e8637c10544bb2de70107tturney x.Put('B'); 113e462795ff5d4c7359f9e8637c10544bb2de70107tturney x.Put('C'); 114e462795ff5d4c7359f9e8637c10544bb2de70107tturney x.Put('D'); 115e462795ff5d4c7359f9e8637c10544bb2de70107tturney 116e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(4u, x.GetSize()); 117e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_STREQ("ABCD", x.GetString()); 118e462795ff5d4c7359f9e8637c10544bb2de70107tturney 119e462795ff5d4c7359f9e8637c10544bb2de70107tturney // StringBuffer y(x); // does not compile (!is_copy_constructible) 120e462795ff5d4c7359f9e8637c10544bb2de70107tturney StringBuffer y(std::move(x)); 121e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(0u, x.GetSize()); 122e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(4u, y.GetSize()); 123e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_STREQ("ABCD", y.GetString()); 124e462795ff5d4c7359f9e8637c10544bb2de70107tturney 125e462795ff5d4c7359f9e8637c10544bb2de70107tturney // StringBuffer z = y; // does not compile (!is_copy_assignable) 126e462795ff5d4c7359f9e8637c10544bb2de70107tturney StringBuffer z = std::move(y); 127e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(0u, y.GetSize()); 128e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(4u, z.GetSize()); 129e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_STREQ("ABCD", z.GetString()); 130e462795ff5d4c7359f9e8637c10544bb2de70107tturney} 131e462795ff5d4c7359f9e8637c10544bb2de70107tturney 132e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST(StringBuffer, MoveAssignment) { 133e462795ff5d4c7359f9e8637c10544bb2de70107tturney StringBuffer x; 134e462795ff5d4c7359f9e8637c10544bb2de70107tturney x.Put('A'); 135e462795ff5d4c7359f9e8637c10544bb2de70107tturney x.Put('B'); 136e462795ff5d4c7359f9e8637c10544bb2de70107tturney x.Put('C'); 137e462795ff5d4c7359f9e8637c10544bb2de70107tturney x.Put('D'); 138e462795ff5d4c7359f9e8637c10544bb2de70107tturney 139e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(4u, x.GetSize()); 140e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_STREQ("ABCD", x.GetString()); 141e462795ff5d4c7359f9e8637c10544bb2de70107tturney 142e462795ff5d4c7359f9e8637c10544bb2de70107tturney StringBuffer y; 143e462795ff5d4c7359f9e8637c10544bb2de70107tturney // y = x; // does not compile (!is_copy_assignable) 144e462795ff5d4c7359f9e8637c10544bb2de70107tturney y = std::move(x); 145e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(0u, x.GetSize()); 146e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(4u, y.GetSize()); 147e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_STREQ("ABCD", y.GetString()); 148e462795ff5d4c7359f9e8637c10544bb2de70107tturney} 149e462795ff5d4c7359f9e8637c10544bb2de70107tturney 150e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS 151