public void Test_MemoryBufferWriterOfT_AllocateAndGetMemoryAndSpan() { Memory <byte> memory = new byte[256]; var writer = new MemoryBufferWriter <byte>(memory); Assert.AreEqual(writer.Capacity, 256); Assert.AreEqual(writer.FreeCapacity, 256); Assert.AreEqual(writer.WrittenCount, 0); Assert.IsTrue(writer.WrittenMemory.IsEmpty); Assert.IsTrue(writer.WrittenSpan.IsEmpty); Span <byte> span = writer.GetSpan(43); Assert.AreEqual(span.Length, memory.Length); writer.Advance(43); Assert.AreEqual(writer.Capacity, 256); Assert.AreEqual(writer.FreeCapacity, 256 - 43); Assert.AreEqual(writer.WrittenCount, 43); Assert.AreEqual(writer.WrittenMemory.Length, 43); Assert.AreEqual(writer.WrittenSpan.Length, 43); Assert.AreEqual(memory.Length - 43, writer.GetSpan().Length); Assert.AreEqual(memory.Length - 43, writer.GetMemory().Length); Assert.AreEqual(memory.Length - 43, writer.GetSpan(22).Length); Assert.AreEqual(memory.Length - 43, writer.GetMemory(22).Length); Assert.ThrowsException <ArgumentOutOfRangeException>(() => writer.Advance(-1)); Assert.ThrowsException <ArgumentOutOfRangeException>(() => writer.GetMemory(-1)); Assert.ThrowsException <ArgumentException>(() => writer.GetSpan(1024)); Assert.ThrowsException <ArgumentException>(() => writer.GetMemory(1024)); Assert.ThrowsException <ArgumentException>(() => writer.Advance(1024)); }
public void GetMemoryAllocatesNewSegmentWhenInsufficientSpaceInCurrentSegment() { // Have the buffer writer rent only the minimum size segments from the pool. using (var bufferWriter = new MemoryBufferWriter(MinimumSegmentSize)) { var data = new byte[MinimumSegmentSize]; new Random().NextBytes(data); // Write half the minimum segment size bufferWriter.Write(data.AsSpan(0, MinimumSegmentSize / 2)); // Request a new buffer of MinimumSegmentSize var buffer = bufferWriter.GetMemory(MinimumSegmentSize); Assert.Equal(MinimumSegmentSize, buffer.Length); // Write to the buffer bufferWriter.Write(data); // Verify the data was all written correctly var expectedOutput = new byte[MinimumSegmentSize + (MinimumSegmentSize / 2)]; data.AsSpan(0, MinimumSegmentSize / 2).CopyTo(expectedOutput.AsSpan(0, MinimumSegmentSize / 2)); data.CopyTo(expectedOutput, MinimumSegmentSize / 2); Assert.Equal(expectedOutput, bufferWriter.ToArray()); } }