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