ReusableBuilderTest.cs 7.1 KB

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