summaryrefslogtreecommitdiffstats
path: root/tests/Cepis.Tests/CsvTests.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/Cepis.Tests/CsvTests.cs')
-rw-r--r--tests/Cepis.Tests/CsvTests.cs79
1 files changed, 79 insertions, 0 deletions
diff --git a/tests/Cepis.Tests/CsvTests.cs b/tests/Cepis.Tests/CsvTests.cs
new file mode 100644
index 0000000..97a353f
--- /dev/null
+++ b/tests/Cepis.Tests/CsvTests.cs
@@ -0,0 +1,79 @@
+namespace Cepis.Tests;
+
+/// <summary>The CSV reader behind the batch endpoint.</summary>
+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(""));
+}