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