Wire Sysio Wire Sysion 1.0.0
Loading...
Searching...
No Matches
istreamwrappertest.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
19#include "rapidjson/document.h"
20#include <sstream>
21#include <fstream>
22
23#if defined(_MSC_VER) && !defined(__clang__)
24RAPIDJSON_DIAG_PUSH
25RAPIDJSON_DIAG_OFF(4702) // unreachable code
26#endif
27
28using namespace rapidjson;
29using namespace std;
30
31template <typename StringStreamType>
32static void TestStringStream() {
33 typedef typename StringStreamType::char_type Ch;
34
35 {
36 StringStreamType iss;
38 EXPECT_EQ(0u, is.Tell());
39 if (sizeof(Ch) == 1) {
40 EXPECT_EQ(0, is.Peek4());
41 EXPECT_EQ(0u, is.Tell());
42 }
43 EXPECT_EQ(0, is.Peek());
44 EXPECT_EQ(0, is.Take());
45 EXPECT_EQ(0u, is.Tell());
46 }
47
48 {
49 Ch s[] = { 'A', 'B', 'C', '\0' };
50 StringStreamType iss(s);
52 EXPECT_EQ(0u, is.Tell());
53 if (sizeof(Ch) == 1) {
54 EXPECT_EQ(0, is.Peek4()); // less than 4 bytes
55 }
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());
61 }
62 EXPECT_EQ(3u, is.Tell());
63 EXPECT_EQ(0, is.Peek());
64 EXPECT_EQ(0, is.Take());
65 }
66
67 {
68 Ch s[] = { 'A', 'B', 'C', 'D', 'E', '\0' };
69 StringStreamType iss(s);
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());
76 }
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());
82 }
83 EXPECT_EQ(5u, is.Tell());
84 EXPECT_EQ(0, is.Peek());
85 EXPECT_EQ(0, is.Take());
86 }
87}
88
89TEST(IStreamWrapper, istringstream) {
90 TestStringStream<istringstream>();
91}
92
93TEST(IStreamWrapper, stringstream) {
94 TestStringStream<stringstream>();
95}
96
97TEST(IStreamWrapper, wistringstream) {
98 TestStringStream<wistringstream>();
99}
100
101TEST(IStreamWrapper, wstringstream) {
102 TestStringStream<wstringstream>();
103}
104
105template <typename FileStreamType>
106static bool Open(FileStreamType& fs, const char* filename) {
107 const char *paths[] = {
108 "encodings",
109 "bin/encodings",
110 "../bin/encodings",
111 "../../bin/encodings",
112 "../../../bin/encodings"
113 };
114 char buffer[1024];
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);
118 if (fs.is_open())
119 return true;
120 }
121 return false;
122}
123
125 ifstream ifs;
126 ASSERT_TRUE(Open(ifs, "utf8bom.json"));
127 IStreamWrapper isw(ifs);
129 Document d;
130 EXPECT_TRUE(!d.ParseStream(eis).HasParseError());
131 EXPECT_TRUE(d.IsObject());
132 EXPECT_EQ(5u, d.MemberCount());
133}
134
136 fstream fs;
137 ASSERT_TRUE(Open(fs, "utf8bom.json"));
138 IStreamWrapper isw(fs);
140 Document d;
141 EXPECT_TRUE(!d.ParseStream(eis).HasParseError());
142 EXPECT_TRUE(d.IsObject());
143 EXPECT_EQ(5u, d.MemberCount());
144}
145
146// wifstream/wfstream only works on C++11 with codecvt_utf16
147// But many C++11 library still not have it.
148#if 0
149#include <codecvt>
150
151TEST(IStreamWrapper, wifstream) {
152 wifstream ifs;
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);
158 d.ParseStream<kParseDefaultFlags, UTF16<>, WIStreamWrapper>(isw);
159 EXPECT_TRUE(!d.HasParseError());
160 EXPECT_TRUE(d.IsObject());
161 EXPECT_EQ(5, d.MemberCount());
162}
163
164TEST(IStreamWrapper, wfstream) {
165 wfstream fs;
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);
171 d.ParseStream<kParseDefaultFlags, UTF16<>, WIStreamWrapper>(isw);
172 EXPECT_TRUE(!d.HasParseError());
173 EXPECT_TRUE(d.IsObject());
174 EXPECT_EQ(5, d.MemberCount());
175}
176
177#endif
178
179#if defined(_MSC_VER) && !defined(__clang__)
180RAPIDJSON_DIAG_POP
181#endif
Wrapper of std::basic_istream into RapidJSON's Stream concept.
Input byte stream wrapper with a statically bound encoding.
#define EXPECT_EQ(val1, val2)
Definition gtest.h:1954
#define EXPECT_TRUE(condition)
Definition gtest.h:1895
#define TEST(test_case_name, test_name)
Definition gtest.h:2275
#define ASSERT_TRUE(condition)
Definition gtest.h:1901
#define Ch(x, y, z)
Definition hash_impl.h:17
static const Segment fs(Segment::fs)
main RapidJSON namespace
Definition name.hpp:106
@ kParseDefaultFlags
Default parse flags. Can be customized by defining RAPIDJSON_PARSE_DEFAULT_FLAGS.
Definition reader.h:156
UTF-16 encoding.
Definition encodings.h:269
CK_ULONG d
char * s