Commit 23bb5740 authored by Vladimir Glavnyy's avatar Vladimir Glavnyy Committed by Wouter van Oortmerssen

Add basic test for enum defaults (#5280)

parent dd6daa70
...@@ -1305,15 +1305,20 @@ void ErrorTest() { ...@@ -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() { ...@@ -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() { ...@@ -2622,6 +2645,7 @@ int FlatBufferTests() {
ErrorTest(); ErrorTest();
ValueTest(); ValueTest();
EnumValueTest();
EnumStringsTest(); EnumStringsTest();
EnumNamesTest(); EnumNamesTest();
EnumOutOfRangeTest(); EnumOutOfRangeTest();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment