1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2008 Google Inc. All rights reserved. 3 // 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file or at 6 // https://developers.google.com/open-source/licenses/bsd 7 8 package com.google.protobuf; 9 10 import static com.google.common.truth.Truth.assertThat; 11 12 import protobuf_unittest.UnittestProto.TestAllTypes; 13 import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder; 14 import org.junit.Test; 15 import org.junit.runner.RunWith; 16 import org.junit.runners.JUnit4; 17 18 /** 19 * Tests for {@link SingleFieldBuilder}. This tests basic functionality. More extensive testing is 20 * provided via other tests that exercise the builder. 21 */ 22 @RunWith(JUnit4.class) 23 public class SingleFieldBuilderTest { 24 25 @Test testBasicUseAndInvalidations()26 public void testBasicUseAndInvalidations() { 27 TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); 28 SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, TestAllTypesOrBuilder> builder = 29 new SingleFieldBuilder<>(TestAllTypes.getDefaultInstance(), mockParent, false); 30 assertThat(builder.getMessage()).isSameInstanceAs(TestAllTypes.getDefaultInstance()); 31 assertThat(builder.getBuilder().buildPartial()).isEqualTo(TestAllTypes.getDefaultInstance()); 32 assertThat(mockParent.getInvalidationCount()).isEqualTo(0); 33 34 builder.getBuilder().setOptionalInt32(10); 35 assertThat(mockParent.getInvalidationCount()).isEqualTo(0); 36 TestAllTypes message = builder.build(); 37 assertThat(message.getOptionalInt32()).isEqualTo(10); 38 39 // Test that we receive invalidations now that build has been called. 40 assertThat(mockParent.getInvalidationCount()).isEqualTo(0); 41 builder.getBuilder().setOptionalInt32(20); 42 assertThat(mockParent.getInvalidationCount()).isEqualTo(1); 43 44 // Test that we don't keep getting invalidations on every change 45 builder.getBuilder().setOptionalInt32(30); 46 assertThat(mockParent.getInvalidationCount()).isEqualTo(1); 47 } 48 49 @Test testSetMessage()50 public void testSetMessage() { 51 TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); 52 SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, TestAllTypesOrBuilder> builder = 53 new SingleFieldBuilder<>(TestAllTypes.getDefaultInstance(), mockParent, false); 54 builder.setMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build()); 55 assertThat(builder.getMessage().getOptionalInt32()).isEqualTo(0); 56 57 // Update message using the builder 58 builder.getBuilder().setOptionalInt32(1); 59 assertThat(mockParent.getInvalidationCount()).isEqualTo(0); 60 assertThat(builder.getBuilder().getOptionalInt32()).isEqualTo(1); 61 assertThat(builder.getMessage().getOptionalInt32()).isEqualTo(1); 62 TestAllTypes unused = builder.build(); 63 builder.getBuilder().setOptionalInt32(2); 64 assertThat(builder.getBuilder().getOptionalInt32()).isEqualTo(2); 65 assertThat(builder.getMessage().getOptionalInt32()).isEqualTo(2); 66 67 // Make sure message stays cached 68 assertThat(builder.getMessage()).isSameInstanceAs(builder.getMessage()); 69 } 70 71 @Test testClear()72 public void testClear() { 73 TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); 74 SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, TestAllTypesOrBuilder> builder = 75 new SingleFieldBuilder<>(TestAllTypes.getDefaultInstance(), mockParent, false); 76 builder.setMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build()); 77 assertThat(TestAllTypes.getDefaultInstance()).isNotSameInstanceAs(builder.getMessage()); 78 builder.clear(); 79 assertThat(builder.getMessage()).isSameInstanceAs(TestAllTypes.getDefaultInstance()); 80 81 builder.getBuilder().setOptionalInt32(1); 82 assertThat(TestAllTypes.getDefaultInstance()).isNotSameInstanceAs(builder.getMessage()); 83 builder.clear(); 84 assertThat(builder.getMessage()).isSameInstanceAs(TestAllTypes.getDefaultInstance()); 85 } 86 87 @Test testMerge()88 public void testMerge() { 89 TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); 90 SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, TestAllTypesOrBuilder> builder = 91 new SingleFieldBuilder<>(TestAllTypes.getDefaultInstance(), mockParent, false); 92 93 // Merge into default field. 94 builder.mergeFrom(TestAllTypes.getDefaultInstance()); 95 assertThat(builder.getMessage()).isSameInstanceAs(TestAllTypes.getDefaultInstance()); 96 97 // Merge into non-default field on existing builder. 98 builder.getBuilder().setOptionalInt32(2); 99 builder.mergeFrom(TestAllTypes.newBuilder().setOptionalDouble(4.0).buildPartial()); 100 assertThat(builder.getMessage().getOptionalInt32()).isEqualTo(2); 101 assertThat(builder.getMessage().getOptionalDouble()).isEqualTo(4.0); 102 103 // Merge into non-default field on existing message 104 builder.setMessage(TestAllTypes.newBuilder().setOptionalInt32(10).buildPartial()); 105 builder.mergeFrom(TestAllTypes.newBuilder().setOptionalDouble(5.0).buildPartial()); 106 assertThat(builder.getMessage().getOptionalInt32()).isEqualTo(10); 107 assertThat(builder.getMessage().getOptionalDouble()).isEqualTo(5.0); 108 } 109 } 110