blob: a048e0a6c353351e3b7a5f14a76e62df5f646755 [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
60 EXPECT_TRUE(JsonAndBack("{ \"foo_string\": \"baz\" }"));
61}
62
Austin Schuh84314af2019-10-03 09:11:34 -070063// Tests that we can handle decimal points.
64TEST_F(JsonToFlatbufferTest, DecimalPoint) {
65 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": 5.1 }"));
66 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": 5.1 }"));
67}
68
Austin Schuh09d7ffa2019-10-03 23:43:34 -070069
Austin Schuh3e95e5d2019-09-20 00:08:54 -070070// Test what happens if you pass a field name that we don't know.
71TEST_F(JsonToFlatbufferTest, InvalidFieldName) {
72 EXPECT_FALSE(JsonAndBack("{ \"foo\": 5 }"));
73}
74
75// Test that adding a duplicate field results in an error.
76TEST_F(JsonToFlatbufferTest, DuplicateField) {
77 EXPECT_FALSE(
78 JsonAndBack("{ \"foo_int\": 5, \"foo_int\": 7 }", "{ \"foo_int\": 7 }"));
79}
80
81// Test that various syntax errors are caught correctly
82TEST_F(JsonToFlatbufferTest, InvalidSyntax) {
83 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5"));
84 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5 "));
85 EXPECT_FALSE(JsonAndBack("{ \"foo_string\": \""));
86 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5 } }"));
87
88 EXPECT_FALSE(JsonAndBack("{ foo_int: 5 }"));
89
90 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5, }", "{ \"foo_int\": 5 }"));
91
Austin Schuh3e95e5d2019-09-20 00:08:54 -070092 EXPECT_FALSE(
Austin Schuh09d7ffa2019-10-03 23:43:34 -070093 JsonAndBack("{ \"apps\":\n[\n{\n\"name\": \"woot\"\n},\n{\n\"name\": "
94 "\"wow\"\n} ,\n]\n}"));
95
96 EXPECT_FALSE(JsonAndBack(
97 "{ \"apps\": [ { \"name\": \"woot\" }, { \"name\": \"wow\" } ] , }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -070098
99 EXPECT_FALSE(
100 JsonAndBack("{ \"vector_foo_string\": [ \"bar\", \"baz\" ] , }"));
101
102 EXPECT_FALSE(
103 JsonAndBack("{ \"single_application\": { \"name\": \"woot\" } , }"));
104}
105
106// Test arrays of simple types.
107TEST_F(JsonToFlatbufferTest, Array) {
108 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_byte\": [ 9, 7, 1 ] }"));
109 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ubyte\": [ 9, 7, 1 ] }"));
110
111 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_short\": [ 9, 7, 1 ] }"));
112 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ushort\": [ 9, 7, 1 ] }"));
113
114 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_int\": [ 9, 7, 1 ] }"));
115 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_uint\": [ 9, 7, 1 ] }"));
116
117 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_long\": [ 9, 7, 1 ] }"));
118 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ulong\": [ 9, 7, 1 ] }"));
119
120 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ] }"));
121 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
122
123 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ 9, 7, 1 ] }",
124 "{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ] }"));
125 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ 9, 7, 1 ] }",
126 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
127
128 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_string\": [ \"bar\", \"baz\" ] }"));
129}
130
131// Test nested messages, and arrays of nested messages.
132TEST_F(JsonToFlatbufferTest, NestedStruct) {
133 EXPECT_TRUE(
134 JsonAndBack("{ \"single_application\": { \"name\": \"woot\" } }"));
135
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700136 EXPECT_TRUE(JsonAndBack(
137 "{ \"apps\": [ { \"name\": \"woot\" }, { \"name\": \"wow\" } ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700138}
139
Austin Schuh84314af2019-10-03 09:11:34 -0700140// Test that we can parse an empty message.
141TEST_F(JsonToFlatbufferTest, EmptyMessage) {
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700142 // Empty message works.
Austin Schuh84314af2019-10-03 09:11:34 -0700143 EXPECT_TRUE(JsonAndBack("{ }"));
144}
145
Austin Schuh81da4b22019-10-06 14:03:24 -0700146// Tests that comments get stripped.
147TEST_F(JsonToFlatbufferTest, Comments) {
148 EXPECT_TRUE(JsonAndBack("{ /* foo */ \"vector_foo_double\": [ 9, 7, 1 ] }",
149 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
150}
151
Austin Schuh9e2532d2019-10-06 14:01:15 -0700152// Tests that multiple arrays get properly handled.
153TEST_F(JsonToFlatbufferTest, MultipleArrays) {
154 EXPECT_TRUE(
155 JsonAndBack("{ \"vector_foo_float\": [ 9, 7, 1 ], \"vector_foo_double\": "
156 "[ 9, 7, 1 ] }",
157 "{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ], "
158 "\"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
159}
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700160
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700161// TODO(austin): Missmatched values.
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700162// TODO(austin): enums
163//
164// TODO(austin): unions?
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700165
166} // namespace testing
167} // namespace aos