blob: 4900711f4575a191a9e793889ed3e2e40fb45898 [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
10namespace aos {
11namespace testing {
12
13class JsonToFlatbufferTest : public ::testing::Test {
14 public:
15 JsonToFlatbufferTest() {}
16
Brian Silvermanc5105ab2021-02-10 17:55:38 -080017 FlatbufferVector<reflection::Schema> Schema() {
Austin Schuh373f1762021-06-02 21:07:09 -070018 return FileToFlatbuffer<reflection::Schema>(
19 ArtifactPath("aos/json_to_flatbuffer.bfbs"));
Brian Silvermanc5105ab2021-02-10 17:55:38 -080020 }
21
Austin Schuh3e95e5d2019-09-20 00:08:54 -070022 bool JsonAndBack(const ::std::string str) { return JsonAndBack(str, str); }
23
24 bool JsonAndBack(const ::std::string in, const ::std::string out) {
25 printf("Testing: %s\n", in.c_str());
Brian Silvermanc5105ab2021-02-10 17:55:38 -080026 FlatbufferDetachedBuffer<Configuration> fb_typetable =
Austin Schuhadd6eb32020-11-09 21:24:26 -080027 JsonToFlatbuffer<Configuration>(in.data());
Brian Silvermanc5105ab2021-02-10 17:55:38 -080028 FlatbufferDetachedBuffer<Configuration> fb_reflection =
29 JsonToFlatbuffer(in.data(), FlatbufferType(&Schema().message()));
Austin Schuh3e95e5d2019-09-20 00:08:54 -070030
Brian Silvermanc5105ab2021-02-10 17:55:38 -080031 if (fb_typetable.span().size() == 0) {
32 return false;
33 }
34 if (fb_reflection.span().size() == 0) {
Austin Schuh3e95e5d2019-09-20 00:08:54 -070035 return false;
36 }
37
Brian Silvermanc5105ab2021-02-10 17:55:38 -080038 const ::std::string back_typetable = FlatbufferToJson(fb_typetable);
39 const ::std::string back_reflection = FlatbufferToJson(fb_reflection);
Austin Schuh3e95e5d2019-09-20 00:08:54 -070040
Brian Silvermanc5105ab2021-02-10 17:55:38 -080041 printf("Back to string via TypeTable: %s\n", back_typetable.c_str());
42 printf("Back to string via reflection: %s\n", back_reflection.c_str());
Austin Schuh3e95e5d2019-09-20 00:08:54 -070043
Stephan Pleines89836852023-09-15 20:11:57 -070044 const bool as_expected = back_typetable == out && back_reflection == out;
45 if (!as_expected) {
46 printf("But expected: %s\n", out.c_str());
47 }
48 return as_expected;
Austin Schuh3e95e5d2019-09-20 00:08:54 -070049 }
50};
51
52// Tests that the various escapes work as expected.
53TEST_F(JsonToFlatbufferTest, ValidEscapes) {
54 EXPECT_TRUE(
55 JsonAndBack("{ \"foo_string\": \"a\\\"b\\/c\\bd\\fc\\nd\\re\\tf\" }",
56 "{ \"foo_string\": \"a\\\"b/c\\bd\\fc\\nd\\re\\tf\" }"));
57}
58
59// Test the easy ones. Test every type, single, no nesting.
60TEST_F(JsonToFlatbufferTest, Basic) {
61 EXPECT_TRUE(JsonAndBack("{ \"foo_bool\": true }"));
62
63 EXPECT_TRUE(JsonAndBack("{ \"foo_byte\": 5 }"));
64 EXPECT_TRUE(JsonAndBack("{ \"foo_ubyte\": 5 }"));
65
66 EXPECT_TRUE(JsonAndBack("{ \"foo_short\": 5 }"));
67 EXPECT_TRUE(JsonAndBack("{ \"foo_ushort\": 5 }"));
68
69 EXPECT_TRUE(JsonAndBack("{ \"foo_int\": 5 }"));
70 EXPECT_TRUE(JsonAndBack("{ \"foo_uint\": 5 }"));
71
72 EXPECT_TRUE(JsonAndBack("{ \"foo_long\": 5 }"));
73 EXPECT_TRUE(JsonAndBack("{ \"foo_ulong\": 5 }"));
74
75 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": 5.0 }"));
76 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": 5.0 }"));
77
Alex Perrycb7da4b2019-08-28 19:35:56 -070078 EXPECT_TRUE(JsonAndBack("{ \"foo_enum\": \"None\" }"));
79 EXPECT_TRUE(JsonAndBack("{ \"foo_enum\": \"UType\" }"));
80
81 EXPECT_TRUE(JsonAndBack("{ \"foo_enum_default\": \"None\" }"));
82 EXPECT_TRUE(JsonAndBack("{ \"foo_enum_default\": \"UType\" }"));
83
Austin Schuh3e95e5d2019-09-20 00:08:54 -070084 EXPECT_TRUE(JsonAndBack("{ \"foo_string\": \"baz\" }"));
Brian Silverman5c710412021-02-09 19:09:32 -080085
86 EXPECT_TRUE(JsonAndBack("{ \"foo_enum_nonconsecutive\": \"Zero\" }"));
87 EXPECT_TRUE(JsonAndBack("{ \"foo_enum_nonconsecutive\": \"Big\" }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -070088}
89
James Kuszmaul768c4682023-10-12 21:07:16 -070090TEST_F(JsonToFlatbufferTest, Structs) {
91 EXPECT_TRUE(
92 JsonAndBack("{ \"foo_struct\": { \"foo_byte\": 1, \"nested_struct\": { "
93 "\"foo_byte\": 2 } } }"));
94 EXPECT_TRUE(JsonAndBack(
95 "{ \"foo_struct_scalars\": { \"foo_float\": 1.234, \"foo_double\": "
96 "4.567, \"foo_int32\": -971, \"foo_uint32\": 4294967294, \"foo_int64\": "
97 "-1030, \"foo_uint64\": 18446744073709551614 } }"));
98 // Confirm that we parse integers into floating point fields correctly.
99 EXPECT_TRUE(JsonAndBack(
100 "{ \"foo_struct_scalars\": { \"foo_float\": 1, \"foo_double\": "
101 "2, \"foo_int32\": 3, \"foo_uint32\": 4, \"foo_int64\": "
102 "5, \"foo_uint64\": 6 } }",
103 "{ \"foo_struct_scalars\": { \"foo_float\": 1.0, \"foo_double\": "
104 "2.0, \"foo_int32\": 3, \"foo_uint32\": 4, \"foo_int64\": "
105 "5, \"foo_uint64\": 6 } }"));
106 EXPECT_TRUE(JsonAndBack(
107 "{ \"vector_foo_struct_scalars\": [ { \"foo_float\": 1.234, "
108 "\"foo_double\": 4.567, \"foo_int32\": -971, \"foo_uint32\": 4294967294, "
109 "\"foo_int64\": -1030, \"foo_uint64\": 18446744073709551614 }, { "
110 "\"foo_float\": 2.0, \"foo_double\": 4.1, \"foo_int32\": 10, "
111 "\"foo_uint32\": 13, \"foo_int64\": 15, \"foo_uint64\": 18 } ] }"));
112 EXPECT_TRUE(
113 JsonAndBack("{ \"foo_struct_enum\": { \"foo_enum\": \"UByte\" } }"));
114 EXPECT_TRUE(
115 JsonAndBack("{ \"vector_foo_struct\": [ { \"foo_byte\": 1, "
116 "\"nested_struct\": { \"foo_byte\": 2 } } ] }"));
117 EXPECT_TRUE(JsonAndBack(
118 "{ \"vector_foo_struct\": [ { \"foo_byte\": 1, \"nested_struct\": { "
119 "\"foo_byte\": 2 } }, { \"foo_byte\": 3, \"nested_struct\": { "
120 "\"foo_byte\": 4 } }, { \"foo_byte\": 5, \"nested_struct\": { "
121 "\"foo_byte\": 6 } } ] }"));
122}
123
124// Confirm that we correctly die when input JSON is missing fields inside of a
125// struct.
126TEST_F(JsonToFlatbufferTest, StructMissingField) {
127 ::testing::internal::CaptureStderr();
128 EXPECT_FALSE(
129 JsonAndBack("{ \"foo_struct\": { \"nested_struct\": { "
130 "\"foo_byte\": 2 } } }"));
131 EXPECT_FALSE(JsonAndBack(
132 "{ \"foo_struct\": { \"foo_byte\": 1, \"nested_struct\": { } } }"));
133 EXPECT_FALSE(JsonAndBack("{ \"foo_struct\": { \"foo_byte\": 1 } }"));
134 std::string output = ::testing::internal::GetCapturedStderr();
135 EXPECT_EQ(
136 R"output(All 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 foo_byte missing).
140All fields must be specified for struct types (field nested_struct missing).
141All fields must be specified for struct types (field nested_struct missing).
142)output",
143 output);
144}
145
Austin Schuh9fa0b8e2021-03-21 19:21:50 -0700146// Tests that Inf is handled correctly
147TEST_F(JsonToFlatbufferTest, Inf) {
148 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": inf }"));
149 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": -inf }"));
150 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": inf }"));
151 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": -inf }"));
152}
153
Austin Schuhbba0c3c2019-11-29 22:00:34 -0800154// Tests that NaN is handled correctly
155TEST_F(JsonToFlatbufferTest, Nan) {
156 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": nan }"));
157 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": -nan }"));
Austin Schuh9fa0b8e2021-03-21 19:21:50 -0700158 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": nan }"));
159 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": -nan }"));
Austin Schuhbba0c3c2019-11-29 22:00:34 -0800160}
161
Pallavi Madhukare2eb2812022-07-19 09:56:09 -0700162// Tests that unicode is handled correctly
163TEST_F(JsonToFlatbufferTest, Unicode) {
164 EXPECT_TRUE(JsonAndBack("{ \"foo_string\": \"\\uF672\" }"));
165 EXPECT_TRUE(JsonAndBack("{ \"foo_string\": \"\\uEFEF\" }"));
166 EXPECT_TRUE(JsonAndBack("{ \"foo_string\": \"helloworld\\uD83E\\uDE94\" }"));
167 EXPECT_TRUE(JsonAndBack("{ \"foo_string\": \"\\uD83C\\uDF32\" }"));
168 EXPECT_FALSE(JsonAndBack("{ \"foo_string\": \"\\uP890\" }"));
169 EXPECT_FALSE(JsonAndBack("{ \"foo_string\": \"\\u!FA8\" }"));
170 EXPECT_FALSE(JsonAndBack("{ \"foo_string\": \"\\uF89\" }"));
171 EXPECT_FALSE(JsonAndBack("{ \"foo_string\": \"\\uD83C\" }"));
172}
173
Austin Schuh84314af2019-10-03 09:11:34 -0700174// Tests that we can handle decimal points.
175TEST_F(JsonToFlatbufferTest, DecimalPoint) {
176 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": 5.1 }"));
177 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": 5.1 }"));
178}
179
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700180// Test what happens if you pass a field name that we don't know.
181TEST_F(JsonToFlatbufferTest, InvalidFieldName) {
182 EXPECT_FALSE(JsonAndBack("{ \"foo\": 5 }"));
183}
184
Alex Perrycb7da4b2019-08-28 19:35:56 -0700185// Tests that an invalid enum type is handled correctly.
186TEST_F(JsonToFlatbufferTest, InvalidEnumName) {
187 EXPECT_FALSE(JsonAndBack("{ \"foo_enum\": \"5ype\" }"));
188
189 EXPECT_FALSE(JsonAndBack("{ \"foo_enum_default\": \"7ype\" }"));
Brian Silverman5c710412021-02-09 19:09:32 -0800190
191 EXPECT_FALSE(JsonAndBack("{ \"foo_enum_nonconsecutive\": \"Nope\" }"));
192
193 EXPECT_FALSE(
194 JsonAndBack("{ \"foo_enum_nonconsecutive_default\": \"Nope\" }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700195}
196
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700197// Test that adding a duplicate field results in an error.
198TEST_F(JsonToFlatbufferTest, DuplicateField) {
199 EXPECT_FALSE(
200 JsonAndBack("{ \"foo_int\": 5, \"foo_int\": 7 }", "{ \"foo_int\": 7 }"));
201}
202
203// Test that various syntax errors are caught correctly
204TEST_F(JsonToFlatbufferTest, InvalidSyntax) {
205 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5"));
206 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5 "));
207 EXPECT_FALSE(JsonAndBack("{ \"foo_string\": \""));
208 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5 } }"));
209
210 EXPECT_FALSE(JsonAndBack("{ foo_int: 5 }"));
211
212 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5, }", "{ \"foo_int\": 5 }"));
213
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700214 EXPECT_FALSE(
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700215 JsonAndBack("{ \"apps\":\n[\n{\n\"name\": \"woot\"\n},\n{\n\"name\": "
216 "\"wow\"\n} ,\n]\n}"));
217
218 EXPECT_FALSE(JsonAndBack(
219 "{ \"apps\": [ { \"name\": \"woot\" }, { \"name\": \"wow\" } ] , }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700220
221 EXPECT_FALSE(
222 JsonAndBack("{ \"vector_foo_string\": [ \"bar\", \"baz\" ] , }"));
223
224 EXPECT_FALSE(
225 JsonAndBack("{ \"single_application\": { \"name\": \"woot\" } , }"));
226}
227
228// Test arrays of simple types.
229TEST_F(JsonToFlatbufferTest, Array) {
230 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_byte\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700231 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_byte\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700232 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ubyte\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700233 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ubyte\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700234
235 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_short\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700236 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_short\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700237 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ushort\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700238 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ushort\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700239
240 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_int\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700241 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_int\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700242 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_uint\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700243 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_uint\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700244
245 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_long\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700246 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_long\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700247 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ulong\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700248 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ulong\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700249
250 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700251 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700252 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700253 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700254
255 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ 9, 7, 1 ] }",
256 "{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ] }"));
257 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ 9, 7, 1 ] }",
258 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
259
260 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_string\": [ \"bar\", \"baz\" ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700261 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_string\": [ ] }"));
Ravago Jonescf453ab2020-05-06 21:14:53 -0700262 EXPECT_TRUE(JsonAndBack(
263 "{ \"vector_foo_enum\": [ \"None\", \"UType\", \"Bool\" ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700264 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_enum\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700265}
266
267// Test nested messages, and arrays of nested messages.
James Kuszmaul768c4682023-10-12 21:07:16 -0700268TEST_F(JsonToFlatbufferTest, NestedTable) {
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700269 EXPECT_TRUE(
270 JsonAndBack("{ \"single_application\": { \"name\": \"woot\" } }"));
271
Alex Perrycb7da4b2019-08-28 19:35:56 -0700272 EXPECT_TRUE(JsonAndBack("{ \"single_application\": { } }"));
273
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700274 EXPECT_TRUE(JsonAndBack(
275 "{ \"apps\": [ { \"name\": \"woot\" }, { \"name\": \"wow\" } ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700276
Ravago Jonescf453ab2020-05-06 21:14:53 -0700277 EXPECT_TRUE(JsonAndBack("{ \"apps\": [ { }, { } ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700278}
279
James Kuszmaulbb60dfd2023-01-05 17:13:11 -0800280// Test mixing up whether a field is an object or a vector.
281TEST_F(JsonToFlatbufferTest, IncorrectVectorOfTables) {
282 EXPECT_FALSE(
283 JsonAndBack("{ \"single_application\": [ {\"name\": \"woot\"} ] }"));
284 EXPECT_FALSE(JsonAndBack("{ \"apps\": { \"name\": \"woot\" } }"));
285}
286
Austin Schuh84314af2019-10-03 09:11:34 -0700287// Test that we can parse an empty message.
288TEST_F(JsonToFlatbufferTest, EmptyMessage) {
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700289 // Empty message works.
Austin Schuh84314af2019-10-03 09:11:34 -0700290 EXPECT_TRUE(JsonAndBack("{ }"));
291}
292
Stephan Pleines89836852023-09-15 20:11:57 -0700293// Tests that C style comments get stripped.
294TEST_F(JsonToFlatbufferTest, CStyleComments) {
295 EXPECT_TRUE(JsonAndBack(R"({
296 /* foo */
297 "vector_foo_double": [ 9, 7, 1 ] /* foo */
298} /* foo */)",
299 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
300}
301
302// Tests that C++ style comments get stripped.
303TEST_F(JsonToFlatbufferTest, CppStyleComments) {
304 EXPECT_TRUE(JsonAndBack(R"({
305 // foo
306 "vector_foo_double": [ 9, 7, 1 ] // foo
307} // foo)",
308 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
309}
310
311// Tests that mixed style comments get stripped.
312TEST_F(JsonToFlatbufferTest, MixedStyleComments) {
313 // Weird comments do not throw us off.
314 EXPECT_TRUE(JsonAndBack(R"({
315 // foo /* foo */
316 "vector_foo_double": [ 9, 7, 1 ] /* // foo */
317}
318// foo
319/* foo */)",
Austin Schuh81da4b22019-10-06 14:03:24 -0700320 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
321}
322
Austin Schuh9e2532d2019-10-06 14:01:15 -0700323// Tests that multiple arrays get properly handled.
324TEST_F(JsonToFlatbufferTest, MultipleArrays) {
325 EXPECT_TRUE(
326 JsonAndBack("{ \"vector_foo_float\": [ 9, 7, 1 ], \"vector_foo_double\": "
327 "[ 9, 7, 1 ] }",
328 "{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ], "
329 "\"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
330}
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700331
Alex Perrycb7da4b2019-08-28 19:35:56 -0700332// Tests that multiple arrays get properly handled.
333TEST_F(JsonToFlatbufferTest, NestedArrays) {
334 EXPECT_TRUE(
Ravago Jonescf453ab2020-05-06 21:14:53 -0700335 JsonAndBack("{ \"vov\": { \"v\": [ { \"str\": [ \"a\", \"b\" ] }, { "
336 "\"str\": [ \"c\", \"d\" ] } ] } }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700337}
338
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700339// TODO(austin): Missmatched values.
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700340//
341// TODO(austin): unions?
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700342
Austin Schuhd3936202020-04-07 20:11:07 -0700343TEST_F(JsonToFlatbufferTest, TrimmedVector) {
344 std::string json_short = "{ \"vector_foo_int\": [ 0";
345 for (int i = 1; i < 100; ++i) {
346 json_short += ", ";
347 json_short += std::to_string(i);
348 }
349 std::string json_long = json_short;
350 json_short += " ] }";
351 json_long += ", 101 ] }";
352
Brian Silvermanc5105ab2021-02-10 17:55:38 -0800353 const FlatbufferDetachedBuffer<Configuration> fb_short_typetable(
Austin Schuhadd6eb32020-11-09 21:24:26 -0800354 JsonToFlatbuffer<Configuration>(json_short));
Brian Silvermanc5105ab2021-02-10 17:55:38 -0800355 ASSERT_GT(fb_short_typetable.span().size(), 0);
356 const FlatbufferDetachedBuffer<Configuration> fb_long_typetable(
Austin Schuhadd6eb32020-11-09 21:24:26 -0800357 JsonToFlatbuffer<Configuration>(json_long));
Brian Silvermanc5105ab2021-02-10 17:55:38 -0800358 ASSERT_GT(fb_long_typetable.span().size(), 0);
359 const FlatbufferDetachedBuffer<Configuration> fb_short_reflection(
360 JsonToFlatbuffer(json_short, FlatbufferType(&Schema().message())));
361 ASSERT_GT(fb_short_reflection.span().size(), 0);
362 const FlatbufferDetachedBuffer<Configuration> fb_long_reflection(
363 JsonToFlatbuffer(json_long, FlatbufferType(&Schema().message())));
364 ASSERT_GT(fb_long_reflection.span().size(), 0);
Austin Schuhd3936202020-04-07 20:11:07 -0700365
Brian Silvermanc5105ab2021-02-10 17:55:38 -0800366 const std::string back_json_short_typetable = FlatbufferToJson<Configuration>(
367 fb_short_typetable, {.multi_line = false, .max_vector_size = 100});
368 const std::string back_json_long_typetable = FlatbufferToJson<Configuration>(
369 fb_long_typetable, {.multi_line = false, .max_vector_size = 100});
370 const std::string back_json_short_reflection =
371 FlatbufferToJson<Configuration>(
372 fb_short_reflection, {.multi_line = false, .max_vector_size = 100});
373 const std::string back_json_long_reflection = FlatbufferToJson<Configuration>(
374 fb_long_reflection, {.multi_line = false, .max_vector_size = 100});
Austin Schuhd3936202020-04-07 20:11:07 -0700375
Brian Silvermanc5105ab2021-02-10 17:55:38 -0800376 EXPECT_EQ(json_short, back_json_short_typetable);
377 EXPECT_EQ(json_short, back_json_short_reflection);
Austin Schuh041fe9f2021-10-16 23:01:15 -0700378 EXPECT_EQ("{ \"vector_foo_int\": [ \"... 101 elements ...\" ] }",
Brian Silvermanc5105ab2021-02-10 17:55:38 -0800379 back_json_long_typetable);
Austin Schuh041fe9f2021-10-16 23:01:15 -0700380 EXPECT_EQ("{ \"vector_foo_int\": [ \"... 101 elements ...\" ] }",
Brian Silvermanc5105ab2021-02-10 17:55:38 -0800381 back_json_long_reflection);
Austin Schuhd3936202020-04-07 20:11:07 -0700382}
383
Austin Schuh7f99e472020-06-17 20:38:17 -0700384// Tests that a nullptr buffer prints nullptr.
385TEST_F(JsonToFlatbufferTest, NullptrData) {
386 EXPECT_EQ("null", TableFlatbufferToJson((const flatbuffers::Table *)(nullptr),
Ravago Jonescf453ab2020-05-06 21:14:53 -0700387 ConfigurationTypeTable()));
Austin Schuh7f99e472020-06-17 20:38:17 -0700388}
389
Alexander Yeee61cac32023-02-11 19:40:40 -0800390TEST_F(JsonToFlatbufferTest, SpacedData) {
391 EXPECT_TRUE(CompareFlatBuffer(
392 FlatbufferDetachedBuffer<VectorOfStrings>(
393 JsonToFlatbuffer<VectorOfStrings>(R"json({
394 "str": [
395 "f o o",
396 "b a r",
397 "foo bar",
398 "bar foo"
399 ]
400})json")),
401 JsonFileToFlatbuffer<VectorOfStrings>(
402 ArtifactPath("aos/json_to_flatbuffer_test_spaces.json"))));
403}
404
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700405} // namespace testing
406} // namespace aos