15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#! /usr/bin/python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Protocol Buffers - Google's data interchange format
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright 2008 Google Inc.  All rights reserved.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# http://code.google.com/p/protobuf/
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Redistribution and use in source and binary forms, with or without
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# modification, are permitted provided that the following conditions are
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# met:
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     * Redistributions of source code must retain the above copyright
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# notice, this list of conditions and the following disclaimer.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     * Redistributions in binary form must reproduce the above
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# copyright notice, this list of conditions and the following disclaimer
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# in the documentation and/or other materials provided with the
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# distribution.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     * Neither the name of Google Inc. nor the names of its
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# contributors may be used to endorse or promote products derived from
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# this software without specific prior written permission.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Test for google.protobuf.text_format."""
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__author__ = 'kenton@google.com (Kenton Varda)'
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import difflib
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import re
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import unittest
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import text_format
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import test_util
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import unittest_pb2
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import unittest_mset_pb2
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TextFormatTest(unittest.TestCase):
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def ReadGolden(self, golden_filename):
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    f = test_util.GoldenFile(golden_filename)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    golden_lines = f.readlines()
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    f.close()
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return golden_lines
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def CompareToGoldenFile(self, text, golden_filename):
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    golden_lines = self.ReadGolden(golden_filename)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.CompareToGoldenLines(text, golden_lines)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def CompareToGoldenText(self, text, golden_text):
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.CompareToGoldenLines(text, golden_text.splitlines(1))
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def CompareToGoldenLines(self, text, golden_lines):
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    actual_lines = text.splitlines(1)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(golden_lines, actual_lines,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Text doesn't match golden.  Diff:\n" +
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ''.join(difflib.ndiff(golden_lines, actual_lines)))
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPrintAllFields(self):
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(message)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.CompareToGoldenFile(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.RemoveRedundantZeros(text_format.MessageToString(message)),
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'text_format_unittest_data.txt')
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPrintAllExtensions(self):
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllExtensions()
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllExtensions(message)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.CompareToGoldenFile(
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.RemoveRedundantZeros(text_format.MessageToString(message)),
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'text_format_unittest_extensions_data.txt')
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPrintMessageSet(self):
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_mset_pb2.TestMessageSetContainer()
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.message_set.Extensions[ext1].i = 23
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.message_set.Extensions[ext2].str = 'foo'
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.CompareToGoldenText(text_format.MessageToString(message),
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'message_set {\n'
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '  [protobuf_unittest.TestMessageSetExtension1] {\n'
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '    i: 23\n'
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '  }\n'
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '  [protobuf_unittest.TestMessageSetExtension2] {\n'
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '    str: \"foo\"\n'
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '  }\n'
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '}\n')
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def testPrintBadEnumValue(self):
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    message = unittest_pb2.TestAllTypes()
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    message.optional_nested_enum = 100
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    message.optional_foreign_enum = 101
101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    message.optional_import_enum = 102
102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.CompareToGoldenText(
103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        text_format.MessageToString(message),
104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        'optional_nested_enum: 100\n'
105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        'optional_foreign_enum: 101\n'
106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        'optional_import_enum: 102\n')
107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def testPrintBadEnumValueExtensions(self):
109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    message = unittest_pb2.TestAllExtensions()
110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    message.Extensions[unittest_pb2.optional_nested_enum_extension] = 100
111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    message.Extensions[unittest_pb2.optional_foreign_enum_extension] = 101
112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    message.Extensions[unittest_pb2.optional_import_enum_extension] = 102
113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.CompareToGoldenText(
114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        text_format.MessageToString(message),
115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        '[protobuf_unittest.optional_nested_enum_extension]: 100\n'
116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        '[protobuf_unittest.optional_foreign_enum_extension]: 101\n'
117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        '[protobuf_unittest.optional_import_enum_extension]: 102\n')
118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPrintExotic(self):
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_int64.append(-9223372036854775808)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_uint64.append(18446744073709551615)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_double.append(123.456)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_double.append(1.23e22)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_double.append(1.23e-18)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_string.append('\000\001\a\b\f\n\r\t\v\\\'"')
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_string.append(u'\u00fc\ua71f')
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.CompareToGoldenText(
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.RemoveRedundantZeros(text_format.MessageToString(message)),
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'repeated_int64: -9223372036854775808\n'
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'repeated_uint64: 18446744073709551615\n'
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'repeated_double: 123.456\n'
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'repeated_double: 1.23e+22\n'
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'repeated_double: 1.23e-18\n'
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'repeated_string: '
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '"\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\\'\\""\n'
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'repeated_string: "\\303\\274\\352\\234\\237"\n')
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPrintNestedMessageAsOneLine(self):
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = message.repeated_nested_message.add()
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg.bb = 42;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.CompareToGoldenText(
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.MessageToString(message, as_one_line=True),
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'repeated_nested_message { bb: 42 }')
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPrintRepeatedFieldsAsOneLine(self):
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_int32.append(1)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_int32.append(1)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_int32.append(3)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_string.append("Google")
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_string.append("Zurich")
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.CompareToGoldenText(
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.MessageToString(message, as_one_line=True),
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'repeated_int32: 1 repeated_int32: 1 repeated_int32: 3 '
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'repeated_string: "Google" repeated_string: "Zurich"')
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPrintNestedNewLineInStringAsOneLine(self):
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.optional_string = "a\nnew\nline"
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.CompareToGoldenText(
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.MessageToString(message, as_one_line=True),
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'optional_string: "a\\nnew\\nline"')
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPrintMessageSetAsOneLine(self):
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_mset_pb2.TestMessageSetContainer()
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.message_set.Extensions[ext1].i = 23
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.message_set.Extensions[ext2].str = 'foo'
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.CompareToGoldenText(
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.MessageToString(message, as_one_line=True),
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'message_set {'
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ' [protobuf_unittest.TestMessageSetExtension1] {'
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ' i: 23'
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ' }'
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ' [protobuf_unittest.TestMessageSetExtension2] {'
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ' str: \"foo\"'
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ' }'
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ' }')
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPrintExoticAsOneLine(self):
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_int64.append(-9223372036854775808)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_uint64.append(18446744073709551615)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_double.append(123.456)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_double.append(1.23e22)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_double.append(1.23e-18)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_string.append('\000\001\a\b\f\n\r\t\v\\\'"')
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_string.append(u'\u00fc\ua71f')
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.CompareToGoldenText(
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.RemoveRedundantZeros(
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          text_format.MessageToString(message, as_one_line=True)),
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'repeated_int64: -9223372036854775808'
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ' repeated_uint64: 18446744073709551615'
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ' repeated_double: 123.456'
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ' repeated_double: 1.23e+22'
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ' repeated_double: 1.23e-18'
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ' repeated_string: '
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '"\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\\'\\""'
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ' repeated_string: "\\303\\274\\352\\234\\237"')
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRoundTripExoticAsOneLine(self):
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_int64.append(-9223372036854775808)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_uint64.append(18446744073709551615)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_double.append(123.456)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_double.append(1.23e22)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_double.append(1.23e-18)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_string.append('\000\001\a\b\f\n\r\t\v\\\'"')
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_string.append(u'\u00fc\ua71f')
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test as_utf8 = False.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wire_text = text_format.MessageToString(
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message, as_one_line=True, as_utf8=False)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parsed_message = unittest_pb2.TestAllTypes()
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_format.Merge(wire_text, parsed_message)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(message, parsed_message)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test as_utf8 = True.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wire_text = text_format.MessageToString(
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message, as_one_line=True, as_utf8=True)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parsed_message = unittest_pb2.TestAllTypes()
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_format.Merge(wire_text, parsed_message)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(message, parsed_message)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPrintRawUtf8String(self):
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.repeated_string.append(u'\u00fc\ua71f')
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = text_format.MessageToString(message, as_utf8 = True)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.CompareToGoldenText(text, 'repeated_string: "\303\274\352\234\237"\n')
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parsed_message = unittest_pb2.TestAllTypes()
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_format.Merge(text, parsed_message)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(message, parsed_message)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMessageToString(self):
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.ForeignMessage()
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.c = 123
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('c: 123\n', str(message))
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def RemoveRedundantZeros(self, text):
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Some platforms print 1e+5 as 1e+005.  This is fine, but we need to remove
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # these zeros in order to match the golden file.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = text.replace('e+0','e+').replace('e+0','e+') \
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               .replace('e-0','e-').replace('e-0','e-')
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Floating point fields are printed with .0 suffix even if they are
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # actualy integer numbers.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = re.compile('\.0$', re.MULTILINE).sub('', text)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return text
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeGolden(self):
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    golden_text = '\n'.join(self.ReadGolden('text_format_unittest_data.txt'))
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parsed_message = unittest_pb2.TestAllTypes()
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_format.Merge(golden_text, parsed_message)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(message)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(message, parsed_message)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeGoldenExtensions(self):
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    golden_text = '\n'.join(self.ReadGolden(
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'text_format_unittest_extensions_data.txt'))
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parsed_message = unittest_pb2.TestAllExtensions()
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_format.Merge(golden_text, parsed_message)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllExtensions()
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllExtensions(message)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(message, parsed_message)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeAllFields(self):
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllFields(message)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ascii_text = text_format.MessageToString(message)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parsed_message = unittest_pb2.TestAllTypes()
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_format.Merge(ascii_text, parsed_message)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(message, parsed_message)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.ExpectAllFieldsSet(self, message)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeAllExtensions(self):
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllExtensions()
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_util.SetAllExtensions(message)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ascii_text = text_format.MessageToString(message)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parsed_message = unittest_pb2.TestAllExtensions()
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_format.Merge(ascii_text, parsed_message)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(message, parsed_message)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeMessageSet(self):
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = ('repeated_uint64: 1\n'
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'repeated_uint64: 2\n')
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_format.Merge(text, message)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, message.repeated_uint64[0])
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, message.repeated_uint64[1])
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_mset_pb2.TestMessageSetContainer()
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = ('message_set {\n'
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            '  [protobuf_unittest.TestMessageSetExtension1] {\n'
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            '    i: 23\n'
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            '  }\n'
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            '  [protobuf_unittest.TestMessageSetExtension2] {\n'
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            '    str: \"foo\"\n'
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            '  }\n'
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            '}\n')
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_format.Merge(text, message)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(23, message.message_set.Extensions[ext1].i)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals('foo', message.message_set.Extensions[ext2].str)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeExotic(self):
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = ('repeated_int64: -9223372036854775808\n'
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'repeated_uint64: 18446744073709551615\n'
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'repeated_double: 123.456\n'
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'repeated_double: 1.23e+22\n'
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'repeated_double: 1.23e-18\n'
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'repeated_string: \n'
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            '"\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\\'\\""\n'
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'repeated_string: "foo" \'corge\' "grault"\n'
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'repeated_string: "\\303\\274\\352\\234\\237"\n'
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'repeated_string: "\\xc3\\xbc"\n'
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'repeated_string: "\xc3\xbc"\n')
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_format.Merge(text, message)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(-9223372036854775808, message.repeated_int64[0])
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(18446744073709551615, message.repeated_uint64[0])
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(123.456, message.repeated_double[0])
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1.23e22, message.repeated_double[1])
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1.23e-18, message.repeated_double[2])
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '\000\001\a\b\f\n\r\t\v\\\'"', message.repeated_string[0])
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('foocorgegrault', message.repeated_string[1])
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(u'\u00fc\ua71f', message.repeated_string[2])
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(u'\u00fc', message.repeated_string[3])
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeEmptyText(self):
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = ''
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_format.Merge(text, message)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(unittest_pb2.TestAllTypes(), message)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeInvalidUtf8(self):
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = 'repeated_string: "\\xc3\\xc3"'
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(text_format.ParseError, text_format.Merge, text, message)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeSingleWord(self):
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = 'foo'
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaisesWithMessage(
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.ParseError,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ('1:1 : Message type "protobuf_unittest.TestAllTypes" has no field named '
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         '"foo".'),
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.Merge, text, message)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeUnknownField(self):
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = 'unknown_field: 8\n'
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaisesWithMessage(
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.ParseError,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ('1:1 : Message type "protobuf_unittest.TestAllTypes" has no field named '
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         '"unknown_field".'),
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.Merge, text, message)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeBadExtension(self):
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllExtensions()
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = '[unknown_extension]: 8\n'
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaisesWithMessage(
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.ParseError,
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '1:2 : Extension "unknown_extension" not registered.',
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.Merge, text, message)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaisesWithMessage(
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.ParseError,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ('1:2 : Message type "protobuf_unittest.TestAllTypes" does not have '
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         'extensions.'),
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.Merge, text, message)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeGroupNotClosed(self):
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = 'RepeatedGroup: <'
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaisesWithMessage(
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.ParseError, '1:16 : Expected ">".',
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.Merge, text, message)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = 'RepeatedGroup: {'
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaisesWithMessage(
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.ParseError, '1:16 : Expected "}".',
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.Merge, text, message)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeEmptyGroup(self):
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = 'OptionalGroup: {}'
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_format.Merge(text, message)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(message.HasField('optionalgroup'))
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message.Clear()
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = 'OptionalGroup: <>'
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_format.Merge(text, message)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(message.HasField('optionalgroup'))
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMergeBadEnumValue(self):
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = 'optional_nested_enum: BARR'
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaisesWithMessage(
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.ParseError,
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ('1:23 : Enum type "protobuf_unittest.TestAllTypes.NestedEnum" '
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         'has no value named BARR.'),
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.Merge, text, message)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = unittest_pb2.TestAllTypes()
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = 'optional_nested_enum: 100'
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaisesWithMessage(
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.ParseError,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ('1:23 : Enum type "protobuf_unittest.TestAllTypes.NestedEnum" '
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         'has no value with number 100.'),
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text_format.Merge, text, message)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
424ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def testMergeBadIntValue(self):
425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    message = unittest_pb2.TestAllTypes()
426ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    text = 'optional_int32: bork'
427ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertRaisesWithMessage(
428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        text_format.ParseError,
429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        ('1:17 : Couldn\'t parse integer: bork'),
430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        text_format.Merge, text, message)
431ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def assertRaisesWithMessage(self, e_class, e, func, *args, **kwargs):
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Same as assertRaises, but also compares the exception message."""
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if hasattr(e_class, '__name__'):
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      exc_name = e_class.__name__
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      exc_name = str(e_class)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func(*args, **kwargs)
441ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    except e_class as expr:
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if str(expr) != e:
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        msg = '%s raised, but with wrong message: "%s" instead of "%s"'
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        raise self.failureException(msg % (exc_name,
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           str(expr).encode('string_escape'),
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           e.encode('string_escape')))
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      raise self.failureException('%s not raised' % exc_name)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TokenizerTest(unittest.TestCase):
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSimpleTokenCases(self):
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = ('identifier1:"string1"\n     \n\n'
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'identifier2 : \n \n123  \n  identifier3 :\'string\'\n'
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'identifiER_4 : 1.1e+2 ID5:-0.23 ID6:\'aaaa\\\'bbbb\'\n'
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'ID7 : "aa\\"bb"\n\n\n\n ID8: {A:inf B:-inf C:true D:false}\n'
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'ID9: 22 ID10: -111111111111111111 ID11: -22\n'
460ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            'ID12: 2222222222222222222 ID13: 1.23456f ID14: 1.2e+2f '
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'false_bool:  0 true_BOOL:t \n true_bool1:  1 false_BOOL1:f ' )
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tokenizer = text_format._Tokenizer(text)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    methods = [(tokenizer.ConsumeIdentifier, 'identifier1'),
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeString, 'string1'),
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'identifier2'),
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeInt32, 123),
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'identifier3'),
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeString, 'string'),
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'identifiER_4'),
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeFloat, 1.1e+2),
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'ID5'),
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeFloat, -0.23),
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'ID6'),
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeString, 'aaaa\'bbbb'),
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'ID7'),
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeString, 'aa\"bb'),
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'ID8'),
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               '{',
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'A'),
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
489ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               (tokenizer.ConsumeFloat, float('inf')),
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'B'),
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
492ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               (tokenizer.ConsumeFloat, -float('inf')),
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'C'),
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeBool, True),
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'D'),
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeBool, False),
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               '}',
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'ID9'),
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeUint32, 22),
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'ID10'),
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeInt64, -111111111111111111),
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'ID11'),
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeInt32, -22),
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'ID12'),
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeUint64, 2222222222222222222),
512ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               (tokenizer.ConsumeIdentifier, 'ID13'),
513ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               ':',
514ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               (tokenizer.ConsumeFloat, 1.23456),
515ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               (tokenizer.ConsumeIdentifier, 'ID14'),
516ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               ':',
517ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               (tokenizer.ConsumeFloat, 1.2e+2),
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'false_bool'),
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeBool, False),
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'true_BOOL'),
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeBool, True),
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'true_bool1'),
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeBool, True),
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeIdentifier, 'false_BOOL1'),
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ':',
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (tokenizer.ConsumeBool, False)]
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i = 0
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while not tokenizer.AtEnd():
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      m = methods[i]
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if type(m) == str:
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        token = tokenizer.token
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEqual(token, m)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tokenizer.NextToken()
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEqual(m[1], m[0]())
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      i += 1
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testConsumeIntegers(self):
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # This test only tests the failures in the integer parsing methods as well
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # as the '0' special cases.
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64_max = (1 << 63) - 1
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_max = (1 << 32) - 1
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = '-1 %d %d' % (uint32_max + 1, int64_max + 1)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tokenizer = text_format._Tokenizer(text)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint32)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint64)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(-1, tokenizer.ConsumeInt32())
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint32)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(text_format.ParseError, tokenizer.ConsumeInt32)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(uint32_max + 1, tokenizer.ConsumeInt64())
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(text_format.ParseError, tokenizer.ConsumeInt64)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(int64_max + 1, tokenizer.ConsumeUint64())
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(tokenizer.AtEnd())
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = '-0 -0 0 0'
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tokenizer = text_format._Tokenizer(text)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, tokenizer.ConsumeUint32())
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, tokenizer.ConsumeUint64())
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, tokenizer.ConsumeUint32())
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(0, tokenizer.ConsumeUint64())
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(tokenizer.AtEnd())
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testConsumeByteString(self):
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = '"string1\''
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tokenizer = text_format._Tokenizer(text)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = 'string1"'
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tokenizer = text_format._Tokenizer(text)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = '\n"\\xt"'
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tokenizer = text_format._Tokenizer(text)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = '\n"\\"'
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tokenizer = text_format._Tokenizer(text)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = '\n"\\x"'
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tokenizer = text_format._Tokenizer(text)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testConsumeBool(self):
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = 'not-a-bool'
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tokenizer = text_format._Tokenizer(text)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(text_format.ParseError, tokenizer.ConsumeBool)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unittest.main()
598