xref: /aosp_15_r20/external/protobuf/csharp/src/Google.Protobuf.Test/Reflection/FieldAccessTest.cs (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Worker #region Copyright notice and license
2*1b3f573fSAndroid Build Coastguard Worker // Protocol Buffers - Google's data interchange format
3*1b3f573fSAndroid Build Coastguard Worker // Copyright 2015 Google Inc.  All rights reserved.
4*1b3f573fSAndroid Build Coastguard Worker // https://developers.google.com/protocol-buffers/
5*1b3f573fSAndroid Build Coastguard Worker //
6*1b3f573fSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
7*1b3f573fSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
8*1b3f573fSAndroid Build Coastguard Worker // met:
9*1b3f573fSAndroid Build Coastguard Worker //
10*1b3f573fSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
11*1b3f573fSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
12*1b3f573fSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
13*1b3f573fSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
14*1b3f573fSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
15*1b3f573fSAndroid Build Coastguard Worker // distribution.
16*1b3f573fSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
17*1b3f573fSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
18*1b3f573fSAndroid Build Coastguard Worker // this software without specific prior written permission.
19*1b3f573fSAndroid Build Coastguard Worker //
20*1b3f573fSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21*1b3f573fSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23*1b3f573fSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24*1b3f573fSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25*1b3f573fSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27*1b3f573fSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28*1b3f573fSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29*1b3f573fSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30*1b3f573fSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*1b3f573fSAndroid Build Coastguard Worker #endregion
32*1b3f573fSAndroid Build Coastguard Worker 
33*1b3f573fSAndroid Build Coastguard Worker using Google.Protobuf.TestProtos;
34*1b3f573fSAndroid Build Coastguard Worker using Proto2 = Google.Protobuf.TestProtos.Proto2;
35*1b3f573fSAndroid Build Coastguard Worker using NUnit.Framework;
36*1b3f573fSAndroid Build Coastguard Worker using System;
37*1b3f573fSAndroid Build Coastguard Worker using System.Collections;
38*1b3f573fSAndroid Build Coastguard Worker using System.Collections.Generic;
39*1b3f573fSAndroid Build Coastguard Worker 
40*1b3f573fSAndroid Build Coastguard Worker using static Google.Protobuf.TestProtos.Proto2.UnittestExtensions;
41*1b3f573fSAndroid Build Coastguard Worker using ProtobufUnittest;
42*1b3f573fSAndroid Build Coastguard Worker 
43*1b3f573fSAndroid Build Coastguard Worker namespace Google.Protobuf.Reflection
44*1b3f573fSAndroid Build Coastguard Worker {
45*1b3f573fSAndroid Build Coastguard Worker     public class FieldAccessTest
46*1b3f573fSAndroid Build Coastguard Worker     {
47*1b3f573fSAndroid Build Coastguard Worker         [Test]
GetValue()48*1b3f573fSAndroid Build Coastguard Worker         public void GetValue()
49*1b3f573fSAndroid Build Coastguard Worker         {
50*1b3f573fSAndroid Build Coastguard Worker             var message = SampleMessages.CreateFullTestAllTypes();
51*1b3f573fSAndroid Build Coastguard Worker             var fields = TestProtos.TestAllTypes.Descriptor.Fields;
52*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleBool, fields[TestProtos.TestAllTypes.SingleBoolFieldNumber].Accessor.GetValue(message));
53*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleBytes, fields[TestProtos.TestAllTypes.SingleBytesFieldNumber].Accessor.GetValue(message));
54*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleDouble, fields[TestProtos.TestAllTypes.SingleDoubleFieldNumber].Accessor.GetValue(message));
55*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleFixed32, fields[TestProtos.TestAllTypes.SingleFixed32FieldNumber].Accessor.GetValue(message));
56*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleFixed64, fields[TestProtos.TestAllTypes.SingleFixed64FieldNumber].Accessor.GetValue(message));
57*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleFloat, fields[TestProtos.TestAllTypes.SingleFloatFieldNumber].Accessor.GetValue(message));
58*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleForeignEnum, fields[TestProtos.TestAllTypes.SingleForeignEnumFieldNumber].Accessor.GetValue(message));
59*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleForeignMessage, fields[TestProtos.TestAllTypes.SingleForeignMessageFieldNumber].Accessor.GetValue(message));
60*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleImportEnum, fields[TestProtos.TestAllTypes.SingleImportEnumFieldNumber].Accessor.GetValue(message));
61*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleImportMessage, fields[TestProtos.TestAllTypes.SingleImportMessageFieldNumber].Accessor.GetValue(message));
62*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleInt32, fields[TestProtos.TestAllTypes.SingleInt32FieldNumber].Accessor.GetValue(message));
63*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleInt64, fields[TestProtos.TestAllTypes.SingleInt64FieldNumber].Accessor.GetValue(message));
64*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleNestedEnum, fields[TestProtos.TestAllTypes.SingleNestedEnumFieldNumber].Accessor.GetValue(message));
65*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleNestedMessage, fields[TestProtos.TestAllTypes.SingleNestedMessageFieldNumber].Accessor.GetValue(message));
66*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SinglePublicImportMessage, fields[TestProtos.TestAllTypes.SinglePublicImportMessageFieldNumber].Accessor.GetValue(message));
67*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleSint32, fields[TestProtos.TestAllTypes.SingleSint32FieldNumber].Accessor.GetValue(message));
68*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleSint64, fields[TestProtos.TestAllTypes.SingleSint64FieldNumber].Accessor.GetValue(message));
69*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleString, fields[TestProtos.TestAllTypes.SingleStringFieldNumber].Accessor.GetValue(message));
70*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleSfixed32, fields[TestProtos.TestAllTypes.SingleSfixed32FieldNumber].Accessor.GetValue(message));
71*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleSfixed64, fields[TestProtos.TestAllTypes.SingleSfixed64FieldNumber].Accessor.GetValue(message));
72*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleUint32, fields[TestProtos.TestAllTypes.SingleUint32FieldNumber].Accessor.GetValue(message));
73*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.SingleUint64, fields[TestProtos.TestAllTypes.SingleUint64FieldNumber].Accessor.GetValue(message));
74*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.OneofBytes, fields[TestProtos.TestAllTypes.OneofBytesFieldNumber].Accessor.GetValue(message));
75*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.OneofString, fields[TestProtos.TestAllTypes.OneofStringFieldNumber].Accessor.GetValue(message));
76*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.OneofNestedMessage, fields[TestProtos.TestAllTypes.OneofNestedMessageFieldNumber].Accessor.GetValue(message));
77*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.OneofUint32, fields[TestProtos.TestAllTypes.OneofUint32FieldNumber].Accessor.GetValue(message));
78*1b3f573fSAndroid Build Coastguard Worker 
79*1b3f573fSAndroid Build Coastguard Worker             // Just one example for repeated fields - they're all just returning the list
80*1b3f573fSAndroid Build Coastguard Worker             var list = (IList) fields[TestProtos.TestAllTypes.RepeatedInt32FieldNumber].Accessor.GetValue(message);
81*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.RepeatedInt32, list);
82*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.RepeatedInt32[0], list[0]); // Just in case there was any doubt...
83*1b3f573fSAndroid Build Coastguard Worker 
84*1b3f573fSAndroid Build Coastguard Worker             // Just a single map field, for the same reason
85*1b3f573fSAndroid Build Coastguard Worker             var mapMessage = new TestMap { MapStringString = { { "key1", "value1" }, { "key2", "value2" } } };
86*1b3f573fSAndroid Build Coastguard Worker             fields = TestMap.Descriptor.Fields;
87*1b3f573fSAndroid Build Coastguard Worker             var dictionary = (IDictionary) fields[TestMap.MapStringStringFieldNumber].Accessor.GetValue(mapMessage);
88*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(mapMessage.MapStringString, dictionary);
89*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual("value1", dictionary["key1"]);
90*1b3f573fSAndroid Build Coastguard Worker         }
91*1b3f573fSAndroid Build Coastguard Worker 
92*1b3f573fSAndroid Build Coastguard Worker         [Test]
GetValue_IncorrectType()93*1b3f573fSAndroid Build Coastguard Worker         public void GetValue_IncorrectType()
94*1b3f573fSAndroid Build Coastguard Worker         {
95*1b3f573fSAndroid Build Coastguard Worker             IMessage message = SampleMessages.CreateFullTestAllTypes();
96*1b3f573fSAndroid Build Coastguard Worker             var fields = message.Descriptor.Fields;
97*1b3f573fSAndroid Build Coastguard Worker             Assert.Throws<InvalidCastException>(() => fields[TestProtos.TestAllTypes.SingleBoolFieldNumber].Accessor.GetValue(new TestMap()));
98*1b3f573fSAndroid Build Coastguard Worker         }
99*1b3f573fSAndroid Build Coastguard Worker 
100*1b3f573fSAndroid Build Coastguard Worker         [Test]
HasValue_Proto3_Message()101*1b3f573fSAndroid Build Coastguard Worker         public void HasValue_Proto3_Message()
102*1b3f573fSAndroid Build Coastguard Worker         {
103*1b3f573fSAndroid Build Coastguard Worker             var message = new TestAllTypes();
104*1b3f573fSAndroid Build Coastguard Worker             var accessor = ((IMessage) message).Descriptor.Fields[TestProtos.TestAllTypes.SingleForeignMessageFieldNumber].Accessor;
105*1b3f573fSAndroid Build Coastguard Worker             Assert.False(accessor.HasValue(message));
106*1b3f573fSAndroid Build Coastguard Worker             message.SingleForeignMessage = new ForeignMessage();
107*1b3f573fSAndroid Build Coastguard Worker             Assert.True(accessor.HasValue(message));
108*1b3f573fSAndroid Build Coastguard Worker             message.SingleForeignMessage = null;
109*1b3f573fSAndroid Build Coastguard Worker             Assert.False(accessor.HasValue(message));
110*1b3f573fSAndroid Build Coastguard Worker         }
111*1b3f573fSAndroid Build Coastguard Worker 
112*1b3f573fSAndroid Build Coastguard Worker         [Test]
HasValue_Proto3_Oneof()113*1b3f573fSAndroid Build Coastguard Worker         public void HasValue_Proto3_Oneof()
114*1b3f573fSAndroid Build Coastguard Worker         {
115*1b3f573fSAndroid Build Coastguard Worker             TestAllTypes message = new TestAllTypes();
116*1b3f573fSAndroid Build Coastguard Worker             var accessor = ((IMessage) message).Descriptor.Fields[TestProtos.TestAllTypes.OneofStringFieldNumber].Accessor;
117*1b3f573fSAndroid Build Coastguard Worker             Assert.False(accessor.HasValue(message));
118*1b3f573fSAndroid Build Coastguard Worker             // Even though it's the default value, we still have a value.
119*1b3f573fSAndroid Build Coastguard Worker             message.OneofString = "";
120*1b3f573fSAndroid Build Coastguard Worker             Assert.True(accessor.HasValue(message));
121*1b3f573fSAndroid Build Coastguard Worker             message.OneofString = "hello";
122*1b3f573fSAndroid Build Coastguard Worker             Assert.True(accessor.HasValue(message));
123*1b3f573fSAndroid Build Coastguard Worker             message.OneofUint32 = 10;
124*1b3f573fSAndroid Build Coastguard Worker             Assert.False(accessor.HasValue(message));
125*1b3f573fSAndroid Build Coastguard Worker         }
126*1b3f573fSAndroid Build Coastguard Worker 
127*1b3f573fSAndroid Build Coastguard Worker         [Test]
HasValue_Proto3_Primitive_Optional()128*1b3f573fSAndroid Build Coastguard Worker         public void HasValue_Proto3_Primitive_Optional()
129*1b3f573fSAndroid Build Coastguard Worker         {
130*1b3f573fSAndroid Build Coastguard Worker             var message = new TestProto3Optional();
131*1b3f573fSAndroid Build Coastguard Worker             var accessor = ((IMessage) message).Descriptor.Fields[TestProto3Optional.OptionalInt64FieldNumber].Accessor;
132*1b3f573fSAndroid Build Coastguard Worker             Assert.IsFalse(accessor.HasValue(message));
133*1b3f573fSAndroid Build Coastguard Worker             message.OptionalInt64 = 5L;
134*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(accessor.HasValue(message));
135*1b3f573fSAndroid Build Coastguard Worker             message.ClearOptionalInt64();
136*1b3f573fSAndroid Build Coastguard Worker             Assert.IsFalse(accessor.HasValue(message));
137*1b3f573fSAndroid Build Coastguard Worker             message.OptionalInt64 = 0L;
138*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(accessor.HasValue(message));
139*1b3f573fSAndroid Build Coastguard Worker         }
140*1b3f573fSAndroid Build Coastguard Worker 
141*1b3f573fSAndroid Build Coastguard Worker         [Test]
HasValue_Proto3_Primitive_NotOptional()142*1b3f573fSAndroid Build Coastguard Worker         public void HasValue_Proto3_Primitive_NotOptional()
143*1b3f573fSAndroid Build Coastguard Worker         {
144*1b3f573fSAndroid Build Coastguard Worker             IMessage message = SampleMessages.CreateFullTestAllTypes();
145*1b3f573fSAndroid Build Coastguard Worker             var fields = message.Descriptor.Fields;
146*1b3f573fSAndroid Build Coastguard Worker             Assert.Throws<InvalidOperationException>(() => fields[TestProtos.TestAllTypes.SingleBoolFieldNumber].Accessor.HasValue(message));
147*1b3f573fSAndroid Build Coastguard Worker         }
148*1b3f573fSAndroid Build Coastguard Worker 
149*1b3f573fSAndroid Build Coastguard Worker         [Test]
HasValue_Proto3_Repeated()150*1b3f573fSAndroid Build Coastguard Worker         public void HasValue_Proto3_Repeated()
151*1b3f573fSAndroid Build Coastguard Worker         {
152*1b3f573fSAndroid Build Coastguard Worker             var message = new TestAllTypes();
153*1b3f573fSAndroid Build Coastguard Worker             var accessor = ((IMessage) message).Descriptor.Fields[TestProtos.TestAllTypes.RepeatedBoolFieldNumber].Accessor;
154*1b3f573fSAndroid Build Coastguard Worker             Assert.Throws<InvalidOperationException>(() => accessor.HasValue(message));
155*1b3f573fSAndroid Build Coastguard Worker         }
156*1b3f573fSAndroid Build Coastguard Worker 
157*1b3f573fSAndroid Build Coastguard Worker         [Test]
HasValue_Proto2_Primitive()158*1b3f573fSAndroid Build Coastguard Worker         public void HasValue_Proto2_Primitive()
159*1b3f573fSAndroid Build Coastguard Worker         {
160*1b3f573fSAndroid Build Coastguard Worker             var message = new Proto2.TestAllTypes();
161*1b3f573fSAndroid Build Coastguard Worker             var accessor = ((IMessage) message).Descriptor.Fields[Proto2.TestAllTypes.OptionalInt64FieldNumber].Accessor;
162*1b3f573fSAndroid Build Coastguard Worker 
163*1b3f573fSAndroid Build Coastguard Worker             Assert.IsFalse(accessor.HasValue(message));
164*1b3f573fSAndroid Build Coastguard Worker             message.OptionalInt64 = 5L;
165*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(accessor.HasValue(message));
166*1b3f573fSAndroid Build Coastguard Worker             message.ClearOptionalInt64();
167*1b3f573fSAndroid Build Coastguard Worker             Assert.IsFalse(accessor.HasValue(message));
168*1b3f573fSAndroid Build Coastguard Worker             message.OptionalInt64 = 0L;
169*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(accessor.HasValue(message));
170*1b3f573fSAndroid Build Coastguard Worker         }
171*1b3f573fSAndroid Build Coastguard Worker 
172*1b3f573fSAndroid Build Coastguard Worker         [Test]
HasValue_Proto2_Message()173*1b3f573fSAndroid Build Coastguard Worker         public void HasValue_Proto2_Message()
174*1b3f573fSAndroid Build Coastguard Worker         {
175*1b3f573fSAndroid Build Coastguard Worker             var message = new Proto2.TestAllTypes();
176*1b3f573fSAndroid Build Coastguard Worker             var field = ((IMessage) message).Descriptor.Fields[Proto2.TestAllTypes.OptionalForeignMessageFieldNumber];
177*1b3f573fSAndroid Build Coastguard Worker             Assert.False(field.Accessor.HasValue(message));
178*1b3f573fSAndroid Build Coastguard Worker             message.OptionalForeignMessage = new Proto2.ForeignMessage();
179*1b3f573fSAndroid Build Coastguard Worker             Assert.True(field.Accessor.HasValue(message));
180*1b3f573fSAndroid Build Coastguard Worker             message.OptionalForeignMessage = null;
181*1b3f573fSAndroid Build Coastguard Worker             Assert.False(field.Accessor.HasValue(message));
182*1b3f573fSAndroid Build Coastguard Worker         }
183*1b3f573fSAndroid Build Coastguard Worker 
184*1b3f573fSAndroid Build Coastguard Worker         [Test]
HasValue_Proto2_Oneof()185*1b3f573fSAndroid Build Coastguard Worker         public void HasValue_Proto2_Oneof()
186*1b3f573fSAndroid Build Coastguard Worker         {
187*1b3f573fSAndroid Build Coastguard Worker             var message = new Proto2.TestAllTypes();
188*1b3f573fSAndroid Build Coastguard Worker             var accessor = ((IMessage) message).Descriptor.Fields[Proto2.TestAllTypes.OneofStringFieldNumber].Accessor;
189*1b3f573fSAndroid Build Coastguard Worker             Assert.False(accessor.HasValue(message));
190*1b3f573fSAndroid Build Coastguard Worker             // Even though it's the default value, we still have a value.
191*1b3f573fSAndroid Build Coastguard Worker             message.OneofString = "";
192*1b3f573fSAndroid Build Coastguard Worker             Assert.True(accessor.HasValue(message));
193*1b3f573fSAndroid Build Coastguard Worker             message.OneofString = "hello";
194*1b3f573fSAndroid Build Coastguard Worker             Assert.True(accessor.HasValue(message));
195*1b3f573fSAndroid Build Coastguard Worker             message.OneofUint32 = 10;
196*1b3f573fSAndroid Build Coastguard Worker             Assert.False(accessor.HasValue(message));
197*1b3f573fSAndroid Build Coastguard Worker         }
198*1b3f573fSAndroid Build Coastguard Worker 
199*1b3f573fSAndroid Build Coastguard Worker         [Test]
HasValue_Proto2_Repeated()200*1b3f573fSAndroid Build Coastguard Worker         public void HasValue_Proto2_Repeated()
201*1b3f573fSAndroid Build Coastguard Worker         {
202*1b3f573fSAndroid Build Coastguard Worker             var message = new Proto2.TestAllTypes();
203*1b3f573fSAndroid Build Coastguard Worker             var accessor = ((IMessage) message).Descriptor.Fields[Proto2.TestAllTypes.RepeatedBoolFieldNumber].Accessor;
204*1b3f573fSAndroid Build Coastguard Worker             Assert.Throws<InvalidOperationException>(() => accessor.HasValue(message));
205*1b3f573fSAndroid Build Coastguard Worker         }
206*1b3f573fSAndroid Build Coastguard Worker 
207*1b3f573fSAndroid Build Coastguard Worker         [Test]
SetValue_SingleFields()208*1b3f573fSAndroid Build Coastguard Worker         public void SetValue_SingleFields()
209*1b3f573fSAndroid Build Coastguard Worker         {
210*1b3f573fSAndroid Build Coastguard Worker             // Just a sample (primitives, messages, enums, strings, byte strings)
211*1b3f573fSAndroid Build Coastguard Worker             var message = SampleMessages.CreateFullTestAllTypes();
212*1b3f573fSAndroid Build Coastguard Worker             var fields = TestProtos.TestAllTypes.Descriptor.Fields;
213*1b3f573fSAndroid Build Coastguard Worker             fields[TestProtos.TestAllTypes.SingleBoolFieldNumber].Accessor.SetValue(message, false);
214*1b3f573fSAndroid Build Coastguard Worker             fields[TestProtos.TestAllTypes.SingleInt32FieldNumber].Accessor.SetValue(message, 500);
215*1b3f573fSAndroid Build Coastguard Worker             fields[TestProtos.TestAllTypes.SingleStringFieldNumber].Accessor.SetValue(message, "It's a string");
216*1b3f573fSAndroid Build Coastguard Worker             fields[TestProtos.TestAllTypes.SingleBytesFieldNumber].Accessor.SetValue(message, ByteString.CopyFrom(99, 98, 97));
217*1b3f573fSAndroid Build Coastguard Worker             fields[TestProtos.TestAllTypes.SingleForeignEnumFieldNumber].Accessor.SetValue(message, ForeignEnum.ForeignFoo);
218*1b3f573fSAndroid Build Coastguard Worker             fields[TestProtos.TestAllTypes.SingleForeignMessageFieldNumber].Accessor.SetValue(message, new ForeignMessage { C = 12345 });
219*1b3f573fSAndroid Build Coastguard Worker             fields[TestProtos.TestAllTypes.SingleDoubleFieldNumber].Accessor.SetValue(message, 20150701.5);
220*1b3f573fSAndroid Build Coastguard Worker 
221*1b3f573fSAndroid Build Coastguard Worker             var expected = new TestAllTypes(SampleMessages.CreateFullTestAllTypes())
222*1b3f573fSAndroid Build Coastguard Worker             {
223*1b3f573fSAndroid Build Coastguard Worker                 SingleBool = false,
224*1b3f573fSAndroid Build Coastguard Worker                 SingleInt32 = 500,
225*1b3f573fSAndroid Build Coastguard Worker                 SingleString = "It's a string",
226*1b3f573fSAndroid Build Coastguard Worker                 SingleBytes = ByteString.CopyFrom(99, 98, 97),
227*1b3f573fSAndroid Build Coastguard Worker                 SingleForeignEnum = ForeignEnum.ForeignFoo,
228*1b3f573fSAndroid Build Coastguard Worker                 SingleForeignMessage = new ForeignMessage { C = 12345 },
229*1b3f573fSAndroid Build Coastguard Worker                 SingleDouble = 20150701.5
230*1b3f573fSAndroid Build Coastguard Worker             };
231*1b3f573fSAndroid Build Coastguard Worker 
232*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(expected, message);
233*1b3f573fSAndroid Build Coastguard Worker         }
234*1b3f573fSAndroid Build Coastguard Worker 
235*1b3f573fSAndroid Build Coastguard Worker         [Test]
SetValue_SingleFields_WrongType()236*1b3f573fSAndroid Build Coastguard Worker         public void SetValue_SingleFields_WrongType()
237*1b3f573fSAndroid Build Coastguard Worker         {
238*1b3f573fSAndroid Build Coastguard Worker             IMessage message = SampleMessages.CreateFullTestAllTypes();
239*1b3f573fSAndroid Build Coastguard Worker             var fields = message.Descriptor.Fields;
240*1b3f573fSAndroid Build Coastguard Worker             Assert.Throws<InvalidCastException>(() => fields[TestProtos.TestAllTypes.SingleBoolFieldNumber].Accessor.SetValue(message, "This isn't a bool"));
241*1b3f573fSAndroid Build Coastguard Worker         }
242*1b3f573fSAndroid Build Coastguard Worker 
243*1b3f573fSAndroid Build Coastguard Worker         [Test]
SetValue_MapFields()244*1b3f573fSAndroid Build Coastguard Worker         public void SetValue_MapFields()
245*1b3f573fSAndroid Build Coastguard Worker         {
246*1b3f573fSAndroid Build Coastguard Worker             IMessage message = new TestMap();
247*1b3f573fSAndroid Build Coastguard Worker             var fields = message.Descriptor.Fields;
248*1b3f573fSAndroid Build Coastguard Worker             Assert.Throws<InvalidOperationException>(() => fields[TestMap.MapStringStringFieldNumber].Accessor.SetValue(message, new Dictionary<string, string>()));
249*1b3f573fSAndroid Build Coastguard Worker         }
250*1b3f573fSAndroid Build Coastguard Worker 
251*1b3f573fSAndroid Build Coastguard Worker         [Test]
SetValue_RepeatedFields()252*1b3f573fSAndroid Build Coastguard Worker         public void SetValue_RepeatedFields()
253*1b3f573fSAndroid Build Coastguard Worker         {
254*1b3f573fSAndroid Build Coastguard Worker             IMessage message = SampleMessages.CreateFullTestAllTypes();
255*1b3f573fSAndroid Build Coastguard Worker             var fields = message.Descriptor.Fields;
256*1b3f573fSAndroid Build Coastguard Worker             Assert.Throws<InvalidOperationException>(() => fields[TestProtos.TestAllTypes.RepeatedDoubleFieldNumber].Accessor.SetValue(message, new double[10]));
257*1b3f573fSAndroid Build Coastguard Worker         }
258*1b3f573fSAndroid Build Coastguard Worker 
259*1b3f573fSAndroid Build Coastguard Worker         [Test]
Oneof()260*1b3f573fSAndroid Build Coastguard Worker         public void Oneof()
261*1b3f573fSAndroid Build Coastguard Worker         {
262*1b3f573fSAndroid Build Coastguard Worker             var message = new TestAllTypes();
263*1b3f573fSAndroid Build Coastguard Worker             var descriptor = TestProtos.TestAllTypes.Descriptor;
264*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(1, descriptor.Oneofs.Count);
265*1b3f573fSAndroid Build Coastguard Worker             var oneof = descriptor.Oneofs[0];
266*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual("oneof_field", oneof.Name);
267*1b3f573fSAndroid Build Coastguard Worker             Assert.IsNull(oneof.Accessor.GetCaseFieldDescriptor(message));
268*1b3f573fSAndroid Build Coastguard Worker 
269*1b3f573fSAndroid Build Coastguard Worker             message.OneofString = "foo";
270*1b3f573fSAndroid Build Coastguard Worker             Assert.AreSame(descriptor.Fields[TestProtos.TestAllTypes.OneofStringFieldNumber], oneof.Accessor.GetCaseFieldDescriptor(message));
271*1b3f573fSAndroid Build Coastguard Worker 
272*1b3f573fSAndroid Build Coastguard Worker             message.OneofUint32 = 10;
273*1b3f573fSAndroid Build Coastguard Worker             Assert.AreSame(descriptor.Fields[TestProtos.TestAllTypes.OneofUint32FieldNumber], oneof.Accessor.GetCaseFieldDescriptor(message));
274*1b3f573fSAndroid Build Coastguard Worker 
275*1b3f573fSAndroid Build Coastguard Worker             oneof.Accessor.Clear(message);
276*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(TestProtos.TestAllTypes.OneofFieldOneofCase.None, message.OneofFieldCase);
277*1b3f573fSAndroid Build Coastguard Worker         }
278*1b3f573fSAndroid Build Coastguard Worker 
279*1b3f573fSAndroid Build Coastguard Worker         [Test]
Clear()280*1b3f573fSAndroid Build Coastguard Worker         public void Clear()
281*1b3f573fSAndroid Build Coastguard Worker         {
282*1b3f573fSAndroid Build Coastguard Worker             var message = SampleMessages.CreateFullTestAllTypes();
283*1b3f573fSAndroid Build Coastguard Worker             var fields = TestProtos.TestAllTypes.Descriptor.Fields;
284*1b3f573fSAndroid Build Coastguard Worker             fields[TestProtos.TestAllTypes.SingleBoolFieldNumber].Accessor.Clear(message);
285*1b3f573fSAndroid Build Coastguard Worker             fields[TestProtos.TestAllTypes.SingleInt32FieldNumber].Accessor.Clear(message);
286*1b3f573fSAndroid Build Coastguard Worker             fields[TestProtos.TestAllTypes.SingleStringFieldNumber].Accessor.Clear(message);
287*1b3f573fSAndroid Build Coastguard Worker             fields[TestProtos.TestAllTypes.SingleBytesFieldNumber].Accessor.Clear(message);
288*1b3f573fSAndroid Build Coastguard Worker             fields[TestProtos.TestAllTypes.SingleForeignEnumFieldNumber].Accessor.Clear(message);
289*1b3f573fSAndroid Build Coastguard Worker             fields[TestProtos.TestAllTypes.SingleForeignMessageFieldNumber].Accessor.Clear(message);
290*1b3f573fSAndroid Build Coastguard Worker             fields[TestProtos.TestAllTypes.RepeatedDoubleFieldNumber].Accessor.Clear(message);
291*1b3f573fSAndroid Build Coastguard Worker 
292*1b3f573fSAndroid Build Coastguard Worker             var expected = new TestAllTypes(SampleMessages.CreateFullTestAllTypes())
293*1b3f573fSAndroid Build Coastguard Worker             {
294*1b3f573fSAndroid Build Coastguard Worker                 SingleBool = false,
295*1b3f573fSAndroid Build Coastguard Worker                 SingleInt32 = 0,
296*1b3f573fSAndroid Build Coastguard Worker                 SingleString = "",
297*1b3f573fSAndroid Build Coastguard Worker                 SingleBytes = ByteString.Empty,
298*1b3f573fSAndroid Build Coastguard Worker                 SingleForeignEnum = 0,
299*1b3f573fSAndroid Build Coastguard Worker                 SingleForeignMessage = null,
300*1b3f573fSAndroid Build Coastguard Worker             };
301*1b3f573fSAndroid Build Coastguard Worker             expected.RepeatedDouble.Clear();
302*1b3f573fSAndroid Build Coastguard Worker 
303*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(expected, message);
304*1b3f573fSAndroid Build Coastguard Worker 
305*1b3f573fSAndroid Build Coastguard Worker             // Separately, maps.
306*1b3f573fSAndroid Build Coastguard Worker             var mapMessage = new TestMap { MapStringString = { { "key1", "value1" }, { "key2", "value2" } } };
307*1b3f573fSAndroid Build Coastguard Worker             fields = TestMap.Descriptor.Fields;
308*1b3f573fSAndroid Build Coastguard Worker             fields[TestMap.MapStringStringFieldNumber].Accessor.Clear(mapMessage);
309*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0, mapMessage.MapStringString.Count);
310*1b3f573fSAndroid Build Coastguard Worker         }
311*1b3f573fSAndroid Build Coastguard Worker 
312*1b3f573fSAndroid Build Coastguard Worker         [Test]
Clear_Proto3Optional()313*1b3f573fSAndroid Build Coastguard Worker         public void Clear_Proto3Optional()
314*1b3f573fSAndroid Build Coastguard Worker         {
315*1b3f573fSAndroid Build Coastguard Worker             TestProto3Optional message = new TestProto3Optional
316*1b3f573fSAndroid Build Coastguard Worker             {
317*1b3f573fSAndroid Build Coastguard Worker                 OptionalInt32 = 0,
318*1b3f573fSAndroid Build Coastguard Worker                 OptionalNestedMessage = new TestProto3Optional.Types.NestedMessage()
319*1b3f573fSAndroid Build Coastguard Worker             };
320*1b3f573fSAndroid Build Coastguard Worker             var primitiveField = TestProto3Optional.Descriptor.Fields[TestProto3Optional.OptionalInt32FieldNumber];
321*1b3f573fSAndroid Build Coastguard Worker             var messageField = TestProto3Optional.Descriptor.Fields[TestProto3Optional.OptionalNestedMessageFieldNumber];
322*1b3f573fSAndroid Build Coastguard Worker 
323*1b3f573fSAndroid Build Coastguard Worker             Assert.True(message.HasOptionalInt32);
324*1b3f573fSAndroid Build Coastguard Worker             Assert.NotNull(message.OptionalNestedMessage);
325*1b3f573fSAndroid Build Coastguard Worker 
326*1b3f573fSAndroid Build Coastguard Worker             primitiveField.Accessor.Clear(message);
327*1b3f573fSAndroid Build Coastguard Worker             messageField.Accessor.Clear(message);
328*1b3f573fSAndroid Build Coastguard Worker 
329*1b3f573fSAndroid Build Coastguard Worker             Assert.False(message.HasOptionalInt32);
330*1b3f573fSAndroid Build Coastguard Worker             Assert.Null(message.OptionalNestedMessage);
331*1b3f573fSAndroid Build Coastguard Worker         }
332*1b3f573fSAndroid Build Coastguard Worker 
333*1b3f573fSAndroid Build Coastguard Worker         [Test]
Clear_Proto3_Oneof()334*1b3f573fSAndroid Build Coastguard Worker         public void Clear_Proto3_Oneof()
335*1b3f573fSAndroid Build Coastguard Worker         {
336*1b3f573fSAndroid Build Coastguard Worker             var message = new TestAllTypes();
337*1b3f573fSAndroid Build Coastguard Worker             var accessor = ((IMessage) message).Descriptor.Fields[TestProtos.TestAllTypes.OneofUint32FieldNumber].Accessor;
338*1b3f573fSAndroid Build Coastguard Worker 
339*1b3f573fSAndroid Build Coastguard Worker             // The field accessor Clear method only affects a oneof if the current case is the one being cleared.
340*1b3f573fSAndroid Build Coastguard Worker             message.OneofString = "hello";
341*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(TestProtos.TestAllTypes.OneofFieldOneofCase.OneofString, message.OneofFieldCase);
342*1b3f573fSAndroid Build Coastguard Worker             accessor.Clear(message);
343*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(TestProtos.TestAllTypes.OneofFieldOneofCase.OneofString, message.OneofFieldCase);
344*1b3f573fSAndroid Build Coastguard Worker 
345*1b3f573fSAndroid Build Coastguard Worker             message.OneofUint32 = 100;
346*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(TestProtos.TestAllTypes.OneofFieldOneofCase.OneofUint32, message.OneofFieldCase);
347*1b3f573fSAndroid Build Coastguard Worker             accessor.Clear(message);
348*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(TestProtos.TestAllTypes.OneofFieldOneofCase.None, message.OneofFieldCase);
349*1b3f573fSAndroid Build Coastguard Worker         }
350*1b3f573fSAndroid Build Coastguard Worker 
351*1b3f573fSAndroid Build Coastguard Worker         [Test]
Clear_Proto2_Oneof()352*1b3f573fSAndroid Build Coastguard Worker         public void Clear_Proto2_Oneof()
353*1b3f573fSAndroid Build Coastguard Worker         {
354*1b3f573fSAndroid Build Coastguard Worker             var message = new Proto2.TestAllTypes();
355*1b3f573fSAndroid Build Coastguard Worker             var accessor = ((IMessage) message).Descriptor.Fields[Proto2.TestAllTypes.OneofUint32FieldNumber].Accessor;
356*1b3f573fSAndroid Build Coastguard Worker 
357*1b3f573fSAndroid Build Coastguard Worker             // The field accessor Clear method only affects a oneof if the current case is the one being cleared.
358*1b3f573fSAndroid Build Coastguard Worker             message.OneofString = "hello";
359*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(Proto2.TestAllTypes.OneofFieldOneofCase.OneofString, message.OneofFieldCase);
360*1b3f573fSAndroid Build Coastguard Worker             accessor.Clear(message);
361*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(Proto2.TestAllTypes.OneofFieldOneofCase.OneofString, message.OneofFieldCase);
362*1b3f573fSAndroid Build Coastguard Worker 
363*1b3f573fSAndroid Build Coastguard Worker             message.OneofUint32 = 100;
364*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(Proto2.TestAllTypes.OneofFieldOneofCase.OneofUint32, message.OneofFieldCase);
365*1b3f573fSAndroid Build Coastguard Worker             accessor.Clear(message);
366*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(Proto2.TestAllTypes.OneofFieldOneofCase.None, message.OneofFieldCase);
367*1b3f573fSAndroid Build Coastguard Worker         }
368*1b3f573fSAndroid Build Coastguard Worker 
369*1b3f573fSAndroid Build Coastguard Worker         [Test]
FieldDescriptor_ByName()370*1b3f573fSAndroid Build Coastguard Worker         public void FieldDescriptor_ByName()
371*1b3f573fSAndroid Build Coastguard Worker         {
372*1b3f573fSAndroid Build Coastguard Worker             var descriptor = TestProtos.TestAllTypes.Descriptor;
373*1b3f573fSAndroid Build Coastguard Worker             Assert.AreSame(
374*1b3f573fSAndroid Build Coastguard Worker                 descriptor.Fields[TestProtos.TestAllTypes.SingleBoolFieldNumber],
375*1b3f573fSAndroid Build Coastguard Worker                 descriptor.Fields["single_bool"]);
376*1b3f573fSAndroid Build Coastguard Worker         }
377*1b3f573fSAndroid Build Coastguard Worker 
378*1b3f573fSAndroid Build Coastguard Worker         [Test]
FieldDescriptor_NotFound()379*1b3f573fSAndroid Build Coastguard Worker         public void FieldDescriptor_NotFound()
380*1b3f573fSAndroid Build Coastguard Worker         {
381*1b3f573fSAndroid Build Coastguard Worker             var descriptor = TestProtos.TestAllTypes.Descriptor;
382*1b3f573fSAndroid Build Coastguard Worker             Assert.Throws<KeyNotFoundException>(() => descriptor.Fields[999999].ToString());
383*1b3f573fSAndroid Build Coastguard Worker             Assert.Throws<KeyNotFoundException>(() => descriptor.Fields["not found"].ToString());
384*1b3f573fSAndroid Build Coastguard Worker         }
385*1b3f573fSAndroid Build Coastguard Worker 
386*1b3f573fSAndroid Build Coastguard Worker         [Test]
GetExtensionValue()387*1b3f573fSAndroid Build Coastguard Worker         public void GetExtensionValue()
388*1b3f573fSAndroid Build Coastguard Worker         {
389*1b3f573fSAndroid Build Coastguard Worker             var message = SampleMessages.CreateFullTestAllExtensions();
390*1b3f573fSAndroid Build Coastguard Worker 
391*1b3f573fSAndroid Build Coastguard Worker             // test that the reflector works, since the reflector just runs through IExtendableMessage
392*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(message.GetExtension(OptionalBoolExtension), Proto2.TestAllExtensions.Descriptor.FindFieldByNumber(OptionalBoolExtension.FieldNumber).Accessor.GetValue(message));
393*1b3f573fSAndroid Build Coastguard Worker         }
394*1b3f573fSAndroid Build Coastguard Worker 
395*1b3f573fSAndroid Build Coastguard Worker         [Test]
GetRepeatedExtensionValue()396*1b3f573fSAndroid Build Coastguard Worker         public void GetRepeatedExtensionValue()
397*1b3f573fSAndroid Build Coastguard Worker         {
398*1b3f573fSAndroid Build Coastguard Worker             // check to make sure repeated accessor uses GetOrRegister
399*1b3f573fSAndroid Build Coastguard Worker             var message = new Proto2.TestAllExtensions();
400*1b3f573fSAndroid Build Coastguard Worker 
401*1b3f573fSAndroid Build Coastguard Worker             Assert.IsNull(message.GetExtension(RepeatedBoolExtension));
402*1b3f573fSAndroid Build Coastguard Worker             Assert.IsNotNull(Proto2.TestAllExtensions.Descriptor.FindFieldByNumber(RepeatedBoolExtension.FieldNumber).Accessor.GetValue(message));
403*1b3f573fSAndroid Build Coastguard Worker             Assert.IsNotNull(message.GetExtension(RepeatedBoolExtension));
404*1b3f573fSAndroid Build Coastguard Worker 
405*1b3f573fSAndroid Build Coastguard Worker             message.ClearExtension(RepeatedBoolExtension);
406*1b3f573fSAndroid Build Coastguard Worker             Assert.IsNull(message.GetExtension(RepeatedBoolExtension));
407*1b3f573fSAndroid Build Coastguard Worker         }
408*1b3f573fSAndroid Build Coastguard Worker 
409*1b3f573fSAndroid Build Coastguard Worker         [Test]
HasPresence()410*1b3f573fSAndroid Build Coastguard Worker         public void HasPresence()
411*1b3f573fSAndroid Build Coastguard Worker         {
412*1b3f573fSAndroid Build Coastguard Worker             // Proto3
413*1b3f573fSAndroid Build Coastguard Worker             var fields = TestProtos.TestAllTypes.Descriptor.Fields;
414*1b3f573fSAndroid Build Coastguard Worker             Assert.IsFalse(fields[TestProtos.TestAllTypes.SingleBoolFieldNumber].HasPresence);
415*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(fields[TestProtos.TestAllTypes.OneofBytesFieldNumber].HasPresence);
416*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(fields[TestProtos.TestAllTypes.SingleForeignMessageFieldNumber].HasPresence);
417*1b3f573fSAndroid Build Coastguard Worker             Assert.IsFalse(fields[TestProtos.TestAllTypes.RepeatedBoolFieldNumber].HasPresence);
418*1b3f573fSAndroid Build Coastguard Worker 
419*1b3f573fSAndroid Build Coastguard Worker             fields = TestMap.Descriptor.Fields;
420*1b3f573fSAndroid Build Coastguard Worker             Assert.IsFalse(fields[TestMap.MapBoolBoolFieldNumber].HasPresence);
421*1b3f573fSAndroid Build Coastguard Worker 
422*1b3f573fSAndroid Build Coastguard Worker             fields = TestProto3Optional.Descriptor.Fields;
423*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(fields[TestProto3Optional.OptionalBoolFieldNumber].HasPresence);
424*1b3f573fSAndroid Build Coastguard Worker 
425*1b3f573fSAndroid Build Coastguard Worker             // Proto2
426*1b3f573fSAndroid Build Coastguard Worker             fields = Proto2.TestAllTypes.Descriptor.Fields;
427*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(fields[Proto2.TestAllTypes.OptionalBoolFieldNumber].HasPresence);
428*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(fields[Proto2.TestAllTypes.OneofBytesFieldNumber].HasPresence);
429*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(fields[Proto2.TestAllTypes.OptionalForeignMessageFieldNumber].HasPresence);
430*1b3f573fSAndroid Build Coastguard Worker             Assert.IsFalse(fields[Proto2.TestAllTypes.RepeatedBoolFieldNumber].HasPresence);
431*1b3f573fSAndroid Build Coastguard Worker 
432*1b3f573fSAndroid Build Coastguard Worker             fields = Proto2.TestRequired.Descriptor.Fields;
433*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(fields[Proto2.TestRequired.AFieldNumber].HasPresence);
434*1b3f573fSAndroid Build Coastguard Worker         }
435*1b3f573fSAndroid Build Coastguard Worker     }
436*1b3f573fSAndroid Build Coastguard Worker }
437