aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Skeet <skeet@pobox.com>2008-10-23 21:05:58 +0100
committerJon Skeet <skeet@pobox.com>2008-10-23 21:05:58 +0100
commit20bfd9bf5015b21adab17fce4bd78510f25137d9 (patch)
tree7ef5e47fd4e5c579b7daa8496fe9da465228302a
parentb8c2fc57fc4711293e487c6a8df95de5188f9c28 (diff)
downloadprotobuf-20bfd9bf5015b21adab17fce4bd78510f25137d9.tar.gz
protobuf-20bfd9bf5015b21adab17fce4bd78510f25137d9.tar.bz2
protobuf-20bfd9bf5015b21adab17fce4bd78510f25137d9.zip
Fix bug in GeneratedBuilder.MergeFrom
-rw-r--r--protos/google/protobuf/unittest_optimize_for.proto1
-rw-r--r--src/ProtocolBuffers.Test/GeneratedMessageTest.cs24
-rw-r--r--src/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs17
-rw-r--r--src/ProtocolBuffers/GeneratedBuilder.cs2
4 files changed, 37 insertions, 7 deletions
diff --git a/protos/google/protobuf/unittest_optimize_for.proto b/protos/google/protobuf/unittest_optimize_for.proto
index 390b37b2..8e4ec113 100644
--- a/protos/google/protobuf/unittest_optimize_for.proto
+++ b/protos/google/protobuf/unittest_optimize_for.proto
@@ -55,6 +55,7 @@ message TestOptimizedForSize {
extend TestOptimizedForSize {
optional int32 test_extension = 1234;
+ optional TestRequiredOptimizedForSize test_extension2 = 1235;
}
}
diff --git a/src/ProtocolBuffers.Test/GeneratedMessageTest.cs b/src/ProtocolBuffers.Test/GeneratedMessageTest.cs
index feba6e3b..f0be393c 100644
--- a/src/ProtocolBuffers.Test/GeneratedMessageTest.cs
+++ b/src/ProtocolBuffers.Test/GeneratedMessageTest.cs
@@ -287,5 +287,29 @@ namespace Google.ProtocolBuffers {
).BuildPartial();
Assert.IsTrue(message.IsInitialized);
}
+
+ [Test]
+ public void TestOptimizedForSizeMergeUsesAllFieldsFromTarget() {
+ TestOptimizedForSize withFieldSet = new TestOptimizedForSize.Builder { I = 10 }.Build();
+ TestOptimizedForSize.Builder builder = new TestOptimizedForSize.Builder();
+ builder.MergeFrom(withFieldSet);
+ TestOptimizedForSize built = builder.Build();
+ Assert.AreEqual(10, built.I);
+ }
+
+ [Test]
+ public void UninitializedExtensionInOptimizedForSizeMakesMessageUninitialized() {
+ TestOptimizedForSize.Builder builder = new TestOptimizedForSize.Builder();
+ builder.SetExtension(TestOptimizedForSize.TestExtension2,
+ new TestRequiredOptimizedForSize.Builder().BuildPartial());
+ Assert.IsFalse(builder.IsInitialized);
+ Assert.IsFalse(builder.BuildPartial().IsInitialized);
+
+ builder = new TestOptimizedForSize.Builder();
+ builder.SetExtension(TestOptimizedForSize.TestExtension2,
+ new TestRequiredOptimizedForSize.Builder { X = 10 }.BuildPartial());
+ Assert.IsTrue(builder.IsInitialized);
+ Assert.IsTrue(builder.BuildPartial().IsInitialized);
+ }
}
}
diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs
index 135e7a2f..cc555777 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs
@@ -17,15 +17,18 @@ namespace Google.ProtocolBuffers.TestProtos {
"Citnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnByb3Rv" +
"EhFwcm90b2J1Zl91bml0dGVzdBokZ29vZ2xlL3Byb3RvYnVmL2NzaGFycF9v" +
"cHRpb25zLnByb3RvGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90" +
- "bxoeZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIp4BChRUZXN0T3B0" +
+ "bxoeZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIpICChRUZXN0T3B0" +
"aW1pemVkRm9yU2l6ZRIJCgFpGAEgASgFEi4KA21zZxgTIAEoCzIhLnByb3Rv" +
"YnVmX3VuaXR0ZXN0LkZvcmVpZ25NZXNzYWdlKgkI6AcQgICAgAIyQAoOdGVz" +
"dF9leHRlbnNpb24SJy5wcm90b2J1Zl91bml0dGVzdC5UZXN0T3B0aW1pemVk" +
- "Rm9yU2l6ZRjSCSABKAUiKQocVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6" +
- "ZRIJCgF4GAEgAigFIloKHFRlc3RPcHRpb25hbE9wdGltaXplZEZvclNpemUS" +
- "OgoBbxgBIAEoCzIvLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZE9w" +
- "dGltaXplZEZvclNpemVCR0gCguIJIUdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMu" +
- "VGVzdFByb3Rvc4riCRxVbml0VGVzdE9wdGltaXplRm9yUHJvdG9GaWxl"),
+ "Rm9yU2l6ZRjSCSABKAUycgoPdGVzdF9leHRlbnNpb24yEicucHJvdG9idWZf" +
+ "dW5pdHRlc3QuVGVzdE9wdGltaXplZEZvclNpemUY0wkgASgLMi8ucHJvdG9i" +
+ "dWZfdW5pdHRlc3QuVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSIpChxU" +
+ "ZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplEgkKAXgYASACKAUiWgocVGVz" +
+ "dE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZRI6CgFvGAEgASgLMi8ucHJvdG9i" +
+ "dWZfdW5pdHRlc3QuVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZUJHSAKC" +
+ "4gkhR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9ziuIJHFVuaXRU" +
+ "ZXN0T3B0aW1pemVGb3JQcm90b0ZpbGU="),
new pbd::FileDescriptor[] {
global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.Descriptor,
global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.Descriptor,
@@ -76,6 +79,8 @@ namespace Google.ProtocolBuffers.TestProtos {
public static readonly pb::GeneratedExtensionBase<int> TestExtension =
pb::GeneratedSingleExtension<int>.CreateInstance(Descriptor.Extensions[0]);
+ public static readonly pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.TestRequiredOptimizedForSize> TestExtension2 =
+ pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.TestRequiredOptimizedForSize>.CreateInstance(Descriptor.Extensions[1]);
private bool hasI;
private int i_ = 0;
public bool HasI {
diff --git a/src/ProtocolBuffers/GeneratedBuilder.cs b/src/ProtocolBuffers/GeneratedBuilder.cs
index 4f577a79..2005d9ee 100644
--- a/src/ProtocolBuffers/GeneratedBuilder.cs
+++ b/src/ProtocolBuffers/GeneratedBuilder.cs
@@ -113,7 +113,7 @@ namespace Google.ProtocolBuffers {
throw new ArgumentException("Message type mismatch");
}
- foreach (KeyValuePair<FieldDescriptor, object> entry in AllFields) {
+ foreach (KeyValuePair<FieldDescriptor, object> entry in other.AllFields) {
FieldDescriptor field = entry.Key;
if (field.IsRepeated) {
// Concatenate repeated fields