| Index: third_party/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java
|
| diff --git a/third_party/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java b/third_party/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..70812b953f57ff7335eb7c6e183eda8b414e8b44
|
| --- /dev/null
|
| +++ b/third_party/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java
|
| @@ -0,0 +1,1661 @@
|
| +// Protocol Buffers - Google's data interchange format
|
| +// Copyright 2008 Google Inc. All rights reserved.
|
| +// https://developers.google.com/protocol-buffers/
|
| +//
|
| +// Redistribution and use in source and binary forms, with or without
|
| +// modification, are permitted provided that the following conditions are
|
| +// met:
|
| +//
|
| +// * Redistributions of source code must retain the above copyright
|
| +// notice, this list of conditions and the following disclaimer.
|
| +// * Redistributions in binary form must reproduce the above
|
| +// copyright notice, this list of conditions and the following disclaimer
|
| +// in the documentation and/or other materials provided with the
|
| +// distribution.
|
| +// * Neither the name of Google Inc. nor the names of its
|
| +// contributors may be used to endorse or promote products derived from
|
| +// this software without specific prior written permission.
|
| +//
|
| +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| +
|
| +package com.google.protobuf;
|
| +
|
| +import com.google.protobuf.Descriptors.Descriptor;
|
| +import com.google.protobuf.Descriptors.FieldDescriptor;
|
| +import com.google.protobuf.UnittestLite.TestAllExtensionsLite;
|
| +import com.google.protobuf.test.UnittestImport;
|
| +import protobuf_unittest.EnumWithNoOuter;
|
| +import protobuf_unittest.MessageWithNoOuter;
|
| +import protobuf_unittest.MultipleFilesTestProto;
|
| +import protobuf_unittest.NestedExtension.MyNestedExtension;
|
| +import protobuf_unittest.NestedExtensionLite.MyNestedExtensionLite;
|
| +import protobuf_unittest.NonNestedExtension;
|
| +import protobuf_unittest.NonNestedExtension.MessageToBeExtended;
|
| +import protobuf_unittest.NonNestedExtension.MyNonNestedExtension;
|
| +import protobuf_unittest.NonNestedExtensionLite;
|
| +import protobuf_unittest.NonNestedExtensionLite.MessageLiteToBeExtended;
|
| +import protobuf_unittest.NonNestedExtensionLite.MyNonNestedExtensionLite;
|
| +import protobuf_unittest.OuterClassNameTest2OuterClass;
|
| +import protobuf_unittest.OuterClassNameTest3OuterClass;
|
| +import protobuf_unittest.OuterClassNameTestOuterClass;
|
| +import protobuf_unittest.ServiceWithNoOuter;
|
| +import protobuf_unittest.UnittestOptimizeFor.TestOptimizedForSize;
|
| +import protobuf_unittest.UnittestOptimizeFor.TestOptionalOptimizedForSize;
|
| +import protobuf_unittest.UnittestOptimizeFor.TestRequiredOptimizedForSize;
|
| +import protobuf_unittest.UnittestProto;
|
| +import protobuf_unittest.UnittestProto.ForeignEnum;
|
| +import protobuf_unittest.UnittestProto.ForeignMessage;
|
| +import protobuf_unittest.UnittestProto.ForeignMessageOrBuilder;
|
| +import protobuf_unittest.UnittestProto.NestedTestAllTypes;
|
| +import protobuf_unittest.UnittestProto.TestAllExtensions;
|
| +import protobuf_unittest.UnittestProto.TestAllTypes;
|
| +import protobuf_unittest.UnittestProto.TestAllTypes.NestedMessage;
|
| +import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder;
|
| +import protobuf_unittest.UnittestProto.TestExtremeDefaultValues;
|
| +import protobuf_unittest.UnittestProto.TestOneof2;
|
| +import protobuf_unittest.UnittestProto.TestPackedTypes;
|
| +import protobuf_unittest.UnittestProto.TestUnpackedTypes;
|
| +
|
| +import junit.framework.TestCase;
|
| +
|
| +import java.io.ByteArrayInputStream;
|
| +import java.io.ByteArrayOutputStream;
|
| +import java.io.ObjectInputStream;
|
| +import java.io.ObjectOutputStream;
|
| +import java.util.Arrays;
|
| +import java.util.Collections;
|
| +import java.util.Iterator;
|
| +import java.util.List;
|
| +
|
| +/**
|
| + * Unit test for generated messages and generated code. See also
|
| + * {@link MessageTest}, which tests some generated message functionality.
|
| + *
|
| + * @author kenton@google.com Kenton Varda
|
| + */
|
| +public class GeneratedMessageTest extends TestCase {
|
| + TestUtil.ReflectionTester reflectionTester =
|
| + new TestUtil.ReflectionTester(TestAllTypes.getDescriptor(), null);
|
| +
|
| + public void testDefaultInstance() throws Exception {
|
| + assertSame(TestAllTypes.getDefaultInstance(),
|
| + TestAllTypes.getDefaultInstance().getDefaultInstanceForType());
|
| + assertSame(TestAllTypes.getDefaultInstance(),
|
| + TestAllTypes.newBuilder().getDefaultInstanceForType());
|
| + }
|
| +
|
| + public void testMessageOrBuilder() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + TestUtil.setAllFields(builder);
|
| + TestAllTypes message = builder.build();
|
| + TestUtil.assertAllFieldsSet(message);
|
| + }
|
| +
|
| + public void testUsingBuilderMultipleTimes() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + // primitive field scalar and repeated
|
| + builder.setOptionalSfixed64(100);
|
| + builder.addRepeatedInt32(100);
|
| + // enum field scalar and repeated
|
| + builder.setOptionalImportEnum(UnittestImport.ImportEnum.IMPORT_BAR);
|
| + builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR);
|
| + // proto field scalar and repeated
|
| + builder.setOptionalForeignMessage(ForeignMessage.newBuilder().setC(1));
|
| + builder.addRepeatedForeignMessage(ForeignMessage.newBuilder().setC(1));
|
| +
|
| + TestAllTypes value1 = builder.build();
|
| +
|
| + assertEquals(100, value1.getOptionalSfixed64());
|
| + assertEquals(100, value1.getRepeatedInt32(0));
|
| + assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,
|
| + value1.getOptionalImportEnum());
|
| + assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,
|
| + value1.getRepeatedImportEnum(0));
|
| + assertEquals(1, value1.getOptionalForeignMessage().getC());
|
| + assertEquals(1, value1.getRepeatedForeignMessage(0).getC());
|
| +
|
| + // Make sure that builder didn't update previously created values
|
| + builder.setOptionalSfixed64(200);
|
| + builder.setRepeatedInt32(0, 200);
|
| + builder.setOptionalImportEnum(UnittestImport.ImportEnum.IMPORT_FOO);
|
| + builder.setRepeatedImportEnum(0, UnittestImport.ImportEnum.IMPORT_FOO);
|
| + builder.setOptionalForeignMessage(ForeignMessage.newBuilder().setC(2));
|
| + builder.setRepeatedForeignMessage(0, ForeignMessage.newBuilder().setC(2));
|
| +
|
| + TestAllTypes value2 = builder.build();
|
| +
|
| + // Make sure value1 didn't change.
|
| + assertEquals(100, value1.getOptionalSfixed64());
|
| + assertEquals(100, value1.getRepeatedInt32(0));
|
| + assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,
|
| + value1.getOptionalImportEnum());
|
| + assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,
|
| + value1.getRepeatedImportEnum(0));
|
| + assertEquals(1, value1.getOptionalForeignMessage().getC());
|
| + assertEquals(1, value1.getRepeatedForeignMessage(0).getC());
|
| +
|
| + // Make sure value2 is correct
|
| + assertEquals(200, value2.getOptionalSfixed64());
|
| + assertEquals(200, value2.getRepeatedInt32(0));
|
| + assertEquals(UnittestImport.ImportEnum.IMPORT_FOO,
|
| + value2.getOptionalImportEnum());
|
| + assertEquals(UnittestImport.ImportEnum.IMPORT_FOO,
|
| + value2.getRepeatedImportEnum(0));
|
| + assertEquals(2, value2.getOptionalForeignMessage().getC());
|
| + assertEquals(2, value2.getRepeatedForeignMessage(0).getC());
|
| + }
|
| +
|
| + public void testProtosShareRepeatedArraysIfDidntChange() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + builder.addRepeatedInt32(100);
|
| + builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance());
|
| +
|
| + TestAllTypes value1 = builder.build();
|
| + TestAllTypes value2 = value1.toBuilder().build();
|
| +
|
| + assertSame(value1.getRepeatedInt32List(), value2.getRepeatedInt32List());
|
| + assertSame(value1.getRepeatedForeignMessageList(),
|
| + value2.getRepeatedForeignMessageList());
|
| + }
|
| +
|
| + public void testRepeatedArraysAreImmutable() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + builder.addRepeatedInt32(100);
|
| + builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR);
|
| + builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance());
|
| + assertIsUnmodifiable(builder.getRepeatedInt32List());
|
| + assertIsUnmodifiable(builder.getRepeatedImportEnumList());
|
| + assertIsUnmodifiable(builder.getRepeatedForeignMessageList());
|
| + assertIsUnmodifiable(builder.getRepeatedFloatList());
|
| +
|
| +
|
| + TestAllTypes value = builder.build();
|
| + assertIsUnmodifiable(value.getRepeatedInt32List());
|
| + assertIsUnmodifiable(value.getRepeatedImportEnumList());
|
| + assertIsUnmodifiable(value.getRepeatedForeignMessageList());
|
| + assertIsUnmodifiable(value.getRepeatedFloatList());
|
| + }
|
| +
|
| + public void testParsedMessagesAreImmutable() throws Exception {
|
| + TestAllTypes value = TestAllTypes.parser().parseFrom(TestUtil.getAllSet().toByteString());
|
| + assertIsUnmodifiable(value.getRepeatedInt32List());
|
| + assertIsUnmodifiable(value.getRepeatedInt64List());
|
| + assertIsUnmodifiable(value.getRepeatedUint32List());
|
| + assertIsUnmodifiable(value.getRepeatedUint64List());
|
| + assertIsUnmodifiable(value.getRepeatedSint32List());
|
| + assertIsUnmodifiable(value.getRepeatedSint64List());
|
| + assertIsUnmodifiable(value.getRepeatedFixed32List());
|
| + assertIsUnmodifiable(value.getRepeatedFixed64List());
|
| + assertIsUnmodifiable(value.getRepeatedSfixed32List());
|
| + assertIsUnmodifiable(value.getRepeatedSfixed64List());
|
| + assertIsUnmodifiable(value.getRepeatedFloatList());
|
| + assertIsUnmodifiable(value.getRepeatedDoubleList());
|
| + assertIsUnmodifiable(value.getRepeatedBoolList());
|
| + assertIsUnmodifiable(value.getRepeatedStringList());
|
| + assertIsUnmodifiable(value.getRepeatedBytesList());
|
| + assertIsUnmodifiable(value.getRepeatedGroupList());
|
| + assertIsUnmodifiable(value.getRepeatedNestedMessageList());
|
| + assertIsUnmodifiable(value.getRepeatedForeignMessageList());
|
| + assertIsUnmodifiable(value.getRepeatedImportMessageList());
|
| + assertIsUnmodifiable(value.getRepeatedNestedEnumList());
|
| + assertIsUnmodifiable(value.getRepeatedForeignEnumList());
|
| + assertIsUnmodifiable(value.getRepeatedImportEnumList());
|
| + }
|
| +
|
| + private void assertIsUnmodifiable(List<?> list) {
|
| + if (list == Collections.emptyList()) {
|
| + // OKAY -- Need to check this b/c EmptyList allows you to call clear.
|
| + } else {
|
| + try {
|
| + list.clear();
|
| + fail("List wasn't immutable");
|
| + } catch (UnsupportedOperationException e) {
|
| + // good
|
| + }
|
| + }
|
| + }
|
| +
|
| + public void testSettersRejectNull() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + try {
|
| + builder.setOptionalString(null);
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.setOptionalBytes(null);
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.setOptionalNestedMessage((TestAllTypes.NestedMessage) null);
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.setOptionalNestedMessage(
|
| + (TestAllTypes.NestedMessage.Builder) null);
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.setOptionalNestedEnum(null);
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.addRepeatedString(null);
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.addRepeatedBytes(null);
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.addRepeatedNestedMessage((TestAllTypes.NestedMessage) null);
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.addRepeatedNestedMessage(
|
| + (TestAllTypes.NestedMessage.Builder) null);
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.addRepeatedNestedEnum(null);
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| + }
|
| +
|
| + public void testRepeatedSetters() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + TestUtil.setAllFields(builder);
|
| + TestUtil.modifyRepeatedFields(builder);
|
| + TestAllTypes message = builder.build();
|
| + TestUtil.assertRepeatedFieldsModified(message);
|
| + }
|
| +
|
| + public void testRepeatedSettersRejectNull() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| +
|
| + builder.addRepeatedString("one");
|
| + builder.addRepeatedString("two");
|
| + try {
|
| + builder.setRepeatedString(1, null);
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| +
|
| + builder.addRepeatedBytes(TestUtil.toBytes("one"));
|
| + builder.addRepeatedBytes(TestUtil.toBytes("two"));
|
| + try {
|
| + builder.setRepeatedBytes(1, null);
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| +
|
| + builder.addRepeatedNestedMessage(
|
| + TestAllTypes.NestedMessage.newBuilder().setBb(218).build());
|
| + builder.addRepeatedNestedMessage(
|
| + TestAllTypes.NestedMessage.newBuilder().setBb(456).build());
|
| + try {
|
| + builder.setRepeatedNestedMessage(1, (TestAllTypes.NestedMessage) null);
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.setRepeatedNestedMessage(
|
| + 1, (TestAllTypes.NestedMessage.Builder) null);
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| +
|
| + builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.FOO);
|
| + builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAR);
|
| + try {
|
| + builder.setRepeatedNestedEnum(1, null);
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| + }
|
| +
|
| + public void testRepeatedAppend() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| +
|
| + builder.addAllRepeatedInt32(Arrays.asList(1, 2, 3, 4));
|
| + builder.addAllRepeatedForeignEnum(Arrays.asList(ForeignEnum.FOREIGN_BAZ));
|
| +
|
| + ForeignMessage foreignMessage =
|
| + ForeignMessage.newBuilder().setC(12).build();
|
| + builder.addAllRepeatedForeignMessage(Arrays.asList(foreignMessage));
|
| +
|
| + TestAllTypes message = builder.build();
|
| + assertEquals(message.getRepeatedInt32List(), Arrays.asList(1, 2, 3, 4));
|
| + assertEquals(message.getRepeatedForeignEnumList(),
|
| + Arrays.asList(ForeignEnum.FOREIGN_BAZ));
|
| + assertEquals(1, message.getRepeatedForeignMessageCount());
|
| + assertEquals(12, message.getRepeatedForeignMessage(0).getC());
|
| + }
|
| +
|
| + public void testRepeatedAppendRejectsNull() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| +
|
| + ForeignMessage foreignMessage =
|
| + ForeignMessage.newBuilder().setC(12).build();
|
| + try {
|
| + builder.addAllRepeatedForeignMessage(
|
| + Arrays.asList(foreignMessage, (ForeignMessage) null));
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| +
|
| + try {
|
| + builder.addAllRepeatedForeignEnum(
|
| + Arrays.asList(ForeignEnum.FOREIGN_BAZ, null));
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| +
|
| + try {
|
| + builder.addAllRepeatedString(Arrays.asList("one", null));
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| +
|
| + try {
|
| + builder.addAllRepeatedBytes(Arrays.asList(TestUtil.toBytes("one"), null));
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| + }
|
| +
|
| + public void testRepeatedAppendIterateOnlyOnce() throws Exception {
|
| + // Create a Iterable that can only be iterated once.
|
| + Iterable<String> stringIterable = new Iterable<String>() {
|
| + private boolean called = false;
|
| + @Override
|
| + public Iterator<String> iterator() {
|
| + if (called) {
|
| + throw new IllegalStateException();
|
| + }
|
| + called = true;
|
| + return Arrays.asList("one", "two", "three").iterator();
|
| + }
|
| + };
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + builder.addAllRepeatedString(stringIterable);
|
| + assertEquals(3, builder.getRepeatedStringCount());
|
| + assertEquals("one", builder.getRepeatedString(0));
|
| + assertEquals("two", builder.getRepeatedString(1));
|
| + assertEquals("three", builder.getRepeatedString(2));
|
| +
|
| + try {
|
| + builder.addAllRepeatedString(stringIterable);
|
| + fail("Exception was not thrown");
|
| + } catch (IllegalStateException e) {
|
| + // We expect this exception.
|
| + }
|
| + }
|
| +
|
| + public void testMergeFromOtherRejectsNull() throws Exception {
|
| + try {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + builder.mergeFrom((TestAllTypes) null);
|
| + fail("Exception was not thrown");
|
| + } catch (NullPointerException e) {
|
| + // We expect this exception.
|
| + }
|
| + }
|
| +
|
| + public void testSettingForeignMessageUsingBuilder() throws Exception {
|
| + TestAllTypes message = TestAllTypes.newBuilder()
|
| + // Pass builder for foreign message instance.
|
| + .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(123))
|
| + .build();
|
| + TestAllTypes expectedMessage = TestAllTypes.newBuilder()
|
| + // Create expected version passing foreign message instance explicitly.
|
| + .setOptionalForeignMessage(
|
| + ForeignMessage.newBuilder().setC(123).build())
|
| + .build();
|
| + // TODO(ngd): Upgrade to using real #equals method once implemented
|
| + assertEquals(expectedMessage.toString(), message.toString());
|
| + }
|
| +
|
| + public void testSettingRepeatedForeignMessageUsingBuilder() throws Exception {
|
| + TestAllTypes message = TestAllTypes.newBuilder()
|
| + // Pass builder for foreign message instance.
|
| + .addRepeatedForeignMessage(ForeignMessage.newBuilder().setC(456))
|
| + .build();
|
| + TestAllTypes expectedMessage = TestAllTypes.newBuilder()
|
| + // Create expected version passing foreign message instance explicitly.
|
| + .addRepeatedForeignMessage(
|
| + ForeignMessage.newBuilder().setC(456).build())
|
| + .build();
|
| + assertEquals(expectedMessage.toString(), message.toString());
|
| + }
|
| +
|
| + public void testDefaults() throws Exception {
|
| + TestUtil.assertClear(TestAllTypes.getDefaultInstance());
|
| + TestUtil.assertClear(TestAllTypes.newBuilder().build());
|
| +
|
| + TestExtremeDefaultValues message =
|
| + TestExtremeDefaultValues.getDefaultInstance();
|
| + assertEquals("\u1234", message.getUtf8String());
|
| + assertEquals(Double.POSITIVE_INFINITY, message.getInfDouble());
|
| + assertEquals(Double.NEGATIVE_INFINITY, message.getNegInfDouble());
|
| + assertTrue(Double.isNaN(message.getNanDouble()));
|
| + assertEquals(Float.POSITIVE_INFINITY, message.getInfFloat());
|
| + assertEquals(Float.NEGATIVE_INFINITY, message.getNegInfFloat());
|
| + assertTrue(Float.isNaN(message.getNanFloat()));
|
| + assertEquals("? ? ?? ?? ??? ??/ ??-", message.getCppTrigraph());
|
| + }
|
| +
|
| + public void testClear() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + TestUtil.assertClear(builder);
|
| + TestUtil.setAllFields(builder);
|
| + builder.clear();
|
| + TestUtil.assertClear(builder);
|
| + }
|
| +
|
| + public void testReflectionGetters() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + TestUtil.setAllFields(builder);
|
| + reflectionTester.assertAllFieldsSetViaReflection(builder);
|
| +
|
| + TestAllTypes message = builder.build();
|
| + reflectionTester.assertAllFieldsSetViaReflection(message);
|
| + }
|
| +
|
| + public void testReflectionSetters() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + reflectionTester.setAllFieldsViaReflection(builder);
|
| + TestUtil.assertAllFieldsSet(builder);
|
| +
|
| + TestAllTypes message = builder.build();
|
| + TestUtil.assertAllFieldsSet(message);
|
| + }
|
| +
|
| + public void testReflectionSettersRejectNull() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + reflectionTester.assertReflectionSettersRejectNull(builder);
|
| + }
|
| +
|
| + public void testReflectionRepeatedSetters() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + reflectionTester.setAllFieldsViaReflection(builder);
|
| + reflectionTester.modifyRepeatedFieldsViaReflection(builder);
|
| + TestUtil.assertRepeatedFieldsModified(builder);
|
| +
|
| + TestAllTypes message = builder.build();
|
| + TestUtil.assertRepeatedFieldsModified(message);
|
| + }
|
| +
|
| + public void testReflectionRepeatedSettersRejectNull() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + reflectionTester.assertReflectionRepeatedSettersRejectNull(builder);
|
| + }
|
| +
|
| + public void testReflectionDefaults() throws Exception {
|
| + reflectionTester.assertClearViaReflection(
|
| + TestAllTypes.getDefaultInstance());
|
| + reflectionTester.assertClearViaReflection(
|
| + TestAllTypes.newBuilder().build());
|
| + }
|
| +
|
| + public void testReflectionGetOneof() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + reflectionTester.setAllFieldsViaReflection(builder);
|
| + Descriptors.OneofDescriptor oneof =
|
| + TestAllTypes.getDescriptor().getOneofs().get(0);
|
| + Descriptors.FieldDescriptor field =
|
| + TestAllTypes.getDescriptor().findFieldByName("oneof_bytes");
|
| + assertSame(field, builder.getOneofFieldDescriptor(oneof));
|
| +
|
| + TestAllTypes message = builder.build();
|
| + assertSame(field, message.getOneofFieldDescriptor(oneof));
|
| + }
|
| +
|
| + public void testReflectionClearOneof() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + reflectionTester.setAllFieldsViaReflection(builder);
|
| + Descriptors.OneofDescriptor oneof =
|
| + TestAllTypes.getDescriptor().getOneofs().get(0);
|
| + Descriptors.FieldDescriptor field =
|
| + TestAllTypes.getDescriptor().findFieldByName("oneof_bytes");
|
| +
|
| + assertTrue(builder.hasOneof(oneof));
|
| + assertTrue(builder.hasField(field));
|
| + builder.clearOneof(oneof);
|
| + assertFalse(builder.hasOneof(oneof));
|
| + assertFalse(builder.hasField(field));
|
| + }
|
| +
|
| + public void testEnumInterface() throws Exception {
|
| + assertTrue(TestAllTypes.getDefaultInstance().getDefaultNestedEnum()
|
| + instanceof ProtocolMessageEnum);
|
| + }
|
| +
|
| + public void testEnumMap() throws Exception {
|
| + Internal.EnumLiteMap<ForeignEnum> map = ForeignEnum.internalGetValueMap();
|
| +
|
| + for (ForeignEnum value : ForeignEnum.values()) {
|
| + assertEquals(value, map.findValueByNumber(value.getNumber()));
|
| + }
|
| +
|
| + assertTrue(map.findValueByNumber(12345) == null);
|
| + }
|
| +
|
| + public void testParsePackedToUnpacked() throws Exception {
|
| + TestUnpackedTypes.Builder builder = TestUnpackedTypes.newBuilder();
|
| + TestUnpackedTypes message =
|
| + builder.mergeFrom(TestUtil.getPackedSet().toByteString()).build();
|
| + TestUtil.assertUnpackedFieldsSet(message);
|
| + }
|
| +
|
| + public void testParseUnpackedToPacked() throws Exception {
|
| + TestPackedTypes.Builder builder = TestPackedTypes.newBuilder();
|
| + TestPackedTypes message =
|
| + builder.mergeFrom(TestUtil.getUnpackedSet().toByteString()).build();
|
| + TestUtil.assertPackedFieldsSet(message);
|
| + }
|
| +
|
| + // =================================================================
|
| + // Extensions.
|
| +
|
| + TestUtil.ReflectionTester extensionsReflectionTester =
|
| + new TestUtil.ReflectionTester(TestAllExtensions.getDescriptor(),
|
| + TestUtil.getExtensionRegistry());
|
| +
|
| + public void testExtensionMessageOrBuilder() throws Exception {
|
| + TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
|
| + TestUtil.setAllExtensions(builder);
|
| + TestAllExtensions message = builder.build();
|
| + TestUtil.assertAllExtensionsSet(message);
|
| + }
|
| +
|
| + public void testExtensionRepeatedSetters() throws Exception {
|
| + TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
|
| + TestUtil.setAllExtensions(builder);
|
| + TestUtil.modifyRepeatedExtensions(builder);
|
| + TestAllExtensions message = builder.build();
|
| + TestUtil.assertRepeatedExtensionsModified(message);
|
| + }
|
| +
|
| + public void testExtensionDefaults() throws Exception {
|
| + TestUtil.assertExtensionsClear(TestAllExtensions.getDefaultInstance());
|
| + TestUtil.assertExtensionsClear(TestAllExtensions.newBuilder().build());
|
| + }
|
| +
|
| + public void testExtensionReflectionGetters() throws Exception {
|
| + TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
|
| + TestUtil.setAllExtensions(builder);
|
| + extensionsReflectionTester.assertAllFieldsSetViaReflection(builder);
|
| +
|
| + TestAllExtensions message = builder.build();
|
| + extensionsReflectionTester.assertAllFieldsSetViaReflection(message);
|
| + }
|
| +
|
| + public void testExtensionReflectionSetters() throws Exception {
|
| + TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
|
| + extensionsReflectionTester.setAllFieldsViaReflection(builder);
|
| + TestUtil.assertAllExtensionsSet(builder);
|
| +
|
| + TestAllExtensions message = builder.build();
|
| + TestUtil.assertAllExtensionsSet(message);
|
| + }
|
| +
|
| + public void testExtensionReflectionSettersRejectNull() throws Exception {
|
| + TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
|
| + extensionsReflectionTester.assertReflectionSettersRejectNull(builder);
|
| + }
|
| +
|
| + public void testExtensionReflectionRepeatedSetters() throws Exception {
|
| + TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
|
| + extensionsReflectionTester.setAllFieldsViaReflection(builder);
|
| + extensionsReflectionTester.modifyRepeatedFieldsViaReflection(builder);
|
| + TestUtil.assertRepeatedExtensionsModified(builder);
|
| +
|
| + TestAllExtensions message = builder.build();
|
| + TestUtil.assertRepeatedExtensionsModified(message);
|
| + }
|
| +
|
| + public void testExtensionReflectionRepeatedSettersRejectNull()
|
| + throws Exception {
|
| + TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
|
| + extensionsReflectionTester.assertReflectionRepeatedSettersRejectNull(
|
| + builder);
|
| + }
|
| +
|
| + public void testExtensionReflectionDefaults() throws Exception {
|
| + extensionsReflectionTester.assertClearViaReflection(
|
| + TestAllExtensions.getDefaultInstance());
|
| + extensionsReflectionTester.assertClearViaReflection(
|
| + TestAllExtensions.newBuilder().build());
|
| + }
|
| +
|
| + public void testClearExtension() throws Exception {
|
| + // clearExtension() is not actually used in TestUtil, so try it manually.
|
| + assertFalse(
|
| + TestAllExtensions.newBuilder()
|
| + .setExtension(UnittestProto.optionalInt32Extension, 1)
|
| + .clearExtension(UnittestProto.optionalInt32Extension)
|
| + .hasExtension(UnittestProto.optionalInt32Extension));
|
| + assertEquals(0,
|
| + TestAllExtensions.newBuilder()
|
| + .addExtension(UnittestProto.repeatedInt32Extension, 1)
|
| + .clearExtension(UnittestProto.repeatedInt32Extension)
|
| + .getExtensionCount(UnittestProto.repeatedInt32Extension));
|
| + }
|
| +
|
| + public void testExtensionCopy() throws Exception {
|
| + TestAllExtensions original = TestUtil.getAllExtensionsSet();
|
| + TestAllExtensions copy = TestAllExtensions.newBuilder(original).build();
|
| + TestUtil.assertAllExtensionsSet(copy);
|
| + }
|
| +
|
| + public void testExtensionMergeFrom() throws Exception {
|
| + TestAllExtensions original =
|
| + TestAllExtensions.newBuilder()
|
| + .setExtension(UnittestProto.optionalInt32Extension, 1).build();
|
| + TestAllExtensions merged =
|
| + TestAllExtensions.newBuilder().mergeFrom(original).build();
|
| + assertTrue(merged.hasExtension(UnittestProto.optionalInt32Extension));
|
| + assertEquals(
|
| + 1, (int) merged.getExtension(UnittestProto.optionalInt32Extension));
|
| + }
|
| +
|
| + // =================================================================
|
| + // Lite Extensions.
|
| +
|
| + // We test lite extensions directly because they have a separate
|
| + // implementation from full extensions. In contrast, we do not test
|
| + // lite fields directly since they are implemented exactly the same as
|
| + // regular fields.
|
| +
|
| + public void testLiteExtensionMessageOrBuilder() throws Exception {
|
| + TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder();
|
| + TestUtil.setAllExtensions(builder);
|
| + TestUtil.assertAllExtensionsSet(builder);
|
| +
|
| + TestAllExtensionsLite message = builder.build();
|
| + TestUtil.assertAllExtensionsSet(message);
|
| + }
|
| +
|
| + public void testLiteExtensionRepeatedSetters() throws Exception {
|
| + TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder();
|
| + TestUtil.setAllExtensions(builder);
|
| + TestUtil.modifyRepeatedExtensions(builder);
|
| + TestUtil.assertRepeatedExtensionsModified(builder);
|
| +
|
| + TestAllExtensionsLite message = builder.build();
|
| + TestUtil.assertRepeatedExtensionsModified(message);
|
| + }
|
| +
|
| + public void testLiteExtensionDefaults() throws Exception {
|
| + TestUtil.assertExtensionsClear(TestAllExtensionsLite.getDefaultInstance());
|
| + TestUtil.assertExtensionsClear(TestAllExtensionsLite.newBuilder().build());
|
| + }
|
| +
|
| + public void testClearLiteExtension() throws Exception {
|
| + // clearExtension() is not actually used in TestUtil, so try it manually.
|
| + assertFalse(
|
| + TestAllExtensionsLite.newBuilder()
|
| + .setExtension(UnittestLite.optionalInt32ExtensionLite, 1)
|
| + .clearExtension(UnittestLite.optionalInt32ExtensionLite)
|
| + .hasExtension(UnittestLite.optionalInt32ExtensionLite));
|
| + assertEquals(0,
|
| + TestAllExtensionsLite.newBuilder()
|
| + .addExtension(UnittestLite.repeatedInt32ExtensionLite, 1)
|
| + .clearExtension(UnittestLite.repeatedInt32ExtensionLite)
|
| + .getExtensionCount(UnittestLite.repeatedInt32ExtensionLite));
|
| + }
|
| +
|
| + public void testLiteExtensionCopy() throws Exception {
|
| + TestAllExtensionsLite original = TestUtil.getAllLiteExtensionsSet();
|
| + TestAllExtensionsLite copy =
|
| + TestAllExtensionsLite.newBuilder(original).build();
|
| + TestUtil.assertAllExtensionsSet(copy);
|
| + }
|
| +
|
| + public void testLiteExtensionMergeFrom() throws Exception {
|
| + TestAllExtensionsLite original =
|
| + TestAllExtensionsLite.newBuilder()
|
| + .setExtension(UnittestLite.optionalInt32ExtensionLite, 1).build();
|
| + TestAllExtensionsLite merged =
|
| + TestAllExtensionsLite.newBuilder().mergeFrom(original).build();
|
| + assertTrue(merged.hasExtension(UnittestLite.optionalInt32ExtensionLite));
|
| + assertEquals(
|
| + 1, (int) merged.getExtension(UnittestLite.optionalInt32ExtensionLite));
|
| + }
|
| +
|
| + // =================================================================
|
| + // multiple_files_test
|
| +
|
| + // Test that custom options of an file level enum are properly initialized.
|
| + // This test needs to be put before any other access to MultipleFilesTestProto
|
| + // or messages defined in multiple_files_test.proto because the class loading
|
| + // order affects initialization process of custom options.
|
| + public void testEnumValueOptionsInMultipleFilesMode() throws Exception {
|
| + assertEquals(12345, EnumWithNoOuter.FOO.getValueDescriptor().getOptions()
|
| + .getExtension(MultipleFilesTestProto.enumValueOption).intValue());
|
| + }
|
| +
|
| + public void testMultipleFilesOption() throws Exception {
|
| + // We mostly just want to check that things compile.
|
| + MessageWithNoOuter message =
|
| + MessageWithNoOuter.newBuilder()
|
| + .setNested(MessageWithNoOuter.NestedMessage.newBuilder().setI(1))
|
| + .addForeign(TestAllTypes.newBuilder().setOptionalInt32(1))
|
| + .setNestedEnum(MessageWithNoOuter.NestedEnum.BAZ)
|
| + .setForeignEnum(EnumWithNoOuter.BAR)
|
| + .build();
|
| + assertEquals(message, MessageWithNoOuter.parseFrom(message.toByteString()));
|
| +
|
| + assertEquals(MultipleFilesTestProto.getDescriptor(),
|
| + MessageWithNoOuter.getDescriptor().getFile());
|
| +
|
| + Descriptors.FieldDescriptor field =
|
| + MessageWithNoOuter.getDescriptor().findFieldByName("foreign_enum");
|
| + assertEquals(EnumWithNoOuter.BAR.getValueDescriptor(),
|
| + message.getField(field));
|
| +
|
| + assertEquals(MultipleFilesTestProto.getDescriptor(),
|
| + ServiceWithNoOuter.getDescriptor().getFile());
|
| +
|
| + assertFalse(
|
| + TestAllExtensions.getDefaultInstance().hasExtension(
|
| + MultipleFilesTestProto.extensionWithOuter));
|
| + }
|
| +
|
| + public void testOptionalFieldWithRequiredSubfieldsOptimizedForSize()
|
| + throws Exception {
|
| + TestOptionalOptimizedForSize message =
|
| + TestOptionalOptimizedForSize.getDefaultInstance();
|
| + assertTrue(message.isInitialized());
|
| +
|
| + message = TestOptionalOptimizedForSize.newBuilder().setO(
|
| + TestRequiredOptimizedForSize.newBuilder().buildPartial()
|
| + ).buildPartial();
|
| + assertFalse(message.isInitialized());
|
| +
|
| + message = TestOptionalOptimizedForSize.newBuilder().setO(
|
| + TestRequiredOptimizedForSize.newBuilder().setX(5).buildPartial()
|
| + ).buildPartial();
|
| + assertTrue(message.isInitialized());
|
| + }
|
| +
|
| + public void testUninitializedExtensionInOptimizedForSize()
|
| + throws Exception {
|
| + TestOptimizedForSize.Builder builder = TestOptimizedForSize.newBuilder();
|
| + builder.setExtension(TestOptimizedForSize.testExtension2,
|
| + TestRequiredOptimizedForSize.newBuilder().buildPartial());
|
| + assertFalse(builder.isInitialized());
|
| + assertFalse(builder.buildPartial().isInitialized());
|
| +
|
| + builder = TestOptimizedForSize.newBuilder();
|
| + builder.setExtension(TestOptimizedForSize.testExtension2,
|
| + TestRequiredOptimizedForSize.newBuilder().setX(10).buildPartial());
|
| + assertTrue(builder.isInitialized());
|
| + assertTrue(builder.buildPartial().isInitialized());
|
| + }
|
| +
|
| + public void testToBuilder() throws Exception {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + TestUtil.setAllFields(builder);
|
| + TestAllTypes message = builder.build();
|
| + TestUtil.assertAllFieldsSet(message);
|
| + TestUtil.assertAllFieldsSet(message.toBuilder().build());
|
| + }
|
| +
|
| + public void testFieldConstantValues() throws Exception {
|
| + assertEquals(TestAllTypes.NestedMessage.BB_FIELD_NUMBER, 1);
|
| + assertEquals(TestAllTypes.OPTIONAL_INT32_FIELD_NUMBER, 1);
|
| + assertEquals(TestAllTypes.OPTIONALGROUP_FIELD_NUMBER, 16);
|
| + assertEquals(TestAllTypes.OPTIONAL_NESTED_MESSAGE_FIELD_NUMBER, 18);
|
| + assertEquals(TestAllTypes.OPTIONAL_NESTED_ENUM_FIELD_NUMBER, 21);
|
| + assertEquals(TestAllTypes.REPEATED_INT32_FIELD_NUMBER, 31);
|
| + assertEquals(TestAllTypes.REPEATEDGROUP_FIELD_NUMBER, 46);
|
| + assertEquals(TestAllTypes.REPEATED_NESTED_MESSAGE_FIELD_NUMBER, 48);
|
| + assertEquals(TestAllTypes.REPEATED_NESTED_ENUM_FIELD_NUMBER, 51);
|
| + }
|
| +
|
| + public void testExtensionConstantValues() throws Exception {
|
| + assertEquals(UnittestProto.TestRequired.SINGLE_FIELD_NUMBER, 1000);
|
| + assertEquals(UnittestProto.TestRequired.MULTI_FIELD_NUMBER, 1001);
|
| + assertEquals(UnittestProto.OPTIONAL_INT32_EXTENSION_FIELD_NUMBER, 1);
|
| + assertEquals(UnittestProto.OPTIONALGROUP_EXTENSION_FIELD_NUMBER, 16);
|
| + assertEquals(
|
| + UnittestProto.OPTIONAL_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 18);
|
| + assertEquals(UnittestProto.OPTIONAL_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 21);
|
| + assertEquals(UnittestProto.REPEATED_INT32_EXTENSION_FIELD_NUMBER, 31);
|
| + assertEquals(UnittestProto.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46);
|
| + assertEquals(
|
| + UnittestProto.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48);
|
| + assertEquals(UnittestProto.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 51);
|
| + }
|
| +
|
| + public void testRecursiveMessageDefaultInstance() throws Exception {
|
| + UnittestProto.TestRecursiveMessage message =
|
| + UnittestProto.TestRecursiveMessage.getDefaultInstance();
|
| + assertTrue(message != null);
|
| + assertNotNull(message.getA());
|
| + assertTrue(message.getA() == message);
|
| + }
|
| +
|
| + public void testSerialize() throws Exception {
|
| + ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + TestUtil.setAllFields(builder);
|
| + TestAllTypes expected = builder.build();
|
| + ObjectOutputStream out = new ObjectOutputStream(baos);
|
| + try {
|
| + out.writeObject(expected);
|
| + } finally {
|
| + out.close();
|
| + }
|
| + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
|
| + ObjectInputStream in = new ObjectInputStream(bais);
|
| + TestAllTypes actual = (TestAllTypes) in.readObject();
|
| + assertEquals(expected, actual);
|
| + }
|
| +
|
| + public void testSerializePartial() throws Exception {
|
| + ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + TestAllTypes expected = builder.buildPartial();
|
| + ObjectOutputStream out = new ObjectOutputStream(baos);
|
| + try {
|
| + out.writeObject(expected);
|
| + } finally {
|
| + out.close();
|
| + }
|
| + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
|
| + ObjectInputStream in = new ObjectInputStream(bais);
|
| + TestAllTypes actual = (TestAllTypes) in.readObject();
|
| + assertEquals(expected, actual);
|
| + }
|
| +
|
| + public void testEnumValues() {
|
| + assertEquals(
|
| + TestAllTypes.NestedEnum.BAR.getNumber(),
|
| + TestAllTypes.NestedEnum.BAR_VALUE);
|
| + assertEquals(
|
| + TestAllTypes.NestedEnum.BAZ.getNumber(),
|
| + TestAllTypes.NestedEnum.BAZ_VALUE);
|
| + assertEquals(
|
| + TestAllTypes.NestedEnum.FOO.getNumber(),
|
| + TestAllTypes.NestedEnum.FOO_VALUE);
|
| + }
|
| +
|
| + public void testNonNestedExtensionInitialization() {
|
| + assertTrue(NonNestedExtension.nonNestedExtension
|
| + .getMessageDefaultInstance() instanceof MyNonNestedExtension);
|
| + assertEquals("nonNestedExtension",
|
| + NonNestedExtension.nonNestedExtension.getDescriptor().getName());
|
| + }
|
| +
|
| + public void testNestedExtensionInitialization() {
|
| + assertTrue(MyNestedExtension.recursiveExtension.getMessageDefaultInstance()
|
| + instanceof MessageToBeExtended);
|
| + assertEquals("recursiveExtension",
|
| + MyNestedExtension.recursiveExtension.getDescriptor().getName());
|
| + }
|
| +
|
| + public void testNonNestedExtensionLiteInitialization() {
|
| + assertTrue(NonNestedExtensionLite.nonNestedExtensionLite
|
| + .getMessageDefaultInstance() instanceof MyNonNestedExtensionLite);
|
| + }
|
| +
|
| + public void testNestedExtensionLiteInitialization() {
|
| + assertTrue(MyNestedExtensionLite.recursiveExtensionLite
|
| + .getMessageDefaultInstance() instanceof MessageLiteToBeExtended);
|
| + }
|
| +
|
| + public void testInvalidations() throws Exception {
|
| + GeneratedMessage.enableAlwaysUseFieldBuildersForTesting();
|
| + TestAllTypes.NestedMessage nestedMessage1 =
|
| + TestAllTypes.NestedMessage.newBuilder().build();
|
| + TestAllTypes.NestedMessage nestedMessage2 =
|
| + TestAllTypes.NestedMessage.newBuilder().build();
|
| +
|
| + // Set all three flavors (enum, primitive, message and singular/repeated)
|
| + // and verify no invalidations fired
|
| + TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
|
| +
|
| + TestAllTypes.Builder builder = (TestAllTypes.Builder)
|
| + ((GeneratedMessage) TestAllTypes.getDefaultInstance()).
|
| + newBuilderForType(mockParent);
|
| + builder.setOptionalInt32(1);
|
| + builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAR);
|
| + builder.setOptionalNestedMessage(nestedMessage1);
|
| + builder.addRepeatedInt32(1);
|
| + builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAR);
|
| + builder.addRepeatedNestedMessage(nestedMessage1);
|
| + assertEquals(0, mockParent.getInvalidationCount());
|
| +
|
| + // Now tell it we want changes and make sure it's only fired once
|
| + // And do this for each flavor
|
| +
|
| + // primitive single
|
| + builder.buildPartial();
|
| + builder.setOptionalInt32(2);
|
| + builder.setOptionalInt32(3);
|
| + assertEquals(1, mockParent.getInvalidationCount());
|
| +
|
| + // enum single
|
| + builder.buildPartial();
|
| + builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAZ);
|
| + builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAR);
|
| + assertEquals(2, mockParent.getInvalidationCount());
|
| +
|
| + // message single
|
| + builder.buildPartial();
|
| + builder.setOptionalNestedMessage(nestedMessage2);
|
| + builder.setOptionalNestedMessage(nestedMessage1);
|
| + assertEquals(3, mockParent.getInvalidationCount());
|
| +
|
| + // primitive repeated
|
| + builder.buildPartial();
|
| + builder.addRepeatedInt32(2);
|
| + builder.addRepeatedInt32(3);
|
| + assertEquals(4, mockParent.getInvalidationCount());
|
| +
|
| + // enum repeated
|
| + builder.buildPartial();
|
| + builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAZ);
|
| + builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAZ);
|
| + assertEquals(5, mockParent.getInvalidationCount());
|
| +
|
| + // message repeated
|
| + builder.buildPartial();
|
| + builder.addRepeatedNestedMessage(nestedMessage2);
|
| + builder.addRepeatedNestedMessage(nestedMessage1);
|
| + assertEquals(6, mockParent.getInvalidationCount());
|
| +
|
| + }
|
| +
|
| + public void testInvalidations_Extensions() throws Exception {
|
| + TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
|
| +
|
| + TestAllExtensions.Builder builder = (TestAllExtensions.Builder)
|
| + ((GeneratedMessage) TestAllExtensions.getDefaultInstance()).
|
| + newBuilderForType(mockParent);
|
| +
|
| + builder.addExtension(UnittestProto.repeatedInt32Extension, 1);
|
| + builder.setExtension(UnittestProto.repeatedInt32Extension, 0, 2);
|
| + builder.clearExtension(UnittestProto.repeatedInt32Extension);
|
| + assertEquals(0, mockParent.getInvalidationCount());
|
| +
|
| + // Now tell it we want changes and make sure it's only fired once
|
| + builder.buildPartial();
|
| + builder.addExtension(UnittestProto.repeatedInt32Extension, 2);
|
| + builder.addExtension(UnittestProto.repeatedInt32Extension, 3);
|
| + assertEquals(1, mockParent.getInvalidationCount());
|
| +
|
| + builder.buildPartial();
|
| + builder.setExtension(UnittestProto.repeatedInt32Extension, 0, 4);
|
| + builder.setExtension(UnittestProto.repeatedInt32Extension, 1, 5);
|
| + assertEquals(2, mockParent.getInvalidationCount());
|
| +
|
| + builder.buildPartial();
|
| + builder.clearExtension(UnittestProto.repeatedInt32Extension);
|
| + builder.clearExtension(UnittestProto.repeatedInt32Extension);
|
| + assertEquals(3, mockParent.getInvalidationCount());
|
| + }
|
| +
|
| + public void testBaseMessageOrBuilder() {
|
| + // Mostly just makes sure the base interface exists and has some methods.
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + TestAllTypes message = builder.buildPartial();
|
| + TestAllTypesOrBuilder builderAsInterface = (TestAllTypesOrBuilder) builder;
|
| + TestAllTypesOrBuilder messageAsInterface = (TestAllTypesOrBuilder) message;
|
| +
|
| + assertEquals(
|
| + messageAsInterface.getDefaultBool(),
|
| + messageAsInterface.getDefaultBool());
|
| + assertEquals(
|
| + messageAsInterface.getOptionalDouble(),
|
| + messageAsInterface.getOptionalDouble());
|
| + }
|
| +
|
| + public void testMessageOrBuilderGetters() {
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| +
|
| + // single fields
|
| + assertSame(ForeignMessage.getDefaultInstance(),
|
| + builder.getOptionalForeignMessageOrBuilder());
|
| + ForeignMessage.Builder subBuilder =
|
| + builder.getOptionalForeignMessageBuilder();
|
| + assertSame(subBuilder, builder.getOptionalForeignMessageOrBuilder());
|
| +
|
| + // repeated fields
|
| + ForeignMessage m0 = ForeignMessage.newBuilder().buildPartial();
|
| + ForeignMessage m1 = ForeignMessage.newBuilder().buildPartial();
|
| + ForeignMessage m2 = ForeignMessage.newBuilder().buildPartial();
|
| + builder.addRepeatedForeignMessage(m0);
|
| + builder.addRepeatedForeignMessage(m1);
|
| + builder.addRepeatedForeignMessage(m2);
|
| + assertSame(m0, builder.getRepeatedForeignMessageOrBuilder(0));
|
| + assertSame(m1, builder.getRepeatedForeignMessageOrBuilder(1));
|
| + assertSame(m2, builder.getRepeatedForeignMessageOrBuilder(2));
|
| + ForeignMessage.Builder b0 = builder.getRepeatedForeignMessageBuilder(0);
|
| + ForeignMessage.Builder b1 = builder.getRepeatedForeignMessageBuilder(1);
|
| + assertSame(b0, builder.getRepeatedForeignMessageOrBuilder(0));
|
| + assertSame(b1, builder.getRepeatedForeignMessageOrBuilder(1));
|
| + assertSame(m2, builder.getRepeatedForeignMessageOrBuilder(2));
|
| +
|
| + List<? extends ForeignMessageOrBuilder> messageOrBuilderList =
|
| + builder.getRepeatedForeignMessageOrBuilderList();
|
| + assertSame(b0, messageOrBuilderList.get(0));
|
| + assertSame(b1, messageOrBuilderList.get(1));
|
| + assertSame(m2, messageOrBuilderList.get(2));
|
| + }
|
| +
|
| + public void testGetFieldBuilder() {
|
| + Descriptor descriptor = TestAllTypes.getDescriptor();
|
| +
|
| + FieldDescriptor fieldDescriptor =
|
| + descriptor.findFieldByName("optional_nested_message");
|
| + FieldDescriptor foreignFieldDescriptor =
|
| + descriptor.findFieldByName("optional_foreign_message");
|
| + FieldDescriptor importFieldDescriptor =
|
| + descriptor.findFieldByName("optional_import_message");
|
| +
|
| + // Mutate the message with new field builder
|
| + // Mutate nested message
|
| + TestAllTypes.Builder builder1 = TestAllTypes.newBuilder();
|
| + Message.Builder fieldBuilder1 = builder1.newBuilderForField(fieldDescriptor)
|
| + .mergeFrom((Message) builder1.getField(fieldDescriptor));
|
| + FieldDescriptor subFieldDescriptor1 =
|
| + fieldBuilder1.getDescriptorForType().findFieldByName("bb");
|
| + fieldBuilder1.setField(subFieldDescriptor1, 1);
|
| + builder1.setField(fieldDescriptor, fieldBuilder1.build());
|
| +
|
| + // Mutate foreign message
|
| + Message.Builder foreignFieldBuilder1 = builder1.newBuilderForField(
|
| + foreignFieldDescriptor)
|
| + .mergeFrom((Message) builder1.getField(foreignFieldDescriptor));
|
| + FieldDescriptor subForeignFieldDescriptor1 =
|
| + foreignFieldBuilder1.getDescriptorForType().findFieldByName("c");
|
| + foreignFieldBuilder1.setField(subForeignFieldDescriptor1, 2);
|
| + builder1.setField(foreignFieldDescriptor, foreignFieldBuilder1.build());
|
| +
|
| + // Mutate import message
|
| + Message.Builder importFieldBuilder1 = builder1.newBuilderForField(
|
| + importFieldDescriptor)
|
| + .mergeFrom((Message) builder1.getField(importFieldDescriptor));
|
| + FieldDescriptor subImportFieldDescriptor1 =
|
| + importFieldBuilder1.getDescriptorForType().findFieldByName("d");
|
| + importFieldBuilder1.setField(subImportFieldDescriptor1, 3);
|
| + builder1.setField(importFieldDescriptor, importFieldBuilder1.build());
|
| +
|
| + Message newMessage1 = builder1.build();
|
| +
|
| + // Mutate the message with existing field builder
|
| + // Mutate nested message
|
| + TestAllTypes.Builder builder2 = TestAllTypes.newBuilder();
|
| + Message.Builder fieldBuilder2 = builder2.getFieldBuilder(fieldDescriptor);
|
| + FieldDescriptor subFieldDescriptor2 =
|
| + fieldBuilder2.getDescriptorForType().findFieldByName("bb");
|
| + fieldBuilder2.setField(subFieldDescriptor2, 1);
|
| + builder2.setField(fieldDescriptor, fieldBuilder2.build());
|
| +
|
| + // Mutate foreign message
|
| + Message.Builder foreignFieldBuilder2 = builder2.newBuilderForField(
|
| + foreignFieldDescriptor)
|
| + .mergeFrom((Message) builder2.getField(foreignFieldDescriptor));
|
| + FieldDescriptor subForeignFieldDescriptor2 =
|
| + foreignFieldBuilder2.getDescriptorForType().findFieldByName("c");
|
| + foreignFieldBuilder2.setField(subForeignFieldDescriptor2, 2);
|
| + builder2.setField(foreignFieldDescriptor, foreignFieldBuilder2.build());
|
| +
|
| + // Mutate import message
|
| + Message.Builder importFieldBuilder2 = builder2.newBuilderForField(
|
| + importFieldDescriptor)
|
| + .mergeFrom((Message) builder2.getField(importFieldDescriptor));
|
| + FieldDescriptor subImportFieldDescriptor2 =
|
| + importFieldBuilder2.getDescriptorForType().findFieldByName("d");
|
| + importFieldBuilder2.setField(subImportFieldDescriptor2, 3);
|
| + builder2.setField(importFieldDescriptor, importFieldBuilder2.build());
|
| +
|
| + Message newMessage2 = builder2.build();
|
| +
|
| + // These two messages should be equal.
|
| + assertEquals(newMessage1, newMessage2);
|
| + }
|
| +
|
| + public void testGetFieldBuilderWithInitializedValue() {
|
| + Descriptor descriptor = TestAllTypes.getDescriptor();
|
| + FieldDescriptor fieldDescriptor =
|
| + descriptor.findFieldByName("optional_nested_message");
|
| +
|
| + // Before setting field, builder is initialized by default value.
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + NestedMessage.Builder fieldBuilder =
|
| + (NestedMessage.Builder) builder.getFieldBuilder(fieldDescriptor);
|
| + assertEquals(0, fieldBuilder.getBb());
|
| +
|
| + // Setting field value with new field builder instance.
|
| + builder = TestAllTypes.newBuilder();
|
| + NestedMessage.Builder newFieldBuilder =
|
| + builder.getOptionalNestedMessageBuilder();
|
| + newFieldBuilder.setBb(2);
|
| + // Then get the field builder instance by getFieldBuilder().
|
| + fieldBuilder =
|
| + (NestedMessage.Builder) builder.getFieldBuilder(fieldDescriptor);
|
| + // It should contain new value.
|
| + assertEquals(2, fieldBuilder.getBb());
|
| + // These two builder should be equal.
|
| + assertSame(fieldBuilder, newFieldBuilder);
|
| + }
|
| +
|
| + public void testGetFieldBuilderNotSupportedException() {
|
| + Descriptor descriptor = TestAllTypes.getDescriptor();
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + try {
|
| + builder.getFieldBuilder(descriptor.findFieldByName("optional_int32"));
|
| + fail("Exception was not thrown");
|
| + } catch (UnsupportedOperationException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.getFieldBuilder(
|
| + descriptor.findFieldByName("optional_nested_enum"));
|
| + fail("Exception was not thrown");
|
| + } catch (UnsupportedOperationException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.getFieldBuilder(descriptor.findFieldByName("repeated_int32"));
|
| + fail("Exception was not thrown");
|
| + } catch (UnsupportedOperationException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.getFieldBuilder(
|
| + descriptor.findFieldByName("repeated_nested_enum"));
|
| + fail("Exception was not thrown");
|
| + } catch (UnsupportedOperationException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.getFieldBuilder(
|
| + descriptor.findFieldByName("repeated_nested_message"));
|
| + fail("Exception was not thrown");
|
| + } catch (UnsupportedOperationException e) {
|
| + // We expect this exception.
|
| + }
|
| + }
|
| +
|
| + // Test that when the default outer class name conflicts with another type
|
| + // defined in the proto the compiler will append a suffix to avoid the
|
| + // conflict.
|
| + public void testConflictingOuterClassName() {
|
| + // We just need to make sure we can refer to the outer class with the
|
| + // expected name. There is nothing else to test.
|
| + OuterClassNameTestOuterClass.OuterClassNameTest message =
|
| + OuterClassNameTestOuterClass.OuterClassNameTest.newBuilder().build();
|
| + assertTrue(message.getDescriptorForType() ==
|
| + OuterClassNameTestOuterClass.OuterClassNameTest.getDescriptor());
|
| +
|
| + OuterClassNameTest2OuterClass.TestMessage2.NestedMessage.OuterClassNameTest2
|
| + message2 = OuterClassNameTest2OuterClass.TestMessage2.NestedMessage
|
| + .OuterClassNameTest2.newBuilder().build();
|
| + assertEquals(0, message2.getSerializedSize());
|
| +
|
| + OuterClassNameTest3OuterClass.TestMessage3.NestedMessage.OuterClassNameTest3
|
| + enumValue = OuterClassNameTest3OuterClass.TestMessage3.NestedMessage
|
| + .OuterClassNameTest3.DUMMY_VALUE;
|
| + assertEquals(1, enumValue.getNumber());
|
| + }
|
| +
|
| + // =================================================================
|
| + // oneof generated code test
|
| + public void testOneofEnumCase() throws Exception {
|
| + TestOneof2 message = TestOneof2.newBuilder()
|
| + .setFooInt(123).setFooString("foo").setFooCord("bar").build();
|
| + TestUtil.assertAtMostOneFieldSetOneof(message);
|
| + }
|
| +
|
| + public void testClearOneof() throws Exception {
|
| + TestOneof2.Builder builder = TestOneof2.newBuilder().setFooInt(123);
|
| + assertEquals(TestOneof2.FooCase.FOO_INT, builder.getFooCase());
|
| + builder.clearFoo();
|
| + assertEquals(TestOneof2.FooCase.FOO_NOT_SET, builder.getFooCase());
|
| + }
|
| +
|
| + public void testSetOneofClearsOthers() throws Exception {
|
| + TestOneof2.Builder builder = TestOneof2.newBuilder();
|
| + TestOneof2 message =
|
| + builder.setFooInt(123).setFooString("foo").buildPartial();
|
| + assertTrue(message.hasFooString());
|
| + TestUtil.assertAtMostOneFieldSetOneof(message);
|
| +
|
| + message = builder.setFooCord("bar").buildPartial();
|
| + assertTrue(message.hasFooCord());
|
| + TestUtil.assertAtMostOneFieldSetOneof(message);
|
| +
|
| + message = builder.setFooStringPiece("baz").buildPartial();
|
| + assertTrue(message.hasFooStringPiece());
|
| + TestUtil.assertAtMostOneFieldSetOneof(message);
|
| +
|
| + message = builder.setFooBytes(TestUtil.toBytes("qux")).buildPartial();
|
| + assertTrue(message.hasFooBytes());
|
| + TestUtil.assertAtMostOneFieldSetOneof(message);
|
| +
|
| + message = builder.setFooEnum(TestOneof2.NestedEnum.FOO).buildPartial();
|
| + assertTrue(message.hasFooEnum());
|
| + TestUtil.assertAtMostOneFieldSetOneof(message);
|
| +
|
| + message = builder.setFooMessage(
|
| + TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()).buildPartial();
|
| + assertTrue(message.hasFooMessage());
|
| + TestUtil.assertAtMostOneFieldSetOneof(message);
|
| +
|
| + message = builder.setFooInt(123).buildPartial();
|
| + assertTrue(message.hasFooInt());
|
| + TestUtil.assertAtMostOneFieldSetOneof(message);
|
| + }
|
| +
|
| + public void testOneofTypes() throws Exception {
|
| + // Primitive
|
| + {
|
| + TestOneof2.Builder builder = TestOneof2.newBuilder();
|
| + assertEquals(builder.getFooInt(), 0);
|
| + assertFalse(builder.hasFooInt());
|
| + assertTrue(builder.setFooInt(123).hasFooInt());
|
| + assertEquals(builder.getFooInt(), 123);
|
| + TestOneof2 message = builder.buildPartial();
|
| + assertTrue(message.hasFooInt());
|
| + assertEquals(message.getFooInt(), 123);
|
| +
|
| + assertFalse(builder.clearFooInt().hasFooInt());
|
| + TestOneof2 message2 = builder.build();
|
| + assertFalse(message2.hasFooInt());
|
| + assertEquals(message2.getFooInt(), 0);
|
| + }
|
| +
|
| + // Enum
|
| + {
|
| + TestOneof2.Builder builder = TestOneof2.newBuilder();
|
| + assertEquals(builder.getFooEnum(), TestOneof2.NestedEnum.FOO);
|
| + assertTrue(builder.setFooEnum(TestOneof2.NestedEnum.BAR).hasFooEnum());
|
| + assertEquals(builder.getFooEnum(), TestOneof2.NestedEnum.BAR);
|
| + TestOneof2 message = builder.buildPartial();
|
| + assertTrue(message.hasFooEnum());
|
| + assertEquals(message.getFooEnum(), TestOneof2.NestedEnum.BAR);
|
| +
|
| + assertFalse(builder.clearFooEnum().hasFooEnum());
|
| + TestOneof2 message2 = builder.build();
|
| + assertFalse(message2.hasFooEnum());
|
| + assertEquals(message2.getFooEnum(), TestOneof2.NestedEnum.FOO);
|
| + }
|
| +
|
| + // String
|
| + {
|
| + TestOneof2.Builder builder = TestOneof2.newBuilder();
|
| + assertEquals(builder.getFooString(), "");
|
| + builder.setFooString("foo");
|
| + assertTrue(builder.hasFooString());
|
| + assertEquals(builder.getFooString(), "foo");
|
| + TestOneof2 message = builder.buildPartial();
|
| + assertTrue(message.hasFooString());
|
| + assertEquals(message.getFooString(), "foo");
|
| + assertEquals(message.getFooStringBytes(), TestUtil.toBytes("foo"));
|
| +
|
| + assertFalse(builder.clearFooString().hasFooString());
|
| + TestOneof2 message2 = builder.buildPartial();
|
| + assertFalse(message2.hasFooString());
|
| + assertEquals(message2.getFooString(), "");
|
| + assertEquals(message2.getFooStringBytes(), TestUtil.toBytes(""));
|
| +
|
| + // Get method should not change the oneof value.
|
| + builder.setFooInt(123);
|
| + assertEquals(builder.getFooString(), "");
|
| + assertEquals(builder.getFooStringBytes(), TestUtil.toBytes(""));
|
| + assertEquals(123, builder.getFooInt());
|
| +
|
| + message = builder.build();
|
| + assertEquals(message.getFooString(), "");
|
| + assertEquals(message.getFooStringBytes(), TestUtil.toBytes(""));
|
| + assertEquals(123, message.getFooInt());
|
| + }
|
| +
|
| + // Cord
|
| + {
|
| + TestOneof2.Builder builder = TestOneof2.newBuilder();
|
| + assertEquals(builder.getFooCord(), "");
|
| + builder.setFooCord("foo");
|
| + assertTrue(builder.hasFooCord());
|
| + assertEquals(builder.getFooCord(), "foo");
|
| + TestOneof2 message = builder.buildPartial();
|
| + assertTrue(message.hasFooCord());
|
| + assertEquals(message.getFooCord(), "foo");
|
| + assertEquals(message.getFooCordBytes(), TestUtil.toBytes("foo"));
|
| +
|
| + assertFalse(builder.clearFooCord().hasFooCord());
|
| + TestOneof2 message2 = builder.build();
|
| + assertFalse(message2.hasFooCord());
|
| + assertEquals(message2.getFooCord(), "");
|
| + assertEquals(message2.getFooCordBytes(), TestUtil.toBytes(""));
|
| + }
|
| +
|
| + // StringPiece
|
| + {
|
| + TestOneof2.Builder builder = TestOneof2.newBuilder();
|
| + assertEquals(builder.getFooStringPiece(), "");
|
| + builder.setFooStringPiece("foo");
|
| + assertTrue(builder.hasFooStringPiece());
|
| + assertEquals(builder.getFooStringPiece(), "foo");
|
| + TestOneof2 message = builder.buildPartial();
|
| + assertTrue(message.hasFooStringPiece());
|
| + assertEquals(message.getFooStringPiece(), "foo");
|
| + assertEquals(message.getFooStringPieceBytes(), TestUtil.toBytes("foo"));
|
| +
|
| + assertFalse(builder.clearFooStringPiece().hasFooStringPiece());
|
| + TestOneof2 message2 = builder.build();
|
| + assertFalse(message2.hasFooStringPiece());
|
| + assertEquals(message2.getFooStringPiece(), "");
|
| + assertEquals(message2.getFooStringPieceBytes(), TestUtil.toBytes(""));
|
| + }
|
| +
|
| + // Message
|
| + {
|
| + // set
|
| + TestOneof2.Builder builder = TestOneof2.newBuilder();
|
| + assertEquals(builder.getFooMessage().getQuxInt(), 0);
|
| + builder.setFooMessage(
|
| + TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build());
|
| + assertTrue(builder.hasFooMessage());
|
| + assertEquals(builder.getFooMessage().getQuxInt(), 234);
|
| + TestOneof2 message = builder.buildPartial();
|
| + assertTrue(message.hasFooMessage());
|
| + assertEquals(message.getFooMessage().getQuxInt(), 234);
|
| +
|
| + // clear
|
| + assertFalse(builder.clearFooMessage().hasFooString());
|
| + message = builder.build();
|
| + assertFalse(message.hasFooMessage());
|
| + assertEquals(message.getFooMessage().getQuxInt(), 0);
|
| +
|
| + // nested builder
|
| + builder = TestOneof2.newBuilder();
|
| + assertSame(builder.getFooMessageOrBuilder(),
|
| + TestOneof2.NestedMessage.getDefaultInstance());
|
| + assertFalse(builder.hasFooMessage());
|
| + builder.getFooMessageBuilder().setQuxInt(123);
|
| + assertTrue(builder.hasFooMessage());
|
| + assertEquals(builder.getFooMessage().getQuxInt(), 123);
|
| + message = builder.build();
|
| + assertTrue(message.hasFooMessage());
|
| + assertEquals(message.getFooMessage().getQuxInt(), 123);
|
| + }
|
| +
|
| + // LazyMessage is tested in LazyMessageLiteTest.java
|
| + }
|
| +
|
| + public void testOneofMerge() throws Exception {
|
| + // Primitive Type
|
| + {
|
| + TestOneof2.Builder builder = TestOneof2.newBuilder();
|
| + TestOneof2 message = builder.setFooInt(123).build();
|
| + TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build();
|
| + assertTrue(message2.hasFooInt());
|
| + assertEquals(message2.getFooInt(), 123);
|
| + }
|
| +
|
| + // String
|
| + {
|
| + TestOneof2.Builder builder = TestOneof2.newBuilder();
|
| + TestOneof2 message = builder.setFooString("foo").build();
|
| + TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build();
|
| + assertTrue(message2.hasFooString());
|
| + assertEquals(message2.getFooString(), "foo");
|
| + }
|
| +
|
| + // Enum
|
| + {
|
| + TestOneof2.Builder builder = TestOneof2.newBuilder();
|
| + TestOneof2 message = builder.setFooEnum(TestOneof2.NestedEnum.BAR).build();
|
| + TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build();
|
| + assertTrue(message2.hasFooEnum());
|
| + assertEquals(message2.getFooEnum(), TestOneof2.NestedEnum.BAR);
|
| + }
|
| +
|
| + // Message
|
| + {
|
| + TestOneof2.Builder builder = TestOneof2.newBuilder();
|
| + TestOneof2 message = builder.setFooMessage(
|
| + TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()).build();
|
| + TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build();
|
| + assertTrue(message2.hasFooMessage());
|
| + assertEquals(message2.getFooMessage().getQuxInt(), 234);
|
| + }
|
| + }
|
| +
|
| + public void testOneofSerialization() throws Exception {
|
| + // Primitive Type
|
| + {
|
| + TestOneof2.Builder builder = TestOneof2.newBuilder();
|
| + TestOneof2 message = builder.setFooInt(123).build();
|
| + ByteString serialized = message.toByteString();
|
| + TestOneof2 message2 = TestOneof2.parseFrom(serialized);
|
| + assertTrue(message2.hasFooInt());
|
| + assertEquals(message2.getFooInt(), 123);
|
| + }
|
| +
|
| + // String
|
| + {
|
| + TestOneof2.Builder builder = TestOneof2.newBuilder();
|
| + TestOneof2 message = builder.setFooString("foo").build();
|
| + ByteString serialized = message.toByteString();
|
| + TestOneof2 message2 = TestOneof2.parseFrom(serialized);
|
| + assertTrue(message2.hasFooString());
|
| + assertEquals(message2.getFooString(), "foo");
|
| + }
|
| +
|
| + // Enum
|
| + {
|
| + TestOneof2.Builder builder = TestOneof2.newBuilder();
|
| + TestOneof2 message = builder.setFooEnum(TestOneof2.NestedEnum.BAR).build();
|
| + ByteString serialized = message.toByteString();
|
| + TestOneof2 message2 = TestOneof2.parseFrom(serialized);
|
| + assertTrue(message2.hasFooEnum());
|
| + assertEquals(message2.getFooEnum(), TestOneof2.NestedEnum.BAR);
|
| + }
|
| +
|
| + // Message
|
| + {
|
| + TestOneof2.Builder builder = TestOneof2.newBuilder();
|
| + TestOneof2 message = builder.setFooMessage(
|
| + TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()).build();
|
| + ByteString serialized = message.toByteString();
|
| + TestOneof2 message2 = TestOneof2.parseFrom(serialized);
|
| + assertTrue(message2.hasFooMessage());
|
| + assertEquals(message2.getFooMessage().getQuxInt(), 234);
|
| + }
|
| + }
|
| +
|
| + public void testOneofNestedBuilderOnChangePropagation() {
|
| + NestedTestAllTypes.Builder parentBuilder = NestedTestAllTypes.newBuilder();
|
| + TestAllTypes.Builder builder = parentBuilder.getPayloadBuilder();
|
| + builder.getOneofNestedMessageBuilder();
|
| + assertTrue(builder.hasOneofNestedMessage());
|
| + assertTrue(parentBuilder.hasPayload());
|
| + NestedTestAllTypes message = parentBuilder.build();
|
| + assertTrue(message.hasPayload());
|
| + assertTrue(message.getPayload().hasOneofNestedMessage());
|
| + }
|
| +
|
| + public void testGetRepeatedFieldBuilder() {
|
| + Descriptor descriptor = TestAllTypes.getDescriptor();
|
| +
|
| + FieldDescriptor fieldDescriptor =
|
| + descriptor.findFieldByName("repeated_nested_message");
|
| + FieldDescriptor foreignFieldDescriptor =
|
| + descriptor.findFieldByName("repeated_foreign_message");
|
| + FieldDescriptor importFieldDescriptor =
|
| + descriptor.findFieldByName("repeated_import_message");
|
| +
|
| + // Mutate the message with new field builder
|
| + // Mutate nested message
|
| + TestAllTypes.Builder builder1 = TestAllTypes.newBuilder();
|
| + Message.Builder fieldBuilder1 = builder1.newBuilderForField(
|
| + fieldDescriptor);
|
| + FieldDescriptor subFieldDescriptor1 =
|
| + fieldBuilder1.getDescriptorForType().findFieldByName("bb");
|
| + fieldBuilder1.setField(subFieldDescriptor1, 1);
|
| + builder1.addRepeatedField(fieldDescriptor, fieldBuilder1.build());
|
| +
|
| + // Mutate foreign message
|
| + Message.Builder foreignFieldBuilder1 = builder1.newBuilderForField(
|
| + foreignFieldDescriptor);
|
| + FieldDescriptor subForeignFieldDescriptor1 =
|
| + foreignFieldBuilder1.getDescriptorForType().findFieldByName("c");
|
| + foreignFieldBuilder1.setField(subForeignFieldDescriptor1, 2);
|
| + builder1.addRepeatedField(foreignFieldDescriptor,
|
| + foreignFieldBuilder1.build());
|
| +
|
| + // Mutate import message
|
| + Message.Builder importFieldBuilder1 = builder1.newBuilderForField(
|
| + importFieldDescriptor);
|
| + FieldDescriptor subImportFieldDescriptor1 =
|
| + importFieldBuilder1.getDescriptorForType().findFieldByName("d");
|
| + importFieldBuilder1.setField(subImportFieldDescriptor1, 3);
|
| + builder1.addRepeatedField(importFieldDescriptor,
|
| + importFieldBuilder1.build());
|
| +
|
| + Message newMessage1 = builder1.build();
|
| +
|
| + // Mutate the message with existing field builder
|
| + // Mutate nested message
|
| + TestAllTypes.Builder builder2 = TestAllTypes.newBuilder();
|
| + builder2.addRepeatedNestedMessageBuilder();
|
| + Message.Builder fieldBuilder2 = builder2.getRepeatedFieldBuilder(
|
| + fieldDescriptor, 0);
|
| + FieldDescriptor subFieldDescriptor2 =
|
| + fieldBuilder2.getDescriptorForType().findFieldByName("bb");
|
| + fieldBuilder2.setField(subFieldDescriptor2, 1);
|
| +
|
| + // Mutate foreign message
|
| + Message.Builder foreignFieldBuilder2 = builder2.newBuilderForField(
|
| + foreignFieldDescriptor);
|
| + FieldDescriptor subForeignFieldDescriptor2 =
|
| + foreignFieldBuilder2.getDescriptorForType().findFieldByName("c");
|
| + foreignFieldBuilder2.setField(subForeignFieldDescriptor2, 2);
|
| + builder2.addRepeatedField(foreignFieldDescriptor,
|
| + foreignFieldBuilder2.build());
|
| +
|
| + // Mutate import message
|
| + Message.Builder importFieldBuilder2 = builder2.newBuilderForField(
|
| + importFieldDescriptor);
|
| + FieldDescriptor subImportFieldDescriptor2 =
|
| + importFieldBuilder2.getDescriptorForType().findFieldByName("d");
|
| + importFieldBuilder2.setField(subImportFieldDescriptor2, 3);
|
| + builder2.addRepeatedField(importFieldDescriptor,
|
| + importFieldBuilder2.build());
|
| +
|
| + Message newMessage2 = builder2.build();
|
| +
|
| + // These two messages should be equal.
|
| + assertEquals(newMessage1, newMessage2);
|
| + }
|
| +
|
| + public void testGetRepeatedFieldBuilderWithInitializedValue() {
|
| + Descriptor descriptor = TestAllTypes.getDescriptor();
|
| + FieldDescriptor fieldDescriptor =
|
| + descriptor.findFieldByName("repeated_nested_message");
|
| +
|
| + // Before setting field, builder is initialized by default value.
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + builder.addRepeatedNestedMessageBuilder();
|
| + NestedMessage.Builder fieldBuilder =
|
| + (NestedMessage.Builder) builder.getRepeatedFieldBuilder(fieldDescriptor, 0);
|
| + assertEquals(0, fieldBuilder.getBb());
|
| +
|
| + // Setting field value with new field builder instance.
|
| + builder = TestAllTypes.newBuilder();
|
| + NestedMessage.Builder newFieldBuilder =
|
| + builder.addRepeatedNestedMessageBuilder();
|
| + newFieldBuilder.setBb(2);
|
| + // Then get the field builder instance by getRepeatedFieldBuilder().
|
| + fieldBuilder =
|
| + (NestedMessage.Builder) builder.getRepeatedFieldBuilder(fieldDescriptor, 0);
|
| + // It should contain new value.
|
| + assertEquals(2, fieldBuilder.getBb());
|
| + // These two builder should be equal.
|
| + assertSame(fieldBuilder, newFieldBuilder);
|
| + }
|
| +
|
| + public void testGetRepeatedFieldBuilderNotSupportedException() {
|
| + Descriptor descriptor = TestAllTypes.getDescriptor();
|
| + TestAllTypes.Builder builder = TestAllTypes.newBuilder();
|
| + try {
|
| + builder.getRepeatedFieldBuilder(descriptor.findFieldByName("repeated_int32"), 0);
|
| + fail("Exception was not thrown");
|
| + } catch (UnsupportedOperationException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.getRepeatedFieldBuilder(
|
| + descriptor.findFieldByName("repeated_nested_enum"), 0);
|
| + fail("Exception was not thrown");
|
| + } catch (UnsupportedOperationException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.getRepeatedFieldBuilder(descriptor.findFieldByName("optional_int32"), 0);
|
| + fail("Exception was not thrown");
|
| + } catch (UnsupportedOperationException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.getRepeatedFieldBuilder(
|
| + descriptor.findFieldByName("optional_nested_enum"), 0);
|
| + fail("Exception was not thrown");
|
| + } catch (UnsupportedOperationException e) {
|
| + // We expect this exception.
|
| + }
|
| + try {
|
| + builder.getRepeatedFieldBuilder(
|
| + descriptor.findFieldByName("optional_nested_message"), 0);
|
| + fail("Exception was not thrown");
|
| + } catch (UnsupportedOperationException e) {
|
| + // We expect this exception.
|
| + }
|
| + }
|
| +}
|
|
|