Index: third_party/protobuf/src/google/protobuf/text_format_unittest.cc |
diff --git a/third_party/protobuf/src/google/protobuf/text_format_unittest.cc b/third_party/protobuf/src/google/protobuf/text_format_unittest.cc |
index ddf8ff7ffbb90844bc7ac61f5a9e6f7e8d3f63e9..00ea8c3c2fc16adbc3ce759698a702590a00a33f 100644 |
--- a/third_party/protobuf/src/google/protobuf/text_format_unittest.cc |
+++ b/third_party/protobuf/src/google/protobuf/text_format_unittest.cc |
@@ -353,6 +353,25 @@ TEST_F(TextFormatExtensionsTest, ParseExtensions) { |
TestUtil::ExpectAllExtensionsSet(proto_); |
} |
+TEST_F(TextFormatTest, ParseEnumFieldFromNumber) { |
+ // Create a parse string with a numerical value for an enum field. |
+ string parse_string = strings::Substitute("optional_nested_enum: $0", |
+ unittest::TestAllTypes::BAZ); |
+ EXPECT_TRUE(TextFormat::ParseFromString(parse_string, &proto_)); |
+ EXPECT_TRUE(proto_.has_optional_nested_enum()); |
+ EXPECT_EQ(unittest::TestAllTypes::BAZ, proto_.optional_nested_enum()); |
+} |
+ |
+TEST_F(TextFormatTest, ParseEnumFieldFromNegativeNumber) { |
+ ASSERT_LT(unittest::SPARSE_E, 0); |
+ string parse_string = strings::Substitute("sparse_enum: $0", |
+ unittest::SPARSE_E); |
+ unittest::SparseEnumMessage proto; |
+ EXPECT_TRUE(TextFormat::ParseFromString(parse_string, &proto)); |
+ EXPECT_TRUE(proto.has_sparse_enum()); |
+ EXPECT_EQ(unittest::SPARSE_E, proto.sparse_enum()); |
+} |
+ |
TEST_F(TextFormatTest, ParseStringEscape) { |
// Create a parse string with escpaed characters in it. |
string parse_string = "optional_string: " |
@@ -406,6 +425,34 @@ TEST_F(TextFormatTest, ParseFloatWithSuffix) { |
EXPECT_EQ(1.0, proto_.optional_float()); |
} |
+TEST_F(TextFormatTest, ParseShortRepeatedForm) { |
+ string parse_string = |
+ // Mixed short-form and long-form are simply concatenated. |
+ "repeated_int32: 1\n" |
+ "repeated_int32: [456, 789]\n" |
+ "repeated_nested_enum: [ FOO ,BAR, # comment\n" |
+ " 3]\n" |
+ // Note that while the printer won't print repeated strings in short-form, |
+ // the parser will accept them. |
+ "repeated_string: [ \"foo\", 'bar' ]\n"; |
+ |
+ ASSERT_TRUE(TextFormat::ParseFromString(parse_string, &proto_)); |
+ |
+ ASSERT_EQ(3, proto_.repeated_int32_size()); |
+ EXPECT_EQ(1, proto_.repeated_int32(0)); |
+ EXPECT_EQ(456, proto_.repeated_int32(1)); |
+ EXPECT_EQ(789, proto_.repeated_int32(2)); |
+ |
+ ASSERT_EQ(3, proto_.repeated_nested_enum_size()); |
+ EXPECT_EQ(unittest::TestAllTypes::FOO, proto_.repeated_nested_enum(0)); |
+ EXPECT_EQ(unittest::TestAllTypes::BAR, proto_.repeated_nested_enum(1)); |
+ EXPECT_EQ(unittest::TestAllTypes::BAZ, proto_.repeated_nested_enum(2)); |
+ |
+ ASSERT_EQ(2, proto_.repeated_string_size()); |
+ EXPECT_EQ("foo", proto_.repeated_string(0)); |
+ EXPECT_EQ("bar", proto_.repeated_string(1)); |
+} |
+ |
TEST_F(TextFormatTest, Comments) { |
// Test that comments are ignored. |
@@ -771,7 +818,12 @@ TEST_F(TextFormatParserTest, ParseFieldValueFromString) { |
// bool |
EXPECT_FIELD(bool, true, "true"); |
EXPECT_FIELD(bool, false, "false"); |
- EXPECT_INVALID(bool, "1"); |
+ EXPECT_FIELD(bool, true, "1"); |
+ EXPECT_FIELD(bool, true, "t"); |
+ EXPECT_FIELD(bool, false, "0"); |
+ EXPECT_FIELD(bool, false, "f"); |
+ EXPECT_INVALID(bool, "2"); |
+ EXPECT_INVALID(bool, "-0"); |
EXPECT_INVALID(bool, "on"); |
EXPECT_INVALID(bool, "a"); |
EXPECT_INVALID(bool, "True"); |
@@ -799,7 +851,8 @@ TEST_F(TextFormatParserTest, ParseFieldValueFromString) { |
// enum |
EXPECT_FIELD(nested_enum, unittest::TestAllTypes::BAR, "BAR"); |
- EXPECT_INVALID(nested_enum, "1"); // number not supported |
+ EXPECT_FIELD(nested_enum, unittest::TestAllTypes::BAZ, |
+ SimpleItoa(unittest::TestAllTypes::BAZ)); |
EXPECT_INVALID(nested_enum, "FOOBAR"); |
// message |
@@ -820,7 +873,7 @@ TEST_F(TextFormatParserTest, InvalidToken) { |
ExpectFailure("optional_bool: true\n-5\n", "Expected identifier.", |
2, 1); |
- ExpectFailure("optional_bool: true;\n", "Expected identifier.", 1, 20); |
+ ExpectFailure("optional_bool: true!\n", "Expected identifier.", 1, 20); |
ExpectFailure("\"some string\"", "Expected identifier.", 1, 1); |
} |
@@ -890,7 +943,7 @@ TEST_F(TextFormatParserTest, InvalidFieldValues) { |
// Invalid values for a boolean field. |
ExpectFailure("optional_bool: \"hello\"\n", "Expected identifier.", 1, 16); |
- ExpectFailure("optional_bool: 5\n", "Expected identifier.", 1, 16); |
+ ExpectFailure("optional_bool: 5\n", "Integer out of range.", 1, 16); |
ExpectFailure("optional_bool: -7.5\n", "Expected identifier.", 1, 16); |
ExpectFailure("optional_bool: !\n", "Expected identifier.", 1, 16); |
@@ -911,12 +964,18 @@ TEST_F(TextFormatParserTest, InvalidFieldValues) { |
1, 17); |
// Invalid values for an enumeration field. |
- ExpectFailure("optional_nested_enum: \"hello\"\n", "Expected identifier.", |
- 1, 23); |
- |
- ExpectFailure("optional_nested_enum: 5\n", "Expected identifier.", 1, 23); |
- ExpectFailure("optional_nested_enum: -7.5\n", "Expected identifier.", 1, 23); |
- ExpectFailure("optional_nested_enum: !\n", "Expected identifier.", 1, 23); |
+ ExpectFailure("optional_nested_enum: \"hello\"\n", |
+ "Expected integer or identifier.", 1, 23); |
+ |
+ // Valid token, but enum value is not defined. |
+ ExpectFailure("optional_nested_enum: 5\n", |
+ "Unknown enumeration value of \"5\" for field " |
+ "\"optional_nested_enum\".", 2, 1); |
+ // We consume the negative sign, so the error position starts one character |
+ // later. |
+ ExpectFailure("optional_nested_enum: -7.5\n", "Expected integer.", 1, 24); |
+ ExpectFailure("optional_nested_enum: !\n", |
+ "Expected integer or identifier.", 1, 23); |
ExpectFailure( |
"optional_nested_enum: grah\n", |
@@ -986,6 +1045,14 @@ TEST_F(TextFormatParserTest, MergeDuplicateOptional) { |
EXPECT_EQ(2, message.c()); |
} |
+TEST_F(TextFormatParserTest, ExplicitDelimiters) { |
+ unittest::TestRequired message; |
+ EXPECT_TRUE(TextFormat::ParseFromString("a:1,b:2;c:3", &message)); |
+ EXPECT_EQ(1, message.a()); |
+ EXPECT_EQ(2, message.b()); |
+ EXPECT_EQ(3, message.c()); |
+} |
+ |
TEST_F(TextFormatParserTest, PrintErrorsToStderr) { |
vector<string> errors; |