aboutsummaryrefslogtreecommitdiffhomepage
path: root/csharp/src/ProtocolBuffers.Test/ReusableBuilderTest.cs
diff options
context:
space:
mode:
Diffstat (limited to 'csharp/src/ProtocolBuffers.Test/ReusableBuilderTest.cs')
-rw-r--r--csharp/src/ProtocolBuffers.Test/ReusableBuilderTest.cs166
1 files changed, 166 insertions, 0 deletions
diff --git a/csharp/src/ProtocolBuffers.Test/ReusableBuilderTest.cs b/csharp/src/ProtocolBuffers.Test/ReusableBuilderTest.cs
new file mode 100644
index 00000000..4f25a5ab
--- /dev/null
+++ b/csharp/src/ProtocolBuffers.Test/ReusableBuilderTest.cs
@@ -0,0 +1,166 @@
+using System;
+using Google.ProtocolBuffers.Collections;
+using Google.ProtocolBuffers.TestProtos;
+using UnitTest.Issues.TestProtos;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers
+{
+ public class ReusableBuilderTest
+ {
+ //Issue 28: Circular message dependencies result in null defaults for DefaultInstance
+ [Test]
+ public void EnsureStaticCicularReference()
+ {
+ MyMessageAReferenceB ab = MyMessageAReferenceB.DefaultInstance;
+ Assert.NotNull(ab);
+ Assert.NotNull(ab.Value);
+ MyMessageBReferenceA ba = MyMessageBReferenceA.DefaultInstance;
+ Assert.NotNull(ba);
+ Assert.NotNull(ba.Value);
+ }
+
+ [Test]
+ public void TestModifyDefaultInstance()
+ {
+ //verify that the default instance has correctly been marked as read-only
+ Assert.AreEqual(typeof(PopsicleList<bool>), TestAllTypes.DefaultInstance.RepeatedBoolList.GetType());
+ PopsicleList<bool> list = (PopsicleList<bool>)TestAllTypes.DefaultInstance.RepeatedBoolList;
+ Assert.IsTrue(list.IsReadOnly);
+ }
+
+ [Test]
+ public void TestUnmodifiedDefaultInstance()
+ {
+ //Simply calling ToBuilder().Build() no longer creates a copy of the message
+ TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
+ Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ }
+
+ [Test]
+ public void BuildMultipleWithoutChange()
+ {
+ //Calling Build() or BuildPartial() does not require a copy of the message
+ TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
+ builder.SetDefaultBool(true);
+
+ TestAllTypes first = builder.BuildPartial();
+ //Still the same instance?
+ Assert.IsTrue(ReferenceEquals(first, builder.Build()));
+ //Still the same instance?
+ Assert.IsTrue(ReferenceEquals(first, builder.BuildPartial().ToBuilder().Build()));
+ }
+
+ [Test]
+ public void MergeFromDefaultInstance()
+ {
+ TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
+ Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ builder.MergeFrom(TestAllTypes.DefaultInstance);
+ Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ }
+
+ [Test]
+ public void BuildNewBuilderIsDefaultInstance()
+ {
+ Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, new TestAllTypes.Builder().Build()));
+ Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, TestAllTypes.CreateBuilder().Build()));
+ //last test, if you clear a builder it reverts to default instance
+ Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance,
+ TestAllTypes.CreateBuilder().SetOptionalBool(true).Build().ToBuilder().Clear().Build()));
+ }
+
+ [Test]
+ public void BuildModifyAndRebuild()
+ {
+ TestAllTypes.Builder b1 = new TestAllTypes.Builder();
+ b1.SetDefaultInt32(1);
+ b1.AddRepeatedInt32(2);
+ b1.SetOptionalForeignMessage(ForeignMessage.DefaultInstance);
+
+ TestAllTypes m1 = b1.Build();
+
+ b1.SetDefaultInt32(5);
+ b1.AddRepeatedInt32(6);
+ b1.SetOptionalForeignMessage(b1.OptionalForeignMessage.ToBuilder().SetC(7));
+
+ TestAllTypes m2 = b1.Build();
+
+ Assert.AreEqual("{\"optional_foreign_message\":{},\"repeated_int32\":[2],\"default_int32\":1}", Extensions.ToJson(m1));
+ Assert.AreEqual("{\"optional_foreign_message\":{\"c\":7},\"repeated_int32\":[2,6],\"default_int32\":5}", Extensions.ToJson(m2));
+ }
+
+ [Test]
+ public void CloneOnChangePrimitive()
+ {
+ TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
+ Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ builder.SetDefaultBool(true);
+ Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ }
+
+ [Test]
+ public void CloneOnAddRepeatedBool()
+ {
+ TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
+ Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ builder.AddRepeatedBool(true);
+ Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ }
+
+ [Test]
+ public void CloneOnGetRepeatedBoolList()
+ {
+ TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
+ Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ GC.KeepAlive(builder.RepeatedBoolList);
+ Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ }
+
+ [Test]
+ public void CloneOnChangeMessage()
+ {
+ TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
+ Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ builder.SetOptionalForeignMessage(new ForeignMessage.Builder());
+ Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ }
+
+ [Test]
+ public void CloneOnClearMessage()
+ {
+ TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
+ Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ builder.ClearOptionalForeignMessage();
+ Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ }
+
+ [Test]
+ public void CloneOnGetRepeatedForeignMessageList()
+ {
+ TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
+ Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ GC.KeepAlive(builder.RepeatedForeignMessageList);
+ Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ }
+
+ [Test]
+ public void CloneOnChangeEnumValue()
+ {
+ TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
+ Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ builder.SetOptionalForeignEnum(ForeignEnum.FOREIGN_BAR);
+ Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ }
+
+ [Test]
+ public void CloneOnGetRepeatedForeignEnumList()
+ {
+ TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
+ Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ GC.KeepAlive(builder.RepeatedForeignEnumList);
+ Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
+ }
+
+ }
+}