Skip to content

Commit 17864d2

Browse files
authored
Merge pull request #12 from rameel/add-stringbuffer-tests
Add tests for StringBuffer
2 parents 3cc242c + 013e94c commit 17864d2

2 files changed

Lines changed: 103 additions & 4 deletions

File tree

src/Ramstack.Parsing/Utilities/StringBuffer.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,16 +107,24 @@ ref MemoryMarshal.GetArrayDataReference(chars),
107107
[MethodImpl(MethodImplOptions.AggressiveInlining)]
108108
public override string ToString()
109109
{
110-
return ToStringImpl(_chars, _count);
110+
var chars = _chars;
111+
var count = _count;
112+
_chars = [];
113+
_count = 0;
114+
115+
return ToStringImpl(chars, count);
111116

112117
[MethodImpl(MethodImplOptions.NoInlining)]
113118
static string ToStringImpl(char[] buffer, int length)
114119
{
115-
var result = new string(buffer.AsSpan(0, length));
116-
if (buffer.Length != 0)
120+
if (buffer.Length != 0 && (uint)length <= (uint)buffer.Length)
121+
{
122+
var result = new string(buffer.AsSpan(0, length));
117123
ArrayPool<char>.Shared.Return(buffer);
124+
return result;
125+
}
118126

119-
return result;
127+
return "";
120128
}
121129
}
122130

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
namespace Ramstack.Parsing.Utilities;
2+
3+
[TestFixture]
4+
public class StringBufferTests
5+
{
6+
[Test]
7+
public void Ctor()
8+
{
9+
var sb = new StringBuffer();
10+
11+
Assert.That(sb.ToString(), Is.EqualTo(""));
12+
Assert.That(sb.Length, Is.EqualTo(0));
13+
}
14+
15+
[Test]
16+
public void Ctor_Capacity()
17+
{
18+
var sb = new StringBuffer(10);
19+
20+
Assert.That(sb.Length, Is.EqualTo(0));
21+
Assert.That(sb.ToString(), Is.EqualTo(""));
22+
}
23+
24+
[TestCase(-1)]
25+
[TestCase(-10)]
26+
[TestCase(int.MinValue)]
27+
[TestCase(-int.MaxValue)]
28+
public void Ctor_InvalidCapacity(int capacity) =>
29+
Assert.Throws<ArgumentOutOfRangeException>(() => _ = new StringBuffer(capacity));
30+
31+
[Test]
32+
public void Append_Char()
33+
{
34+
for (var count = 1; count <= 256; count++)
35+
{
36+
var sb = new StringBuffer();
37+
var expected = "";
38+
39+
for (var n = 1; n <= count; n++)
40+
{
41+
sb.Append('a');
42+
expected += 'a';
43+
44+
Assert.That(sb.Length, Is.EqualTo(n));
45+
}
46+
47+
Assert.That(sb.ToString(), Is.EqualTo(expected));
48+
}
49+
}
50+
51+
[TestCase("")]
52+
[TestCase("1")]
53+
[TestCase("12")]
54+
[TestCase("123456789")]
55+
public void Append_ReadOnlySpan(string text)
56+
{
57+
var sb = new StringBuffer();
58+
sb.Append(text);
59+
60+
Assert.That(sb.Length, Is.EqualTo(text.Length));
61+
Assert.That(sb.ToString(), Is.EqualTo(text));
62+
}
63+
64+
[Test]
65+
public void Append_LargeValue()
66+
{
67+
var a1 = new string('a', 50);
68+
var a2 = new string('b', 1000);
69+
70+
var sb = new StringBuffer();
71+
72+
sb.Append(a1);
73+
Assert.That(sb.Length, Is.EqualTo(a1.Length));
74+
75+
sb.Append(a2);
76+
Assert.That(sb.Length, Is.EqualTo(a1.Length + a2.Length));
77+
78+
Assert.That(sb.ToString(), Is.EqualTo(a1 + a2));
79+
}
80+
81+
[Test]
82+
public void FailOnLargeString()
83+
{
84+
Assert.Throws<OverflowException>(() =>
85+
{
86+
var sb = new StringBuffer();
87+
sb.Append(new char[2_000_000_000]);
88+
sb.Append(new char[500_000_000]);
89+
});
90+
}
91+
}

0 commit comments

Comments
 (0)