Skip to content

Commit dc13fb9

Browse files
committed
Added unit tests for IBufferWriterStream
1 parent bcadbd7 commit dc13fb9

File tree

3 files changed

+151
-1
lines changed

3 files changed

+151
-1
lines changed
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using System;
6+
using System.Buffers;
7+
using System.Diagnostics.CodeAnalysis;
8+
using System.IO;
9+
using System.Threading.Tasks;
10+
using Microsoft.Toolkit.HighPerformance.Buffers;
11+
using Microsoft.Toolkit.HighPerformance.Extensions;
12+
using Microsoft.VisualStudio.TestTools.UnitTesting;
13+
14+
namespace UnitTests.HighPerformance.Streams
15+
{
16+
[TestClass]
17+
public class Test_IBufferWriterStream
18+
{
19+
[TestCategory("IBufferWriterStream")]
20+
[TestMethod]
21+
public void Test_IBufferWriterStream_Lifecycle()
22+
{
23+
ArrayPoolBufferWriter<byte> writer = new ArrayPoolBufferWriter<byte>();
24+
25+
Stream stream = ((IBufferWriter<byte>)writer).AsStream();
26+
27+
Assert.IsTrue(stream.CanRead);
28+
Assert.IsFalse(stream.CanSeek);
29+
Assert.IsFalse(stream.CanWrite);
30+
31+
Assert.ThrowsException<NotSupportedException>(() => stream.Length);
32+
Assert.ThrowsException<NotSupportedException>(() => stream.Position);
33+
34+
stream.Dispose();
35+
36+
Assert.IsFalse(stream.CanRead);
37+
Assert.IsFalse(stream.CanSeek);
38+
Assert.IsFalse(stream.CanWrite);
39+
Assert.ThrowsException<NotSupportedException>(() => stream.Length);
40+
Assert.ThrowsException<NotSupportedException>(() => stream.Position);
41+
}
42+
43+
[TestCategory("IBufferWriterStream")]
44+
[TestMethod]
45+
public void Test_IBufferWriterStream_Write_Array()
46+
{
47+
ArrayPoolBufferWriter<byte> writer = new ArrayPoolBufferWriter<byte>();
48+
Stream stream = ((IBufferWriter<byte>)writer).AsStream();
49+
50+
byte[] data = Test_MemoryStream.CreateRandomData(64);
51+
52+
stream.Write(data, 0, data.Length);
53+
54+
Assert.AreEqual(writer.WrittenCount, data.Length);
55+
Assert.IsTrue(writer.WrittenSpan.SequenceEqual(data));
56+
57+
Assert.ThrowsException<ArgumentNullException>(() => stream.Write(null, 0, 10));
58+
Assert.ThrowsException<ArgumentOutOfRangeException>(() => stream.Write(data, -1, 10));
59+
Assert.ThrowsException<ArgumentException>(() => stream.Write(data, 200, 10));
60+
Assert.ThrowsException<ArgumentOutOfRangeException>(() => stream.Write(data, 0, -24));
61+
Assert.ThrowsException<ArgumentException>(() => stream.Write(data, 0, 200));
62+
63+
stream.Dispose();
64+
65+
Assert.ThrowsException<ObjectDisposedException>(() => stream.Write(data, 0, data.Length));
66+
}
67+
68+
[TestCategory("IBufferWriterStream")]
69+
[TestMethod]
70+
public async Task Test_IBufferWriterStream_WriteAsync_Array()
71+
{
72+
ArrayPoolBufferWriter<byte> writer = new ArrayPoolBufferWriter<byte>();
73+
Stream stream = ((IBufferWriter<byte>)writer).AsStream();
74+
75+
byte[] data = Test_MemoryStream.CreateRandomData(64);
76+
77+
await stream.WriteAsync(data, 0, data.Length);
78+
79+
Assert.AreEqual(writer.WrittenCount, data.Length);
80+
Assert.IsTrue(writer.WrittenSpan.SequenceEqual(data));
81+
82+
await Assert.ThrowsExceptionAsync<ArgumentNullException>(() => stream.WriteAsync(null, 0, 10));
83+
await Assert.ThrowsExceptionAsync<ArgumentOutOfRangeException>(() => stream.WriteAsync(data, -1, 10));
84+
await Assert.ThrowsExceptionAsync<ArgumentException>(() => stream.WriteAsync(data, 200, 10));
85+
await Assert.ThrowsExceptionAsync<ArgumentOutOfRangeException>(() => stream.WriteAsync(data, 0, -24));
86+
await Assert.ThrowsExceptionAsync<ArgumentException>(() => stream.WriteAsync(data, 0, 200));
87+
88+
stream.Dispose();
89+
90+
await Assert.ThrowsExceptionAsync<ObjectDisposedException>(() => stream.WriteAsync(data, 0, data.Length));
91+
}
92+
93+
[TestCategory("IBufferWriterStream")]
94+
[TestMethod]
95+
[SuppressMessage("StyleCop.CSharp.LayoutRules", "SA1500", Justification = "Array initialization")]
96+
public void Test_IBufferWriterStream_WriteByte()
97+
{
98+
ArrayPoolBufferWriter<byte> writer = new ArrayPoolBufferWriter<byte>();
99+
Stream stream = ((IBufferWriter<byte>)writer).AsStream();
100+
101+
ReadOnlySpan<byte> data = stackalloc byte[] { 1, 128, 255, 32 };
102+
103+
foreach (var item in data.Enumerate())
104+
{
105+
Assert.AreEqual(writer.WrittenCount, item.Index);
106+
107+
stream.WriteByte(item.Value);
108+
}
109+
110+
Assert.AreEqual(writer.WrittenCount, data.Length);
111+
Assert.IsTrue(data.SequenceEqual(writer.WrittenSpan));
112+
113+
Assert.ThrowsException<NotSupportedException>(() => stream.ReadByte());
114+
}
115+
116+
[TestCategory("IBufferWriterStream")]
117+
[TestMethod]
118+
public void Test_IBufferWriterStream_Write_Span()
119+
{
120+
ArrayPoolBufferWriter<byte> writer = new ArrayPoolBufferWriter<byte>();
121+
Stream stream = ((IBufferWriter<byte>)writer).AsStream();
122+
123+
Memory<byte> data = Test_MemoryStream.CreateRandomData(64);
124+
125+
// This will use the extension when on .NET Standard 2.0,
126+
// as the Stream class doesn't have Spam<T> or Memory<T>
127+
// public APIs there. This is the case eg. on UWP as well.
128+
stream.Write(data.Span);
129+
130+
Assert.AreEqual(writer.WrittenCount, data.Length);
131+
Assert.IsTrue(data.Span.SequenceEqual(writer.WrittenSpan));
132+
}
133+
134+
[TestCategory("IBufferWriterStream")]
135+
[TestMethod]
136+
public async Task Test_IBufferWriterStream_WriteAsync_Memory()
137+
{
138+
ArrayPoolBufferWriter<byte> writer = new ArrayPoolBufferWriter<byte>();
139+
Stream stream = ((IBufferWriter<byte>)writer).AsStream();
140+
141+
Memory<byte> data = Test_MemoryStream.CreateRandomData(64);
142+
143+
await stream.WriteAsync(data);
144+
145+
Assert.AreEqual(writer.WrittenCount, data.Length);
146+
Assert.IsTrue(data.Span.SequenceEqual(writer.WrittenSpan));
147+
}
148+
}
149+
}

UnitTests/UnitTests.HighPerformance.Shared/Streams/Test_MemoryStream.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ public async Task Test_MemoryStream_ReadWriteAsync_Memory()
236236
/// <param name="count">The number of array items to create.</param>
237237
/// <returns>The returned random array.</returns>
238238
[Pure]
239-
private static byte[] CreateRandomData(int count)
239+
internal static byte[] CreateRandomData(int count)
240240
{
241241
var random = new Random(DateTime.Now.Ticks.GetHashCode());
242242

UnitTests/UnitTests.HighPerformance.Shared/UnitTests.HighPerformance.Shared.projitems

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
<Compile Include="$(MSBuildThisFileDirectory)Helpers\Test_ParallelHelper.ForEach.Ref.cs" />
4040
<Compile Include="$(MSBuildThisFileDirectory)Helpers\Test_BitHelper.cs" />
4141
<Compile Include="$(MSBuildThisFileDirectory)Streams\Test_IMemoryOwnerStream.cs" />
42+
<Compile Include="$(MSBuildThisFileDirectory)Streams\Test_IBufferWriterStream.cs" />
4243
<Compile Include="$(MSBuildThisFileDirectory)Streams\Test_MemoryStream.ThrowExceptions.cs" />
4344
<Compile Include="$(MSBuildThisFileDirectory)Streams\Test_MemoryStream.cs" />
4445
<Compile Include="$(MSBuildThisFileDirectory)Test_Box{T}.cs" />

0 commit comments

Comments
 (0)