prettywritertest.cpp 5.6 KB

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