Skip to content

Commit 7f82d6b

Browse files
committed
.
1 parent 02dfffa commit 7f82d6b

File tree

2 files changed

+35
-26
lines changed

2 files changed

+35
-26
lines changed

src/Verify.Tests/LinesScrubberTests.cs

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public void FilterLines_RemovesSingleLine()
8383
{
8484
var builder = new StringBuilder("line1\nline2\nline3");
8585

86-
builder.FilterLines(line => line == "line2");
86+
builder.FilterLines(line => line is "line2");
8787

8888
Assert.Equal("line1\nline3", builder.ToString());
8989
}
@@ -154,7 +154,7 @@ public void FilterLines_PreservesTrailingNewline()
154154
{
155155
var builder = new StringBuilder("line1\nline2\n");
156156

157-
builder.FilterLines(line => line == "line2");
157+
builder.FilterLines(line => line is "line2");
158158

159159
Assert.Equal("line1\n", builder.ToString());
160160
}
@@ -164,7 +164,7 @@ public void FilterLines_DoesNotAddTrailingNewlineWhenOriginalLacked()
164164
{
165165
var builder = new StringBuilder("line1\nline2");
166166

167-
builder.FilterLines(line => line == "line1");
167+
builder.FilterLines(line => line is "line1");
168168

169169
Assert.Equal("line2", builder.ToString());
170170
}
@@ -174,7 +174,7 @@ public void FilterLines_HandlesEmptyLines()
174174
{
175175
var builder = new StringBuilder("line1\n\nline3");
176176

177-
builder.FilterLines(string.IsNullOrEmpty);
177+
builder.FilterLines(line => line.Length == 0);
178178

179179
Assert.Equal("line1\nline3", builder.ToString());
180180
}
@@ -184,7 +184,7 @@ public void FilterLines_KeepsEmptyLines()
184184
{
185185
var builder = new StringBuilder("line1\n\nline3");
186186

187-
builder.FilterLines(line => line == "line1");
187+
builder.FilterLines(line => line is "line1");
188188

189189
Assert.Equal("\nline3", builder.ToString());
190190
}
@@ -204,7 +204,7 @@ public void FilterLines_RemovesFirstLine()
204204
{
205205
var builder = new StringBuilder("remove\nkeep1\nkeep2");
206206

207-
builder.FilterLines(line => line == "remove");
207+
builder.FilterLines(line => line is "remove");
208208

209209
Assert.Equal("keep1\nkeep2", builder.ToString());
210210
}
@@ -214,7 +214,7 @@ public void FilterLines_RemovesLastLine()
214214
{
215215
var builder = new StringBuilder("keep1\nkeep2\nremove");
216216

217-
builder.FilterLines(line => line == "remove");
217+
builder.FilterLines(line => line is "remove");
218218

219219
Assert.Equal("keep1\nkeep2", builder.ToString());
220220
}
@@ -224,7 +224,7 @@ public void FilterLines_RemovesLastLineWithTrailingNewline()
224224
{
225225
var builder = new StringBuilder("keep1\nkeep2\nremove\n");
226226

227-
builder.FilterLines(line => line == "remove");
227+
builder.FilterLines(line => line is "remove");
228228

229229
Assert.Equal("keep1\nkeep2\n", builder.ToString());
230230
}
@@ -234,7 +234,19 @@ public void FilterLines_ComplexPredicate()
234234
{
235235
var builder = new StringBuilder("abc123\ndef456\nghi789\njkl012");
236236

237-
builder.FilterLines(line => line.Any(char.IsDigit) && line.Contains('4'));
237+
builder.FilterLines(line =>
238+
{
239+
var hasDigit = false;
240+
foreach (var c in line)
241+
{
242+
if (char.IsDigit(c))
243+
{
244+
hasDigit = true;
245+
break;
246+
}
247+
}
248+
return hasDigit && line.Contains('4');
249+
});
238250

239251
Assert.Equal("abc123\nghi789\njkl012", builder.ToString());
240252
}
@@ -244,7 +256,7 @@ public void FilterLines_WindowsLineEndings()
244256
{
245257
var builder = new StringBuilder("line1\r\nline2\r\nline3");
246258

247-
builder.FilterLines(line => line == "line2");
259+
builder.FilterLines(line => line is "line2");
248260

249261
// Note: StringReader normalizes \r\n to \n
250262
Assert.Equal("line1\nline3", builder.ToString());
@@ -255,7 +267,7 @@ public void FilterLines_MixedLineEndings()
255267
{
256268
var builder = new StringBuilder("line1\nline2\r\nline3");
257269

258-
builder.FilterLines(line => line == "line2");
270+
builder.FilterLines(line => line is "line2");
259271

260272
Assert.Equal("line1\nline3", builder.ToString());
261273
}
@@ -266,7 +278,7 @@ public void FilterLines_LargeContent()
266278
var lines = Enumerable.Range(1, 1000).Select(i => $"line{i}");
267279
var builder = new StringBuilder(string.Join('\n', lines));
268280

269-
builder.FilterLines(line => int.Parse(line[4..]) % 2 == 0);
281+
builder.FilterLines(line => int.Parse(line.Slice(4)) % 2 == 0);
270282

271283
var remaining = builder.ToString().Split('\n');
272284
Assert.Equal(500, remaining.Length);
@@ -278,7 +290,7 @@ public void FilterLines_PreservesWhitespace()
278290
{
279291
var builder = new StringBuilder(" line1 \n\t line2\t\nline3 ");
280292

281-
builder.FilterLines(line => line.Trim() == "line2");
293+
builder.FilterLines(line => line.Trim() is "line2");
282294

283295
Assert.Equal(" line1 \nline3 ", builder.ToString());
284296
}

src/Verify/Extensions.cs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -157,27 +157,24 @@ public static string NameWithParent(this Type type)
157157

158158
public static void FilterLines(this StringBuilder input, RemoveLine removeLine)
159159
{
160-
if (input.Length == 0)
161-
{
162-
return;
163-
}
164-
165-
var span = input.AsSpan();
166-
var hasTrailingNewline = span[^1] == '\n';
167-
160+
var theString = input.ToString();
161+
using var reader = new StringReader(theString);
168162
input.Clear();
169163

170-
foreach (var line in span.EnumerateLines())
164+
while (reader.ReadLine() is { } line)
171165
{
172-
if (!removeLine(line))
166+
if (removeLine(line))
173167
{
174-
input.AppendLineN(line);
168+
continue;
175169
}
170+
171+
input.AppendLineN(line);
176172
}
177173

178-
if (input.Length > 0 && !hasTrailingNewline)
174+
var endsWithNewLine = theString.EndsWith('\n');
175+
if (input.Length > 0 && !endsWithNewLine)
179176
{
180-
input.Length--;
177+
input.Length -= 1;
181178
}
182179
}
183180

0 commit comments

Comments
 (0)