1#include "key_field_test.h"
2
3#include <iostream>
4
5#include "flatbuffers/flatbuffers.h"
6#include "flatbuffers/idl.h"
7#include "key_field/key_field_sample_generated.h"
8#include "test_assert.h"
9
10namespace flatbuffers {
11namespace tests {
12
13using namespace keyfield::sample;
14
15void FixedSizedScalarKeyInStructTest() {
16 flatbuffers::FlatBufferBuilder fbb;
17 std::vector<Baz> bazs;
18 uint8_t test_array1[4] = { 8, 2, 3, 0 };
19 uint8_t test_array2[4] = { 1, 2, 3, 4 };
20 uint8_t test_array3[4] = { 2, 2, 3, 4 };
21 uint8_t test_array4[4] = { 3, 2, 3, 4 };
22 bazs.push_back(Baz(flatbuffers::make_span(test_array1), 4));
23 bazs.push_back(Baz(flatbuffers::make_span(test_array2), 1));
24 bazs.push_back(Baz(flatbuffers::make_span(test_array3), 2));
25 bazs.push_back(Baz(flatbuffers::make_span(test_array4), 3));
26 auto baz_vec = fbb.CreateVectorOfSortedStructs(&bazs);
27
28 auto test_string = fbb.CreateString("TEST");
29
30 float test_float_array1[3] = { 1.5, 2.5, 0 };
31 float test_float_array2[3] = { 7.5, 2.5, 0 };
32 float test_float_array3[3] = { 1.5, 2.5, -1 };
33 float test_float_array4[3] = { -1.5, 2.5, 0 };
34 std::vector<Bar> bars;
35 bars.push_back(Bar(flatbuffers::make_span(test_float_array1), 3));
36 bars.push_back(Bar(flatbuffers::make_span(test_float_array2), 4));
37 bars.push_back(Bar(flatbuffers::make_span(test_float_array3), 2));
38 bars.push_back(Bar(flatbuffers::make_span(test_float_array4), 1));
39 auto bar_vec = fbb.CreateVectorOfSortedStructs(&bars);
40
41 auto t = CreateFooTable(fbb, 1, 2, test_string, baz_vec, bar_vec);
42
43 fbb.Finish(t);
44
45 uint8_t *buf = fbb.GetBufferPointer();
46 auto foo_table = GetFooTable(buf);
47
48 auto sorted_baz_vec = foo_table->d();
49 TEST_EQ(sorted_baz_vec->Get(0)->b(), 1);
50 TEST_EQ(sorted_baz_vec->Get(3)->b(), 4);
51
52 uint8_t test_array[4];
53 auto *key_array = &flatbuffers::CastToArray(test_array);
54 key_array->CopyFromSpan(flatbuffers::make_span(test_array1));
55
56 TEST_NOTNULL(sorted_baz_vec->LookupByKey(key_array));
57 TEST_EQ(sorted_baz_vec->LookupByKey(key_array)->b(), 4);
58 uint8_t array_int[4] = { 7, 2, 3, 0 };
59 key_array->CopyFromSpan(flatbuffers::make_span(array_int));
60 TEST_EQ(sorted_baz_vec->LookupByKey(key_array),
61 static_cast<const Baz *>(nullptr));
62
63 auto sorted_bar_vec = foo_table->e();
64 TEST_EQ(sorted_bar_vec->Get(0)->b(), 1);
65 TEST_EQ(sorted_bar_vec->Get(3)->b(), 4);
66
67 float test_float_array[3];
68 auto *key_float_array = &flatbuffers::CastToArray(test_float_array);
69 key_float_array->CopyFromSpan(flatbuffers::make_span(test_float_array1));
70 TEST_NOTNULL(sorted_bar_vec->LookupByKey(key_float_array));
71 TEST_EQ(sorted_bar_vec->LookupByKey(key_float_array)->b(), 3);
72 float array_float[3] = { -1, -2, -3 };
73 key_float_array->CopyFromSpan(flatbuffers::make_span(array_float));
74 TEST_EQ(sorted_bar_vec->LookupByKey(key_float_array),
75 static_cast<const Bar *>(nullptr));
76}
77
78void StructKeyInStructTest() {
79 flatbuffers::FlatBufferBuilder fbb;
80 std::vector<Apple> apples;
81 float test_float_array1[3] = { 1.5, 2.5, 0 };
82 float test_float_array2[3] = { 7.5, 2.5, 0 };
83 float test_float_array3[3] = { 1.5, 2.5, -1 };
84 apples.push_back(
85 Apple(2, Color(flatbuffers::make_span(test_float_array1), 3)));
86 apples.push_back(
87 Apple(3, Color(flatbuffers::make_span(test_float_array2), 3)));
88 apples.push_back(
89 Apple(1, Color(flatbuffers::make_span(test_float_array3), 1)));
90
91 auto apples_vec = fbb.CreateVectorOfSortedStructs(&apples);
92 auto test_string = fbb.CreateString("TEST");
93
94 FooTableBuilder foo_builder(fbb);
95 foo_builder.add_a(1);
96 foo_builder.add_c(test_string);
97
98 foo_builder.add_f(apples_vec);
99
100 auto orc = foo_builder.Finish();
101 fbb.Finish(orc);
102
103 uint8_t *buf = fbb.GetBufferPointer();
104 auto foo_table = GetFooTable(buf);
105
106 auto sorted_apple_vec = foo_table->f();
107 TEST_EQ(sorted_apple_vec->Get(0)->tag(), 1);
108 TEST_EQ(sorted_apple_vec->Get(1)->tag(), 2);
109 TEST_EQ(sorted_apple_vec->Get(2)->tag(), 3);
110 TEST_EQ(sorted_apple_vec
111 ->LookupByKey(Color(flatbuffers::make_span(test_float_array1), 3))
112 ->tag(),
113 2);
114 TEST_EQ(sorted_apple_vec->LookupByKey(
115 Color(flatbuffers::make_span(test_float_array1), 0)),
116 static_cast<const Apple *>(nullptr));
117}
118
119void NestedStructKeyInStructTest() {
120 flatbuffers::FlatBufferBuilder fbb;
121 std::vector<Fruit> fruits;
122 float test_float_array1[3] = { 1.5, 2.5, 0 };
123 float test_float_array2[3] = { 1.5, 2.5, 0 };
124 float test_float_array3[3] = { 1.5, 2.5, -1 };
125
126 fruits.push_back(
127 Fruit(Apple(2, Color(flatbuffers::make_span(test_float_array1), 2)), 2));
128 fruits.push_back(
129 Fruit(Apple(2, Color(flatbuffers::make_span(test_float_array2), 1)), 1));
130 fruits.push_back(
131 Fruit(Apple(2, Color(flatbuffers::make_span(test_float_array3), 3)), 3));
132
133 auto test_string = fbb.CreateString("TEST");
134 auto fruits_vec = fbb.CreateVectorOfSortedStructs(&fruits);
135
136 FooTableBuilder foo_builder(fbb);
137 foo_builder.add_a(1);
138 foo_builder.add_c(test_string);
139 foo_builder.add_g(fruits_vec);
140
141 auto orc = foo_builder.Finish();
142 fbb.Finish(orc);
143 uint8_t *buf = fbb.GetBufferPointer();
144 auto foo_table = GetFooTable(buf);
145
146 auto sorted_fruit_vec = foo_table->g();
147 TEST_EQ(sorted_fruit_vec->Get(0)->b(), 3);
148 TEST_EQ(sorted_fruit_vec->Get(1)->b(), 1);
149 TEST_EQ(sorted_fruit_vec->Get(2)->b(), 2);
150 TEST_EQ(sorted_fruit_vec
151 ->LookupByKey(
152 Apple(2, Color(flatbuffers::make_span(test_float_array2), 1)))
153 ->b(),
154 1);
155 TEST_EQ(sorted_fruit_vec->LookupByKey(
156 Apple(1, Color(flatbuffers::make_span(test_float_array2), 1))),
157 static_cast<const Fruit *>(nullptr));
158}
159
160void FixedSizedStructArrayKeyInStructTest() {
161 flatbuffers::FlatBufferBuilder fbb;
162 std::vector<Grain> grains;
163 uint8_t test_char_array1[3] = { 'u', 's', 'a' };
164 uint8_t test_char_array2[3] = { 'c', 'h', 'n' };
165 uint8_t test_char_array3[3] = { 'c', 'h', 'l' };
166 uint8_t test_char_array4[3] = { 'f', 'r', 'a' };
167 uint8_t test_char_array5[3] = { 'i', 'n', 'd' };
168 uint8_t test_char_array6[3] = { 'i', 't', 'a' };
169
170 Rice test_rice_array1[3] = {
171 Rice(flatbuffers::make_span(test_char_array1), 2),
172 Rice(flatbuffers::make_span(test_char_array2), 1),
173 Rice(flatbuffers::make_span(test_char_array3), 2)
174 };
175 Rice test_rice_array2[3] = {
176 Rice(flatbuffers::make_span(test_char_array4), 2),
177 Rice(flatbuffers::make_span(test_char_array5), 1),
178 Rice(flatbuffers::make_span(test_char_array6), 2)
179 };
180 Rice test_rice_array3[3] = {
181 Rice(flatbuffers::make_span(test_char_array4), 2),
182 Rice(flatbuffers::make_span(test_char_array6), 1),
183 Rice(flatbuffers::make_span(test_char_array1), 2)
184 };
185
186 grains.push_back(Grain(flatbuffers::make_span(test_rice_array1), 3));
187 grains.push_back(Grain(flatbuffers::make_span(test_rice_array2), 1));
188 grains.push_back(Grain(flatbuffers::make_span(test_rice_array3), 2));
189
190 auto test_string = fbb.CreateString("TEST");
191 auto grains_vec = fbb.CreateVectorOfSortedStructs(&grains);
192 FooTableBuilder foo_builder(fbb);
193 foo_builder.add_a(1);
194 foo_builder.add_c(test_string);
195 foo_builder.add_h(grains_vec);
196
197 auto orc = foo_builder.Finish();
198 fbb.Finish(orc);
199 uint8_t *buf = fbb.GetBufferPointer();
200 auto foo_table = GetFooTable(buf);
201
202 auto sorted_grain_vec = foo_table->h();
203 TEST_EQ(sorted_grain_vec->Get(0)->tag(), 1);
204 TEST_EQ(sorted_grain_vec->Get(1)->tag(), 2);
205 TEST_EQ(sorted_grain_vec->Get(2)->tag(), 3);
206 TEST_EQ(
207 sorted_grain_vec->LookupByKey(&flatbuffers::CastToArray(test_rice_array1))
208 ->tag(),
209 3);
210 Rice test_rice_array[3] = { Rice(flatbuffers::make_span(test_char_array3), 2),
211 Rice(flatbuffers::make_span(test_char_array2), 1),
212 Rice(flatbuffers::make_span(test_char_array1),
213 2) };
214 TEST_EQ(
215 sorted_grain_vec->LookupByKey(&flatbuffers::CastToArray(test_rice_array)),
216 static_cast<const Grain *>(nullptr));
217 TEST_EQ(
218 sorted_grain_vec->LookupByKey(&flatbuffers::CastToArray(test_rice_array1))
219 ->tag(),
220 3);
221}
222
223} // namespace tests
224} // namespace flatbuffers
View as plain text