xrpld
Loading...
Searching...
No Matches
tests/libxrpl/json/Writer.cpp
1#include <xrpl/json/Writer.h>
2
3#include <xrpl/json/Output.h>
4#include <xrpl/json/json_value.h>
5
6#include <gtest/gtest.h>
7
8#include <memory>
9#include <string>
10
11using namespace xrpl;
12using namespace json;
13
14class WriterFixture : public ::testing::Test
15{
16protected:
19
20 void
25
26 void
32
33 void
34 expectOutput(std::string const& expected) const
35 {
36 EXPECT_EQ(output_, expected);
37 }
38
39 void
41 {
42 expectOutput(expected);
43 reset();
44 }
45};
46
47TEST_F(WriterFixture, trivial)
48{
49 EXPECT_TRUE(output_.empty());
50 checkOutputAndReset("");
51}
52
53TEST_F(WriterFixture, near_trivial)
54{
55 EXPECT_TRUE(output_.empty());
56 writer_->output(0);
57 checkOutputAndReset("0");
58}
59
60TEST_F(WriterFixture, primitives)
61{
62 writer_->output(true);
63 checkOutputAndReset("true");
64
65 writer_->output(false);
66 checkOutputAndReset("false");
67
68 writer_->output(23);
69 checkOutputAndReset("23");
70
71 writer_->output(23.0);
72 checkOutputAndReset("23.0");
73
74 writer_->output(23.5);
75 checkOutputAndReset("23.5");
76
77 writer_->output("a string");
78 checkOutputAndReset(R"("a string")");
79
80 writer_->output(nullptr);
81 checkOutputAndReset("null");
82}
83
84TEST_F(WriterFixture, empty)
85{
86 writer_->startRoot(Writer::CollectionType::Array);
87 writer_->finish();
88 checkOutputAndReset("[]");
89
90 writer_->startRoot(Writer::CollectionType::Object);
91 writer_->finish();
92 checkOutputAndReset("{}");
93}
94
95TEST_F(WriterFixture, escaping)
96{
97 writer_->output("\\");
98 checkOutputAndReset(R"("\\")");
99
100 writer_->output("\"");
101 checkOutputAndReset(R"("\"")");
102
103 writer_->output("\\\"");
104 checkOutputAndReset(R"("\\\"")");
105
106 writer_->output("this contains a \\ in the middle of it.");
107 checkOutputAndReset(R"("this contains a \\ in the middle of it.")");
108
109 writer_->output("\b\f\n\r\t");
110 checkOutputAndReset(R"("\b\f\n\r\t")");
111}
112
113TEST_F(WriterFixture, array)
114{
115 writer_->startRoot(Writer::CollectionType::Array);
116 writer_->append(12);
117 writer_->finish();
118 checkOutputAndReset("[12]");
119}
120
121TEST_F(WriterFixture, long_array)
122{
123 writer_->startRoot(Writer::CollectionType::Array);
124 writer_->append(12);
125 writer_->append(true);
126 writer_->append("hello");
127 writer_->finish();
128 checkOutputAndReset(R"([12,true,"hello"])");
129}
130
131TEST_F(WriterFixture, embedded_array_simple)
132{
133 writer_->startRoot(Writer::CollectionType::Array);
134 writer_->startAppend(Writer::CollectionType::Array);
135 writer_->finish();
136 writer_->finish();
137 checkOutputAndReset("[[]]");
138}
139
140TEST_F(WriterFixture, object)
141{
142 writer_->startRoot(Writer::CollectionType::Object);
143 writer_->set("hello", "world");
144 writer_->finish();
145 checkOutputAndReset(R"({"hello":"world"})");
146}
147
148TEST_F(WriterFixture, complex_object)
149{
150 writer_->startRoot(Writer::CollectionType::Object);
151 writer_->set("hello", "world");
152 writer_->startSet(Writer::CollectionType::Array, "array");
153 writer_->append(true);
154 writer_->append(12);
155 writer_->startAppend(Writer::CollectionType::Array);
156 writer_->startAppend(Writer::CollectionType::Object);
157 writer_->set("goodbye", "cruel world.");
158 writer_->startSet(Writer::CollectionType::Array, "subarray");
159 writer_->append(23.5);
160 writer_->finishAll();
161 checkOutputAndReset(
162 R"({"hello":"world","array":[true,12,[{"goodbye":"cruel world.","subarray":[23.5]}]]})");
163}
164
165TEST_F(WriterFixture, json_value)
166{
168 value["foo"] = 23;
169 writer_->startRoot(Writer::CollectionType::Object);
170 writer_->set("hello", value);
171 writer_->finish();
172 checkOutputAndReset(R"({"hello":{"foo":23}})");
173}
void expectOutput(std::string const &expected) const
std::unique_ptr< Writer > writer_
void checkOutputAndReset(std::string const &expected)
Represents a JSON value.
Definition json_value.h:130
T make_unique(T... args)
JSON (JavaScript Object Notation).
Definition json_errors.h:5
@ Object
object value (collection of name/value pairs).
Definition json_value.h:26
Output stringOutput(std::string &s)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5