csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 1 | using System;
|
| 2 | using System.Collections.Generic;
|
csharptest | 8bd88ea | 2011-09-23 11:08:29 -0500 | [diff] [blame] | 3 | using System.ComponentModel;
|
csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 4 | using System.Text;
|
csharptest | 3b62506 | 2011-09-23 10:14:14 -0500 | [diff] [blame] | 5 | using Google.ProtocolBuffers.Collections;
|
csharptest | eac64a5 | 2011-10-04 13:43:26 -0500 | [diff] [blame^] | 6 | using Microsoft.VisualStudio.TestTools.UnitTesting;
|
csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 7 | using Google.ProtocolBuffers.TestProtos;
|
csharptest | 7b6044f | 2011-09-09 21:40:13 -0500 | [diff] [blame] | 8 | using Google.ProtocolBuffers.Serialization;
|
csharptest | 8bd88ea | 2011-09-23 11:08:29 -0500 | [diff] [blame] | 9 | using UnitTest.Issues.TestProtos;
|
csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 10 |
|
| 11 | namespace Google.ProtocolBuffers
|
| 12 | {
|
csharptest | eac64a5 | 2011-10-04 13:43:26 -0500 | [diff] [blame^] | 13 | [TestClass]
|
csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 14 | public class ReusableBuilderTest
|
| 15 | {
|
csharptest | eac64a5 | 2011-10-04 13:43:26 -0500 | [diff] [blame^] | 16 | [TestMethod, System.ComponentModel.Description("Issue 28: Circular message dependencies result in null defaults for DefaultInstance")]
|
csharptest | 8bd88ea | 2011-09-23 11:08:29 -0500 | [diff] [blame] | 17 | 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 |
|
csharptest | eac64a5 | 2011-10-04 13:43:26 -0500 | [diff] [blame^] | 27 | [TestMethod]
|
csharptest | 3b62506 | 2011-09-23 10:14:14 -0500 | [diff] [blame] | 28 | 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 |
|
csharptest | eac64a5 | 2011-10-04 13:43:26 -0500 | [diff] [blame^] | 36 | [TestMethod]
|
csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 37 | 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 |
|
csharptest | eac64a5 | 2011-10-04 13:43:26 -0500 | [diff] [blame^] | 44 | [TestMethod]
|
csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 45 | 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 |
|
csharptest | eac64a5 | 2011-10-04 13:43:26 -0500 | [diff] [blame^] | 58 | [TestMethod]
|
csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 59 | 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 |
|
csharptest | eac64a5 | 2011-10-04 13:43:26 -0500 | [diff] [blame^] | 67 | [TestMethod]
|
csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 68 | 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 |
|
csharptest | eac64a5 | 2011-10-04 13:43:26 -0500 | [diff] [blame^] | 77 | [TestMethod]
|
csharptest | 7b6044f | 2011-09-09 21:40:13 -0500 | [diff] [blame] | 78 | 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 |
|
csharptest | b5a7ed2 | 2011-10-01 15:10:05 -0500 | [diff] [blame] | 93 | 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));
|
csharptest | 7b6044f | 2011-09-09 21:40:13 -0500 | [diff] [blame] | 95 | }
|
| 96 |
|
csharptest | eac64a5 | 2011-10-04 13:43:26 -0500 | [diff] [blame^] | 97 | [TestMethod]
|
csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 98 | 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 |
|
csharptest | eac64a5 | 2011-10-04 13:43:26 -0500 | [diff] [blame^] | 106 | [TestMethod]
|
csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 107 | 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 |
|
csharptest | eac64a5 | 2011-10-04 13:43:26 -0500 | [diff] [blame^] | 115 | [TestMethod]
|
csharptest | 2a1f0bd | 2011-09-15 18:16:15 -0500 | [diff] [blame] | 116 | 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 |
|
csharptest | eac64a5 | 2011-10-04 13:43:26 -0500 | [diff] [blame^] | 124 | [TestMethod]
|
csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 125 | 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 |
|
csharptest | eac64a5 | 2011-10-04 13:43:26 -0500 | [diff] [blame^] | 133 | [TestMethod]
|
csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 134 | 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 |
|
csharptest | eac64a5 | 2011-10-04 13:43:26 -0500 | [diff] [blame^] | 142 | [TestMethod]
|
csharptest | 2a1f0bd | 2011-09-15 18:16:15 -0500 | [diff] [blame] | 143 | public void CloneOnGetRepeatedForeignMessageList()
|
csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 144 | {
|
| 145 | TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
|
| 146 | Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
|
csharptest | 2a1f0bd | 2011-09-15 18:16:15 -0500 | [diff] [blame] | 147 | GC.KeepAlive(builder.RepeatedForeignMessageList);
|
csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 148 | Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
|
| 149 | }
|
| 150 |
|
csharptest | eac64a5 | 2011-10-04 13:43:26 -0500 | [diff] [blame^] | 151 | [TestMethod]
|
csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 152 | 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 |
|
csharptest | eac64a5 | 2011-10-04 13:43:26 -0500 | [diff] [blame^] | 160 | [TestMethod]
|
csharptest | 2a1f0bd | 2011-09-15 18:16:15 -0500 | [diff] [blame] | 161 | public void CloneOnGetRepeatedForeignEnumList()
|
csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 162 | {
|
| 163 | TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
|
| 164 | Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
|
csharptest | 2a1f0bd | 2011-09-15 18:16:15 -0500 | [diff] [blame] | 165 | GC.KeepAlive(builder.RepeatedForeignEnumList);
|
csharptest | 1a0764a | 2011-09-09 21:05:29 -0500 | [diff] [blame] | 166 | Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
|
| 167 | }
|
| 168 |
|
| 169 | }
|
| 170 | }
|