Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(183)

Side by Side Diff: recipe_engine/third_party/google/protobuf/internal/text_format_test.py

Issue 2236673002: Bump vendoring, move to proto3 release. (Closed) Base URL: https://github.com/luci/recipes-py@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698