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 System; 34*1b3f573fSAndroid Build Coastguard Worker using System.IO; 35*1b3f573fSAndroid Build Coastguard Worker using Google.Protobuf.TestProtos; 36*1b3f573fSAndroid Build Coastguard Worker using Proto2 = Google.Protobuf.TestProtos.Proto2; 37*1b3f573fSAndroid Build Coastguard Worker using NUnit.Framework; 38*1b3f573fSAndroid Build Coastguard Worker using System.Collections; 39*1b3f573fSAndroid Build Coastguard Worker using System.Collections.Generic; 40*1b3f573fSAndroid Build Coastguard Worker using System.Linq; 41*1b3f573fSAndroid Build Coastguard Worker using Google.Protobuf.WellKnownTypes; 42*1b3f573fSAndroid Build Coastguard Worker 43*1b3f573fSAndroid Build Coastguard Worker namespace Google.Protobuf 44*1b3f573fSAndroid Build Coastguard Worker { 45*1b3f573fSAndroid Build Coastguard Worker /// <summary> 46*1b3f573fSAndroid Build Coastguard Worker /// Tests around the generated TestAllTypes message. 47*1b3f573fSAndroid Build Coastguard Worker /// </summary> 48*1b3f573fSAndroid Build Coastguard Worker public partial class GeneratedMessageTest 49*1b3f573fSAndroid Build Coastguard Worker { 50*1b3f573fSAndroid Build Coastguard Worker [Test] EmptyMessageFieldDistinctFromMissingMessageField()51*1b3f573fSAndroid Build Coastguard Worker public void EmptyMessageFieldDistinctFromMissingMessageField() 52*1b3f573fSAndroid Build Coastguard Worker { 53*1b3f573fSAndroid Build Coastguard Worker // This demonstrates what we're really interested in... 54*1b3f573fSAndroid Build Coastguard Worker var message1 = new TestAllTypes { SingleForeignMessage = new ForeignMessage() }; 55*1b3f573fSAndroid Build Coastguard Worker var message2 = new TestAllTypes(); // SingleForeignMessage is null 56*1b3f573fSAndroid Build Coastguard Worker EqualityTester.AssertInequality(message1, message2); 57*1b3f573fSAndroid Build Coastguard Worker } 58*1b3f573fSAndroid Build Coastguard Worker 59*1b3f573fSAndroid Build Coastguard Worker [Test] DefaultValues()60*1b3f573fSAndroid Build Coastguard Worker public void DefaultValues() 61*1b3f573fSAndroid Build Coastguard Worker { 62*1b3f573fSAndroid Build Coastguard Worker // Single fields 63*1b3f573fSAndroid Build Coastguard Worker var message = new TestAllTypes(); 64*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(false, message.SingleBool); 65*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(ByteString.Empty, message.SingleBytes); 66*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0.0, message.SingleDouble); 67*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.SingleFixed32); 68*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0L, message.SingleFixed64); 69*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0.0f, message.SingleFloat); 70*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(ForeignEnum.ForeignUnspecified, message.SingleForeignEnum); 71*1b3f573fSAndroid Build Coastguard Worker Assert.IsNull(message.SingleForeignMessage); 72*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(ImportEnum.Unspecified, message.SingleImportEnum); 73*1b3f573fSAndroid Build Coastguard Worker Assert.IsNull(message.SingleImportMessage); 74*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.SingleInt32); 75*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0L, message.SingleInt64); 76*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(TestAllTypes.Types.NestedEnum.Unspecified, message.SingleNestedEnum); 77*1b3f573fSAndroid Build Coastguard Worker Assert.IsNull(message.SingleNestedMessage); 78*1b3f573fSAndroid Build Coastguard Worker Assert.IsNull(message.SinglePublicImportMessage); 79*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.SingleSfixed32); 80*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0L, message.SingleSfixed64); 81*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.SingleSint32); 82*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0L, message.SingleSint64); 83*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual("", message.SingleString); 84*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0U, message.SingleUint32); 85*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0UL, message.SingleUint64); 86*1b3f573fSAndroid Build Coastguard Worker 87*1b3f573fSAndroid Build Coastguard Worker // Repeated fields 88*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedBool.Count); 89*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedBytes.Count); 90*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedDouble.Count); 91*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedFixed32.Count); 92*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedFixed64.Count); 93*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedFloat.Count); 94*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedForeignEnum.Count); 95*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedForeignMessage.Count); 96*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedImportEnum.Count); 97*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedImportMessage.Count); 98*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedNestedEnum.Count); 99*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedNestedMessage.Count); 100*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedPublicImportMessage.Count); 101*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedSfixed32.Count); 102*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedSfixed64.Count); 103*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedSint32.Count); 104*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedSint64.Count); 105*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedString.Count); 106*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedUint32.Count); 107*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.RepeatedUint64.Count); 108*1b3f573fSAndroid Build Coastguard Worker 109*1b3f573fSAndroid Build Coastguard Worker // Oneof fields 110*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.None, message.OneofFieldCase); 111*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.OneofUint32); 112*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual("", message.OneofString); 113*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(ByteString.Empty, message.OneofBytes); 114*1b3f573fSAndroid Build Coastguard Worker Assert.IsNull(message.OneofNestedMessage); 115*1b3f573fSAndroid Build Coastguard Worker } 116*1b3f573fSAndroid Build Coastguard Worker 117*1b3f573fSAndroid Build Coastguard Worker [Test] NullStringAndBytesRejected()118*1b3f573fSAndroid Build Coastguard Worker public void NullStringAndBytesRejected() 119*1b3f573fSAndroid Build Coastguard Worker { 120*1b3f573fSAndroid Build Coastguard Worker var message = new TestAllTypes(); 121*1b3f573fSAndroid Build Coastguard Worker Assert.Throws<ArgumentNullException>(() => message.SingleString = null); 122*1b3f573fSAndroid Build Coastguard Worker Assert.Throws<ArgumentNullException>(() => message.OneofString = null); 123*1b3f573fSAndroid Build Coastguard Worker Assert.Throws<ArgumentNullException>(() => message.SingleBytes = null); 124*1b3f573fSAndroid Build Coastguard Worker Assert.Throws<ArgumentNullException>(() => message.OneofBytes = null); 125*1b3f573fSAndroid Build Coastguard Worker } 126*1b3f573fSAndroid Build Coastguard Worker 127*1b3f573fSAndroid Build Coastguard Worker [Test] RoundTrip_Empty()128*1b3f573fSAndroid Build Coastguard Worker public void RoundTrip_Empty() 129*1b3f573fSAndroid Build Coastguard Worker { 130*1b3f573fSAndroid Build Coastguard Worker var message = new TestAllTypes(); 131*1b3f573fSAndroid Build Coastguard Worker // Without setting any values, there's nothing to write. 132*1b3f573fSAndroid Build Coastguard Worker byte[] bytes = message.ToByteArray(); 133*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, bytes.Length); 134*1b3f573fSAndroid Build Coastguard Worker 135*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertWritingMessage(message); 136*1b3f573fSAndroid Build Coastguard Worker 137*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertRoundtrip(TestAllTypes.Parser, message); 138*1b3f573fSAndroid Build Coastguard Worker } 139*1b3f573fSAndroid Build Coastguard Worker 140*1b3f573fSAndroid Build Coastguard Worker [Test] RoundTrip_SingleValues()141*1b3f573fSAndroid Build Coastguard Worker public void RoundTrip_SingleValues() 142*1b3f573fSAndroid Build Coastguard Worker { 143*1b3f573fSAndroid Build Coastguard Worker var message = new TestAllTypes 144*1b3f573fSAndroid Build Coastguard Worker { 145*1b3f573fSAndroid Build Coastguard Worker SingleBool = true, 146*1b3f573fSAndroid Build Coastguard Worker SingleBytes = ByteString.CopyFrom(1, 2, 3, 4), 147*1b3f573fSAndroid Build Coastguard Worker SingleDouble = 23.5, 148*1b3f573fSAndroid Build Coastguard Worker SingleFixed32 = 23, 149*1b3f573fSAndroid Build Coastguard Worker SingleFixed64 = 1234567890123, 150*1b3f573fSAndroid Build Coastguard Worker SingleFloat = 12.25f, 151*1b3f573fSAndroid Build Coastguard Worker SingleForeignEnum = ForeignEnum.ForeignBar, 152*1b3f573fSAndroid Build Coastguard Worker SingleForeignMessage = new ForeignMessage { C = 10 }, 153*1b3f573fSAndroid Build Coastguard Worker SingleImportEnum = ImportEnum.ImportBaz, 154*1b3f573fSAndroid Build Coastguard Worker SingleImportMessage = new ImportMessage { D = 20 }, 155*1b3f573fSAndroid Build Coastguard Worker SingleInt32 = 100, 156*1b3f573fSAndroid Build Coastguard Worker SingleInt64 = 3210987654321, 157*1b3f573fSAndroid Build Coastguard Worker SingleNestedEnum = TestAllTypes.Types.NestedEnum.Foo, 158*1b3f573fSAndroid Build Coastguard Worker SingleNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 35 }, 159*1b3f573fSAndroid Build Coastguard Worker SinglePublicImportMessage = new PublicImportMessage { E = 54 }, 160*1b3f573fSAndroid Build Coastguard Worker SingleSfixed32 = -123, 161*1b3f573fSAndroid Build Coastguard Worker SingleSfixed64 = -12345678901234, 162*1b3f573fSAndroid Build Coastguard Worker SingleSint32 = -456, 163*1b3f573fSAndroid Build Coastguard Worker SingleSint64 = -12345678901235, 164*1b3f573fSAndroid Build Coastguard Worker SingleString = "test", 165*1b3f573fSAndroid Build Coastguard Worker SingleUint32 = uint.MaxValue, 166*1b3f573fSAndroid Build Coastguard Worker SingleUint64 = ulong.MaxValue 167*1b3f573fSAndroid Build Coastguard Worker }; 168*1b3f573fSAndroid Build Coastguard Worker 169*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertWritingMessage(message); 170*1b3f573fSAndroid Build Coastguard Worker 171*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertRoundtrip(TestAllTypes.Parser, message); 172*1b3f573fSAndroid Build Coastguard Worker } 173*1b3f573fSAndroid Build Coastguard Worker 174*1b3f573fSAndroid Build Coastguard Worker [Test] RoundTrip_RepeatedValues()175*1b3f573fSAndroid Build Coastguard Worker public void RoundTrip_RepeatedValues() 176*1b3f573fSAndroid Build Coastguard Worker { 177*1b3f573fSAndroid Build Coastguard Worker var message = new TestAllTypes 178*1b3f573fSAndroid Build Coastguard Worker { 179*1b3f573fSAndroid Build Coastguard Worker RepeatedBool = { true, false }, 180*1b3f573fSAndroid Build Coastguard Worker RepeatedBytes = { ByteString.CopyFrom(1, 2, 3, 4), ByteString.CopyFrom(5, 6) }, 181*1b3f573fSAndroid Build Coastguard Worker RepeatedDouble = { -12.25, 23.5 }, 182*1b3f573fSAndroid Build Coastguard Worker RepeatedFixed32 = { uint.MaxValue, 23 }, 183*1b3f573fSAndroid Build Coastguard Worker RepeatedFixed64 = { ulong.MaxValue, 1234567890123 }, 184*1b3f573fSAndroid Build Coastguard Worker RepeatedFloat = { 100f, 12.25f }, 185*1b3f573fSAndroid Build Coastguard Worker RepeatedForeignEnum = { ForeignEnum.ForeignFoo, ForeignEnum.ForeignBar }, 186*1b3f573fSAndroid Build Coastguard Worker RepeatedForeignMessage = { new ForeignMessage(), new ForeignMessage { C = 10 } }, 187*1b3f573fSAndroid Build Coastguard Worker RepeatedImportEnum = { ImportEnum.ImportBaz, ImportEnum.Unspecified }, 188*1b3f573fSAndroid Build Coastguard Worker RepeatedImportMessage = { new ImportMessage { D = 20 }, new ImportMessage { D = 25 } }, 189*1b3f573fSAndroid Build Coastguard Worker RepeatedInt32 = { 100, 200 }, 190*1b3f573fSAndroid Build Coastguard Worker RepeatedInt64 = { 3210987654321, long.MaxValue }, 191*1b3f573fSAndroid Build Coastguard Worker RepeatedNestedEnum = { TestAllTypes.Types.NestedEnum.Foo, TestAllTypes.Types.NestedEnum.Neg }, 192*1b3f573fSAndroid Build Coastguard Worker RepeatedNestedMessage = { new TestAllTypes.Types.NestedMessage { Bb = 35 }, new TestAllTypes.Types.NestedMessage { Bb = 10 } }, 193*1b3f573fSAndroid Build Coastguard Worker RepeatedPublicImportMessage = { new PublicImportMessage { E = 54 }, new PublicImportMessage { E = -1 } }, 194*1b3f573fSAndroid Build Coastguard Worker RepeatedSfixed32 = { -123, 123 }, 195*1b3f573fSAndroid Build Coastguard Worker RepeatedSfixed64 = { -12345678901234, 12345678901234 }, 196*1b3f573fSAndroid Build Coastguard Worker RepeatedSint32 = { -456, 100 }, 197*1b3f573fSAndroid Build Coastguard Worker RepeatedSint64 = { -12345678901235, 123 }, 198*1b3f573fSAndroid Build Coastguard Worker RepeatedString = { "foo", "bar" }, 199*1b3f573fSAndroid Build Coastguard Worker RepeatedUint32 = { uint.MaxValue, uint.MinValue }, 200*1b3f573fSAndroid Build Coastguard Worker RepeatedUint64 = { ulong.MaxValue, uint.MinValue } 201*1b3f573fSAndroid Build Coastguard Worker }; 202*1b3f573fSAndroid Build Coastguard Worker 203*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertWritingMessage(message); 204*1b3f573fSAndroid Build Coastguard Worker 205*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertRoundtrip(TestAllTypes.Parser, message); 206*1b3f573fSAndroid Build Coastguard Worker } 207*1b3f573fSAndroid Build Coastguard Worker 208*1b3f573fSAndroid Build Coastguard Worker // Note that not every map within map_unittest_proto3 is used. They all go through very 209*1b3f573fSAndroid Build Coastguard Worker // similar code paths. The fact that all maps are present is validation that we have codecs 210*1b3f573fSAndroid Build Coastguard Worker // for every type. 211*1b3f573fSAndroid Build Coastguard Worker [Test] RoundTrip_Maps()212*1b3f573fSAndroid Build Coastguard Worker public void RoundTrip_Maps() 213*1b3f573fSAndroid Build Coastguard Worker { 214*1b3f573fSAndroid Build Coastguard Worker var message = new TestMap 215*1b3f573fSAndroid Build Coastguard Worker { 216*1b3f573fSAndroid Build Coastguard Worker MapBoolBool = { 217*1b3f573fSAndroid Build Coastguard Worker { false, true }, 218*1b3f573fSAndroid Build Coastguard Worker { true, false } 219*1b3f573fSAndroid Build Coastguard Worker }, 220*1b3f573fSAndroid Build Coastguard Worker MapInt32Bytes = { 221*1b3f573fSAndroid Build Coastguard Worker { 5, ByteString.CopyFrom(6, 7, 8) }, 222*1b3f573fSAndroid Build Coastguard Worker { 25, ByteString.CopyFrom(1, 2, 3, 4, 5) }, 223*1b3f573fSAndroid Build Coastguard Worker { 10, ByteString.Empty } 224*1b3f573fSAndroid Build Coastguard Worker }, 225*1b3f573fSAndroid Build Coastguard Worker MapInt32ForeignMessage = { 226*1b3f573fSAndroid Build Coastguard Worker { 0, new ForeignMessage { C = 10 } }, 227*1b3f573fSAndroid Build Coastguard Worker { 5, new ForeignMessage() }, 228*1b3f573fSAndroid Build Coastguard Worker }, 229*1b3f573fSAndroid Build Coastguard Worker MapInt32Enum = { 230*1b3f573fSAndroid Build Coastguard Worker { 1, MapEnum.Bar }, 231*1b3f573fSAndroid Build Coastguard Worker { 2000, MapEnum.Foo } 232*1b3f573fSAndroid Build Coastguard Worker } 233*1b3f573fSAndroid Build Coastguard Worker }; 234*1b3f573fSAndroid Build Coastguard Worker 235*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertWritingMessage(message); 236*1b3f573fSAndroid Build Coastguard Worker 237*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertRoundtrip(TestMap.Parser, message); 238*1b3f573fSAndroid Build Coastguard Worker } 239*1b3f573fSAndroid Build Coastguard Worker 240*1b3f573fSAndroid Build Coastguard Worker [Test] MapWithEmptyEntry()241*1b3f573fSAndroid Build Coastguard Worker public void MapWithEmptyEntry() 242*1b3f573fSAndroid Build Coastguard Worker { 243*1b3f573fSAndroid Build Coastguard Worker var message = new TestMap 244*1b3f573fSAndroid Build Coastguard Worker { 245*1b3f573fSAndroid Build Coastguard Worker MapInt32Bytes = { { 0, ByteString.Empty } } 246*1b3f573fSAndroid Build Coastguard Worker }; 247*1b3f573fSAndroid Build Coastguard Worker 248*1b3f573fSAndroid Build Coastguard Worker byte[] bytes = message.ToByteArray(); 249*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(2, bytes.Length); // Tag for field entry (1 byte), length of entry (0; 1 byte) 250*1b3f573fSAndroid Build Coastguard Worker 251*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertWritingMessage(message); 252*1b3f573fSAndroid Build Coastguard Worker 253*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertReadingMessage( 254*1b3f573fSAndroid Build Coastguard Worker TestMap.Parser, 255*1b3f573fSAndroid Build Coastguard Worker bytes, 256*1b3f573fSAndroid Build Coastguard Worker parsed=> 257*1b3f573fSAndroid Build Coastguard Worker { 258*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(1, parsed.MapInt32Bytes.Count); 259*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(ByteString.Empty, parsed.MapInt32Bytes[0]); 260*1b3f573fSAndroid Build Coastguard Worker }); 261*1b3f573fSAndroid Build Coastguard Worker } 262*1b3f573fSAndroid Build Coastguard Worker 263*1b3f573fSAndroid Build Coastguard Worker [Test] MapWithOnlyValue()264*1b3f573fSAndroid Build Coastguard Worker public void MapWithOnlyValue() 265*1b3f573fSAndroid Build Coastguard Worker { 266*1b3f573fSAndroid Build Coastguard Worker // Hand-craft the stream to contain a single entry with just a value. 267*1b3f573fSAndroid Build Coastguard Worker var memoryStream = new MemoryStream(); 268*1b3f573fSAndroid Build Coastguard Worker var output = new CodedOutputStream(memoryStream); 269*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(TestMap.MapInt32ForeignMessageFieldNumber, WireFormat.WireType.LengthDelimited); 270*1b3f573fSAndroid Build Coastguard Worker var nestedMessage = new ForeignMessage { C = 20 }; 271*1b3f573fSAndroid Build Coastguard Worker // Size of the entry (tag, size written by WriteMessage, data written by WriteMessage) 272*1b3f573fSAndroid Build Coastguard Worker output.WriteLength(2 + nestedMessage.CalculateSize()); 273*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(2, WireFormat.WireType.LengthDelimited); 274*1b3f573fSAndroid Build Coastguard Worker output.WriteMessage(nestedMessage); 275*1b3f573fSAndroid Build Coastguard Worker output.Flush(); 276*1b3f573fSAndroid Build Coastguard Worker 277*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertReadingMessage( 278*1b3f573fSAndroid Build Coastguard Worker TestMap.Parser, 279*1b3f573fSAndroid Build Coastguard Worker memoryStream.ToArray(), 280*1b3f573fSAndroid Build Coastguard Worker parsed => 281*1b3f573fSAndroid Build Coastguard Worker { 282*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(nestedMessage, parsed.MapInt32ForeignMessage[0]); 283*1b3f573fSAndroid Build Coastguard Worker }); 284*1b3f573fSAndroid Build Coastguard Worker } 285*1b3f573fSAndroid Build Coastguard Worker 286*1b3f573fSAndroid Build Coastguard Worker [Test] MapWithOnlyKey_PrimitiveValue()287*1b3f573fSAndroid Build Coastguard Worker public void MapWithOnlyKey_PrimitiveValue() 288*1b3f573fSAndroid Build Coastguard Worker { 289*1b3f573fSAndroid Build Coastguard Worker // Hand-craft the stream to contain a single entry with just a key. 290*1b3f573fSAndroid Build Coastguard Worker var memoryStream = new MemoryStream(); 291*1b3f573fSAndroid Build Coastguard Worker var output = new CodedOutputStream(memoryStream); 292*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(TestMap.MapInt32DoubleFieldNumber, WireFormat.WireType.LengthDelimited); 293*1b3f573fSAndroid Build Coastguard Worker int key = 10; 294*1b3f573fSAndroid Build Coastguard Worker output.WriteLength(1 + CodedOutputStream.ComputeInt32Size(key)); 295*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(1, WireFormat.WireType.Varint); 296*1b3f573fSAndroid Build Coastguard Worker output.WriteInt32(key); 297*1b3f573fSAndroid Build Coastguard Worker output.Flush(); 298*1b3f573fSAndroid Build Coastguard Worker 299*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertReadingMessage( 300*1b3f573fSAndroid Build Coastguard Worker TestMap.Parser, 301*1b3f573fSAndroid Build Coastguard Worker memoryStream.ToArray(), 302*1b3f573fSAndroid Build Coastguard Worker parsed => 303*1b3f573fSAndroid Build Coastguard Worker { 304*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0.0, parsed.MapInt32Double[key]); 305*1b3f573fSAndroid Build Coastguard Worker }); 306*1b3f573fSAndroid Build Coastguard Worker } 307*1b3f573fSAndroid Build Coastguard Worker 308*1b3f573fSAndroid Build Coastguard Worker [Test] MapWithOnlyKey_MessageValue()309*1b3f573fSAndroid Build Coastguard Worker public void MapWithOnlyKey_MessageValue() 310*1b3f573fSAndroid Build Coastguard Worker { 311*1b3f573fSAndroid Build Coastguard Worker // Hand-craft the stream to contain a single entry with just a key. 312*1b3f573fSAndroid Build Coastguard Worker var memoryStream = new MemoryStream(); 313*1b3f573fSAndroid Build Coastguard Worker var output = new CodedOutputStream(memoryStream); 314*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(TestMap.MapInt32ForeignMessageFieldNumber, WireFormat.WireType.LengthDelimited); 315*1b3f573fSAndroid Build Coastguard Worker int key = 10; 316*1b3f573fSAndroid Build Coastguard Worker output.WriteLength(1 + CodedOutputStream.ComputeInt32Size(key)); 317*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(1, WireFormat.WireType.Varint); 318*1b3f573fSAndroid Build Coastguard Worker output.WriteInt32(key); 319*1b3f573fSAndroid Build Coastguard Worker output.Flush(); 320*1b3f573fSAndroid Build Coastguard Worker 321*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertReadingMessage( 322*1b3f573fSAndroid Build Coastguard Worker TestMap.Parser, 323*1b3f573fSAndroid Build Coastguard Worker memoryStream.ToArray(), 324*1b3f573fSAndroid Build Coastguard Worker parsed => 325*1b3f573fSAndroid Build Coastguard Worker { 326*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(new ForeignMessage(), parsed.MapInt32ForeignMessage[key]); 327*1b3f573fSAndroid Build Coastguard Worker }); 328*1b3f573fSAndroid Build Coastguard Worker } 329*1b3f573fSAndroid Build Coastguard Worker 330*1b3f573fSAndroid Build Coastguard Worker [Test] MapIgnoresExtraFieldsWithinEntryMessages()331*1b3f573fSAndroid Build Coastguard Worker public void MapIgnoresExtraFieldsWithinEntryMessages() 332*1b3f573fSAndroid Build Coastguard Worker { 333*1b3f573fSAndroid Build Coastguard Worker // Hand-craft the stream to contain a single entry with three fields 334*1b3f573fSAndroid Build Coastguard Worker var memoryStream = new MemoryStream(); 335*1b3f573fSAndroid Build Coastguard Worker var output = new CodedOutputStream(memoryStream); 336*1b3f573fSAndroid Build Coastguard Worker 337*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited); 338*1b3f573fSAndroid Build Coastguard Worker 339*1b3f573fSAndroid Build Coastguard Worker var key = 10; // Field 1 340*1b3f573fSAndroid Build Coastguard Worker var value = 20; // Field 2 341*1b3f573fSAndroid Build Coastguard Worker var extra = 30; // Field 3 342*1b3f573fSAndroid Build Coastguard Worker 343*1b3f573fSAndroid Build Coastguard Worker // Each field can be represented in a single byte, with a single byte tag. 344*1b3f573fSAndroid Build Coastguard Worker // Total message size: 6 bytes. 345*1b3f573fSAndroid Build Coastguard Worker output.WriteLength(6); 346*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(1, WireFormat.WireType.Varint); 347*1b3f573fSAndroid Build Coastguard Worker output.WriteInt32(key); 348*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(2, WireFormat.WireType.Varint); 349*1b3f573fSAndroid Build Coastguard Worker output.WriteInt32(value); 350*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(3, WireFormat.WireType.Varint); 351*1b3f573fSAndroid Build Coastguard Worker output.WriteInt32(extra); 352*1b3f573fSAndroid Build Coastguard Worker output.Flush(); 353*1b3f573fSAndroid Build Coastguard Worker 354*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertReadingMessage( 355*1b3f573fSAndroid Build Coastguard Worker TestMap.Parser, 356*1b3f573fSAndroid Build Coastguard Worker memoryStream.ToArray(), 357*1b3f573fSAndroid Build Coastguard Worker parsed => 358*1b3f573fSAndroid Build Coastguard Worker { 359*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(value, parsed.MapInt32Int32[key]); 360*1b3f573fSAndroid Build Coastguard Worker }); 361*1b3f573fSAndroid Build Coastguard Worker } 362*1b3f573fSAndroid Build Coastguard Worker 363*1b3f573fSAndroid Build Coastguard Worker [Test] MapFieldOrderIsIrrelevant()364*1b3f573fSAndroid Build Coastguard Worker public void MapFieldOrderIsIrrelevant() 365*1b3f573fSAndroid Build Coastguard Worker { 366*1b3f573fSAndroid Build Coastguard Worker var memoryStream = new MemoryStream(); 367*1b3f573fSAndroid Build Coastguard Worker var output = new CodedOutputStream(memoryStream); 368*1b3f573fSAndroid Build Coastguard Worker 369*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited); 370*1b3f573fSAndroid Build Coastguard Worker 371*1b3f573fSAndroid Build Coastguard Worker var key = 10; 372*1b3f573fSAndroid Build Coastguard Worker var value = 20; 373*1b3f573fSAndroid Build Coastguard Worker 374*1b3f573fSAndroid Build Coastguard Worker // Each field can be represented in a single byte, with a single byte tag. 375*1b3f573fSAndroid Build Coastguard Worker // Total message size: 4 bytes. 376*1b3f573fSAndroid Build Coastguard Worker output.WriteLength(4); 377*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(2, WireFormat.WireType.Varint); 378*1b3f573fSAndroid Build Coastguard Worker output.WriteInt32(value); 379*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(1, WireFormat.WireType.Varint); 380*1b3f573fSAndroid Build Coastguard Worker output.WriteInt32(key); 381*1b3f573fSAndroid Build Coastguard Worker output.Flush(); 382*1b3f573fSAndroid Build Coastguard Worker 383*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertReadingMessage( 384*1b3f573fSAndroid Build Coastguard Worker TestMap.Parser, 385*1b3f573fSAndroid Build Coastguard Worker memoryStream.ToArray(), 386*1b3f573fSAndroid Build Coastguard Worker parsed => 387*1b3f573fSAndroid Build Coastguard Worker { 388*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(value, parsed.MapInt32Int32[key]); 389*1b3f573fSAndroid Build Coastguard Worker }); 390*1b3f573fSAndroid Build Coastguard Worker } 391*1b3f573fSAndroid Build Coastguard Worker 392*1b3f573fSAndroid Build Coastguard Worker [Test] MapNonContiguousEntries()393*1b3f573fSAndroid Build Coastguard Worker public void MapNonContiguousEntries() 394*1b3f573fSAndroid Build Coastguard Worker { 395*1b3f573fSAndroid Build Coastguard Worker var memoryStream = new MemoryStream(); 396*1b3f573fSAndroid Build Coastguard Worker var output = new CodedOutputStream(memoryStream); 397*1b3f573fSAndroid Build Coastguard Worker 398*1b3f573fSAndroid Build Coastguard Worker // Message structure: 399*1b3f573fSAndroid Build Coastguard Worker // Entry for MapInt32Int32 400*1b3f573fSAndroid Build Coastguard Worker // Entry for MapStringString 401*1b3f573fSAndroid Build Coastguard Worker // Entry for MapInt32Int32 402*1b3f573fSAndroid Build Coastguard Worker 403*1b3f573fSAndroid Build Coastguard Worker // First entry 404*1b3f573fSAndroid Build Coastguard Worker var key1 = 10; 405*1b3f573fSAndroid Build Coastguard Worker var value1 = 20; 406*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited); 407*1b3f573fSAndroid Build Coastguard Worker output.WriteLength(4); 408*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(1, WireFormat.WireType.Varint); 409*1b3f573fSAndroid Build Coastguard Worker output.WriteInt32(key1); 410*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(2, WireFormat.WireType.Varint); 411*1b3f573fSAndroid Build Coastguard Worker output.WriteInt32(value1); 412*1b3f573fSAndroid Build Coastguard Worker 413*1b3f573fSAndroid Build Coastguard Worker // Second entry 414*1b3f573fSAndroid Build Coastguard Worker var key2 = "a"; 415*1b3f573fSAndroid Build Coastguard Worker var value2 = "b"; 416*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(TestMap.MapStringStringFieldNumber, WireFormat.WireType.LengthDelimited); 417*1b3f573fSAndroid Build Coastguard Worker output.WriteLength(6); // 3 bytes per entry: tag, size, character 418*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(1, WireFormat.WireType.LengthDelimited); 419*1b3f573fSAndroid Build Coastguard Worker output.WriteString(key2); 420*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(2, WireFormat.WireType.LengthDelimited); 421*1b3f573fSAndroid Build Coastguard Worker output.WriteString(value2); 422*1b3f573fSAndroid Build Coastguard Worker 423*1b3f573fSAndroid Build Coastguard Worker // Third entry 424*1b3f573fSAndroid Build Coastguard Worker var key3 = 15; 425*1b3f573fSAndroid Build Coastguard Worker var value3 = 25; 426*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited); 427*1b3f573fSAndroid Build Coastguard Worker output.WriteLength(4); 428*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(1, WireFormat.WireType.Varint); 429*1b3f573fSAndroid Build Coastguard Worker output.WriteInt32(key3); 430*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(2, WireFormat.WireType.Varint); 431*1b3f573fSAndroid Build Coastguard Worker output.WriteInt32(value3); 432*1b3f573fSAndroid Build Coastguard Worker 433*1b3f573fSAndroid Build Coastguard Worker output.Flush(); 434*1b3f573fSAndroid Build Coastguard Worker 435*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertReadingMessage( 436*1b3f573fSAndroid Build Coastguard Worker TestMap.Parser, 437*1b3f573fSAndroid Build Coastguard Worker memoryStream.ToArray(), 438*1b3f573fSAndroid Build Coastguard Worker parsed => 439*1b3f573fSAndroid Build Coastguard Worker { 440*1b3f573fSAndroid Build Coastguard Worker var expected = new TestMap 441*1b3f573fSAndroid Build Coastguard Worker { 442*1b3f573fSAndroid Build Coastguard Worker MapInt32Int32 = { { key1, value1 }, { key3, value3 } }, 443*1b3f573fSAndroid Build Coastguard Worker MapStringString = { { key2, value2 } } 444*1b3f573fSAndroid Build Coastguard Worker }; 445*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(expected, parsed); 446*1b3f573fSAndroid Build Coastguard Worker }); 447*1b3f573fSAndroid Build Coastguard Worker } 448*1b3f573fSAndroid Build Coastguard Worker 449*1b3f573fSAndroid Build Coastguard Worker [Test] DuplicateKeys_LastEntryWins()450*1b3f573fSAndroid Build Coastguard Worker public void DuplicateKeys_LastEntryWins() 451*1b3f573fSAndroid Build Coastguard Worker { 452*1b3f573fSAndroid Build Coastguard Worker var memoryStream = new MemoryStream(); 453*1b3f573fSAndroid Build Coastguard Worker var output = new CodedOutputStream(memoryStream); 454*1b3f573fSAndroid Build Coastguard Worker 455*1b3f573fSAndroid Build Coastguard Worker var key = 10; 456*1b3f573fSAndroid Build Coastguard Worker var value1 = 20; 457*1b3f573fSAndroid Build Coastguard Worker var value2 = 30; 458*1b3f573fSAndroid Build Coastguard Worker 459*1b3f573fSAndroid Build Coastguard Worker // First entry 460*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited); 461*1b3f573fSAndroid Build Coastguard Worker output.WriteLength(4); 462*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(1, WireFormat.WireType.Varint); 463*1b3f573fSAndroid Build Coastguard Worker output.WriteInt32(key); 464*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(2, WireFormat.WireType.Varint); 465*1b3f573fSAndroid Build Coastguard Worker output.WriteInt32(value1); 466*1b3f573fSAndroid Build Coastguard Worker 467*1b3f573fSAndroid Build Coastguard Worker // Second entry - same key, different value 468*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited); 469*1b3f573fSAndroid Build Coastguard Worker output.WriteLength(4); 470*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(1, WireFormat.WireType.Varint); 471*1b3f573fSAndroid Build Coastguard Worker output.WriteInt32(key); 472*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(2, WireFormat.WireType.Varint); 473*1b3f573fSAndroid Build Coastguard Worker output.WriteInt32(value2); 474*1b3f573fSAndroid Build Coastguard Worker output.Flush(); 475*1b3f573fSAndroid Build Coastguard Worker 476*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertReadingMessage( 477*1b3f573fSAndroid Build Coastguard Worker TestMap.Parser, 478*1b3f573fSAndroid Build Coastguard Worker memoryStream.ToArray(), 479*1b3f573fSAndroid Build Coastguard Worker parsed => 480*1b3f573fSAndroid Build Coastguard Worker { 481*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(value2, parsed.MapInt32Int32[key]); 482*1b3f573fSAndroid Build Coastguard Worker }); 483*1b3f573fSAndroid Build Coastguard Worker } 484*1b3f573fSAndroid Build Coastguard Worker 485*1b3f573fSAndroid Build Coastguard Worker [Test] CloneSingleNonMessageValues()486*1b3f573fSAndroid Build Coastguard Worker public void CloneSingleNonMessageValues() 487*1b3f573fSAndroid Build Coastguard Worker { 488*1b3f573fSAndroid Build Coastguard Worker var original = new TestAllTypes 489*1b3f573fSAndroid Build Coastguard Worker { 490*1b3f573fSAndroid Build Coastguard Worker SingleBool = true, 491*1b3f573fSAndroid Build Coastguard Worker SingleBytes = ByteString.CopyFrom(1, 2, 3, 4), 492*1b3f573fSAndroid Build Coastguard Worker SingleDouble = 23.5, 493*1b3f573fSAndroid Build Coastguard Worker SingleFixed32 = 23, 494*1b3f573fSAndroid Build Coastguard Worker SingleFixed64 = 1234567890123, 495*1b3f573fSAndroid Build Coastguard Worker SingleFloat = 12.25f, 496*1b3f573fSAndroid Build Coastguard Worker SingleInt32 = 100, 497*1b3f573fSAndroid Build Coastguard Worker SingleInt64 = 3210987654321, 498*1b3f573fSAndroid Build Coastguard Worker SingleNestedEnum = TestAllTypes.Types.NestedEnum.Foo, 499*1b3f573fSAndroid Build Coastguard Worker SingleSfixed32 = -123, 500*1b3f573fSAndroid Build Coastguard Worker SingleSfixed64 = -12345678901234, 501*1b3f573fSAndroid Build Coastguard Worker SingleSint32 = -456, 502*1b3f573fSAndroid Build Coastguard Worker SingleSint64 = -12345678901235, 503*1b3f573fSAndroid Build Coastguard Worker SingleString = "test", 504*1b3f573fSAndroid Build Coastguard Worker SingleUint32 = uint.MaxValue, 505*1b3f573fSAndroid Build Coastguard Worker SingleUint64 = ulong.MaxValue 506*1b3f573fSAndroid Build Coastguard Worker }; 507*1b3f573fSAndroid Build Coastguard Worker var clone = original.Clone(); 508*1b3f573fSAndroid Build Coastguard Worker Assert.AreNotSame(original, clone); 509*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(original, clone); 510*1b3f573fSAndroid Build Coastguard Worker // Just as a single example 511*1b3f573fSAndroid Build Coastguard Worker clone.SingleInt32 = 150; 512*1b3f573fSAndroid Build Coastguard Worker Assert.AreNotEqual(original, clone); 513*1b3f573fSAndroid Build Coastguard Worker } 514*1b3f573fSAndroid Build Coastguard Worker 515*1b3f573fSAndroid Build Coastguard Worker [Test] CloneRepeatedNonMessageValues()516*1b3f573fSAndroid Build Coastguard Worker public void CloneRepeatedNonMessageValues() 517*1b3f573fSAndroid Build Coastguard Worker { 518*1b3f573fSAndroid Build Coastguard Worker var original = new TestAllTypes 519*1b3f573fSAndroid Build Coastguard Worker { 520*1b3f573fSAndroid Build Coastguard Worker RepeatedBool = { true, false }, 521*1b3f573fSAndroid Build Coastguard Worker RepeatedBytes = { ByteString.CopyFrom(1, 2, 3, 4), ByteString.CopyFrom(5, 6) }, 522*1b3f573fSAndroid Build Coastguard Worker RepeatedDouble = { -12.25, 23.5 }, 523*1b3f573fSAndroid Build Coastguard Worker RepeatedFixed32 = { uint.MaxValue, 23 }, 524*1b3f573fSAndroid Build Coastguard Worker RepeatedFixed64 = { ulong.MaxValue, 1234567890123 }, 525*1b3f573fSAndroid Build Coastguard Worker RepeatedFloat = { 100f, 12.25f }, 526*1b3f573fSAndroid Build Coastguard Worker RepeatedInt32 = { 100, 200 }, 527*1b3f573fSAndroid Build Coastguard Worker RepeatedInt64 = { 3210987654321, long.MaxValue }, 528*1b3f573fSAndroid Build Coastguard Worker RepeatedNestedEnum = { TestAllTypes.Types.NestedEnum.Foo, TestAllTypes.Types.NestedEnum.Neg }, 529*1b3f573fSAndroid Build Coastguard Worker RepeatedSfixed32 = { -123, 123 }, 530*1b3f573fSAndroid Build Coastguard Worker RepeatedSfixed64 = { -12345678901234, 12345678901234 }, 531*1b3f573fSAndroid Build Coastguard Worker RepeatedSint32 = { -456, 100 }, 532*1b3f573fSAndroid Build Coastguard Worker RepeatedSint64 = { -12345678901235, 123 }, 533*1b3f573fSAndroid Build Coastguard Worker RepeatedString = { "foo", "bar" }, 534*1b3f573fSAndroid Build Coastguard Worker RepeatedUint32 = { uint.MaxValue, uint.MinValue }, 535*1b3f573fSAndroid Build Coastguard Worker RepeatedUint64 = { ulong.MaxValue, uint.MinValue } 536*1b3f573fSAndroid Build Coastguard Worker }; 537*1b3f573fSAndroid Build Coastguard Worker 538*1b3f573fSAndroid Build Coastguard Worker var clone = original.Clone(); 539*1b3f573fSAndroid Build Coastguard Worker Assert.AreNotSame(original, clone); 540*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(original, clone); 541*1b3f573fSAndroid Build Coastguard Worker // Just as a single example 542*1b3f573fSAndroid Build Coastguard Worker clone.RepeatedDouble.Add(25.5); 543*1b3f573fSAndroid Build Coastguard Worker Assert.AreNotEqual(original, clone); 544*1b3f573fSAndroid Build Coastguard Worker } 545*1b3f573fSAndroid Build Coastguard Worker 546*1b3f573fSAndroid Build Coastguard Worker [Test] CloneSingleMessageField()547*1b3f573fSAndroid Build Coastguard Worker public void CloneSingleMessageField() 548*1b3f573fSAndroid Build Coastguard Worker { 549*1b3f573fSAndroid Build Coastguard Worker var original = new TestAllTypes 550*1b3f573fSAndroid Build Coastguard Worker { 551*1b3f573fSAndroid Build Coastguard Worker SingleNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 20 } 552*1b3f573fSAndroid Build Coastguard Worker }; 553*1b3f573fSAndroid Build Coastguard Worker 554*1b3f573fSAndroid Build Coastguard Worker var clone = original.Clone(); 555*1b3f573fSAndroid Build Coastguard Worker Assert.AreNotSame(original, clone); 556*1b3f573fSAndroid Build Coastguard Worker Assert.AreNotSame(original.SingleNestedMessage, clone.SingleNestedMessage); 557*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(original, clone); 558*1b3f573fSAndroid Build Coastguard Worker 559*1b3f573fSAndroid Build Coastguard Worker clone.SingleNestedMessage.Bb = 30; 560*1b3f573fSAndroid Build Coastguard Worker Assert.AreNotEqual(original, clone); 561*1b3f573fSAndroid Build Coastguard Worker } 562*1b3f573fSAndroid Build Coastguard Worker 563*1b3f573fSAndroid Build Coastguard Worker [Test] CloneRepeatedMessageField()564*1b3f573fSAndroid Build Coastguard Worker public void CloneRepeatedMessageField() 565*1b3f573fSAndroid Build Coastguard Worker { 566*1b3f573fSAndroid Build Coastguard Worker var original = new TestAllTypes 567*1b3f573fSAndroid Build Coastguard Worker { 568*1b3f573fSAndroid Build Coastguard Worker RepeatedNestedMessage = { new TestAllTypes.Types.NestedMessage { Bb = 20 } } 569*1b3f573fSAndroid Build Coastguard Worker }; 570*1b3f573fSAndroid Build Coastguard Worker 571*1b3f573fSAndroid Build Coastguard Worker var clone = original.Clone(); 572*1b3f573fSAndroid Build Coastguard Worker Assert.AreNotSame(original, clone); 573*1b3f573fSAndroid Build Coastguard Worker Assert.AreNotSame(original.RepeatedNestedMessage, clone.RepeatedNestedMessage); 574*1b3f573fSAndroid Build Coastguard Worker Assert.AreNotSame(original.RepeatedNestedMessage[0], clone.RepeatedNestedMessage[0]); 575*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(original, clone); 576*1b3f573fSAndroid Build Coastguard Worker 577*1b3f573fSAndroid Build Coastguard Worker clone.RepeatedNestedMessage[0].Bb = 30; 578*1b3f573fSAndroid Build Coastguard Worker Assert.AreNotEqual(original, clone); 579*1b3f573fSAndroid Build Coastguard Worker } 580*1b3f573fSAndroid Build Coastguard Worker 581*1b3f573fSAndroid Build Coastguard Worker [Test] CloneOneofField()582*1b3f573fSAndroid Build Coastguard Worker public void CloneOneofField() 583*1b3f573fSAndroid Build Coastguard Worker { 584*1b3f573fSAndroid Build Coastguard Worker var original = new TestAllTypes 585*1b3f573fSAndroid Build Coastguard Worker { 586*1b3f573fSAndroid Build Coastguard Worker OneofNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 20 } 587*1b3f573fSAndroid Build Coastguard Worker }; 588*1b3f573fSAndroid Build Coastguard Worker 589*1b3f573fSAndroid Build Coastguard Worker var clone = original.Clone(); 590*1b3f573fSAndroid Build Coastguard Worker Assert.AreNotSame(original, clone); 591*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(original, clone); 592*1b3f573fSAndroid Build Coastguard Worker 593*1b3f573fSAndroid Build Coastguard Worker // We should have cloned the message 594*1b3f573fSAndroid Build Coastguard Worker original.OneofNestedMessage.Bb = 30; 595*1b3f573fSAndroid Build Coastguard Worker Assert.AreNotEqual(original, clone); 596*1b3f573fSAndroid Build Coastguard Worker } 597*1b3f573fSAndroid Build Coastguard Worker 598*1b3f573fSAndroid Build Coastguard Worker [Test] OneofProperties()599*1b3f573fSAndroid Build Coastguard Worker public void OneofProperties() 600*1b3f573fSAndroid Build Coastguard Worker { 601*1b3f573fSAndroid Build Coastguard Worker // Switch the oneof case between each of the different options, and check everything behaves 602*1b3f573fSAndroid Build Coastguard Worker // as expected in each case. 603*1b3f573fSAndroid Build Coastguard Worker var message = new TestAllTypes(); 604*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual("", message.OneofString); 605*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.OneofUint32); 606*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(ByteString.Empty, message.OneofBytes); 607*1b3f573fSAndroid Build Coastguard Worker Assert.IsNull(message.OneofNestedMessage); 608*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.None, message.OneofFieldCase); 609*1b3f573fSAndroid Build Coastguard Worker 610*1b3f573fSAndroid Build Coastguard Worker message.OneofString = "sample"; 611*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual("sample", message.OneofString); 612*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.OneofUint32); 613*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(ByteString.Empty, message.OneofBytes); 614*1b3f573fSAndroid Build Coastguard Worker Assert.IsNull(message.OneofNestedMessage); 615*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofString, message.OneofFieldCase); 616*1b3f573fSAndroid Build Coastguard Worker 617*1b3f573fSAndroid Build Coastguard Worker var bytes = ByteString.CopyFrom(1, 2, 3); 618*1b3f573fSAndroid Build Coastguard Worker message.OneofBytes = bytes; 619*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual("", message.OneofString); 620*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.OneofUint32); 621*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(bytes, message.OneofBytes); 622*1b3f573fSAndroid Build Coastguard Worker Assert.IsNull(message.OneofNestedMessage); 623*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofBytes, message.OneofFieldCase); 624*1b3f573fSAndroid Build Coastguard Worker 625*1b3f573fSAndroid Build Coastguard Worker message.OneofUint32 = 20; 626*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual("", message.OneofString); 627*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(20, message.OneofUint32); 628*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(ByteString.Empty, message.OneofBytes); 629*1b3f573fSAndroid Build Coastguard Worker Assert.IsNull(message.OneofNestedMessage); 630*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofUint32, message.OneofFieldCase); 631*1b3f573fSAndroid Build Coastguard Worker 632*1b3f573fSAndroid Build Coastguard Worker var nestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 25 }; 633*1b3f573fSAndroid Build Coastguard Worker message.OneofNestedMessage = nestedMessage; 634*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual("", message.OneofString); 635*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.OneofUint32); 636*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(ByteString.Empty, message.OneofBytes); 637*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(nestedMessage, message.OneofNestedMessage); 638*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofNestedMessage, message.OneofFieldCase); 639*1b3f573fSAndroid Build Coastguard Worker 640*1b3f573fSAndroid Build Coastguard Worker message.ClearOneofField(); 641*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual("", message.OneofString); 642*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(0, message.OneofUint32); 643*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(ByteString.Empty, message.OneofBytes); 644*1b3f573fSAndroid Build Coastguard Worker Assert.IsNull(message.OneofNestedMessage); 645*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.None, message.OneofFieldCase); 646*1b3f573fSAndroid Build Coastguard Worker } 647*1b3f573fSAndroid Build Coastguard Worker 648*1b3f573fSAndroid Build Coastguard Worker [Test] Oneof_DefaultValuesNotEqual()649*1b3f573fSAndroid Build Coastguard Worker public void Oneof_DefaultValuesNotEqual() 650*1b3f573fSAndroid Build Coastguard Worker { 651*1b3f573fSAndroid Build Coastguard Worker var message1 = new TestAllTypes { OneofString = "" }; 652*1b3f573fSAndroid Build Coastguard Worker var message2 = new TestAllTypes { OneofUint32 = 0 }; 653*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofString, message1.OneofFieldCase); 654*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofUint32, message2.OneofFieldCase); 655*1b3f573fSAndroid Build Coastguard Worker Assert.AreNotEqual(message1, message2); 656*1b3f573fSAndroid Build Coastguard Worker } 657*1b3f573fSAndroid Build Coastguard Worker 658*1b3f573fSAndroid Build Coastguard Worker [Test] OneofSerialization_NonDefaultValue()659*1b3f573fSAndroid Build Coastguard Worker public void OneofSerialization_NonDefaultValue() 660*1b3f573fSAndroid Build Coastguard Worker { 661*1b3f573fSAndroid Build Coastguard Worker var message = new TestAllTypes(); 662*1b3f573fSAndroid Build Coastguard Worker message.OneofString = "this would take a bit of space"; 663*1b3f573fSAndroid Build Coastguard Worker message.OneofUint32 = 10; 664*1b3f573fSAndroid Build Coastguard Worker var bytes = message.ToByteArray(); 665*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(3, bytes.Length); // 2 bytes for the tag + 1 for the value - no string! 666*1b3f573fSAndroid Build Coastguard Worker 667*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertWritingMessage(message); 668*1b3f573fSAndroid Build Coastguard Worker 669*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertRoundtrip(TestAllTypes.Parser, message, parsedMessage => 670*1b3f573fSAndroid Build Coastguard Worker { 671*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofUint32, parsedMessage.OneofFieldCase); 672*1b3f573fSAndroid Build Coastguard Worker }); 673*1b3f573fSAndroid Build Coastguard Worker } 674*1b3f573fSAndroid Build Coastguard Worker 675*1b3f573fSAndroid Build Coastguard Worker [Test] OneofSerialization_DefaultValue()676*1b3f573fSAndroid Build Coastguard Worker public void OneofSerialization_DefaultValue() 677*1b3f573fSAndroid Build Coastguard Worker { 678*1b3f573fSAndroid Build Coastguard Worker var message = new TestAllTypes(); 679*1b3f573fSAndroid Build Coastguard Worker message.OneofString = "this would take a bit of space"; 680*1b3f573fSAndroid Build Coastguard Worker message.OneofUint32 = 0; // This is the default value for UInt32; normally wouldn't be serialized 681*1b3f573fSAndroid Build Coastguard Worker var bytes = message.ToByteArray(); 682*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(3, bytes.Length); // 2 bytes for the tag + 1 for the value - it's still serialized 683*1b3f573fSAndroid Build Coastguard Worker 684*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertWritingMessage(message); 685*1b3f573fSAndroid Build Coastguard Worker 686*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertRoundtrip(TestAllTypes.Parser, message, parsedMessage => 687*1b3f573fSAndroid Build Coastguard Worker { 688*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofUint32, parsedMessage.OneofFieldCase); 689*1b3f573fSAndroid Build Coastguard Worker }); 690*1b3f573fSAndroid Build Coastguard Worker } 691*1b3f573fSAndroid Build Coastguard Worker 692*1b3f573fSAndroid Build Coastguard Worker [Test] DiscardUnknownFields_RealDataStillRead()693*1b3f573fSAndroid Build Coastguard Worker public void DiscardUnknownFields_RealDataStillRead() 694*1b3f573fSAndroid Build Coastguard Worker { 695*1b3f573fSAndroid Build Coastguard Worker var message = SampleMessages.CreateFullTestAllTypes(); 696*1b3f573fSAndroid Build Coastguard Worker var stream = new MemoryStream(); 697*1b3f573fSAndroid Build Coastguard Worker var output = new CodedOutputStream(stream); 698*1b3f573fSAndroid Build Coastguard Worker var unusedFieldNumber = 23456; 699*1b3f573fSAndroid Build Coastguard Worker Assert.IsFalse(TestAllTypes.Descriptor.Fields.InDeclarationOrder().Select(x => x.FieldNumber).Contains(unusedFieldNumber)); 700*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(unusedFieldNumber, WireFormat.WireType.LengthDelimited); 701*1b3f573fSAndroid Build Coastguard Worker output.WriteString("ignore me"); 702*1b3f573fSAndroid Build Coastguard Worker message.WriteTo(output); 703*1b3f573fSAndroid Build Coastguard Worker output.Flush(); 704*1b3f573fSAndroid Build Coastguard Worker 705*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertReadingMessage( 706*1b3f573fSAndroid Build Coastguard Worker TestAllTypes.Parser, 707*1b3f573fSAndroid Build Coastguard Worker stream.ToArray(), 708*1b3f573fSAndroid Build Coastguard Worker parsed => 709*1b3f573fSAndroid Build Coastguard Worker { 710*1b3f573fSAndroid Build Coastguard Worker // TODO(jieluo): Add test back when DiscardUnknownFields API is supported. 711*1b3f573fSAndroid Build Coastguard Worker // Assert.AreEqual(message, parsed); 712*1b3f573fSAndroid Build Coastguard Worker }); 713*1b3f573fSAndroid Build Coastguard Worker } 714*1b3f573fSAndroid Build Coastguard Worker 715*1b3f573fSAndroid Build Coastguard Worker [Test] DiscardUnknownFields_AllTypes()716*1b3f573fSAndroid Build Coastguard Worker public void DiscardUnknownFields_AllTypes() 717*1b3f573fSAndroid Build Coastguard Worker { 718*1b3f573fSAndroid Build Coastguard Worker // Simple way of ensuring we can skip all kinds of fields. 719*1b3f573fSAndroid Build Coastguard Worker var data = SampleMessages.CreateFullTestAllTypes().ToByteArray(); 720*1b3f573fSAndroid Build Coastguard Worker var empty = Empty.Parser.ParseFrom(data); 721*1b3f573fSAndroid Build Coastguard Worker 722*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertReadingMessage( 723*1b3f573fSAndroid Build Coastguard Worker Empty.Parser, 724*1b3f573fSAndroid Build Coastguard Worker data, 725*1b3f573fSAndroid Build Coastguard Worker parsed => 726*1b3f573fSAndroid Build Coastguard Worker { 727*1b3f573fSAndroid Build Coastguard Worker // TODO(jieluo): Add test back when DiscardUnknownFields API is supported. 728*1b3f573fSAndroid Build Coastguard Worker // Assert.AreNotEqual(new Empty(), empty); 729*1b3f573fSAndroid Build Coastguard Worker }); 730*1b3f573fSAndroid Build Coastguard Worker } 731*1b3f573fSAndroid Build Coastguard Worker 732*1b3f573fSAndroid Build Coastguard Worker // This was originally seen as a conformance test failure. 733*1b3f573fSAndroid Build Coastguard Worker [Test] TruncatedMessageFieldThrows()734*1b3f573fSAndroid Build Coastguard Worker public void TruncatedMessageFieldThrows() 735*1b3f573fSAndroid Build Coastguard Worker { 736*1b3f573fSAndroid Build Coastguard Worker // 130, 3 is the message tag 737*1b3f573fSAndroid Build Coastguard Worker // 1 is the data length - but there's no data. 738*1b3f573fSAndroid Build Coastguard Worker var data = new byte[] { 130, 3, 1 }; 739*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertReadingMessageThrows<TestAllTypes, InvalidProtocolBufferException>(TestAllTypes.Parser, data); 740*1b3f573fSAndroid Build Coastguard Worker } 741*1b3f573fSAndroid Build Coastguard Worker 742*1b3f573fSAndroid Build Coastguard Worker /// <summary> 743*1b3f573fSAndroid Build Coastguard Worker /// Demonstrates current behaviour with an extraneous end group tag - see issue 688 744*1b3f573fSAndroid Build Coastguard Worker /// for details; we may want to change this. 745*1b3f573fSAndroid Build Coastguard Worker /// </summary> 746*1b3f573fSAndroid Build Coastguard Worker [Test] ExtraEndGroupThrows()747*1b3f573fSAndroid Build Coastguard Worker public void ExtraEndGroupThrows() 748*1b3f573fSAndroid Build Coastguard Worker { 749*1b3f573fSAndroid Build Coastguard Worker var message = SampleMessages.CreateFullTestAllTypes(); 750*1b3f573fSAndroid Build Coastguard Worker var stream = new MemoryStream(); 751*1b3f573fSAndroid Build Coastguard Worker var output = new CodedOutputStream(stream); 752*1b3f573fSAndroid Build Coastguard Worker 753*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(TestAllTypes.SingleFixed32FieldNumber, WireFormat.WireType.Fixed32); 754*1b3f573fSAndroid Build Coastguard Worker output.WriteFixed32(123); 755*1b3f573fSAndroid Build Coastguard Worker output.WriteTag(100, WireFormat.WireType.EndGroup); 756*1b3f573fSAndroid Build Coastguard Worker 757*1b3f573fSAndroid Build Coastguard Worker output.Flush(); 758*1b3f573fSAndroid Build Coastguard Worker 759*1b3f573fSAndroid Build Coastguard Worker stream.Position = 0; 760*1b3f573fSAndroid Build Coastguard Worker MessageParsingHelpers.AssertReadingMessageThrows<TestAllTypes, InvalidProtocolBufferException>(TestAllTypes.Parser, stream.ToArray()); 761*1b3f573fSAndroid Build Coastguard Worker } 762*1b3f573fSAndroid Build Coastguard Worker 763*1b3f573fSAndroid Build Coastguard Worker [Test] CustomDiagnosticMessage_DirectToStringCall()764*1b3f573fSAndroid Build Coastguard Worker public void CustomDiagnosticMessage_DirectToStringCall() 765*1b3f573fSAndroid Build Coastguard Worker { 766*1b3f573fSAndroid Build Coastguard Worker var message = new ForeignMessage { C = 31 }; 767*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual("{ \"c\": 31, \"@cInHex\": \"1f\" }", message.ToString()); 768*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual("{ \"c\": 31 }", JsonFormatter.Default.Format(message)); 769*1b3f573fSAndroid Build Coastguard Worker } 770*1b3f573fSAndroid Build Coastguard Worker 771*1b3f573fSAndroid Build Coastguard Worker [Test] CustomDiagnosticMessage_Nested()772*1b3f573fSAndroid Build Coastguard Worker public void CustomDiagnosticMessage_Nested() 773*1b3f573fSAndroid Build Coastguard Worker { 774*1b3f573fSAndroid Build Coastguard Worker var message = new TestAllTypes { SingleForeignMessage = new ForeignMessage { C = 16 } }; 775*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual("{ \"singleForeignMessage\": { \"c\": 16, \"@cInHex\": \"10\" } }", message.ToString()); 776*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual("{ \"singleForeignMessage\": { \"c\": 16 } }", JsonFormatter.Default.Format(message)); 777*1b3f573fSAndroid Build Coastguard Worker } 778*1b3f573fSAndroid Build Coastguard Worker 779*1b3f573fSAndroid Build Coastguard Worker [Test] CustomDiagnosticMessage_DirectToTextWriterCall()780*1b3f573fSAndroid Build Coastguard Worker public void CustomDiagnosticMessage_DirectToTextWriterCall() 781*1b3f573fSAndroid Build Coastguard Worker { 782*1b3f573fSAndroid Build Coastguard Worker var message = new ForeignMessage { C = 31 }; 783*1b3f573fSAndroid Build Coastguard Worker var writer = new StringWriter(); 784*1b3f573fSAndroid Build Coastguard Worker JsonFormatter.Default.Format(message, writer); 785*1b3f573fSAndroid Build Coastguard Worker Assert.AreEqual("{ \"c\": 31 }", writer.ToString()); 786*1b3f573fSAndroid Build Coastguard Worker } 787*1b3f573fSAndroid Build Coastguard Worker 788*1b3f573fSAndroid Build Coastguard Worker [Test] NaNComparisons()789*1b3f573fSAndroid Build Coastguard Worker public void NaNComparisons() 790*1b3f573fSAndroid Build Coastguard Worker { 791*1b3f573fSAndroid Build Coastguard Worker var message1 = new TestAllTypes { SingleDouble = SampleNaNs.Regular }; 792*1b3f573fSAndroid Build Coastguard Worker var message2 = new TestAllTypes { SingleDouble = SampleNaNs.PayloadFlipped }; 793*1b3f573fSAndroid Build Coastguard Worker var message3 = new TestAllTypes { SingleDouble = SampleNaNs.Regular }; 794*1b3f573fSAndroid Build Coastguard Worker 795*1b3f573fSAndroid Build Coastguard Worker EqualityTester.AssertInequality(message1, message2); 796*1b3f573fSAndroid Build Coastguard Worker EqualityTester.AssertEquality(message1, message3); 797*1b3f573fSAndroid Build Coastguard Worker } 798*1b3f573fSAndroid Build Coastguard Worker } 799*1b3f573fSAndroid Build Coastguard Worker }