blob: 93129b2f1a1b1adf8ae0f7af15cd85001bfe38b7 [file] [log] [blame]
csharptest1a0764a2011-09-09 21:05:29 -05001using System;
2using System.Collections.Generic;
csharptest8bd88ea2011-09-23 11:08:29 -05003using System.ComponentModel;
csharptest1a0764a2011-09-09 21:05:29 -05004using System.Text;
csharptest3b625062011-09-23 10:14:14 -05005using Google.ProtocolBuffers.Collections;
csharptesteac64a52011-10-04 13:43:26 -05006using Microsoft.VisualStudio.TestTools.UnitTesting;
csharptest1a0764a2011-09-09 21:05:29 -05007using Google.ProtocolBuffers.TestProtos;
csharptest7b6044f2011-09-09 21:40:13 -05008using Google.ProtocolBuffers.Serialization;
csharptest8bd88ea2011-09-23 11:08:29 -05009using UnitTest.Issues.TestProtos;
csharptest1a0764a2011-09-09 21:05:29 -050010
11namespace Google.ProtocolBuffers
12{
csharptesteac64a52011-10-04 13:43:26 -050013 [TestClass]
csharptest1a0764a2011-09-09 21:05:29 -050014 public class ReusableBuilderTest
15 {
csharptesteac64a52011-10-04 13:43:26 -050016 [TestMethod, System.ComponentModel.Description("Issue 28: Circular message dependencies result in null defaults for DefaultInstance")]
csharptest8bd88ea2011-09-23 11:08:29 -050017 public void EnsureStaticCicularReference()
18 {
19 MyMessageAReferenceB ab = MyMessageAReferenceB.DefaultInstance;
20 Assert.IsNotNull(ab);
21 Assert.IsNotNull(ab.Value);
22 MyMessageBReferenceA ba = MyMessageBReferenceA.DefaultInstance;
23 Assert.IsNotNull(ba);
24 Assert.IsNotNull(ba.Value);
25 }
26
csharptesteac64a52011-10-04 13:43:26 -050027 [TestMethod]
csharptest3b625062011-09-23 10:14:14 -050028 public void TestModifyDefaultInstance()
29 {
30 //verify that the default instance has correctly been marked as read-only
31 Assert.AreEqual(typeof(PopsicleList<bool>), TestAllTypes.DefaultInstance.RepeatedBoolList.GetType());
32 PopsicleList<bool> list = (PopsicleList<bool>)TestAllTypes.DefaultInstance.RepeatedBoolList;
33 Assert.IsTrue(list.IsReadOnly);
34 }
35
csharptesteac64a52011-10-04 13:43:26 -050036 [TestMethod]
csharptest1a0764a2011-09-09 21:05:29 -050037 public void TestUnmodifiedDefaultInstance()
38 {
39 //Simply calling ToBuilder().Build() no longer creates a copy of the message
40 TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
41 Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
42 }
43
csharptesteac64a52011-10-04 13:43:26 -050044 [TestMethod]
csharptest1a0764a2011-09-09 21:05:29 -050045 public void BuildMultipleWithoutChange()
46 {
47 //Calling Build() or BuildPartial() does not require a copy of the message
48 TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
49 builder.SetDefaultBool(true);
50
51 TestAllTypes first = builder.BuildPartial();
52 //Still the same instance?
53 Assert.IsTrue(ReferenceEquals(first, builder.Build()));
54 //Still the same instance?
55 Assert.IsTrue(ReferenceEquals(first, builder.BuildPartial().ToBuilder().Build()));
56 }
57
csharptesteac64a52011-10-04 13:43:26 -050058 [TestMethod]
csharptest1a0764a2011-09-09 21:05:29 -050059 public void MergeFromDefaultInstance()
60 {
61 TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
62 Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
63 builder.MergeFrom(TestAllTypes.DefaultInstance);
64 Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
65 }
66
csharptesteac64a52011-10-04 13:43:26 -050067 [TestMethod]
csharptest1a0764a2011-09-09 21:05:29 -050068 public void BuildNewBuilderIsDefaultInstance()
69 {
70 Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, new TestAllTypes.Builder().Build()));
71 Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, TestAllTypes.CreateBuilder().Build()));
72 //last test, if you clear a builder it reverts to default instance
73 Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance,
74 TestAllTypes.CreateBuilder().SetOptionalBool(true).Build().ToBuilder().Clear().Build()));
75 }
76
csharptesteac64a52011-10-04 13:43:26 -050077 [TestMethod]
csharptest7b6044f2011-09-09 21:40:13 -050078 public void BuildModifyAndRebuild()
79 {
80 TestAllTypes.Builder b1 = new TestAllTypes.Builder();
81 b1.SetDefaultInt32(1);
82 b1.AddRepeatedInt32(2);
83 b1.SetOptionalForeignMessage(ForeignMessage.DefaultInstance);
84
85 TestAllTypes m1 = b1.Build();
86
87 b1.SetDefaultInt32(5);
88 b1.AddRepeatedInt32(6);
89 b1.SetOptionalForeignMessage(b1.OptionalForeignMessage.ToBuilder().SetC(7));
90
91 TestAllTypes m2 = b1.Build();
92
csharptestb5a7ed22011-10-01 15:10:05 -050093 Assert.AreEqual("{\"optional_foreign_message\":{},\"repeated_int32\":[2],\"default_int32\":1}", Extensions.ToJson(m1));
94 Assert.AreEqual("{\"optional_foreign_message\":{\"c\":7},\"repeated_int32\":[2,6],\"default_int32\":5}", Extensions.ToJson(m2));
csharptest7b6044f2011-09-09 21:40:13 -050095 }
96
csharptesteac64a52011-10-04 13:43:26 -050097 [TestMethod]
csharptest1a0764a2011-09-09 21:05:29 -050098 public void CloneOnChangePrimitive()
99 {
100 TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
101 Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
102 builder.SetDefaultBool(true);
103 Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
104 }
105
csharptesteac64a52011-10-04 13:43:26 -0500106 [TestMethod]
csharptest1a0764a2011-09-09 21:05:29 -0500107 public void CloneOnAddRepeatedBool()
108 {
109 TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
110 Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
111 builder.AddRepeatedBool(true);
112 Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
113 }
114
csharptesteac64a52011-10-04 13:43:26 -0500115 [TestMethod]
csharptest2a1f0bd2011-09-15 18:16:15 -0500116 public void CloneOnGetRepeatedBoolList()
117 {
118 TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
119 Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
120 GC.KeepAlive(builder.RepeatedBoolList);
121 Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
122 }
123
csharptesteac64a52011-10-04 13:43:26 -0500124 [TestMethod]
csharptest1a0764a2011-09-09 21:05:29 -0500125 public void CloneOnChangeMessage()
126 {
127 TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
128 Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
129 builder.SetOptionalForeignMessage(new ForeignMessage.Builder());
130 Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
131 }
132
csharptesteac64a52011-10-04 13:43:26 -0500133 [TestMethod]
csharptest1a0764a2011-09-09 21:05:29 -0500134 public void CloneOnClearMessage()
135 {
136 TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
137 Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
138 builder.ClearOptionalForeignMessage();
139 Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
140 }
141
csharptesteac64a52011-10-04 13:43:26 -0500142 [TestMethod]
csharptest2a1f0bd2011-09-15 18:16:15 -0500143 public void CloneOnGetRepeatedForeignMessageList()
csharptest1a0764a2011-09-09 21:05:29 -0500144 {
145 TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
146 Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
csharptest2a1f0bd2011-09-15 18:16:15 -0500147 GC.KeepAlive(builder.RepeatedForeignMessageList);
csharptest1a0764a2011-09-09 21:05:29 -0500148 Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
149 }
150
csharptesteac64a52011-10-04 13:43:26 -0500151 [TestMethod]
csharptest1a0764a2011-09-09 21:05:29 -0500152 public void CloneOnChangeEnumValue()
153 {
154 TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
155 Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
156 builder.SetOptionalForeignEnum(ForeignEnum.FOREIGN_BAR);
157 Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
158 }
159
csharptesteac64a52011-10-04 13:43:26 -0500160 [TestMethod]
csharptest2a1f0bd2011-09-15 18:16:15 -0500161 public void CloneOnGetRepeatedForeignEnumList()
csharptest1a0764a2011-09-09 21:05:29 -0500162 {
163 TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
164 Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
csharptest2a1f0bd2011-09-15 18:16:15 -0500165 GC.KeepAlive(builder.RepeatedForeignEnumList);
csharptest1a0764a2011-09-09 21:05:29 -0500166 Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
167 }
168
169 }
170}