Tests for CsvParser

This commit is contained in:
2024-02-18 15:57:48 +01:00
parent 66536657e2
commit afcd404dfc
6 changed files with 152 additions and 11 deletions

View File

@@ -2,6 +2,7 @@ using CsvLib;
namespace CvsLib;
[TestSubject(typeof(ByteArraySearcher))]
public class ByteArraySearcherTests
{
[Fact]

View File

@@ -3,6 +3,7 @@ using CsvLib;
namespace CvsLib;
[TestSubject(typeof(CsvFieldIndexer))]
public class CsvFieldIndexerTests
{
#region GenerateIndex

View File

@@ -10,6 +10,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="JetBrains.Annotations" Version="2023.3.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">

View File

@@ -0,0 +1,134 @@
using CsvLib;
namespace CvsLib;
[TestSubject(typeof(CsvParser))]
public class CsvParserTest
{
#region Parse
[Fact]
public void Parse__Empty__Empty()
{
// --- Arrange
StringReader sr = new(string.Empty);
// --- Act
CsvParser parser = new();
parser.Parse(sr);
// --- Assert
Assert.Empty(parser.Data);
}
[Fact]
public void Parse__PlainText__OneRowOneColumn()
{
// --- Arrange
StringReader sr = new("Hello World");
// --- Act
CsvParser parser = new();
parser.Parse(sr);
// --- Assert
Assert.Single(parser.Data);
Assert.Single(parser.Data[0]);
Assert.Equal("Hello World", parser.Data[0][0]);
}
[Fact]
public void Parse__TwoLinesOfPainText__TwoRows()
{
// --- Arrange
StringReader sr = new(
"""
Hello World
Hello World
""");
// --- Act
CsvParser parser = new();
parser.Parse(sr);
// --- Assert
Assert.Equal(2, parser.Data.Count);
Assert.Single(parser.Data[0]);
Assert.Equal("Hello World", parser.Data[0][0]);
Assert.Single(parser.Data[1]);
Assert.Equal("Hello World", parser.Data[1][0]);
}
[Fact]
public void Parse__TwoLinesOfQuotedText__TwoRows()
{
// --- Arrange
StringReader sr = new(
"""
"Hello World"
"Hello World"
""");
// --- Act
CsvParser parser = new();
parser.Parse(sr);
// --- Assert
Assert.Equal(2, parser.Data.Count);
Assert.Single(parser.Data[0]);
Assert.Equal("Hello World", parser.Data[0][0]);
Assert.Single(parser.Data[1]);
Assert.Equal("Hello World", parser.Data[1][0]);
}
[Fact]
public void Parse__TwoLinesWithTwoQuotedColumns__TwoRowsTwoFields()
{
// --- Arrange
StringReader sr = new(
"""
"Hello","World"
"Hello","World"
""");
// --- Act
CsvParser parser = new();
parser.Parse(sr);
// --- Assert
Assert.Equal(2, parser.Data.Count);
Assert.Equal(2, parser.Data[0].Count);
Assert.Equal("Hello", parser.Data[0][0]);
Assert.Equal("World", parser.Data[0][1]);
Assert.Equal(2, parser.Data[1].Count);
Assert.Equal("Hello", parser.Data[1][0]);
Assert.Equal("World", parser.Data[1][1]);
}
[Fact]
public void GenerateIndex__TwoLinesWithTwoQuotedColumnsWithUnicode__TwoRowsTwoFields()
{
// --- Arrange
StringReader sr = new(
"""
"Hélló","Wórld"
"Hélló","Wórld"
""");
// --- Act
CsvParser parser = new();
parser.Parse(sr);
// --- Assert
Assert.Equal(2, parser.Data.Count);
Assert.Equal(2, parser.Data[0].Count);
Assert.Equal("Hélló", parser.Data[0][0]);
Assert.Equal("Wórld", parser.Data[0][1]);
Assert.Equal(2, parser.Data[1].Count);
Assert.Equal("Hélló", parser.Data[1][0]);
Assert.Equal("Wórld", parser.Data[1][1]);
}
#endregion Parse
}

View File

@@ -1 +1,2 @@
global using Xunit;
global using JetBrains.Annotations;

View File

@@ -77,24 +77,27 @@ public class CsvParser
}
}
public void ParseFile(string file, long offset = 0, int count = 0)
public void Parse(TextReader reader, int count = 0)
{
_insideString = false;
_data = new List<List<string>>();
_currentReg = null;
FileStream stream = new(file, FileMode.Open);
stream.Seek(offset, SeekOrigin.Begin);
using (StreamReader reader = new(stream, Encoding.Default, true, 4096))
while (reader.ReadLine() is { } currentLine)
{
while (reader.ReadLine() is { } currentLine)
ParseLine(currentLine);
if (count > 0 && _data.Count == count)
{
ParseLine(currentLine);
if (count > 0 && Data.Count == count)
{
break;
}
break;
}
}
}
public void ParseFile(string file, long offset = 0, int count = 0)
{
FileStream stream = new(file, FileMode.Open);
stream.Seek(offset, SeekOrigin.Begin);
using StreamReader reader = new(stream, Encoding.Default, true, 4096);
Parse(reader, count);
stream.Close();
}