ReusableBuilderTest.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Text;
  5. using Google.ProtocolBuffers.Collections;
  6. using Microsoft.VisualStudio.TestTools.UnitTesting;
  7. using Google.ProtocolBuffers.TestProtos;
  8. using Google.ProtocolBuffers.Serialization;
  9. using UnitTest.Issues.TestProtos;
  10. namespace Google.ProtocolBuffers
  11. {
  12. [TestClass]
  13. public class ReusableBuilderTest
  14. {
  15. //Issue 28: Circular message dependencies result in null defaults for DefaultInstance
  16. [TestMethod]
  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. [TestMethod]
  27. public void TestModifyDefaultInstance()
  28. {
  29. //verify that the default instance has correctly been marked as read-only
  30. Assert.AreEqual(typeof(PopsicleList<bool>), TestAllTypes.DefaultInstance.RepeatedBoolList.GetType());
  31. PopsicleList<bool> list = (PopsicleList<bool>)TestAllTypes.DefaultInstance.RepeatedBoolList;
  32. Assert.IsTrue(list.IsReadOnly);
  33. }
  34. [TestMethod]
  35. public void TestUnmodifiedDefaultInstance()
  36. {
  37. //Simply calling ToBuilder().Build() no longer creates a copy of the message
  38. TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
  39. Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  40. }
  41. [TestMethod]
  42. public void BuildMultipleWithoutChange()
  43. {
  44. //Calling Build() or BuildPartial() does not require a copy of the message
  45. TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
  46. builder.SetDefaultBool(true);
  47. TestAllTypes first = builder.BuildPartial();
  48. //Still the same instance?
  49. Assert.IsTrue(ReferenceEquals(first, builder.Build()));
  50. //Still the same instance?
  51. Assert.IsTrue(ReferenceEquals(first, builder.BuildPartial().ToBuilder().Build()));
  52. }
  53. [TestMethod]
  54. public void MergeFromDefaultInstance()
  55. {
  56. TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
  57. Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  58. builder.MergeFrom(TestAllTypes.DefaultInstance);
  59. Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  60. }
  61. [TestMethod]
  62. public void BuildNewBuilderIsDefaultInstance()
  63. {
  64. Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, new TestAllTypes.Builder().Build()));
  65. Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, TestAllTypes.CreateBuilder().Build()));
  66. //last test, if you clear a builder it reverts to default instance
  67. Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance,
  68. TestAllTypes.CreateBuilder().SetOptionalBool(true).Build().ToBuilder().Clear().Build()));
  69. }
  70. [TestMethod]
  71. public void BuildModifyAndRebuild()
  72. {
  73. TestAllTypes.Builder b1 = new TestAllTypes.Builder();
  74. b1.SetDefaultInt32(1);
  75. b1.AddRepeatedInt32(2);
  76. b1.SetOptionalForeignMessage(ForeignMessage.DefaultInstance);
  77. TestAllTypes m1 = b1.Build();
  78. b1.SetDefaultInt32(5);
  79. b1.AddRepeatedInt32(6);
  80. b1.SetOptionalForeignMessage(b1.OptionalForeignMessage.ToBuilder().SetC(7));
  81. TestAllTypes m2 = b1.Build();
  82. Assert.AreEqual("{\"optional_foreign_message\":{},\"repeated_int32\":[2],\"default_int32\":1}", Extensions.ToJson(m1));
  83. Assert.AreEqual("{\"optional_foreign_message\":{\"c\":7},\"repeated_int32\":[2,6],\"default_int32\":5}", Extensions.ToJson(m2));
  84. }
  85. [TestMethod]
  86. public void CloneOnChangePrimitive()
  87. {
  88. TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
  89. Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  90. builder.SetDefaultBool(true);
  91. Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  92. }
  93. [TestMethod]
  94. public void CloneOnAddRepeatedBool()
  95. {
  96. TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
  97. Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  98. builder.AddRepeatedBool(true);
  99. Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  100. }
  101. [TestMethod]
  102. public void CloneOnGetRepeatedBoolList()
  103. {
  104. TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
  105. Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  106. GC.KeepAlive(builder.RepeatedBoolList);
  107. Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  108. }
  109. [TestMethod]
  110. public void CloneOnChangeMessage()
  111. {
  112. TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
  113. Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  114. builder.SetOptionalForeignMessage(new ForeignMessage.Builder());
  115. Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  116. }
  117. [TestMethod]
  118. public void CloneOnClearMessage()
  119. {
  120. TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
  121. Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  122. builder.ClearOptionalForeignMessage();
  123. Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  124. }
  125. [TestMethod]
  126. public void CloneOnGetRepeatedForeignMessageList()
  127. {
  128. TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
  129. Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  130. GC.KeepAlive(builder.RepeatedForeignMessageList);
  131. Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  132. }
  133. [TestMethod]
  134. public void CloneOnChangeEnumValue()
  135. {
  136. TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
  137. Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  138. builder.SetOptionalForeignEnum(ForeignEnum.FOREIGN_BAR);
  139. Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  140. }
  141. [TestMethod]
  142. public void CloneOnGetRepeatedForeignEnumList()
  143. {
  144. TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
  145. Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  146. GC.KeepAlive(builder.RepeatedForeignEnumList);
  147. Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
  148. }
  149. }
  150. }