Skip to content

Commit 873c98c

Browse files
committed
ring buffer add unit test
1 parent 435674f commit 873c98c

File tree

3 files changed

+344
-27
lines changed

3 files changed

+344
-27
lines changed

src/CatLib.Core.Tests/CatLib.Core.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
<Compile Include="Support\FilterChain\FilterChainTests.cs" />
5050
<Compile Include="Support\QuickList\InternalListTests.cs" />
5151
<Compile Include="Support\QuickList\QuickListTests.cs" />
52+
<Compile Include="Support\RingBuffer\RingBufferTests.cs" />
5253
<Compile Include="Support\SortSet\SortSetTests.cs" />
5354
<Compile Include="Support\Template\ManagerTests.cs" />
5455
<Compile Include="Support\Template\SingleManagerTests.cs" />
Lines changed: 241 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,241 @@
1+
/*
2+
* This file is part of the CatLib package.
3+
*
4+
* (c) Yu Bin <[email protected]>
5+
*
6+
* For the full copyright and license information, please view the LICENSE
7+
* file that was distributed with this source code.
8+
*
9+
* Document: http://catlib.io/
10+
*/
11+
12+
using System;
13+
using Microsoft.VisualStudio.TestTools.UnitTesting;
14+
15+
namespace CatLib.Tests.Stl
16+
{
17+
[TestClass]
18+
public class RingBufferTests
19+
{
20+
[TestMethod]
21+
public void TestReadWrite()
22+
{
23+
var ringBuffer = new RingBuffer();
24+
var buffer = new byte[] { 1, 2, 4, 5 };
25+
ringBuffer.Write(buffer, 1, 2);
26+
var read = ringBuffer.Read();
27+
28+
Assert.AreEqual(2, read.Length);
29+
Assert.AreEqual(2, read[0]);
30+
Assert.AreEqual(4, read[1]);
31+
32+
ringBuffer = new RingBuffer();
33+
buffer = new byte[] { 1, 2, 3, 4, 5 };
34+
ringBuffer.Write(buffer, 2);
35+
buffer = new byte[5];
36+
var readCount = ringBuffer.Read(buffer, 2);
37+
38+
Assert.AreEqual(3, readCount);
39+
Assert.AreEqual(0, buffer[0]);
40+
Assert.AreEqual(0, buffer[1]);
41+
Assert.AreEqual(3, buffer[2]);
42+
Assert.AreEqual(4, buffer[3]);
43+
Assert.AreEqual(5, buffer[4]);
44+
}
45+
46+
[TestMethod]
47+
public void TestCanRead()
48+
{
49+
var ringBuffer = new RingBuffer();
50+
var buffer = new byte[] { 1, 2, 3, 4, 5 };
51+
ringBuffer.Write(buffer);
52+
53+
Assert.AreEqual(true, ringBuffer.CanRead(4));
54+
Assert.AreEqual(true, ringBuffer.CanRead(5));
55+
Assert.AreEqual(false, ringBuffer.CanRead(6));
56+
ringBuffer.Write(buffer);
57+
Assert.AreEqual(true, ringBuffer.CanRead(9));
58+
Assert.AreEqual(true, ringBuffer.CanRead(10));
59+
Assert.AreEqual(false, ringBuffer.CanRead(11));
60+
}
61+
62+
[TestMethod]
63+
public void TestCanWrite()
64+
{
65+
var ringBuffer = new RingBuffer(12); // 16 cap
66+
Assert.AreEqual(true, ringBuffer.CanWrite(15));
67+
Assert.AreEqual(true, ringBuffer.CanWrite(16));
68+
Assert.AreEqual(false, ringBuffer.CanWrite(17));
69+
70+
ringBuffer.Write(new byte[] { 1, 2, 3, 4, 5 });
71+
Assert.AreEqual(true, ringBuffer.CanWrite(10));
72+
Assert.AreEqual(true, ringBuffer.CanWrite(11));
73+
Assert.AreEqual(false, ringBuffer.CanWrite(12));
74+
75+
ringBuffer.Write(new byte[] { 1, 2, 3, 4, 5 }, 3);
76+
Assert.AreEqual(true, ringBuffer.CanWrite(8));
77+
Assert.AreEqual(true, ringBuffer.CanWrite(9));
78+
Assert.AreEqual(false, ringBuffer.CanWrite(10));
79+
}
80+
81+
[TestMethod]
82+
public void TestPeek()
83+
{
84+
var ringBuffer = new RingBuffer(12); // 16 cap
85+
var buffer = new byte[] { 1, 2, 3, 4, 5 };
86+
ringBuffer.Write(buffer);
87+
88+
Assert.AreEqual(11, ringBuffer.WriteableCapacity);
89+
Assert.AreEqual(5, ringBuffer.ReadableCapacity);
90+
91+
var data = ringBuffer.Peek();
92+
Assert.AreEqual(5, data.Length);
93+
Assert.AreEqual(1, data[0]);
94+
Assert.AreEqual(2, data[1]);
95+
Assert.AreEqual(3, data[2]);
96+
Assert.AreEqual(4, data[3]);
97+
Assert.AreEqual(5, data[4]);
98+
99+
var data2 = new byte[5];
100+
var read = ringBuffer.Peek(data2, 3);
101+
Assert.AreEqual(2, read);
102+
Assert.AreEqual(5, data2.Length);
103+
Assert.AreEqual(0, data2[0]);
104+
Assert.AreEqual(0, data2[1]);
105+
Assert.AreEqual(0, data2[2]);
106+
Assert.AreEqual(1, data2[3]);
107+
Assert.AreEqual(2, data2[4]);
108+
109+
// double peek test
110+
data2 = new byte[5];
111+
read = ringBuffer.Peek(data2);
112+
Assert.AreEqual(5, read);
113+
Assert.AreEqual(5, data2.Length);
114+
Assert.AreEqual(1, data2[0]);
115+
Assert.AreEqual(2, data2[1]);
116+
Assert.AreEqual(3, data2[2]);
117+
Assert.AreEqual(4, data2[3]);
118+
Assert.AreEqual(5, data2[4]);
119+
120+
Assert.AreEqual(11, ringBuffer.WriteableCapacity);
121+
Assert.AreEqual(5, ringBuffer.ReadableCapacity);
122+
ringBuffer.Read();
123+
Assert.AreEqual(16, ringBuffer.WriteableCapacity);
124+
Assert.AreEqual(0, ringBuffer.ReadableCapacity);
125+
}
126+
127+
[TestMethod]
128+
public void TestFullBuffer()
129+
{
130+
var ringBuffer = new RingBuffer(4); // 4 cap
131+
var buffer = new byte[] { 1, 2, 3, 4, 5 };
132+
133+
var write = ringBuffer.Write(buffer);
134+
Assert.AreEqual(4, write);
135+
136+
Assert.AreEqual(0, ringBuffer.WriteableCapacity);
137+
Assert.AreEqual(4, ringBuffer.ReadableCapacity);
138+
139+
write = ringBuffer.Write(buffer);
140+
Assert.AreEqual(0, write);
141+
142+
Assert.AreEqual(0, ringBuffer.WriteableCapacity);
143+
Assert.AreEqual(4, ringBuffer.ReadableCapacity);
144+
}
145+
146+
[TestMethod]
147+
public void TestReadEmptyBuffer()
148+
{
149+
var ringBuffer = new RingBuffer(4); // 4 cap
150+
var read = ringBuffer.Read();
151+
Assert.AreEqual(0, read.Length);
152+
153+
var peek = ringBuffer.Peek();
154+
Assert.AreEqual(0, peek.Length);
155+
156+
var buffer = new byte[5];
157+
var r = ringBuffer.Read(buffer, 2);
158+
159+
Assert.AreEqual(0, r);
160+
}
161+
162+
[TestMethod]
163+
public void TestOutOffset()
164+
{
165+
var ringBuffer = new RingBuffer(4); // 4 cap
166+
var buffer = new byte[5];
167+
ExceptionAssert.Throws<ArgumentOutOfRangeException>(() =>
168+
{
169+
ringBuffer.Read(buffer, 2, 10);
170+
});
171+
172+
ExceptionAssert.Throws<ArgumentOutOfRangeException>(() =>
173+
{
174+
ringBuffer.Write(buffer, 2, 10);
175+
});
176+
}
177+
178+
[TestMethod]
179+
public void TestGetBuffer()
180+
{
181+
var ringBuffer = new RingBuffer(12); // 16 cap
182+
Assert.AreEqual(16, ringBuffer.GetBuffer().Length);
183+
ringBuffer = new RingBuffer(12, false); // 16 cap
184+
185+
ExceptionAssert.Throws<UnauthorizedAccessException>(() =>
186+
{
187+
ringBuffer.GetBuffer();
188+
});
189+
}
190+
191+
[TestMethod]
192+
public void TestBufferReuse()
193+
{
194+
var ringBuffer = new RingBuffer(12); // 16 cap
195+
var data = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
196+
ringBuffer.Write(data);
197+
ringBuffer.Read();
198+
ringBuffer.Write(data);
199+
var read = ringBuffer.Read();
200+
201+
Assert.AreEqual(10, read.Length);
202+
Assert.AreEqual(1, read[0]);
203+
Assert.AreEqual(10, read[9]);
204+
}
205+
206+
[TestMethod]
207+
public void TestGetAsync()
208+
{
209+
var ringBuffer = new RingBuffer(12); // 16 cap
210+
Assert.AreEqual(ringBuffer.SyncRoot, ringBuffer.SyncRoot);
211+
}
212+
213+
[TestMethod]
214+
public void TestCapacity()
215+
{
216+
var ringBuffer = new RingBuffer(18); // 32 cap
217+
Assert.AreEqual(32, ringBuffer.Capacity);
218+
}
219+
220+
[TestMethod]
221+
public void TestDispose()
222+
{
223+
var ringBuffer = new RingBuffer(18); // 32 cap
224+
var data = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
225+
ringBuffer.Write(data);
226+
ringBuffer.Flush();
227+
228+
Assert.AreEqual(0, ringBuffer.ReadableCapacity);
229+
Assert.AreEqual(32, ringBuffer.WriteableCapacity);
230+
231+
using (ringBuffer = new RingBuffer(18))
232+
{
233+
data = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
234+
ringBuffer.Write(data);
235+
}
236+
237+
Assert.AreEqual(0, ringBuffer.ReadableCapacity);
238+
Assert.AreEqual(32, ringBuffer.WriteableCapacity);
239+
}
240+
}
241+
}

0 commit comments

Comments
 (0)