OLD | NEW |
1 // Protocol Buffers - Google's data interchange format | 1 // Protocol Buffers - Google's data interchange format |
2 // Copyright 2008 Google Inc. All rights reserved. | 2 // Copyright 2008 Google Inc. All rights reserved. |
3 // https://developers.google.com/protocol-buffers/ | 3 // http://code.google.com/p/protobuf/ |
4 // | 4 // |
5 // Redistribution and use in source and binary forms, with or without | 5 // Redistribution and use in source and binary forms, with or without |
6 // modification, are permitted provided that the following conditions are | 6 // modification, are permitted provided that the following conditions are |
7 // met: | 7 // met: |
8 // | 8 // |
9 // * Redistributions of source code must retain the above copyright | 9 // * Redistributions of source code must retain the above copyright |
10 // notice, this list of conditions and the following disclaimer. | 10 // notice, this list of conditions and the following disclaimer. |
11 // * Redistributions in binary form must reproduce the above | 11 // * Redistributions in binary form must reproduce the above |
12 // copyright notice, this list of conditions and the following disclaimer | 12 // copyright notice, this list of conditions and the following disclaimer |
13 // in the documentation and/or other materials provided with the | 13 // in the documentation and/or other materials provided with the |
14 // distribution. | 14 // distribution. |
15 // * Neither the name of Google Inc. nor the names of its | 15 // * Neither the name of Google Inc. nor the names of its |
16 // contributors may be used to endorse or promote products derived from | 16 // contributors may be used to endorse or promote products derived from |
17 // this software without specific prior written permission. | 17 // this software without specific prior written permission. |
18 // | 18 // |
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
30 | 30 |
31 package com.google.protobuf; | 31 package com.google.protobuf.test; |
| 32 import com.google.protobuf.*; |
32 | 33 |
33 import com.google.protobuf.Descriptors.Descriptor; | 34 import com.google.protobuf.Descriptors.Descriptor; |
34 import com.google.protobuf.Descriptors.FieldDescriptor; | 35 import com.google.protobuf.Descriptors.FieldDescriptor; |
35 import com.google.protobuf.UnittestLite.TestAllExtensionsLite; | |
36 import com.google.protobuf.test.UnittestImport; | 36 import com.google.protobuf.test.UnittestImport; |
37 import protobuf_unittest.EnumWithNoOuter; | 37 import protobuf_unittest.EnumWithNoOuter; |
38 import protobuf_unittest.MessageWithNoOuter; | 38 import protobuf_unittest.MessageWithNoOuter; |
39 import protobuf_unittest.MultipleFilesTestProto; | 39 import protobuf_unittest.MultipleFilesTestProto; |
40 import protobuf_unittest.NestedExtension.MyNestedExtension; | 40 import protobuf_unittest.NestedExtension.MyNestedExtension; |
41 import protobuf_unittest.NestedExtensionLite.MyNestedExtensionLite; | |
42 import protobuf_unittest.NonNestedExtension; | 41 import protobuf_unittest.NonNestedExtension; |
43 import protobuf_unittest.NonNestedExtension.MessageToBeExtended; | 42 import protobuf_unittest.NonNestedExtension.MessageToBeExtended; |
44 import protobuf_unittest.NonNestedExtension.MyNonNestedExtension; | 43 import protobuf_unittest.NonNestedExtension.MyNonNestedExtension; |
45 import protobuf_unittest.NonNestedExtensionLite; | |
46 import protobuf_unittest.NonNestedExtensionLite.MessageLiteToBeExtended; | |
47 import protobuf_unittest.NonNestedExtensionLite.MyNonNestedExtensionLite; | |
48 import protobuf_unittest.OuterClassNameTest2OuterClass; | |
49 import protobuf_unittest.OuterClassNameTest3OuterClass; | |
50 import protobuf_unittest.OuterClassNameTestOuterClass; | |
51 import protobuf_unittest.ServiceWithNoOuter; | 44 import protobuf_unittest.ServiceWithNoOuter; |
52 import protobuf_unittest.UnittestOptimizeFor.TestOptimizedForSize; | 45 import protobuf_unittest.UnittestOptimizeFor.TestOptimizedForSize; |
53 import protobuf_unittest.UnittestOptimizeFor.TestOptionalOptimizedForSize; | 46 import protobuf_unittest.UnittestOptimizeFor.TestOptionalOptimizedForSize; |
54 import protobuf_unittest.UnittestOptimizeFor.TestRequiredOptimizedForSize; | 47 import protobuf_unittest.UnittestOptimizeFor.TestRequiredOptimizedForSize; |
55 import protobuf_unittest.UnittestProto; | 48 import protobuf_unittest.UnittestProto; |
56 import protobuf_unittest.UnittestProto.ForeignEnum; | 49 import protobuf_unittest.UnittestProto.ForeignEnum; |
57 import protobuf_unittest.UnittestProto.ForeignMessage; | 50 import protobuf_unittest.UnittestProto.ForeignMessage; |
58 import protobuf_unittest.UnittestProto.ForeignMessageOrBuilder; | 51 import protobuf_unittest.UnittestProto.ForeignMessageOrBuilder; |
59 import protobuf_unittest.UnittestProto.NestedTestAllTypes; | |
60 import protobuf_unittest.UnittestProto.TestAllExtensions; | 52 import protobuf_unittest.UnittestProto.TestAllExtensions; |
61 import protobuf_unittest.UnittestProto.TestAllTypes; | 53 import protobuf_unittest.UnittestProto.TestAllTypes; |
62 import protobuf_unittest.UnittestProto.TestAllTypes.NestedMessage; | 54 import protobuf_unittest.UnittestProto.TestAllTypes.NestedMessage; |
63 import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder; | 55 import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder; |
64 import protobuf_unittest.UnittestProto.TestExtremeDefaultValues; | 56 import protobuf_unittest.UnittestProto.TestExtremeDefaultValues; |
65 import protobuf_unittest.UnittestProto.TestOneof2; | |
66 import protobuf_unittest.UnittestProto.TestPackedTypes; | 57 import protobuf_unittest.UnittestProto.TestPackedTypes; |
67 import protobuf_unittest.UnittestProto.TestUnpackedTypes; | 58 import protobuf_unittest.UnittestProto.TestUnpackedTypes; |
68 | 59 |
69 import junit.framework.TestCase; | 60 import junit.framework.TestCase; |
70 | 61 |
71 import java.io.ByteArrayInputStream; | 62 import java.io.ByteArrayInputStream; |
72 import java.io.ByteArrayOutputStream; | 63 import java.io.ByteArrayOutputStream; |
73 import java.io.ObjectInputStream; | 64 import java.io.ObjectInputStream; |
74 import java.io.ObjectOutputStream; | 65 import java.io.ObjectOutputStream; |
75 import java.util.Arrays; | 66 import java.util.Arrays; |
76 import java.util.Collections; | 67 import java.util.Collections; |
77 import java.util.Iterator; | |
78 import java.util.List; | 68 import java.util.List; |
79 | 69 |
80 /** | 70 /** |
81 * Unit test for generated messages and generated code. See also | 71 * Unit test for generated messages and generated code. See also |
82 * {@link MessageTest}, which tests some generated message functionality. | 72 * {@link MessageTest}, which tests some generated message functionality. |
83 * | 73 * |
84 * @author kenton@google.com Kenton Varda | 74 * @author kenton@google.com Kenton Varda |
85 */ | 75 */ |
86 public class GeneratedMessageTest extends TestCase { | 76 public class GeneratedMessageTest extends TestCase { |
87 TestUtil.ReflectionTester reflectionTester = | 77 TestUtil.ReflectionTester reflectionTester = |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 assertEquals(200, value2.getOptionalSfixed64()); | 138 assertEquals(200, value2.getOptionalSfixed64()); |
149 assertEquals(200, value2.getRepeatedInt32(0)); | 139 assertEquals(200, value2.getRepeatedInt32(0)); |
150 assertEquals(UnittestImport.ImportEnum.IMPORT_FOO, | 140 assertEquals(UnittestImport.ImportEnum.IMPORT_FOO, |
151 value2.getOptionalImportEnum()); | 141 value2.getOptionalImportEnum()); |
152 assertEquals(UnittestImport.ImportEnum.IMPORT_FOO, | 142 assertEquals(UnittestImport.ImportEnum.IMPORT_FOO, |
153 value2.getRepeatedImportEnum(0)); | 143 value2.getRepeatedImportEnum(0)); |
154 assertEquals(2, value2.getOptionalForeignMessage().getC()); | 144 assertEquals(2, value2.getOptionalForeignMessage().getC()); |
155 assertEquals(2, value2.getRepeatedForeignMessage(0).getC()); | 145 assertEquals(2, value2.getRepeatedForeignMessage(0).getC()); |
156 } | 146 } |
157 | 147 |
158 public void testProtosShareRepeatedArraysIfDidntChange() throws Exception { | |
159 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
160 builder.addRepeatedInt32(100); | |
161 builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance()); | |
162 | |
163 TestAllTypes value1 = builder.build(); | |
164 TestAllTypes value2 = value1.toBuilder().build(); | |
165 | |
166 assertSame(value1.getRepeatedInt32List(), value2.getRepeatedInt32List()); | |
167 assertSame(value1.getRepeatedForeignMessageList(), | |
168 value2.getRepeatedForeignMessageList()); | |
169 } | |
170 | |
171 public void testRepeatedArraysAreImmutable() throws Exception { | 148 public void testRepeatedArraysAreImmutable() throws Exception { |
172 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 149 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
173 builder.addRepeatedInt32(100); | 150 builder.addRepeatedInt32(100); |
174 builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR); | 151 builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR); |
175 builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance()); | 152 builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance()); |
176 assertIsUnmodifiable(builder.getRepeatedInt32List()); | 153 assertIsUnmodifiable(builder.getRepeatedInt32List()); |
177 assertIsUnmodifiable(builder.getRepeatedImportEnumList()); | 154 assertIsUnmodifiable(builder.getRepeatedImportEnumList()); |
178 assertIsUnmodifiable(builder.getRepeatedForeignMessageList()); | 155 assertIsUnmodifiable(builder.getRepeatedForeignMessageList()); |
179 assertIsUnmodifiable(builder.getRepeatedFloatList()); | 156 assertIsUnmodifiable(builder.getRepeatedFloatList()); |
180 | 157 |
181 | 158 |
182 TestAllTypes value = builder.build(); | 159 TestAllTypes value = builder.build(); |
183 assertIsUnmodifiable(value.getRepeatedInt32List()); | 160 assertIsUnmodifiable(value.getRepeatedInt32List()); |
184 assertIsUnmodifiable(value.getRepeatedImportEnumList()); | 161 assertIsUnmodifiable(value.getRepeatedImportEnumList()); |
185 assertIsUnmodifiable(value.getRepeatedForeignMessageList()); | 162 assertIsUnmodifiable(value.getRepeatedForeignMessageList()); |
186 assertIsUnmodifiable(value.getRepeatedFloatList()); | 163 assertIsUnmodifiable(value.getRepeatedFloatList()); |
187 } | 164 } |
188 | 165 |
189 public void testParsedMessagesAreImmutable() throws Exception { | 166 public void testParsedMessagesAreImmutable() throws Exception { |
190 TestAllTypes value = TestAllTypes.parser().parseFrom(TestUtil.getAllSet().to
ByteString()); | 167 TestAllTypes value = TestAllTypes.PARSER.parseFrom( |
| 168 TestUtil.getAllSet().toByteString()); |
191 assertIsUnmodifiable(value.getRepeatedInt32List()); | 169 assertIsUnmodifiable(value.getRepeatedInt32List()); |
192 assertIsUnmodifiable(value.getRepeatedInt64List()); | 170 assertIsUnmodifiable(value.getRepeatedInt64List()); |
193 assertIsUnmodifiable(value.getRepeatedUint32List()); | 171 assertIsUnmodifiable(value.getRepeatedUint32List()); |
194 assertIsUnmodifiable(value.getRepeatedUint64List()); | 172 assertIsUnmodifiable(value.getRepeatedUint64List()); |
195 assertIsUnmodifiable(value.getRepeatedSint32List()); | 173 assertIsUnmodifiable(value.getRepeatedSint32List()); |
196 assertIsUnmodifiable(value.getRepeatedSint64List()); | 174 assertIsUnmodifiable(value.getRepeatedSint64List()); |
197 assertIsUnmodifiable(value.getRepeatedFixed32List()); | 175 assertIsUnmodifiable(value.getRepeatedFixed32List()); |
198 assertIsUnmodifiable(value.getRepeatedFixed64List()); | 176 assertIsUnmodifiable(value.getRepeatedFixed64List()); |
199 assertIsUnmodifiable(value.getRepeatedSfixed32List()); | 177 assertIsUnmodifiable(value.getRepeatedSfixed32List()); |
200 assertIsUnmodifiable(value.getRepeatedSfixed64List()); | 178 assertIsUnmodifiable(value.getRepeatedSfixed64List()); |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 // We expect this exception. | 372 // We expect this exception. |
395 } | 373 } |
396 | 374 |
397 try { | 375 try { |
398 builder.addAllRepeatedBytes(Arrays.asList(TestUtil.toBytes("one"), null)); | 376 builder.addAllRepeatedBytes(Arrays.asList(TestUtil.toBytes("one"), null)); |
399 fail("Exception was not thrown"); | 377 fail("Exception was not thrown"); |
400 } catch (NullPointerException e) { | 378 } catch (NullPointerException e) { |
401 // We expect this exception. | 379 // We expect this exception. |
402 } | 380 } |
403 } | 381 } |
404 | |
405 public void testRepeatedAppendIterateOnlyOnce() throws Exception { | |
406 // Create a Iterable that can only be iterated once. | |
407 Iterable<String> stringIterable = new Iterable<String>() { | |
408 private boolean called = false; | |
409 @Override | |
410 public Iterator<String> iterator() { | |
411 if (called) { | |
412 throw new IllegalStateException(); | |
413 } | |
414 called = true; | |
415 return Arrays.asList("one", "two", "three").iterator(); | |
416 } | |
417 }; | |
418 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
419 builder.addAllRepeatedString(stringIterable); | |
420 assertEquals(3, builder.getRepeatedStringCount()); | |
421 assertEquals("one", builder.getRepeatedString(0)); | |
422 assertEquals("two", builder.getRepeatedString(1)); | |
423 assertEquals("three", builder.getRepeatedString(2)); | |
424 | |
425 try { | |
426 builder.addAllRepeatedString(stringIterable); | |
427 fail("Exception was not thrown"); | |
428 } catch (IllegalStateException e) { | |
429 // We expect this exception. | |
430 } | |
431 } | |
432 | |
433 public void testMergeFromOtherRejectsNull() throws Exception { | |
434 try { | |
435 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
436 builder.mergeFrom((TestAllTypes) null); | |
437 fail("Exception was not thrown"); | |
438 } catch (NullPointerException e) { | |
439 // We expect this exception. | |
440 } | |
441 } | |
442 | 382 |
443 public void testSettingForeignMessageUsingBuilder() throws Exception { | 383 public void testSettingForeignMessageUsingBuilder() throws Exception { |
444 TestAllTypes message = TestAllTypes.newBuilder() | 384 TestAllTypes message = TestAllTypes.newBuilder() |
445 // Pass builder for foreign message instance. | 385 // Pass builder for foreign message instance. |
446 .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(123)) | 386 .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(123)) |
447 .build(); | 387 .build(); |
448 TestAllTypes expectedMessage = TestAllTypes.newBuilder() | 388 TestAllTypes expectedMessage = TestAllTypes.newBuilder() |
449 // Create expected version passing foreign message instance explicitly. | 389 // Create expected version passing foreign message instance explicitly. |
450 .setOptionalForeignMessage( | 390 .setOptionalForeignMessage( |
451 ForeignMessage.newBuilder().setC(123).build()) | 391 ForeignMessage.newBuilder().setC(123).build()) |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 reflectionTester.assertReflectionRepeatedSettersRejectNull(builder); | 469 reflectionTester.assertReflectionRepeatedSettersRejectNull(builder); |
530 } | 470 } |
531 | 471 |
532 public void testReflectionDefaults() throws Exception { | 472 public void testReflectionDefaults() throws Exception { |
533 reflectionTester.assertClearViaReflection( | 473 reflectionTester.assertClearViaReflection( |
534 TestAllTypes.getDefaultInstance()); | 474 TestAllTypes.getDefaultInstance()); |
535 reflectionTester.assertClearViaReflection( | 475 reflectionTester.assertClearViaReflection( |
536 TestAllTypes.newBuilder().build()); | 476 TestAllTypes.newBuilder().build()); |
537 } | 477 } |
538 | 478 |
539 public void testReflectionGetOneof() throws Exception { | |
540 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
541 reflectionTester.setAllFieldsViaReflection(builder); | |
542 Descriptors.OneofDescriptor oneof = | |
543 TestAllTypes.getDescriptor().getOneofs().get(0); | |
544 Descriptors.FieldDescriptor field = | |
545 TestAllTypes.getDescriptor().findFieldByName("oneof_bytes"); | |
546 assertSame(field, builder.getOneofFieldDescriptor(oneof)); | |
547 | |
548 TestAllTypes message = builder.build(); | |
549 assertSame(field, message.getOneofFieldDescriptor(oneof)); | |
550 } | |
551 | |
552 public void testReflectionClearOneof() throws Exception { | |
553 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
554 reflectionTester.setAllFieldsViaReflection(builder); | |
555 Descriptors.OneofDescriptor oneof = | |
556 TestAllTypes.getDescriptor().getOneofs().get(0); | |
557 Descriptors.FieldDescriptor field = | |
558 TestAllTypes.getDescriptor().findFieldByName("oneof_bytes"); | |
559 | |
560 assertTrue(builder.hasOneof(oneof)); | |
561 assertTrue(builder.hasField(field)); | |
562 builder.clearOneof(oneof); | |
563 assertFalse(builder.hasOneof(oneof)); | |
564 assertFalse(builder.hasField(field)); | |
565 } | |
566 | |
567 public void testEnumInterface() throws Exception { | 479 public void testEnumInterface() throws Exception { |
568 assertTrue(TestAllTypes.getDefaultInstance().getDefaultNestedEnum() | 480 assertTrue(TestAllTypes.getDefaultInstance().getDefaultNestedEnum() |
569 instanceof ProtocolMessageEnum); | 481 instanceof ProtocolMessageEnum); |
570 } | 482 } |
571 | 483 |
572 public void testEnumMap() throws Exception { | 484 public void testEnumMap() throws Exception { |
573 Internal.EnumLiteMap<ForeignEnum> map = ForeignEnum.internalGetValueMap(); | 485 Internal.EnumLiteMap<ForeignEnum> map = ForeignEnum.internalGetValueMap(); |
574 | 486 |
575 for (ForeignEnum value : ForeignEnum.values()) { | 487 for (ForeignEnum value : ForeignEnum.values()) { |
576 assertEquals(value, map.findValueByNumber(value.getNumber())); | 488 assertEquals(value, map.findValueByNumber(value.getNumber())); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 TestUtil.modifyRepeatedExtensions(builder); | 525 TestUtil.modifyRepeatedExtensions(builder); |
614 TestAllExtensions message = builder.build(); | 526 TestAllExtensions message = builder.build(); |
615 TestUtil.assertRepeatedExtensionsModified(message); | 527 TestUtil.assertRepeatedExtensionsModified(message); |
616 } | 528 } |
617 | 529 |
618 public void testExtensionDefaults() throws Exception { | 530 public void testExtensionDefaults() throws Exception { |
619 TestUtil.assertExtensionsClear(TestAllExtensions.getDefaultInstance()); | 531 TestUtil.assertExtensionsClear(TestAllExtensions.getDefaultInstance()); |
620 TestUtil.assertExtensionsClear(TestAllExtensions.newBuilder().build()); | 532 TestUtil.assertExtensionsClear(TestAllExtensions.newBuilder().build()); |
621 } | 533 } |
622 | 534 |
623 public void testUnsetRepeatedExtensionGetField() { | |
624 TestAllExtensions message = TestAllExtensions.getDefaultInstance(); | |
625 Object value; | |
626 | |
627 value = message.getField(UnittestProto.repeatedStringExtension.getDescriptor
()); | |
628 assertTrue(value instanceof List); | |
629 assertTrue(((List<?>) value).isEmpty()); | |
630 assertIsUnmodifiable((List<?>) value); | |
631 | |
632 value = message.getField(UnittestProto.repeatedNestedMessageExtension.getDes
criptor()); | |
633 assertTrue(value instanceof List); | |
634 assertTrue(((List<?>) value).isEmpty()); | |
635 assertIsUnmodifiable((List<?>) value); | |
636 } | |
637 | |
638 public void testExtensionReflectionGetters() throws Exception { | 535 public void testExtensionReflectionGetters() throws Exception { |
639 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); | 536 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); |
640 TestUtil.setAllExtensions(builder); | 537 TestUtil.setAllExtensions(builder); |
641 extensionsReflectionTester.assertAllFieldsSetViaReflection(builder); | 538 extensionsReflectionTester.assertAllFieldsSetViaReflection(builder); |
642 | 539 |
643 TestAllExtensions message = builder.build(); | 540 TestAllExtensions message = builder.build(); |
644 extensionsReflectionTester.assertAllFieldsSetViaReflection(message); | 541 extensionsReflectionTester.assertAllFieldsSetViaReflection(message); |
645 } | 542 } |
646 | 543 |
647 public void testExtensionReflectionSetters() throws Exception { | 544 public void testExtensionReflectionSetters() throws Exception { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
707 TestAllExtensions.newBuilder() | 604 TestAllExtensions.newBuilder() |
708 .setExtension(UnittestProto.optionalInt32Extension, 1).build(); | 605 .setExtension(UnittestProto.optionalInt32Extension, 1).build(); |
709 TestAllExtensions merged = | 606 TestAllExtensions merged = |
710 TestAllExtensions.newBuilder().mergeFrom(original).build(); | 607 TestAllExtensions.newBuilder().mergeFrom(original).build(); |
711 assertTrue(merged.hasExtension(UnittestProto.optionalInt32Extension)); | 608 assertTrue(merged.hasExtension(UnittestProto.optionalInt32Extension)); |
712 assertEquals( | 609 assertEquals( |
713 1, (int) merged.getExtension(UnittestProto.optionalInt32Extension)); | 610 1, (int) merged.getExtension(UnittestProto.optionalInt32Extension)); |
714 } | 611 } |
715 | 612 |
716 // ================================================================= | 613 // ================================================================= |
717 // Lite Extensions. | |
718 | |
719 // We test lite extensions directly because they have a separate | |
720 // implementation from full extensions. In contrast, we do not test | |
721 // lite fields directly since they are implemented exactly the same as | |
722 // regular fields. | |
723 | |
724 public void testLiteExtensionMessageOrBuilder() throws Exception { | |
725 TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder(); | |
726 TestUtilLite.setAllExtensions(builder); | |
727 TestUtil.assertAllExtensionsSet(builder); | |
728 | |
729 TestAllExtensionsLite message = builder.build(); | |
730 TestUtil.assertAllExtensionsSet(message); | |
731 } | |
732 | |
733 public void testLiteExtensionRepeatedSetters() throws Exception { | |
734 TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder(); | |
735 TestUtilLite.setAllExtensions(builder); | |
736 TestUtilLite.modifyRepeatedExtensions(builder); | |
737 TestUtil.assertRepeatedExtensionsModified(builder); | |
738 | |
739 TestAllExtensionsLite message = builder.build(); | |
740 TestUtil.assertRepeatedExtensionsModified(message); | |
741 } | |
742 | |
743 public void testLiteExtensionDefaults() throws Exception { | |
744 TestUtil.assertExtensionsClear(TestAllExtensionsLite.getDefaultInstance()); | |
745 TestUtil.assertExtensionsClear(TestAllExtensionsLite.newBuilder().build()); | |
746 } | |
747 | |
748 public void testClearLiteExtension() throws Exception { | |
749 // clearExtension() is not actually used in TestUtil, so try it manually. | |
750 assertFalse( | |
751 TestAllExtensionsLite.newBuilder() | |
752 .setExtension(UnittestLite.optionalInt32ExtensionLite, 1) | |
753 .clearExtension(UnittestLite.optionalInt32ExtensionLite) | |
754 .hasExtension(UnittestLite.optionalInt32ExtensionLite)); | |
755 assertEquals(0, | |
756 TestAllExtensionsLite.newBuilder() | |
757 .addExtension(UnittestLite.repeatedInt32ExtensionLite, 1) | |
758 .clearExtension(UnittestLite.repeatedInt32ExtensionLite) | |
759 .getExtensionCount(UnittestLite.repeatedInt32ExtensionLite)); | |
760 } | |
761 | |
762 public void testLiteExtensionCopy() throws Exception { | |
763 TestAllExtensionsLite original = TestUtilLite.getAllLiteExtensionsSet(); | |
764 TestAllExtensionsLite copy = | |
765 TestAllExtensionsLite.newBuilder(original).build(); | |
766 TestUtil.assertAllExtensionsSet(copy); | |
767 } | |
768 | |
769 public void testLiteExtensionMergeFrom() throws Exception { | |
770 TestAllExtensionsLite original = | |
771 TestAllExtensionsLite.newBuilder() | |
772 .setExtension(UnittestLite.optionalInt32ExtensionLite, 1).build(); | |
773 TestAllExtensionsLite merged = | |
774 TestAllExtensionsLite.newBuilder().mergeFrom(original).build(); | |
775 assertTrue(merged.hasExtension(UnittestLite.optionalInt32ExtensionLite)); | |
776 assertEquals( | |
777 1, (int) merged.getExtension(UnittestLite.optionalInt32ExtensionLite)); | |
778 } | |
779 | |
780 // ================================================================= | |
781 // multiple_files_test | 614 // multiple_files_test |
782 | 615 |
783 // Test that custom options of an file level enum are properly initialized. | |
784 // This test needs to be put before any other access to MultipleFilesTestProto | |
785 // or messages defined in multiple_files_test.proto because the class loading | |
786 // order affects initialization process of custom options. | |
787 public void testEnumValueOptionsInMultipleFilesMode() throws Exception { | |
788 assertEquals(12345, EnumWithNoOuter.FOO.getValueDescriptor().getOptions() | |
789 .getExtension(MultipleFilesTestProto.enumValueOption).intValue()); | |
790 } | |
791 | |
792 public void testMultipleFilesOption() throws Exception { | 616 public void testMultipleFilesOption() throws Exception { |
793 // We mostly just want to check that things compile. | 617 // We mostly just want to check that things compile. |
794 MessageWithNoOuter message = | 618 MessageWithNoOuter message = |
795 MessageWithNoOuter.newBuilder() | 619 MessageWithNoOuter.newBuilder() |
796 .setNested(MessageWithNoOuter.NestedMessage.newBuilder().setI(1)) | 620 .setNested(MessageWithNoOuter.NestedMessage.newBuilder().setI(1)) |
797 .addForeign(TestAllTypes.newBuilder().setOptionalInt32(1)) | 621 .addForeign(TestAllTypes.newBuilder().setOptionalInt32(1)) |
798 .setNestedEnum(MessageWithNoOuter.NestedEnum.BAZ) | 622 .setNestedEnum(MessageWithNoOuter.NestedEnum.BAZ) |
799 .setForeignEnum(EnumWithNoOuter.BAR) | 623 .setForeignEnum(EnumWithNoOuter.BAR) |
800 .build(); | 624 .build(); |
801 assertEquals(message, MessageWithNoOuter.parseFrom(message.toByteString())); | 625 assertEquals(message, MessageWithNoOuter.parseFrom(message.toByteString())); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
880 assertEquals(UnittestProto.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46); | 704 assertEquals(UnittestProto.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46); |
881 assertEquals( | 705 assertEquals( |
882 UnittestProto.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48); | 706 UnittestProto.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48); |
883 assertEquals(UnittestProto.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 51); | 707 assertEquals(UnittestProto.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 51); |
884 } | 708 } |
885 | 709 |
886 public void testRecursiveMessageDefaultInstance() throws Exception { | 710 public void testRecursiveMessageDefaultInstance() throws Exception { |
887 UnittestProto.TestRecursiveMessage message = | 711 UnittestProto.TestRecursiveMessage message = |
888 UnittestProto.TestRecursiveMessage.getDefaultInstance(); | 712 UnittestProto.TestRecursiveMessage.getDefaultInstance(); |
889 assertTrue(message != null); | 713 assertTrue(message != null); |
890 assertNotNull(message.getA()); | 714 assertTrue(message.getA() != null); |
891 assertTrue(message.getA() == message); | 715 assertTrue(message.getA() == message); |
892 } | 716 } |
893 | 717 |
894 public void testSerialize() throws Exception { | 718 public void testSerialize() throws Exception { |
895 ByteArrayOutputStream baos = new ByteArrayOutputStream(); | 719 ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
896 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 720 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
897 TestUtil.setAllFields(builder); | 721 TestUtil.setAllFields(builder); |
898 TestAllTypes expected = builder.build(); | 722 TestAllTypes expected = builder.build(); |
899 ObjectOutputStream out = new ObjectOutputStream(baos); | 723 ObjectOutputStream out = new ObjectOutputStream(baos); |
900 try { | 724 try { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
943 NonNestedExtension.nonNestedExtension.getDescriptor().getName()
); | 767 NonNestedExtension.nonNestedExtension.getDescriptor().getName()
); |
944 } | 768 } |
945 | 769 |
946 public void testNestedExtensionInitialization() { | 770 public void testNestedExtensionInitialization() { |
947 assertTrue(MyNestedExtension.recursiveExtension.getMessageDefaultInstance() | 771 assertTrue(MyNestedExtension.recursiveExtension.getMessageDefaultInstance() |
948 instanceof MessageToBeExtended); | 772 instanceof MessageToBeExtended); |
949 assertEquals("recursiveExtension", | 773 assertEquals("recursiveExtension", |
950 MyNestedExtension.recursiveExtension.getDescriptor().getName())
; | 774 MyNestedExtension.recursiveExtension.getDescriptor().getName())
; |
951 } | 775 } |
952 | 776 |
953 public void testNonNestedExtensionLiteInitialization() { | |
954 assertTrue(NonNestedExtensionLite.nonNestedExtensionLite | |
955 .getMessageDefaultInstance() instanceof MyNonNestedExtensionLite)
; | |
956 } | |
957 | |
958 public void testNestedExtensionLiteInitialization() { | |
959 assertTrue(MyNestedExtensionLite.recursiveExtensionLite | |
960 .getMessageDefaultInstance() instanceof MessageLiteToBeExtended); | |
961 } | |
962 | |
963 public void testInvalidations() throws Exception { | |
964 GeneratedMessage.enableAlwaysUseFieldBuildersForTesting(); | |
965 TestAllTypes.NestedMessage nestedMessage1 = | |
966 TestAllTypes.NestedMessage.newBuilder().build(); | |
967 TestAllTypes.NestedMessage nestedMessage2 = | |
968 TestAllTypes.NestedMessage.newBuilder().build(); | |
969 | |
970 // Set all three flavors (enum, primitive, message and singular/repeated) | |
971 // and verify no invalidations fired | |
972 TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); | |
973 | |
974 TestAllTypes.Builder builder = (TestAllTypes.Builder) | |
975 ((GeneratedMessage) TestAllTypes.getDefaultInstance()). | |
976 newBuilderForType(mockParent); | |
977 builder.setOptionalInt32(1); | |
978 builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAR); | |
979 builder.setOptionalNestedMessage(nestedMessage1); | |
980 builder.addRepeatedInt32(1); | |
981 builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAR); | |
982 builder.addRepeatedNestedMessage(nestedMessage1); | |
983 assertEquals(0, mockParent.getInvalidationCount()); | |
984 | |
985 // Now tell it we want changes and make sure it's only fired once | |
986 // And do this for each flavor | |
987 | |
988 // primitive single | |
989 builder.buildPartial(); | |
990 builder.setOptionalInt32(2); | |
991 builder.setOptionalInt32(3); | |
992 assertEquals(1, mockParent.getInvalidationCount()); | |
993 | |
994 // enum single | |
995 builder.buildPartial(); | |
996 builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAZ); | |
997 builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAR); | |
998 assertEquals(2, mockParent.getInvalidationCount()); | |
999 | |
1000 // message single | |
1001 builder.buildPartial(); | |
1002 builder.setOptionalNestedMessage(nestedMessage2); | |
1003 builder.setOptionalNestedMessage(nestedMessage1); | |
1004 assertEquals(3, mockParent.getInvalidationCount()); | |
1005 | |
1006 // primitive repeated | |
1007 builder.buildPartial(); | |
1008 builder.addRepeatedInt32(2); | |
1009 builder.addRepeatedInt32(3); | |
1010 assertEquals(4, mockParent.getInvalidationCount()); | |
1011 | |
1012 // enum repeated | |
1013 builder.buildPartial(); | |
1014 builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAZ); | |
1015 builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAZ); | |
1016 assertEquals(5, mockParent.getInvalidationCount()); | |
1017 | |
1018 // message repeated | |
1019 builder.buildPartial(); | |
1020 builder.addRepeatedNestedMessage(nestedMessage2); | |
1021 builder.addRepeatedNestedMessage(nestedMessage1); | |
1022 assertEquals(6, mockParent.getInvalidationCount()); | |
1023 | |
1024 } | |
1025 | |
1026 public void testInvalidations_Extensions() throws Exception { | |
1027 TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); | |
1028 | |
1029 TestAllExtensions.Builder builder = (TestAllExtensions.Builder) | |
1030 ((GeneratedMessage) TestAllExtensions.getDefaultInstance()). | |
1031 newBuilderForType(mockParent); | |
1032 | |
1033 builder.addExtension(UnittestProto.repeatedInt32Extension, 1); | |
1034 builder.setExtension(UnittestProto.repeatedInt32Extension, 0, 2); | |
1035 builder.clearExtension(UnittestProto.repeatedInt32Extension); | |
1036 assertEquals(0, mockParent.getInvalidationCount()); | |
1037 | |
1038 // Now tell it we want changes and make sure it's only fired once | |
1039 builder.buildPartial(); | |
1040 builder.addExtension(UnittestProto.repeatedInt32Extension, 2); | |
1041 builder.addExtension(UnittestProto.repeatedInt32Extension, 3); | |
1042 assertEquals(1, mockParent.getInvalidationCount()); | |
1043 | |
1044 builder.buildPartial(); | |
1045 builder.setExtension(UnittestProto.repeatedInt32Extension, 0, 4); | |
1046 builder.setExtension(UnittestProto.repeatedInt32Extension, 1, 5); | |
1047 assertEquals(2, mockParent.getInvalidationCount()); | |
1048 | |
1049 builder.buildPartial(); | |
1050 builder.clearExtension(UnittestProto.repeatedInt32Extension); | |
1051 builder.clearExtension(UnittestProto.repeatedInt32Extension); | |
1052 assertEquals(3, mockParent.getInvalidationCount()); | |
1053 } | |
1054 | 777 |
1055 public void testBaseMessageOrBuilder() { | 778 public void testBaseMessageOrBuilder() { |
1056 // Mostly just makes sure the base interface exists and has some methods. | 779 // Mostly just makes sure the base interface exists and has some methods. |
1057 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 780 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
1058 TestAllTypes message = builder.buildPartial(); | 781 TestAllTypes message = builder.buildPartial(); |
1059 TestAllTypesOrBuilder builderAsInterface = (TestAllTypesOrBuilder) builder; | 782 TestAllTypesOrBuilder builderAsInterface = (TestAllTypesOrBuilder) builder; |
1060 TestAllTypesOrBuilder messageAsInterface = (TestAllTypesOrBuilder) message; | 783 TestAllTypesOrBuilder messageAsInterface = (TestAllTypesOrBuilder) message; |
1061 | 784 |
1062 assertEquals( | 785 assertEquals( |
1063 messageAsInterface.getDefaultBool(), | 786 messageAsInterface.getDefaultBool(), |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1228 // We expect this exception. | 951 // We expect this exception. |
1229 } | 952 } |
1230 try { | 953 try { |
1231 builder.getFieldBuilder( | 954 builder.getFieldBuilder( |
1232 descriptor.findFieldByName("repeated_nested_message")); | 955 descriptor.findFieldByName("repeated_nested_message")); |
1233 fail("Exception was not thrown"); | 956 fail("Exception was not thrown"); |
1234 } catch (UnsupportedOperationException e) { | 957 } catch (UnsupportedOperationException e) { |
1235 // We expect this exception. | 958 // We expect this exception. |
1236 } | 959 } |
1237 } | 960 } |
1238 | |
1239 // Test that when the default outer class name conflicts with another type | |
1240 // defined in the proto the compiler will append a suffix to avoid the | |
1241 // conflict. | |
1242 public void testConflictingOuterClassName() { | |
1243 // We just need to make sure we can refer to the outer class with the | |
1244 // expected name. There is nothing else to test. | |
1245 OuterClassNameTestOuterClass.OuterClassNameTest message = | |
1246 OuterClassNameTestOuterClass.OuterClassNameTest.newBuilder().build(); | |
1247 assertTrue(message.getDescriptorForType() == | |
1248 OuterClassNameTestOuterClass.OuterClassNameTest.getDescriptor()); | |
1249 | |
1250 OuterClassNameTest2OuterClass.TestMessage2.NestedMessage.OuterClassNameTest2 | |
1251 message2 = OuterClassNameTest2OuterClass.TestMessage2.NestedMessage | |
1252 .OuterClassNameTest2.newBuilder().build(); | |
1253 assertEquals(0, message2.getSerializedSize()); | |
1254 | |
1255 OuterClassNameTest3OuterClass.TestMessage3.NestedMessage.OuterClassNameTest3 | |
1256 enumValue = OuterClassNameTest3OuterClass.TestMessage3.NestedMessage | |
1257 .OuterClassNameTest3.DUMMY_VALUE; | |
1258 assertEquals(1, enumValue.getNumber()); | |
1259 } | |
1260 | |
1261 // ================================================================= | |
1262 // oneof generated code test | |
1263 public void testOneofEnumCase() throws Exception { | |
1264 TestOneof2 message = TestOneof2.newBuilder() | |
1265 .setFooInt(123).setFooString("foo").setFooCord("bar").build(); | |
1266 TestUtil.assertAtMostOneFieldSetOneof(message); | |
1267 } | |
1268 | |
1269 public void testClearOneof() throws Exception { | |
1270 TestOneof2.Builder builder = TestOneof2.newBuilder().setFooInt(123); | |
1271 assertEquals(TestOneof2.FooCase.FOO_INT, builder.getFooCase()); | |
1272 builder.clearFoo(); | |
1273 assertEquals(TestOneof2.FooCase.FOO_NOT_SET, builder.getFooCase()); | |
1274 } | |
1275 | |
1276 public void testSetOneofClearsOthers() throws Exception { | |
1277 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
1278 TestOneof2 message = | |
1279 builder.setFooInt(123).setFooString("foo").buildPartial(); | |
1280 assertTrue(message.hasFooString()); | |
1281 TestUtil.assertAtMostOneFieldSetOneof(message); | |
1282 | |
1283 message = builder.setFooCord("bar").buildPartial(); | |
1284 assertTrue(message.hasFooCord()); | |
1285 TestUtil.assertAtMostOneFieldSetOneof(message); | |
1286 | |
1287 message = builder.setFooStringPiece("baz").buildPartial(); | |
1288 assertTrue(message.hasFooStringPiece()); | |
1289 TestUtil.assertAtMostOneFieldSetOneof(message); | |
1290 | |
1291 message = builder.setFooBytes(TestUtil.toBytes("qux")).buildPartial(); | |
1292 assertTrue(message.hasFooBytes()); | |
1293 TestUtil.assertAtMostOneFieldSetOneof(message); | |
1294 | |
1295 message = builder.setFooEnum(TestOneof2.NestedEnum.FOO).buildPartial(); | |
1296 assertTrue(message.hasFooEnum()); | |
1297 TestUtil.assertAtMostOneFieldSetOneof(message); | |
1298 | |
1299 message = builder.setFooMessage( | |
1300 TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()).buildParti
al(); | |
1301 assertTrue(message.hasFooMessage()); | |
1302 TestUtil.assertAtMostOneFieldSetOneof(message); | |
1303 | |
1304 message = builder.setFooInt(123).buildPartial(); | |
1305 assertTrue(message.hasFooInt()); | |
1306 TestUtil.assertAtMostOneFieldSetOneof(message); | |
1307 } | |
1308 | |
1309 public void testOneofTypes() throws Exception { | |
1310 // Primitive | |
1311 { | |
1312 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
1313 assertEquals(builder.getFooInt(), 0); | |
1314 assertFalse(builder.hasFooInt()); | |
1315 assertTrue(builder.setFooInt(123).hasFooInt()); | |
1316 assertEquals(builder.getFooInt(), 123); | |
1317 TestOneof2 message = builder.buildPartial(); | |
1318 assertTrue(message.hasFooInt()); | |
1319 assertEquals(message.getFooInt(), 123); | |
1320 | |
1321 assertFalse(builder.clearFooInt().hasFooInt()); | |
1322 TestOneof2 message2 = builder.build(); | |
1323 assertFalse(message2.hasFooInt()); | |
1324 assertEquals(message2.getFooInt(), 0); | |
1325 } | |
1326 | |
1327 // Enum | |
1328 { | |
1329 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
1330 assertEquals(builder.getFooEnum(), TestOneof2.NestedEnum.FOO); | |
1331 assertTrue(builder.setFooEnum(TestOneof2.NestedEnum.BAR).hasFooEnum()); | |
1332 assertEquals(builder.getFooEnum(), TestOneof2.NestedEnum.BAR); | |
1333 TestOneof2 message = builder.buildPartial(); | |
1334 assertTrue(message.hasFooEnum()); | |
1335 assertEquals(message.getFooEnum(), TestOneof2.NestedEnum.BAR); | |
1336 | |
1337 assertFalse(builder.clearFooEnum().hasFooEnum()); | |
1338 TestOneof2 message2 = builder.build(); | |
1339 assertFalse(message2.hasFooEnum()); | |
1340 assertEquals(message2.getFooEnum(), TestOneof2.NestedEnum.FOO); | |
1341 } | |
1342 | |
1343 // String | |
1344 { | |
1345 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
1346 assertEquals(builder.getFooString(), ""); | |
1347 builder.setFooString("foo"); | |
1348 assertTrue(builder.hasFooString()); | |
1349 assertEquals(builder.getFooString(), "foo"); | |
1350 TestOneof2 message = builder.buildPartial(); | |
1351 assertTrue(message.hasFooString()); | |
1352 assertEquals(message.getFooString(), "foo"); | |
1353 assertEquals(message.getFooStringBytes(), TestUtil.toBytes("foo")); | |
1354 | |
1355 assertFalse(builder.clearFooString().hasFooString()); | |
1356 TestOneof2 message2 = builder.buildPartial(); | |
1357 assertFalse(message2.hasFooString()); | |
1358 assertEquals(message2.getFooString(), ""); | |
1359 assertEquals(message2.getFooStringBytes(), TestUtil.toBytes("")); | |
1360 | |
1361 // Get method should not change the oneof value. | |
1362 builder.setFooInt(123); | |
1363 assertEquals(builder.getFooString(), ""); | |
1364 assertEquals(builder.getFooStringBytes(), TestUtil.toBytes("")); | |
1365 assertEquals(123, builder.getFooInt()); | |
1366 | |
1367 message = builder.build(); | |
1368 assertEquals(message.getFooString(), ""); | |
1369 assertEquals(message.getFooStringBytes(), TestUtil.toBytes("")); | |
1370 assertEquals(123, message.getFooInt()); | |
1371 } | |
1372 | |
1373 // Cord | |
1374 { | |
1375 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
1376 assertEquals(builder.getFooCord(), ""); | |
1377 builder.setFooCord("foo"); | |
1378 assertTrue(builder.hasFooCord()); | |
1379 assertEquals(builder.getFooCord(), "foo"); | |
1380 TestOneof2 message = builder.buildPartial(); | |
1381 assertTrue(message.hasFooCord()); | |
1382 assertEquals(message.getFooCord(), "foo"); | |
1383 assertEquals(message.getFooCordBytes(), TestUtil.toBytes("foo")); | |
1384 | |
1385 assertFalse(builder.clearFooCord().hasFooCord()); | |
1386 TestOneof2 message2 = builder.build(); | |
1387 assertFalse(message2.hasFooCord()); | |
1388 assertEquals(message2.getFooCord(), ""); | |
1389 assertEquals(message2.getFooCordBytes(), TestUtil.toBytes("")); | |
1390 } | |
1391 | |
1392 // StringPiece | |
1393 { | |
1394 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
1395 assertEquals(builder.getFooStringPiece(), ""); | |
1396 builder.setFooStringPiece("foo"); | |
1397 assertTrue(builder.hasFooStringPiece()); | |
1398 assertEquals(builder.getFooStringPiece(), "foo"); | |
1399 TestOneof2 message = builder.buildPartial(); | |
1400 assertTrue(message.hasFooStringPiece()); | |
1401 assertEquals(message.getFooStringPiece(), "foo"); | |
1402 assertEquals(message.getFooStringPieceBytes(), TestUtil.toBytes("foo")); | |
1403 | |
1404 assertFalse(builder.clearFooStringPiece().hasFooStringPiece()); | |
1405 TestOneof2 message2 = builder.build(); | |
1406 assertFalse(message2.hasFooStringPiece()); | |
1407 assertEquals(message2.getFooStringPiece(), ""); | |
1408 assertEquals(message2.getFooStringPieceBytes(), TestUtil.toBytes("")); | |
1409 } | |
1410 | |
1411 // Message | |
1412 { | |
1413 // set | |
1414 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
1415 assertEquals(builder.getFooMessage().getQuxInt(), 0); | |
1416 builder.setFooMessage( | |
1417 TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()); | |
1418 assertTrue(builder.hasFooMessage()); | |
1419 assertEquals(builder.getFooMessage().getQuxInt(), 234); | |
1420 TestOneof2 message = builder.buildPartial(); | |
1421 assertTrue(message.hasFooMessage()); | |
1422 assertEquals(message.getFooMessage().getQuxInt(), 234); | |
1423 | |
1424 // clear | |
1425 assertFalse(builder.clearFooMessage().hasFooString()); | |
1426 message = builder.build(); | |
1427 assertFalse(message.hasFooMessage()); | |
1428 assertEquals(message.getFooMessage().getQuxInt(), 0); | |
1429 | |
1430 // nested builder | |
1431 builder = TestOneof2.newBuilder(); | |
1432 assertSame(builder.getFooMessageOrBuilder(), | |
1433 TestOneof2.NestedMessage.getDefaultInstance()); | |
1434 assertFalse(builder.hasFooMessage()); | |
1435 builder.getFooMessageBuilder().setQuxInt(123); | |
1436 assertTrue(builder.hasFooMessage()); | |
1437 assertEquals(builder.getFooMessage().getQuxInt(), 123); | |
1438 message = builder.build(); | |
1439 assertTrue(message.hasFooMessage()); | |
1440 assertEquals(message.getFooMessage().getQuxInt(), 123); | |
1441 } | |
1442 | |
1443 // LazyMessage is tested in LazyMessageLiteTest.java | |
1444 } | |
1445 | |
1446 public void testOneofMerge() throws Exception { | |
1447 // Primitive Type | |
1448 { | |
1449 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
1450 TestOneof2 message = builder.setFooInt(123).build(); | |
1451 TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build(); | |
1452 assertTrue(message2.hasFooInt()); | |
1453 assertEquals(message2.getFooInt(), 123); | |
1454 } | |
1455 | |
1456 // String | |
1457 { | |
1458 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
1459 TestOneof2 message = builder.setFooString("foo").build(); | |
1460 TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build(); | |
1461 assertTrue(message2.hasFooString()); | |
1462 assertEquals(message2.getFooString(), "foo"); | |
1463 } | |
1464 | |
1465 // Enum | |
1466 { | |
1467 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
1468 TestOneof2 message = builder.setFooEnum(TestOneof2.NestedEnum.BAR).build()
; | |
1469 TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build(); | |
1470 assertTrue(message2.hasFooEnum()); | |
1471 assertEquals(message2.getFooEnum(), TestOneof2.NestedEnum.BAR); | |
1472 } | |
1473 | |
1474 // Message | |
1475 { | |
1476 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
1477 TestOneof2 message = builder.setFooMessage( | |
1478 TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()).build(); | |
1479 TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build(); | |
1480 assertTrue(message2.hasFooMessage()); | |
1481 assertEquals(message2.getFooMessage().getQuxInt(), 234); | |
1482 } | |
1483 } | |
1484 | |
1485 public void testOneofSerialization() throws Exception { | |
1486 // Primitive Type | |
1487 { | |
1488 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
1489 TestOneof2 message = builder.setFooInt(123).build(); | |
1490 ByteString serialized = message.toByteString(); | |
1491 TestOneof2 message2 = TestOneof2.parseFrom(serialized); | |
1492 assertTrue(message2.hasFooInt()); | |
1493 assertEquals(message2.getFooInt(), 123); | |
1494 } | |
1495 | |
1496 // String | |
1497 { | |
1498 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
1499 TestOneof2 message = builder.setFooString("foo").build(); | |
1500 ByteString serialized = message.toByteString(); | |
1501 TestOneof2 message2 = TestOneof2.parseFrom(serialized); | |
1502 assertTrue(message2.hasFooString()); | |
1503 assertEquals(message2.getFooString(), "foo"); | |
1504 } | |
1505 | |
1506 // Enum | |
1507 { | |
1508 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
1509 TestOneof2 message = builder.setFooEnum(TestOneof2.NestedEnum.BAR).build()
; | |
1510 ByteString serialized = message.toByteString(); | |
1511 TestOneof2 message2 = TestOneof2.parseFrom(serialized); | |
1512 assertTrue(message2.hasFooEnum()); | |
1513 assertEquals(message2.getFooEnum(), TestOneof2.NestedEnum.BAR); | |
1514 } | |
1515 | |
1516 // Message | |
1517 { | |
1518 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
1519 TestOneof2 message = builder.setFooMessage( | |
1520 TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()).build(); | |
1521 ByteString serialized = message.toByteString(); | |
1522 TestOneof2 message2 = TestOneof2.parseFrom(serialized); | |
1523 assertTrue(message2.hasFooMessage()); | |
1524 assertEquals(message2.getFooMessage().getQuxInt(), 234); | |
1525 } | |
1526 } | |
1527 | |
1528 public void testOneofNestedBuilderOnChangePropagation() { | |
1529 NestedTestAllTypes.Builder parentBuilder = NestedTestAllTypes.newBuilder(); | |
1530 TestAllTypes.Builder builder = parentBuilder.getPayloadBuilder(); | |
1531 builder.getOneofNestedMessageBuilder(); | |
1532 assertTrue(builder.hasOneofNestedMessage()); | |
1533 assertTrue(parentBuilder.hasPayload()); | |
1534 NestedTestAllTypes message = parentBuilder.build(); | |
1535 assertTrue(message.hasPayload()); | |
1536 assertTrue(message.getPayload().hasOneofNestedMessage()); | |
1537 } | |
1538 | |
1539 public void testGetRepeatedFieldBuilder() { | |
1540 Descriptor descriptor = TestAllTypes.getDescriptor(); | |
1541 | |
1542 FieldDescriptor fieldDescriptor = | |
1543 descriptor.findFieldByName("repeated_nested_message"); | |
1544 FieldDescriptor foreignFieldDescriptor = | |
1545 descriptor.findFieldByName("repeated_foreign_message"); | |
1546 FieldDescriptor importFieldDescriptor = | |
1547 descriptor.findFieldByName("repeated_import_message"); | |
1548 | |
1549 // Mutate the message with new field builder | |
1550 // Mutate nested message | |
1551 TestAllTypes.Builder builder1 = TestAllTypes.newBuilder(); | |
1552 Message.Builder fieldBuilder1 = builder1.newBuilderForField( | |
1553 fieldDescriptor); | |
1554 FieldDescriptor subFieldDescriptor1 = | |
1555 fieldBuilder1.getDescriptorForType().findFieldByName("bb"); | |
1556 fieldBuilder1.setField(subFieldDescriptor1, 1); | |
1557 builder1.addRepeatedField(fieldDescriptor, fieldBuilder1.build()); | |
1558 | |
1559 // Mutate foreign message | |
1560 Message.Builder foreignFieldBuilder1 = builder1.newBuilderForField( | |
1561 foreignFieldDescriptor); | |
1562 FieldDescriptor subForeignFieldDescriptor1 = | |
1563 foreignFieldBuilder1.getDescriptorForType().findFieldByName("c"); | |
1564 foreignFieldBuilder1.setField(subForeignFieldDescriptor1, 2); | |
1565 builder1.addRepeatedField(foreignFieldDescriptor, | |
1566 foreignFieldBuilder1.build()); | |
1567 | |
1568 // Mutate import message | |
1569 Message.Builder importFieldBuilder1 = builder1.newBuilderForField( | |
1570 importFieldDescriptor); | |
1571 FieldDescriptor subImportFieldDescriptor1 = | |
1572 importFieldBuilder1.getDescriptorForType().findFieldByName("d"); | |
1573 importFieldBuilder1.setField(subImportFieldDescriptor1, 3); | |
1574 builder1.addRepeatedField(importFieldDescriptor, | |
1575 importFieldBuilder1.build()); | |
1576 | |
1577 Message newMessage1 = builder1.build(); | |
1578 | |
1579 // Mutate the message with existing field builder | |
1580 // Mutate nested message | |
1581 TestAllTypes.Builder builder2 = TestAllTypes.newBuilder(); | |
1582 builder2.addRepeatedNestedMessageBuilder(); | |
1583 Message.Builder fieldBuilder2 = builder2.getRepeatedFieldBuilder( | |
1584 fieldDescriptor, 0); | |
1585 FieldDescriptor subFieldDescriptor2 = | |
1586 fieldBuilder2.getDescriptorForType().findFieldByName("bb"); | |
1587 fieldBuilder2.setField(subFieldDescriptor2, 1); | |
1588 | |
1589 // Mutate foreign message | |
1590 Message.Builder foreignFieldBuilder2 = builder2.newBuilderForField( | |
1591 foreignFieldDescriptor); | |
1592 FieldDescriptor subForeignFieldDescriptor2 = | |
1593 foreignFieldBuilder2.getDescriptorForType().findFieldByName("c"); | |
1594 foreignFieldBuilder2.setField(subForeignFieldDescriptor2, 2); | |
1595 builder2.addRepeatedField(foreignFieldDescriptor, | |
1596 foreignFieldBuilder2.build()); | |
1597 | |
1598 // Mutate import message | |
1599 Message.Builder importFieldBuilder2 = builder2.newBuilderForField( | |
1600 importFieldDescriptor); | |
1601 FieldDescriptor subImportFieldDescriptor2 = | |
1602 importFieldBuilder2.getDescriptorForType().findFieldByName("d"); | |
1603 importFieldBuilder2.setField(subImportFieldDescriptor2, 3); | |
1604 builder2.addRepeatedField(importFieldDescriptor, | |
1605 importFieldBuilder2.build()); | |
1606 | |
1607 Message newMessage2 = builder2.build(); | |
1608 | |
1609 // These two messages should be equal. | |
1610 assertEquals(newMessage1, newMessage2); | |
1611 } | |
1612 | |
1613 public void testGetRepeatedFieldBuilderWithInitializedValue() { | |
1614 Descriptor descriptor = TestAllTypes.getDescriptor(); | |
1615 FieldDescriptor fieldDescriptor = | |
1616 descriptor.findFieldByName("repeated_nested_message"); | |
1617 | |
1618 // Before setting field, builder is initialized by default value. | |
1619 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
1620 builder.addRepeatedNestedMessageBuilder(); | |
1621 NestedMessage.Builder fieldBuilder = | |
1622 (NestedMessage.Builder) builder.getRepeatedFieldBuilder(fieldDescriptor,
0); | |
1623 assertEquals(0, fieldBuilder.getBb()); | |
1624 | |
1625 // Setting field value with new field builder instance. | |
1626 builder = TestAllTypes.newBuilder(); | |
1627 NestedMessage.Builder newFieldBuilder = | |
1628 builder.addRepeatedNestedMessageBuilder(); | |
1629 newFieldBuilder.setBb(2); | |
1630 // Then get the field builder instance by getRepeatedFieldBuilder(). | |
1631 fieldBuilder = | |
1632 (NestedMessage.Builder) builder.getRepeatedFieldBuilder(fieldDescriptor,
0); | |
1633 // It should contain new value. | |
1634 assertEquals(2, fieldBuilder.getBb()); | |
1635 // These two builder should be equal. | |
1636 assertSame(fieldBuilder, newFieldBuilder); | |
1637 } | |
1638 | |
1639 public void testGetRepeatedFieldBuilderNotSupportedException() { | |
1640 Descriptor descriptor = TestAllTypes.getDescriptor(); | |
1641 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
1642 try { | |
1643 builder.getRepeatedFieldBuilder(descriptor.findFieldByName("repeated_int32
"), 0); | |
1644 fail("Exception was not thrown"); | |
1645 } catch (UnsupportedOperationException e) { | |
1646 // We expect this exception. | |
1647 } | |
1648 try { | |
1649 builder.getRepeatedFieldBuilder( | |
1650 descriptor.findFieldByName("repeated_nested_enum"), 0); | |
1651 fail("Exception was not thrown"); | |
1652 } catch (UnsupportedOperationException e) { | |
1653 // We expect this exception. | |
1654 } | |
1655 try { | |
1656 builder.getRepeatedFieldBuilder(descriptor.findFieldByName("optional_int32
"), 0); | |
1657 fail("Exception was not thrown"); | |
1658 } catch (UnsupportedOperationException e) { | |
1659 // We expect this exception. | |
1660 } | |
1661 try { | |
1662 builder.getRepeatedFieldBuilder( | |
1663 descriptor.findFieldByName("optional_nested_enum"), 0); | |
1664 fail("Exception was not thrown"); | |
1665 } catch (UnsupportedOperationException e) { | |
1666 // We expect this exception. | |
1667 } | |
1668 try { | |
1669 builder.getRepeatedFieldBuilder( | |
1670 descriptor.findFieldByName("optional_nested_message"), 0); | |
1671 fail("Exception was not thrown"); | |
1672 } catch (UnsupportedOperationException e) { | |
1673 // We expect this exception. | |
1674 } | |
1675 } | |
1676 } | 961 } |
OLD | NEW |