• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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