Austin Schuh | 2dd86a9 | 2022-09-14 21:19:23 -0700 | [diff] [blame^] | 1 | #include "optional_scalars_test.h" |
| 2 | #include <string> |
| 3 | #include <vector> |
| 4 | #include "flatbuffers/idl.h" |
| 5 | #include "optional_scalars_generated.h" |
| 6 | #include "test_assert.h" |
| 7 | |
| 8 | namespace flatbuffers{ |
| 9 | namespace tests{ |
| 10 | |
| 11 | |
| 12 | void OptionalScalarsTest() { |
| 13 | // Simple schemas and a "has optional scalar" sentinal. |
| 14 | std::vector<std::string> schemas; |
| 15 | schemas.push_back("table Monster { mana : int; }"); |
| 16 | schemas.push_back("table Monster { mana : int = 42; }"); |
| 17 | schemas.push_back("table Monster { mana : int = null; }"); |
| 18 | schemas.push_back("table Monster { mana : long; }"); |
| 19 | schemas.push_back("table Monster { mana : long = 42; }"); |
| 20 | schemas.push_back("table Monster { mana : long = null; }"); |
| 21 | schemas.push_back("table Monster { mana : float; }"); |
| 22 | schemas.push_back("table Monster { mana : float = 42; }"); |
| 23 | schemas.push_back("table Monster { mana : float = null; }"); |
| 24 | schemas.push_back("table Monster { mana : double; }"); |
| 25 | schemas.push_back("table Monster { mana : double = 42; }"); |
| 26 | schemas.push_back("table Monster { mana : double = null; }"); |
| 27 | schemas.push_back("table Monster { mana : bool; }"); |
| 28 | schemas.push_back("table Monster { mana : bool = 42; }"); |
| 29 | schemas.push_back("table Monster { mana : bool = null; }"); |
| 30 | schemas.push_back( |
| 31 | "enum Enum: int {A=0, B=1} " |
| 32 | "table Monster { mana : Enum; }"); |
| 33 | schemas.push_back( |
| 34 | "enum Enum: int {A=0, B=1} " |
| 35 | "table Monster { mana : Enum = B; }"); |
| 36 | schemas.push_back( |
| 37 | "enum Enum: int {A=0, B=1} " |
| 38 | "table Monster { mana : Enum = null; }"); |
| 39 | |
| 40 | // Check the FieldDef is correctly set. |
| 41 | for (auto schema = schemas.begin(); schema < schemas.end(); schema++) { |
| 42 | const bool has_null = schema->find("null") != std::string::npos; |
| 43 | flatbuffers::Parser parser; |
| 44 | TEST_ASSERT(parser.Parse(schema->c_str())); |
| 45 | const auto *mana = parser.structs_.Lookup("Monster")->fields.Lookup("mana"); |
| 46 | TEST_EQ(mana->IsOptional(), has_null); |
| 47 | } |
| 48 | |
| 49 | // Test if nullable scalars are allowed for each language. |
| 50 | for (unsigned lang = 1; lang < flatbuffers::IDLOptions::kMAX; lang <<= 1) { |
| 51 | flatbuffers::IDLOptions opts; |
| 52 | opts.lang_to_generate = lang; |
| 53 | if (false == flatbuffers::Parser::SupportsOptionalScalars(opts)) { |
| 54 | continue; |
| 55 | } |
| 56 | for (auto schema = schemas.begin(); schema < schemas.end(); schema++) { |
| 57 | flatbuffers::Parser parser(opts); |
| 58 | auto done = parser.Parse(schema->c_str()); |
| 59 | TEST_EQ_STR(parser.error_.c_str(), ""); |
| 60 | TEST_ASSERT(done); |
| 61 | } |
| 62 | } |
| 63 | |
| 64 | // test C++ nullable |
| 65 | flatbuffers::FlatBufferBuilder fbb; |
| 66 | FinishScalarStuffBuffer( |
| 67 | fbb, optional_scalars::CreateScalarStuff(fbb, 1, static_cast<int8_t>(2))); |
| 68 | auto opts = optional_scalars::GetMutableScalarStuff(fbb.GetBufferPointer()); |
| 69 | TEST_ASSERT(!opts->maybe_bool()); |
| 70 | TEST_ASSERT(!opts->maybe_f32().has_value()); |
| 71 | TEST_ASSERT(opts->maybe_i8().has_value()); |
| 72 | TEST_EQ(opts->maybe_i8().value(), 2); |
| 73 | TEST_ASSERT(opts->mutate_maybe_i8(3)); |
| 74 | TEST_ASSERT(opts->maybe_i8().has_value()); |
| 75 | TEST_EQ(opts->maybe_i8().value(), 3); |
| 76 | TEST_ASSERT(!opts->mutate_maybe_i16(-10)); |
| 77 | |
| 78 | optional_scalars::ScalarStuffT obj; |
| 79 | TEST_ASSERT(!obj.maybe_bool); |
| 80 | TEST_ASSERT(!obj.maybe_f32.has_value()); |
| 81 | opts->UnPackTo(&obj); |
| 82 | TEST_ASSERT(!obj.maybe_bool); |
| 83 | TEST_ASSERT(!obj.maybe_f32.has_value()); |
| 84 | TEST_ASSERT(obj.maybe_i8.has_value() && obj.maybe_i8.value() == 3); |
| 85 | TEST_ASSERT(obj.maybe_i8 && *obj.maybe_i8 == 3); |
| 86 | obj.maybe_i32 = -1; |
| 87 | obj.maybe_enum = optional_scalars::OptionalByte_Two; |
| 88 | |
| 89 | fbb.Clear(); |
| 90 | FinishScalarStuffBuffer(fbb, optional_scalars::ScalarStuff::Pack(fbb, &obj)); |
| 91 | opts = optional_scalars::GetMutableScalarStuff(fbb.GetBufferPointer()); |
| 92 | TEST_ASSERT(opts->maybe_i8().has_value()); |
| 93 | TEST_EQ(opts->maybe_i8().value(), 3); |
| 94 | TEST_ASSERT(opts->maybe_i32().has_value()); |
| 95 | TEST_EQ(opts->maybe_i32().value(), -1); |
| 96 | TEST_EQ(opts->maybe_enum().value(), optional_scalars::OptionalByte_Two); |
| 97 | TEST_ASSERT(opts->maybe_i32() == flatbuffers::Optional<int64_t>(-1)); |
| 98 | } |
| 99 | |
| 100 | } |
| 101 | } |