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