• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
10 namespace flatbuffers {
11 namespace tests {
12 
13 using namespace keyfield::sample;
14 
FixedSizedScalarKeyInStructTest()15 void 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 
StructKeyInStructTest()78 void 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 
NestedStructKeyInStructTest()119 void 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 
FixedSizedStructArrayKeyInStructTest()160 void 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
225