From 23bb57401c6acaa6f9e983e6eb7a687527b68af6 Mon Sep 17 00:00:00 2001 From: Vladimir Glavnyy <31897320+vglavnyy@users.noreply.github.com> Date: Tue, 9 Apr 2019 00:21:30 +0700 Subject: [PATCH] Add basic test for enum defaults (#5280) --- tests/test.cpp | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/tests/test.cpp b/tests/test.cpp index 04c014d..81eb91d 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -1305,15 +1305,20 @@ void ErrorTest() { TestError("enum X:bool { Y = true }", "must be integral"); } -template T TestValue(const char *json, const char *type_name) { +template +T TestValue(const char *json, const char *type_name, + const char *decls = nullptr) { flatbuffers::Parser parser; parser.builder_.ForceDefaults(true); // return defaults auto check_default = json ? false : true; if (check_default) { parser.opts.output_default_scalars_in_json = true; } // Simple schema. - std::string schema = - "table X { Y:" + std::string(type_name) + "; } root_type X;"; - TEST_EQ(parser.Parse(schema.c_str()), true); + std::string schema = std::string(decls ? decls : "") + "\n" + + "table X { Y:" + std::string(type_name) + + "; } 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); TEST_EQ_STR(parser.error_.c_str(), ""); @@ -1439,6 +1444,24 @@ void EnumOutOfRangeTest() { 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("{ Y:0 }", "E", "enum E:int { V }"), 0); + TEST_EQ(TestValue("{ Y:V }", "E", "enum E:int { V }"), 0); + // A default value of Y is 0. + TEST_EQ(TestValue("{ }", "E", "enum E:int { V }"), 0); + TEST_EQ(TestValue("{ Y:5 }", "E=V", "enum E:int { V=5 }"), 5); + // Generate json with defaults and check. + TEST_EQ(TestValue(nullptr, "E=V", "enum E:int { V=5 }"), 5); + // 5 in enum + TEST_EQ(TestValue("{ Y:5 }", "E", "enum E:int { Z, V=5 }"), 5); + TEST_EQ(TestValue("{ Y:5 }", "E=V", "enum E:int { Z, V=5 }"), 5); + // Generate json with defaults and check. + TEST_EQ(TestValue(nullptr, "E", "enum E:int { Z, V=5 }"), 0); + TEST_EQ(TestValue(nullptr, "E=V", "enum E:int { Z, V=5 }"), 5); +} + void IntegerOutOfRangeTest() { TestError("table T { F:byte; } root_type T; { F:128 }", "constant does not fit"); @@ -2622,6 +2645,7 @@ int FlatBufferTests() { ErrorTest(); ValueTest(); + EnumValueTest(); EnumStringsTest(); EnumNamesTest(); EnumOutOfRangeTest(); -- 2.7.4