Tests for CsvParser
This commit is contained in:
@@ -2,6 +2,7 @@ using CsvLib;
|
|||||||
|
|
||||||
namespace CvsLib;
|
namespace CvsLib;
|
||||||
|
|
||||||
|
[TestSubject(typeof(ByteArraySearcher))]
|
||||||
public class ByteArraySearcherTests
|
public class ByteArraySearcherTests
|
||||||
{
|
{
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using CsvLib;
|
|||||||
|
|
||||||
namespace CvsLib;
|
namespace CvsLib;
|
||||||
|
|
||||||
|
[TestSubject(typeof(CsvFieldIndexer))]
|
||||||
public class CsvFieldIndexerTests
|
public class CsvFieldIndexerTests
|
||||||
{
|
{
|
||||||
#region GenerateIndex
|
#region GenerateIndex
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="JetBrains.Annotations" Version="2023.3.0" />
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
|
||||||
<PackageReference Include="xunit" Version="2.4.2" />
|
<PackageReference Include="xunit" Version="2.4.2" />
|
||||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
|
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
|
||||||
|
|||||||
134
CsvLib.Tests/CsvParserTest.cs
Normal file
134
CsvLib.Tests/CsvParserTest.cs
Normal 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
|
||||||
|
}
|
||||||
@@ -1 +1,2 @@
|
|||||||
global using Xunit;
|
global using Xunit;
|
||||||
|
global using JetBrains.Annotations;
|
||||||
@@ -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;
|
_insideString = false;
|
||||||
_data = new List<List<string>>();
|
_data = new List<List<string>>();
|
||||||
_currentReg = null;
|
_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);
|
ParseLine(currentLine);
|
||||||
if (count > 0 && Data.Count == count)
|
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();
|
stream.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user