| #include "tests/default_vectors_strings_test.h" |
| |
| #include <cstdint> |
| #include <vector> |
| |
| #include "include/flatbuffers/buffer.h" |
| #include "include/flatbuffers/flatbuffer_builder.h" |
| #include "include/flatbuffers/string.h" |
| #include "include/flatbuffers/vector.h" |
| #include "include/flatbuffers/verifier.h" |
| #include "tests/default_vectors_strings_test.fbs.h" |
| #include "tests/test_assert.h" |
| |
| namespace flatbuffers { |
| namespace tests { |
| |
| using flatbuffers::FlatBufferBuilder64; |
| using flatbuffers::Offset; |
| using flatbuffers::String; |
| using flatbuffers::Verifier; |
| |
| void DefaultVectorsStringsTest_EmptyOnDefault_Const() { |
| FlatBufferBuilder64 builder; |
| |
| // Create table without providing the fields with defaults. |
| DefaultVectorsStringsTest::TableWithDefaultVectorsBuilder tbl_builder( |
| builder); |
| tbl_builder.add_regular_int(100); |
| auto offset = tbl_builder.Finish(); |
| builder.Finish(offset); |
| |
| Verifier verifier(builder.GetBufferPointer(), builder.GetSize()); |
| TEST_ASSERT( |
| DefaultVectorsStringsTest::VerifyTableWithDefaultVectorsBuffer(verifier)); |
| |
| const auto* table = DefaultVectorsStringsTest::GetTableWithDefaultVectors( |
| builder.GetBufferPointer()); |
| TEST_NOTNULL(table); |
| |
| // Verify default scalar vectors. |
| TEST_NOTNULL(table->int_vec()); |
| TEST_EQ(table->int_vec()->size(), 0); |
| TEST_NOTNULL(table->bool_vec()); |
| TEST_EQ(table->bool_vec()->size(), 0); |
| TEST_NOTNULL(table->char_vec()); |
| TEST_EQ(table->char_vec()->size(), 0); |
| TEST_NOTNULL(table->uchar_vec()); |
| TEST_EQ(table->uchar_vec()->size(), 0); |
| TEST_NOTNULL(table->short_vec()); |
| TEST_EQ(table->short_vec()->size(), 0); |
| TEST_NOTNULL(table->ushort_vec()); |
| TEST_EQ(table->ushort_vec()->size(), 0); |
| TEST_NOTNULL(table->uint_vec()); |
| TEST_EQ(table->uint_vec()->size(), 0); |
| TEST_NOTNULL(table->long_vec()); |
| TEST_EQ(table->long_vec()->size(), 0); |
| TEST_NOTNULL(table->ulong_vec()); |
| TEST_EQ(table->ulong_vec()->size(), 0); |
| TEST_NOTNULL(table->float_vec()); |
| TEST_EQ(table->float_vec()->size(), 0); |
| TEST_NOTNULL(table->double_vec()); |
| TEST_EQ(table->double_vec()->size(), 0); |
| |
| // Verify default string_vec. |
| TEST_NOTNULL(table->string_vec()); |
| TEST_EQ(table->string_vec()->size(), 0); |
| |
| // Verify default string fields. |
| TEST_NOTNULL(table->empty_string()); |
| TEST_EQ_STR(table->empty_string()->c_str(), ""); |
| TEST_NOTNULL(table->some_string()); |
| TEST_EQ_STR(table->some_string()->c_str(), "some"); |
| |
| // Verify default struct_vec. |
| TEST_NOTNULL(table->struct_vec()); |
| TEST_EQ(table->struct_vec()->size(), 0); |
| |
| // Verify default table_vec. |
| TEST_NOTNULL(table->table_vec()); |
| TEST_EQ(table->table_vec()->size(), 0); |
| |
| // Verify default enum_vec. |
| TEST_NOTNULL(table->enum_vec()); |
| TEST_EQ(table->enum_vec()->size(), 0); |
| |
| // Verify non-default vector field. |
| TEST_NULL(table->regular_int_vec()); |
| |
| // Verify pointer and offset64 combinations. |
| TEST_NOTNULL(table->int_vec64()); |
| TEST_EQ(table->int_vec64()->size(), 0); |
| TEST_NOTNULL(table->int_vec_offset64()); |
| TEST_EQ(table->int_vec_offset64()->size(), 0); |
| |
| // Verify non-default field. |
| TEST_EQ(table->regular_int(), 100); |
| } |
| |
| void DefaultVectorsStringsTest_EmptyOnDefault_Mutable() { |
| FlatBufferBuilder64 builder; |
| |
| // Create table without providing the fields with defaults. |
| DefaultVectorsStringsTest::TableWithDefaultVectorsBuilder tbl_builder( |
| builder); |
| tbl_builder.add_regular_int(100); |
| auto offset = tbl_builder.Finish(); |
| builder.Finish(offset); |
| |
| Verifier verifier(builder.GetBufferPointer(), builder.GetSize()); |
| TEST_ASSERT( |
| DefaultVectorsStringsTest::VerifyTableWithDefaultVectorsBuffer(verifier)); |
| |
| auto* mutable_table = |
| DefaultVectorsStringsTest::GetMutableTableWithDefaultVectors( |
| builder.GetBufferPointer()); |
| TEST_NOTNULL(mutable_table); |
| |
| // Verify default scalar vectors. |
| TEST_NOTNULL(mutable_table->mutable_int_vec()); |
| TEST_EQ(mutable_table->mutable_int_vec()->size(), 0); |
| TEST_NOTNULL(mutable_table->mutable_bool_vec()); |
| TEST_EQ(mutable_table->mutable_bool_vec()->size(), 0); |
| TEST_NOTNULL(mutable_table->mutable_char_vec()); |
| TEST_EQ(mutable_table->mutable_char_vec()->size(), 0); |
| TEST_NOTNULL(mutable_table->mutable_uchar_vec()); |
| TEST_EQ(mutable_table->mutable_uchar_vec()->size(), 0); |
| TEST_NOTNULL(mutable_table->mutable_short_vec()); |
| TEST_EQ(mutable_table->mutable_short_vec()->size(), 0); |
| TEST_NOTNULL(mutable_table->mutable_ushort_vec()); |
| TEST_EQ(mutable_table->mutable_ushort_vec()->size(), 0); |
| TEST_NOTNULL(mutable_table->mutable_uint_vec()); |
| TEST_EQ(mutable_table->mutable_uint_vec()->size(), 0); |
| TEST_NOTNULL(mutable_table->mutable_long_vec()); |
| TEST_EQ(mutable_table->mutable_long_vec()->size(), 0); |
| TEST_NOTNULL(mutable_table->mutable_ulong_vec()); |
| TEST_EQ(mutable_table->mutable_ulong_vec()->size(), 0); |
| TEST_NOTNULL(mutable_table->mutable_float_vec()); |
| TEST_EQ(mutable_table->mutable_float_vec()->size(), 0); |
| TEST_NOTNULL(mutable_table->mutable_double_vec()); |
| TEST_EQ(mutable_table->mutable_double_vec()->size(), 0); |
| |
| // Verify default struct_vec. |
| TEST_NOTNULL(mutable_table->mutable_struct_vec()); |
| TEST_EQ(mutable_table->mutable_struct_vec()->size(), 0); |
| |
| // Verify default table_vec. |
| TEST_NOTNULL(mutable_table->mutable_table_vec()); |
| TEST_EQ(mutable_table->mutable_table_vec()->size(), 0); |
| |
| // Verify default enum_vec. |
| TEST_NOTNULL(mutable_table->mutable_enum_vec()); |
| TEST_EQ(mutable_table->mutable_enum_vec()->size(), 0); |
| |
| // Verify non-default vector field. |
| TEST_NULL(mutable_table->mutable_regular_int_vec()); |
| |
| // Verify pointer and offset64 combinations. |
| TEST_NOTNULL(mutable_table->mutable_int_vec64()); |
| TEST_EQ(mutable_table->mutable_int_vec64()->size(), 0); |
| TEST_NOTNULL(mutable_table->mutable_int_vec_offset64()); |
| TEST_EQ(mutable_table->mutable_int_vec_offset64()->size(), 0); |
| } |
| |
| void DefaultVectorsStringsTest_WithValues() { |
| // Create a table with values for the defaulted vector fields. |
| FlatBufferBuilder64 builder; |
| auto int_vec64 = builder.CreateVector64(std::vector<int>({30, 40})); |
| auto int_vec_offset64 = |
| builder.CreateVector64<flatbuffers::Vector>(std::vector<int>({50, 60})); |
| auto int_vec = builder.CreateVector(std::vector<int>({1, 2})); |
| auto bool_vec = builder.CreateVector(std::vector<uint8_t>({true, false})); |
| auto string_vec = builder.CreateVector(std::vector<Offset<String>>( |
| {builder.CreateString("a"), builder.CreateString("b")})); |
| auto empty_string = builder.CreateString("not empty"); |
| auto some_string = builder.CreateString("not some"); |
| DefaultVectorsStringsTest::MyStruct structs[] = { |
| DefaultVectorsStringsTest::MyStruct(1, 2), |
| DefaultVectorsStringsTest::MyStruct(3, 4)}; |
| auto struct_vec = builder.CreateVectorOfStructs(structs, 2); |
| auto regular_int_vec = builder.CreateVector(std::vector<int>({10, 20})); |
| |
| DefaultVectorsStringsTest::TableWithDefaultVectorsBuilder tbl_builder( |
| builder); |
| tbl_builder.add_int_vec(int_vec); |
| tbl_builder.add_int_vec64(int_vec64); |
| tbl_builder.add_int_vec_offset64(int_vec_offset64); |
| |
| tbl_builder.add_bool_vec(bool_vec); |
| tbl_builder.add_string_vec(string_vec); |
| tbl_builder.add_empty_string(empty_string); |
| tbl_builder.add_some_string(some_string); |
| tbl_builder.add_struct_vec(struct_vec); |
| tbl_builder.add_regular_int_vec(regular_int_vec); |
| auto offset = tbl_builder.Finish(); |
| builder.Finish(offset); |
| |
| Verifier verifier(builder.GetBufferPointer(), builder.GetSize()); |
| TEST_ASSERT( |
| DefaultVectorsStringsTest::VerifyTableWithDefaultVectorsBuffer(verifier)); |
| |
| const auto* table = DefaultVectorsStringsTest::GetTableWithDefaultVectors( |
| builder.GetBufferPointer()); |
| |
| TEST_EQ(table->int_vec()->size(), 2); |
| TEST_EQ(table->int_vec()->Get(1), 2); |
| TEST_EQ(table->bool_vec()->size(), 2); |
| TEST_EQ(table->bool_vec()->Get(0), true); |
| TEST_EQ(table->string_vec()->size(), 2); |
| TEST_EQ_STR(table->string_vec()->Get(1)->c_str(), "b"); |
| TEST_EQ_STR(table->empty_string()->c_str(), "not empty"); |
| TEST_EQ_STR(table->some_string()->c_str(), "not some"); |
| TEST_EQ(table->struct_vec()->size(), 2); |
| TEST_EQ(table->struct_vec()->Get(1)->b(), 4); |
| TEST_EQ(table->regular_int_vec()->size(), 2); |
| TEST_EQ(table->regular_int_vec()->Get(1), 20); |
| |
| TEST_EQ(table->int_vec64()->size(), 2); |
| TEST_EQ(table->int_vec64()->Get(1), 40); |
| TEST_EQ(table->int_vec_offset64()->size(), 2); |
| TEST_EQ(table->int_vec_offset64()->Get(1), 60); |
| } |
| |
| void DefaultVectorsStringsTest_BufferSize() { |
| FlatBufferBuilder64 builder; |
| // Create a table where all fields with default values are omitted. |
| DefaultVectorsStringsTest::TableWithDefaultVectorsBuilder tbl_builder( |
| builder); |
| auto offset = tbl_builder.Finish(); |
| builder.Finish(offset); |
| |
| Verifier verifier(builder.GetBufferPointer(), builder.GetSize()); |
| TEST_ASSERT( |
| DefaultVectorsStringsTest::VerifyTableWithDefaultVectorsBuffer(verifier)); |
| |
| // The buffer should be small when only defaults are used. |
| // This value can be adjusted if the schema changes. |
| constexpr unsigned int buffer_size_threshold_in_bytes = 12; |
| TEST_ASSERT(builder.GetSize() <= buffer_size_threshold_in_bytes); |
| } |
| |
| void DefaultVectorsStringsTest() { |
| DefaultVectorsStringsTest_EmptyOnDefault_Const(); |
| DefaultVectorsStringsTest_EmptyOnDefault_Mutable(); |
| DefaultVectorsStringsTest_WithValues(); |
| DefaultVectorsStringsTest_BufferSize(); |
| } |
| |
| } // namespace tests |
| } // namespace flatbuffers |