Merge pull request #1810 from xfxyjwf/versioning
Versioning Java GeneratedMessage classpull/1811/head
commit
af8732ec11
13 changed files with 2879 additions and 768 deletions
@ -1,191 +0,0 @@ |
|||||||
// Protocol Buffers - Google's data interchange format
|
|
||||||
// Copyright 2008 Google Inc. All rights reserved.
|
|
||||||
// http://code.google.com/p/protobuf/
|
|
||||||
//
|
|
||||||
// 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.test; |
|
||||||
import com.google.protobuf.*; |
|
||||||
|
|
||||||
import protobuf_unittest.UnittestProto.TestAllTypes; |
|
||||||
import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder; |
|
||||||
|
|
||||||
import junit.framework.TestCase; |
|
||||||
|
|
||||||
import java.util.Collections; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
/** |
|
||||||
* Tests for {@link RepeatedFieldBuilder}. This tests basic functionality. |
|
||||||
* More extensive testing is provided via other tests that exercise the |
|
||||||
* builder. |
|
||||||
* |
|
||||||
* @author jonp@google.com (Jon Perlow) |
|
||||||
*/ |
|
||||||
public class RepeatedFieldBuilderTest extends TestCase { |
|
||||||
|
|
||||||
public void testBasicUse() { |
|
||||||
TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); |
|
||||||
RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> builder = newRepeatedFieldBuilder(mockParent); |
|
||||||
builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build()); |
|
||||||
builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build()); |
|
||||||
assertEquals(0, builder.getMessage(0).getOptionalInt32()); |
|
||||||
assertEquals(1, builder.getMessage(1).getOptionalInt32()); |
|
||||||
|
|
||||||
List<TestAllTypes> list = builder.build(); |
|
||||||
assertEquals(2, list.size()); |
|
||||||
assertEquals(0, list.get(0).getOptionalInt32()); |
|
||||||
assertEquals(1, list.get(1).getOptionalInt32()); |
|
||||||
assertIsUnmodifiable(list); |
|
||||||
|
|
||||||
// Make sure it doesn't change.
|
|
||||||
List<TestAllTypes> list2 = builder.build(); |
|
||||||
assertSame(list, list2); |
|
||||||
assertEquals(0, mockParent.getInvalidationCount()); |
|
||||||
} |
|
||||||
|
|
||||||
public void testGoingBackAndForth() { |
|
||||||
TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); |
|
||||||
RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> builder = newRepeatedFieldBuilder(mockParent); |
|
||||||
builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build()); |
|
||||||
builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build()); |
|
||||||
assertEquals(0, builder.getMessage(0).getOptionalInt32()); |
|
||||||
assertEquals(1, builder.getMessage(1).getOptionalInt32()); |
|
||||||
|
|
||||||
// Convert to list
|
|
||||||
List<TestAllTypes> list = builder.build(); |
|
||||||
assertEquals(2, list.size()); |
|
||||||
assertEquals(0, list.get(0).getOptionalInt32()); |
|
||||||
assertEquals(1, list.get(1).getOptionalInt32()); |
|
||||||
assertIsUnmodifiable(list); |
|
||||||
|
|
||||||
// Update 0th item
|
|
||||||
assertEquals(0, mockParent.getInvalidationCount()); |
|
||||||
builder.getBuilder(0).setOptionalString("foo"); |
|
||||||
assertEquals(1, mockParent.getInvalidationCount()); |
|
||||||
list = builder.build(); |
|
||||||
assertEquals(2, list.size()); |
|
||||||
assertEquals(0, list.get(0).getOptionalInt32()); |
|
||||||
assertEquals("foo", list.get(0).getOptionalString()); |
|
||||||
assertEquals(1, list.get(1).getOptionalInt32()); |
|
||||||
assertIsUnmodifiable(list); |
|
||||||
assertEquals(1, mockParent.getInvalidationCount()); |
|
||||||
} |
|
||||||
|
|
||||||
public void testVariousMethods() { |
|
||||||
TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); |
|
||||||
RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> builder = newRepeatedFieldBuilder(mockParent); |
|
||||||
builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build()); |
|
||||||
builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(2).build()); |
|
||||||
builder.addBuilder(0, TestAllTypes.getDefaultInstance()) |
|
||||||
.setOptionalInt32(0); |
|
||||||
builder.addBuilder(TestAllTypes.getDefaultInstance()).setOptionalInt32(3); |
|
||||||
|
|
||||||
assertEquals(0, builder.getMessage(0).getOptionalInt32()); |
|
||||||
assertEquals(1, builder.getMessage(1).getOptionalInt32()); |
|
||||||
assertEquals(2, builder.getMessage(2).getOptionalInt32()); |
|
||||||
assertEquals(3, builder.getMessage(3).getOptionalInt32()); |
|
||||||
|
|
||||||
assertEquals(0, mockParent.getInvalidationCount()); |
|
||||||
List<TestAllTypes> messages = builder.build(); |
|
||||||
assertEquals(4, messages.size()); |
|
||||||
assertSame(messages, builder.build()); // expect same list
|
|
||||||
|
|
||||||
// Remove a message.
|
|
||||||
builder.remove(2); |
|
||||||
assertEquals(1, mockParent.getInvalidationCount()); |
|
||||||
assertEquals(3, builder.getCount()); |
|
||||||
assertEquals(0, builder.getMessage(0).getOptionalInt32()); |
|
||||||
assertEquals(1, builder.getMessage(1).getOptionalInt32()); |
|
||||||
assertEquals(3, builder.getMessage(2).getOptionalInt32()); |
|
||||||
|
|
||||||
// Remove a builder.
|
|
||||||
builder.remove(0); |
|
||||||
assertEquals(1, mockParent.getInvalidationCount()); |
|
||||||
assertEquals(2, builder.getCount()); |
|
||||||
assertEquals(1, builder.getMessage(0).getOptionalInt32()); |
|
||||||
assertEquals(3, builder.getMessage(1).getOptionalInt32()); |
|
||||||
|
|
||||||
// Test clear.
|
|
||||||
builder.clear(); |
|
||||||
assertEquals(1, mockParent.getInvalidationCount()); |
|
||||||
assertEquals(0, builder.getCount()); |
|
||||||
assertTrue(builder.isEmpty()); |
|
||||||
} |
|
||||||
|
|
||||||
public void testLists() { |
|
||||||
TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); |
|
||||||
RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> builder = newRepeatedFieldBuilder(mockParent); |
|
||||||
builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build()); |
|
||||||
builder.addMessage(0, |
|
||||||
TestAllTypes.newBuilder().setOptionalInt32(0).build()); |
|
||||||
assertEquals(0, builder.getMessage(0).getOptionalInt32()); |
|
||||||
assertEquals(1, builder.getMessage(1).getOptionalInt32()); |
|
||||||
|
|
||||||
// Use list of builders.
|
|
||||||
List<TestAllTypes.Builder> builders = builder.getBuilderList(); |
|
||||||
assertEquals(0, builders.get(0).getOptionalInt32()); |
|
||||||
assertEquals(1, builders.get(1).getOptionalInt32()); |
|
||||||
builders.get(0).setOptionalInt32(10); |
|
||||||
builders.get(1).setOptionalInt32(11); |
|
||||||
|
|
||||||
// Use list of protos
|
|
||||||
List<TestAllTypes> protos = builder.getMessageList(); |
|
||||||
assertEquals(10, protos.get(0).getOptionalInt32()); |
|
||||||
assertEquals(11, protos.get(1).getOptionalInt32()); |
|
||||||
|
|
||||||
// Add an item to the builders and verify it's updated in both
|
|
||||||
builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(12).build()); |
|
||||||
assertEquals(3, builders.size()); |
|
||||||
assertEquals(3, protos.size()); |
|
||||||
} |
|
||||||
|
|
||||||
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
|
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> |
|
||||||
newRepeatedFieldBuilder(TestUtil.MockBuilderParent parent) { |
|
||||||
return new RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder>(Collections.<TestAllTypes>emptyList(), false, |
|
||||||
parent, false); |
|
||||||
} |
|
||||||
} |
|
@ -1,156 +0,0 @@ |
|||||||
// Protocol Buffers - Google's data interchange format
|
|
||||||
// Copyright 2008 Google Inc. All rights reserved.
|
|
||||||
// http://code.google.com/p/protobuf/
|
|
||||||
//
|
|
||||||
// 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.test; |
|
||||||
import com.google.protobuf.*; |
|
||||||
|
|
||||||
import protobuf_unittest.UnittestProto.TestAllTypes; |
|
||||||
import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder; |
|
||||||
|
|
||||||
import junit.framework.TestCase; |
|
||||||
|
|
||||||
/** |
|
||||||
* Tests for {@link SingleFieldBuilder}. This tests basic functionality. |
|
||||||
* More extensive testing is provided via other tests that exercise the |
|
||||||
* builder. |
|
||||||
* |
|
||||||
* @author jonp@google.com (Jon Perlow) |
|
||||||
*/ |
|
||||||
public class SingleFieldBuilderTest extends TestCase { |
|
||||||
|
|
||||||
public void testBasicUseAndInvalidations() { |
|
||||||
TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); |
|
||||||
SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> builder = |
|
||||||
new SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder>( |
|
||||||
TestAllTypes.getDefaultInstance(), |
|
||||||
mockParent, |
|
||||||
false); |
|
||||||
assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); |
|
||||||
assertEquals(TestAllTypes.getDefaultInstance(), |
|
||||||
builder.getBuilder().buildPartial()); |
|
||||||
assertEquals(0, mockParent.getInvalidationCount()); |
|
||||||
|
|
||||||
builder.getBuilder().setOptionalInt32(10); |
|
||||||
assertEquals(0, mockParent.getInvalidationCount()); |
|
||||||
TestAllTypes message = builder.build(); |
|
||||||
assertEquals(10, message.getOptionalInt32()); |
|
||||||
|
|
||||||
// Test that we receive invalidations now that build has been called.
|
|
||||||
assertEquals(0, mockParent.getInvalidationCount()); |
|
||||||
builder.getBuilder().setOptionalInt32(20); |
|
||||||
assertEquals(1, mockParent.getInvalidationCount()); |
|
||||||
|
|
||||||
// Test that we don't keep getting invalidations on every change
|
|
||||||
builder.getBuilder().setOptionalInt32(30); |
|
||||||
assertEquals(1, mockParent.getInvalidationCount()); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
public void testSetMessage() { |
|
||||||
TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); |
|
||||||
SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> builder = |
|
||||||
new SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder>( |
|
||||||
TestAllTypes.getDefaultInstance(), |
|
||||||
mockParent, |
|
||||||
false); |
|
||||||
builder.setMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build()); |
|
||||||
assertEquals(0, builder.getMessage().getOptionalInt32()); |
|
||||||
|
|
||||||
// Update message using the builder
|
|
||||||
builder.getBuilder().setOptionalInt32(1); |
|
||||||
assertEquals(0, mockParent.getInvalidationCount()); |
|
||||||
assertEquals(1, builder.getBuilder().getOptionalInt32()); |
|
||||||
assertEquals(1, builder.getMessage().getOptionalInt32()); |
|
||||||
builder.build(); |
|
||||||
builder.getBuilder().setOptionalInt32(2); |
|
||||||
assertEquals(2, builder.getBuilder().getOptionalInt32()); |
|
||||||
assertEquals(2, builder.getMessage().getOptionalInt32()); |
|
||||||
|
|
||||||
// Make sure message stays cached
|
|
||||||
assertSame(builder.getMessage(), builder.getMessage()); |
|
||||||
} |
|
||||||
|
|
||||||
public void testClear() { |
|
||||||
TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); |
|
||||||
SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> builder = |
|
||||||
new SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder>( |
|
||||||
TestAllTypes.getDefaultInstance(), |
|
||||||
mockParent, |
|
||||||
false); |
|
||||||
builder.setMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build()); |
|
||||||
assertNotSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); |
|
||||||
builder.clear(); |
|
||||||
assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); |
|
||||||
|
|
||||||
builder.getBuilder().setOptionalInt32(1); |
|
||||||
assertNotSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); |
|
||||||
builder.clear(); |
|
||||||
assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); |
|
||||||
} |
|
||||||
|
|
||||||
public void testMerge() { |
|
||||||
TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); |
|
||||||
SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> builder = |
|
||||||
new SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder>( |
|
||||||
TestAllTypes.getDefaultInstance(), |
|
||||||
mockParent, |
|
||||||
false); |
|
||||||
|
|
||||||
// Merge into default field.
|
|
||||||
builder.mergeFrom(TestAllTypes.getDefaultInstance()); |
|
||||||
assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); |
|
||||||
|
|
||||||
// Merge into non-default field on existing builder.
|
|
||||||
builder.getBuilder().setOptionalInt32(2); |
|
||||||
builder.mergeFrom(TestAllTypes.newBuilder() |
|
||||||
.setOptionalDouble(4.0) |
|
||||||
.buildPartial()); |
|
||||||
assertEquals(2, builder.getMessage().getOptionalInt32()); |
|
||||||
assertEquals(4.0, builder.getMessage().getOptionalDouble()); |
|
||||||
|
|
||||||
// Merge into non-default field on existing message
|
|
||||||
builder.setMessage(TestAllTypes.newBuilder() |
|
||||||
.setOptionalInt32(10) |
|
||||||
.buildPartial()); |
|
||||||
builder.mergeFrom(TestAllTypes.newBuilder() |
|
||||||
.setOptionalDouble(5.0) |
|
||||||
.buildPartial()); |
|
||||||
assertEquals(10, builder.getMessage().getOptionalInt32()); |
|
||||||
assertEquals(5.0, builder.getMessage().getOptionalDouble()); |
|
||||||
} |
|
||||||
} |
|
File diff suppressed because it is too large
Load Diff
@ -1,190 +0,0 @@ |
|||||||
// 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 protobuf_unittest.UnittestProto.TestAllTypes; |
|
||||||
import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder; |
|
||||||
|
|
||||||
import junit.framework.TestCase; |
|
||||||
|
|
||||||
import java.util.Collections; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
/** |
|
||||||
* Tests for {@link RepeatedFieldBuilder}. This tests basic functionality. |
|
||||||
* More extensive testing is provided via other tests that exercise the |
|
||||||
* builder. |
|
||||||
* |
|
||||||
* @author jonp@google.com (Jon Perlow) |
|
||||||
*/ |
|
||||||
public class RepeatedFieldBuilderTest extends TestCase { |
|
||||||
|
|
||||||
public void testBasicUse() { |
|
||||||
TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); |
|
||||||
RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> builder = newRepeatedFieldBuilder(mockParent); |
|
||||||
builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build()); |
|
||||||
builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build()); |
|
||||||
assertEquals(0, builder.getMessage(0).getOptionalInt32()); |
|
||||||
assertEquals(1, builder.getMessage(1).getOptionalInt32()); |
|
||||||
|
|
||||||
List<TestAllTypes> list = builder.build(); |
|
||||||
assertEquals(2, list.size()); |
|
||||||
assertEquals(0, list.get(0).getOptionalInt32()); |
|
||||||
assertEquals(1, list.get(1).getOptionalInt32()); |
|
||||||
assertIsUnmodifiable(list); |
|
||||||
|
|
||||||
// Make sure it doesn't change.
|
|
||||||
List<TestAllTypes> list2 = builder.build(); |
|
||||||
assertSame(list, list2); |
|
||||||
assertEquals(0, mockParent.getInvalidationCount()); |
|
||||||
} |
|
||||||
|
|
||||||
public void testGoingBackAndForth() { |
|
||||||
TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); |
|
||||||
RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> builder = newRepeatedFieldBuilder(mockParent); |
|
||||||
builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build()); |
|
||||||
builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build()); |
|
||||||
assertEquals(0, builder.getMessage(0).getOptionalInt32()); |
|
||||||
assertEquals(1, builder.getMessage(1).getOptionalInt32()); |
|
||||||
|
|
||||||
// Convert to list
|
|
||||||
List<TestAllTypes> list = builder.build(); |
|
||||||
assertEquals(2, list.size()); |
|
||||||
assertEquals(0, list.get(0).getOptionalInt32()); |
|
||||||
assertEquals(1, list.get(1).getOptionalInt32()); |
|
||||||
assertIsUnmodifiable(list); |
|
||||||
|
|
||||||
// Update 0th item
|
|
||||||
assertEquals(0, mockParent.getInvalidationCount()); |
|
||||||
builder.getBuilder(0).setOptionalString("foo"); |
|
||||||
assertEquals(1, mockParent.getInvalidationCount()); |
|
||||||
list = builder.build(); |
|
||||||
assertEquals(2, list.size()); |
|
||||||
assertEquals(0, list.get(0).getOptionalInt32()); |
|
||||||
assertEquals("foo", list.get(0).getOptionalString()); |
|
||||||
assertEquals(1, list.get(1).getOptionalInt32()); |
|
||||||
assertIsUnmodifiable(list); |
|
||||||
assertEquals(1, mockParent.getInvalidationCount()); |
|
||||||
} |
|
||||||
|
|
||||||
public void testVariousMethods() { |
|
||||||
TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); |
|
||||||
RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> builder = newRepeatedFieldBuilder(mockParent); |
|
||||||
builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build()); |
|
||||||
builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(2).build()); |
|
||||||
builder.addBuilder(0, TestAllTypes.getDefaultInstance()) |
|
||||||
.setOptionalInt32(0); |
|
||||||
builder.addBuilder(TestAllTypes.getDefaultInstance()).setOptionalInt32(3); |
|
||||||
|
|
||||||
assertEquals(0, builder.getMessage(0).getOptionalInt32()); |
|
||||||
assertEquals(1, builder.getMessage(1).getOptionalInt32()); |
|
||||||
assertEquals(2, builder.getMessage(2).getOptionalInt32()); |
|
||||||
assertEquals(3, builder.getMessage(3).getOptionalInt32()); |
|
||||||
|
|
||||||
assertEquals(0, mockParent.getInvalidationCount()); |
|
||||||
List<TestAllTypes> messages = builder.build(); |
|
||||||
assertEquals(4, messages.size()); |
|
||||||
assertSame(messages, builder.build()); // expect same list
|
|
||||||
|
|
||||||
// Remove a message.
|
|
||||||
builder.remove(2); |
|
||||||
assertEquals(1, mockParent.getInvalidationCount()); |
|
||||||
assertEquals(3, builder.getCount()); |
|
||||||
assertEquals(0, builder.getMessage(0).getOptionalInt32()); |
|
||||||
assertEquals(1, builder.getMessage(1).getOptionalInt32()); |
|
||||||
assertEquals(3, builder.getMessage(2).getOptionalInt32()); |
|
||||||
|
|
||||||
// Remove a builder.
|
|
||||||
builder.remove(0); |
|
||||||
assertEquals(1, mockParent.getInvalidationCount()); |
|
||||||
assertEquals(2, builder.getCount()); |
|
||||||
assertEquals(1, builder.getMessage(0).getOptionalInt32()); |
|
||||||
assertEquals(3, builder.getMessage(1).getOptionalInt32()); |
|
||||||
|
|
||||||
// Test clear.
|
|
||||||
builder.clear(); |
|
||||||
assertEquals(1, mockParent.getInvalidationCount()); |
|
||||||
assertEquals(0, builder.getCount()); |
|
||||||
assertTrue(builder.isEmpty()); |
|
||||||
} |
|
||||||
|
|
||||||
public void testLists() { |
|
||||||
TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); |
|
||||||
RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> builder = newRepeatedFieldBuilder(mockParent); |
|
||||||
builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build()); |
|
||||||
builder.addMessage(0, |
|
||||||
TestAllTypes.newBuilder().setOptionalInt32(0).build()); |
|
||||||
assertEquals(0, builder.getMessage(0).getOptionalInt32()); |
|
||||||
assertEquals(1, builder.getMessage(1).getOptionalInt32()); |
|
||||||
|
|
||||||
// Use list of builders.
|
|
||||||
List<TestAllTypes.Builder> builders = builder.getBuilderList(); |
|
||||||
assertEquals(0, builders.get(0).getOptionalInt32()); |
|
||||||
assertEquals(1, builders.get(1).getOptionalInt32()); |
|
||||||
builders.get(0).setOptionalInt32(10); |
|
||||||
builders.get(1).setOptionalInt32(11); |
|
||||||
|
|
||||||
// Use list of protos
|
|
||||||
List<TestAllTypes> protos = builder.getMessageList(); |
|
||||||
assertEquals(10, protos.get(0).getOptionalInt32()); |
|
||||||
assertEquals(11, protos.get(1).getOptionalInt32()); |
|
||||||
|
|
||||||
// Add an item to the builders and verify it's updated in both
|
|
||||||
builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(12).build()); |
|
||||||
assertEquals(3, builders.size()); |
|
||||||
assertEquals(3, protos.size()); |
|
||||||
} |
|
||||||
|
|
||||||
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
|
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> |
|
||||||
newRepeatedFieldBuilder(GeneratedMessage.BuilderParent parent) { |
|
||||||
return new RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder>(Collections.<TestAllTypes>emptyList(), false, |
|
||||||
parent, false); |
|
||||||
} |
|
||||||
} |
|
@ -1,155 +0,0 @@ |
|||||||
// 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 protobuf_unittest.UnittestProto.TestAllTypes; |
|
||||||
import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder; |
|
||||||
|
|
||||||
import junit.framework.TestCase; |
|
||||||
|
|
||||||
/** |
|
||||||
* Tests for {@link SingleFieldBuilder}. This tests basic functionality. |
|
||||||
* More extensive testing is provided via other tests that exercise the |
|
||||||
* builder. |
|
||||||
* |
|
||||||
* @author jonp@google.com (Jon Perlow) |
|
||||||
*/ |
|
||||||
public class SingleFieldBuilderTest extends TestCase { |
|
||||||
|
|
||||||
public void testBasicUseAndInvalidations() { |
|
||||||
TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); |
|
||||||
SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> builder = |
|
||||||
new SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder>( |
|
||||||
TestAllTypes.getDefaultInstance(), |
|
||||||
mockParent, |
|
||||||
false); |
|
||||||
assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); |
|
||||||
assertEquals(TestAllTypes.getDefaultInstance(), |
|
||||||
builder.getBuilder().buildPartial()); |
|
||||||
assertEquals(0, mockParent.getInvalidationCount()); |
|
||||||
|
|
||||||
builder.getBuilder().setOptionalInt32(10); |
|
||||||
assertEquals(0, mockParent.getInvalidationCount()); |
|
||||||
TestAllTypes message = builder.build(); |
|
||||||
assertEquals(10, message.getOptionalInt32()); |
|
||||||
|
|
||||||
// Test that we receive invalidations now that build has been called.
|
|
||||||
assertEquals(0, mockParent.getInvalidationCount()); |
|
||||||
builder.getBuilder().setOptionalInt32(20); |
|
||||||
assertEquals(1, mockParent.getInvalidationCount()); |
|
||||||
|
|
||||||
// Test that we don't keep getting invalidations on every change
|
|
||||||
builder.getBuilder().setOptionalInt32(30); |
|
||||||
assertEquals(1, mockParent.getInvalidationCount()); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
public void testSetMessage() { |
|
||||||
TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); |
|
||||||
SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> builder = |
|
||||||
new SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder>( |
|
||||||
TestAllTypes.getDefaultInstance(), |
|
||||||
mockParent, |
|
||||||
false); |
|
||||||
builder.setMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build()); |
|
||||||
assertEquals(0, builder.getMessage().getOptionalInt32()); |
|
||||||
|
|
||||||
// Update message using the builder
|
|
||||||
builder.getBuilder().setOptionalInt32(1); |
|
||||||
assertEquals(0, mockParent.getInvalidationCount()); |
|
||||||
assertEquals(1, builder.getBuilder().getOptionalInt32()); |
|
||||||
assertEquals(1, builder.getMessage().getOptionalInt32()); |
|
||||||
builder.build(); |
|
||||||
builder.getBuilder().setOptionalInt32(2); |
|
||||||
assertEquals(2, builder.getBuilder().getOptionalInt32()); |
|
||||||
assertEquals(2, builder.getMessage().getOptionalInt32()); |
|
||||||
|
|
||||||
// Make sure message stays cached
|
|
||||||
assertSame(builder.getMessage(), builder.getMessage()); |
|
||||||
} |
|
||||||
|
|
||||||
public void testClear() { |
|
||||||
TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); |
|
||||||
SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> builder = |
|
||||||
new SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder>( |
|
||||||
TestAllTypes.getDefaultInstance(), |
|
||||||
mockParent, |
|
||||||
false); |
|
||||||
builder.setMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build()); |
|
||||||
assertNotSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); |
|
||||||
builder.clear(); |
|
||||||
assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); |
|
||||||
|
|
||||||
builder.getBuilder().setOptionalInt32(1); |
|
||||||
assertNotSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); |
|
||||||
builder.clear(); |
|
||||||
assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); |
|
||||||
} |
|
||||||
|
|
||||||
public void testMerge() { |
|
||||||
TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); |
|
||||||
SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder> builder = |
|
||||||
new SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder, |
|
||||||
TestAllTypesOrBuilder>( |
|
||||||
TestAllTypes.getDefaultInstance(), |
|
||||||
mockParent, |
|
||||||
false); |
|
||||||
|
|
||||||
// Merge into default field.
|
|
||||||
builder.mergeFrom(TestAllTypes.getDefaultInstance()); |
|
||||||
assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); |
|
||||||
|
|
||||||
// Merge into non-default field on existing builder.
|
|
||||||
builder.getBuilder().setOptionalInt32(2); |
|
||||||
builder.mergeFrom(TestAllTypes.newBuilder() |
|
||||||
.setOptionalDouble(4.0) |
|
||||||
.buildPartial()); |
|
||||||
assertEquals(2, builder.getMessage().getOptionalInt32()); |
|
||||||
assertEquals(4.0, builder.getMessage().getOptionalDouble()); |
|
||||||
|
|
||||||
// Merge into non-default field on existing message
|
|
||||||
builder.setMessage(TestAllTypes.newBuilder() |
|
||||||
.setOptionalInt32(10) |
|
||||||
.buildPartial()); |
|
||||||
builder.mergeFrom(TestAllTypes.newBuilder() |
|
||||||
.setOptionalDouble(5.0) |
|
||||||
.buildPartial()); |
|
||||||
assertEquals(10, builder.getMessage().getOptionalInt32()); |
|
||||||
assertEquals(5.0, builder.getMessage().getOptionalDouble()); |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue