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 }