From c68275de9d29c3c6060eae2a519a4bc7452fb354 Mon Sep 17 00:00:00 2001 From: nmi Date: Tue, 30 Apr 2024 10:04:13 +0200 Subject: [PATCH 1/3] Define the contracts for mainstream API --- tests/ZString.Tests/StringBuilderTest.cs | 53 +++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/tests/ZString.Tests/StringBuilderTest.cs b/tests/ZString.Tests/StringBuilderTest.cs index 79c7274..daf5ea7 100644 --- a/tests/ZString.Tests/StringBuilderTest.cs +++ b/tests/ZString.Tests/StringBuilderTest.cs @@ -1,6 +1,6 @@ +using System; using Cysharp.Text; using FluentAssertions; -using System.Text; using Xunit; namespace ZStringTests @@ -22,5 +22,56 @@ public void Utf8DisposeTest() sb.Dispose(); sb.Dispose(); // call more than once } + + [Theory] + [InlineData("cucu", "mber")] + [InlineData("Choco", "pie")] + public void Append_WhenCalled_IsCorrect(string a, string b) + { + using var sut = ZString.CreateStringBuilder(); + sut.Append(a); + sut.Append(b); + + var result = sut.ToString(); + result.Should().Be($"{a}{b}"); + } + + [Theory] + [InlineData("cucu", "mber")] + [InlineData("Choco", "pie")] + public void Append_WhenChars_IsCorrect(string species, string b) + { + using var sut = ZString.CreateStringBuilder(); + sut.Append(species); + var chars = new ReadOnlySpan(b.ToCharArray()); + sut.Append(chars); + + var result = sut.ToString(); + result.Should().Be($"{species}{b}"); + } + + [Theory, InlineData("choco", "apple", "pie")] + public void Replace_WhenCalled_IsCorrect(string species, string alternative, string mainPart) + { + using var sut = ZString.CreateStringBuilder(); + sut.Append(species); + sut.Append(mainPart); + sut.Replace(species, alternative); + + var result = sut.ToString(); + result.Should().Be($"{alternative}{mainPart}"); + } + + [Theory, InlineData("choco", "apple", "pie")] + public void Insert_WhenCalled_IsCorrect(string species, string alternative, string mainPart) + { + using var sut = ZString.CreateStringBuilder(); + sut.Append(species); + sut.Append(mainPart); + sut.Insert(species.Length, alternative); + + var result = sut.ToString(); + result.Should().Be($"{species}{alternative}{mainPart}"); + } } } From cb20025c7eca01555b071e1df447014b58d15ece Mon Sep 17 00:00:00 2001 From: nmi Date: Tue, 30 Apr 2024 10:06:58 +0200 Subject: [PATCH 2/3] Prepare indexer zone --- tests/ZString.Tests/StringBuilderTest.cs | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tests/ZString.Tests/StringBuilderTest.cs b/tests/ZString.Tests/StringBuilderTest.cs index daf5ea7..e294285 100644 --- a/tests/ZString.Tests/StringBuilderTest.cs +++ b/tests/ZString.Tests/StringBuilderTest.cs @@ -73,5 +73,30 @@ public void Insert_WhenCalled_IsCorrect(string species, string alternative, stri var result = sut.ToString(); result.Should().Be($"{species}{alternative}{mainPart}"); } + + [Theory] + [InlineData("cat")] + [InlineData("dog")] + public void IndexerAlike_WhenCalled_IsCorrect(string body) + { + using var sut = ZString.CreateStringBuilder(); + sut.Append(body); + + var letter = sut.AsSpan()[1]; + letter.Should().Be(body[1]); + } + + [Theory] + [InlineData("cat")] + [InlineData("dog")] + public void IndexerAlike_WhenCalledOnLast_IsCorrect(string body) + { + using var sut = ZString.CreateStringBuilder(); + sut.Append(body); + + var index = body.Length - 1; + var letter = sut.AsSpan()[index]; + letter.Should().Be(body[index]); + } } } From b45b92948f22945881936b5bfc95dee76dea3353 Mon Sep 17 00:00:00 2001 From: nmi Date: Tue, 30 Apr 2024 10:19:13 +0200 Subject: [PATCH 3/3] Welcome indexer for Utf16 --- .../ZString/Utf16ValueStringBuilder.cs | 6 +++++ src/ZString/Utf16ValueStringBuilder.cs | 6 +++++ tests/ZString.Tests/StringBuilderTest.cs | 25 +++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/src/ZString.Unity/Assets/Scripts/ZString/Utf16ValueStringBuilder.cs b/src/ZString.Unity/Assets/Scripts/ZString/Utf16ValueStringBuilder.cs index df6ec3b..8fbcfe3 100644 --- a/src/ZString.Unity/Assets/Scripts/ZString/Utf16ValueStringBuilder.cs +++ b/src/ZString.Unity/Assets/Scripts/ZString/Utf16ValueStringBuilder.cs @@ -46,6 +46,12 @@ static Utf16ValueStringBuilder() /// Length of written buffer. public int Length => index; + + /// Gets a stored under + [IndexerName("Chars")] + // ReSharper disable once ParameterHidesMember - follow naming from StringBuilder to ease migration. + public char this[int index] => buffer![index]; + /// Get the written buffer data. public ReadOnlySpan AsSpan() => buffer.AsSpan(0, index); /// Get the written buffer data. diff --git a/src/ZString/Utf16ValueStringBuilder.cs b/src/ZString/Utf16ValueStringBuilder.cs index df6ec3b..8fbcfe3 100644 --- a/src/ZString/Utf16ValueStringBuilder.cs +++ b/src/ZString/Utf16ValueStringBuilder.cs @@ -46,6 +46,12 @@ static Utf16ValueStringBuilder() /// Length of written buffer. public int Length => index; + + /// Gets a stored under + [IndexerName("Chars")] + // ReSharper disable once ParameterHidesMember - follow naming from StringBuilder to ease migration. + public char this[int index] => buffer![index]; + /// Get the written buffer data. public ReadOnlySpan AsSpan() => buffer.AsSpan(0, index); /// Get the written buffer data. diff --git a/tests/ZString.Tests/StringBuilderTest.cs b/tests/ZString.Tests/StringBuilderTest.cs index e294285..d55bdc3 100644 --- a/tests/ZString.Tests/StringBuilderTest.cs +++ b/tests/ZString.Tests/StringBuilderTest.cs @@ -98,5 +98,30 @@ public void IndexerAlike_WhenCalledOnLast_IsCorrect(string body) var letter = sut.AsSpan()[index]; letter.Should().Be(body[index]); } + + [Theory] + [InlineData("cat")] + [InlineData("dog")] + public void Indexer_WhenCalled_IsCorrect(string body) + { + using var sut = ZString.CreateStringBuilder(); + sut.Append(body); + + var letter = sut[1]; + letter.Should().Be(body[1]); + } + + [Theory] + [InlineData("cat")] + [InlineData("dog")] + public void Indexer_WhenCalledOnLast_IsCorrect(string body) + { + using var sut = ZString.CreateStringBuilder(); + sut.Append(body); + + var index = body.Length - 1; + var letter = sut[index]; + letter.Should().Be(body[index]); + } } }