1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson// https://developers.google.com/protocol-buffers/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillepackage com.google.protobuf; 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.protobuf.Descriptors.FieldDescriptor; 34a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonimport com.google.protobuf.TextFormat.Parser.SingularOverwritePolicy; 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport protobuf_unittest.UnittestMset.TestMessageSet; 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport protobuf_unittest.UnittestMset.TestMessageSetExtension1; 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport protobuf_unittest.UnittestMset.TestMessageSetExtension2; 38a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonimport protobuf_unittest.UnittestProto.OneString; 39a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonimport protobuf_unittest.UnittestProto.TestAllExtensions; 40a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonimport protobuf_unittest.UnittestProto.TestAllTypes; 41a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonimport protobuf_unittest.UnittestProto.TestAllTypes.NestedMessage; 42a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonimport protobuf_unittest.UnittestProto.TestEmptyMessage; 43a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonimport protobuf_unittest.UnittestProto.TestOneof2; 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport junit.framework.TestCase; 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.io.StringReader; 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville/** 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Test case for {@link TextFormat}. 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * TODO(wenboz): ExtensionTest and rest of text_format_unittest.cc. 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * @author wenboz@google.com (Wenbo Zhu) 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillepublic class TextFormatTest extends TestCase { 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // A basic string with different escapable characters for testing. 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private final static String kEscapeTestString = 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"A string with ' characters \n and \r newlines and \t tabs and \001 " 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville + "slashes \\"; 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // A representation of the above string with all the characters escaped. 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private final static String kEscapeTestStringEscaped = 65a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "\\\"A string with \\' characters \\n and \\r newlines " 66a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson + "and \\t tabs and \\001 slashes \\\\"; 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private static String allFieldsSetText = TestUtil.readTextFromFile( 69a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "text_format_unittest_data_oneof_implemented.txt"); 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private static String allExtensionsSetText = TestUtil.readTextFromFile( 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "text_format_unittest_extensions_data.txt"); 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 73d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville private static String exoticText = 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_int32: -1\n" + 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_int32: -2147483648\n" + 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_int64: -1\n" + 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_int64: -9223372036854775808\n" + 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_uint32: 4294967295\n" + 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_uint32: 2147483648\n" + 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_uint64: 18446744073709551615\n" + 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_uint64: 9223372036854775808\n" + 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 123.0\n" + 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 123.5\n" + 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 0.125\n" + 85d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_double: .125\n" + 86d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_double: -.125\n" + 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.23E17\n" + 88d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_double: 1.23E+17\n" + 89d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_double: -1.23e-17\n" + 90d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_double: .23e+17\n" + 91d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_double: -.23E17\n" + 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.235E22\n" + 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.235E-18\n" + 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 123.456789\n" + 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: Infinity\n" + 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: -Infinity\n" + 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: NaN\n" + 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_string: \"\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"" + 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\\341\\210\\264\"\n" + 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_bytes: \"\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"\\376\"\n"; 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 102d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville private static String canonicalExoticText = 103d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville exoticText.replace(": .", ": 0.").replace(": -.", ": -0.") // short-form double 104d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville .replace("23e", "23E").replace("E+", "E").replace("0.23E17", "2.3E16"); 105d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private String messageSetText = 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "[protobuf_unittest.TestMessageSetExtension1] {\n" + 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " i: 123\n" + 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n" + 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "[protobuf_unittest.TestMessageSetExtension2] {\n" + 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " str: \"foo\"\n" + 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"; 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 114a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private String messageSetTextWithRepeatedExtension = 115a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "[protobuf_unittest.TestMessageSetExtension1] {\n" + 116a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " i: 123\n" + 117a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n" + 118a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "[protobuf_unittest.TestMessageSetExtension1] {\n" + 119a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " i: 456\n" + 120a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"; 121a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 122a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private final TextFormat.Parser parserWithOverwriteForbidden = 123a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.Parser.newBuilder() 124a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .setSingularOverwritePolicy( 125a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SingularOverwritePolicy.FORBID_SINGULAR_OVERWRITES) 126a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .build(); 127a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 128a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private final TextFormat.Parser defaultParser = 129a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.Parser.newBuilder().build(); 130a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Print TestAllTypes and compare with golden file. */ 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testPrintMessage() throws Exception { 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville String javaText = TextFormat.printToString(TestUtil.getAllSet()); 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Java likes to add a trailing ".0" to floats and doubles. C printf 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // (with %g format) does not. Our golden files are used for both 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // C++ and Java TextFormat classes, so we need to conform. 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville javaText = javaText.replace(".0\n", "\n"); 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(allFieldsSetText, javaText); 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 143a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson /** Print TestAllTypes as Builder and compare with golden file. */ 144a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public void testPrintMessageBuilder() throws Exception { 145a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson String javaText = TextFormat.printToString(TestUtil.getAllSetBuilder()); 146a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 147a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Java likes to add a trailing ".0" to floats and doubles. C printf 148a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // (with %g format) does not. Our golden files are used for both 149a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // C++ and Java TextFormat classes, so we need to conform. 150a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson javaText = javaText.replace(".0\n", "\n"); 151a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 152a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals(allFieldsSetText, javaText); 153a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 154a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Print TestAllExtensions and compare with golden file. */ 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testPrintExtensions() throws Exception { 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville String javaText = TextFormat.printToString(TestUtil.getAllExtensionsSet()); 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Java likes to add a trailing ".0" to floats and doubles. C printf 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // (with %g format) does not. Our golden files are used for both 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // C++ and Java TextFormat classes, so we need to conform. 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville javaText = javaText.replace(".0\n", "\n"); 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(allExtensionsSetText, javaText); 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 167a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Creates an example unknown field set. 168a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private UnknownFieldSet makeUnknownFieldSet() { 169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return UnknownFieldSet.newBuilder() 170a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addField(5, 171a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson UnknownFieldSet.Field.newBuilder() 172a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addVarint(1) 173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addFixed32(2) 174a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addFixed64(3) 175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addLengthDelimited(ByteString.copyFromUtf8("4")) 176a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addGroup( 177a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson UnknownFieldSet.newBuilder() 178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addField(10, 179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson UnknownFieldSet.Field.newBuilder() 180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addVarint(5) 181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .build()) 182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .build()) 183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .build()) 184a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addField(8, 185a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson UnknownFieldSet.Field.newBuilder() 186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addVarint(1) 187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addVarint(2) 188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addVarint(3) 189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .build()) 190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addField(15, 191a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson UnknownFieldSet.Field.newBuilder() 192a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addVarint(0xABCDEF1234567890L) 193a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addFixed32(0xABCD1234) 194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addFixed64(0xABCDEF1234567890L) 195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .build()) 196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .build(); 197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testPrintUnknownFields() throws Exception { 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test printing of unknown fields in a message. 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestEmptyMessage message = 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestEmptyMessage.newBuilder() 204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .setUnknownFields(makeUnknownFieldSet()) 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .build(); 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "5: 1\n" + 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "5: 0x00000002\n" + 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "5: 0x0000000000000003\n" + 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "5: \"4\"\n" + 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "5 {\n" + 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " 10: 5\n" + 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n" + 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "8: 1\n" + 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "8: 2\n" + 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "8: 3\n" + 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "15: 12379813812177893520\n" + 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "15: 0xabcd1234\n" + 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "15: 0xabcdef1234567890\n", 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.printToString(message)); 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testPrintField() throws Exception { 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final FieldDescriptor dataField = 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville OneString.getDescriptor().findFieldByName("data"); 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "data: \"test data\"\n", 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.printFieldToString(dataField, "test data")); 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final FieldDescriptor optionalField = 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestAllTypes.getDescriptor().findFieldByName("optional_nested_message"); 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final Object value = NestedMessage.newBuilder().setBb(42).build(); 234d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_nested_message {\n bb: 42\n}\n", 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.printFieldToString(optionalField, value)); 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 239d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Helper to construct a ByteString from a String containing only 8-bit 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * characters. The characters are converted directly to bytes, *not* 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * encoded using UTF-8. 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private ByteString bytes(String str) throws Exception { 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return ByteString.copyFrom(str.getBytes("ISO-8859-1")); 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Helper to construct a ByteString from a bunch of bytes. The inputs are 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * actually ints so that I can use hex notation and not get stupid errors 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * about precision. 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private ByteString bytes(int... bytesAsInts) { 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville byte[] bytes = new byte[bytesAsInts.length]; 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < bytesAsInts.length; i++) { 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bytes[i] = (byte) bytesAsInts[i]; 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return ByteString.copyFrom(bytes); 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testPrintExotic() throws Exception { 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message message = TestAllTypes.newBuilder() 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Signed vs. unsigned numbers. 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedInt32 (-1) 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedUint32(-1) 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedInt64 (-1) 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedUint64(-1) 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedInt32 (1 << 31) 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedUint32(1 << 31) 272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addRepeatedInt64 (1L << 63) 273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addRepeatedUint64(1L << 63) 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Floats of various precisions and exponents. 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedDouble(123) 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedDouble(123.5) 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedDouble(0.125) 279d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville .addRepeatedDouble(.125) 280d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville .addRepeatedDouble(-.125) 281d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville .addRepeatedDouble(123e15) 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedDouble(123e15) 283d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville .addRepeatedDouble(-1.23e-17) 284d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville .addRepeatedDouble(.23e17) 285d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville .addRepeatedDouble(-23e15) 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedDouble(123.5e20) 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedDouble(123.5e-20) 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedDouble(123.456789) 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedDouble(Double.POSITIVE_INFINITY) 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedDouble(Double.NEGATIVE_INFINITY) 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedDouble(Double.NaN) 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Strings and bytes that needing escaping. 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedString("\0\001\007\b\f\n\r\t\013\\\'\"\u1234") 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .addRepeatedBytes(bytes("\0\001\007\b\f\n\r\t\013\\\'\"\u00fe")) 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .build(); 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 298d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville assertEquals(canonicalExoticText, message.toString()); 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testPrintMessageSet() throws Exception { 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestMessageSet messageSet = 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestMessageSet.newBuilder() 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .setExtension( 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestMessageSetExtension1.messageSetExtension, 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestMessageSetExtension1.newBuilder().setI(123).build()) 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .setExtension( 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestMessageSetExtension2.messageSetExtension, 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestMessageSetExtension2.newBuilder().setStr("foo").build()) 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .build(); 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(messageSetText, messageSet.toString()); 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ================================================================= 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testParse() throws Exception { 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.merge(allFieldsSetText, builder); 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil.assertAllFieldsSet(builder.build()); 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testParseReader() throws Exception { 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.merge(new StringReader(allFieldsSetText), builder); 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil.assertAllFieldsSet(builder.build()); 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testParseExtensions() throws Exception { 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.merge(allExtensionsSetText, 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil.getExtensionRegistry(), 333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville builder); 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil.assertAllExtensionsSet(builder.build()); 335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testParseCompatibility() throws Exception { 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville String original = "repeated_float: inf\n" + 339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: -inf\n" + 340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: nan\n" + 341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: inff\n" + 342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: -inff\n" + 343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: nanf\n" + 344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: 1.0f\n" + 345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: infinityf\n" + 346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: -Infinityf\n" + 347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: infinity\n" + 348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: -infinity\n" + 349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: nan\n"; 350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville String canonical = "repeated_float: Infinity\n" + 351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: -Infinity\n" + 352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: NaN\n" + 353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: Infinity\n" + 354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: -Infinity\n" + 355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: NaN\n" + 356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: 1.0\n" + 357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: Infinity\n" + 358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: -Infinity\n" + 359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: Infinity\n" + 360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: -Infinity\n" + 361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: NaN\n"; 362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.merge(original, builder); 364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(canonical, builder.build().toString()); 365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testParseExotic() throws Exception { 368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.merge(exoticText, builder); 370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Too lazy to check things individually. Don't try to debug this 372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // if testPrintExotic() is failing. 373d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville assertEquals(canonicalExoticText, builder.build().toString()); 374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testParseMessageSet() throws Exception { 377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExtensionRegistry extensionRegistry = ExtensionRegistry.newInstance(); 378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extensionRegistry.add(TestMessageSetExtension1.messageSetExtension); 379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extensionRegistry.add(TestMessageSetExtension2.messageSetExtension); 380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestMessageSet.Builder builder = TestMessageSet.newBuilder(); 382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.merge(messageSetText, extensionRegistry, builder); 383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestMessageSet messageSet = builder.build(); 384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertTrue(messageSet.hasExtension( 386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestMessageSetExtension1.messageSetExtension)); 387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(123, messageSet.getExtension( 388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestMessageSetExtension1.messageSetExtension).getI()); 389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertTrue(messageSet.hasExtension( 390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestMessageSetExtension2.messageSetExtension)); 391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals("foo", messageSet.getExtension( 392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestMessageSetExtension2.messageSetExtension).getStr()); 393a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 394a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson builder = TestMessageSet.newBuilder(); 395a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.merge(messageSetTextWithRepeatedExtension, extensionRegistry, 396a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson builder); 397a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson messageSet = builder.build(); 398a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals(456, messageSet.getExtension( 399a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestMessageSetExtension1.messageSetExtension).getI()); 400a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 401a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 402a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public void testParseMessageSetWithOverwriteForbidden() throws Exception { 403a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ExtensionRegistry extensionRegistry = ExtensionRegistry.newInstance(); 404a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson extensionRegistry.add(TestMessageSetExtension1.messageSetExtension); 405a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson extensionRegistry.add(TestMessageSetExtension2.messageSetExtension); 406a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 407a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestMessageSet.Builder builder = TestMessageSet.newBuilder(); 408a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson parserWithOverwriteForbidden.merge( 409a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson messageSetText, extensionRegistry, builder); 410a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestMessageSet messageSet = builder.build(); 411a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals(123, messageSet.getExtension( 412a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestMessageSetExtension1.messageSetExtension).getI()); 413a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals("foo", messageSet.getExtension( 414a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestMessageSetExtension2.messageSetExtension).getStr()); 415a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 416a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson builder = TestMessageSet.newBuilder(); 417a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson try { 418a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson parserWithOverwriteForbidden.merge( 419a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson messageSetTextWithRepeatedExtension, extensionRegistry, builder); 420a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson fail("expected parse exception"); 421a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } catch (TextFormat.ParseException e) { 422a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals("6:1: Non-repeated field " 423a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson + "\"protobuf_unittest.TestMessageSetExtension1.message_set_extension\"" 424a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson + " cannot be overwritten.", 425a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson e.getMessage()); 426a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testParseNumericEnum() throws Exception { 430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.merge("optional_nested_enum: 2", builder); 432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(TestAllTypes.NestedEnum.BAR, builder.getOptionalNestedEnum()); 433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testParseAngleBrackets() throws Exception { 436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.merge("OptionalGroup: < a: 1 >", builder); 438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertTrue(builder.hasOptionalGroup()); 439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(1, builder.getOptionalGroup().getA()); 440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testParseComment() throws Exception { 443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.merge( 445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "# this is a comment\n" + 446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_int32: 1 # another comment\n" + 447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_int64: 2\n" + 448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "# EOF comment", builder); 449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(1, builder.getOptionalInt32()); 450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(2, builder.getOptionalInt64()); 451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private void assertParseError(String error, String text) { 454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.merge(text, TestUtil.getExtensionRegistry(), builder); 457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fail("Expected parse exception."); 458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (TextFormat.ParseException e) { 459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(error, e.getMessage()); 460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 463a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private void assertParseErrorWithOverwriteForbidden(String error, 464a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson String text) { 465a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 466a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson try { 467a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson parserWithOverwriteForbidden.merge( 468a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson text, TestUtil.getExtensionRegistry(), builder); 469a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson fail("Expected parse exception."); 470a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } catch (TextFormat.ParseException e) { 471a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals(error, e.getMessage()); 472a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 473a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 474a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 475a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private TestAllTypes assertParseSuccessWithOverwriteForbidden( 476a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson String text) throws TextFormat.ParseException { 477a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 478a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson parserWithOverwriteForbidden.merge( 479a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson text, TestUtil.getExtensionRegistry(), builder); 480a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return builder.build(); 481a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 482a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testParseErrors() throws Exception { 484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:16: Expected \":\".", 486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_int32 123"); 487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 488a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "1:23: Expected identifier. Found '?'", 489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_nested_enum: ?"); 490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:18: Couldn't parse integer: Number must be positive: -1", 492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_uint32: -1"); 493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:17: Couldn't parse integer: Number out of range for 32-bit signed " + 495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "integer: 82301481290849012385230157", 496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_int32: 82301481290849012385230157"); 497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:16: Expected \"true\" or \"false\".", 499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_bool: maybe"); 500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 501a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "1:16: Expected \"true\" or \"false\".", 502a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "optional_bool: 2"); 503a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertParseError( 504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:18: Expected string.", 505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_string: 123"); 506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:18: String missing ending quote.", 508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_string: \"ueoauaoe"); 509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:18: String missing ending quote.", 511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_string: \"ueoauaoe\n" + 512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_int32: 123"); 513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:18: Invalid escape sequence: '\\z'", 515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_string: \"\\z\""); 516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:18: String missing ending quote.", 518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_string: \"ueoauaoe\n" + 519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_int32: 123"); 520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:2: Extension \"nosuchext\" not found in the ExtensionRegistry.", 522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "[nosuchext]: 123"); 523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:20: Extension \"protobuf_unittest.optional_int32_extension\" does " + 525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "not extend message type \"protobuf_unittest.TestAllTypes\".", 526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "[protobuf_unittest.optional_int32_extension]: 123"); 527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:1: Message type \"protobuf_unittest.TestAllTypes\" has no field " + 529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "named \"nosuchfield\".", 530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "nosuchfield: 123"); 531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:21: Expected \">\".", 533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "OptionalGroup < a: 1"); 534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:23: Enum type \"protobuf_unittest.TestAllTypes.NestedEnum\" has no " + 536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "value named \"NO_SUCH_VALUE\".", 537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_nested_enum: NO_SUCH_VALUE"); 538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:23: Enum type \"protobuf_unittest.TestAllTypes.NestedEnum\" has no " + 540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "value with number 123.", 541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_nested_enum: 123"); 542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Delimiters must match. 544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 545a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "1:22: Expected identifier. Found '}'", 546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "OptionalGroup < a: 1 }"); 547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertParseError( 548a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "1:22: Expected identifier. Found '>'", 549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "OptionalGroup { a: 1 >"); 550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ================================================================= 553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testEscape() throws Exception { 555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Escape sequences. 556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals("\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"", 557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.escapeBytes(bytes("\0\001\007\b\f\n\r\t\013\\\'\""))); 558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals("\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"", 559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.escapeText("\0\001\007\b\f\n\r\t\013\\\'\"")); 560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(bytes("\0\001\007\b\f\n\r\t\013\\\'\""), 561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.unescapeBytes("\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"")); 562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals("\0\001\007\b\f\n\r\t\013\\\'\"", 563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.unescapeText("\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"")); 564a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals(kEscapeTestStringEscaped, 565a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.escapeText(kEscapeTestString)); 566a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals(kEscapeTestString, 567a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.unescapeText(kEscapeTestStringEscaped)); 568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Unicode handling. 570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals("\\341\\210\\264", TextFormat.escapeText("\u1234")); 571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals("\\341\\210\\264", 572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.escapeBytes(bytes(0xe1, 0x88, 0xb4))); 573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals("\u1234", TextFormat.unescapeText("\\341\\210\\264")); 574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(bytes(0xe1, 0x88, 0xb4), 575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.unescapeBytes("\\341\\210\\264")); 576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals("\u1234", TextFormat.unescapeText("\\xe1\\x88\\xb4")); 577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(bytes(0xe1, 0x88, 0xb4), 578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.unescapeBytes("\\xe1\\x88\\xb4")); 579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 580a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Handling of strings with unescaped Unicode characters > 255. 581a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson final String zh = "\u9999\u6e2f\u4e0a\u6d77\ud84f\udf80\u8c50\u9280\u884c"; 582a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ByteString zhByteString = ByteString.copyFromUtf8(zh); 583a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals(zhByteString, TextFormat.unescapeBytes(zh)); 584a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Errors. 586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.unescapeText("\\x"); 588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fail("Should have thrown an exception."); 589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (TextFormat.InvalidEscapeSequenceException e) { 590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // success 591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.unescapeText("\\z"); 595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fail("Should have thrown an exception."); 596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (TextFormat.InvalidEscapeSequenceException e) { 597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // success 598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.unescapeText("\\"); 602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fail("Should have thrown an exception."); 603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (TextFormat.InvalidEscapeSequenceException e) { 604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // success 605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testParseInteger() throws Exception { 609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 0, TextFormat.parseInt32( "0")); 610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 1, TextFormat.parseInt32( "1")); 611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( -1, TextFormat.parseInt32( "-1")); 612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 12345, TextFormat.parseInt32( "12345")); 613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( -12345, TextFormat.parseInt32( "-12345")); 614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 2147483647, TextFormat.parseInt32( "2147483647")); 615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(-2147483648, TextFormat.parseInt32("-2147483648")); 616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 0, TextFormat.parseUInt32( "0")); 618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 1, TextFormat.parseUInt32( "1")); 619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 12345, TextFormat.parseUInt32( "12345")); 620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 2147483647, TextFormat.parseUInt32("2147483647")); 621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals((int) 2147483648L, TextFormat.parseUInt32("2147483648")); 622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals((int) 4294967295L, TextFormat.parseUInt32("4294967295")); 623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 0L, TextFormat.parseInt64( "0")); 625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 1L, TextFormat.parseInt64( "1")); 626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( -1L, TextFormat.parseInt64( "-1")); 627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 12345L, TextFormat.parseInt64( "12345")); 628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( -12345L, TextFormat.parseInt64( "-12345")); 629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 2147483647L, TextFormat.parseInt64( "2147483647")); 630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(-2147483648L, TextFormat.parseInt64("-2147483648")); 631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 4294967295L, TextFormat.parseInt64( "4294967295")); 632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 4294967296L, TextFormat.parseInt64( "4294967296")); 633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(9223372036854775807L, 634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.parseInt64("9223372036854775807")); 635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(-9223372036854775808L, 636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.parseInt64("-9223372036854775808")); 637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 0L, TextFormat.parseUInt64( "0")); 639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 1L, TextFormat.parseUInt64( "1")); 640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 12345L, TextFormat.parseUInt64( "12345")); 641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 2147483647L, TextFormat.parseUInt64( "2147483647")); 642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 4294967295L, TextFormat.parseUInt64( "4294967295")); 643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals( 4294967296L, TextFormat.parseUInt64( "4294967296")); 644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(9223372036854775807L, 645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.parseUInt64("9223372036854775807")); 646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(-9223372036854775808L, 647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.parseUInt64("9223372036854775808")); 648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(-1L, TextFormat.parseUInt64("18446744073709551615")); 649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Hex 651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(0x1234abcd, TextFormat.parseInt32("0x1234abcd")); 652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(-0x1234abcd, TextFormat.parseInt32("-0x1234abcd")); 653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(-1, TextFormat.parseUInt64("0xffffffffffffffff")); 654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(0x7fffffffffffffffL, 655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.parseInt64("0x7fffffffffffffff")); 656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Octal 658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(01234567, TextFormat.parseInt32("01234567")); 659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Out-of-range 661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.parseInt32("2147483648"); 663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fail("Should have thrown an exception."); 664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (NumberFormatException e) { 665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // success 666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.parseInt32("-2147483649"); 670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fail("Should have thrown an exception."); 671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (NumberFormatException e) { 672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // success 673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.parseUInt32("4294967296"); 677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fail("Should have thrown an exception."); 678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (NumberFormatException e) { 679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // success 680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.parseUInt32("-1"); 684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fail("Should have thrown an exception."); 685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (NumberFormatException e) { 686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // success 687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.parseInt64("9223372036854775808"); 691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fail("Should have thrown an exception."); 692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (NumberFormatException e) { 693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // success 694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.parseInt64("-9223372036854775809"); 698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fail("Should have thrown an exception."); 699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (NumberFormatException e) { 700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // success 701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.parseUInt64("18446744073709551616"); 705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fail("Should have thrown an exception."); 706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (NumberFormatException e) { 707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // success 708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.parseUInt64("-1"); 712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fail("Should have thrown an exception."); 713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (NumberFormatException e) { 714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // success 715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Not a number. 718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.parseInt32("abcd"); 720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fail("Should have thrown an exception."); 721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (NumberFormatException e) { 722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // success 723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 726a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public void testParseString() throws Exception { 727a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson final String zh = "\u9999\u6e2f\u4e0a\u6d77\ud84f\udf80\u8c50\u9280\u884c"; 728a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 729a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.merge("optional_string: \"" + zh + "\"", builder); 730a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals(zh, builder.getOptionalString()); 731a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 732a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testParseLongString() throws Exception { 734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville String longText = 735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890" + 754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "123456789012345678901234567890123456789012345678901234567890"; 755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat.merge("optional_string: \"" + longText + "\"", builder); 758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(longText, builder.getOptionalString()); 759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 760d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 761a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public void testParseBoolean() throws Exception { 762a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson String goodText = 763a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "repeated_bool: t repeated_bool : 0\n" + 764a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "repeated_bool :f repeated_bool:1"; 765a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson String goodTextCanonical = 766a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "repeated_bool: true\n" + 767a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "repeated_bool: false\n" + 768a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "repeated_bool: false\n" + 769a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "repeated_bool: true\n"; 770a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 771a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.merge(goodText, builder); 772a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals(goodTextCanonical, builder.build().toString()); 773a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 774a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson try { 775a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestAllTypes.Builder badBuilder = TestAllTypes.newBuilder(); 776a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.merge("optional_bool:2", badBuilder); 777a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson fail("Should have thrown an exception."); 778a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } catch (TextFormat.ParseException e) { 779a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // success 780a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 781a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson try { 782a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestAllTypes.Builder badBuilder = TestAllTypes.newBuilder(); 783a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.merge("optional_bool: foo", badBuilder); 784a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson fail("Should have thrown an exception."); 785a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } catch (TextFormat.ParseException e) { 786a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // success 787a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 788a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 789a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 790d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville public void testParseAdjacentStringLiterals() throws Exception { 791d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 792d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville TextFormat.merge("optional_string: \"foo\" 'corge' \"grault\"", builder); 793d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville assertEquals("foocorgegrault", builder.getOptionalString()); 794d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 795a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 796a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public void testPrintFieldValue() throws Exception { 797a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertPrintFieldValue("\"Hello\"", "Hello", "repeated_string"); 798a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertPrintFieldValue("123.0", 123f, "repeated_float"); 799a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertPrintFieldValue("123.0", 123d, "repeated_double"); 800a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertPrintFieldValue("123", 123, "repeated_int32"); 801a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertPrintFieldValue("123", 123L, "repeated_int64"); 802a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertPrintFieldValue("true", true, "repeated_bool"); 803a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertPrintFieldValue("4294967295", 0xFFFFFFFF, "repeated_uint32"); 804a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertPrintFieldValue("18446744073709551615", 0xFFFFFFFFFFFFFFFFL, 805a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "repeated_uint64"); 806a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertPrintFieldValue("\"\\001\\002\\003\"", 807a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ByteString.copyFrom(new byte[] {1, 2, 3}), "repeated_bytes"); 808a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 809a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 810a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private void assertPrintFieldValue(String expect, Object value, 811a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson String fieldName) throws Exception { 812a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 813a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson StringBuilder sb = new StringBuilder(); 814a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.printFieldValue( 815a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestAllTypes.getDescriptor().findFieldByName(fieldName), 816a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value, sb); 817a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals(expect, sb.toString()); 818a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 819a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 820a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public void testShortDebugString() { 821a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals("optional_nested_message { bb: 42 } repeated_int32: 1" 822a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson + " repeated_uint32: 2", 823a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.shortDebugString(TestAllTypes.newBuilder() 824a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addRepeatedInt32(1) 825a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addRepeatedUint32(2) 826a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .setOptionalNestedMessage( 827a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson NestedMessage.newBuilder().setBb(42).build()) 828a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .build())); 829a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 830a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 831a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public void testShortDebugString_unknown() { 832a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals("5: 1 5: 0x00000002 5: 0x0000000000000003 5: \"4\" 5 { 10: 5 }" 833a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson + " 8: 1 8: 2 8: 3 15: 12379813812177893520 15: 0xabcd1234 15:" 834a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson + " 0xabcdef1234567890", 835a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.shortDebugString(makeUnknownFieldSet())); 836a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 837a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 838a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public void testPrintToUnicodeString() throws Exception { 839a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals( 840a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "optional_string: \"abc\u3042efg\"\n" + 841a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "optional_bytes: \"\\343\\201\\202\"\n" + 842a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "repeated_string: \"\u3093XYZ\"\n", 843a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.printToUnicodeString(TestAllTypes.newBuilder() 844a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .setOptionalString("abc\u3042efg") 845a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .setOptionalBytes(bytes(0xe3, 0x81, 0x82)) 846a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addRepeatedString("\u3093XYZ") 847a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .build())); 848a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 849a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Double quotes and backslashes should be escaped 850a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals( 851a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "optional_string: \"a\\\\bc\\\"ef\\\"g\"\n", 852a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.printToUnicodeString(TestAllTypes.newBuilder() 853a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .setOptionalString("a\\bc\"ef\"g") 854a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .build())); 855a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 856a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Test escaping roundtrip 857a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestAllTypes message = TestAllTypes.newBuilder() 858a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .setOptionalString("a\\bc\\\"ef\"g") 859a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .build(); 860a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 861a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.merge(TextFormat.printToUnicodeString(message), builder); 862a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals(message.getOptionalString(), builder.getOptionalString()); 863a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 864a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 865a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public void testPrintToUnicodeStringWithNewlines() { 866a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // No newlines at start and end 867a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals("optional_string: \"test newlines\n\nin\nstring\"\n", 868a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.printToUnicodeString(TestAllTypes.newBuilder() 869a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .setOptionalString("test newlines\n\nin\nstring") 870a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .build())); 871a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 872a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Newlines at start and end 873a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals("optional_string: \"\ntest\nnewlines\n\nin\nstring\n\"\n", 874a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.printToUnicodeString(TestAllTypes.newBuilder() 875a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .setOptionalString("\ntest\nnewlines\n\nin\nstring\n") 876a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .build())); 877a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 878a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Strings with 0, 1 and 2 newlines. 879a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals("optional_string: \"\"\n", 880a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.printToUnicodeString(TestAllTypes.newBuilder() 881a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .setOptionalString("") 882a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .build())); 883a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals("optional_string: \"\n\"\n", 884a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.printToUnicodeString(TestAllTypes.newBuilder() 885a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .setOptionalString("\n") 886a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .build())); 887a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals("optional_string: \"\n\n\"\n", 888a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.printToUnicodeString(TestAllTypes.newBuilder() 889a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .setOptionalString("\n\n") 890a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .build())); 891a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 892a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 893a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public void testPrintToUnicodeString_unknown() { 894a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals( 895a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "1: \"\\343\\201\\202\"\n", 896a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.printToUnicodeString(UnknownFieldSet.newBuilder() 897a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addField(1, 898a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson UnknownFieldSet.Field.newBuilder() 899a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .addLengthDelimited(bytes(0xe3, 0x81, 0x82)).build()) 900a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson .build())); 901a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 902a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 903a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public void testParseNonRepeatedFields() throws Exception { 904a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertParseSuccessWithOverwriteForbidden( 905a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "repeated_int32: 1\n" + 906a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "repeated_int32: 2\n"); 907a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertParseSuccessWithOverwriteForbidden( 908a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "RepeatedGroup { a: 1 }\n" + 909a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "RepeatedGroup { a: 2 }\n"); 910a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertParseSuccessWithOverwriteForbidden( 911a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "repeated_nested_message { bb: 1 }\n" + 912a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "repeated_nested_message { bb: 2 }\n"); 913a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertParseErrorWithOverwriteForbidden( 914a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "3:17: Non-repeated field " + 915a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "\"protobuf_unittest.TestAllTypes.optional_int32\" " + 916a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "cannot be overwritten.", 917a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "optional_int32: 1\n" + 918a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "optional_bool: true\n" + 919a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "optional_int32: 1\n"); 920a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertParseErrorWithOverwriteForbidden( 921a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "2:17: Non-repeated field " + 922a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "\"protobuf_unittest.TestAllTypes.optionalgroup\" " + 923a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "cannot be overwritten.", 924a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "OptionalGroup { a: 1 }\n" + 925a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "OptionalGroup { }\n"); 926a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertParseErrorWithOverwriteForbidden( 927a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "2:33: Non-repeated field " + 928a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "\"protobuf_unittest.TestAllTypes.optional_nested_message\" " + 929a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "cannot be overwritten.", 930a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "optional_nested_message { }\n" + 931a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "optional_nested_message { bb: 3 }\n"); 932a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertParseErrorWithOverwriteForbidden( 933a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "2:16: Non-repeated field " + 934a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "\"protobuf_unittest.TestAllTypes.default_int32\" " + 935a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "cannot be overwritten.", 936a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "default_int32: 41\n" + // the default value 937a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "default_int32: 41\n"); 938a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertParseErrorWithOverwriteForbidden( 939a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "2:17: Non-repeated field " + 940a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "\"protobuf_unittest.TestAllTypes.default_string\" " + 941a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "cannot be overwritten.", 942a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "default_string: \"zxcv\"\n" + 943a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "default_string: \"asdf\"\n"); 944a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 945a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 946a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public void testParseShortRepeatedFormOfRepeatedFields() throws Exception { 947a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertParseSuccessWithOverwriteForbidden("repeated_foreign_enum: [FOREIGN_FOO, FOREIGN_BAR]"); 948a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertParseSuccessWithOverwriteForbidden("repeated_int32: [ 1, 2 ]\n"); 949a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertParseSuccessWithOverwriteForbidden("RepeatedGroup [{ a: 1 },{ a: 2 }]\n"); 950a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertParseSuccessWithOverwriteForbidden("repeated_nested_message [{ bb: 1 }, { bb: 2 }]\n"); 951a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 952a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 953a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public void testParseShortRepeatedFormOfNonRepeatedFields() throws Exception { 954a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertParseErrorWithOverwriteForbidden( 955a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "1:17: Couldn't parse integer: For input string: \"[\"", 956a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "optional_int32: [1]\n"); 957a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 958a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 959a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // ======================================================================= 960a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // test oneof 961a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 962a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public void testOneofTextFormat() throws Exception { 963a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestOneof2.Builder builder = TestOneof2.newBuilder(); 964a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil.setOneof(builder); 965a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestOneof2 message = builder.build(); 966a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestOneof2.Builder dest = TestOneof2.newBuilder(); 967a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TextFormat.merge(TextFormat.printToUnicodeString(message), dest); 968a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil.assertOneofSet(dest.build()); 969a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 970a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 971a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public void testOneofOverwriteForbidden() throws Exception { 972a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson String input = "foo_string: \"stringvalue\" foo_int: 123"; 973a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestOneof2.Builder builder = TestOneof2.newBuilder(); 974a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson try { 975a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson parserWithOverwriteForbidden.merge( 976a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson input, TestUtil.getExtensionRegistry(), builder); 977a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson fail("Expected parse exception."); 978a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } catch (TextFormat.ParseException e) { 979a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertEquals("1:36: Field \"protobuf_unittest.TestOneof2.foo_int\"" 980a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson + " is specified along with field \"protobuf_unittest.TestOneof2.foo_string\"," 981a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson + " another member of oneof \"foo\".", e.getMessage()); 982a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 983a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 984a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 985a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public void testOneofOverwriteAllowed() throws Exception { 986a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson String input = "foo_string: \"stringvalue\" foo_int: 123"; 987a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestOneof2.Builder builder = TestOneof2.newBuilder(); 988a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson defaultParser.merge(input, TestUtil.getExtensionRegistry(), builder); 989a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Only the last value sticks. 990a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestOneof2 oneof = builder.build(); 991a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertFalse(oneof.hasFooString()); 992a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson assertTrue(oneof.hasFooInt()); 993a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 995