1 using System; 2 using System.Collections; 3 using Google.Protobuf.TestProtos.Proto2; 4 using NUnit.Framework; 5 6 using static Google.Protobuf.TestProtos.Proto2.UnittestExtensions; 7 8 namespace Google.Protobuf 9 { 10 public class ExtensionSetTest 11 { 12 [Test] EmptyExtensionSet()13 public void EmptyExtensionSet() 14 { 15 ExtensionSet<TestAllExtensions> extensions = new ExtensionSet<TestAllExtensions>(); 16 Assert.AreEqual(0, extensions.CalculateSize()); 17 } 18 19 [Test] MergeExtensionSet()20 public void MergeExtensionSet() 21 { 22 ExtensionSet<TestAllExtensions> extensions = null; 23 ExtensionSet.Set(ref extensions, OptionalBoolExtension, true); 24 25 ExtensionSet<TestAllExtensions> other = null; 26 27 Assert.IsFalse(ExtensionSet.Has(ref other, OptionalBoolExtension)); 28 ExtensionSet.MergeFrom(ref other, extensions); 29 Assert.IsTrue(ExtensionSet.Has(ref other, OptionalBoolExtension)); 30 } 31 32 [Test] TestMergeCodedInput()33 public void TestMergeCodedInput() 34 { 35 var message = new TestAllExtensions(); 36 message.SetExtension(OptionalBoolExtension, true); 37 var serialized = message.ToByteArray(); 38 39 MessageParsingHelpers.AssertWritingMessage(message); 40 41 MessageParsingHelpers.AssertReadingMessage( 42 TestAllExtensions.Parser.WithExtensionRegistry(new ExtensionRegistry() { OptionalBoolExtension }), 43 serialized, 44 other => 45 { 46 Assert.AreEqual(message, other); 47 Assert.AreEqual(message.CalculateSize(), other.CalculateSize()); 48 }); 49 } 50 51 [Test] TestMergeMessage()52 public void TestMergeMessage() 53 { 54 var message = new TestAllExtensions(); 55 message.SetExtension(OptionalBoolExtension, true); 56 57 var other = new TestAllExtensions(); 58 59 Assert.AreNotEqual(message, other); 60 Assert.AreNotEqual(message.CalculateSize(), other.CalculateSize()); 61 62 other.MergeFrom(message); 63 64 Assert.AreEqual(message, other); 65 Assert.AreEqual(message.CalculateSize(), other.CalculateSize()); 66 } 67 68 [Test] TryMergeFieldFrom_CodedInputStream()69 public void TryMergeFieldFrom_CodedInputStream() 70 { 71 var message = new TestAllExtensions(); 72 message.SetExtension(OptionalStringExtension, "abcd"); 73 74 var input = new CodedInputStream(message.ToByteArray()); 75 input.ExtensionRegistry = new ExtensionRegistry() { OptionalStringExtension }; 76 input.ReadTag(); // TryMergeFieldFrom expects that a tag was just read and will inspect the LastTag value 77 78 ExtensionSet<TestAllExtensions> extensionSet = null; 79 // test the legacy overload of TryMergeFieldFrom that takes a CodedInputStream 80 Assert.IsTrue(ExtensionSet.TryMergeFieldFrom(ref extensionSet, input)); 81 Assert.AreEqual("abcd", ExtensionSet.Get(ref extensionSet, OptionalStringExtension)); 82 } 83 84 [Test] GetSingle()85 public void GetSingle() 86 { 87 var extensionValue = new TestAllTypes.Types.NestedMessage() { Bb = 42 }; 88 var untypedExtension = new Extension<TestAllExtensions, object>(OptionalNestedMessageExtension.FieldNumber, codec: null); 89 var wrongTypedExtension = new Extension<TestAllExtensions, TestAllTypes>(OptionalNestedMessageExtension.FieldNumber, codec: null); 90 91 var message = new TestAllExtensions(); 92 93 var value1 = message.GetExtension(untypedExtension); 94 Assert.IsNull(value1); 95 96 message.SetExtension(OptionalNestedMessageExtension, extensionValue); 97 var value2 = message.GetExtension(untypedExtension); 98 Assert.IsNotNull(value2); 99 100 var valueBytes = ((IMessage)value2).ToByteArray(); 101 var parsedValue = TestProtos.Proto2.TestAllTypes.Types.NestedMessage.Parser.ParseFrom(valueBytes); 102 Assert.AreEqual(extensionValue, parsedValue); 103 104 var ex = Assert.Throws<InvalidOperationException>(() => message.GetExtension(wrongTypedExtension)); 105 106 var expectedMessage = "The stored extension value has a type of 'Google.Protobuf.TestProtos.Proto2.TestAllTypes+Types+NestedMessage, Google.Protobuf.Test.TestProtos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604'. " + 107 "This a different from the requested type of 'Google.Protobuf.TestProtos.Proto2.TestAllTypes, Google.Protobuf.Test.TestProtos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604'."; 108 Assert.AreEqual(expectedMessage, ex.Message); 109 } 110 111 [Test] GetRepeated()112 public void GetRepeated() 113 { 114 var extensionValue = new TestAllTypes.Types.NestedMessage() { Bb = 42 }; 115 var untypedExtension = new Extension<TestAllExtensions, IList>(RepeatedNestedMessageExtension.FieldNumber, codec: null); 116 var wrongTypedExtension = new RepeatedExtension<TestAllExtensions, TestAllTypes>(RepeatedNestedMessageExtension.FieldNumber, codec: null); 117 118 var message = new TestAllExtensions(); 119 120 var value1 = message.GetExtension(untypedExtension); 121 Assert.IsNull(value1); 122 123 var repeatedField = message.GetOrInitializeExtension<TestAllTypes.Types.NestedMessage>(RepeatedNestedMessageExtension); 124 repeatedField.Add(extensionValue); 125 126 var value2 = message.GetExtension(untypedExtension); 127 Assert.IsNotNull(value2); 128 Assert.AreEqual(1, value2.Count); 129 130 var valueBytes = ((IMessage)value2[0]).ToByteArray(); 131 var parsedValue = TestProtos.Proto2.TestAllTypes.Types.NestedMessage.Parser.ParseFrom(valueBytes); 132 Assert.AreEqual(extensionValue, parsedValue); 133 134 var ex = Assert.Throws<InvalidOperationException>(() => message.GetExtension(wrongTypedExtension)); 135 136 var expectedMessage = "The stored extension value has a type of 'Google.Protobuf.TestProtos.Proto2.TestAllTypes+Types+NestedMessage, Google.Protobuf.Test.TestProtos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604'. " + 137 "This a different from the requested type of 'Google.Protobuf.TestProtos.Proto2.TestAllTypes, Google.Protobuf.Test.TestProtos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604'."; 138 Assert.AreEqual(expectedMessage, ex.Message); 139 } 140 141 [Test] TestEquals()142 public void TestEquals() 143 { 144 var message = new TestAllExtensions(); 145 message.SetExtension(OptionalBoolExtension, true); 146 147 var other = new TestAllExtensions(); 148 149 Assert.AreNotEqual(message, other); 150 Assert.AreNotEqual(message.CalculateSize(), other.CalculateSize()); 151 152 other.SetExtension(OptionalBoolExtension, true); 153 154 Assert.AreEqual(message, other); 155 Assert.AreEqual(message.CalculateSize(), other.CalculateSize()); 156 } 157 158 [Test] TestHashCode()159 public void TestHashCode() 160 { 161 var message = new TestAllExtensions(); 162 var hashCode = message.GetHashCode(); 163 164 message.SetExtension(OptionalBoolExtension, true); 165 166 Assert.AreNotEqual(hashCode, message.GetHashCode()); 167 } 168 169 [Test] TestClone()170 public void TestClone() 171 { 172 var message = new TestAllExtensions(); 173 message.SetExtension(OptionalBoolExtension, true); 174 175 var other = message.Clone(); 176 177 Assert.AreEqual(message, other); 178 Assert.AreEqual(message.CalculateSize(), other.CalculateSize()); 179 } 180 181 [Test] TestDefaultValueRoundTrip()182 public void TestDefaultValueRoundTrip() 183 { 184 var message = new TestAllExtensions(); 185 message.SetExtension(OptionalBoolExtension, false); 186 Assert.IsFalse(message.GetExtension(OptionalBoolExtension)); 187 Assert.IsTrue(message.HasExtension(OptionalBoolExtension)); 188 189 var bytes = message.ToByteArray(); 190 var registry = new ExtensionRegistry { OptionalBoolExtension }; 191 var parsed = TestAllExtensions.Parser.WithExtensionRegistry(registry).ParseFrom(bytes); 192 Assert.IsFalse(parsed.GetExtension(OptionalBoolExtension)); 193 Assert.IsTrue(parsed.HasExtension(OptionalBoolExtension)); 194 } 195 } 196 } 197