]>
Commit | Line | Data |
---|---|---|
31f18b77 FG |
1 | // Tencent is pleased to support the open source community by making RapidJSON available. |
2 | // | |
1e59de90 | 3 | // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. |
31f18b77 FG |
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 | ||
17 | #include "rapidjson/istreamwrapper.h" | |
18 | #include "rapidjson/encodedstream.h" | |
19 | #include "rapidjson/document.h" | |
20 | #include <sstream> | |
21 | #include <fstream> | |
22 | ||
1e59de90 | 23 | #if defined(_MSC_VER) && !defined(__clang__) |
31f18b77 FG |
24 | RAPIDJSON_DIAG_PUSH |
25 | RAPIDJSON_DIAG_OFF(4702) // unreachable code | |
26 | #endif | |
27 | ||
28 | using namespace rapidjson; | |
29 | using namespace std; | |
30 | ||
31 | template <typename StringStreamType> | |
32 | static void TestStringStream() { | |
33 | typedef typename StringStreamType::char_type Ch; | |
34 | ||
35 | { | |
36 | StringStreamType iss; | |
37 | BasicIStreamWrapper<StringStreamType> is(iss); | |
1e59de90 | 38 | EXPECT_EQ(0u, is.Tell()); |
31f18b77 FG |
39 | if (sizeof(Ch) == 1) { |
40 | EXPECT_EQ(0, is.Peek4()); | |
1e59de90 | 41 | EXPECT_EQ(0u, is.Tell()); |
31f18b77 FG |
42 | } |
43 | EXPECT_EQ(0, is.Peek()); | |
44 | EXPECT_EQ(0, is.Take()); | |
1e59de90 | 45 | EXPECT_EQ(0u, is.Tell()); |
31f18b77 FG |
46 | } |
47 | ||
48 | { | |
49 | Ch s[] = { 'A', 'B', 'C', '\0' }; | |
50 | StringStreamType iss(s); | |
51 | BasicIStreamWrapper<StringStreamType> is(iss); | |
1e59de90 | 52 | EXPECT_EQ(0u, is.Tell()); |
31f18b77 FG |
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 | } | |
1e59de90 | 62 | EXPECT_EQ(3u, is.Tell()); |
31f18b77 FG |
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); | |
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]); | |
1e59de90 | 75 | EXPECT_EQ(0u, is.Tell()); |
31f18b77 FG |
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 | } | |
1e59de90 | 83 | EXPECT_EQ(5u, is.Tell()); |
31f18b77 FG |
84 | EXPECT_EQ(0, is.Peek()); |
85 | EXPECT_EQ(0, is.Take()); | |
86 | } | |
87 | } | |
88 | ||
89 | TEST(IStreamWrapper, istringstream) { | |
90 | TestStringStream<istringstream>(); | |
91 | } | |
92 | ||
93 | TEST(IStreamWrapper, stringstream) { | |
94 | TestStringStream<stringstream>(); | |
95 | } | |
96 | ||
97 | TEST(IStreamWrapper, wistringstream) { | |
98 | TestStringStream<wistringstream>(); | |
99 | } | |
100 | ||
101 | TEST(IStreamWrapper, wstringstream) { | |
102 | TestStringStream<wstringstream>(); | |
103 | } | |
104 | ||
105 | template <typename FileStreamType> | |
106 | static 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 | ||
124 | TEST(IStreamWrapper, ifstream) { | |
125 | ifstream ifs; | |
126 | ASSERT_TRUE(Open(ifs, "utf8bom.json")); | |
127 | IStreamWrapper isw(ifs); | |
128 | EncodedInputStream<UTF8<>, IStreamWrapper> eis(isw); | |
129 | Document d; | |
130 | EXPECT_TRUE(!d.ParseStream(eis).HasParseError()); | |
131 | EXPECT_TRUE(d.IsObject()); | |
1e59de90 | 132 | EXPECT_EQ(5u, d.MemberCount()); |
31f18b77 FG |
133 | } |
134 | ||
135 | TEST(IStreamWrapper, fstream) { | |
136 | fstream fs; | |
137 | ASSERT_TRUE(Open(fs, "utf8bom.json")); | |
138 | IStreamWrapper isw(fs); | |
139 | EncodedInputStream<UTF8<>, IStreamWrapper> eis(isw); | |
140 | Document d; | |
141 | EXPECT_TRUE(!d.ParseStream(eis).HasParseError()); | |
142 | EXPECT_TRUE(d.IsObject()); | |
1e59de90 | 143 | EXPECT_EQ(5u, d.MemberCount()); |
31f18b77 FG |
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 | ||
151 | TEST(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); | |
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()); | |
162 | } | |
163 | ||
164 | TEST(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); | |
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()); | |
175 | } | |
176 | ||
177 | #endif | |
178 | ||
1e59de90 | 179 | #if defined(_MSC_VER) && !defined(__clang__) |
31f18b77 FG |
180 | RAPIDJSON_DIAG_POP |
181 | #endif |