blob: 6c76b023ef3754c1c8688c77ab0a447bd73fdfed [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 Schuhbba0c3c2019-11-29 22:00:34 -080069// Tests that NaN is handled correctly
70TEST_F(JsonToFlatbufferTest, Nan) {
71 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": nan }"));
72 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": -nan }"));
73}
74
Austin Schuh84314af2019-10-03 09:11:34 -070075// Tests that we can handle decimal points.
76TEST_F(JsonToFlatbufferTest, DecimalPoint) {
77 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": 5.1 }"));
78 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": 5.1 }"));
79}
80
Austin Schuh09d7ffa2019-10-03 23:43:34 -070081
Austin Schuh3e95e5d2019-09-20 00:08:54 -070082// Test what happens if you pass a field name that we don't know.
83TEST_F(JsonToFlatbufferTest, InvalidFieldName) {
84 EXPECT_FALSE(JsonAndBack("{ \"foo\": 5 }"));
85}
86
Alex Perrycb7da4b2019-08-28 19:35:56 -070087// Tests that an invalid enum type is handled correctly.
88TEST_F(JsonToFlatbufferTest, InvalidEnumName) {
89 EXPECT_FALSE(JsonAndBack("{ \"foo_enum\": \"5ype\" }"));
90
91 EXPECT_FALSE(JsonAndBack("{ \"foo_enum_default\": \"7ype\" }"));
92}
93
Austin Schuh3e95e5d2019-09-20 00:08:54 -070094// Test that adding a duplicate field results in an error.
95TEST_F(JsonToFlatbufferTest, DuplicateField) {
96 EXPECT_FALSE(
97 JsonAndBack("{ \"foo_int\": 5, \"foo_int\": 7 }", "{ \"foo_int\": 7 }"));
98}
99
100// Test that various syntax errors are caught correctly
101TEST_F(JsonToFlatbufferTest, InvalidSyntax) {
102 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5"));
103 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5 "));
104 EXPECT_FALSE(JsonAndBack("{ \"foo_string\": \""));
105 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5 } }"));
106
107 EXPECT_FALSE(JsonAndBack("{ foo_int: 5 }"));
108
109 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5, }", "{ \"foo_int\": 5 }"));
110
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700111 EXPECT_FALSE(
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700112 JsonAndBack("{ \"apps\":\n[\n{\n\"name\": \"woot\"\n},\n{\n\"name\": "
113 "\"wow\"\n} ,\n]\n}"));
114
115 EXPECT_FALSE(JsonAndBack(
116 "{ \"apps\": [ { \"name\": \"woot\" }, { \"name\": \"wow\" } ] , }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700117
118 EXPECT_FALSE(
119 JsonAndBack("{ \"vector_foo_string\": [ \"bar\", \"baz\" ] , }"));
120
121 EXPECT_FALSE(
122 JsonAndBack("{ \"single_application\": { \"name\": \"woot\" } , }"));
123}
124
125// Test arrays of simple types.
126TEST_F(JsonToFlatbufferTest, Array) {
127 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_byte\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700128 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_byte\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700129 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ubyte\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700130 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ubyte\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700131
132 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_short\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700133 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_short\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700134 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ushort\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700135 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ushort\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700136
137 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_int\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700138 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_int\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700139 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_uint\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700140 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_uint\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700141
142 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_long\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700143 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_long\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700144 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ulong\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700145 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ulong\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700146
147 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700148 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700149 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700150 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700151
152 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ 9, 7, 1 ] }",
153 "{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ] }"));
154 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ 9, 7, 1 ] }",
155 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
156
157 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_string\": [ \"bar\", \"baz\" ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700158 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_string\": [ ] }"));
159 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_enum\": [ \"None\", \"UType\", \"Bool\" ] }"));
160 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_enum\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700161}
162
163// Test nested messages, and arrays of nested messages.
164TEST_F(JsonToFlatbufferTest, NestedStruct) {
165 EXPECT_TRUE(
166 JsonAndBack("{ \"single_application\": { \"name\": \"woot\" } }"));
167
Alex Perrycb7da4b2019-08-28 19:35:56 -0700168 EXPECT_TRUE(JsonAndBack("{ \"single_application\": { } }"));
169
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700170 EXPECT_TRUE(JsonAndBack(
171 "{ \"apps\": [ { \"name\": \"woot\" }, { \"name\": \"wow\" } ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700172
173 EXPECT_TRUE(JsonAndBack(
174 "{ \"apps\": [ { }, { } ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700175}
176
Austin Schuh84314af2019-10-03 09:11:34 -0700177// Test that we can parse an empty message.
178TEST_F(JsonToFlatbufferTest, EmptyMessage) {
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700179 // Empty message works.
Austin Schuh84314af2019-10-03 09:11:34 -0700180 EXPECT_TRUE(JsonAndBack("{ }"));
181}
182
Austin Schuh81da4b22019-10-06 14:03:24 -0700183// Tests that comments get stripped.
184TEST_F(JsonToFlatbufferTest, Comments) {
185 EXPECT_TRUE(JsonAndBack("{ /* foo */ \"vector_foo_double\": [ 9, 7, 1 ] }",
186 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
187}
188
Austin Schuh9e2532d2019-10-06 14:01:15 -0700189// Tests that multiple arrays get properly handled.
190TEST_F(JsonToFlatbufferTest, MultipleArrays) {
191 EXPECT_TRUE(
192 JsonAndBack("{ \"vector_foo_float\": [ 9, 7, 1 ], \"vector_foo_double\": "
193 "[ 9, 7, 1 ] }",
194 "{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ], "
195 "\"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
196}
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700197
Alex Perrycb7da4b2019-08-28 19:35:56 -0700198// Tests that multiple arrays get properly handled.
199TEST_F(JsonToFlatbufferTest, NestedArrays) {
200 EXPECT_TRUE(
201 JsonAndBack("{ \"vov\": { \"v\": [ { \"str\": [ \"a\", \"b\" ] }, { \"str\": [ \"c\", \"d\" ] } ] } }"));
202}
203
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700204// TODO(austin): Missmatched values.
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700205//
206// TODO(austin): unions?
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700207
208} // namespace testing
209} // namespace aos