123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- // Tencent is pleased to support the open source community by making RapidJSON available.
- //
- // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
- //
- // Licensed under the MIT License (the "License"); you may not use this file except
- // in compliance with the License. You may obtain a copy of the License at
- //
- // http://opensource.org/licenses/MIT
- //
- // Unless required by applicable law or agreed to in writing, software distributed
- // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
- // CONDITIONS OF ANY KIND, either express or implied. See the License for the
- // specific language governing permissions and limitations under the License.
- #include "unittest.h"
- #include "rapidjson/istreamwrapper.h"
- #include "rapidjson/encodedstream.h"
- #include "rapidjson/document.h"
- #include <sstream>
- #include <fstream>
- #ifdef _MSC_VER
- RAPIDJSON_DIAG_PUSH
- RAPIDJSON_DIAG_OFF(4702) // unreachable code
- #endif
- using namespace rapidjson;
- using namespace std;
- template <typename StringStreamType>
- static void TestStringStream() {
- typedef typename StringStreamType::char_type Ch;
- {
- StringStreamType iss;
- BasicIStreamWrapper<StringStreamType> is(iss);
- EXPECT_EQ(0, is.Tell());
- if (sizeof(Ch) == 1) {
- EXPECT_EQ(0, is.Peek4());
- EXPECT_EQ(0, is.Tell());
- }
- EXPECT_EQ(0, is.Peek());
- EXPECT_EQ(0, is.Take());
- EXPECT_EQ(0, is.Tell());
- }
- {
- Ch s[] = { 'A', 'B', 'C', '\0' };
- StringStreamType iss(s);
- BasicIStreamWrapper<StringStreamType> is(iss);
- EXPECT_EQ(0, is.Tell());
- if (sizeof(Ch) == 1) {
- EXPECT_EQ(0, is.Peek4()); // less than 4 bytes
- }
- for (int i = 0; i < 3; i++) {
- EXPECT_EQ(static_cast<size_t>(i), is.Tell());
- EXPECT_EQ('A' + i, is.Peek());
- EXPECT_EQ('A' + i, is.Peek());
- EXPECT_EQ('A' + i, is.Take());
- }
- EXPECT_EQ(3, is.Tell());
- EXPECT_EQ(0, is.Peek());
- EXPECT_EQ(0, is.Take());
- }
- {
- Ch s[] = { 'A', 'B', 'C', 'D', 'E', '\0' };
- StringStreamType iss(s);
- BasicIStreamWrapper<StringStreamType> is(iss);
- if (sizeof(Ch) == 1) {
- const Ch* c = is.Peek4();
- for (int i = 0; i < 4; i++)
- EXPECT_EQ('A' + i, c[i]);
- EXPECT_EQ(0, is.Tell());
- }
- for (int i = 0; i < 5; i++) {
- EXPECT_EQ(static_cast<size_t>(i), is.Tell());
- EXPECT_EQ('A' + i, is.Peek());
- EXPECT_EQ('A' + i, is.Peek());
- EXPECT_EQ('A' + i, is.Take());
- }
- EXPECT_EQ(5, is.Tell());
- EXPECT_EQ(0, is.Peek());
- EXPECT_EQ(0, is.Take());
- }
- }
- TEST(IStreamWrapper, istringstream) {
- TestStringStream<istringstream>();
- }
- TEST(IStreamWrapper, stringstream) {
- TestStringStream<stringstream>();
- }
- TEST(IStreamWrapper, wistringstream) {
- TestStringStream<wistringstream>();
- }
- TEST(IStreamWrapper, wstringstream) {
- TestStringStream<wstringstream>();
- }
- template <typename FileStreamType>
- static bool Open(FileStreamType& fs, const char* filename) {
- const char *paths[] = {
- "encodings",
- "bin/encodings",
- "../bin/encodings",
- "../../bin/encodings",
- "../../../bin/encodings"
- };
- char buffer[1024];
- for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) {
- sprintf(buffer, "%s/%s", paths[i], filename);
- fs.open(buffer, ios_base::in | ios_base::binary);
- if (fs.is_open())
- return true;
- }
- return false;
- }
- TEST(IStreamWrapper, ifstream) {
- ifstream ifs;
- ASSERT_TRUE(Open(ifs, "utf8bom.json"));
- IStreamWrapper isw(ifs);
- EncodedInputStream<UTF8<>, IStreamWrapper> eis(isw);
- Document d;
- EXPECT_TRUE(!d.ParseStream(eis).HasParseError());
- EXPECT_TRUE(d.IsObject());
- EXPECT_EQ(5, d.MemberCount());
- }
- TEST(IStreamWrapper, fstream) {
- fstream fs;
- ASSERT_TRUE(Open(fs, "utf8bom.json"));
- IStreamWrapper isw(fs);
- EncodedInputStream<UTF8<>, IStreamWrapper> eis(isw);
- Document d;
- EXPECT_TRUE(!d.ParseStream(eis).HasParseError());
- EXPECT_TRUE(d.IsObject());
- EXPECT_EQ(5, d.MemberCount());
- }
- // wifstream/wfstream only works on C++11 with codecvt_utf16
- // But many C++11 library still not have it.
- #if 0
- #include <codecvt>
- TEST(IStreamWrapper, wifstream) {
- wifstream ifs;
- ASSERT_TRUE(Open(ifs, "utf16bebom.json"));
- ifs.imbue(std::locale(ifs.getloc(),
- new std::codecvt_utf16<wchar_t, 0x10ffff, std::consume_header>));
- WIStreamWrapper isw(ifs);
- GenericDocument<UTF16<> > d;
- d.ParseStream<kParseDefaultFlags, UTF16<>, WIStreamWrapper>(isw);
- EXPECT_TRUE(!d.HasParseError());
- EXPECT_TRUE(d.IsObject());
- EXPECT_EQ(5, d.MemberCount());
- }
- TEST(IStreamWrapper, wfstream) {
- wfstream fs;
- ASSERT_TRUE(Open(fs, "utf16bebom.json"));
- fs.imbue(std::locale(fs.getloc(),
- new std::codecvt_utf16<wchar_t, 0x10ffff, std::consume_header>));
- WIStreamWrapper isw(fs);
- GenericDocument<UTF16<> > d;
- d.ParseStream<kParseDefaultFlags, UTF16<>, WIStreamWrapper>(isw);
- EXPECT_TRUE(!d.HasParseError());
- EXPECT_TRUE(d.IsObject());
- EXPECT_EQ(5, d.MemberCount());
- }
- #endif
- #ifdef _MSC_VER
- RAPIDJSON_DIAG_POP
- #endif
|