xref: /aosp_15_r20/external/protobuf/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Worker #region Copyright notice and license
2*1b3f573fSAndroid Build Coastguard Worker // Protocol Buffers - Google's data interchange format
3*1b3f573fSAndroid Build Coastguard Worker // Copyright 2015 Google Inc.  All rights reserved.
4*1b3f573fSAndroid Build Coastguard Worker // https://developers.google.com/protocol-buffers/
5*1b3f573fSAndroid Build Coastguard Worker //
6*1b3f573fSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
7*1b3f573fSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
8*1b3f573fSAndroid Build Coastguard Worker // met:
9*1b3f573fSAndroid Build Coastguard Worker //
10*1b3f573fSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
11*1b3f573fSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
12*1b3f573fSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
13*1b3f573fSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
14*1b3f573fSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
15*1b3f573fSAndroid Build Coastguard Worker // distribution.
16*1b3f573fSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
17*1b3f573fSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
18*1b3f573fSAndroid Build Coastguard Worker // this software without specific prior written permission.
19*1b3f573fSAndroid Build Coastguard Worker //
20*1b3f573fSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21*1b3f573fSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23*1b3f573fSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24*1b3f573fSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25*1b3f573fSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27*1b3f573fSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28*1b3f573fSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29*1b3f573fSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30*1b3f573fSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*1b3f573fSAndroid Build Coastguard Worker #endregion
32*1b3f573fSAndroid Build Coastguard Worker 
33*1b3f573fSAndroid Build Coastguard Worker using 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 }