rippled
Writer_test.cpp
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #include <ripple/json/json_writer.h>
21 #include <ripple/json/Writer.h>
22 #include <test/json/TestOutputSuite.h>
23 #include <ripple/beast/unit_test.h>
24 
25 namespace Json {
26 
28 {
29 public:
30  void testTrivial ()
31  {
32  setup ("trivial");
33  BEAST_EXPECT(output_.empty ());
34  expectResult("");
35  }
36 
38  {
39  setup ("near trivial");
40  BEAST_EXPECT(output_.empty ());
41  writer_->output (0);
42  expectResult("0");
43  }
44 
46  {
47  setup ("true");
48  writer_->output (true);
49  expectResult ("true");
50 
51  setup ("false");
52  writer_->output (false);
53  expectResult ("false");
54 
55  setup ("23");
56  writer_->output (23);
57  expectResult ("23");
58 
59  setup ("23.0");
60  writer_->output (23.0);
61  expectResult ("23.0");
62 
63  setup ("23.5");
64  writer_->output (23.5);
65  expectResult ("23.5");
66 
67  setup ("a string");
68  writer_->output ("a string");
69  expectResult ("\"a string\"");
70 
71  setup ("nullptr");
72  writer_->output (nullptr);
73  expectResult ("null");
74  }
75 
76  void testEmpty ()
77  {
78  setup ("empty array");
80  writer_->finish ();
81  expectResult ("[]");
82 
83  setup ("empty object");
85  writer_->finish ();
86  expectResult ("{}");
87  }
88 
89  void testEscaping ()
90  {
91  setup ("backslash");
92  writer_->output ("\\");
93  expectResult ("\"\\\\\"");
94 
95  setup ("quote");
96  writer_->output ("\"");
97  expectResult ("\"\\\"\"");
98 
99  setup ("backslash and quote");
100  writer_->output ("\\\"");
101  expectResult ("\"\\\\\\\"\"");
102 
103  setup ("escape embedded");
104  writer_->output ("this contains a \\ in the middle of it.");
105  expectResult ("\"this contains a \\\\ in the middle of it.\"");
106 
107  setup ("remaining escapes");
108  writer_->output ("\b\f\n\r\t");
109  expectResult ("\"\\b\\f\\n\\r\\t\"");
110  }
111 
112  void testArray ()
113  {
114  setup ("empty array");
116  writer_->append (12);
117  writer_->finish ();
118  expectResult ("[12]");
119  }
120 
122  {
123  setup ("long array");
125  writer_->append (12);
126  writer_->append (true);
127  writer_->append ("hello");
128  writer_->finish ();
129  expectResult ("[12,true,\"hello\"]");
130  }
131 
133  {
134  setup ("embedded array simple");
137  writer_->finish ();
138  writer_->finish ();
139  expectResult ("[[]]");
140  }
141 
142  void testObject ()
143  {
144  setup ("object");
146  writer_->set ("hello", "world");
147  writer_->finish ();
148 
149  expectResult ("{\"hello\":\"world\"}");
150  }
151 
153  {
154  setup ("complex object");
156 
157  writer_->set ("hello", "world");
158  writer_->startSet (Writer::array, "array");
159 
160  writer_->append (true);
161  writer_->append (12);
164  writer_->set ("goodbye", "cruel world.");
165  writer_->startSet (Writer::array, "subarray");
166  writer_->append (23.5);
167  writer_->finishAll ();
168 
169  expectResult ("{\"hello\":\"world\",\"array\":[true,12,"
170  "[{\"goodbye\":\"cruel world.\","
171  "\"subarray\":[23.5]}]]}");
172  }
173 
174  void testJson ()
175  {
176  setup ("object");
178  value["foo"] = 23;
180  writer_->set ("hello", value);
181  writer_->finish ();
182 
183  expectResult ("{\"hello\":{\"foo\":23}}");
184  }
185 
186  void run () override
187  {
188  testTrivial ();
189  testNearTrivial ();
190  testPrimitives ();
191  testEmpty ();
192  testEscaping ();
193  testArray ();
194  testLongArray ();
196  testObject ();
198  testJson();
199  }
200 };
201 
202 BEAST_DEFINE_TESTSUITE(JsonWriter, ripple_basics, ripple);
203 
204 } // Json
ripple::test::TestOutputSuite::setup
void setup(std::string const &testName)
Definition: TestOutputSuite.h:36
Json::Writer::append
void append(Scalar t)
Append a value to an array.
Definition: json/Writer.h:159
Json::Writer::finish
void finish()
Finish the collection most recently started.
Definition: Writer.cpp:316
Json::BEAST_DEFINE_TESTSUITE
BEAST_DEFINE_TESTSUITE(JsonObject, ripple_basics, ripple)
Json::JsonWriter_test::testNearTrivial
void testNearTrivial()
Definition: Writer_test.cpp:37
Json::Writer::set
void set(std::string const &tag, Type t)
Add a key, value assignment to an object.
Definition: json/Writer.h:181
Json::JsonWriter_test::testComplexObject
void testComplexObject()
Definition: Writer_test.cpp:152
Json::Writer::startAppend
void startAppend(CollectionType)
Start a new collection inside an array.
Definition: Writer.cpp:303
Json::Writer::startRoot
void startRoot(CollectionType)
Start a new collection at the root level.
Definition: Writer.cpp:298
Json::JsonWriter_test::testJson
void testJson()
Definition: Writer_test.cpp:174
Json::JsonWriter_test::testArray
void testArray()
Definition: Writer_test.cpp:112
Json::JsonWriter_test
Definition: Writer_test.cpp:27
Json::Writer::finishAll
void finishAll()
Finish all objects and arrays.
Definition: Writer.cpp:279
Json::JsonWriter_test::testObject
void testObject()
Definition: Writer_test.cpp:142
Json
JSON (JavaScript Object Notation).
Definition: json_reader.cpp:26
Json::objectValue
@ objectValue
object value (collection of name/value pairs).
Definition: json_value.h:45
ripple::test::TestOutputSuite
Definition: TestOutputSuite.h:30
ripple::test::TestOutputSuite::output_
std::string output_
Definition: TestOutputSuite.h:33
Json::JsonWriter_test::testEmbeddedArraySimple
void testEmbeddedArraySimple()
Definition: Writer_test.cpp:132
Json::Writer::array
@ array
Definition: json/Writer.h:129
Json::JsonWriter_test::testTrivial
void testTrivial()
Definition: Writer_test.cpp:30
Json::JsonWriter_test::testLongArray
void testLongArray()
Definition: Writer_test.cpp:121
ripple::test::TestOutputSuite::writer_
std::unique_ptr< Json::Writer > writer_
Definition: TestOutputSuite.h:34
Json::Writer::startSet
void startSet(CollectionType, std::string const &key)
Start a new collection inside an object.
Definition: Writer.cpp:309
Json::JsonWriter_test::testPrimitives
void testPrimitives()
Definition: Writer_test.cpp:45
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
Json::JsonWriter_test::run
void run() override
Definition: Writer_test.cpp:186
ripple::test::TestOutputSuite::expectResult
void expectResult(std::string const &expected, std::string const &message="")
Definition: TestOutputSuite.h:45
Json::Writer::object
@ object
Definition: json/Writer.h:129
Json::JsonWriter_test::testEmpty
void testEmpty()
Definition: Writer_test.cpp:76
std::string::empty
T empty(T... args)
Json::Writer::output
void output(std::string const &)
Definition: Writer.cpp:241
Json::JsonWriter_test::testEscaping
void testEscaping()
Definition: Writer_test.cpp:89
Json::Value
Represents a JSON value.
Definition: json_value.h:141