Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use collection literals #116

Merged
merged 3 commits into from
Mar 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -544,7 +544,7 @@ var expected = new (string Key, double Value)[] {
using var reader = Sep.Reader().FromText(text);
var actual = reader.Enumerate(
row => (row["Key"].ToString(), row["Value"].Parse<double>()))
.Where(kv => kv.Item1.StartsWith("B", StringComparison.Ordinal))
.Where(kv => kv.Item1.StartsWith('B'))
.ToArray();

CollectionAssert.AreEqual(expected, actual);
Expand Down
6 changes: 3 additions & 3 deletions src/Sep.Benchmarks/SepParseSeparatorsMaskBench.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ public unsafe class SepParseSeparatorsMaskBench

public SepParseSeparatorsMaskBench()
{
_masks = new MaskSpec[]
{
_masks =
[
new(0b0000_0000_0000_0000_0000_0000_0000_0100),
new(0b0000_0000_0000_0000_0000_0010_0000_0100),
new(0b0001_0000_0000_0100_0000_0010_0000_0100),
new(0b0001_0100_0100_0100_0100_0010_0010_0100),
};
];
Mask = _masks.First();
}

Expand Down
6 changes: 3 additions & 3 deletions src/Sep.Benchmarks/SepParserBench.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,15 @@ public SepParserBench()
new("Sequence", ';', FillSequence)
};
#else
_fillers = new FillerSpec[]
{
_fillers =
[
new("0_Assets___", ',', PackageAssetsText),
//new("1_Floats___", ';', FloatsText),
//new("1_ManyChars", ';', FillFor(";\n\r\"____;___\n___" + "\r___\"___####ˉˉˉˉ")),
//new("2_FewSep___", ';', FillFor("ˉˉ;ˉˉˉˉˉˉˉˉˉˉˉˉ;ˉˉˉˉˉˉˉˉˉˉˉ;ˉˉˉˉˉˉˉˉˉ;ˉˉˉˉˉ")),
//new("3_NoChars__", ';', FillFor("ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ")),
//new("4_FullSeps_", ';', FillFor(";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;")),
};
];
#endif
Parser = _parsers.First();
Filler = _fillers.First();
Expand Down
4 changes: 2 additions & 2 deletions src/Sep.Benchmarks/SepReaderBench.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public class SepReaderBench
int _floatIndex;
int _doubleIndex;
int[]? _colIndeces;
readonly string[] _colNames = new[] { C.SByte, C.Short, C.Int, C.Long, C.Float, C.Double };
readonly string[] _colNames = [C.SByte, C.Short, C.Int, C.Long, C.Float, C.Double];
SepReader? _enumerator;

[IterationSetup]
Expand All @@ -30,7 +30,7 @@ public void Setup()
_longIndex = _reader.Header.IndexOf(C.Long);
_floatIndex = _reader.Header.IndexOf(C.Float);
_doubleIndex = _reader.Header.IndexOf(C.Double);
_colIndeces = new[] { _sbyteIndex, _shortIndex, _intIndex, _longIndex, _floatIndex, _doubleIndex };
_colIndeces = [_sbyteIndex, _shortIndex, _intIndex, _longIndex, _floatIndex, _doubleIndex];
_enumerator = _reader.GetEnumerator();
}

Expand Down
10 changes: 5 additions & 5 deletions src/Sep.ComparisonBenchmarks/FloatsReaderBench.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,25 +23,25 @@ protected FloatsReaderBench(string scope, int lineCount)
{
Scope = scope;
Rows = lineCount;
_readers = new ReaderSpec[]
{
_readers =
[
ReaderSpec.FromString("String", new(() => T.GenerateText(Rows, FloatsCount))),
//ReaderSpec.FromBytes("Stream", new(() => T.GenerateBytes(Rows, FloatsCount))),
};
];
Reader = _readers.First();
}

[ParamsSource(nameof(ScopeParams))] // Attributes for params is challenging 👇
public string Scope { get; set; }
public IEnumerable<string> ScopeParams() => new[] { Scope };
public IEnumerable<string> ScopeParams() => [Scope];

[ParamsSource(nameof(Readers))]
public ReaderSpec Reader { get; set; }
public IEnumerable<ReaderSpec> Readers() => _readers;

[ParamsSource(nameof(RowsParams))] // Attributes for params is challenging 👇
public int Rows { get; set; }
public IEnumerable<int> RowsParams() => new[] { Rows };
public IEnumerable<int> RowsParams() => [Rows];
}

[BenchmarkCategory("0_Row")]
Expand Down
12 changes: 6 additions & 6 deletions src/Sep.ComparisonBenchmarks/PackageAssetsBench.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,29 +29,29 @@ protected PackageAssetsBench(string scope, int lineCount, bool quoteAroundSomeCo
Quotes = quoteAroundSomeCols;
Scope = scope;
Rows = lineCount;
_readers = new ReaderSpec[]
{
_readers =
[
ReaderSpec.FromString("String", new(() => PackageAssetsTestData.PackageAssets(quoteAroundSomeCols).GetString(Rows))),
//ReaderSpec.FromBytes("Stream", new(() => PackageAssetsTestData.PackageAssets(quoteAroundSomeCols).GetBytes(Rows))),
};
];
Reader = _readers.First();
}

[ParamsSource(nameof(ScopeParams))] // Attributes for params is challenging 👇
public string Scope { get; set; }
public IEnumerable<string> ScopeParams() => new[] { Scope };
public IEnumerable<string> ScopeParams() => [Scope];

[ParamsSource(nameof(QuotesParams))] // Attributes for params is challenging 👇
public bool Quotes { get; set; }
public IEnumerable<bool> QuotesParams() => new[] { Quotes };
public IEnumerable<bool> QuotesParams() => [Quotes];

[ParamsSource(nameof(Readers))]
public ReaderSpec Reader { get; set; }
public IEnumerable<ReaderSpec> Readers() => _readers;

[ParamsSource(nameof(RowsParams))] // Attributes for params is challenging 👇
public int Rows { get; set; }
public IEnumerable<int> RowsParams() => new[] { Rows };
public IEnumerable<int> RowsParams() => [Rows];
}

public class QuotesRowPackageAssetsBench : RowPackageAssetsBench
Expand Down
6 changes: 3 additions & 3 deletions src/Sep.Test/PackageAssetsTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ namespace nietras.SeparatedValues.Test;
[TestClass]
public class PackageAssetsTest
{
internal static IEnumerable<object[]> ToStrings => new object[][]
{
internal static IEnumerable<object[]> ToStrings =>
[
new[]{ SepToString.Direct },
new[]{ SepToString.OnePool() },
new[]{ SepToString.PoolPerCol() },
new[]{ SepToString.PoolPerColThreadSafe() },
new[]{ SepToString.PoolPerColThreadSafeFixedCapacity() },
};
];

[DataTestMethod]
[DynamicData(nameof(ToStrings))]
Expand Down
6 changes: 3 additions & 3 deletions src/Sep.Test/ReadMeTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ public void ReadMeTest_EnumerateWhere()
using var reader = Sep.Reader().FromText(text);
var actual = reader.Enumerate(
row => (row["Key"].ToString(), row["Value"].Parse<double>()))
.Where(kv => kv.Item1.StartsWith("B", StringComparison.Ordinal))
.Where(kv => kv.Item1.StartsWith('B'))
.ToArray();

CollectionAssert.AreEqual(expected, actual);
Expand Down Expand Up @@ -326,7 +326,7 @@ public void ReadMeTest_UpdateBenchmarksInMarkdown()
var readmeContents = $"{section}{Environment.NewLine}{Environment.NewLine}{benchmarkTable}{Environment.NewLine}";
all += readmeContents;
}
readmeLines = ReplaceReadmeLines(readmeLines, new[] { all }, readmeBefore, prefix, 0, readmeEndLine, 0);
readmeLines = ReplaceReadmeLines(readmeLines, [all], readmeBefore, prefix, 0, readmeEndLine, 0);
}

var newReadme = string.Join(Environment.NewLine, readmeLines) + Environment.NewLine;
Expand Down Expand Up @@ -392,7 +392,7 @@ public void ReadMeTest_PublicApi()

var readmeFilePath = s_readmeFilePath;
var readmeLines = File.ReadAllLines(readmeFilePath);
readmeLines = ReplaceReadmeLines(readmeLines, new[] { publicApi },
readmeLines = ReplaceReadmeLines(readmeLines, [publicApi],
"## Public API Reference", "```csharp", 1, "```", 0);

var newReadme = string.Join(Environment.NewLine, readmeLines) + Environment.NewLine;
Expand Down
14 changes: 7 additions & 7 deletions src/Sep.Test/SepHeaderTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,17 @@ public void SepHeaderTest_NotEmpty()

Assert.AreEqual(false, header.IsEmpty);
Assert.AreEqual(3, header.ColNames.Count);
AreEqual(new[] { "A", "B", "C" }, header.ColNames);
AreEqual(["A", "B", "C"], header.ColNames);

Assert.AreEqual(1, header.IndexOf("B"));
AreEqual(new[] { 2, 0, 1 }, header.IndicesOf("C", "A", "B"));
AreEqual(new[] { 1, 2, 0 }, header.IndicesOf(new[] { "B", "C", "A" }.AsSpan()));
AreEqual(new[] { 0, 2 }, header.IndicesOf((ReadOnlySpan<string>)new[] { "A", "C" }));
AreEqual(new[] { 2, 0 }, header.IndicesOf((IReadOnlyList<string>)new[] { "C", "A" }));
AreEqual([2, 0, 1], header.IndicesOf("C", "A", "B"));
AreEqual([1, 2, 0], header.IndicesOf(new[] { "B", "C", "A" }.AsSpan()));
AreEqual([0, 2], header.IndicesOf((ReadOnlySpan<string>)["A", "C"]));
AreEqual([2, 0], header.IndicesOf((IReadOnlyList<string>)["C", "A"]));

var actualIndices = new int[2];
header.IndicesOf((ReadOnlySpan<string>)new[] { "A", "C" }, actualIndices);
AreEqual(new int[] { 0, 2 }, actualIndices);
header.IndicesOf((ReadOnlySpan<string>)["A", "C"], actualIndices);
AreEqual([0, 2], actualIndices);

Assert.AreEqual("A;B;C", header.ToString());
}
Expand Down
18 changes: 9 additions & 9 deletions src/Sep.Test/SepParseMaskTest_ParseAnyCharsMask.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,47 +10,47 @@ public partial class SepParseMaskTest
[TestMethod]
public void SepParseMaskTest_ParseAnyCharsMask_Ordinary()
{
AssertParseAnyCharsMask(";a;b\r\n;", new[] { 0, 2, 4 },
AssertParseAnyCharsMask(";a;b\r\n;", [0, 2, 4],
rowLineEndingOffset: 0, expectedRowLineEndingOffset: 2,
lineNumber: 2, expectedLineNumber: 3);

AssertParseAnyCharsMask(";a;b\r;", new[] { 0, 2, 4 },
AssertParseAnyCharsMask(";a;b\r;", [0, 2, 4],
rowLineEndingOffset: 0, expectedRowLineEndingOffset: 1,
lineNumber: 2, expectedLineNumber: 3);

AssertParseAnyCharsMask(";a;b\n;", new[] { 0, 2, 4 },
AssertParseAnyCharsMask(";a;b\n;", [0, 2, 4],
rowLineEndingOffset: 0, expectedRowLineEndingOffset: 1,
lineNumber: 2, expectedLineNumber: 3);

AssertParseAnyCharsMask(";aa;bbb;cccc;;", new[] { 0, 3, 7, 12, 13 },
AssertParseAnyCharsMask(";aa;bbb;cccc;;", [0, 3, 7, 12, 13],
rowLineEndingOffset: 0, expectedRowLineEndingOffset: 0,
lineNumber: 2, expectedLineNumber: 2);

AssertParseAnyCharsMask(new string('a', s_nativeBitSize - 1) + "\r\n", new[] { s_nativeBitSize - 1 },
AssertParseAnyCharsMask(new string('a', s_nativeBitSize - 1) + "\r\n", [s_nativeBitSize - 1],
rowLineEndingOffset: 0, expectedRowLineEndingOffset: 2,
lineNumber: 2, expectedLineNumber: 3);
}

[TestMethod]
public void SepParseMaskTest_ParseAnyCharsMask_Quotes()
{
AssertParseAnyCharsMask(";\"a\r\nb\";\"c\"\r\n;", new[] { 0, 7, 11 },
AssertParseAnyCharsMask(";\"a\r\nb\";\"c\"\r\n;", [0, 7, 11],
rowLineEndingOffset: 0, expectedRowLineEndingOffset: 2,
lineNumber: 2, expectedLineNumber: 4);

AssertParseAnyCharsMask(";\"a\rb\";\"c\"\r;", new[] { 0, 6, 10 },
AssertParseAnyCharsMask(";\"a\rb\";\"c\"\r;", [0, 6, 10],
rowLineEndingOffset: 0, expectedRowLineEndingOffset: 1,
lineNumber: 2, expectedLineNumber: 4);

AssertParseAnyCharsMask(";\"a\nb\";\"c\"\n;", new[] { 0, 6, 10 },
AssertParseAnyCharsMask(";\"a\nb\";\"c\"\n;", [0, 6, 10],
rowLineEndingOffset: 0, expectedRowLineEndingOffset: 1,
lineNumber: 2, expectedLineNumber: 4);

AssertParseAnyCharsMask("\"" + new string('a', s_nativeBitSize - 2) + "\r\n", Array.Empty<int>(),
rowLineEndingOffset: 0, expectedRowLineEndingOffset: 0, expectedQuoting: 1,
lineNumber: 2, expectedLineNumber: 2); // Line number first increment when \n handled

AssertParseAnyCharsMask("\"" + new string('\r', s_nativeBitSize - 3) + "\"\r\n", new[] { s_nativeBitSize - 1 },
AssertParseAnyCharsMask("\"" + new string('\r', s_nativeBitSize - 3) + "\"\r\n", [s_nativeBitSize - 1],
rowLineEndingOffset: 0, expectedRowLineEndingOffset: 2,
lineNumber: 2, expectedLineNumber: 3 + s_nativeBitSize - 3);
}
Expand Down
10 changes: 5 additions & 5 deletions src/Sep.Test/SepParseMaskTest_ParseSeparatorsLineEndingsMasks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,23 @@ public partial class SepParseMaskTest
[TestMethod]
public void SepParseMaskTest_ParseSeparatorsLineEndingsMasks_Ordinary()
{
AssertParseSeparatorsLineEndingsMasks(";a;b\r\n;", new[] { 0, 2, 4 },
AssertParseSeparatorsLineEndingsMasks(";a;b\r\n;", [0, 2, 4],
expectedRowLineEndingOffset: 2,
lineNumber: 2, expectedLineNumber: 3);

AssertParseSeparatorsLineEndingsMasks("a;;b\r;", new[] { 1, 2, 4 },
AssertParseSeparatorsLineEndingsMasks("a;;b\r;", [1, 2, 4],
expectedRowLineEndingOffset: 1,
lineNumber: 2, expectedLineNumber: 3);

AssertParseSeparatorsLineEndingsMasks(";a;b\n;", new[] { 0, 2, 4 },
AssertParseSeparatorsLineEndingsMasks(";a;b\n;", [0, 2, 4],
expectedRowLineEndingOffset: 1,
lineNumber: 2, expectedLineNumber: 3);

AssertParseSeparatorsLineEndingsMasks(";aa;bbb;cccc;\n", new[] { 0, 3, 7, 12, 13 },
AssertParseSeparatorsLineEndingsMasks(";aa;bbb;cccc;\n", [0, 3, 7, 12, 13],
expectedRowLineEndingOffset: 1,
lineNumber: 2, expectedLineNumber: 3);

AssertParseSeparatorsLineEndingsMasks(new string('a', s_nativeBitSize - 1) + "\r\n", new[] { s_nativeBitSize - 1 },
AssertParseSeparatorsLineEndingsMasks(new string('a', s_nativeBitSize - 1) + "\r\n", [s_nativeBitSize - 1],
expectedRowLineEndingOffset: 2,
lineNumber: 2, expectedLineNumber: 3);
}
Expand Down
18 changes: 9 additions & 9 deletions src/Sep.Test/SepParseMaskTest_ParseSeparatorsMask.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,21 @@ sealed record Data(nuint Mask, int[] Expected);
public delegate ref int ParseSeparatorsMaskMethod(
nuint mask, int charsIndex, ref int colEndsRef);

static readonly Data[] s_data = new Data[]
{
new(0b0000_0000_0100_0001, new[] { 0, 6, }),
new(0b1000_1001_0100_0001, new[] { 0, 6, 8, 11, 15 }),
static readonly Data[] s_data =
[
new(0b0000_0000_0100_0001, [0, 6,]),
new(0b1000_1001_0100_0001, [0, 6, 8, 11, 15]),
new(nuint.MaxValue, Enumerable.Range(0, s_nativeBitSize).ToArray()),
// Empty mask will output index after mask, that is expected, check mask
// before calling parse mask. Some methods will not do the same since
// using PopCount.
// new(0, new[] { s_nativeBitSize }),
};
];

static IEnumerable<object[]> Methods => new object[][]
{
new object[] { new ParseSeparatorsMaskMethod(SepParseMask.ParseSeparatorsMask) },
};
static IEnumerable<object[]> Methods =>
[
[new ParseSeparatorsMaskMethod(SepParseMask.ParseSeparatorsMask)],
];

[TestMethod]
[DynamicData(nameof(Methods))]
Expand Down
38 changes: 19 additions & 19 deletions src/Sep.Test/SepParserTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -154,13 +154,13 @@ public void SepParserTest_ParseColEnds_Long(object parserObject)
var charsEnd = FillChars(";ˉ;ˉ\n\rˉ\";\";ˉˉ#ˉˉˉˉˉ\rˉˉˉˉ\nˉˉ\r\nˉ;ˉˉ\";\r\n\"ˉˉ,ˉ;ˉ.ˉ;ˉ\nˉˉ\rˉ");
var expectedSet = new Expected[]
{
new(new[]{ 0, 2, 4, }, NextStart : 5, RowLineEndingOffset: 1, 4),
new(new[]{ 5, }, NextStart : 6, RowLineEndingOffset: 1, 5),
new(new[]{ 10, 19 }, NextStart : 20, RowLineEndingOffset: 1, 6),
new(new[]{ 24 }, NextStart : 25, RowLineEndingOffset: 1, 7),
new(new[]{ 27 }, NextStart : 30, RowLineEndingOffset: 2, 8),
new(new[]{ 30, 42, 46, 48 }, NextStart : 49, RowLineEndingOffset: 1, 10),
new(new[]{ 51 }, NextStart : 52, RowLineEndingOffset: 1, 11),
new([0, 2, 4,], NextStart : 5, RowLineEndingOffset: 1, 4),
new([5,], NextStart : 6, RowLineEndingOffset: 1, 5),
new([10, 19], NextStart : 20, RowLineEndingOffset: 1, 6),
new([24], NextStart : 25, RowLineEndingOffset: 1, 7),
new([27], NextStart : 30, RowLineEndingOffset: 2, 8),
new([30, 42, 46, 48], NextStart : 49, RowLineEndingOffset: 1, 10),
new([51], NextStart : 52, RowLineEndingOffset: 1, 11),
//new(Array.Empty<int>(), charsEnd, RowLineEndingOffset: 0, 11),
};
AssertParserOutput(parser, charsStart: 0, charsEnd, expectedSet);
Expand All @@ -175,7 +175,7 @@ public void SepParserTest_ParseColEnds_Long_SeparatorsOnly(object parserObject)
var charsEnd = FillChars(";ˉ;ˉ;;ˉ;ˉ;;ˉˉ#ˉˉˉˉˉ;ˉˉˉˉ;ˉˉ;;ˉ;ˉ" + "ˉ;ˉˉˉ;ˉˉ,ˉ;ˉ.ˉ;ˉ;ˉˉˉ;");
var expectedSet = new Expected[]
{
new(new[]{ 0, 2, 4, 5, 7, 9, 10, 19, 24, 27, 28, 30, 33, 37, 42, 46, 48, 52 }, charsEnd, RowLineEndingOffset: 0, 3),
new([0, 2, 4, 5, 7, 9, 10, 19, 24, 27, 28, 30, 33, 37, 42, 46, 48, 52], charsEnd, RowLineEndingOffset: 0, 3),
};
AssertParserOutput(parser, charsStart: 0, charsEnd, expectedSet);
}
Expand All @@ -189,11 +189,11 @@ public void SepParserTest_ParseColEnds_Long_At_ParseStart(object parserObject)
var charsEnd = FillChars(";ˉ;ˉ\n\rˉ\"ˉ\";ˉˉ#ˉˉˉˉˉ\rˉˉˉˉ\nˉˉ\r\nˉ;ˉ" + "ˉ\"ˉˉˉ\"ˉˉ,ˉ;ˉ.ˉ;ˉ\nˉˉˉ\r");
var expectedSet = new Expected[]
{
new(new[]{ 10, 19 }, NextStart: 20, RowLineEndingOffset: 1, 4),
new(new[]{ 24 }, NextStart: 25, RowLineEndingOffset: 1, 5),
new(new[]{ 27 }, NextStart: 30, RowLineEndingOffset: 2, 6),
new(new[]{ 30, 42, 46, 48 }, NextStart: 49, RowLineEndingOffset: 1, 7),
new(new[]{ 52 }, charsEnd, RowLineEndingOffset: 1, 8),
new([10, 19], NextStart: 20, RowLineEndingOffset: 1, 4),
new([24], NextStart: 25, RowLineEndingOffset: 1, 5),
new([27], NextStart: 30, RowLineEndingOffset: 2, 6),
new([30, 42, 46, 48], NextStart: 49, RowLineEndingOffset: 1, 7),
new([52], charsEnd, RowLineEndingOffset: 1, 8),
};
AssertParserOutput(parser, charsStart: 7, charsEnd, expectedSet);
}
Expand All @@ -214,12 +214,12 @@ public void SepParserTest_ParseColEnds_Long_ColEndsAlmostFilled(object parserObj
var expected = new Expected(ends, nextStart, lineEndingOffset, 3 + lineEndingOffset);
var expectedSet = new Expected[] { expected };

var expectedOutput = new ExpectedOutput(new ExpectedParsedRow[] {
new(ColEnds: new[]{ 0, 10, 46, 83 }, LineNumberTo: 4),
new(ColEnds: new[]{ 83, 86 }, LineNumberTo: 5),
new(ColEnds: new[]{ 87, 89, 101, 105, 107 }, LineNumberTo: 6),
new(ColEnds: new[]{ 107, 111 }, LineNumberTo: 7),
}, new(ColEnds: new[] { 111 }, LineNumberTo: 7, CharsStartIndex: 112, ColEndsStartIndex: 13, ColCount: 0));
var expectedOutput = new ExpectedOutput([
new(ColEnds: [0, 10, 46, 83], LineNumberTo: 4),
new(ColEnds: [83, 86], LineNumberTo: 5),
new(ColEnds: [87, 89, 101, 105, 107], LineNumberTo: 6),
new(ColEnds: [107, 111], LineNumberTo: 7),
], new(ColEnds: [111], LineNumberTo: 7, CharsStartIndex: 112, ColEndsStartIndex: 13, ColCount: 0));

AssertOutput(parser, charsStart, charsEnd, expectedOutput);
}
Expand Down