1 // Tencent is pleased to support the open source community by making RapidJSON available.
3 // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
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
8 // http://opensource.org/licenses/MIT
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.
17 #include "rapidjson/istreamwrapper.h"
18 #include "rapidjson/encodedstream.h"
19 #include "rapidjson/document.h"
23 #if defined(_MSC_VER) && !defined(__clang__)
25 RAPIDJSON_DIAG_OFF(4702) // unreachable code
28 using namespace rapidjson
;
31 template <typename StringStreamType
>
32 static void TestStringStream() {
33 typedef typename
StringStreamType::char_type Ch
;
37 BasicIStreamWrapper
<StringStreamType
> is(iss
);
38 EXPECT_EQ(0u, is
.Tell());
39 if (sizeof(Ch
) == 1) {
40 EXPECT_EQ(0, is
.Peek4());
41 EXPECT_EQ(0u, is
.Tell());
43 EXPECT_EQ(0, is
.Peek());
44 EXPECT_EQ(0, is
.Take());
45 EXPECT_EQ(0u, is
.Tell());
49 Ch s
[] = { 'A', 'B', 'C', '\0' };
50 StringStreamType
iss(s
);
51 BasicIStreamWrapper
<StringStreamType
> is(iss
);
52 EXPECT_EQ(0u, is
.Tell());
53 if (sizeof(Ch
) == 1) {
54 EXPECT_EQ(0, is
.Peek4()); // less than 4 bytes
56 for (int i
= 0; i
< 3; i
++) {
57 EXPECT_EQ(static_cast<size_t>(i
), is
.Tell());
58 EXPECT_EQ('A' + i
, is
.Peek());
59 EXPECT_EQ('A' + i
, is
.Peek());
60 EXPECT_EQ('A' + i
, is
.Take());
62 EXPECT_EQ(3u, is
.Tell());
63 EXPECT_EQ(0, is
.Peek());
64 EXPECT_EQ(0, is
.Take());
68 Ch s
[] = { 'A', 'B', 'C', 'D', 'E', '\0' };
69 StringStreamType
iss(s
);
70 BasicIStreamWrapper
<StringStreamType
> is(iss
);
71 if (sizeof(Ch
) == 1) {
72 const Ch
* c
= is
.Peek4();
73 for (int i
= 0; i
< 4; i
++)
74 EXPECT_EQ('A' + i
, c
[i
]);
75 EXPECT_EQ(0u, is
.Tell());
77 for (int i
= 0; i
< 5; i
++) {
78 EXPECT_EQ(static_cast<size_t>(i
), is
.Tell());
79 EXPECT_EQ('A' + i
, is
.Peek());
80 EXPECT_EQ('A' + i
, is
.Peek());
81 EXPECT_EQ('A' + i
, is
.Take());
83 EXPECT_EQ(5u, is
.Tell());
84 EXPECT_EQ(0, is
.Peek());
85 EXPECT_EQ(0, is
.Take());
89 TEST(IStreamWrapper
, istringstream
) {
90 TestStringStream
<istringstream
>();
93 TEST(IStreamWrapper
, stringstream
) {
94 TestStringStream
<stringstream
>();
97 TEST(IStreamWrapper
, wistringstream
) {
98 TestStringStream
<wistringstream
>();
101 TEST(IStreamWrapper
, wstringstream
) {
102 TestStringStream
<wstringstream
>();
105 template <typename FileStreamType
>
106 static bool Open(FileStreamType
& fs
, const char* filename
) {
107 const char *paths
[] = {
111 "../../bin/encodings",
112 "../../../bin/encodings"
115 for (size_t i
= 0; i
< sizeof(paths
) / sizeof(paths
[0]); i
++) {
116 sprintf(buffer
, "%s/%s", paths
[i
], filename
);
117 fs
.open(buffer
, ios_base::in
| ios_base::binary
);
124 TEST(IStreamWrapper
, ifstream
) {
126 ASSERT_TRUE(Open(ifs
, "utf8bom.json"));
127 IStreamWrapper
isw(ifs
);
128 EncodedInputStream
<UTF8
<>, IStreamWrapper
> eis(isw
);
130 EXPECT_TRUE(!d
.ParseStream(eis
).HasParseError());
131 EXPECT_TRUE(d
.IsObject());
132 EXPECT_EQ(5u, d
.MemberCount());
135 TEST(IStreamWrapper
, fstream
) {
137 ASSERT_TRUE(Open(fs
, "utf8bom.json"));
138 IStreamWrapper
isw(fs
);
139 EncodedInputStream
<UTF8
<>, IStreamWrapper
> eis(isw
);
141 EXPECT_TRUE(!d
.ParseStream(eis
).HasParseError());
142 EXPECT_TRUE(d
.IsObject());
143 EXPECT_EQ(5u, d
.MemberCount());
146 // wifstream/wfstream only works on C++11 with codecvt_utf16
147 // But many C++11 library still not have it.
151 TEST(IStreamWrapper
, wifstream
) {
153 ASSERT_TRUE(Open(ifs
, "utf16bebom.json"));
154 ifs
.imbue(std::locale(ifs
.getloc(),
155 new std::codecvt_utf16
<wchar_t, 0x10ffff, std::consume_header
>));
156 WIStreamWrapper
isw(ifs
);
157 GenericDocument
<UTF16
<> > d
;
158 d
.ParseStream
<kParseDefaultFlags
, UTF16
<>, WIStreamWrapper
>(isw
);
159 EXPECT_TRUE(!d
.HasParseError());
160 EXPECT_TRUE(d
.IsObject());
161 EXPECT_EQ(5, d
.MemberCount());
164 TEST(IStreamWrapper
, wfstream
) {
166 ASSERT_TRUE(Open(fs
, "utf16bebom.json"));
167 fs
.imbue(std::locale(fs
.getloc(),
168 new std::codecvt_utf16
<wchar_t, 0x10ffff, std::consume_header
>));
169 WIStreamWrapper
isw(fs
);
170 GenericDocument
<UTF16
<> > d
;
171 d
.ParseStream
<kParseDefaultFlags
, UTF16
<>, WIStreamWrapper
>(isw
);
172 EXPECT_TRUE(!d
.HasParseError());
173 EXPECT_TRUE(d
.IsObject());
174 EXPECT_EQ(5, d
.MemberCount());
179 #if defined(_MSC_VER) && !defined(__clang__)