xref: /aosp_15_r20/external/protobuf/csharp/src/Google.Protobuf.Test/ExtensionSetTest.cs (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
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