blob: 85e21d499431182ece7216e80338de277d21b948 [file] [log] [blame]
Austin Schuh3e95e5d2019-09-20 00:08:54 -07001#include "aos/json_to_flatbuffer.h"
2
Philipp Schrader790cb542023-07-05 21:06:52 -07003#include "flatbuffers/minireflect.h"
4#include "gtest/gtest.h"
5
Alexander Yeee61cac32023-02-11 19:40:40 -08006#include "aos/flatbuffer_merge.h"
Austin Schuh3e95e5d2019-09-20 00:08:54 -07007#include "aos/json_to_flatbuffer_generated.h"
Austin Schuh373f1762021-06-02 21:07:09 -07008#include "aos/testing/path.h"
Austin Schuh3e95e5d2019-09-20 00:08:54 -07009
Stephan Pleinesf63bde82024-01-13 15:59:33 -080010namespace aos::testing {
Austin Schuh3e95e5d2019-09-20 00:08:54 -070011
12class JsonToFlatbufferTest : public ::testing::Test {
13 public:
14 JsonToFlatbufferTest() {}
15
Brian Silvermanc5105ab2021-02-10 17:55:38 -080016 FlatbufferVector<reflection::Schema> Schema() {
Austin Schuh373f1762021-06-02 21:07:09 -070017 return FileToFlatbuffer<reflection::Schema>(
18 ArtifactPath("aos/json_to_flatbuffer.bfbs"));
Brian Silvermanc5105ab2021-02-10 17:55:38 -080019 }
20
Austin Schuh3e95e5d2019-09-20 00:08:54 -070021 bool JsonAndBack(const ::std::string str) { return JsonAndBack(str, str); }
22
23 bool JsonAndBack(const ::std::string in, const ::std::string out) {
24 printf("Testing: %s\n", in.c_str());
Brian Silvermanc5105ab2021-02-10 17:55:38 -080025 FlatbufferDetachedBuffer<Configuration> fb_typetable =
Austin Schuhadd6eb32020-11-09 21:24:26 -080026 JsonToFlatbuffer<Configuration>(in.data());
Brian Silvermanc5105ab2021-02-10 17:55:38 -080027 FlatbufferDetachedBuffer<Configuration> fb_reflection =
28 JsonToFlatbuffer(in.data(), FlatbufferType(&Schema().message()));
Austin Schuh3e95e5d2019-09-20 00:08:54 -070029
Brian Silvermanc5105ab2021-02-10 17:55:38 -080030 if (fb_typetable.span().size() == 0) {
31 return false;
32 }
33 if (fb_reflection.span().size() == 0) {
Austin Schuh3e95e5d2019-09-20 00:08:54 -070034 return false;
35 }
36
Brian Silvermanc5105ab2021-02-10 17:55:38 -080037 const ::std::string back_typetable = FlatbufferToJson(fb_typetable);
38 const ::std::string back_reflection = FlatbufferToJson(fb_reflection);
Austin Schuh3e95e5d2019-09-20 00:08:54 -070039
Brian Silvermanc5105ab2021-02-10 17:55:38 -080040 printf("Back to string via TypeTable: %s\n", back_typetable.c_str());
41 printf("Back to string via reflection: %s\n", back_reflection.c_str());
Austin Schuh3e95e5d2019-09-20 00:08:54 -070042
Stephan Pleines89836852023-09-15 20:11:57 -070043 const bool as_expected = back_typetable == out && back_reflection == out;
44 if (!as_expected) {
45 printf("But expected: %s\n", out.c_str());
46 }
47 return as_expected;
Austin Schuh3e95e5d2019-09-20 00:08:54 -070048 }
49};
50
51// Tests that the various escapes work as expected.
52TEST_F(JsonToFlatbufferTest, ValidEscapes) {
53 EXPECT_TRUE(
54 JsonAndBack("{ \"foo_string\": \"a\\\"b\\/c\\bd\\fc\\nd\\re\\tf\" }",
55 "{ \"foo_string\": \"a\\\"b/c\\bd\\fc\\nd\\re\\tf\" }"));
56}
57
58// Test the easy ones. Test every type, single, no nesting.
59TEST_F(JsonToFlatbufferTest, Basic) {
60 EXPECT_TRUE(JsonAndBack("{ \"foo_bool\": true }"));
61
62 EXPECT_TRUE(JsonAndBack("{ \"foo_byte\": 5 }"));
63 EXPECT_TRUE(JsonAndBack("{ \"foo_ubyte\": 5 }"));
64
65 EXPECT_TRUE(JsonAndBack("{ \"foo_short\": 5 }"));
66 EXPECT_TRUE(JsonAndBack("{ \"foo_ushort\": 5 }"));
67
68 EXPECT_TRUE(JsonAndBack("{ \"foo_int\": 5 }"));
69 EXPECT_TRUE(JsonAndBack("{ \"foo_uint\": 5 }"));
70
71 EXPECT_TRUE(JsonAndBack("{ \"foo_long\": 5 }"));
72 EXPECT_TRUE(JsonAndBack("{ \"foo_ulong\": 5 }"));
73
74 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": 5.0 }"));
75 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": 5.0 }"));
76
Alex Perrycb7da4b2019-08-28 19:35:56 -070077 EXPECT_TRUE(JsonAndBack("{ \"foo_enum\": \"None\" }"));
78 EXPECT_TRUE(JsonAndBack("{ \"foo_enum\": \"UType\" }"));
79
80 EXPECT_TRUE(JsonAndBack("{ \"foo_enum_default\": \"None\" }"));
81 EXPECT_TRUE(JsonAndBack("{ \"foo_enum_default\": \"UType\" }"));
82
Austin Schuh3e95e5d2019-09-20 00:08:54 -070083 EXPECT_TRUE(JsonAndBack("{ \"foo_string\": \"baz\" }"));
Brian Silverman5c710412021-02-09 19:09:32 -080084
85 EXPECT_TRUE(JsonAndBack("{ \"foo_enum_nonconsecutive\": \"Zero\" }"));
86 EXPECT_TRUE(JsonAndBack("{ \"foo_enum_nonconsecutive\": \"Big\" }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -070087}
88
James Kuszmaul768c4682023-10-12 21:07:16 -070089TEST_F(JsonToFlatbufferTest, Structs) {
90 EXPECT_TRUE(
91 JsonAndBack("{ \"foo_struct\": { \"foo_byte\": 1, \"nested_struct\": { "
92 "\"foo_byte\": 2 } } }"));
93 EXPECT_TRUE(JsonAndBack(
94 "{ \"foo_struct_scalars\": { \"foo_float\": 1.234, \"foo_double\": "
95 "4.567, \"foo_int32\": -971, \"foo_uint32\": 4294967294, \"foo_int64\": "
96 "-1030, \"foo_uint64\": 18446744073709551614 } }"));
97 // Confirm that we parse integers into floating point fields correctly.
98 EXPECT_TRUE(JsonAndBack(
99 "{ \"foo_struct_scalars\": { \"foo_float\": 1, \"foo_double\": "
100 "2, \"foo_int32\": 3, \"foo_uint32\": 4, \"foo_int64\": "
101 "5, \"foo_uint64\": 6 } }",
102 "{ \"foo_struct_scalars\": { \"foo_float\": 1.0, \"foo_double\": "
103 "2.0, \"foo_int32\": 3, \"foo_uint32\": 4, \"foo_int64\": "
104 "5, \"foo_uint64\": 6 } }"));
105 EXPECT_TRUE(JsonAndBack(
106 "{ \"vector_foo_struct_scalars\": [ { \"foo_float\": 1.234, "
107 "\"foo_double\": 4.567, \"foo_int32\": -971, \"foo_uint32\": 4294967294, "
108 "\"foo_int64\": -1030, \"foo_uint64\": 18446744073709551614 }, { "
109 "\"foo_float\": 2.0, \"foo_double\": 4.1, \"foo_int32\": 10, "
110 "\"foo_uint32\": 13, \"foo_int64\": 15, \"foo_uint64\": 18 } ] }"));
111 EXPECT_TRUE(
112 JsonAndBack("{ \"foo_struct_enum\": { \"foo_enum\": \"UByte\" } }"));
113 EXPECT_TRUE(
114 JsonAndBack("{ \"vector_foo_struct\": [ { \"foo_byte\": 1, "
115 "\"nested_struct\": { \"foo_byte\": 2 } } ] }"));
116 EXPECT_TRUE(JsonAndBack(
117 "{ \"vector_foo_struct\": [ { \"foo_byte\": 1, \"nested_struct\": { "
118 "\"foo_byte\": 2 } }, { \"foo_byte\": 3, \"nested_struct\": { "
119 "\"foo_byte\": 4 } }, { \"foo_byte\": 5, \"nested_struct\": { "
120 "\"foo_byte\": 6 } } ] }"));
121}
122
123// Confirm that we correctly die when input JSON is missing fields inside of a
124// struct.
125TEST_F(JsonToFlatbufferTest, StructMissingField) {
126 ::testing::internal::CaptureStderr();
127 EXPECT_FALSE(
128 JsonAndBack("{ \"foo_struct\": { \"nested_struct\": { "
129 "\"foo_byte\": 2 } } }"));
130 EXPECT_FALSE(JsonAndBack(
131 "{ \"foo_struct\": { \"foo_byte\": 1, \"nested_struct\": { } } }"));
132 EXPECT_FALSE(JsonAndBack("{ \"foo_struct\": { \"foo_byte\": 1 } }"));
133 std::string output = ::testing::internal::GetCapturedStderr();
134 EXPECT_EQ(
135 R"output(All fields must be specified for struct types (field foo_byte missing).
136All fields must be specified for struct types (field foo_byte missing).
137All fields must be specified for struct types (field foo_byte missing).
138All fields must be specified for struct types (field foo_byte missing).
139All fields must be specified for struct types (field nested_struct missing).
140All fields must be specified for struct types (field nested_struct missing).
141)output",
142 output);
143}
144
Austin Schuh9fa0b8e2021-03-21 19:21:50 -0700145// Tests that Inf is handled correctly
146TEST_F(JsonToFlatbufferTest, Inf) {
147 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": inf }"));
148 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": -inf }"));
149 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": inf }"));
150 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": -inf }"));
151}
152
Austin Schuhbba0c3c2019-11-29 22:00:34 -0800153// Tests that NaN is handled correctly
154TEST_F(JsonToFlatbufferTest, Nan) {
155 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": nan }"));
156 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": -nan }"));
Austin Schuh9fa0b8e2021-03-21 19:21:50 -0700157 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": nan }"));
158 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": -nan }"));
Austin Schuhbba0c3c2019-11-29 22:00:34 -0800159}
160
Pallavi Madhukare2eb2812022-07-19 09:56:09 -0700161// Tests that unicode is handled correctly
162TEST_F(JsonToFlatbufferTest, Unicode) {
163 EXPECT_TRUE(JsonAndBack("{ \"foo_string\": \"\\uF672\" }"));
164 EXPECT_TRUE(JsonAndBack("{ \"foo_string\": \"\\uEFEF\" }"));
165 EXPECT_TRUE(JsonAndBack("{ \"foo_string\": \"helloworld\\uD83E\\uDE94\" }"));
166 EXPECT_TRUE(JsonAndBack("{ \"foo_string\": \"\\uD83C\\uDF32\" }"));
167 EXPECT_FALSE(JsonAndBack("{ \"foo_string\": \"\\uP890\" }"));
168 EXPECT_FALSE(JsonAndBack("{ \"foo_string\": \"\\u!FA8\" }"));
169 EXPECT_FALSE(JsonAndBack("{ \"foo_string\": \"\\uF89\" }"));
170 EXPECT_FALSE(JsonAndBack("{ \"foo_string\": \"\\uD83C\" }"));
171}
172
Austin Schuh84314af2019-10-03 09:11:34 -0700173// Tests that we can handle decimal points.
174TEST_F(JsonToFlatbufferTest, DecimalPoint) {
175 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": 5.1 }"));
176 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": 5.1 }"));
177}
178
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700179// Test what happens if you pass a field name that we don't know.
180TEST_F(JsonToFlatbufferTest, InvalidFieldName) {
181 EXPECT_FALSE(JsonAndBack("{ \"foo\": 5 }"));
182}
183
Alex Perrycb7da4b2019-08-28 19:35:56 -0700184// Tests that an invalid enum type is handled correctly.
185TEST_F(JsonToFlatbufferTest, InvalidEnumName) {
186 EXPECT_FALSE(JsonAndBack("{ \"foo_enum\": \"5ype\" }"));
187
188 EXPECT_FALSE(JsonAndBack("{ \"foo_enum_default\": \"7ype\" }"));
Brian Silverman5c710412021-02-09 19:09:32 -0800189
190 EXPECT_FALSE(JsonAndBack("{ \"foo_enum_nonconsecutive\": \"Nope\" }"));
191
192 EXPECT_FALSE(
193 JsonAndBack("{ \"foo_enum_nonconsecutive_default\": \"Nope\" }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700194}
195
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700196// Test that adding a duplicate field results in an error.
197TEST_F(JsonToFlatbufferTest, DuplicateField) {
198 EXPECT_FALSE(
199 JsonAndBack("{ \"foo_int\": 5, \"foo_int\": 7 }", "{ \"foo_int\": 7 }"));
200}
201
202// Test that various syntax errors are caught correctly
203TEST_F(JsonToFlatbufferTest, InvalidSyntax) {
204 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5"));
205 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5 "));
206 EXPECT_FALSE(JsonAndBack("{ \"foo_string\": \""));
207 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5 } }"));
208
209 EXPECT_FALSE(JsonAndBack("{ foo_int: 5 }"));
210
211 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5, }", "{ \"foo_int\": 5 }"));
212
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700213 EXPECT_FALSE(
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700214 JsonAndBack("{ \"apps\":\n[\n{\n\"name\": \"woot\"\n},\n{\n\"name\": "
215 "\"wow\"\n} ,\n]\n}"));
216
217 EXPECT_FALSE(JsonAndBack(
218 "{ \"apps\": [ { \"name\": \"woot\" }, { \"name\": \"wow\" } ] , }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700219
220 EXPECT_FALSE(
221 JsonAndBack("{ \"vector_foo_string\": [ \"bar\", \"baz\" ] , }"));
222
223 EXPECT_FALSE(
224 JsonAndBack("{ \"single_application\": { \"name\": \"woot\" } , }"));
225}
226
227// Test arrays of simple types.
228TEST_F(JsonToFlatbufferTest, Array) {
229 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_byte\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700230 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_byte\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700231 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ubyte\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700232 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ubyte\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700233
234 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_short\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700235 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_short\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700236 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ushort\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700237 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ushort\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700238
239 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_int\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700240 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_int\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700241 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_uint\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700242 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_uint\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700243
244 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_long\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700245 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_long\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700246 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ulong\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700247 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ulong\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700248
249 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700250 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700251 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700252 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700253
254 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ 9, 7, 1 ] }",
255 "{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ] }"));
256 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ 9, 7, 1 ] }",
257 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
258
259 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_string\": [ \"bar\", \"baz\" ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700260 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_string\": [ ] }"));
Ravago Jonescf453ab2020-05-06 21:14:53 -0700261 EXPECT_TRUE(JsonAndBack(
262 "{ \"vector_foo_enum\": [ \"None\", \"UType\", \"Bool\" ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700263 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_enum\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700264}
265
266// Test nested messages, and arrays of nested messages.
James Kuszmaul768c4682023-10-12 21:07:16 -0700267TEST_F(JsonToFlatbufferTest, NestedTable) {
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700268 EXPECT_TRUE(
269 JsonAndBack("{ \"single_application\": { \"name\": \"woot\" } }"));
270
Alex Perrycb7da4b2019-08-28 19:35:56 -0700271 EXPECT_TRUE(JsonAndBack("{ \"single_application\": { } }"));
272
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700273 EXPECT_TRUE(JsonAndBack(
274 "{ \"apps\": [ { \"name\": \"woot\" }, { \"name\": \"wow\" } ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700275
Ravago Jonescf453ab2020-05-06 21:14:53 -0700276 EXPECT_TRUE(JsonAndBack("{ \"apps\": [ { }, { } ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700277}
278
James Kuszmaulbb60dfd2023-01-05 17:13:11 -0800279// Test mixing up whether a field is an object or a vector.
280TEST_F(JsonToFlatbufferTest, IncorrectVectorOfTables) {
281 EXPECT_FALSE(
282 JsonAndBack("{ \"single_application\": [ {\"name\": \"woot\"} ] }"));
283 EXPECT_FALSE(JsonAndBack("{ \"apps\": { \"name\": \"woot\" } }"));
284}
285
Austin Schuh84314af2019-10-03 09:11:34 -0700286// Test that we can parse an empty message.
287TEST_F(JsonToFlatbufferTest, EmptyMessage) {
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700288 // Empty message works.
Austin Schuh84314af2019-10-03 09:11:34 -0700289 EXPECT_TRUE(JsonAndBack("{ }"));
290}
291
Stephan Pleines89836852023-09-15 20:11:57 -0700292// Tests that C style comments get stripped.
293TEST_F(JsonToFlatbufferTest, CStyleComments) {
294 EXPECT_TRUE(JsonAndBack(R"({
295 /* foo */
296 "vector_foo_double": [ 9, 7, 1 ] /* foo */
297} /* foo */)",
298 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
299}
300
301// Tests that C++ style comments get stripped.
302TEST_F(JsonToFlatbufferTest, CppStyleComments) {
303 EXPECT_TRUE(JsonAndBack(R"({
304 // foo
305 "vector_foo_double": [ 9, 7, 1 ] // foo
306} // foo)",
307 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
308}
309
310// Tests that mixed style comments get stripped.
311TEST_F(JsonToFlatbufferTest, MixedStyleComments) {
312 // Weird comments do not throw us off.
313 EXPECT_TRUE(JsonAndBack(R"({
314 // foo /* foo */
315 "vector_foo_double": [ 9, 7, 1 ] /* // foo */
316}
317// foo
318/* foo */)",
Austin Schuh81da4b22019-10-06 14:03:24 -0700319 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
320}
321
Austin Schuh9e2532d2019-10-06 14:01:15 -0700322// Tests that multiple arrays get properly handled.
323TEST_F(JsonToFlatbufferTest, MultipleArrays) {
324 EXPECT_TRUE(
325 JsonAndBack("{ \"vector_foo_float\": [ 9, 7, 1 ], \"vector_foo_double\": "
326 "[ 9, 7, 1 ] }",
327 "{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ], "
328 "\"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
329}
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700330
Alex Perrycb7da4b2019-08-28 19:35:56 -0700331// Tests that multiple arrays get properly handled.
332TEST_F(JsonToFlatbufferTest, NestedArrays) {
333 EXPECT_TRUE(
Ravago Jonescf453ab2020-05-06 21:14:53 -0700334 JsonAndBack("{ \"vov\": { \"v\": [ { \"str\": [ \"a\", \"b\" ] }, { "
335 "\"str\": [ \"c\", \"d\" ] } ] } }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700336}
337
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700338// TODO(austin): Missmatched values.
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700339//
340// TODO(austin): unions?
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700341
Austin Schuhd3936202020-04-07 20:11:07 -0700342TEST_F(JsonToFlatbufferTest, TrimmedVector) {
343 std::string json_short = "{ \"vector_foo_int\": [ 0";
344 for (int i = 1; i < 100; ++i) {
345 json_short += ", ";
346 json_short += std::to_string(i);
347 }
348 std::string json_long = json_short;
349 json_short += " ] }";
350 json_long += ", 101 ] }";
351
Brian Silvermanc5105ab2021-02-10 17:55:38 -0800352 const FlatbufferDetachedBuffer<Configuration> fb_short_typetable(
Austin Schuhadd6eb32020-11-09 21:24:26 -0800353 JsonToFlatbuffer<Configuration>(json_short));
Brian Silvermanc5105ab2021-02-10 17:55:38 -0800354 ASSERT_GT(fb_short_typetable.span().size(), 0);
355 const FlatbufferDetachedBuffer<Configuration> fb_long_typetable(
Austin Schuhadd6eb32020-11-09 21:24:26 -0800356 JsonToFlatbuffer<Configuration>(json_long));
Brian Silvermanc5105ab2021-02-10 17:55:38 -0800357 ASSERT_GT(fb_long_typetable.span().size(), 0);
358 const FlatbufferDetachedBuffer<Configuration> fb_short_reflection(
359 JsonToFlatbuffer(json_short, FlatbufferType(&Schema().message())));
360 ASSERT_GT(fb_short_reflection.span().size(), 0);
361 const FlatbufferDetachedBuffer<Configuration> fb_long_reflection(
362 JsonToFlatbuffer(json_long, FlatbufferType(&Schema().message())));
363 ASSERT_GT(fb_long_reflection.span().size(), 0);
Austin Schuhd3936202020-04-07 20:11:07 -0700364
Brian Silvermanc5105ab2021-02-10 17:55:38 -0800365 const std::string back_json_short_typetable = FlatbufferToJson<Configuration>(
366 fb_short_typetable, {.multi_line = false, .max_vector_size = 100});
367 const std::string back_json_long_typetable = FlatbufferToJson<Configuration>(
368 fb_long_typetable, {.multi_line = false, .max_vector_size = 100});
369 const std::string back_json_short_reflection =
370 FlatbufferToJson<Configuration>(
371 fb_short_reflection, {.multi_line = false, .max_vector_size = 100});
372 const std::string back_json_long_reflection = FlatbufferToJson<Configuration>(
373 fb_long_reflection, {.multi_line = false, .max_vector_size = 100});
Austin Schuhd3936202020-04-07 20:11:07 -0700374
Brian Silvermanc5105ab2021-02-10 17:55:38 -0800375 EXPECT_EQ(json_short, back_json_short_typetable);
376 EXPECT_EQ(json_short, back_json_short_reflection);
Austin Schuh041fe9f2021-10-16 23:01:15 -0700377 EXPECT_EQ("{ \"vector_foo_int\": [ \"... 101 elements ...\" ] }",
Brian Silvermanc5105ab2021-02-10 17:55:38 -0800378 back_json_long_typetable);
Austin Schuh041fe9f2021-10-16 23:01:15 -0700379 EXPECT_EQ("{ \"vector_foo_int\": [ \"... 101 elements ...\" ] }",
Brian Silvermanc5105ab2021-02-10 17:55:38 -0800380 back_json_long_reflection);
Austin Schuhd3936202020-04-07 20:11:07 -0700381}
382
Austin Schuh7f99e472020-06-17 20:38:17 -0700383// Tests that a nullptr buffer prints nullptr.
384TEST_F(JsonToFlatbufferTest, NullptrData) {
385 EXPECT_EQ("null", TableFlatbufferToJson((const flatbuffers::Table *)(nullptr),
Ravago Jonescf453ab2020-05-06 21:14:53 -0700386 ConfigurationTypeTable()));
Austin Schuh7f99e472020-06-17 20:38:17 -0700387}
388
Alexander Yeee61cac32023-02-11 19:40:40 -0800389TEST_F(JsonToFlatbufferTest, SpacedData) {
390 EXPECT_TRUE(CompareFlatBuffer(
391 FlatbufferDetachedBuffer<VectorOfStrings>(
392 JsonToFlatbuffer<VectorOfStrings>(R"json({
393 "str": [
394 "f o o",
395 "b a r",
396 "foo bar",
397 "bar foo"
398 ]
399})json")),
400 JsonFileToFlatbuffer<VectorOfStrings>(
401 ArtifactPath("aos/json_to_flatbuffer_test_spaces.json"))));
402}
403
Stephan Pleinesf63bde82024-01-13 15:59:33 -0800404} // namespace aos::testing