xref: /aosp_15_r20/external/protobuf/csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.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 2008 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 Google.Protobuf.Buffers;
37*1b3f573fSAndroid Build Coastguard Worker using NUnit.Framework;
38*1b3f573fSAndroid Build Coastguard Worker using System.Text;
39*1b3f573fSAndroid Build Coastguard Worker 
40*1b3f573fSAndroid Build Coastguard Worker namespace Google.Protobuf
41*1b3f573fSAndroid Build Coastguard Worker {
42*1b3f573fSAndroid Build Coastguard Worker     public class CodedOutputStreamTest
43*1b3f573fSAndroid Build Coastguard Worker     {
44*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
45*1b3f573fSAndroid Build Coastguard Worker         /// Writes the given value using WriteRawVarint32() and WriteRawVarint64() and
46*1b3f573fSAndroid Build Coastguard Worker         /// checks that the result matches the given bytes
47*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
AssertWriteVarint(byte[] data, ulong value)48*1b3f573fSAndroid Build Coastguard Worker         private static void AssertWriteVarint(byte[] data, ulong value)
49*1b3f573fSAndroid Build Coastguard Worker         {
50*1b3f573fSAndroid Build Coastguard Worker             // Only do 32-bit write if the value fits in 32 bits.
51*1b3f573fSAndroid Build Coastguard Worker             if ((value >> 32) == 0)
52*1b3f573fSAndroid Build Coastguard Worker             {
53*1b3f573fSAndroid Build Coastguard Worker                 // CodedOutputStream
54*1b3f573fSAndroid Build Coastguard Worker                 MemoryStream rawOutput = new MemoryStream();
55*1b3f573fSAndroid Build Coastguard Worker                 CodedOutputStream output = new CodedOutputStream(rawOutput);
56*1b3f573fSAndroid Build Coastguard Worker                 output.WriteRawVarint32((uint) value);
57*1b3f573fSAndroid Build Coastguard Worker                 output.Flush();
58*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(data, rawOutput.ToArray());
59*1b3f573fSAndroid Build Coastguard Worker 
60*1b3f573fSAndroid Build Coastguard Worker                 // IBufferWriter
61*1b3f573fSAndroid Build Coastguard Worker                 var bufferWriter = new TestArrayBufferWriter<byte>();
62*1b3f573fSAndroid Build Coastguard Worker                 WriteContext.Initialize(bufferWriter, out WriteContext ctx);
63*1b3f573fSAndroid Build Coastguard Worker                 ctx.WriteUInt32((uint) value);
64*1b3f573fSAndroid Build Coastguard Worker                 ctx.Flush();
65*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(data, bufferWriter.WrittenSpan.ToArray());
66*1b3f573fSAndroid Build Coastguard Worker 
67*1b3f573fSAndroid Build Coastguard Worker                 // Also try computing size.
68*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(data.Length, CodedOutputStream.ComputeRawVarint32Size((uint) value));
69*1b3f573fSAndroid Build Coastguard Worker             }
70*1b3f573fSAndroid Build Coastguard Worker 
71*1b3f573fSAndroid Build Coastguard Worker             {
72*1b3f573fSAndroid Build Coastguard Worker                 // CodedOutputStream
73*1b3f573fSAndroid Build Coastguard Worker                 MemoryStream rawOutput = new MemoryStream();
74*1b3f573fSAndroid Build Coastguard Worker                 CodedOutputStream output = new CodedOutputStream(rawOutput);
75*1b3f573fSAndroid Build Coastguard Worker                 output.WriteRawVarint64(value);
76*1b3f573fSAndroid Build Coastguard Worker                 output.Flush();
77*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(data, rawOutput.ToArray());
78*1b3f573fSAndroid Build Coastguard Worker 
79*1b3f573fSAndroid Build Coastguard Worker                 // IBufferWriter
80*1b3f573fSAndroid Build Coastguard Worker                 var bufferWriter = new TestArrayBufferWriter<byte>();
81*1b3f573fSAndroid Build Coastguard Worker                 WriteContext.Initialize(bufferWriter, out WriteContext ctx);
82*1b3f573fSAndroid Build Coastguard Worker                 ctx.WriteUInt64(value);
83*1b3f573fSAndroid Build Coastguard Worker                 ctx.Flush();
84*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(data, bufferWriter.WrittenSpan.ToArray());
85*1b3f573fSAndroid Build Coastguard Worker 
86*1b3f573fSAndroid Build Coastguard Worker                 // Also try computing size.
87*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(data.Length, CodedOutputStream.ComputeRawVarint64Size(value));
88*1b3f573fSAndroid Build Coastguard Worker             }
89*1b3f573fSAndroid Build Coastguard Worker 
90*1b3f573fSAndroid Build Coastguard Worker             // Try different buffer sizes.
91*1b3f573fSAndroid Build Coastguard Worker             for (int bufferSize = 1; bufferSize <= 16; bufferSize *= 2)
92*1b3f573fSAndroid Build Coastguard Worker             {
93*1b3f573fSAndroid Build Coastguard Worker                 // Only do 32-bit write if the value fits in 32 bits.
94*1b3f573fSAndroid Build Coastguard Worker                 if ((value >> 32) == 0)
95*1b3f573fSAndroid Build Coastguard Worker                 {
96*1b3f573fSAndroid Build Coastguard Worker                     MemoryStream rawOutput = new MemoryStream();
97*1b3f573fSAndroid Build Coastguard Worker                     CodedOutputStream output =
98*1b3f573fSAndroid Build Coastguard Worker                         new CodedOutputStream(rawOutput, bufferSize);
99*1b3f573fSAndroid Build Coastguard Worker                     output.WriteRawVarint32((uint) value);
100*1b3f573fSAndroid Build Coastguard Worker                     output.Flush();
101*1b3f573fSAndroid Build Coastguard Worker                     Assert.AreEqual(data, rawOutput.ToArray());
102*1b3f573fSAndroid Build Coastguard Worker 
103*1b3f573fSAndroid Build Coastguard Worker                     var bufferWriter = new TestArrayBufferWriter<byte>();
104*1b3f573fSAndroid Build Coastguard Worker                     bufferWriter.MaxGrowBy = bufferSize;
105*1b3f573fSAndroid Build Coastguard Worker                     WriteContext.Initialize(bufferWriter, out WriteContext ctx);
106*1b3f573fSAndroid Build Coastguard Worker                     ctx.WriteUInt32((uint) value);
107*1b3f573fSAndroid Build Coastguard Worker                     ctx.Flush();
108*1b3f573fSAndroid Build Coastguard Worker                     Assert.AreEqual(data, bufferWriter.WrittenSpan.ToArray());
109*1b3f573fSAndroid Build Coastguard Worker                 }
110*1b3f573fSAndroid Build Coastguard Worker 
111*1b3f573fSAndroid Build Coastguard Worker                 {
112*1b3f573fSAndroid Build Coastguard Worker                     MemoryStream rawOutput = new MemoryStream();
113*1b3f573fSAndroid Build Coastguard Worker                     CodedOutputStream output = new CodedOutputStream(rawOutput, bufferSize);
114*1b3f573fSAndroid Build Coastguard Worker                     output.WriteRawVarint64(value);
115*1b3f573fSAndroid Build Coastguard Worker                     output.Flush();
116*1b3f573fSAndroid Build Coastguard Worker                     Assert.AreEqual(data, rawOutput.ToArray());
117*1b3f573fSAndroid Build Coastguard Worker 
118*1b3f573fSAndroid Build Coastguard Worker                     var bufferWriter = new TestArrayBufferWriter<byte>();
119*1b3f573fSAndroid Build Coastguard Worker                     bufferWriter.MaxGrowBy = bufferSize;
120*1b3f573fSAndroid Build Coastguard Worker                     WriteContext.Initialize(bufferWriter, out WriteContext ctx);
121*1b3f573fSAndroid Build Coastguard Worker                     ctx.WriteUInt64(value);
122*1b3f573fSAndroid Build Coastguard Worker                     ctx.Flush();
123*1b3f573fSAndroid Build Coastguard Worker                     Assert.AreEqual(data, bufferWriter.WrittenSpan.ToArray());
124*1b3f573fSAndroid Build Coastguard Worker                 }
125*1b3f573fSAndroid Build Coastguard Worker 
126*1b3f573fSAndroid Build Coastguard Worker             }
127*1b3f573fSAndroid Build Coastguard Worker         }
128*1b3f573fSAndroid Build Coastguard Worker 
129*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
130*1b3f573fSAndroid Build Coastguard Worker         /// Tests WriteRawVarint32() and WriteRawVarint64()
131*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
132*1b3f573fSAndroid Build Coastguard Worker         [Test]
WriteVarint()133*1b3f573fSAndroid Build Coastguard Worker         public void WriteVarint()
134*1b3f573fSAndroid Build Coastguard Worker         {
135*1b3f573fSAndroid Build Coastguard Worker             AssertWriteVarint(new byte[] {0x00}, 0);
136*1b3f573fSAndroid Build Coastguard Worker             AssertWriteVarint(new byte[] {0x01}, 1);
137*1b3f573fSAndroid Build Coastguard Worker             AssertWriteVarint(new byte[] {0x7f}, 127);
138*1b3f573fSAndroid Build Coastguard Worker             // 14882
139*1b3f573fSAndroid Build Coastguard Worker             AssertWriteVarint(new byte[] {0xa2, 0x74}, (0x22 << 0) | (0x74 << 7));
140*1b3f573fSAndroid Build Coastguard Worker             // 2961488830
141*1b3f573fSAndroid Build Coastguard Worker             AssertWriteVarint(new byte[] {0xbe, 0xf7, 0x92, 0x84, 0x0b},
142*1b3f573fSAndroid Build Coastguard Worker                               (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
143*1b3f573fSAndroid Build Coastguard Worker                               (0x0bL << 28));
144*1b3f573fSAndroid Build Coastguard Worker 
145*1b3f573fSAndroid Build Coastguard Worker             // 64-bit
146*1b3f573fSAndroid Build Coastguard Worker             // 7256456126
147*1b3f573fSAndroid Build Coastguard Worker             AssertWriteVarint(new byte[] {0xbe, 0xf7, 0x92, 0x84, 0x1b},
148*1b3f573fSAndroid Build Coastguard Worker                               (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
149*1b3f573fSAndroid Build Coastguard Worker                               (0x1bL << 28));
150*1b3f573fSAndroid Build Coastguard Worker             // 41256202580718336
151*1b3f573fSAndroid Build Coastguard Worker             AssertWriteVarint(
152*1b3f573fSAndroid Build Coastguard Worker                 new byte[] {0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49},
153*1b3f573fSAndroid Build Coastguard Worker                 (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) |
154*1b3f573fSAndroid Build Coastguard Worker                 (0x43UL << 28) | (0x49L << 35) | (0x24UL << 42) | (0x49UL << 49));
155*1b3f573fSAndroid Build Coastguard Worker             // 11964378330978735131
156*1b3f573fSAndroid Build Coastguard Worker             AssertWriteVarint(
157*1b3f573fSAndroid Build Coastguard Worker                 new byte[] {0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01},
158*1b3f573fSAndroid Build Coastguard Worker                 unchecked((ulong)
159*1b3f573fSAndroid Build Coastguard Worker                           ((0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) |
160*1b3f573fSAndroid Build Coastguard Worker                            (0x3bL << 28) | (0x56L << 35) | (0x00L << 42) |
161*1b3f573fSAndroid Build Coastguard Worker                            (0x05L << 49) | (0x26L << 56) | (0x01L << 63))));
162*1b3f573fSAndroid Build Coastguard Worker         }
163*1b3f573fSAndroid Build Coastguard Worker 
164*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
165*1b3f573fSAndroid Build Coastguard Worker         /// Parses the given bytes using WriteRawLittleEndian32() and checks
166*1b3f573fSAndroid Build Coastguard Worker         /// that the result matches the given value.
167*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
AssertWriteLittleEndian32(byte[] data, uint value)168*1b3f573fSAndroid Build Coastguard Worker         private static void AssertWriteLittleEndian32(byte[] data, uint value)
169*1b3f573fSAndroid Build Coastguard Worker         {
170*1b3f573fSAndroid Build Coastguard Worker             {
171*1b3f573fSAndroid Build Coastguard Worker                 var rawOutput = new MemoryStream();
172*1b3f573fSAndroid Build Coastguard Worker                 var output = new CodedOutputStream(rawOutput);
173*1b3f573fSAndroid Build Coastguard Worker                 output.WriteRawLittleEndian32(value);
174*1b3f573fSAndroid Build Coastguard Worker                 output.Flush();
175*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(data, rawOutput.ToArray());
176*1b3f573fSAndroid Build Coastguard Worker 
177*1b3f573fSAndroid Build Coastguard Worker                 var bufferWriter = new TestArrayBufferWriter<byte>();
178*1b3f573fSAndroid Build Coastguard Worker                 WriteContext.Initialize(bufferWriter, out WriteContext ctx);
179*1b3f573fSAndroid Build Coastguard Worker                 ctx.WriteFixed32(value);
180*1b3f573fSAndroid Build Coastguard Worker                 ctx.Flush();
181*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(data, bufferWriter.WrittenSpan.ToArray());
182*1b3f573fSAndroid Build Coastguard Worker             }
183*1b3f573fSAndroid Build Coastguard Worker 
184*1b3f573fSAndroid Build Coastguard Worker             // Try different buffer sizes.
185*1b3f573fSAndroid Build Coastguard Worker             for (int bufferSize = 1; bufferSize <= 16; bufferSize *= 2)
186*1b3f573fSAndroid Build Coastguard Worker             {
187*1b3f573fSAndroid Build Coastguard Worker                 var rawOutput = new MemoryStream();
188*1b3f573fSAndroid Build Coastguard Worker                 var output = new CodedOutputStream(rawOutput, bufferSize);
189*1b3f573fSAndroid Build Coastguard Worker                 output.WriteRawLittleEndian32(value);
190*1b3f573fSAndroid Build Coastguard Worker                 output.Flush();
191*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(data, rawOutput.ToArray());
192*1b3f573fSAndroid Build Coastguard Worker 
193*1b3f573fSAndroid Build Coastguard Worker                 var bufferWriter = new TestArrayBufferWriter<byte>();
194*1b3f573fSAndroid Build Coastguard Worker                 bufferWriter.MaxGrowBy = bufferSize;
195*1b3f573fSAndroid Build Coastguard Worker                 WriteContext.Initialize(bufferWriter, out WriteContext ctx);
196*1b3f573fSAndroid Build Coastguard Worker                 ctx.WriteFixed32(value);
197*1b3f573fSAndroid Build Coastguard Worker                 ctx.Flush();
198*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(data, bufferWriter.WrittenSpan.ToArray());
199*1b3f573fSAndroid Build Coastguard Worker             }
200*1b3f573fSAndroid Build Coastguard Worker         }
201*1b3f573fSAndroid Build Coastguard Worker 
202*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
203*1b3f573fSAndroid Build Coastguard Worker         /// Parses the given bytes using WriteRawLittleEndian64() and checks
204*1b3f573fSAndroid Build Coastguard Worker         /// that the result matches the given value.
205*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
AssertWriteLittleEndian64(byte[] data, ulong value)206*1b3f573fSAndroid Build Coastguard Worker         private static void AssertWriteLittleEndian64(byte[] data, ulong value)
207*1b3f573fSAndroid Build Coastguard Worker         {
208*1b3f573fSAndroid Build Coastguard Worker             {
209*1b3f573fSAndroid Build Coastguard Worker                 var rawOutput = new MemoryStream();
210*1b3f573fSAndroid Build Coastguard Worker                 var output = new CodedOutputStream(rawOutput);
211*1b3f573fSAndroid Build Coastguard Worker                 output.WriteRawLittleEndian64(value);
212*1b3f573fSAndroid Build Coastguard Worker                 output.Flush();
213*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(data, rawOutput.ToArray());
214*1b3f573fSAndroid Build Coastguard Worker 
215*1b3f573fSAndroid Build Coastguard Worker                 var bufferWriter = new TestArrayBufferWriter<byte>();
216*1b3f573fSAndroid Build Coastguard Worker                 WriteContext.Initialize(bufferWriter, out WriteContext ctx);
217*1b3f573fSAndroid Build Coastguard Worker                 ctx.WriteFixed64(value);
218*1b3f573fSAndroid Build Coastguard Worker                 ctx.Flush();
219*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(data, bufferWriter.WrittenSpan.ToArray());
220*1b3f573fSAndroid Build Coastguard Worker             }
221*1b3f573fSAndroid Build Coastguard Worker 
222*1b3f573fSAndroid Build Coastguard Worker             // Try different block sizes.
223*1b3f573fSAndroid Build Coastguard Worker             for (int blockSize = 1; blockSize <= 16; blockSize *= 2)
224*1b3f573fSAndroid Build Coastguard Worker             {
225*1b3f573fSAndroid Build Coastguard Worker                 var rawOutput = new MemoryStream();
226*1b3f573fSAndroid Build Coastguard Worker                 var output = new CodedOutputStream(rawOutput, blockSize);
227*1b3f573fSAndroid Build Coastguard Worker                 output.WriteRawLittleEndian64(value);
228*1b3f573fSAndroid Build Coastguard Worker                 output.Flush();
229*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(data, rawOutput.ToArray());
230*1b3f573fSAndroid Build Coastguard Worker 
231*1b3f573fSAndroid Build Coastguard Worker                 var bufferWriter = new TestArrayBufferWriter<byte>();
232*1b3f573fSAndroid Build Coastguard Worker                 bufferWriter.MaxGrowBy = blockSize;
233*1b3f573fSAndroid Build Coastguard Worker                 WriteContext.Initialize(bufferWriter, out WriteContext ctx);
234*1b3f573fSAndroid Build Coastguard Worker                 ctx.WriteFixed64(value);
235*1b3f573fSAndroid Build Coastguard Worker                 ctx.Flush();
236*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(data, bufferWriter.WrittenSpan.ToArray());
237*1b3f573fSAndroid Build Coastguard Worker             }
238*1b3f573fSAndroid Build Coastguard Worker         }
239*1b3f573fSAndroid Build Coastguard Worker 
240*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
241*1b3f573fSAndroid Build Coastguard Worker         /// Tests writeRawLittleEndian32() and writeRawLittleEndian64().
242*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
243*1b3f573fSAndroid Build Coastguard Worker         [Test]
WriteLittleEndian()244*1b3f573fSAndroid Build Coastguard Worker         public void WriteLittleEndian()
245*1b3f573fSAndroid Build Coastguard Worker         {
246*1b3f573fSAndroid Build Coastguard Worker             AssertWriteLittleEndian32(new byte[] {0x78, 0x56, 0x34, 0x12}, 0x12345678);
247*1b3f573fSAndroid Build Coastguard Worker             AssertWriteLittleEndian32(new byte[] {0xf0, 0xde, 0xbc, 0x9a}, 0x9abcdef0);
248*1b3f573fSAndroid Build Coastguard Worker 
249*1b3f573fSAndroid Build Coastguard Worker             AssertWriteLittleEndian64(
250*1b3f573fSAndroid Build Coastguard Worker                 new byte[] {0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12},
251*1b3f573fSAndroid Build Coastguard Worker                 0x123456789abcdef0L);
252*1b3f573fSAndroid Build Coastguard Worker             AssertWriteLittleEndian64(
253*1b3f573fSAndroid Build Coastguard Worker                 new byte[] {0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a},
254*1b3f573fSAndroid Build Coastguard Worker                 0x9abcdef012345678UL);
255*1b3f573fSAndroid Build Coastguard Worker         }
256*1b3f573fSAndroid Build Coastguard Worker 
257*1b3f573fSAndroid Build Coastguard Worker         [Test]
WriteWholeMessage_VaryingBlockSizes()258*1b3f573fSAndroid Build Coastguard Worker         public void WriteWholeMessage_VaryingBlockSizes()
259*1b3f573fSAndroid Build Coastguard Worker         {
260*1b3f573fSAndroid Build Coastguard Worker             TestAllTypes message = SampleMessages.CreateFullTestAllTypes();
261*1b3f573fSAndroid Build Coastguard Worker 
262*1b3f573fSAndroid Build Coastguard Worker             byte[] rawBytes = message.ToByteArray();
263*1b3f573fSAndroid Build Coastguard Worker 
264*1b3f573fSAndroid Build Coastguard Worker             // Try different block sizes.
265*1b3f573fSAndroid Build Coastguard Worker             for (int blockSize = 1; blockSize < 256; blockSize *= 2)
266*1b3f573fSAndroid Build Coastguard Worker             {
267*1b3f573fSAndroid Build Coastguard Worker                 MemoryStream rawOutput = new MemoryStream();
268*1b3f573fSAndroid Build Coastguard Worker                 CodedOutputStream output = new CodedOutputStream(rawOutput, blockSize);
269*1b3f573fSAndroid Build Coastguard Worker                 message.WriteTo(output);
270*1b3f573fSAndroid Build Coastguard Worker                 output.Flush();
271*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(rawBytes, rawOutput.ToArray());
272*1b3f573fSAndroid Build Coastguard Worker 
273*1b3f573fSAndroid Build Coastguard Worker                 var bufferWriter = new TestArrayBufferWriter<byte>();
274*1b3f573fSAndroid Build Coastguard Worker                 bufferWriter.MaxGrowBy = blockSize;
275*1b3f573fSAndroid Build Coastguard Worker                 message.WriteTo(bufferWriter);
276*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(rawBytes, bufferWriter.WrittenSpan.ToArray());
277*1b3f573fSAndroid Build Coastguard Worker             }
278*1b3f573fSAndroid Build Coastguard Worker         }
279*1b3f573fSAndroid Build Coastguard Worker 
280*1b3f573fSAndroid Build Coastguard Worker         [Test]
WriteContext_WritesWithFlushes()281*1b3f573fSAndroid Build Coastguard Worker         public void WriteContext_WritesWithFlushes()
282*1b3f573fSAndroid Build Coastguard Worker         {
283*1b3f573fSAndroid Build Coastguard Worker             TestAllTypes message = SampleMessages.CreateFullTestAllTypes();
284*1b3f573fSAndroid Build Coastguard Worker 
285*1b3f573fSAndroid Build Coastguard Worker             MemoryStream expectedOutput = new MemoryStream();
286*1b3f573fSAndroid Build Coastguard Worker             CodedOutputStream output = new CodedOutputStream(expectedOutput);
287*1b3f573fSAndroid Build Coastguard Worker             output.WriteMessage(message);
288*1b3f573fSAndroid Build Coastguard Worker             output.Flush();
289*1b3f573fSAndroid Build Coastguard Worker             byte[] expectedBytes1 = expectedOutput.ToArray();
290*1b3f573fSAndroid Build Coastguard Worker 
291*1b3f573fSAndroid Build Coastguard Worker             output.WriteMessage(message);
292*1b3f573fSAndroid Build Coastguard Worker             output.Flush();
293*1b3f573fSAndroid Build Coastguard Worker             byte[] expectedBytes2 = expectedOutput.ToArray();
294*1b3f573fSAndroid Build Coastguard Worker 
295*1b3f573fSAndroid Build Coastguard Worker             var bufferWriter = new TestArrayBufferWriter<byte>();
296*1b3f573fSAndroid Build Coastguard Worker             WriteContext.Initialize(bufferWriter, out WriteContext ctx);
297*1b3f573fSAndroid Build Coastguard Worker             ctx.WriteMessage(message);
298*1b3f573fSAndroid Build Coastguard Worker             ctx.Flush();
299*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(expectedBytes1, bufferWriter.WrittenSpan.ToArray());
300*1b3f573fSAndroid Build Coastguard Worker 
301*1b3f573fSAndroid Build Coastguard Worker             ctx.WriteMessage(message);
302*1b3f573fSAndroid Build Coastguard Worker             ctx.Flush();
303*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(expectedBytes2, bufferWriter.WrittenSpan.ToArray());
304*1b3f573fSAndroid Build Coastguard Worker         }
305*1b3f573fSAndroid Build Coastguard Worker 
306*1b3f573fSAndroid Build Coastguard Worker         [Test]
EncodeZigZag32()307*1b3f573fSAndroid Build Coastguard Worker         public void EncodeZigZag32()
308*1b3f573fSAndroid Build Coastguard Worker         {
309*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0u, WritingPrimitives.EncodeZigZag32(0));
310*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(1u, WritingPrimitives.EncodeZigZag32(-1));
311*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(2u, WritingPrimitives.EncodeZigZag32(1));
312*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(3u, WritingPrimitives.EncodeZigZag32(-2));
313*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0x7FFFFFFEu, WritingPrimitives.EncodeZigZag32(0x3FFFFFFF));
314*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0x7FFFFFFFu, WritingPrimitives.EncodeZigZag32(unchecked((int) 0xC0000000)));
315*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0xFFFFFFFEu, WritingPrimitives.EncodeZigZag32(0x7FFFFFFF));
316*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0xFFFFFFFFu, WritingPrimitives.EncodeZigZag32(unchecked((int) 0x80000000)));
317*1b3f573fSAndroid Build Coastguard Worker         }
318*1b3f573fSAndroid Build Coastguard Worker 
319*1b3f573fSAndroid Build Coastguard Worker         [Test]
EncodeZigZag64()320*1b3f573fSAndroid Build Coastguard Worker         public void EncodeZigZag64()
321*1b3f573fSAndroid Build Coastguard Worker         {
322*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0u, WritingPrimitives.EncodeZigZag64(0));
323*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(1u, WritingPrimitives.EncodeZigZag64(-1));
324*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(2u, WritingPrimitives.EncodeZigZag64(1));
325*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(3u, WritingPrimitives.EncodeZigZag64(-2));
326*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0x000000007FFFFFFEuL,
327*1b3f573fSAndroid Build Coastguard Worker                             WritingPrimitives.EncodeZigZag64(unchecked((long) 0x000000003FFFFFFFUL)));
328*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0x000000007FFFFFFFuL,
329*1b3f573fSAndroid Build Coastguard Worker                             WritingPrimitives.EncodeZigZag64(unchecked((long) 0xFFFFFFFFC0000000UL)));
330*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0x00000000FFFFFFFEuL,
331*1b3f573fSAndroid Build Coastguard Worker                             WritingPrimitives.EncodeZigZag64(unchecked((long) 0x000000007FFFFFFFUL)));
332*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0x00000000FFFFFFFFuL,
333*1b3f573fSAndroid Build Coastguard Worker                             WritingPrimitives.EncodeZigZag64(unchecked((long) 0xFFFFFFFF80000000UL)));
334*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0xFFFFFFFFFFFFFFFEL,
335*1b3f573fSAndroid Build Coastguard Worker                             WritingPrimitives.EncodeZigZag64(unchecked((long) 0x7FFFFFFFFFFFFFFFUL)));
336*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0xFFFFFFFFFFFFFFFFL,
337*1b3f573fSAndroid Build Coastguard Worker                             WritingPrimitives.EncodeZigZag64(unchecked((long) 0x8000000000000000UL)));
338*1b3f573fSAndroid Build Coastguard Worker         }
339*1b3f573fSAndroid Build Coastguard Worker 
340*1b3f573fSAndroid Build Coastguard Worker         [Test]
RoundTripZigZag32()341*1b3f573fSAndroid Build Coastguard Worker         public void RoundTripZigZag32()
342*1b3f573fSAndroid Build Coastguard Worker         {
343*1b3f573fSAndroid Build Coastguard Worker             // Some easier-to-verify round-trip tests.  The inputs (other than 0, 1, -1)
344*1b3f573fSAndroid Build Coastguard Worker             // were chosen semi-randomly via keyboard bashing.
345*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0, ParsingPrimitives.DecodeZigZag32(WritingPrimitives.EncodeZigZag32(0)));
346*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(1, ParsingPrimitives.DecodeZigZag32(WritingPrimitives.EncodeZigZag32(1)));
347*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(-1, ParsingPrimitives.DecodeZigZag32(WritingPrimitives.EncodeZigZag32(-1)));
348*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(14927, ParsingPrimitives.DecodeZigZag32(WritingPrimitives.EncodeZigZag32(14927)));
349*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(-3612, ParsingPrimitives.DecodeZigZag32(WritingPrimitives.EncodeZigZag32(-3612)));
350*1b3f573fSAndroid Build Coastguard Worker         }
351*1b3f573fSAndroid Build Coastguard Worker 
352*1b3f573fSAndroid Build Coastguard Worker         [Test]
RoundTripZigZag64()353*1b3f573fSAndroid Build Coastguard Worker         public void RoundTripZigZag64()
354*1b3f573fSAndroid Build Coastguard Worker         {
355*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0, ParsingPrimitives.DecodeZigZag64(WritingPrimitives.EncodeZigZag64(0)));
356*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(1, ParsingPrimitives.DecodeZigZag64(WritingPrimitives.EncodeZigZag64(1)));
357*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(-1, ParsingPrimitives.DecodeZigZag64(WritingPrimitives.EncodeZigZag64(-1)));
358*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(14927, ParsingPrimitives.DecodeZigZag64(WritingPrimitives.EncodeZigZag64(14927)));
359*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(-3612, ParsingPrimitives.DecodeZigZag64(WritingPrimitives.EncodeZigZag64(-3612)));
360*1b3f573fSAndroid Build Coastguard Worker 
361*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(856912304801416L,
362*1b3f573fSAndroid Build Coastguard Worker                             ParsingPrimitives.DecodeZigZag64(WritingPrimitives.EncodeZigZag64(856912304801416L)));
363*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(-75123905439571256L,
364*1b3f573fSAndroid Build Coastguard Worker                             ParsingPrimitives.DecodeZigZag64(WritingPrimitives.EncodeZigZag64(-75123905439571256L)));
365*1b3f573fSAndroid Build Coastguard Worker         }
366*1b3f573fSAndroid Build Coastguard Worker 
367*1b3f573fSAndroid Build Coastguard Worker         [Test]
TestNegativeEnumNoTag()368*1b3f573fSAndroid Build Coastguard Worker         public void TestNegativeEnumNoTag()
369*1b3f573fSAndroid Build Coastguard Worker         {
370*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(10, CodedOutputStream.ComputeInt32Size(-2));
371*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(10, CodedOutputStream.ComputeEnumSize((int) SampleEnum.NegativeValue));
372*1b3f573fSAndroid Build Coastguard Worker 
373*1b3f573fSAndroid Build Coastguard Worker             byte[] bytes = new byte[10];
374*1b3f573fSAndroid Build Coastguard Worker             CodedOutputStream output = new CodedOutputStream(bytes);
375*1b3f573fSAndroid Build Coastguard Worker             output.WriteEnum((int) SampleEnum.NegativeValue);
376*1b3f573fSAndroid Build Coastguard Worker 
377*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0, output.SpaceLeft);
378*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual("FE-FF-FF-FF-FF-FF-FF-FF-FF-01", BitConverter.ToString(bytes));
379*1b3f573fSAndroid Build Coastguard Worker         }
380*1b3f573fSAndroid Build Coastguard Worker 
381*1b3f573fSAndroid Build Coastguard Worker         [Test]
TestCodedInputOutputPosition()382*1b3f573fSAndroid Build Coastguard Worker         public void TestCodedInputOutputPosition()
383*1b3f573fSAndroid Build Coastguard Worker         {
384*1b3f573fSAndroid Build Coastguard Worker             byte[] content = new byte[110];
385*1b3f573fSAndroid Build Coastguard Worker             for (int i = 0; i < content.Length; i++)
386*1b3f573fSAndroid Build Coastguard Worker                 content[i] = (byte)i;
387*1b3f573fSAndroid Build Coastguard Worker 
388*1b3f573fSAndroid Build Coastguard Worker             byte[] child = new byte[120];
389*1b3f573fSAndroid Build Coastguard Worker             {
390*1b3f573fSAndroid Build Coastguard Worker                 MemoryStream ms = new MemoryStream(child);
391*1b3f573fSAndroid Build Coastguard Worker                 CodedOutputStream cout = new CodedOutputStream(ms, 20);
392*1b3f573fSAndroid Build Coastguard Worker                 // Field 11: numeric value: 500
393*1b3f573fSAndroid Build Coastguard Worker                 cout.WriteTag(11, WireFormat.WireType.Varint);
394*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(1, cout.Position);
395*1b3f573fSAndroid Build Coastguard Worker                 cout.WriteInt32(500);
396*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(3, cout.Position);
397*1b3f573fSAndroid Build Coastguard Worker                 //Field 12: length delimited 120 bytes
398*1b3f573fSAndroid Build Coastguard Worker                 cout.WriteTag(12, WireFormat.WireType.LengthDelimited);
399*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(4, cout.Position);
400*1b3f573fSAndroid Build Coastguard Worker                 cout.WriteBytes(ByteString.CopyFrom(content));
401*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(115, cout.Position);
402*1b3f573fSAndroid Build Coastguard Worker                 // Field 13: fixed numeric value: 501
403*1b3f573fSAndroid Build Coastguard Worker                 cout.WriteTag(13, WireFormat.WireType.Fixed32);
404*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(116, cout.Position);
405*1b3f573fSAndroid Build Coastguard Worker                 cout.WriteSFixed32(501);
406*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(120, cout.Position);
407*1b3f573fSAndroid Build Coastguard Worker                 cout.Flush();
408*1b3f573fSAndroid Build Coastguard Worker             }
409*1b3f573fSAndroid Build Coastguard Worker 
410*1b3f573fSAndroid Build Coastguard Worker             byte[] bytes = new byte[130];
411*1b3f573fSAndroid Build Coastguard Worker             {
412*1b3f573fSAndroid Build Coastguard Worker                 CodedOutputStream cout = new CodedOutputStream(bytes);
413*1b3f573fSAndroid Build Coastguard Worker                 // Field 1: numeric value: 500
414*1b3f573fSAndroid Build Coastguard Worker                 cout.WriteTag(1, WireFormat.WireType.Varint);
415*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(1, cout.Position);
416*1b3f573fSAndroid Build Coastguard Worker                 cout.WriteInt32(500);
417*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(3, cout.Position);
418*1b3f573fSAndroid Build Coastguard Worker                 //Field 2: length delimited 120 bytes
419*1b3f573fSAndroid Build Coastguard Worker                 cout.WriteTag(2, WireFormat.WireType.LengthDelimited);
420*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(4, cout.Position);
421*1b3f573fSAndroid Build Coastguard Worker                 cout.WriteBytes(ByteString.CopyFrom(child));
422*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(125, cout.Position);
423*1b3f573fSAndroid Build Coastguard Worker                 // Field 3: fixed numeric value: 500
424*1b3f573fSAndroid Build Coastguard Worker                 cout.WriteTag(3, WireFormat.WireType.Fixed32);
425*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(126, cout.Position);
426*1b3f573fSAndroid Build Coastguard Worker                 cout.WriteSFixed32(501);
427*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(130, cout.Position);
428*1b3f573fSAndroid Build Coastguard Worker                 cout.Flush();
429*1b3f573fSAndroid Build Coastguard Worker             }
430*1b3f573fSAndroid Build Coastguard Worker             // Now test Input stream:
431*1b3f573fSAndroid Build Coastguard Worker             {
432*1b3f573fSAndroid Build Coastguard Worker                 CodedInputStream cin = new CodedInputStream(new MemoryStream(bytes), new byte[50], 0, 0, false);
433*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(0, cin.Position);
434*1b3f573fSAndroid Build Coastguard Worker                 // Field 1:
435*1b3f573fSAndroid Build Coastguard Worker                 uint tag = cin.ReadTag();
436*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(1, tag >> 3);
437*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(1, cin.Position);
438*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(500, cin.ReadInt32());
439*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(3, cin.Position);
440*1b3f573fSAndroid Build Coastguard Worker                 //Field 2:
441*1b3f573fSAndroid Build Coastguard Worker                 tag = cin.ReadTag();
442*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(2, tag >> 3);
443*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(4, cin.Position);
444*1b3f573fSAndroid Build Coastguard Worker                 int childlen = cin.ReadLength();
445*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(120, childlen);
446*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(5, cin.Position);
447*1b3f573fSAndroid Build Coastguard Worker                 int oldlimit = cin.PushLimit((int)childlen);
448*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(5, cin.Position);
449*1b3f573fSAndroid Build Coastguard Worker                 // Now we are reading child message
450*1b3f573fSAndroid Build Coastguard Worker                 {
451*1b3f573fSAndroid Build Coastguard Worker                     // Field 11: numeric value: 500
452*1b3f573fSAndroid Build Coastguard Worker                     tag = cin.ReadTag();
453*1b3f573fSAndroid Build Coastguard Worker                     Assert.AreEqual(11, tag >> 3);
454*1b3f573fSAndroid Build Coastguard Worker                     Assert.AreEqual(6, cin.Position);
455*1b3f573fSAndroid Build Coastguard Worker                     Assert.AreEqual(500, cin.ReadInt32());
456*1b3f573fSAndroid Build Coastguard Worker                     Assert.AreEqual(8, cin.Position);
457*1b3f573fSAndroid Build Coastguard Worker                     //Field 12: length delimited 120 bytes
458*1b3f573fSAndroid Build Coastguard Worker                     tag = cin.ReadTag();
459*1b3f573fSAndroid Build Coastguard Worker                     Assert.AreEqual(12, tag >> 3);
460*1b3f573fSAndroid Build Coastguard Worker                     Assert.AreEqual(9, cin.Position);
461*1b3f573fSAndroid Build Coastguard Worker                     ByteString bstr = cin.ReadBytes();
462*1b3f573fSAndroid Build Coastguard Worker                     Assert.AreEqual(110, bstr.Length);
463*1b3f573fSAndroid Build Coastguard Worker                     Assert.AreEqual((byte) 109, bstr[109]);
464*1b3f573fSAndroid Build Coastguard Worker                     Assert.AreEqual(120, cin.Position);
465*1b3f573fSAndroid Build Coastguard Worker                     // Field 13: fixed numeric value: 501
466*1b3f573fSAndroid Build Coastguard Worker                     tag = cin.ReadTag();
467*1b3f573fSAndroid Build Coastguard Worker                     Assert.AreEqual(13, tag >> 3);
468*1b3f573fSAndroid Build Coastguard Worker                     // ROK - Previously broken here, this returned 126 failing to account for bufferSizeAfterLimit
469*1b3f573fSAndroid Build Coastguard Worker                     Assert.AreEqual(121, cin.Position);
470*1b3f573fSAndroid Build Coastguard Worker                     Assert.AreEqual(501, cin.ReadSFixed32());
471*1b3f573fSAndroid Build Coastguard Worker                     Assert.AreEqual(125, cin.Position);
472*1b3f573fSAndroid Build Coastguard Worker                     Assert.IsTrue(cin.IsAtEnd);
473*1b3f573fSAndroid Build Coastguard Worker                 }
474*1b3f573fSAndroid Build Coastguard Worker                 cin.PopLimit(oldlimit);
475*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(125, cin.Position);
476*1b3f573fSAndroid Build Coastguard Worker                 // Field 3: fixed numeric value: 501
477*1b3f573fSAndroid Build Coastguard Worker                 tag = cin.ReadTag();
478*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(3, tag >> 3);
479*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(126, cin.Position);
480*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(501, cin.ReadSFixed32());
481*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(130, cin.Position);
482*1b3f573fSAndroid Build Coastguard Worker                 Assert.IsTrue(cin.IsAtEnd);
483*1b3f573fSAndroid Build Coastguard Worker             }
484*1b3f573fSAndroid Build Coastguard Worker         }
485*1b3f573fSAndroid Build Coastguard Worker 
486*1b3f573fSAndroid Build Coastguard Worker         [Test]
Dispose_DisposesUnderlyingStream()487*1b3f573fSAndroid Build Coastguard Worker         public void Dispose_DisposesUnderlyingStream()
488*1b3f573fSAndroid Build Coastguard Worker         {
489*1b3f573fSAndroid Build Coastguard Worker             var memoryStream = new MemoryStream();
490*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(memoryStream.CanWrite);
491*1b3f573fSAndroid Build Coastguard Worker             using (var cos = new CodedOutputStream(memoryStream))
492*1b3f573fSAndroid Build Coastguard Worker             {
493*1b3f573fSAndroid Build Coastguard Worker                 cos.WriteRawBytes(new byte[] {0});
494*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(0, memoryStream.Position); // Not flushed yet
495*1b3f573fSAndroid Build Coastguard Worker             }
496*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(1, memoryStream.ToArray().Length); // Flushed data from CodedOutputStream to MemoryStream
497*1b3f573fSAndroid Build Coastguard Worker             Assert.IsFalse(memoryStream.CanWrite); // Disposed
498*1b3f573fSAndroid Build Coastguard Worker         }
499*1b3f573fSAndroid Build Coastguard Worker 
500*1b3f573fSAndroid Build Coastguard Worker         [Test]
Dispose_WithLeaveOpen()501*1b3f573fSAndroid Build Coastguard Worker         public void Dispose_WithLeaveOpen()
502*1b3f573fSAndroid Build Coastguard Worker         {
503*1b3f573fSAndroid Build Coastguard Worker             var memoryStream = new MemoryStream();
504*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(memoryStream.CanWrite);
505*1b3f573fSAndroid Build Coastguard Worker             using (var cos = new CodedOutputStream(memoryStream, true))
506*1b3f573fSAndroid Build Coastguard Worker             {
507*1b3f573fSAndroid Build Coastguard Worker                 cos.WriteRawBytes(new byte[] {0});
508*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(0, memoryStream.Position); // Not flushed yet
509*1b3f573fSAndroid Build Coastguard Worker             }
510*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(1, memoryStream.Position); // Flushed data from CodedOutputStream to MemoryStream
511*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(memoryStream.CanWrite); // We left the stream open
512*1b3f573fSAndroid Build Coastguard Worker         }
513*1b3f573fSAndroid Build Coastguard Worker 
514*1b3f573fSAndroid Build Coastguard Worker         [Test]
Dispose_FromByteArray()515*1b3f573fSAndroid Build Coastguard Worker         public void Dispose_FromByteArray()
516*1b3f573fSAndroid Build Coastguard Worker         {
517*1b3f573fSAndroid Build Coastguard Worker             var stream = new CodedOutputStream(new byte[10]);
518*1b3f573fSAndroid Build Coastguard Worker             stream.Dispose();
519*1b3f573fSAndroid Build Coastguard Worker         }
520*1b3f573fSAndroid Build Coastguard Worker 
521*1b3f573fSAndroid Build Coastguard Worker         [Test]
WriteString_AsciiSmall_MaxUtf8SizeExceedsBuffer()522*1b3f573fSAndroid Build Coastguard Worker         public void WriteString_AsciiSmall_MaxUtf8SizeExceedsBuffer()
523*1b3f573fSAndroid Build Coastguard Worker         {
524*1b3f573fSAndroid Build Coastguard Worker             var buffer = new byte[5];
525*1b3f573fSAndroid Build Coastguard Worker             var output = new CodedOutputStream(buffer);
526*1b3f573fSAndroid Build Coastguard Worker             output.WriteString("ABC");
527*1b3f573fSAndroid Build Coastguard Worker 
528*1b3f573fSAndroid Build Coastguard Worker             output.Flush();
529*1b3f573fSAndroid Build Coastguard Worker 
530*1b3f573fSAndroid Build Coastguard Worker             // Verify written content
531*1b3f573fSAndroid Build Coastguard Worker             var input = new CodedInputStream(buffer);
532*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual("ABC", input.ReadString());
533*1b3f573fSAndroid Build Coastguard Worker         }
534*1b3f573fSAndroid Build Coastguard Worker 
535*1b3f573fSAndroid Build Coastguard Worker         [Test]
WriteStringsOfDifferentSizes_Ascii()536*1b3f573fSAndroid Build Coastguard Worker         public void WriteStringsOfDifferentSizes_Ascii()
537*1b3f573fSAndroid Build Coastguard Worker         {
538*1b3f573fSAndroid Build Coastguard Worker             for (int i = 1; i <= 1024; i++)
539*1b3f573fSAndroid Build Coastguard Worker             {
540*1b3f573fSAndroid Build Coastguard Worker                 var buffer = new byte[4096];
541*1b3f573fSAndroid Build Coastguard Worker                 var output = new CodedOutputStream(buffer);
542*1b3f573fSAndroid Build Coastguard Worker                 var sb = new StringBuilder();
543*1b3f573fSAndroid Build Coastguard Worker                 for (int j = 0; j < i; j++)
544*1b3f573fSAndroid Build Coastguard Worker                 {
545*1b3f573fSAndroid Build Coastguard Worker                     sb.Append((j % 10).ToString()); // incrementing numbers, repeating
546*1b3f573fSAndroid Build Coastguard Worker                 }
547*1b3f573fSAndroid Build Coastguard Worker                 var s = sb.ToString();
548*1b3f573fSAndroid Build Coastguard Worker                 output.WriteString(s);
549*1b3f573fSAndroid Build Coastguard Worker 
550*1b3f573fSAndroid Build Coastguard Worker                 output.Flush();
551*1b3f573fSAndroid Build Coastguard Worker 
552*1b3f573fSAndroid Build Coastguard Worker                 // Verify written content
553*1b3f573fSAndroid Build Coastguard Worker                 var input = new CodedInputStream(buffer);
554*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(s, input.ReadString());
555*1b3f573fSAndroid Build Coastguard Worker             }
556*1b3f573fSAndroid Build Coastguard Worker         }
557*1b3f573fSAndroid Build Coastguard Worker 
558*1b3f573fSAndroid Build Coastguard Worker         [Test]
WriteStringsOfDifferentSizes_Unicode()559*1b3f573fSAndroid Build Coastguard Worker         public void WriteStringsOfDifferentSizes_Unicode()
560*1b3f573fSAndroid Build Coastguard Worker         {
561*1b3f573fSAndroid Build Coastguard Worker             for (int i = 1; i <= 1024; i++)
562*1b3f573fSAndroid Build Coastguard Worker             {
563*1b3f573fSAndroid Build Coastguard Worker                 var buffer = new byte[4096];
564*1b3f573fSAndroid Build Coastguard Worker                 var output = new CodedOutputStream(buffer);
565*1b3f573fSAndroid Build Coastguard Worker                 var sb = new StringBuilder();
566*1b3f573fSAndroid Build Coastguard Worker                 for (int j = 0; j < i; j++)
567*1b3f573fSAndroid Build Coastguard Worker                 {
568*1b3f573fSAndroid Build Coastguard Worker                     char c = (char)((j % 10) + 10112);
569*1b3f573fSAndroid Build Coastguard Worker                     sb.Append(c.ToString()); // incrementing unicode numbers, repeating
570*1b3f573fSAndroid Build Coastguard Worker                 }
571*1b3f573fSAndroid Build Coastguard Worker                 var s = sb.ToString();
572*1b3f573fSAndroid Build Coastguard Worker                 output.WriteString(s);
573*1b3f573fSAndroid Build Coastguard Worker 
574*1b3f573fSAndroid Build Coastguard Worker                 output.Flush();
575*1b3f573fSAndroid Build Coastguard Worker 
576*1b3f573fSAndroid Build Coastguard Worker                 // Verify written content
577*1b3f573fSAndroid Build Coastguard Worker                 var input = new CodedInputStream(buffer);
578*1b3f573fSAndroid Build Coastguard Worker 
579*1b3f573fSAndroid Build Coastguard Worker                 Assert.AreEqual(s, input.ReadString());
580*1b3f573fSAndroid Build Coastguard Worker             }
581*1b3f573fSAndroid Build Coastguard Worker         }
582*1b3f573fSAndroid Build Coastguard Worker     }
583*1b3f573fSAndroid Build Coastguard Worker }