mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-30 06:50:01 +00:00
Add basic test for enum defaults (#5280)
This commit is contained in:
committed by
Wouter van Oortmerssen
parent
dd6daa709b
commit
23bb57401c
@@ -1305,15 +1305,20 @@ void ErrorTest() {
|
|||||||
TestError("enum X:bool { Y = true }", "must be integral");
|
TestError("enum X:bool { Y = true }", "must be integral");
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T> T TestValue(const char *json, const char *type_name) {
|
template<typename T>
|
||||||
|
T TestValue(const char *json, const char *type_name,
|
||||||
|
const char *decls = nullptr) {
|
||||||
flatbuffers::Parser parser;
|
flatbuffers::Parser parser;
|
||||||
parser.builder_.ForceDefaults(true); // return defaults
|
parser.builder_.ForceDefaults(true); // return defaults
|
||||||
auto check_default = json ? false : true;
|
auto check_default = json ? false : true;
|
||||||
if (check_default) { parser.opts.output_default_scalars_in_json = true; }
|
if (check_default) { parser.opts.output_default_scalars_in_json = true; }
|
||||||
// Simple schema.
|
// Simple schema.
|
||||||
std::string schema =
|
std::string schema = std::string(decls ? decls : "") + "\n" +
|
||||||
"table X { Y:" + std::string(type_name) + "; } root_type X;";
|
"table X { Y:" + std::string(type_name) +
|
||||||
TEST_EQ(parser.Parse(schema.c_str()), true);
|
"; } root_type X;";
|
||||||
|
auto schema_done = parser.Parse(schema.c_str());
|
||||||
|
TEST_EQ_STR(parser.error_.c_str(), "");
|
||||||
|
TEST_EQ(schema_done, true);
|
||||||
|
|
||||||
auto done = parser.Parse(check_default ? "{}" : json);
|
auto done = parser.Parse(check_default ? "{}" : json);
|
||||||
TEST_EQ_STR(parser.error_.c_str(), "");
|
TEST_EQ_STR(parser.error_.c_str(), "");
|
||||||
@@ -1439,6 +1444,24 @@ void EnumOutOfRangeTest() {
|
|||||||
TestError("enum X:ulong { Y = 18446744073709551615 }", "constant does not fit");
|
TestError("enum X:ulong { Y = 18446744073709551615 }", "constant does not fit");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EnumValueTest() {
|
||||||
|
// json: "{ Y:0 }", schema: table X { Y : "E"}
|
||||||
|
// 0 in enum (V=0) E then Y=0 is valid.
|
||||||
|
TEST_EQ(TestValue<int>("{ Y:0 }", "E", "enum E:int { V }"), 0);
|
||||||
|
TEST_EQ(TestValue<int>("{ Y:V }", "E", "enum E:int { V }"), 0);
|
||||||
|
// A default value of Y is 0.
|
||||||
|
TEST_EQ(TestValue<int>("{ }", "E", "enum E:int { V }"), 0);
|
||||||
|
TEST_EQ(TestValue<int>("{ Y:5 }", "E=V", "enum E:int { V=5 }"), 5);
|
||||||
|
// Generate json with defaults and check.
|
||||||
|
TEST_EQ(TestValue<int>(nullptr, "E=V", "enum E:int { V=5 }"), 5);
|
||||||
|
// 5 in enum
|
||||||
|
TEST_EQ(TestValue<int>("{ Y:5 }", "E", "enum E:int { Z, V=5 }"), 5);
|
||||||
|
TEST_EQ(TestValue<int>("{ Y:5 }", "E=V", "enum E:int { Z, V=5 }"), 5);
|
||||||
|
// Generate json with defaults and check.
|
||||||
|
TEST_EQ(TestValue<int>(nullptr, "E", "enum E:int { Z, V=5 }"), 0);
|
||||||
|
TEST_EQ(TestValue<int>(nullptr, "E=V", "enum E:int { Z, V=5 }"), 5);
|
||||||
|
}
|
||||||
|
|
||||||
void IntegerOutOfRangeTest() {
|
void IntegerOutOfRangeTest() {
|
||||||
TestError("table T { F:byte; } root_type T; { F:128 }",
|
TestError("table T { F:byte; } root_type T; { F:128 }",
|
||||||
"constant does not fit");
|
"constant does not fit");
|
||||||
@@ -2622,6 +2645,7 @@ int FlatBufferTests() {
|
|||||||
|
|
||||||
ErrorTest();
|
ErrorTest();
|
||||||
ValueTest();
|
ValueTest();
|
||||||
|
EnumValueTest();
|
||||||
EnumStringsTest();
|
EnumStringsTest();
|
||||||
EnumNamesTest();
|
EnumNamesTest();
|
||||||
EnumOutOfRangeTest();
|
EnumOutOfRangeTest();
|
||||||
|
|||||||
Reference in New Issue
Block a user