namespace Cepis.Tests; /// The CSV reader behind the batch endpoint. public sealed class CsvTests { [Fact] public void ReadsTheHeaderAndOneRecord() { var rows = Csv.Parse("a,b,c\n1,2,3\n"); var row = Assert.Single(rows); Assert.Equal("1", row["a"]); Assert.Equal("2", row["b"]); Assert.Equal("3", row["c"]); } [Fact] public void AQuotedValueMayContainACommaAndANewline() { var rows = Csv.Parse("a,b\n\"Praça da Sé, lado ímpar\",\"two\nlines\"\n"); var row = Assert.Single(rows); Assert.Equal("Praça da Sé, lado ímpar", row["a"]); Assert.Equal("two\nlines", row["b"]); } [Fact] public void DoubledQuotesAreOneQuote() { var rows = Csv.Parse("a\n\"say \"\"hi\"\"\"\n"); Assert.Equal("say \"hi\"", Assert.Single(rows)["a"]); } [Theory] [InlineData("a,b\n1,2\n")] [InlineData("a,b\r\n1,2\r\n")] [InlineData("a,b\r1,2\r")] [InlineData("a,b\n1,2")] public void EveryLineEndingWorks(string text) { var rows = Csv.Parse(text); Assert.Equal("1", Assert.Single(rows)["a"]); } [Fact] public void ALeadingByteOrderMarkIsDropped() { var rows = Csv.Parse("\uFEFFa,b\n1,2\n"); Assert.Equal("1", Assert.Single(rows)["a"]); } [Fact] public void AnEmptyValueStaysEmpty() { var rows = Csv.Parse("a,b,c\n1,,3\n"); Assert.Equal("", Assert.Single(rows)["b"]); } [Fact] public void AShortRecordIsFilledOut() { var rows = Csv.Parse("a,b,c\n1\n"); var row = Assert.Single(rows); Assert.Equal("1", row["a"]); Assert.Equal("", row["b"]); Assert.Equal("", row["c"]); } [Fact] public void AHeaderAloneYieldsNoRecords() => Assert.Empty(Csv.Parse("a,b,c\n")); [Fact] public void AnEmptyDocumentYieldsNoRecords() => Assert.Empty(Csv.Parse("")); }