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 #include "rapidjson/reader.h"
17 #include "rapidjson/prettywriter.h"
18 #include "rapidjson/stringbuffer.h"
19 #include "rapidjson/filewritestream.h"
20
21 using namespace rapidjson;
22
23 static const char kJson[] = "{\"hello\":\"world\",\"t\":true,\"f\":false,\"n\":null,\"i\":123,\"pi\":3.1416,\"a\":[1,2,3,-1],\"u64\":1234567890123456789,\"i64\":-1234567890123456789}";
24 static const char kPrettyJson[] =
25 "{\n"
26 " \"hello\": \"world\",\n"
27 " \"t\": true,\n"
28 " \"f\": false,\n"
29 " \"n\": null,\n"
30 " \"i\": 123,\n"
31 " \"pi\": 3.1416,\n"
32 " \"a\": [\n"
33 " 1,\n"
34 " 2,\n"
35 " 3,\n"
36 " -1\n"
37 " ],\n"
38 " \"u64\": 1234567890123456789,\n"
39 " \"i64\": -1234567890123456789\n"
40 "}";
41
TEST(PrettyWriter,Basic)42 TEST(PrettyWriter, Basic) {
43 StringBuffer buffer;
44 PrettyWriter<StringBuffer> writer(buffer);
45 Reader reader;
46 StringStream s(kJson);
47 reader.Parse(s, writer);
48 EXPECT_STREQ(kPrettyJson, buffer.GetString());
49 }
50
TEST(PrettyWriter,SetIndent)51 TEST(PrettyWriter, SetIndent) {
52 StringBuffer buffer;
53 PrettyWriter<StringBuffer> writer(buffer);
54 writer.SetIndent('\t', 1);
55 Reader reader;
56 StringStream s(kJson);
57 reader.Parse(s, writer);
58 EXPECT_STREQ(
59 "{\n"
60 "\t\"hello\": \"world\",\n"
61 "\t\"t\": true,\n"
62 "\t\"f\": false,\n"
63 "\t\"n\": null,\n"
64 "\t\"i\": 123,\n"
65 "\t\"pi\": 3.1416,\n"
66 "\t\"a\": [\n"
67 "\t\t1,\n"
68 "\t\t2,\n"
69 "\t\t3,\n"
70 "\t\t-1\n"
71 "\t],\n"
72 "\t\"u64\": 1234567890123456789,\n"
73 "\t\"i64\": -1234567890123456789\n"
74 "}",
75 buffer.GetString());
76 }
77
TEST(PrettyWriter,String)78 TEST(PrettyWriter, String) {
79 StringBuffer buffer;
80 PrettyWriter<StringBuffer> writer(buffer);
81 EXPECT_TRUE(writer.StartArray());
82 EXPECT_TRUE(writer.String("Hello\n"));
83 EXPECT_TRUE(writer.EndArray());
84 EXPECT_STREQ("[\n \"Hello\\n\"\n]", buffer.GetString());
85 }
86
87 #if RAPIDJSON_HAS_STDSTRING
TEST(PrettyWriter,String_STDSTRING)88 TEST(PrettyWriter, String_STDSTRING) {
89 StringBuffer buffer;
90 PrettyWriter<StringBuffer> writer(buffer);
91 EXPECT_TRUE(writer.StartArray());
92 EXPECT_TRUE(writer.String(std::string("Hello\n")));
93 EXPECT_TRUE(writer.EndArray());
94 EXPECT_STREQ("[\n \"Hello\\n\"\n]", buffer.GetString());
95 }
96 #endif
97
98 #include <sstream>
99
100 class OStreamWrapper {
101 public:
102 typedef char Ch;
103
OStreamWrapper(std::ostream & os)104 OStreamWrapper(std::ostream& os) : os_(os) {}
105
Peek() const106 Ch Peek() const { assert(false); return '\0'; }
Take()107 Ch Take() { assert(false); return '\0'; }
Tell() const108 size_t Tell() const { return 0; }
109
PutBegin()110 Ch* PutBegin() { assert(false); return 0; }
Put(Ch c)111 void Put(Ch c) { os_.put(c); }
Flush()112 void Flush() { os_.flush(); }
PutEnd(Ch *)113 size_t PutEnd(Ch*) { assert(false); return 0; }
114
115 private:
116 OStreamWrapper(const OStreamWrapper&);
117 OStreamWrapper& operator=(const OStreamWrapper&);
118
119 std::ostream& os_;
120 };
121
122 // For covering PutN() generic version
TEST(PrettyWriter,OStreamWrapper)123 TEST(PrettyWriter, OStreamWrapper) {
124 StringStream s(kJson);
125
126 std::stringstream ss;
127 OStreamWrapper os(ss);
128
129 PrettyWriter<OStreamWrapper> writer(os);
130
131 Reader reader;
132 reader.Parse(s, writer);
133
134 std::string actual = ss.str();
135 EXPECT_STREQ(kPrettyJson, actual.c_str());
136 }
137
138 // For covering FileWriteStream::PutN()
TEST(PrettyWriter,FileWriteStream)139 TEST(PrettyWriter, FileWriteStream) {
140 char filename[L_tmpnam];
141 FILE* fp = TempFile(filename);
142 char buffer[16];
143 FileWriteStream os(fp, buffer, sizeof(buffer));
144 PrettyWriter<FileWriteStream> writer(os);
145 Reader reader;
146 StringStream s(kJson);
147 reader.Parse(s, writer);
148 fclose(fp);
149
150 fp = fopen(filename, "rb");
151 fseek(fp, 0, SEEK_END);
152 size_t size = (size_t)ftell(fp);
153 fseek(fp, 0, SEEK_SET);
154 char* json = (char*)malloc(size + 1);
155 size_t readLength = fread(json, 1, size, fp);
156 json[readLength] = '\0';
157 fclose(fp);
158 remove(filename);
159 EXPECT_STREQ(kPrettyJson, json);
160 free(json);
161 }