blob: 84ac0ed6320e231979e3764767f88dbf22274faa [file] [log] [blame]
Austin Schuh3e95e5d2019-09-20 00:08:54 -07001#include "aos/json_to_flatbuffer.h"
2
3#include "gtest/gtest.h"
4
5#include "aos/json_to_flatbuffer_generated.h"
6#include "flatbuffers/minireflect.h"
7
8namespace aos {
9namespace testing {
10
11class JsonToFlatbufferTest : public ::testing::Test {
12 public:
13 JsonToFlatbufferTest() {}
14
15 bool JsonAndBack(const ::std::string str) { return JsonAndBack(str, str); }
16
17 bool JsonAndBack(const ::std::string in, const ::std::string out) {
18 printf("Testing: %s\n", in.c_str());
Austin Schuhe93d8642019-10-13 15:27:07 -070019 const flatbuffers::DetachedBuffer fb =
Austin Schuh3e95e5d2019-09-20 00:08:54 -070020 JsonToFlatbuffer(in.data(), ConfigurationTypeTable());
21
22 if (fb.size() == 0) {
23 return false;
24 }
25
Austin Schuhe93d8642019-10-13 15:27:07 -070026 const ::std::string back = FlatbufferToJson(fb, ConfigurationTypeTable());
Austin Schuh3e95e5d2019-09-20 00:08:54 -070027
28 printf("Back to string: %s\n", back.c_str());
29
30 return back == out;
31 }
32};
33
34// Tests that the various escapes work as expected.
35TEST_F(JsonToFlatbufferTest, ValidEscapes) {
36 EXPECT_TRUE(
37 JsonAndBack("{ \"foo_string\": \"a\\\"b\\/c\\bd\\fc\\nd\\re\\tf\" }",
38 "{ \"foo_string\": \"a\\\"b/c\\bd\\fc\\nd\\re\\tf\" }"));
39}
40
41// Test the easy ones. Test every type, single, no nesting.
42TEST_F(JsonToFlatbufferTest, Basic) {
43 EXPECT_TRUE(JsonAndBack("{ \"foo_bool\": true }"));
44
45 EXPECT_TRUE(JsonAndBack("{ \"foo_byte\": 5 }"));
46 EXPECT_TRUE(JsonAndBack("{ \"foo_ubyte\": 5 }"));
47
48 EXPECT_TRUE(JsonAndBack("{ \"foo_short\": 5 }"));
49 EXPECT_TRUE(JsonAndBack("{ \"foo_ushort\": 5 }"));
50
51 EXPECT_TRUE(JsonAndBack("{ \"foo_int\": 5 }"));
52 EXPECT_TRUE(JsonAndBack("{ \"foo_uint\": 5 }"));
53
54 EXPECT_TRUE(JsonAndBack("{ \"foo_long\": 5 }"));
55 EXPECT_TRUE(JsonAndBack("{ \"foo_ulong\": 5 }"));
56
57 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": 5.0 }"));
58 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": 5.0 }"));
59
Alex Perrycb7da4b2019-08-28 19:35:56 -070060 EXPECT_TRUE(JsonAndBack("{ \"foo_enum\": \"None\" }"));
61 EXPECT_TRUE(JsonAndBack("{ \"foo_enum\": \"UType\" }"));
62
63 EXPECT_TRUE(JsonAndBack("{ \"foo_enum_default\": \"None\" }"));
64 EXPECT_TRUE(JsonAndBack("{ \"foo_enum_default\": \"UType\" }"));
65
Austin Schuh3e95e5d2019-09-20 00:08:54 -070066 EXPECT_TRUE(JsonAndBack("{ \"foo_string\": \"baz\" }"));
67}
68
Austin Schuh84314af2019-10-03 09:11:34 -070069// Tests that we can handle decimal points.
70TEST_F(JsonToFlatbufferTest, DecimalPoint) {
71 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": 5.1 }"));
72 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": 5.1 }"));
73}
74
Austin Schuh09d7ffa2019-10-03 23:43:34 -070075
Austin Schuh3e95e5d2019-09-20 00:08:54 -070076// Test what happens if you pass a field name that we don't know.
77TEST_F(JsonToFlatbufferTest, InvalidFieldName) {
78 EXPECT_FALSE(JsonAndBack("{ \"foo\": 5 }"));
79}
80
Alex Perrycb7da4b2019-08-28 19:35:56 -070081// Tests that an invalid enum type is handled correctly.
82TEST_F(JsonToFlatbufferTest, InvalidEnumName) {
83 EXPECT_FALSE(JsonAndBack("{ \"foo_enum\": \"5ype\" }"));
84
85 EXPECT_FALSE(JsonAndBack("{ \"foo_enum_default\": \"7ype\" }"));
86}
87
Austin Schuh3e95e5d2019-09-20 00:08:54 -070088// Test that adding a duplicate field results in an error.
89TEST_F(JsonToFlatbufferTest, DuplicateField) {
90 EXPECT_FALSE(
91 JsonAndBack("{ \"foo_int\": 5, \"foo_int\": 7 }", "{ \"foo_int\": 7 }"));
92}
93
94// Test that various syntax errors are caught correctly
95TEST_F(JsonToFlatbufferTest, InvalidSyntax) {
96 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5"));
97 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5 "));
98 EXPECT_FALSE(JsonAndBack("{ \"foo_string\": \""));
99 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5 } }"));
100
101 EXPECT_FALSE(JsonAndBack("{ foo_int: 5 }"));
102
103 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5, }", "{ \"foo_int\": 5 }"));
104
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700105 EXPECT_FALSE(
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700106 JsonAndBack("{ \"apps\":\n[\n{\n\"name\": \"woot\"\n},\n{\n\"name\": "
107 "\"wow\"\n} ,\n]\n}"));
108
109 EXPECT_FALSE(JsonAndBack(
110 "{ \"apps\": [ { \"name\": \"woot\" }, { \"name\": \"wow\" } ] , }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700111
112 EXPECT_FALSE(
113 JsonAndBack("{ \"vector_foo_string\": [ \"bar\", \"baz\" ] , }"));
114
115 EXPECT_FALSE(
116 JsonAndBack("{ \"single_application\": { \"name\": \"woot\" } , }"));
117}
118
119// Test arrays of simple types.
120TEST_F(JsonToFlatbufferTest, Array) {
121 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_byte\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700122 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_byte\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700123 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ubyte\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700124 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ubyte\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700125
126 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_short\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700127 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_short\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700128 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ushort\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700129 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ushort\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700130
131 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_int\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700132 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_int\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700133 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_uint\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700134 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_uint\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700135
136 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_long\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700137 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_long\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700138 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ulong\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700139 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ulong\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700140
141 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700142 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700143 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700144 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700145
146 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ 9, 7, 1 ] }",
147 "{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ] }"));
148 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ 9, 7, 1 ] }",
149 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
150
151 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_string\": [ \"bar\", \"baz\" ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700152 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_string\": [ ] }"));
153 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_enum\": [ \"None\", \"UType\", \"Bool\" ] }"));
154 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_enum\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700155}
156
157// Test nested messages, and arrays of nested messages.
158TEST_F(JsonToFlatbufferTest, NestedStruct) {
159 EXPECT_TRUE(
160 JsonAndBack("{ \"single_application\": { \"name\": \"woot\" } }"));
161
Alex Perrycb7da4b2019-08-28 19:35:56 -0700162 EXPECT_TRUE(JsonAndBack("{ \"single_application\": { } }"));
163
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700164 EXPECT_TRUE(JsonAndBack(
165 "{ \"apps\": [ { \"name\": \"woot\" }, { \"name\": \"wow\" } ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700166
167 EXPECT_TRUE(JsonAndBack(
168 "{ \"apps\": [ { }, { } ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700169}
170
Austin Schuh84314af2019-10-03 09:11:34 -0700171// Test that we can parse an empty message.
172TEST_F(JsonToFlatbufferTest, EmptyMessage) {
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700173 // Empty message works.
Austin Schuh84314af2019-10-03 09:11:34 -0700174 EXPECT_TRUE(JsonAndBack("{ }"));
175}
176
Austin Schuh81da4b22019-10-06 14:03:24 -0700177// Tests that comments get stripped.
178TEST_F(JsonToFlatbufferTest, Comments) {
179 EXPECT_TRUE(JsonAndBack("{ /* foo */ \"vector_foo_double\": [ 9, 7, 1 ] }",
180 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
181}
182
Austin Schuh9e2532d2019-10-06 14:01:15 -0700183// Tests that multiple arrays get properly handled.
184TEST_F(JsonToFlatbufferTest, MultipleArrays) {
185 EXPECT_TRUE(
186 JsonAndBack("{ \"vector_foo_float\": [ 9, 7, 1 ], \"vector_foo_double\": "
187 "[ 9, 7, 1 ] }",
188 "{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ], "
189 "\"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
190}
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700191
Alex Perrycb7da4b2019-08-28 19:35:56 -0700192// Tests that multiple arrays get properly handled.
193TEST_F(JsonToFlatbufferTest, NestedArrays) {
194 EXPECT_TRUE(
195 JsonAndBack("{ \"vov\": { \"v\": [ { \"str\": [ \"a\", \"b\" ] }, { \"str\": [ \"c\", \"d\" ] } ] } }"));
196}
197
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700198// TODO(austin): Missmatched values.
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700199//
200// TODO(austin): unions?
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700201
202} // namespace testing
203} // namespace aos