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