Skip to content

Commit

Permalink
Use collection literals (#116)
Browse files Browse the repository at this point in the history
  • Loading branch information
nietras committed Mar 31, 2024
1 parent 204c19e commit f593e97
Show file tree
Hide file tree
Showing 24 changed files with 225 additions and 226 deletions.
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

0 comments on commit f593e97

Please sign in to comment.