Index: third_party/protobuf/python/google/protobuf/internal/text_format_test.py |
diff --git a/third_party/protobuf/python/google/protobuf/internal/text_format_test.py b/third_party/protobuf/python/google/protobuf/internal/text_format_test.py |
index 0e14556c6f029af7940498231f558cc78db24e2d..ab2bf05b8e99f3df14319a923426abec6c6b2af2 100755 |
--- a/third_party/protobuf/python/google/protobuf/internal/text_format_test.py |
+++ b/third_party/protobuf/python/google/protobuf/internal/text_format_test.py |
@@ -40,9 +40,10 @@ import six |
import string |
try: |
- import unittest2 as unittest |
+ import unittest2 as unittest #PY26 |
except ImportError: |
import unittest |
+ |
from google.protobuf.internal import _parameterized |
from google.protobuf import map_unittest_pb2 |
@@ -62,7 +63,7 @@ class SimpleTextFormatTests(unittest.TestCase): |
# expects single characters. Therefore it's an error (in addition to being |
# non-sensical in the first place) to try to specify a "quote mark" that is |
# more than one character. |
- def TestQuoteMarksAreSingleChars(self): |
+ def testQuoteMarksAreSingleChars(self): |
for quote in text_format._QUOTES: |
self.assertEqual(1, len(quote)) |
@@ -249,6 +250,36 @@ class TextFormatTest(TextFormatBase): |
message.c = 123 |
self.assertEqual('c: 123\n', str(message)) |
+ def testPrintField(self, message_module): |
+ message = message_module.TestAllTypes() |
+ field = message.DESCRIPTOR.fields_by_name['optional_float'] |
+ value = message.optional_float |
+ out = text_format.TextWriter(False) |
+ text_format.PrintField(field, value, out) |
+ self.assertEqual('optional_float: 0.0\n', out.getvalue()) |
+ out.close() |
+ # Test Printer |
+ out = text_format.TextWriter(False) |
+ printer = text_format._Printer(out) |
+ printer.PrintField(field, value) |
+ self.assertEqual('optional_float: 0.0\n', out.getvalue()) |
+ out.close() |
+ |
+ def testPrintFieldValue(self, message_module): |
+ message = message_module.TestAllTypes() |
+ field = message.DESCRIPTOR.fields_by_name['optional_float'] |
+ value = message.optional_float |
+ out = text_format.TextWriter(False) |
+ text_format.PrintFieldValue(field, value, out) |
+ self.assertEqual('0.0', out.getvalue()) |
+ out.close() |
+ # Test Printer |
+ out = text_format.TextWriter(False) |
+ printer = text_format._Printer(out) |
+ printer.PrintFieldValue(field, value) |
+ self.assertEqual('0.0', out.getvalue()) |
+ out.close() |
+ |
def testParseAllFields(self, message_module): |
message = message_module.TestAllTypes() |
test_util.SetAllFields(message) |
@@ -314,6 +345,18 @@ class TextFormatTest(TextFormatBase): |
self.assertEqual(u'one', message.repeated_string[0]) |
self.assertEqual(u'two', message.repeated_string[1]) |
+ def testParseRepeatedMessageShortFormat(self, message_module): |
+ message = message_module.TestAllTypes() |
+ text = ('repeated_nested_message: [{bb: 100}, {bb: 200}],\n' |
+ 'repeated_nested_message: {bb: 300}\n' |
+ 'repeated_nested_message [{bb: 400}];\n') |
+ text_format.Parse(text, message) |
+ |
+ self.assertEqual(100, message.repeated_nested_message[0].bb) |
+ self.assertEqual(200, message.repeated_nested_message[1].bb) |
+ self.assertEqual(300, message.repeated_nested_message[2].bb) |
+ self.assertEqual(400, message.repeated_nested_message[3].bb) |
+ |
def testParseEmptyText(self, message_module): |
message = message_module.TestAllTypes() |
text = '' |
@@ -411,6 +454,19 @@ class TextFormatTest(TextFormatBase): |
text_format.Parse(text_format.MessageToString(m), m2) |
self.assertEqual('oneof_uint32', m2.WhichOneof('oneof_field')) |
+ def testParseMultipleOneof(self, message_module): |
+ m_string = '\n'.join([ |
+ 'oneof_uint32: 11', |
+ 'oneof_string: "foo"']) |
+ m2 = message_module.TestAllTypes() |
+ if message_module is unittest_pb2: |
+ with self.assertRaisesRegexp( |
+ text_format.ParseError, ' is specified along with field '): |
+ text_format.Parse(m_string, m2) |
+ else: |
+ text_format.Parse(m_string, m2) |
+ self.assertEqual('oneof_string', m2.WhichOneof('oneof_field')) |
+ |
# These are tests that aren't fundamentally specific to proto2, but are at |
# the moment because of differences between the proto2 and proto3 test schemas. |
@@ -426,7 +482,8 @@ class OnlyWorksWithProto2RightNowTests(TextFormatBase): |
'text_format_unittest_data_pointy_oneof.txt') |
def testParseGolden(self): |
- golden_text = '\n'.join(self.ReadGolden('text_format_unittest_data.txt')) |
+ golden_text = '\n'.join(self.ReadGolden( |
+ 'text_format_unittest_data_oneof_implemented.txt')) |
parsed_message = unittest_pb2.TestAllTypes() |
r = text_format.Parse(golden_text, parsed_message) |
self.assertIs(r, parsed_message) |
@@ -469,7 +526,7 @@ class OnlyWorksWithProto2RightNowTests(TextFormatBase): |
'optional_nested_message {\n bb: 1\n oo: 0\n}\n') |
def testMergeLinesGolden(self): |
- opened = self.ReadGolden('text_format_unittest_data.txt') |
+ opened = self.ReadGolden('text_format_unittest_data_oneof_implemented.txt') |
parsed_message = unittest_pb2.TestAllTypes() |
r = text_format.MergeLines(opened, parsed_message) |
self.assertIs(r, parsed_message) |
@@ -479,7 +536,7 @@ class OnlyWorksWithProto2RightNowTests(TextFormatBase): |
self.assertEqual(message, parsed_message) |
def testParseLinesGolden(self): |
- opened = self.ReadGolden('text_format_unittest_data.txt') |
+ opened = self.ReadGolden('text_format_unittest_data_oneof_implemented.txt') |
parsed_message = unittest_pb2.TestAllTypes() |
r = text_format.ParseLines(opened, parsed_message) |
self.assertIs(r, parsed_message) |
@@ -589,6 +646,26 @@ class Proto2Tests(TextFormatBase): |
' text: \"bar\"\n' |
'}\n') |
+ def testPrintMessageSetByFieldNumber(self): |
+ out = text_format.TextWriter(False) |
+ message = unittest_mset_pb2.TestMessageSetContainer() |
+ ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension |
+ ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension |
+ message.message_set.Extensions[ext1].i = 23 |
+ message.message_set.Extensions[ext2].str = 'foo' |
+ text_format.PrintMessage(message, out, use_field_number=True) |
+ self.CompareToGoldenText( |
+ out.getvalue(), |
+ '1 {\n' |
+ ' 1545008 {\n' |
+ ' 15: 23\n' |
+ ' }\n' |
+ ' 1547769 {\n' |
+ ' 25: \"foo\"\n' |
+ ' }\n' |
+ '}\n') |
+ out.close() |
+ |
def testPrintMessageSetAsOneLine(self): |
message = unittest_mset_pb2.TestMessageSetContainer() |
ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension |
@@ -629,6 +706,48 @@ class Proto2Tests(TextFormatBase): |
self.assertEqual(23, message.message_set.Extensions[ext1].i) |
self.assertEqual('foo', message.message_set.Extensions[ext2].str) |
+ def testParseMessageByFieldNumber(self): |
+ message = unittest_pb2.TestAllTypes() |
+ text = ('34: 1\n' |
+ 'repeated_uint64: 2\n') |
+ text_format.Parse(text, message, allow_field_number=True) |
+ self.assertEqual(1, message.repeated_uint64[0]) |
+ self.assertEqual(2, message.repeated_uint64[1]) |
+ |
+ message = unittest_mset_pb2.TestMessageSetContainer() |
+ text = ('1 {\n' |
+ ' 1545008 {\n' |
+ ' 15: 23\n' |
+ ' }\n' |
+ ' 1547769 {\n' |
+ ' 25: \"foo\"\n' |
+ ' }\n' |
+ '}\n') |
+ text_format.Parse(text, message, allow_field_number=True) |
+ ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension |
+ ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension |
+ self.assertEqual(23, message.message_set.Extensions[ext1].i) |
+ self.assertEqual('foo', message.message_set.Extensions[ext2].str) |
+ |
+ # Can't parse field number without set allow_field_number=True. |
+ message = unittest_pb2.TestAllTypes() |
+ text = '34:1\n' |
+ six.assertRaisesRegex( |
+ self, |
+ text_format.ParseError, |
+ (r'1:1 : Message type "\w+.TestAllTypes" has no field named ' |
+ r'"34".'), |
+ text_format.Parse, text, message) |
+ |
+ # Can't parse if field number is not found. |
+ text = '1234:1\n' |
+ six.assertRaisesRegex( |
+ self, |
+ text_format.ParseError, |
+ (r'1:1 : Message type "\w+.TestAllTypes" has no field named ' |
+ r'"1234".'), |
+ text_format.Parse, text, message, allow_field_number=True) |
+ |
def testPrintAllExtensions(self): |
message = unittest_pb2.TestAllExtensions() |
test_util.SetAllExtensions(message) |
@@ -669,6 +788,7 @@ class Proto2Tests(TextFormatBase): |
text = ('message_set {\n' |
' [unknown_extension] {\n' |
' i: 23\n' |
+ ' bin: "\xe0"' |
' [nested_unknown_ext]: {\n' |
' i: 23\n' |
' test: "test_string"\n' |