blob: 7325c0c61914bdc27e15de6aa207214768637847 [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());
19 const ::std::vector<uint8_t> fb =
20 JsonToFlatbuffer(in.data(), ConfigurationTypeTable());
21
22 if (fb.size() == 0) {
23 return false;
24 }
25
26 const ::std::string back =
27 FlatbufferToJson(fb.data(), ConfigurationTypeTable());
28
29 printf("Back to string: %s\n", back.c_str());
30
31 return back == out;
32 }
33};
34
35// Tests that the various escapes work as expected.
36TEST_F(JsonToFlatbufferTest, ValidEscapes) {
37 EXPECT_TRUE(
38 JsonAndBack("{ \"foo_string\": \"a\\\"b\\/c\\bd\\fc\\nd\\re\\tf\" }",
39 "{ \"foo_string\": \"a\\\"b/c\\bd\\fc\\nd\\re\\tf\" }"));
40}
41
42// Test the easy ones. Test every type, single, no nesting.
43TEST_F(JsonToFlatbufferTest, Basic) {
44 EXPECT_TRUE(JsonAndBack("{ \"foo_bool\": true }"));
45
46 EXPECT_TRUE(JsonAndBack("{ \"foo_byte\": 5 }"));
47 EXPECT_TRUE(JsonAndBack("{ \"foo_ubyte\": 5 }"));
48
49 EXPECT_TRUE(JsonAndBack("{ \"foo_short\": 5 }"));
50 EXPECT_TRUE(JsonAndBack("{ \"foo_ushort\": 5 }"));
51
52 EXPECT_TRUE(JsonAndBack("{ \"foo_int\": 5 }"));
53 EXPECT_TRUE(JsonAndBack("{ \"foo_uint\": 5 }"));
54
55 EXPECT_TRUE(JsonAndBack("{ \"foo_long\": 5 }"));
56 EXPECT_TRUE(JsonAndBack("{ \"foo_ulong\": 5 }"));
57
58 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": 5.0 }"));
59 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": 5.0 }"));
60
61 EXPECT_TRUE(JsonAndBack("{ \"foo_string\": \"baz\" }"));
62}
63
Austin Schuh84314af2019-10-03 09:11:34 -070064// Tests that we can handle decimal points.
65TEST_F(JsonToFlatbufferTest, DecimalPoint) {
66 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": 5.1 }"));
67 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": 5.1 }"));
68}
69
Austin Schuh09d7ffa2019-10-03 23:43:34 -070070
Austin Schuh3e95e5d2019-09-20 00:08:54 -070071// Test what happens if you pass a field name that we don't know.
72TEST_F(JsonToFlatbufferTest, InvalidFieldName) {
73 EXPECT_FALSE(JsonAndBack("{ \"foo\": 5 }"));
74}
75
76// Test that adding a duplicate field results in an error.
77TEST_F(JsonToFlatbufferTest, DuplicateField) {
78 EXPECT_FALSE(
79 JsonAndBack("{ \"foo_int\": 5, \"foo_int\": 7 }", "{ \"foo_int\": 7 }"));
80}
81
82// Test that various syntax errors are caught correctly
83TEST_F(JsonToFlatbufferTest, InvalidSyntax) {
84 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5"));
85 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5 "));
86 EXPECT_FALSE(JsonAndBack("{ \"foo_string\": \""));
87 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5 } }"));
88
89 EXPECT_FALSE(JsonAndBack("{ foo_int: 5 }"));
90
91 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5, }", "{ \"foo_int\": 5 }"));
92
Austin Schuh3e95e5d2019-09-20 00:08:54 -070093 EXPECT_FALSE(
Austin Schuh09d7ffa2019-10-03 23:43:34 -070094 JsonAndBack("{ \"apps\":\n[\n{\n\"name\": \"woot\"\n},\n{\n\"name\": "
95 "\"wow\"\n} ,\n]\n}"));
96
97 EXPECT_FALSE(JsonAndBack(
98 "{ \"apps\": [ { \"name\": \"woot\" }, { \"name\": \"wow\" } ] , }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -070099
100 EXPECT_FALSE(
101 JsonAndBack("{ \"vector_foo_string\": [ \"bar\", \"baz\" ] , }"));
102
103 EXPECT_FALSE(
104 JsonAndBack("{ \"single_application\": { \"name\": \"woot\" } , }"));
105}
106
107// Test arrays of simple types.
108TEST_F(JsonToFlatbufferTest, Array) {
109 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_byte\": [ 9, 7, 1 ] }"));
110 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ubyte\": [ 9, 7, 1 ] }"));
111
112 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_short\": [ 9, 7, 1 ] }"));
113 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ushort\": [ 9, 7, 1 ] }"));
114
115 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_int\": [ 9, 7, 1 ] }"));
116 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_uint\": [ 9, 7, 1 ] }"));
117
118 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_long\": [ 9, 7, 1 ] }"));
119 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ulong\": [ 9, 7, 1 ] }"));
120
121 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ] }"));
122 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
123
124 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ 9, 7, 1 ] }",
125 "{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ] }"));
126 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ 9, 7, 1 ] }",
127 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
128
129 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_string\": [ \"bar\", \"baz\" ] }"));
130}
131
132// Test nested messages, and arrays of nested messages.
133TEST_F(JsonToFlatbufferTest, NestedStruct) {
134 EXPECT_TRUE(
135 JsonAndBack("{ \"single_application\": { \"name\": \"woot\" } }"));
136
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700137 EXPECT_TRUE(JsonAndBack(
138 "{ \"apps\": [ { \"name\": \"woot\" }, { \"name\": \"wow\" } ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700139}
140
Austin Schuh84314af2019-10-03 09:11:34 -0700141// Test that we can parse an empty message.
142TEST_F(JsonToFlatbufferTest, EmptyMessage) {
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700143 // Empty message works.
Austin Schuh84314af2019-10-03 09:11:34 -0700144 EXPECT_TRUE(JsonAndBack("{ }"));
145}
146
Austin Schuh81da4b22019-10-06 14:03:24 -0700147// Tests that comments get stripped.
148TEST_F(JsonToFlatbufferTest, Comments) {
149 EXPECT_TRUE(JsonAndBack("{ /* foo */ \"vector_foo_double\": [ 9, 7, 1 ] }",
150 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
151}
152
Austin Schuh9e2532d2019-10-06 14:01:15 -0700153// Tests that multiple arrays get properly handled.
154TEST_F(JsonToFlatbufferTest, MultipleArrays) {
155 EXPECT_TRUE(
156 JsonAndBack("{ \"vector_foo_float\": [ 9, 7, 1 ], \"vector_foo_double\": "
157 "[ 9, 7, 1 ] }",
158 "{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ], "
159 "\"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
160}
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700161
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700162// TODO(austin): Missmatched values.
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700163// TODO(austin): enums
164//
165// TODO(austin): unions?
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700166
167} // namespace testing
168} // namespace aos