| OLD | NEW |
| 1 #! /usr/bin/env python | 1 #! /usr/bin/env python |
| 2 # | 2 # |
| 3 # Protocol Buffers - Google's data interchange format | 3 # Protocol Buffers - Google's data interchange format |
| 4 # Copyright 2008 Google Inc. All rights reserved. | 4 # Copyright 2008 Google Inc. All rights reserved. |
| 5 # https://developers.google.com/protocol-buffers/ | 5 # https://developers.google.com/protocol-buffers/ |
| 6 # | 6 # |
| 7 # Redistribution and use in source and binary forms, with or without | 7 # Redistribution and use in source and binary forms, with or without |
| 8 # modification, are permitted provided that the following conditions are | 8 # modification, are permitted provided that the following conditions are |
| 9 # met: | 9 # met: |
| 10 # | 10 # |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 """Test for google.protobuf.text_format.""" | 33 """Test for google.protobuf.text_format.""" |
| 34 | 34 |
| 35 __author__ = 'kenton@google.com (Kenton Varda)' | 35 __author__ = 'kenton@google.com (Kenton Varda)' |
| 36 | 36 |
| 37 | 37 |
| 38 import re | 38 import re |
| 39 import six | 39 import six |
| 40 import string | 40 import string |
| 41 | 41 |
| 42 try: | 42 try: |
| 43 import unittest2 as unittest #PY26 | 43 import unittest2 as unittest # PY26, pylint: disable=g-import-not-at-top |
| 44 except ImportError: | 44 except ImportError: |
| 45 import unittest | 45 import unittest # pylint: disable=g-import-not-at-top |
| 46 | 46 |
| 47 from google.protobuf.internal import _parameterized | 47 from google.protobuf.internal import _parameterized |
| 48 | 48 |
| 49 from google.protobuf import any_test_pb2 |
| 49 from google.protobuf import map_unittest_pb2 | 50 from google.protobuf import map_unittest_pb2 |
| 50 from google.protobuf import unittest_mset_pb2 | 51 from google.protobuf import unittest_mset_pb2 |
| 51 from google.protobuf import unittest_pb2 | 52 from google.protobuf import unittest_pb2 |
| 52 from google.protobuf import unittest_proto3_arena_pb2 | 53 from google.protobuf import unittest_proto3_arena_pb2 |
| 53 from google.protobuf.internal import api_implementation | 54 from google.protobuf.internal import api_implementation |
| 54 from google.protobuf.internal import test_util | 55 from google.protobuf.internal import test_util |
| 55 from google.protobuf.internal import message_set_extensions_pb2 | 56 from google.protobuf.internal import message_set_extensions_pb2 |
| 57 from google.protobuf import descriptor_pool |
| 56 from google.protobuf import text_format | 58 from google.protobuf import text_format |
| 57 | 59 |
| 58 | 60 |
| 59 # Low-level nuts-n-bolts tests. | 61 # Low-level nuts-n-bolts tests. |
| 60 class SimpleTextFormatTests(unittest.TestCase): | 62 class SimpleTextFormatTests(unittest.TestCase): |
| 61 | 63 |
| 62 # The members of _QUOTES are formatted into a regexp template that | 64 # The members of _QUOTES are formatted into a regexp template that |
| 63 # expects single characters. Therefore it's an error (in addition to being | 65 # expects single characters. Therefore it's an error (in addition to being |
| 64 # non-sensical in the first place) to try to specify a "quote mark" that is | 66 # non-sensical in the first place) to try to specify a "quote mark" that is |
| 65 # more than one character. | 67 # more than one character. |
| (...skipping 17 matching lines...) Expand all Loading... |
| 83 def CompareToGoldenText(self, text, golden_text): | 85 def CompareToGoldenText(self, text, golden_text): |
| 84 self.assertEqual(text, golden_text) | 86 self.assertEqual(text, golden_text) |
| 85 | 87 |
| 86 def RemoveRedundantZeros(self, text): | 88 def RemoveRedundantZeros(self, text): |
| 87 # Some platforms print 1e+5 as 1e+005. This is fine, but we need to remove | 89 # Some platforms print 1e+5 as 1e+005. This is fine, but we need to remove |
| 88 # these zeros in order to match the golden file. | 90 # these zeros in order to match the golden file. |
| 89 text = text.replace('e+0','e+').replace('e+0','e+') \ | 91 text = text.replace('e+0','e+').replace('e+0','e+') \ |
| 90 .replace('e-0','e-').replace('e-0','e-') | 92 .replace('e-0','e-').replace('e-0','e-') |
| 91 # Floating point fields are printed with .0 suffix even if they are | 93 # Floating point fields are printed with .0 suffix even if they are |
| 92 # actualy integer numbers. | 94 # actualy integer numbers. |
| 93 text = re.compile('\.0$', re.MULTILINE).sub('', text) | 95 text = re.compile(r'\.0$', re.MULTILINE).sub('', text) |
| 94 return text | 96 return text |
| 95 | 97 |
| 96 | 98 |
| 97 @_parameterized.Parameters( | 99 @_parameterized.Parameters((unittest_pb2), (unittest_proto3_arena_pb2)) |
| 98 (unittest_pb2), | |
| 99 (unittest_proto3_arena_pb2)) | |
| 100 class TextFormatTest(TextFormatBase): | 100 class TextFormatTest(TextFormatBase): |
| 101 | 101 |
| 102 def testPrintExotic(self, message_module): | 102 def testPrintExotic(self, message_module): |
| 103 message = message_module.TestAllTypes() | 103 message = message_module.TestAllTypes() |
| 104 message.repeated_int64.append(-9223372036854775808) | 104 message.repeated_int64.append(-9223372036854775808) |
| 105 message.repeated_uint64.append(18446744073709551615) | 105 message.repeated_uint64.append(18446744073709551615) |
| 106 message.repeated_double.append(123.456) | 106 message.repeated_double.append(123.456) |
| 107 message.repeated_double.append(1.23e22) | 107 message.repeated_double.append(1.23e22) |
| 108 message.repeated_double.append(1.23e-18) | 108 message.repeated_double.append(1.23e-18) |
| 109 message.repeated_string.append('\000\001\a\b\f\n\r\t\v\\\'"') | 109 message.repeated_string.append('\000\001\a\b\f\n\r\t\v\\\'"') |
| 110 message.repeated_string.append(u'\u00fc\ua71f') | 110 message.repeated_string.append(u'\u00fc\ua71f') |
| 111 self.CompareToGoldenText( | 111 self.CompareToGoldenText( |
| 112 self.RemoveRedundantZeros(text_format.MessageToString(message)), | 112 self.RemoveRedundantZeros(text_format.MessageToString(message)), |
| 113 'repeated_int64: -9223372036854775808\n' | 113 'repeated_int64: -9223372036854775808\n' |
| 114 'repeated_uint64: 18446744073709551615\n' | 114 'repeated_uint64: 18446744073709551615\n' |
| 115 'repeated_double: 123.456\n' | 115 'repeated_double: 123.456\n' |
| 116 'repeated_double: 1.23e+22\n' | 116 'repeated_double: 1.23e+22\n' |
| 117 'repeated_double: 1.23e-18\n' | 117 'repeated_double: 1.23e-18\n' |
| 118 'repeated_string:' | 118 'repeated_string:' |
| 119 ' "\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\\'\\""\n' | 119 ' "\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\\'\\""\n' |
| 120 'repeated_string: "\\303\\274\\352\\234\\237"\n') | 120 'repeated_string: "\\303\\274\\352\\234\\237"\n') |
| 121 | 121 |
| 122 def testPrintExoticUnicodeSubclass(self, message_module): | 122 def testPrintExoticUnicodeSubclass(self, message_module): |
| 123 |
| 123 class UnicodeSub(six.text_type): | 124 class UnicodeSub(six.text_type): |
| 124 pass | 125 pass |
| 126 |
| 125 message = message_module.TestAllTypes() | 127 message = message_module.TestAllTypes() |
| 126 message.repeated_string.append(UnicodeSub(u'\u00fc\ua71f')) | 128 message.repeated_string.append(UnicodeSub(u'\u00fc\ua71f')) |
| 127 self.CompareToGoldenText( | 129 self.CompareToGoldenText( |
| 128 text_format.MessageToString(message), | 130 text_format.MessageToString(message), |
| 129 'repeated_string: "\\303\\274\\352\\234\\237"\n') | 131 'repeated_string: "\\303\\274\\352\\234\\237"\n') |
| 130 | 132 |
| 131 def testPrintNestedMessageAsOneLine(self, message_module): | 133 def testPrintNestedMessageAsOneLine(self, message_module): |
| 132 message = message_module.TestAllTypes() | 134 message = message_module.TestAllTypes() |
| 133 msg = message.repeated_nested_message.add() | 135 msg = message.repeated_nested_message.add() |
| 134 msg.bb = 42 | 136 msg.bb = 42 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 158 def testPrintExoticAsOneLine(self, message_module): | 160 def testPrintExoticAsOneLine(self, message_module): |
| 159 message = message_module.TestAllTypes() | 161 message = message_module.TestAllTypes() |
| 160 message.repeated_int64.append(-9223372036854775808) | 162 message.repeated_int64.append(-9223372036854775808) |
| 161 message.repeated_uint64.append(18446744073709551615) | 163 message.repeated_uint64.append(18446744073709551615) |
| 162 message.repeated_double.append(123.456) | 164 message.repeated_double.append(123.456) |
| 163 message.repeated_double.append(1.23e22) | 165 message.repeated_double.append(1.23e22) |
| 164 message.repeated_double.append(1.23e-18) | 166 message.repeated_double.append(1.23e-18) |
| 165 message.repeated_string.append('\000\001\a\b\f\n\r\t\v\\\'"') | 167 message.repeated_string.append('\000\001\a\b\f\n\r\t\v\\\'"') |
| 166 message.repeated_string.append(u'\u00fc\ua71f') | 168 message.repeated_string.append(u'\u00fc\ua71f') |
| 167 self.CompareToGoldenText( | 169 self.CompareToGoldenText( |
| 168 self.RemoveRedundantZeros( | 170 self.RemoveRedundantZeros(text_format.MessageToString( |
| 169 text_format.MessageToString(message, as_one_line=True)), | 171 message, as_one_line=True)), |
| 170 'repeated_int64: -9223372036854775808' | 172 'repeated_int64: -9223372036854775808' |
| 171 ' repeated_uint64: 18446744073709551615' | 173 ' repeated_uint64: 18446744073709551615' |
| 172 ' repeated_double: 123.456' | 174 ' repeated_double: 123.456' |
| 173 ' repeated_double: 1.23e+22' | 175 ' repeated_double: 1.23e+22' |
| 174 ' repeated_double: 1.23e-18' | 176 ' repeated_double: 1.23e-18' |
| 175 ' repeated_string: ' | 177 ' repeated_string: ' |
| 176 '"\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\\'\\""' | 178 '"\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\\'\\""' |
| 177 ' repeated_string: "\\303\\274\\352\\234\\237"') | 179 ' repeated_string: "\\303\\274\\352\\234\\237"') |
| 178 | 180 |
| 179 def testRoundTripExoticAsOneLine(self, message_module): | 181 def testRoundTripExoticAsOneLine(self, message_module): |
| 180 message = message_module.TestAllTypes() | 182 message = message_module.TestAllTypes() |
| 181 message.repeated_int64.append(-9223372036854775808) | 183 message.repeated_int64.append(-9223372036854775808) |
| 182 message.repeated_uint64.append(18446744073709551615) | 184 message.repeated_uint64.append(18446744073709551615) |
| 183 message.repeated_double.append(123.456) | 185 message.repeated_double.append(123.456) |
| 184 message.repeated_double.append(1.23e22) | 186 message.repeated_double.append(1.23e22) |
| 185 message.repeated_double.append(1.23e-18) | 187 message.repeated_double.append(1.23e-18) |
| 186 message.repeated_string.append('\000\001\a\b\f\n\r\t\v\\\'"') | 188 message.repeated_string.append('\000\001\a\b\f\n\r\t\v\\\'"') |
| 187 message.repeated_string.append(u'\u00fc\ua71f') | 189 message.repeated_string.append(u'\u00fc\ua71f') |
| 188 | 190 |
| 189 # Test as_utf8 = False. | 191 # Test as_utf8 = False. |
| 190 wire_text = text_format.MessageToString( | 192 wire_text = text_format.MessageToString(message, |
| 191 message, as_one_line=True, as_utf8=False) | 193 as_one_line=True, |
| 194 as_utf8=False) |
| 192 parsed_message = message_module.TestAllTypes() | 195 parsed_message = message_module.TestAllTypes() |
| 193 r = text_format.Parse(wire_text, parsed_message) | 196 r = text_format.Parse(wire_text, parsed_message) |
| 194 self.assertIs(r, parsed_message) | 197 self.assertIs(r, parsed_message) |
| 195 self.assertEqual(message, parsed_message) | 198 self.assertEqual(message, parsed_message) |
| 196 | 199 |
| 197 # Test as_utf8 = True. | 200 # Test as_utf8 = True. |
| 198 wire_text = text_format.MessageToString( | 201 wire_text = text_format.MessageToString(message, |
| 199 message, as_one_line=True, as_utf8=True) | 202 as_one_line=True, |
| 203 as_utf8=True) |
| 200 parsed_message = message_module.TestAllTypes() | 204 parsed_message = message_module.TestAllTypes() |
| 201 r = text_format.Parse(wire_text, parsed_message) | 205 r = text_format.Parse(wire_text, parsed_message) |
| 202 self.assertIs(r, parsed_message) | 206 self.assertIs(r, parsed_message) |
| 203 self.assertEqual(message, parsed_message, | 207 self.assertEqual(message, parsed_message, |
| 204 '\n%s != %s' % (message, parsed_message)) | 208 '\n%s != %s' % (message, parsed_message)) |
| 205 | 209 |
| 206 def testPrintRawUtf8String(self, message_module): | 210 def testPrintRawUtf8String(self, message_module): |
| 207 message = message_module.TestAllTypes() | 211 message = message_module.TestAllTypes() |
| 208 message.repeated_string.append(u'\u00fc\ua71f') | 212 message.repeated_string.append(u'\u00fc\ua71f') |
| 209 text = text_format.MessageToString(message, as_utf8=True) | 213 text = text_format.MessageToString(message, as_utf8=True) |
| 210 self.CompareToGoldenText(text, 'repeated_string: "\303\274\352\234\237"\n') | 214 self.CompareToGoldenText(text, 'repeated_string: "\303\274\352\234\237"\n') |
| 211 parsed_message = message_module.TestAllTypes() | 215 parsed_message = message_module.TestAllTypes() |
| 212 text_format.Parse(text, parsed_message) | 216 text_format.Parse(text, parsed_message) |
| 213 self.assertEqual(message, parsed_message, | 217 self.assertEqual(message, parsed_message, |
| 214 '\n%s != %s' % (message, parsed_message)) | 218 '\n%s != %s' % (message, parsed_message)) |
| 215 | 219 |
| 216 def testPrintFloatFormat(self, message_module): | 220 def testPrintFloatFormat(self, message_module): |
| 217 # Check that float_format argument is passed to sub-message formatting. | 221 # Check that float_format argument is passed to sub-message formatting. |
| 218 message = message_module.NestedTestAllTypes() | 222 message = message_module.NestedTestAllTypes() |
| 219 # We use 1.25 as it is a round number in binary. The proto 32-bit float | 223 # We use 1.25 as it is a round number in binary. The proto 32-bit float |
| 220 # will not gain additional imprecise digits as a 64-bit Python float and | 224 # will not gain additional imprecise digits as a 64-bit Python float and |
| 221 # show up in its str. 32-bit 1.2 is noisy when extended to 64-bit: | 225 # show up in its str. 32-bit 1.2 is noisy when extended to 64-bit: |
| 222 # >>> struct.unpack('f', struct.pack('f', 1.2))[0] | 226 # >>> struct.unpack('f', struct.pack('f', 1.2))[0] |
| 223 # 1.2000000476837158 | 227 # 1.2000000476837158 |
| 224 # >>> struct.unpack('f', struct.pack('f', 1.25))[0] | 228 # >>> struct.unpack('f', struct.pack('f', 1.25))[0] |
| 225 # 1.25 | 229 # 1.25 |
| 226 message.payload.optional_float = 1.25 | 230 message.payload.optional_float = 1.25 |
| 227 # Check rounding at 15 significant digits | 231 # Check rounding at 15 significant digits |
| 228 message.payload.optional_double = -.000003456789012345678 | 232 message.payload.optional_double = -.000003456789012345678 |
| 229 # Check no decimal point. | 233 # Check no decimal point. |
| 230 message.payload.repeated_float.append(-5642) | 234 message.payload.repeated_float.append(-5642) |
| 231 # Check no trailing zeros. | 235 # Check no trailing zeros. |
| 232 message.payload.repeated_double.append(.000078900) | 236 message.payload.repeated_double.append(.000078900) |
| 233 formatted_fields = ['optional_float: 1.25', | 237 formatted_fields = ['optional_float: 1.25', |
| 234 'optional_double: -3.45678901234568e-6', | 238 'optional_double: -3.45678901234568e-6', |
| 235 'repeated_float: -5642', | 239 'repeated_float: -5642', 'repeated_double: 7.89e-5'] |
| 236 'repeated_double: 7.89e-5'] | |
| 237 text_message = text_format.MessageToString(message, float_format='.15g') | 240 text_message = text_format.MessageToString(message, float_format='.15g') |
| 238 self.CompareToGoldenText( | 241 self.CompareToGoldenText( |
| 239 self.RemoveRedundantZeros(text_message), | 242 self.RemoveRedundantZeros(text_message), |
| 240 'payload {{\n {0}\n {1}\n {2}\n {3}\n}}\n'.format(*formatted_fields)
) | 243 'payload {{\n {0}\n {1}\n {2}\n {3}\n}}\n'.format( |
| 244 *formatted_fields)) |
| 241 # as_one_line=True is a separate code branch where float_format is passed. | 245 # as_one_line=True is a separate code branch where float_format is passed. |
| 242 text_message = text_format.MessageToString(message, as_one_line=True, | 246 text_message = text_format.MessageToString(message, |
| 247 as_one_line=True, |
| 243 float_format='.15g') | 248 float_format='.15g') |
| 244 self.CompareToGoldenText( | 249 self.CompareToGoldenText( |
| 245 self.RemoveRedundantZeros(text_message), | 250 self.RemoveRedundantZeros(text_message), |
| 246 'payload {{ {0} {1} {2} {3} }}'.format(*formatted_fields)) | 251 'payload {{ {0} {1} {2} {3} }}'.format(*formatted_fields)) |
| 247 | 252 |
| 248 def testMessageToString(self, message_module): | 253 def testMessageToString(self, message_module): |
| 249 message = message_module.ForeignMessage() | 254 message = message_module.ForeignMessage() |
| 250 message.c = 123 | 255 message.c = 123 |
| 251 self.assertEqual('c: 123\n', str(message)) | 256 self.assertEqual('c: 123\n', str(message)) |
| 252 | 257 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 'repeated_string: "\\303\\274\\352\\234\\237"\n' | 309 'repeated_string: "\\303\\274\\352\\234\\237"\n' |
| 305 'repeated_string: "\\xc3\\xbc"\n' | 310 'repeated_string: "\\xc3\\xbc"\n' |
| 306 'repeated_string: "\xc3\xbc"\n') | 311 'repeated_string: "\xc3\xbc"\n') |
| 307 text_format.Parse(text, message) | 312 text_format.Parse(text, message) |
| 308 | 313 |
| 309 self.assertEqual(-9223372036854775808, message.repeated_int64[0]) | 314 self.assertEqual(-9223372036854775808, message.repeated_int64[0]) |
| 310 self.assertEqual(18446744073709551615, message.repeated_uint64[0]) | 315 self.assertEqual(18446744073709551615, message.repeated_uint64[0]) |
| 311 self.assertEqual(123.456, message.repeated_double[0]) | 316 self.assertEqual(123.456, message.repeated_double[0]) |
| 312 self.assertEqual(1.23e22, message.repeated_double[1]) | 317 self.assertEqual(1.23e22, message.repeated_double[1]) |
| 313 self.assertEqual(1.23e-18, message.repeated_double[2]) | 318 self.assertEqual(1.23e-18, message.repeated_double[2]) |
| 314 self.assertEqual( | 319 self.assertEqual('\000\001\a\b\f\n\r\t\v\\\'"', message.repeated_string[0]) |
| 315 '\000\001\a\b\f\n\r\t\v\\\'"', message.repeated_string[0]) | |
| 316 self.assertEqual('foocorgegrault', message.repeated_string[1]) | 320 self.assertEqual('foocorgegrault', message.repeated_string[1]) |
| 317 self.assertEqual(u'\u00fc\ua71f', message.repeated_string[2]) | 321 self.assertEqual(u'\u00fc\ua71f', message.repeated_string[2]) |
| 318 self.assertEqual(u'\u00fc', message.repeated_string[3]) | 322 self.assertEqual(u'\u00fc', message.repeated_string[3]) |
| 319 | 323 |
| 320 def testParseTrailingCommas(self, message_module): | 324 def testParseTrailingCommas(self, message_module): |
| 321 message = message_module.TestAllTypes() | 325 message = message_module.TestAllTypes() |
| 322 text = ('repeated_int64: 100;\n' | 326 text = ('repeated_int64: 100;\n' |
| 323 'repeated_int64: 200;\n' | 327 'repeated_int64: 200;\n' |
| 324 'repeated_int64: 300,\n' | 328 'repeated_int64: 300,\n' |
| 325 'repeated_string: "one",\n' | 329 'repeated_string: "one",\n' |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 self.assertEqual(message_module.TestAllTypes(), message) | 368 self.assertEqual(message_module.TestAllTypes(), message) |
| 365 | 369 |
| 366 def testParseInvalidUtf8(self, message_module): | 370 def testParseInvalidUtf8(self, message_module): |
| 367 message = message_module.TestAllTypes() | 371 message = message_module.TestAllTypes() |
| 368 text = 'repeated_string: "\\xc3\\xc3"' | 372 text = 'repeated_string: "\\xc3\\xc3"' |
| 369 self.assertRaises(text_format.ParseError, text_format.Parse, text, message) | 373 self.assertRaises(text_format.ParseError, text_format.Parse, text, message) |
| 370 | 374 |
| 371 def testParseSingleWord(self, message_module): | 375 def testParseSingleWord(self, message_module): |
| 372 message = message_module.TestAllTypes() | 376 message = message_module.TestAllTypes() |
| 373 text = 'foo' | 377 text = 'foo' |
| 374 six.assertRaisesRegex(self, | 378 six.assertRaisesRegex(self, text_format.ParseError, ( |
| 375 text_format.ParseError, | 379 r'1:1 : Message type "\w+.TestAllTypes" has no field named ' |
| 376 (r'1:1 : Message type "\w+.TestAllTypes" has no field named ' | 380 r'"foo".'), text_format.Parse, text, message) |
| 377 r'"foo".'), | |
| 378 text_format.Parse, text, message) | |
| 379 | 381 |
| 380 def testParseUnknownField(self, message_module): | 382 def testParseUnknownField(self, message_module): |
| 381 message = message_module.TestAllTypes() | 383 message = message_module.TestAllTypes() |
| 382 text = 'unknown_field: 8\n' | 384 text = 'unknown_field: 8\n' |
| 383 six.assertRaisesRegex(self, | 385 six.assertRaisesRegex(self, text_format.ParseError, ( |
| 384 text_format.ParseError, | 386 r'1:1 : Message type "\w+.TestAllTypes" has no field named ' |
| 385 (r'1:1 : Message type "\w+.TestAllTypes" has no field named ' | 387 r'"unknown_field".'), text_format.Parse, text, message) |
| 386 r'"unknown_field".'), | |
| 387 text_format.Parse, text, message) | |
| 388 | 388 |
| 389 def testParseBadEnumValue(self, message_module): | 389 def testParseBadEnumValue(self, message_module): |
| 390 message = message_module.TestAllTypes() | 390 message = message_module.TestAllTypes() |
| 391 text = 'optional_nested_enum: BARR' | 391 text = 'optional_nested_enum: BARR' |
| 392 six.assertRaisesRegex(self, | 392 six.assertRaisesRegex(self, text_format.ParseError, |
| 393 text_format.ParseError, | 393 (r'1:23 : Enum type "\w+.TestAllTypes.NestedEnum" ' |
| 394 (r'1:23 : Enum type "\w+.TestAllTypes.NestedEnum" ' | 394 r'has no value named BARR.'), text_format.Parse, |
| 395 r'has no value named BARR.'), | 395 text, message) |
| 396 text_format.Parse, text, message) | |
| 397 | 396 |
| 398 message = message_module.TestAllTypes() | 397 message = message_module.TestAllTypes() |
| 399 text = 'optional_nested_enum: 100' | 398 text = 'optional_nested_enum: 100' |
| 400 six.assertRaisesRegex(self, | 399 six.assertRaisesRegex(self, text_format.ParseError, |
| 401 text_format.ParseError, | 400 (r'1:23 : Enum type "\w+.TestAllTypes.NestedEnum" ' |
| 402 (r'1:23 : Enum type "\w+.TestAllTypes.NestedEnum" ' | 401 r'has no value with number 100.'), text_format.Parse, |
| 403 r'has no value with number 100.'), | 402 text, message) |
| 404 text_format.Parse, text, message) | |
| 405 | 403 |
| 406 def testParseBadIntValue(self, message_module): | 404 def testParseBadIntValue(self, message_module): |
| 407 message = message_module.TestAllTypes() | 405 message = message_module.TestAllTypes() |
| 408 text = 'optional_int32: bork' | 406 text = 'optional_int32: bork' |
| 409 six.assertRaisesRegex(self, | 407 six.assertRaisesRegex(self, text_format.ParseError, |
| 410 text_format.ParseError, | 408 ('1:17 : Couldn\'t parse integer: bork'), |
| 411 ('1:17 : Couldn\'t parse integer: bork'), | 409 text_format.Parse, text, message) |
| 412 text_format.Parse, text, message) | |
| 413 | 410 |
| 414 def testParseStringFieldUnescape(self, message_module): | 411 def testParseStringFieldUnescape(self, message_module): |
| 415 message = message_module.TestAllTypes() | 412 message = message_module.TestAllTypes() |
| 416 text = r'''repeated_string: "\xf\x62" | 413 text = r'''repeated_string: "\xf\x62" |
| 417 repeated_string: "\\xf\\x62" | 414 repeated_string: "\\xf\\x62" |
| 418 repeated_string: "\\\xf\\\x62" | 415 repeated_string: "\\\xf\\\x62" |
| 419 repeated_string: "\\\\xf\\\\x62" | 416 repeated_string: "\\\\xf\\\\x62" |
| 420 repeated_string: "\\\\\xf\\\\\x62" | 417 repeated_string: "\\\\\xf\\\\\x62" |
| 421 repeated_string: "\x5cx20"''' | 418 repeated_string: "\x5cx20"''' |
| 419 |
| 422 text_format.Parse(text, message) | 420 text_format.Parse(text, message) |
| 423 | 421 |
| 424 SLASH = '\\' | 422 SLASH = '\\' |
| 425 self.assertEqual('\x0fb', message.repeated_string[0]) | 423 self.assertEqual('\x0fb', message.repeated_string[0]) |
| 426 self.assertEqual(SLASH + 'xf' + SLASH + 'x62', message.repeated_string[1]) | 424 self.assertEqual(SLASH + 'xf' + SLASH + 'x62', message.repeated_string[1]) |
| 427 self.assertEqual(SLASH + '\x0f' + SLASH + 'b', message.repeated_string[2]) | 425 self.assertEqual(SLASH + '\x0f' + SLASH + 'b', message.repeated_string[2]) |
| 428 self.assertEqual(SLASH + SLASH + 'xf' + SLASH + SLASH + 'x62', | 426 self.assertEqual(SLASH + SLASH + 'xf' + SLASH + SLASH + 'x62', |
| 429 message.repeated_string[3]) | 427 message.repeated_string[3]) |
| 430 self.assertEqual(SLASH + SLASH + '\x0f' + SLASH + SLASH + 'b', | 428 self.assertEqual(SLASH + SLASH + '\x0f' + SLASH + SLASH + 'b', |
| 431 message.repeated_string[4]) | 429 message.repeated_string[4]) |
| 432 self.assertEqual(SLASH + 'x20', message.repeated_string[5]) | 430 self.assertEqual(SLASH + 'x20', message.repeated_string[5]) |
| 433 | 431 |
| 434 def testMergeDuplicateScalars(self, message_module): | 432 def testMergeDuplicateScalars(self, message_module): |
| 435 message = message_module.TestAllTypes() | 433 message = message_module.TestAllTypes() |
| 436 text = ('optional_int32: 42 ' | 434 text = ('optional_int32: 42 ' 'optional_int32: 67') |
| 437 'optional_int32: 67') | |
| 438 r = text_format.Merge(text, message) | 435 r = text_format.Merge(text, message) |
| 439 self.assertIs(r, message) | 436 self.assertIs(r, message) |
| 440 self.assertEqual(67, message.optional_int32) | 437 self.assertEqual(67, message.optional_int32) |
| 441 | 438 |
| 442 def testMergeDuplicateNestedMessageScalars(self, message_module): | 439 def testMergeDuplicateNestedMessageScalars(self, message_module): |
| 443 message = message_module.TestAllTypes() | 440 message = message_module.TestAllTypes() |
| 444 text = ('optional_nested_message { bb: 1 } ' | 441 text = ('optional_nested_message { bb: 1 } ' |
| 445 'optional_nested_message { bb: 2 }') | 442 'optional_nested_message { bb: 2 }') |
| 446 r = text_format.Merge(text, message) | 443 r = text_format.Merge(text, message) |
| 447 self.assertTrue(r is message) | 444 self.assertTrue(r is message) |
| 448 self.assertEqual(2, message.optional_nested_message.bb) | 445 self.assertEqual(2, message.optional_nested_message.bb) |
| 449 | 446 |
| 450 def testParseOneof(self, message_module): | 447 def testParseOneof(self, message_module): |
| 451 m = message_module.TestAllTypes() | 448 m = message_module.TestAllTypes() |
| 452 m.oneof_uint32 = 11 | 449 m.oneof_uint32 = 11 |
| 453 m2 = message_module.TestAllTypes() | 450 m2 = message_module.TestAllTypes() |
| 454 text_format.Parse(text_format.MessageToString(m), m2) | 451 text_format.Parse(text_format.MessageToString(m), m2) |
| 455 self.assertEqual('oneof_uint32', m2.WhichOneof('oneof_field')) | 452 self.assertEqual('oneof_uint32', m2.WhichOneof('oneof_field')) |
| 456 | 453 |
| 457 def testParseMultipleOneof(self, message_module): | 454 def testParseMultipleOneof(self, message_module): |
| 458 m_string = '\n'.join([ | 455 m_string = '\n'.join(['oneof_uint32: 11', 'oneof_string: "foo"']) |
| 459 'oneof_uint32: 11', | |
| 460 'oneof_string: "foo"']) | |
| 461 m2 = message_module.TestAllTypes() | 456 m2 = message_module.TestAllTypes() |
| 462 if message_module is unittest_pb2: | 457 if message_module is unittest_pb2: |
| 463 with self.assertRaisesRegexp( | 458 with self.assertRaisesRegexp(text_format.ParseError, |
| 464 text_format.ParseError, ' is specified along with field '): | 459 ' is specified along with field '): |
| 465 text_format.Parse(m_string, m2) | 460 text_format.Parse(m_string, m2) |
| 466 else: | 461 else: |
| 467 text_format.Parse(m_string, m2) | 462 text_format.Parse(m_string, m2) |
| 468 self.assertEqual('oneof_string', m2.WhichOneof('oneof_field')) | 463 self.assertEqual('oneof_string', m2.WhichOneof('oneof_field')) |
| 469 | 464 |
| 470 | 465 |
| 471 # These are tests that aren't fundamentally specific to proto2, but are at | 466 # These are tests that aren't fundamentally specific to proto2, but are at |
| 472 # the moment because of differences between the proto2 and proto3 test schemas. | 467 # the moment because of differences between the proto2 and proto3 test schemas. |
| 473 # Ideally the schemas would be made more similar so these tests could pass. | 468 # Ideally the schemas would be made more similar so these tests could pass. |
| 474 class OnlyWorksWithProto2RightNowTests(TextFormatBase): | 469 class OnlyWorksWithProto2RightNowTests(TextFormatBase): |
| 475 | 470 |
| 476 def testPrintAllFieldsPointy(self): | 471 def testPrintAllFieldsPointy(self): |
| 477 message = unittest_pb2.TestAllTypes() | 472 message = unittest_pb2.TestAllTypes() |
| 478 test_util.SetAllFields(message) | 473 test_util.SetAllFields(message) |
| 479 self.CompareToGoldenFile( | 474 self.CompareToGoldenFile( |
| 480 self.RemoveRedundantZeros( | 475 self.RemoveRedundantZeros(text_format.MessageToString( |
| 481 text_format.MessageToString(message, pointy_brackets=True)), | 476 message, pointy_brackets=True)), |
| 482 'text_format_unittest_data_pointy_oneof.txt') | 477 'text_format_unittest_data_pointy_oneof.txt') |
| 483 | 478 |
| 484 def testParseGolden(self): | 479 def testParseGolden(self): |
| 485 golden_text = '\n'.join(self.ReadGolden( | 480 golden_text = '\n'.join(self.ReadGolden( |
| 486 'text_format_unittest_data_oneof_implemented.txt')) | 481 'text_format_unittest_data_oneof_implemented.txt')) |
| 487 parsed_message = unittest_pb2.TestAllTypes() | 482 parsed_message = unittest_pb2.TestAllTypes() |
| 488 r = text_format.Parse(golden_text, parsed_message) | 483 r = text_format.Parse(golden_text, parsed_message) |
| 489 self.assertIs(r, parsed_message) | 484 self.assertIs(r, parsed_message) |
| 490 | 485 |
| 491 message = unittest_pb2.TestAllTypes() | 486 message = unittest_pb2.TestAllTypes() |
| 492 test_util.SetAllFields(message) | 487 test_util.SetAllFields(message) |
| 493 self.assertEqual(message, parsed_message) | 488 self.assertEqual(message, parsed_message) |
| 494 | 489 |
| 495 def testPrintAllFields(self): | 490 def testPrintAllFields(self): |
| 496 message = unittest_pb2.TestAllTypes() | 491 message = unittest_pb2.TestAllTypes() |
| 497 test_util.SetAllFields(message) | 492 test_util.SetAllFields(message) |
| 498 self.CompareToGoldenFile( | 493 self.CompareToGoldenFile( |
| 499 self.RemoveRedundantZeros(text_format.MessageToString(message)), | 494 self.RemoveRedundantZeros(text_format.MessageToString(message)), |
| 500 'text_format_unittest_data_oneof_implemented.txt') | 495 'text_format_unittest_data_oneof_implemented.txt') |
| 501 | 496 |
| 502 def testPrintAllFieldsPointy(self): | |
| 503 message = unittest_pb2.TestAllTypes() | |
| 504 test_util.SetAllFields(message) | |
| 505 self.CompareToGoldenFile( | |
| 506 self.RemoveRedundantZeros( | |
| 507 text_format.MessageToString(message, pointy_brackets=True)), | |
| 508 'text_format_unittest_data_pointy_oneof.txt') | |
| 509 | |
| 510 def testPrintInIndexOrder(self): | 497 def testPrintInIndexOrder(self): |
| 511 message = unittest_pb2.TestFieldOrderings() | 498 message = unittest_pb2.TestFieldOrderings() |
| 512 message.my_string = '115' | 499 message.my_string = '115' |
| 513 message.my_int = 101 | 500 message.my_int = 101 |
| 514 message.my_float = 111 | 501 message.my_float = 111 |
| 515 message.optional_nested_message.oo = 0 | 502 message.optional_nested_message.oo = 0 |
| 516 message.optional_nested_message.bb = 1 | 503 message.optional_nested_message.bb = 1 |
| 517 self.CompareToGoldenText( | 504 self.CompareToGoldenText( |
| 518 self.RemoveRedundantZeros(text_format.MessageToString( | 505 self.RemoveRedundantZeros(text_format.MessageToString( |
| 519 message, use_index_order=True)), | 506 message, use_index_order=True)), |
| 520 'my_string: \"115\"\nmy_int: 101\nmy_float: 111\n' | 507 'my_string: \"115\"\nmy_int: 101\nmy_float: 111\n' |
| 521 'optional_nested_message {\n oo: 0\n bb: 1\n}\n') | 508 'optional_nested_message {\n oo: 0\n bb: 1\n}\n') |
| 522 self.CompareToGoldenText( | 509 self.CompareToGoldenText( |
| 523 self.RemoveRedundantZeros(text_format.MessageToString( | 510 self.RemoveRedundantZeros(text_format.MessageToString(message)), |
| 524 message)), | |
| 525 'my_int: 101\nmy_string: \"115\"\nmy_float: 111\n' | 511 'my_int: 101\nmy_string: \"115\"\nmy_float: 111\n' |
| 526 'optional_nested_message {\n bb: 1\n oo: 0\n}\n') | 512 'optional_nested_message {\n bb: 1\n oo: 0\n}\n') |
| 527 | 513 |
| 528 def testMergeLinesGolden(self): | 514 def testMergeLinesGolden(self): |
| 529 opened = self.ReadGolden('text_format_unittest_data_oneof_implemented.txt') | 515 opened = self.ReadGolden('text_format_unittest_data_oneof_implemented.txt') |
| 530 parsed_message = unittest_pb2.TestAllTypes() | 516 parsed_message = unittest_pb2.TestAllTypes() |
| 531 r = text_format.MergeLines(opened, parsed_message) | 517 r = text_format.MergeLines(opened, parsed_message) |
| 532 self.assertIs(r, parsed_message) | 518 self.assertIs(r, parsed_message) |
| 533 | 519 |
| 534 message = unittest_pb2.TestAllTypes() | 520 message = unittest_pb2.TestAllTypes() |
| (...skipping 10 matching lines...) Expand all Loading... |
| 545 test_util.SetAllFields(message) | 531 test_util.SetAllFields(message) |
| 546 self.assertEqual(message, parsed_message) | 532 self.assertEqual(message, parsed_message) |
| 547 | 533 |
| 548 def testPrintMap(self): | 534 def testPrintMap(self): |
| 549 message = map_unittest_pb2.TestMap() | 535 message = map_unittest_pb2.TestMap() |
| 550 | 536 |
| 551 message.map_int32_int32[-123] = -456 | 537 message.map_int32_int32[-123] = -456 |
| 552 message.map_int64_int64[-2**33] = -2**34 | 538 message.map_int64_int64[-2**33] = -2**34 |
| 553 message.map_uint32_uint32[123] = 456 | 539 message.map_uint32_uint32[123] = 456 |
| 554 message.map_uint64_uint64[2**33] = 2**34 | 540 message.map_uint64_uint64[2**33] = 2**34 |
| 555 message.map_string_string["abc"] = "123" | 541 message.map_string_string['abc'] = '123' |
| 556 message.map_int32_foreign_message[111].c = 5 | 542 message.map_int32_foreign_message[111].c = 5 |
| 557 | 543 |
| 558 # Maps are serialized to text format using their underlying repeated | 544 # Maps are serialized to text format using their underlying repeated |
| 559 # representation. | 545 # representation. |
| 560 self.CompareToGoldenText( | 546 self.CompareToGoldenText( |
| 561 text_format.MessageToString(message), | 547 text_format.MessageToString(message), 'map_int32_int32 {\n' |
| 562 'map_int32_int32 {\n' | |
| 563 ' key: -123\n' | 548 ' key: -123\n' |
| 564 ' value: -456\n' | 549 ' value: -456\n' |
| 565 '}\n' | 550 '}\n' |
| 566 'map_int64_int64 {\n' | 551 'map_int64_int64 {\n' |
| 567 ' key: -8589934592\n' | 552 ' key: -8589934592\n' |
| 568 ' value: -17179869184\n' | 553 ' value: -17179869184\n' |
| 569 '}\n' | 554 '}\n' |
| 570 'map_uint32_uint32 {\n' | 555 'map_uint32_uint32 {\n' |
| 571 ' key: 123\n' | 556 ' key: 123\n' |
| 572 ' value: 456\n' | 557 ' value: 456\n' |
| (...skipping 12 matching lines...) Expand all Loading... |
| 585 ' c: 5\n' | 570 ' c: 5\n' |
| 586 ' }\n' | 571 ' }\n' |
| 587 '}\n') | 572 '}\n') |
| 588 | 573 |
| 589 def testMapOrderEnforcement(self): | 574 def testMapOrderEnforcement(self): |
| 590 message = map_unittest_pb2.TestMap() | 575 message = map_unittest_pb2.TestMap() |
| 591 for letter in string.ascii_uppercase[13:26]: | 576 for letter in string.ascii_uppercase[13:26]: |
| 592 message.map_string_string[letter] = 'dummy' | 577 message.map_string_string[letter] = 'dummy' |
| 593 for letter in reversed(string.ascii_uppercase[0:13]): | 578 for letter in reversed(string.ascii_uppercase[0:13]): |
| 594 message.map_string_string[letter] = 'dummy' | 579 message.map_string_string[letter] = 'dummy' |
| 595 golden = ''.join(( | 580 golden = ''.join(('map_string_string {\n key: "%c"\n value: "dummy"\n}\n' |
| 596 'map_string_string {\n key: "%c"\n value: "dummy"\n}\n' % (letter,) | 581 % (letter,) for letter in string.ascii_uppercase)) |
| 597 for letter in string.ascii_uppercase)) | |
| 598 self.CompareToGoldenText(text_format.MessageToString(message), golden) | 582 self.CompareToGoldenText(text_format.MessageToString(message), golden) |
| 599 | 583 |
| 600 def testMapOrderSemantics(self): | 584 def testMapOrderSemantics(self): |
| 601 golden_lines = self.ReadGolden('map_test_data.txt') | 585 golden_lines = self.ReadGolden('map_test_data.txt') |
| 602 # The C++ implementation emits defaulted-value fields, while the Python | 586 # The C++ implementation emits defaulted-value fields, while the Python |
| 603 # implementation does not. Adjusting for this is awkward, but it is | 587 # implementation does not. Adjusting for this is awkward, but it is |
| 604 # valuable to test against a common golden file. | 588 # valuable to test against a common golden file. |
| 605 line_blacklist = (' key: 0\n', | 589 line_blacklist = (' key: 0\n', ' value: 0\n', ' key: false\n', |
| 606 ' value: 0\n', | |
| 607 ' key: false\n', | |
| 608 ' value: false\n') | 590 ' value: false\n') |
| 609 golden_lines = [line for line in golden_lines if line not in line_blacklist] | 591 golden_lines = [line for line in golden_lines if line not in line_blacklist] |
| 610 | 592 |
| 611 message = map_unittest_pb2.TestMap() | 593 message = map_unittest_pb2.TestMap() |
| 612 text_format.ParseLines(golden_lines, message) | 594 text_format.ParseLines(golden_lines, message) |
| 613 candidate = text_format.MessageToString(message) | 595 candidate = text_format.MessageToString(message) |
| 614 # The Python implementation emits "1.0" for the double value that the C++ | 596 # The Python implementation emits "1.0" for the double value that the C++ |
| 615 # implementation emits as "1". | 597 # implementation emits as "1". |
| 616 candidate = candidate.replace('1.0', '1', 2) | 598 candidate = candidate.replace('1.0', '1', 2) |
| 617 self.assertMultiLineEqual(candidate, ''.join(golden_lines)) | 599 self.assertMultiLineEqual(candidate, ''.join(golden_lines)) |
| 618 | 600 |
| 619 | 601 |
| 620 # Tests of proto2-only features (MessageSet, extensions, etc.). | 602 # Tests of proto2-only features (MessageSet, extensions, etc.). |
| 621 class Proto2Tests(TextFormatBase): | 603 class Proto2Tests(TextFormatBase): |
| 622 | 604 |
| 623 def testPrintMessageSet(self): | 605 def testPrintMessageSet(self): |
| 624 message = unittest_mset_pb2.TestMessageSetContainer() | 606 message = unittest_mset_pb2.TestMessageSetContainer() |
| 625 ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension | 607 ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension |
| 626 ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension | 608 ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension |
| 627 message.message_set.Extensions[ext1].i = 23 | 609 message.message_set.Extensions[ext1].i = 23 |
| 628 message.message_set.Extensions[ext2].str = 'foo' | 610 message.message_set.Extensions[ext2].str = 'foo' |
| 629 self.CompareToGoldenText( | 611 self.CompareToGoldenText( |
| 630 text_format.MessageToString(message), | 612 text_format.MessageToString(message), 'message_set {\n' |
| 631 'message_set {\n' | |
| 632 ' [protobuf_unittest.TestMessageSetExtension1] {\n' | 613 ' [protobuf_unittest.TestMessageSetExtension1] {\n' |
| 633 ' i: 23\n' | 614 ' i: 23\n' |
| 634 ' }\n' | 615 ' }\n' |
| 635 ' [protobuf_unittest.TestMessageSetExtension2] {\n' | 616 ' [protobuf_unittest.TestMessageSetExtension2] {\n' |
| 636 ' str: \"foo\"\n' | 617 ' str: \"foo\"\n' |
| 637 ' }\n' | 618 ' }\n' |
| 638 '}\n') | 619 '}\n') |
| 639 | 620 |
| 640 message = message_set_extensions_pb2.TestMessageSet() | 621 message = message_set_extensions_pb2.TestMessageSet() |
| 641 ext = message_set_extensions_pb2.message_set_extension3 | 622 ext = message_set_extensions_pb2.message_set_extension3 |
| 642 message.Extensions[ext].text = 'bar' | 623 message.Extensions[ext].text = 'bar' |
| 643 self.CompareToGoldenText( | 624 self.CompareToGoldenText( |
| 644 text_format.MessageToString(message), | 625 text_format.MessageToString(message), |
| 645 '[google.protobuf.internal.TestMessageSetExtension3] {\n' | 626 '[google.protobuf.internal.TestMessageSetExtension3] {\n' |
| 646 ' text: \"bar\"\n' | 627 ' text: \"bar\"\n' |
| 647 '}\n') | 628 '}\n') |
| 648 | 629 |
| 649 def testPrintMessageSetByFieldNumber(self): | 630 def testPrintMessageSetByFieldNumber(self): |
| 650 out = text_format.TextWriter(False) | 631 out = text_format.TextWriter(False) |
| 651 message = unittest_mset_pb2.TestMessageSetContainer() | 632 message = unittest_mset_pb2.TestMessageSetContainer() |
| 652 ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension | 633 ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension |
| 653 ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension | 634 ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension |
| 654 message.message_set.Extensions[ext1].i = 23 | 635 message.message_set.Extensions[ext1].i = 23 |
| 655 message.message_set.Extensions[ext2].str = 'foo' | 636 message.message_set.Extensions[ext2].str = 'foo' |
| 656 text_format.PrintMessage(message, out, use_field_number=True) | 637 text_format.PrintMessage(message, out, use_field_number=True) |
| 657 self.CompareToGoldenText( | 638 self.CompareToGoldenText(out.getvalue(), '1 {\n' |
| 658 out.getvalue(), | 639 ' 1545008 {\n' |
| 659 '1 {\n' | 640 ' 15: 23\n' |
| 660 ' 1545008 {\n' | 641 ' }\n' |
| 661 ' 15: 23\n' | 642 ' 1547769 {\n' |
| 662 ' }\n' | 643 ' 25: \"foo\"\n' |
| 663 ' 1547769 {\n' | 644 ' }\n' |
| 664 ' 25: \"foo\"\n' | 645 '}\n') |
| 665 ' }\n' | |
| 666 '}\n') | |
| 667 out.close() | 646 out.close() |
| 668 | 647 |
| 669 def testPrintMessageSetAsOneLine(self): | 648 def testPrintMessageSetAsOneLine(self): |
| 670 message = unittest_mset_pb2.TestMessageSetContainer() | 649 message = unittest_mset_pb2.TestMessageSetContainer() |
| 671 ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension | 650 ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension |
| 672 ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension | 651 ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension |
| 673 message.message_set.Extensions[ext1].i = 23 | 652 message.message_set.Extensions[ext1].i = 23 |
| 674 message.message_set.Extensions[ext2].str = 'foo' | 653 message.message_set.Extensions[ext2].str = 'foo' |
| 675 self.CompareToGoldenText( | 654 self.CompareToGoldenText( |
| 676 text_format.MessageToString(message, as_one_line=True), | 655 text_format.MessageToString(message, as_one_line=True), |
| 677 'message_set {' | 656 'message_set {' |
| 678 ' [protobuf_unittest.TestMessageSetExtension1] {' | 657 ' [protobuf_unittest.TestMessageSetExtension1] {' |
| 679 ' i: 23' | 658 ' i: 23' |
| 680 ' }' | 659 ' }' |
| 681 ' [protobuf_unittest.TestMessageSetExtension2] {' | 660 ' [protobuf_unittest.TestMessageSetExtension2] {' |
| 682 ' str: \"foo\"' | 661 ' str: \"foo\"' |
| 683 ' }' | 662 ' }' |
| 684 ' }') | 663 ' }') |
| 685 | 664 |
| 686 def testParseMessageSet(self): | 665 def testParseMessageSet(self): |
| 687 message = unittest_pb2.TestAllTypes() | 666 message = unittest_pb2.TestAllTypes() |
| 688 text = ('repeated_uint64: 1\n' | 667 text = ('repeated_uint64: 1\n' 'repeated_uint64: 2\n') |
| 689 'repeated_uint64: 2\n') | |
| 690 text_format.Parse(text, message) | 668 text_format.Parse(text, message) |
| 691 self.assertEqual(1, message.repeated_uint64[0]) | 669 self.assertEqual(1, message.repeated_uint64[0]) |
| 692 self.assertEqual(2, message.repeated_uint64[1]) | 670 self.assertEqual(2, message.repeated_uint64[1]) |
| 693 | 671 |
| 694 message = unittest_mset_pb2.TestMessageSetContainer() | 672 message = unittest_mset_pb2.TestMessageSetContainer() |
| 695 text = ('message_set {\n' | 673 text = ('message_set {\n' |
| 696 ' [protobuf_unittest.TestMessageSetExtension1] {\n' | 674 ' [protobuf_unittest.TestMessageSetExtension1] {\n' |
| 697 ' i: 23\n' | 675 ' i: 23\n' |
| 698 ' }\n' | 676 ' }\n' |
| 699 ' [protobuf_unittest.TestMessageSetExtension2] {\n' | 677 ' [protobuf_unittest.TestMessageSetExtension2] {\n' |
| 700 ' str: \"foo\"\n' | 678 ' str: \"foo\"\n' |
| 701 ' }\n' | 679 ' }\n' |
| 702 '}\n') | 680 '}\n') |
| 703 text_format.Parse(text, message) | 681 text_format.Parse(text, message) |
| 704 ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension | 682 ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension |
| 705 ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension | 683 ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension |
| 706 self.assertEqual(23, message.message_set.Extensions[ext1].i) | 684 self.assertEqual(23, message.message_set.Extensions[ext1].i) |
| 707 self.assertEqual('foo', message.message_set.Extensions[ext2].str) | 685 self.assertEqual('foo', message.message_set.Extensions[ext2].str) |
| 708 | 686 |
| 709 def testParseMessageByFieldNumber(self): | 687 def testParseMessageByFieldNumber(self): |
| 710 message = unittest_pb2.TestAllTypes() | 688 message = unittest_pb2.TestAllTypes() |
| 711 text = ('34: 1\n' | 689 text = ('34: 1\n' 'repeated_uint64: 2\n') |
| 712 'repeated_uint64: 2\n') | |
| 713 text_format.Parse(text, message, allow_field_number=True) | 690 text_format.Parse(text, message, allow_field_number=True) |
| 714 self.assertEqual(1, message.repeated_uint64[0]) | 691 self.assertEqual(1, message.repeated_uint64[0]) |
| 715 self.assertEqual(2, message.repeated_uint64[1]) | 692 self.assertEqual(2, message.repeated_uint64[1]) |
| 716 | 693 |
| 717 message = unittest_mset_pb2.TestMessageSetContainer() | 694 message = unittest_mset_pb2.TestMessageSetContainer() |
| 718 text = ('1 {\n' | 695 text = ('1 {\n' |
| 719 ' 1545008 {\n' | 696 ' 1545008 {\n' |
| 720 ' 15: 23\n' | 697 ' 15: 23\n' |
| 721 ' }\n' | 698 ' }\n' |
| 722 ' 1547769 {\n' | 699 ' 1547769 {\n' |
| 723 ' 25: \"foo\"\n' | 700 ' 25: \"foo\"\n' |
| 724 ' }\n' | 701 ' }\n' |
| 725 '}\n') | 702 '}\n') |
| 726 text_format.Parse(text, message, allow_field_number=True) | 703 text_format.Parse(text, message, allow_field_number=True) |
| 727 ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension | 704 ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension |
| 728 ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension | 705 ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension |
| 729 self.assertEqual(23, message.message_set.Extensions[ext1].i) | 706 self.assertEqual(23, message.message_set.Extensions[ext1].i) |
| 730 self.assertEqual('foo', message.message_set.Extensions[ext2].str) | 707 self.assertEqual('foo', message.message_set.Extensions[ext2].str) |
| 731 | 708 |
| 732 # Can't parse field number without set allow_field_number=True. | 709 # Can't parse field number without set allow_field_number=True. |
| 733 message = unittest_pb2.TestAllTypes() | 710 message = unittest_pb2.TestAllTypes() |
| 734 text = '34:1\n' | 711 text = '34:1\n' |
| 735 six.assertRaisesRegex( | 712 six.assertRaisesRegex(self, text_format.ParseError, ( |
| 736 self, | 713 r'1:1 : Message type "\w+.TestAllTypes" has no field named ' |
| 737 text_format.ParseError, | 714 r'"34".'), text_format.Parse, text, message) |
| 738 (r'1:1 : Message type "\w+.TestAllTypes" has no field named ' | |
| 739 r'"34".'), | |
| 740 text_format.Parse, text, message) | |
| 741 | 715 |
| 742 # Can't parse if field number is not found. | 716 # Can't parse if field number is not found. |
| 743 text = '1234:1\n' | 717 text = '1234:1\n' |
| 744 six.assertRaisesRegex( | 718 six.assertRaisesRegex( |
| 745 self, | 719 self, |
| 746 text_format.ParseError, | 720 text_format.ParseError, |
| 747 (r'1:1 : Message type "\w+.TestAllTypes" has no field named ' | 721 (r'1:1 : Message type "\w+.TestAllTypes" has no field named ' |
| 748 r'"1234".'), | 722 r'"1234".'), |
| 749 text_format.Parse, text, message, allow_field_number=True) | 723 text_format.Parse, |
| 724 text, |
| 725 message, |
| 726 allow_field_number=True) |
| 750 | 727 |
| 751 def testPrintAllExtensions(self): | 728 def testPrintAllExtensions(self): |
| 752 message = unittest_pb2.TestAllExtensions() | 729 message = unittest_pb2.TestAllExtensions() |
| 753 test_util.SetAllExtensions(message) | 730 test_util.SetAllExtensions(message) |
| 754 self.CompareToGoldenFile( | 731 self.CompareToGoldenFile( |
| 755 self.RemoveRedundantZeros(text_format.MessageToString(message)), | 732 self.RemoveRedundantZeros(text_format.MessageToString(message)), |
| 756 'text_format_unittest_extensions_data.txt') | 733 'text_format_unittest_extensions_data.txt') |
| 757 | 734 |
| 758 def testPrintAllExtensionsPointy(self): | 735 def testPrintAllExtensionsPointy(self): |
| 759 message = unittest_pb2.TestAllExtensions() | 736 message = unittest_pb2.TestAllExtensions() |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 817 # Catch parse errors in unknown extension. | 794 # Catch parse errors in unknown extension. |
| 818 message = unittest_mset_pb2.TestMessageSetContainer() | 795 message = unittest_mset_pb2.TestMessageSetContainer() |
| 819 malformed = ('message_set {\n' | 796 malformed = ('message_set {\n' |
| 820 ' [unknown_extension] {\n' | 797 ' [unknown_extension] {\n' |
| 821 ' i:\n' # Missing value. | 798 ' i:\n' # Missing value. |
| 822 ' }\n' | 799 ' }\n' |
| 823 '}\n') | 800 '}\n') |
| 824 six.assertRaisesRegex(self, | 801 six.assertRaisesRegex(self, |
| 825 text_format.ParseError, | 802 text_format.ParseError, |
| 826 'Invalid field value: }', | 803 'Invalid field value: }', |
| 827 text_format.Parse, malformed, message, | 804 text_format.Parse, |
| 805 malformed, |
| 806 message, |
| 828 allow_unknown_extension=True) | 807 allow_unknown_extension=True) |
| 829 | 808 |
| 830 message = unittest_mset_pb2.TestMessageSetContainer() | 809 message = unittest_mset_pb2.TestMessageSetContainer() |
| 831 malformed = ('message_set {\n' | 810 malformed = ('message_set {\n' |
| 832 ' [unknown_extension] {\n' | 811 ' [unknown_extension] {\n' |
| 833 ' str: "malformed string\n' # Missing closing quote. | 812 ' str: "malformed string\n' # Missing closing quote. |
| 834 ' }\n' | 813 ' }\n' |
| 835 '}\n') | 814 '}\n') |
| 836 six.assertRaisesRegex(self, | 815 six.assertRaisesRegex(self, |
| 837 text_format.ParseError, | 816 text_format.ParseError, |
| 838 'Invalid field value: "', | 817 'Invalid field value: "', |
| 839 text_format.Parse, malformed, message, | 818 text_format.Parse, |
| 819 malformed, |
| 820 message, |
| 840 allow_unknown_extension=True) | 821 allow_unknown_extension=True) |
| 841 | 822 |
| 842 message = unittest_mset_pb2.TestMessageSetContainer() | 823 message = unittest_mset_pb2.TestMessageSetContainer() |
| 843 malformed = ('message_set {\n' | 824 malformed = ('message_set {\n' |
| 844 ' [unknown_extension] {\n' | 825 ' [unknown_extension] {\n' |
| 845 ' str: "malformed\n multiline\n string\n' | 826 ' str: "malformed\n multiline\n string\n' |
| 846 ' }\n' | 827 ' }\n' |
| 847 '}\n') | 828 '}\n') |
| 848 six.assertRaisesRegex(self, | 829 six.assertRaisesRegex(self, |
| 849 text_format.ParseError, | 830 text_format.ParseError, |
| 850 'Invalid field value: "', | 831 'Invalid field value: "', |
| 851 text_format.Parse, malformed, message, | 832 text_format.Parse, |
| 833 malformed, |
| 834 message, |
| 852 allow_unknown_extension=True) | 835 allow_unknown_extension=True) |
| 853 | 836 |
| 854 message = unittest_mset_pb2.TestMessageSetContainer() | 837 message = unittest_mset_pb2.TestMessageSetContainer() |
| 855 malformed = ('message_set {\n' | 838 malformed = ('message_set {\n' |
| 856 ' [malformed_extension] <\n' | 839 ' [malformed_extension] <\n' |
| 857 ' i: -5\n' | 840 ' i: -5\n' |
| 858 ' \n' # Missing '>' here. | 841 ' \n' # Missing '>' here. |
| 859 '}\n') | 842 '}\n') |
| 860 six.assertRaisesRegex(self, | 843 six.assertRaisesRegex(self, |
| 861 text_format.ParseError, | 844 text_format.ParseError, |
| 862 '5:1 : Expected ">".', | 845 '5:1 : Expected ">".', |
| 863 text_format.Parse, malformed, message, | 846 text_format.Parse, |
| 847 malformed, |
| 848 message, |
| 864 allow_unknown_extension=True) | 849 allow_unknown_extension=True) |
| 865 | 850 |
| 866 # Don't allow unknown fields with allow_unknown_extension=True. | 851 # Don't allow unknown fields with allow_unknown_extension=True. |
| 867 message = unittest_mset_pb2.TestMessageSetContainer() | 852 message = unittest_mset_pb2.TestMessageSetContainer() |
| 868 malformed = ('message_set {\n' | 853 malformed = ('message_set {\n' |
| 869 ' unknown_field: true\n' | 854 ' unknown_field: true\n' |
| 870 ' \n' # Missing '>' here. | 855 ' \n' # Missing '>' here. |
| 871 '}\n') | 856 '}\n') |
| 872 six.assertRaisesRegex(self, | 857 six.assertRaisesRegex(self, |
| 873 text_format.ParseError, | 858 text_format.ParseError, |
| 874 ('2:3 : Message type ' | 859 ('2:3 : Message type ' |
| 875 '"proto2_wireformat_unittest.TestMessageSet" has no' | 860 '"proto2_wireformat_unittest.TestMessageSet" has no' |
| 876 ' field named "unknown_field".'), | 861 ' field named "unknown_field".'), |
| 877 text_format.Parse, malformed, message, | 862 text_format.Parse, |
| 863 malformed, |
| 864 message, |
| 878 allow_unknown_extension=True) | 865 allow_unknown_extension=True) |
| 879 | 866 |
| 880 # Parse known extension correcty. | 867 # Parse known extension correcty. |
| 881 message = unittest_mset_pb2.TestMessageSetContainer() | 868 message = unittest_mset_pb2.TestMessageSetContainer() |
| 882 text = ('message_set {\n' | 869 text = ('message_set {\n' |
| 883 ' [protobuf_unittest.TestMessageSetExtension1] {\n' | 870 ' [protobuf_unittest.TestMessageSetExtension1] {\n' |
| 884 ' i: 23\n' | 871 ' i: 23\n' |
| 885 ' }\n' | 872 ' }\n' |
| 886 ' [protobuf_unittest.TestMessageSetExtension2] {\n' | 873 ' [protobuf_unittest.TestMessageSetExtension2] {\n' |
| 887 ' str: \"foo\"\n' | 874 ' str: \"foo\"\n' |
| 888 ' }\n' | 875 ' }\n' |
| 889 '}\n') | 876 '}\n') |
| 890 text_format.Parse(text, message, allow_unknown_extension=True) | 877 text_format.Parse(text, message, allow_unknown_extension=True) |
| 891 ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension | 878 ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension |
| 892 ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension | 879 ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension |
| 893 self.assertEqual(23, message.message_set.Extensions[ext1].i) | 880 self.assertEqual(23, message.message_set.Extensions[ext1].i) |
| 894 self.assertEqual('foo', message.message_set.Extensions[ext2].str) | 881 self.assertEqual('foo', message.message_set.Extensions[ext2].str) |
| 895 | 882 |
| 896 def testParseBadExtension(self): | 883 def testParseBadExtension(self): |
| 897 message = unittest_pb2.TestAllExtensions() | 884 message = unittest_pb2.TestAllExtensions() |
| 898 text = '[unknown_extension]: 8\n' | 885 text = '[unknown_extension]: 8\n' |
| 899 six.assertRaisesRegex(self, | 886 six.assertRaisesRegex(self, text_format.ParseError, |
| 900 text_format.ParseError, | 887 '1:2 : Extension "unknown_extension" not registered.', |
| 901 '1:2 : Extension "unknown_extension" not registered.', | 888 text_format.Parse, text, message) |
| 902 text_format.Parse, text, message) | |
| 903 message = unittest_pb2.TestAllTypes() | 889 message = unittest_pb2.TestAllTypes() |
| 904 six.assertRaisesRegex(self, | 890 six.assertRaisesRegex(self, text_format.ParseError, ( |
| 905 text_format.ParseError, | 891 '1:2 : Message type "protobuf_unittest.TestAllTypes" does not have ' |
| 906 ('1:2 : Message type "protobuf_unittest.TestAllTypes" does not have ' | 892 'extensions.'), text_format.Parse, text, message) |
| 907 'extensions.'), | |
| 908 text_format.Parse, text, message) | |
| 909 | 893 |
| 910 def testMergeDuplicateExtensionScalars(self): | 894 def testMergeDuplicateExtensionScalars(self): |
| 911 message = unittest_pb2.TestAllExtensions() | 895 message = unittest_pb2.TestAllExtensions() |
| 912 text = ('[protobuf_unittest.optional_int32_extension]: 42 ' | 896 text = ('[protobuf_unittest.optional_int32_extension]: 42 ' |
| 913 '[protobuf_unittest.optional_int32_extension]: 67') | 897 '[protobuf_unittest.optional_int32_extension]: 67') |
| 914 text_format.Merge(text, message) | 898 text_format.Merge(text, message) |
| 915 self.assertEqual( | 899 self.assertEqual(67, |
| 916 67, | 900 message.Extensions[unittest_pb2.optional_int32_extension]) |
| 917 message.Extensions[unittest_pb2.optional_int32_extension]) | |
| 918 | 901 |
| 919 def testParseDuplicateExtensionScalars(self): | 902 def testParseDuplicateExtensionScalars(self): |
| 920 message = unittest_pb2.TestAllExtensions() | 903 message = unittest_pb2.TestAllExtensions() |
| 921 text = ('[protobuf_unittest.optional_int32_extension]: 42 ' | 904 text = ('[protobuf_unittest.optional_int32_extension]: 42 ' |
| 922 '[protobuf_unittest.optional_int32_extension]: 67') | 905 '[protobuf_unittest.optional_int32_extension]: 67') |
| 923 six.assertRaisesRegex(self, | 906 six.assertRaisesRegex(self, text_format.ParseError, ( |
| 924 text_format.ParseError, | 907 '1:96 : Message type "protobuf_unittest.TestAllExtensions" ' |
| 925 ('1:96 : Message type "protobuf_unittest.TestAllExtensions" ' | 908 'should not have multiple ' |
| 926 'should not have multiple ' | 909 '"protobuf_unittest.optional_int32_extension" extensions.'), |
| 927 '"protobuf_unittest.optional_int32_extension" extensions.'), | 910 text_format.Parse, text, message) |
| 928 text_format.Parse, text, message) | |
| 929 | 911 |
| 930 def testParseDuplicateNestedMessageScalars(self): | 912 def testParseDuplicateNestedMessageScalars(self): |
| 931 message = unittest_pb2.TestAllTypes() | 913 message = unittest_pb2.TestAllTypes() |
| 932 text = ('optional_nested_message { bb: 1 } ' | 914 text = ('optional_nested_message { bb: 1 } ' |
| 933 'optional_nested_message { bb: 2 }') | 915 'optional_nested_message { bb: 2 }') |
| 934 six.assertRaisesRegex(self, | 916 six.assertRaisesRegex(self, text_format.ParseError, ( |
| 935 text_format.ParseError, | 917 '1:65 : Message type "protobuf_unittest.TestAllTypes.NestedMessage" ' |
| 936 ('1:65 : Message type "protobuf_unittest.TestAllTypes.NestedMessage" ' | 918 'should not have multiple "bb" fields.'), text_format.Parse, text, |
| 937 'should not have multiple "bb" fields.'), | 919 message) |
| 938 text_format.Parse, text, message) | |
| 939 | 920 |
| 940 def testParseDuplicateScalars(self): | 921 def testParseDuplicateScalars(self): |
| 941 message = unittest_pb2.TestAllTypes() | 922 message = unittest_pb2.TestAllTypes() |
| 942 text = ('optional_int32: 42 ' | 923 text = ('optional_int32: 42 ' 'optional_int32: 67') |
| 943 'optional_int32: 67') | 924 six.assertRaisesRegex(self, text_format.ParseError, ( |
| 944 six.assertRaisesRegex(self, | 925 '1:36 : Message type "protobuf_unittest.TestAllTypes" should not ' |
| 945 text_format.ParseError, | 926 'have multiple "optional_int32" fields.'), text_format.Parse, text, |
| 946 ('1:36 : Message type "protobuf_unittest.TestAllTypes" should not ' | 927 message) |
| 947 'have multiple "optional_int32" fields.'), | |
| 948 text_format.Parse, text, message) | |
| 949 | 928 |
| 950 def testParseGroupNotClosed(self): | 929 def testParseGroupNotClosed(self): |
| 951 message = unittest_pb2.TestAllTypes() | 930 message = unittest_pb2.TestAllTypes() |
| 952 text = 'RepeatedGroup: <' | 931 text = 'RepeatedGroup: <' |
| 953 six.assertRaisesRegex(self, | 932 six.assertRaisesRegex(self, text_format.ParseError, '1:16 : Expected ">".', |
| 954 text_format.ParseError, '1:16 : Expected ">".', | 933 text_format.Parse, text, message) |
| 955 text_format.Parse, text, message) | |
| 956 text = 'RepeatedGroup: {' | 934 text = 'RepeatedGroup: {' |
| 957 six.assertRaisesRegex(self, | 935 six.assertRaisesRegex(self, text_format.ParseError, '1:16 : Expected "}".', |
| 958 text_format.ParseError, '1:16 : Expected "}".', | 936 text_format.Parse, text, message) |
| 959 text_format.Parse, text, message) | |
| 960 | 937 |
| 961 def testParseEmptyGroup(self): | 938 def testParseEmptyGroup(self): |
| 962 message = unittest_pb2.TestAllTypes() | 939 message = unittest_pb2.TestAllTypes() |
| 963 text = 'OptionalGroup: {}' | 940 text = 'OptionalGroup: {}' |
| 964 text_format.Parse(text, message) | 941 text_format.Parse(text, message) |
| 965 self.assertTrue(message.HasField('optionalgroup')) | 942 self.assertTrue(message.HasField('optionalgroup')) |
| 966 | 943 |
| 967 message.Clear() | 944 message.Clear() |
| 968 | 945 |
| 969 message = unittest_pb2.TestAllTypes() | 946 message = unittest_pb2.TestAllTypes() |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1000 ' c: 5\n' | 977 ' c: 5\n' |
| 1001 ' }\n' | 978 ' }\n' |
| 1002 '}\n') | 979 '}\n') |
| 1003 message = map_unittest_pb2.TestMap() | 980 message = map_unittest_pb2.TestMap() |
| 1004 text_format.Parse(text, message) | 981 text_format.Parse(text, message) |
| 1005 | 982 |
| 1006 self.assertEqual(-456, message.map_int32_int32[-123]) | 983 self.assertEqual(-456, message.map_int32_int32[-123]) |
| 1007 self.assertEqual(-2**34, message.map_int64_int64[-2**33]) | 984 self.assertEqual(-2**34, message.map_int64_int64[-2**33]) |
| 1008 self.assertEqual(456, message.map_uint32_uint32[123]) | 985 self.assertEqual(456, message.map_uint32_uint32[123]) |
| 1009 self.assertEqual(2**34, message.map_uint64_uint64[2**33]) | 986 self.assertEqual(2**34, message.map_uint64_uint64[2**33]) |
| 1010 self.assertEqual("123", message.map_string_string["abc"]) | 987 self.assertEqual('123', message.map_string_string['abc']) |
| 1011 self.assertEqual(5, message.map_int32_foreign_message[111].c) | 988 self.assertEqual(5, message.map_int32_foreign_message[111].c) |
| 1012 | 989 |
| 1013 | 990 |
| 991 class Proto3Tests(unittest.TestCase): |
| 992 |
| 993 def testPrintMessageExpandAny(self): |
| 994 packed_message = unittest_pb2.OneString() |
| 995 packed_message.data = 'string' |
| 996 message = any_test_pb2.TestAny() |
| 997 message.any_value.Pack(packed_message) |
| 998 self.assertEqual( |
| 999 text_format.MessageToString(message, |
| 1000 descriptor_pool=descriptor_pool.Default()), |
| 1001 'any_value {\n' |
| 1002 ' [type.googleapis.com/protobuf_unittest.OneString] {\n' |
| 1003 ' data: "string"\n' |
| 1004 ' }\n' |
| 1005 '}\n') |
| 1006 |
| 1007 def testPrintMessageExpandAnyRepeated(self): |
| 1008 packed_message = unittest_pb2.OneString() |
| 1009 message = any_test_pb2.TestAny() |
| 1010 packed_message.data = 'string0' |
| 1011 message.repeated_any_value.add().Pack(packed_message) |
| 1012 packed_message.data = 'string1' |
| 1013 message.repeated_any_value.add().Pack(packed_message) |
| 1014 self.assertEqual( |
| 1015 text_format.MessageToString(message, |
| 1016 descriptor_pool=descriptor_pool.Default()), |
| 1017 'repeated_any_value {\n' |
| 1018 ' [type.googleapis.com/protobuf_unittest.OneString] {\n' |
| 1019 ' data: "string0"\n' |
| 1020 ' }\n' |
| 1021 '}\n' |
| 1022 'repeated_any_value {\n' |
| 1023 ' [type.googleapis.com/protobuf_unittest.OneString] {\n' |
| 1024 ' data: "string1"\n' |
| 1025 ' }\n' |
| 1026 '}\n') |
| 1027 |
| 1028 def testPrintMessageExpandAnyNoDescriptorPool(self): |
| 1029 packed_message = unittest_pb2.OneString() |
| 1030 packed_message.data = 'string' |
| 1031 message = any_test_pb2.TestAny() |
| 1032 message.any_value.Pack(packed_message) |
| 1033 self.assertEqual( |
| 1034 text_format.MessageToString(message, descriptor_pool=None), |
| 1035 'any_value {\n' |
| 1036 ' type_url: "type.googleapis.com/protobuf_unittest.OneString"\n' |
| 1037 ' value: "\\n\\006string"\n' |
| 1038 '}\n') |
| 1039 |
| 1040 def testPrintMessageExpandAnyDescriptorPoolMissingType(self): |
| 1041 packed_message = unittest_pb2.OneString() |
| 1042 packed_message.data = 'string' |
| 1043 message = any_test_pb2.TestAny() |
| 1044 message.any_value.Pack(packed_message) |
| 1045 empty_pool = descriptor_pool.DescriptorPool() |
| 1046 self.assertEqual( |
| 1047 text_format.MessageToString(message, descriptor_pool=empty_pool), |
| 1048 'any_value {\n' |
| 1049 ' type_url: "type.googleapis.com/protobuf_unittest.OneString"\n' |
| 1050 ' value: "\\n\\006string"\n' |
| 1051 '}\n') |
| 1052 |
| 1053 def testPrintMessageExpandAnyPointyBrackets(self): |
| 1054 packed_message = unittest_pb2.OneString() |
| 1055 packed_message.data = 'string' |
| 1056 message = any_test_pb2.TestAny() |
| 1057 message.any_value.Pack(packed_message) |
| 1058 self.assertEqual( |
| 1059 text_format.MessageToString(message, |
| 1060 pointy_brackets=True, |
| 1061 descriptor_pool=descriptor_pool.Default()), |
| 1062 'any_value <\n' |
| 1063 ' [type.googleapis.com/protobuf_unittest.OneString] <\n' |
| 1064 ' data: "string"\n' |
| 1065 ' >\n' |
| 1066 '>\n') |
| 1067 |
| 1068 def testPrintMessageExpandAnyAsOneLine(self): |
| 1069 packed_message = unittest_pb2.OneString() |
| 1070 packed_message.data = 'string' |
| 1071 message = any_test_pb2.TestAny() |
| 1072 message.any_value.Pack(packed_message) |
| 1073 self.assertEqual( |
| 1074 text_format.MessageToString(message, |
| 1075 as_one_line=True, |
| 1076 descriptor_pool=descriptor_pool.Default()), |
| 1077 'any_value {' |
| 1078 ' [type.googleapis.com/protobuf_unittest.OneString]' |
| 1079 ' { data: "string" } ' |
| 1080 '}') |
| 1081 |
| 1082 def testPrintMessageExpandAnyAsOneLinePointyBrackets(self): |
| 1083 packed_message = unittest_pb2.OneString() |
| 1084 packed_message.data = 'string' |
| 1085 message = any_test_pb2.TestAny() |
| 1086 message.any_value.Pack(packed_message) |
| 1087 self.assertEqual( |
| 1088 text_format.MessageToString(message, |
| 1089 as_one_line=True, |
| 1090 pointy_brackets=True, |
| 1091 descriptor_pool=descriptor_pool.Default()), |
| 1092 'any_value <' |
| 1093 ' [type.googleapis.com/protobuf_unittest.OneString]' |
| 1094 ' < data: "string" > ' |
| 1095 '>') |
| 1096 |
| 1097 def testMergeExpandedAny(self): |
| 1098 message = any_test_pb2.TestAny() |
| 1099 text = ('any_value {\n' |
| 1100 ' [type.googleapis.com/protobuf_unittest.OneString] {\n' |
| 1101 ' data: "string"\n' |
| 1102 ' }\n' |
| 1103 '}\n') |
| 1104 text_format.Merge(text, message, descriptor_pool=descriptor_pool.Default()) |
| 1105 packed_message = unittest_pb2.OneString() |
| 1106 message.any_value.Unpack(packed_message) |
| 1107 self.assertEqual('string', packed_message.data) |
| 1108 |
| 1109 def testMergeExpandedAnyRepeated(self): |
| 1110 message = any_test_pb2.TestAny() |
| 1111 text = ('repeated_any_value {\n' |
| 1112 ' [type.googleapis.com/protobuf_unittest.OneString] {\n' |
| 1113 ' data: "string0"\n' |
| 1114 ' }\n' |
| 1115 '}\n' |
| 1116 'repeated_any_value {\n' |
| 1117 ' [type.googleapis.com/protobuf_unittest.OneString] {\n' |
| 1118 ' data: "string1"\n' |
| 1119 ' }\n' |
| 1120 '}\n') |
| 1121 text_format.Merge(text, message, descriptor_pool=descriptor_pool.Default()) |
| 1122 packed_message = unittest_pb2.OneString() |
| 1123 message.repeated_any_value[0].Unpack(packed_message) |
| 1124 self.assertEqual('string0', packed_message.data) |
| 1125 message.repeated_any_value[1].Unpack(packed_message) |
| 1126 self.assertEqual('string1', packed_message.data) |
| 1127 |
| 1128 def testMergeExpandedAnyPointyBrackets(self): |
| 1129 message = any_test_pb2.TestAny() |
| 1130 text = ('any_value {\n' |
| 1131 ' [type.googleapis.com/protobuf_unittest.OneString] <\n' |
| 1132 ' data: "string"\n' |
| 1133 ' >\n' |
| 1134 '}\n') |
| 1135 text_format.Merge(text, message, descriptor_pool=descriptor_pool.Default()) |
| 1136 packed_message = unittest_pb2.OneString() |
| 1137 message.any_value.Unpack(packed_message) |
| 1138 self.assertEqual('string', packed_message.data) |
| 1139 |
| 1140 def testMergeExpandedAnyNoDescriptorPool(self): |
| 1141 message = any_test_pb2.TestAny() |
| 1142 text = ('any_value {\n' |
| 1143 ' [type.googleapis.com/protobuf_unittest.OneString] {\n' |
| 1144 ' data: "string"\n' |
| 1145 ' }\n' |
| 1146 '}\n') |
| 1147 with self.assertRaises(text_format.ParseError) as e: |
| 1148 text_format.Merge(text, message, descriptor_pool=None) |
| 1149 self.assertEqual(str(e.exception), |
| 1150 'Descriptor pool required to parse expanded Any field') |
| 1151 |
| 1152 def testMergeExpandedAnyDescriptorPoolMissingType(self): |
| 1153 message = any_test_pb2.TestAny() |
| 1154 text = ('any_value {\n' |
| 1155 ' [type.googleapis.com/protobuf_unittest.OneString] {\n' |
| 1156 ' data: "string"\n' |
| 1157 ' }\n' |
| 1158 '}\n') |
| 1159 with self.assertRaises(text_format.ParseError) as e: |
| 1160 empty_pool = descriptor_pool.DescriptorPool() |
| 1161 text_format.Merge(text, message, descriptor_pool=empty_pool) |
| 1162 self.assertEqual( |
| 1163 str(e.exception), |
| 1164 'Type protobuf_unittest.OneString not found in descriptor pool') |
| 1165 |
| 1166 def testMergeUnexpandedAny(self): |
| 1167 text = ('any_value {\n' |
| 1168 ' type_url: "type.googleapis.com/protobuf_unittest.OneString"\n' |
| 1169 ' value: "\\n\\006string"\n' |
| 1170 '}\n') |
| 1171 message = any_test_pb2.TestAny() |
| 1172 text_format.Merge(text, message) |
| 1173 packed_message = unittest_pb2.OneString() |
| 1174 message.any_value.Unpack(packed_message) |
| 1175 self.assertEqual('string', packed_message.data) |
| 1176 |
| 1177 |
| 1014 class TokenizerTest(unittest.TestCase): | 1178 class TokenizerTest(unittest.TestCase): |
| 1015 | 1179 |
| 1016 def testSimpleTokenCases(self): | 1180 def testSimpleTokenCases(self): |
| 1017 text = ('identifier1:"string1"\n \n\n' | 1181 text = ('identifier1:"string1"\n \n\n' |
| 1018 'identifier2 : \n \n123 \n identifier3 :\'string\'\n' | 1182 'identifier2 : \n \n123 \n identifier3 :\'string\'\n' |
| 1019 'identifiER_4 : 1.1e+2 ID5:-0.23 ID6:\'aaaa\\\'bbbb\'\n' | 1183 'identifiER_4 : 1.1e+2 ID5:-0.23 ID6:\'aaaa\\\'bbbb\'\n' |
| 1020 'ID7 : "aa\\"bb"\n\n\n\n ID8: {A:inf B:-inf C:true D:false}\n' | 1184 'ID7 : "aa\\"bb"\n\n\n\n ID8: {A:inf B:-inf C:true D:false}\n' |
| 1021 'ID9: 22 ID10: -111111111111111111 ID11: -22\n' | 1185 'ID9: 22 ID10: -111111111111111111 ID11: -22\n' |
| 1022 'ID12: 2222222222222222222 ID13: 1.23456f ID14: 1.2e+2f ' | 1186 'ID12: 2222222222222222222 ID13: 1.23456f ID14: 1.2e+2f ' |
| 1023 'false_bool: 0 true_BOOL:t \n true_bool1: 1 false_BOOL1:f ') | 1187 'false_bool: 0 true_BOOL:t \n true_bool1: 1 false_BOOL1:f ') |
| 1024 tokenizer = text_format._Tokenizer(text.splitlines()) | 1188 tokenizer = text_format.Tokenizer(text.splitlines()) |
| 1025 methods = [(tokenizer.ConsumeIdentifier, 'identifier1'), | 1189 methods = [(tokenizer.ConsumeIdentifier, 'identifier1'), ':', |
| 1026 ':', | |
| 1027 (tokenizer.ConsumeString, 'string1'), | 1190 (tokenizer.ConsumeString, 'string1'), |
| 1028 (tokenizer.ConsumeIdentifier, 'identifier2'), | 1191 (tokenizer.ConsumeIdentifier, 'identifier2'), ':', |
| 1029 ':', | 1192 (tokenizer.ConsumeInteger, 123), |
| 1030 (tokenizer.ConsumeInt32, 123), | 1193 (tokenizer.ConsumeIdentifier, 'identifier3'), ':', |
| 1031 (tokenizer.ConsumeIdentifier, 'identifier3'), | |
| 1032 ':', | |
| 1033 (tokenizer.ConsumeString, 'string'), | 1194 (tokenizer.ConsumeString, 'string'), |
| 1034 (tokenizer.ConsumeIdentifier, 'identifiER_4'), | 1195 (tokenizer.ConsumeIdentifier, 'identifiER_4'), ':', |
| 1035 ':', | |
| 1036 (tokenizer.ConsumeFloat, 1.1e+2), | 1196 (tokenizer.ConsumeFloat, 1.1e+2), |
| 1037 (tokenizer.ConsumeIdentifier, 'ID5'), | 1197 (tokenizer.ConsumeIdentifier, 'ID5'), ':', |
| 1038 ':', | |
| 1039 (tokenizer.ConsumeFloat, -0.23), | 1198 (tokenizer.ConsumeFloat, -0.23), |
| 1040 (tokenizer.ConsumeIdentifier, 'ID6'), | 1199 (tokenizer.ConsumeIdentifier, 'ID6'), ':', |
| 1041 ':', | |
| 1042 (tokenizer.ConsumeString, 'aaaa\'bbbb'), | 1200 (tokenizer.ConsumeString, 'aaaa\'bbbb'), |
| 1043 (tokenizer.ConsumeIdentifier, 'ID7'), | 1201 (tokenizer.ConsumeIdentifier, 'ID7'), ':', |
| 1044 ':', | |
| 1045 (tokenizer.ConsumeString, 'aa\"bb'), | 1202 (tokenizer.ConsumeString, 'aa\"bb'), |
| 1046 (tokenizer.ConsumeIdentifier, 'ID8'), | 1203 (tokenizer.ConsumeIdentifier, 'ID8'), ':', '{', |
| 1047 ':', | 1204 (tokenizer.ConsumeIdentifier, 'A'), ':', |
| 1048 '{', | |
| 1049 (tokenizer.ConsumeIdentifier, 'A'), | |
| 1050 ':', | |
| 1051 (tokenizer.ConsumeFloat, float('inf')), | 1205 (tokenizer.ConsumeFloat, float('inf')), |
| 1052 (tokenizer.ConsumeIdentifier, 'B'), | 1206 (tokenizer.ConsumeIdentifier, 'B'), ':', |
| 1053 ':', | |
| 1054 (tokenizer.ConsumeFloat, -float('inf')), | 1207 (tokenizer.ConsumeFloat, -float('inf')), |
| 1055 (tokenizer.ConsumeIdentifier, 'C'), | 1208 (tokenizer.ConsumeIdentifier, 'C'), ':', |
| 1056 ':', | |
| 1057 (tokenizer.ConsumeBool, True), | 1209 (tokenizer.ConsumeBool, True), |
| 1058 (tokenizer.ConsumeIdentifier, 'D'), | 1210 (tokenizer.ConsumeIdentifier, 'D'), ':', |
| 1059 ':', | 1211 (tokenizer.ConsumeBool, False), '}', |
| 1212 (tokenizer.ConsumeIdentifier, 'ID9'), ':', |
| 1213 (tokenizer.ConsumeInteger, 22), |
| 1214 (tokenizer.ConsumeIdentifier, 'ID10'), ':', |
| 1215 (tokenizer.ConsumeInteger, -111111111111111111), |
| 1216 (tokenizer.ConsumeIdentifier, 'ID11'), ':', |
| 1217 (tokenizer.ConsumeInteger, -22), |
| 1218 (tokenizer.ConsumeIdentifier, 'ID12'), ':', |
| 1219 (tokenizer.ConsumeInteger, 2222222222222222222), |
| 1220 (tokenizer.ConsumeIdentifier, 'ID13'), ':', |
| 1221 (tokenizer.ConsumeFloat, 1.23456), |
| 1222 (tokenizer.ConsumeIdentifier, 'ID14'), ':', |
| 1223 (tokenizer.ConsumeFloat, 1.2e+2), |
| 1224 (tokenizer.ConsumeIdentifier, 'false_bool'), ':', |
| 1060 (tokenizer.ConsumeBool, False), | 1225 (tokenizer.ConsumeBool, False), |
| 1061 '}', | 1226 (tokenizer.ConsumeIdentifier, 'true_BOOL'), ':', |
| 1062 (tokenizer.ConsumeIdentifier, 'ID9'), | |
| 1063 ':', | |
| 1064 (tokenizer.ConsumeUint32, 22), | |
| 1065 (tokenizer.ConsumeIdentifier, 'ID10'), | |
| 1066 ':', | |
| 1067 (tokenizer.ConsumeInt64, -111111111111111111), | |
| 1068 (tokenizer.ConsumeIdentifier, 'ID11'), | |
| 1069 ':', | |
| 1070 (tokenizer.ConsumeInt32, -22), | |
| 1071 (tokenizer.ConsumeIdentifier, 'ID12'), | |
| 1072 ':', | |
| 1073 (tokenizer.ConsumeUint64, 2222222222222222222), | |
| 1074 (tokenizer.ConsumeIdentifier, 'ID13'), | |
| 1075 ':', | |
| 1076 (tokenizer.ConsumeFloat, 1.23456), | |
| 1077 (tokenizer.ConsumeIdentifier, 'ID14'), | |
| 1078 ':', | |
| 1079 (tokenizer.ConsumeFloat, 1.2e+2), | |
| 1080 (tokenizer.ConsumeIdentifier, 'false_bool'), | |
| 1081 ':', | |
| 1082 (tokenizer.ConsumeBool, False), | |
| 1083 (tokenizer.ConsumeIdentifier, 'true_BOOL'), | |
| 1084 ':', | |
| 1085 (tokenizer.ConsumeBool, True), | 1227 (tokenizer.ConsumeBool, True), |
| 1086 (tokenizer.ConsumeIdentifier, 'true_bool1'), | 1228 (tokenizer.ConsumeIdentifier, 'true_bool1'), ':', |
| 1087 ':', | |
| 1088 (tokenizer.ConsumeBool, True), | 1229 (tokenizer.ConsumeBool, True), |
| 1089 (tokenizer.ConsumeIdentifier, 'false_BOOL1'), | 1230 (tokenizer.ConsumeIdentifier, 'false_BOOL1'), ':', |
| 1090 ':', | |
| 1091 (tokenizer.ConsumeBool, False)] | 1231 (tokenizer.ConsumeBool, False)] |
| 1092 | 1232 |
| 1093 i = 0 | 1233 i = 0 |
| 1094 while not tokenizer.AtEnd(): | 1234 while not tokenizer.AtEnd(): |
| 1095 m = methods[i] | 1235 m = methods[i] |
| 1096 if type(m) == str: | 1236 if isinstance(m, str): |
| 1097 token = tokenizer.token | 1237 token = tokenizer.token |
| 1098 self.assertEqual(token, m) | 1238 self.assertEqual(token, m) |
| 1099 tokenizer.NextToken() | 1239 tokenizer.NextToken() |
| 1100 else: | 1240 else: |
| 1101 self.assertEqual(m[1], m[0]()) | 1241 self.assertEqual(m[1], m[0]()) |
| 1102 i += 1 | 1242 i += 1 |
| 1103 | 1243 |
| 1244 def testConsumeAbstractIntegers(self): |
| 1245 # This test only tests the failures in the integer parsing methods as well |
| 1246 # as the '0' special cases. |
| 1247 int64_max = (1 << 63) - 1 |
| 1248 uint32_max = (1 << 32) - 1 |
| 1249 text = '-1 %d %d' % (uint32_max + 1, int64_max + 1) |
| 1250 tokenizer = text_format.Tokenizer(text.splitlines()) |
| 1251 self.assertEqual(-1, tokenizer.ConsumeInteger()) |
| 1252 |
| 1253 self.assertEqual(uint32_max + 1, tokenizer.ConsumeInteger()) |
| 1254 |
| 1255 self.assertEqual(int64_max + 1, tokenizer.ConsumeInteger()) |
| 1256 self.assertTrue(tokenizer.AtEnd()) |
| 1257 |
| 1258 text = '-0 0' |
| 1259 tokenizer = text_format.Tokenizer(text.splitlines()) |
| 1260 self.assertEqual(0, tokenizer.ConsumeInteger()) |
| 1261 self.assertEqual(0, tokenizer.ConsumeInteger()) |
| 1262 self.assertTrue(tokenizer.AtEnd()) |
| 1263 |
| 1104 def testConsumeIntegers(self): | 1264 def testConsumeIntegers(self): |
| 1105 # This test only tests the failures in the integer parsing methods as well | 1265 # This test only tests the failures in the integer parsing methods as well |
| 1106 # as the '0' special cases. | 1266 # as the '0' special cases. |
| 1107 int64_max = (1 << 63) - 1 | 1267 int64_max = (1 << 63) - 1 |
| 1108 uint32_max = (1 << 32) - 1 | 1268 uint32_max = (1 << 32) - 1 |
| 1109 text = '-1 %d %d' % (uint32_max + 1, int64_max + 1) | 1269 text = '-1 %d %d' % (uint32_max + 1, int64_max + 1) |
| 1110 tokenizer = text_format._Tokenizer(text.splitlines()) | 1270 tokenizer = text_format.Tokenizer(text.splitlines()) |
| 1111 self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint32) | 1271 self.assertRaises(text_format.ParseError, |
| 1112 self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint64) | 1272 text_format._ConsumeUint32, tokenizer) |
| 1113 self.assertEqual(-1, tokenizer.ConsumeInt32()) | 1273 self.assertRaises(text_format.ParseError, |
| 1274 text_format._ConsumeUint64, tokenizer) |
| 1275 self.assertEqual(-1, text_format._ConsumeInt32(tokenizer)) |
| 1114 | 1276 |
| 1115 self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint32) | 1277 self.assertRaises(text_format.ParseError, |
| 1116 self.assertRaises(text_format.ParseError, tokenizer.ConsumeInt32) | 1278 text_format._ConsumeUint32, tokenizer) |
| 1117 self.assertEqual(uint32_max + 1, tokenizer.ConsumeInt64()) | 1279 self.assertRaises(text_format.ParseError, |
| 1280 text_format._ConsumeInt32, tokenizer) |
| 1281 self.assertEqual(uint32_max + 1, text_format._ConsumeInt64(tokenizer)) |
| 1118 | 1282 |
| 1119 self.assertRaises(text_format.ParseError, tokenizer.ConsumeInt64) | 1283 self.assertRaises(text_format.ParseError, |
| 1120 self.assertEqual(int64_max + 1, tokenizer.ConsumeUint64()) | 1284 text_format._ConsumeInt64, tokenizer) |
| 1285 self.assertEqual(int64_max + 1, text_format._ConsumeUint64(tokenizer)) |
| 1121 self.assertTrue(tokenizer.AtEnd()) | 1286 self.assertTrue(tokenizer.AtEnd()) |
| 1122 | 1287 |
| 1123 text = '-0 -0 0 0' | 1288 text = '-0 -0 0 0' |
| 1124 tokenizer = text_format._Tokenizer(text.splitlines()) | 1289 tokenizer = text_format.Tokenizer(text.splitlines()) |
| 1125 self.assertEqual(0, tokenizer.ConsumeUint32()) | 1290 self.assertEqual(0, text_format._ConsumeUint32(tokenizer)) |
| 1126 self.assertEqual(0, tokenizer.ConsumeUint64()) | 1291 self.assertEqual(0, text_format._ConsumeUint64(tokenizer)) |
| 1127 self.assertEqual(0, tokenizer.ConsumeUint32()) | 1292 self.assertEqual(0, text_format._ConsumeUint32(tokenizer)) |
| 1128 self.assertEqual(0, tokenizer.ConsumeUint64()) | 1293 self.assertEqual(0, text_format._ConsumeUint64(tokenizer)) |
| 1129 self.assertTrue(tokenizer.AtEnd()) | 1294 self.assertTrue(tokenizer.AtEnd()) |
| 1130 | 1295 |
| 1131 def testConsumeByteString(self): | 1296 def testConsumeByteString(self): |
| 1132 text = '"string1\'' | 1297 text = '"string1\'' |
| 1133 tokenizer = text_format._Tokenizer(text.splitlines()) | 1298 tokenizer = text_format.Tokenizer(text.splitlines()) |
| 1134 self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) | 1299 self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) |
| 1135 | 1300 |
| 1136 text = 'string1"' | 1301 text = 'string1"' |
| 1137 tokenizer = text_format._Tokenizer(text.splitlines()) | 1302 tokenizer = text_format.Tokenizer(text.splitlines()) |
| 1138 self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) | 1303 self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) |
| 1139 | 1304 |
| 1140 text = '\n"\\xt"' | 1305 text = '\n"\\xt"' |
| 1141 tokenizer = text_format._Tokenizer(text.splitlines()) | 1306 tokenizer = text_format.Tokenizer(text.splitlines()) |
| 1142 self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) | 1307 self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) |
| 1143 | 1308 |
| 1144 text = '\n"\\"' | 1309 text = '\n"\\"' |
| 1145 tokenizer = text_format._Tokenizer(text.splitlines()) | 1310 tokenizer = text_format.Tokenizer(text.splitlines()) |
| 1146 self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) | 1311 self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) |
| 1147 | 1312 |
| 1148 text = '\n"\\x"' | 1313 text = '\n"\\x"' |
| 1149 tokenizer = text_format._Tokenizer(text.splitlines()) | 1314 tokenizer = text_format.Tokenizer(text.splitlines()) |
| 1150 self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) | 1315 self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) |
| 1151 | 1316 |
| 1152 def testConsumeBool(self): | 1317 def testConsumeBool(self): |
| 1153 text = 'not-a-bool' | 1318 text = 'not-a-bool' |
| 1154 tokenizer = text_format._Tokenizer(text.splitlines()) | 1319 tokenizer = text_format.Tokenizer(text.splitlines()) |
| 1155 self.assertRaises(text_format.ParseError, tokenizer.ConsumeBool) | 1320 self.assertRaises(text_format.ParseError, tokenizer.ConsumeBool) |
| 1156 | 1321 |
| 1322 def testSkipComment(self): |
| 1323 tokenizer = text_format.Tokenizer('# some comment'.splitlines()) |
| 1324 self.assertTrue(tokenizer.AtEnd()) |
| 1325 self.assertRaises(text_format.ParseError, tokenizer.ConsumeComment) |
| 1326 |
| 1327 def testConsumeComment(self): |
| 1328 tokenizer = text_format.Tokenizer('# some comment'.splitlines(), |
| 1329 skip_comments=False) |
| 1330 self.assertFalse(tokenizer.AtEnd()) |
| 1331 self.assertEqual('# some comment', tokenizer.ConsumeComment()) |
| 1332 self.assertTrue(tokenizer.AtEnd()) |
| 1333 |
| 1334 def testConsumeTwoComments(self): |
| 1335 text = '# some comment\n# another comment' |
| 1336 tokenizer = text_format.Tokenizer(text.splitlines(), skip_comments=False) |
| 1337 self.assertEqual('# some comment', tokenizer.ConsumeComment()) |
| 1338 self.assertFalse(tokenizer.AtEnd()) |
| 1339 self.assertEqual('# another comment', tokenizer.ConsumeComment()) |
| 1340 self.assertTrue(tokenizer.AtEnd()) |
| 1341 |
| 1342 def testConsumeTrailingComment(self): |
| 1343 text = 'some_number: 4\n# some comment' |
| 1344 tokenizer = text_format.Tokenizer(text.splitlines(), skip_comments=False) |
| 1345 self.assertRaises(text_format.ParseError, tokenizer.ConsumeComment) |
| 1346 |
| 1347 self.assertEqual('some_number', tokenizer.ConsumeIdentifier()) |
| 1348 self.assertEqual(tokenizer.token, ':') |
| 1349 tokenizer.NextToken() |
| 1350 self.assertRaises(text_format.ParseError, tokenizer.ConsumeComment) |
| 1351 self.assertEqual(4, tokenizer.ConsumeInteger()) |
| 1352 self.assertFalse(tokenizer.AtEnd()) |
| 1353 |
| 1354 self.assertEqual('# some comment', tokenizer.ConsumeComment()) |
| 1355 self.assertTrue(tokenizer.AtEnd()) |
| 1356 |
| 1157 | 1357 |
| 1158 if __name__ == '__main__': | 1358 if __name__ == '__main__': |
| 1159 unittest.main() | 1359 unittest.main() |
| OLD | NEW |