summaryrefslogtreecommitdiff
path: root/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing
diff options
context:
space:
mode:
Diffstat (limited to 'ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing')
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/BadDataTests.cs153
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/BufferSplittingEscapeAndQuoteTests.cs38
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/BufferSplittingLineEndingTests.cs98
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/BufferSplittingNewLineEndingTests.cs102
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/ByteCountTests.cs137
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/CharCountTests.cs124
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/CommentTests.cs125
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/CrTests.cs235
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/CsvModeTests.cs109
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/DelimiterTests.cs81
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/DetectDelimiterTests.cs286
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/EndBufferTests.cs79
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/EscapeCharacterTests.cs110
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/ExcelCompatibilityTests.cs123
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/FieldCacheTests.cs94
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/MaxFieldSizeTests.cs50
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/NewLineTests.cs176
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/RefillingTextReaderTests.cs59
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/TrimTests.cs1206
19 files changed, 3385 insertions, 0 deletions
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/BadDataTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/BadDataTests.cs
new file mode 100644
index 0000000..8f6ccb4
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/BadDataTests.cs
@@ -0,0 +1,153 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using System;
+using System.Globalization;
+using System.IO;
+using CsvHelper.Configuration;
+using Xunit;
+
+namespace CsvHelper.Tests.Parsing
+{
+
+ public class BadDataTests
+ {
+ [Fact]
+ public void CallbackTest()
+ {
+ string rawRecord = null;
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BadDataFound = args => rawRecord = args.Context.Parser.RawRecord.ToString(),
+ };
+ using (var stream = new MemoryStream())
+ using (var reader = new StreamReader(stream))
+ using (var writer = new StreamWriter(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ writer.Write(" a\"bc\",d\r\n"); // a"bc",d\r\n
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+ var record = parser.Record;
+ Assert.Equal(" a\"bc\",d\r\n", rawRecord);
+
+ rawRecord = null;
+ parser.Read();
+ record = parser.Record;
+ Assert.Null(rawRecord);
+ }
+ }
+
+ [Fact]
+ public void ThrowExceptionTest()
+ {
+ using (var stream = new MemoryStream())
+ using (var reader = new StreamReader(stream))
+ using (var writer = new StreamWriter(stream))
+ using (var parser = new CsvParser(reader, CultureInfo.InvariantCulture))
+ {
+ writer.WriteLine("1,2");
+ writer.WriteLine(" a\"bc\",d");
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+ try
+ {
+ parser.Read();
+ var record = parser.Record;
+ throw new XUnitException("Failed to throw exception on bad data.");
+ }
+ catch (BadDataException) { }
+ }
+ }
+
+ [Fact]
+ public void IgnoreQuotesTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Mode = CsvMode.Escape,
+ Escape = '\\',
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ writer.Write("one,2\"two,three\n");
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("2\"two", parser[1]);
+ }
+ }
+
+ [Fact]
+ public void LineBreakInQuotedFieldIsBadDataCrTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ LineBreakInQuotedFieldIsBadData = true,
+ };
+ using (var reader = new StringReader("\"a\rb\""))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ Assert.Throws<BadDataException>(() => parser.Record);
+ }
+ }
+
+ [Fact]
+ public void LineBreakInQuotedFieldIsBadDataLfTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ LineBreakInQuotedFieldIsBadData = true,
+ };
+ using (var reader = new StringReader("\"a\nb\""))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ Assert.Throws<BadDataException>(() => parser.Record);
+ }
+ }
+
+ [Fact]
+ public void LineBreakInQuotedFieldIsBadDataCrLfTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ LineBreakInQuotedFieldIsBadData = true,
+ };
+ using (var reader = new StringReader("\"a\r\nb\""))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ Assert.Throws<BadDataException>(() => parser.Record);
+ }
+ }
+
+ [Fact]
+ public void Read_AccessingParserRecordInBadDataFound_ThrowsParserException()
+ {
+ var badstring = new StringReader("Fish,\"DDDD");
+
+ string[] record = new string[0];
+ var cfg = new CsvConfiguration(CultureInfo.CurrentCulture)
+ {
+ BadDataFound = args => record = args.Context.Parser.Record
+ };
+ var parser = new CsvParser(badstring, cfg);
+
+ parser.Read();
+
+ Assert.Throws<ParserException>(() => parser[1]);
+ }
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/BufferSplittingEscapeAndQuoteTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/BufferSplittingEscapeAndQuoteTests.cs
new file mode 100644
index 0000000..007df34
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/BufferSplittingEscapeAndQuoteTests.cs
@@ -0,0 +1,38 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using CsvHelper.Configuration;
+using Xunit;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CsvHelper.Tests.Parsing
+{
+
+ public class BufferSplittingEscapeAndQuoteTests
+ {
+ [Fact]
+ public void Read_BufferEndsAtEscape_FieldIsNotBadData()
+ {
+ var s = new StringBuilder();
+ s.Append("a,\"bcdefghijklm\"\"nopqrstuvwxyz\"\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BufferSize = 16,
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ Assert.Equal("a", parser[0]);
+ Assert.Equal("bcdefghijklm\"nopqrstuvwxyz", parser[1]);
+ }
+ }
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/BufferSplittingLineEndingTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/BufferSplittingLineEndingTests.cs
new file mode 100644
index 0000000..c4457f4
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/BufferSplittingLineEndingTests.cs
@@ -0,0 +1,98 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using System.Globalization;
+using System.IO;
+using System.Text;
+using Xunit;
+
+namespace CsvHelper.Tests.Parsing
+{
+
+ public class BufferSplittingLineEndingTests
+ {
+ [Fact]
+ public void Read_BufferSplitsCrLf_BufferNeedsResize_Parses()
+ {
+ var s = new StringBuilder();
+ s.Append("1,0000000000321\r\n");
+ s.Append("3,4\r\n");
+ var config = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BufferSize = 16,
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("0000000000321", parser[1]);
+ }
+ }
+
+ [Fact]
+ public void Read_BufferSplitsCrLf_NoBufferResize_DoesntAddExtraField()
+ {
+ var s = new StringBuilder();
+ s.Append("1,200000\r\n");
+ s.Append("3,400000\r\n");
+ s.Append("5,600\r\n");
+ var config = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BufferSize = 16,
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ parser.Read();
+ parser.Read();
+ Assert.Equal(2, parser.Count);
+ }
+ }
+
+ [Fact]
+ public void Read_BufferSplitsCrLf_NoBufferResize_RawRecordIsCorrect()
+ {
+ var s = new StringBuilder();
+ s.Append("1,200000\r\n");
+ s.Append("3,400000\r\n");
+ s.Append("5,600\r\n");
+ var config = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BufferSize = 16,
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ parser.Read();
+ parser.Read();
+ Assert.Equal("5,600\r\n", parser.RawRecord);
+ }
+ }
+
+ [Fact]
+ public void BufferSplitsCrLfWithLastFieldQuotedTest()
+ {
+ var s = new StringBuilder();
+ s.Append("1,200000\r\n");
+ s.Append("3,4000\r\n");
+ s.Append("5,\"600\"\r\n");
+ var config = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BufferSize = 16,
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ parser.Read();
+ parser.Read();
+ Assert.Equal(2, parser.Count);
+ Assert.Equal("5,\"600\"\r\n", parser.RawRecord);
+ }
+ }
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/BufferSplittingNewLineEndingTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/BufferSplittingNewLineEndingTests.cs
new file mode 100644
index 0000000..a3d40b4
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/BufferSplittingNewLineEndingTests.cs
@@ -0,0 +1,102 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using System.Globalization;
+using System.IO;
+using System.Text;
+using Xunit;
+
+namespace CsvHelper.Tests.Parsing
+{
+
+ public class BufferSplittingCrLnTests
+ {
+ [Fact]
+ public void Read_BufferSplitsCrLf_BufferNeedsResize_Parses()
+ {
+ var s = new StringBuilder();
+ s.Append("1,0000000000321\r\n");
+ s.Append("3,4\r\n");
+ var config = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BufferSize = 16,
+ NewLine = "\r\n",
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("0000000000321", parser[1]);
+ }
+ }
+
+ [Fact]
+ public void Read_BufferSplitsCrLf_NoBufferResize_DoesntAddExtraField()
+ {
+ var s = new StringBuilder();
+ s.Append("1,200000\r\n");
+ s.Append("3,400000\r\n");
+ s.Append("5,600\r\n");
+ var config = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BufferSize = 16,
+ NewLine = "\r\n",
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ parser.Read();
+ parser.Read();
+ Assert.Equal(2, parser.Count);
+ }
+ }
+
+ [Fact]
+ public void Read_BufferSplitsCrLf_NoBufferResize_RawRecordIsCorrect()
+ {
+ var s = new StringBuilder();
+ s.Append("1,200000\r\n");
+ s.Append("3,400000\r\n");
+ s.Append("5,600\r\n");
+ var config = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BufferSize = 16,
+ NewLine = "\r\n",
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ parser.Read();
+ parser.Read();
+ Assert.Equal("5,600\r\n", parser.RawRecord);
+ }
+ }
+
+ [Fact]
+ public void BufferSplitsCrLfWithLastFieldQuotedTest()
+ {
+ var s = new StringBuilder();
+ s.Append("1,200000\r\n");
+ s.Append("3,4000\r\n");
+ s.Append("5,\"600\"\r\n");
+ var config = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BufferSize = 16,
+ NewLine = "\r\n",
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ parser.Read();
+ parser.Read();
+ Assert.Equal(2, parser.Count);
+ Assert.Equal("5,\"600\"\r\n", parser.RawRecord);
+ }
+ }
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/ByteCountTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/ByteCountTests.cs
new file mode 100644
index 0000000..dc3bd8d
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/ByteCountTests.cs
@@ -0,0 +1,137 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using CsvHelper.Configuration;
+using Xunit;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CsvHelper.Tests.Parsing
+{
+
+ public class ByteCountTests
+ {
+ [Fact]
+ public void Read_CRLF_CharCountCorrect()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Encoding = Encoding.Unicode,
+ CountBytes = true,
+ };
+ var s = new StringBuilder();
+ s.Append("1,2\r\n");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(config.Encoding.GetByteCount(s.ToString()), parser.ByteCount);
+ }
+ }
+
+ [Fact]
+ public void Read_CR_CharCountCorrect()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Encoding = Encoding.Unicode,
+ CountBytes = true,
+ };
+ var s = new StringBuilder();
+ s.Append("1,2\r");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(config.Encoding.GetByteCount(s.ToString()), parser.ByteCount);
+ }
+ }
+
+ [Fact]
+ public void Read_LF_CharCountCorrect()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Encoding = Encoding.Unicode,
+ CountBytes = true,
+ };
+ var s = new StringBuilder();
+ s.Append("1,2\n");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(config.Encoding.GetByteCount(s.ToString()), parser.ByteCount);
+ }
+ }
+
+ [Fact]
+ public void Read_NoLineEnding_CharCountCorrect()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Encoding = Encoding.Unicode,
+ CountBytes = true,
+ };
+ var s = new StringBuilder();
+ s.Append("1,2");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(config.Encoding.GetByteCount(s.ToString()), parser.ByteCount);
+ }
+ }
+
+ [Fact]
+ public void CharCountFirstCharOfDelimiterNextToDelimiterTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Encoding = Encoding.Unicode,
+ CountBytes = true,
+ Delimiter = "!#",
+ };
+ var s = new StringBuilder();
+ s.Append("1!!#2\r\n");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(config.Encoding.GetByteCount(s.ToString()), parser.ByteCount);
+ }
+ }
+
+ [Fact]
+ public void Read_Trimmed_WhiteSpaceCorrect()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Encoding = Encoding.Unicode,
+ CountBytes = true,
+ TrimOptions = TrimOptions.Trim
+ };
+ var s = new StringBuilder();
+ s.Append("1, 2\r\n");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(config.Encoding.GetByteCount(s.ToString()), parser.ByteCount);
+ }
+ }
+
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/CharCountTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/CharCountTests.cs
new file mode 100644
index 0000000..06b469e
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/CharCountTests.cs
@@ -0,0 +1,124 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using CsvHelper.Configuration;
+using Xunit;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CsvHelper.Tests.Parsing
+{
+
+ public class CharCountTests
+ {
+ [Fact]
+ public void Read_CRLF_CharCountCorrect()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ };
+ var s = new StringBuilder();
+ s.Append("1,2\r\n");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(5, parser.CharCount);
+ }
+ }
+
+ [Fact]
+ public void Read_CR_CharCountCorrect()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ };
+ var s = new StringBuilder();
+ s.Append("1,2\r");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(4, parser.CharCount);
+ }
+ }
+
+ [Fact]
+ public void Read_LF_CharCountCorrect()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ };
+ var s = new StringBuilder();
+ s.Append("1,2\n");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(4, parser.CharCount);
+ }
+ }
+
+ [Fact]
+ public void Read_NoLineEnding_CharCountCorrect()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ };
+ var s = new StringBuilder();
+ s.Append("1,2");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(3, parser.CharCount);
+ }
+ }
+
+ [Fact]
+ public void CharCountFirstCharOfDelimiterNextToDelimiterTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Delimiter = "!#",
+ };
+ var s = new StringBuilder();
+ s.Append("1!!#2\r\n");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(7, parser.CharCount);
+ }
+ }
+
+ [Fact]
+ public void Read_Trimmed_WhiteSpaceCorrect()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim
+ };
+ var s = new StringBuilder();
+ s.Append("1, 2");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(4, parser.CharCount);
+ }
+ }
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/CommentTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/CommentTests.cs
new file mode 100644
index 0000000..cd4db53
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/CommentTests.cs
@@ -0,0 +1,125 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using System.Globalization;
+using System.IO;
+using CsvHelper.Configuration;
+using Xunit;
+
+namespace CsvHelper.Tests.Parsing
+{
+
+ public class CommentTests
+ {
+ [Fact]
+ public void CommentThatCrossesBuffersShouldNotAddToFieldTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ AllowComments = true,
+ BufferSize = 16
+ };
+ using (var stream = new MemoryStream())
+ using (var reader = new StreamReader(stream))
+ using (var writer = new StreamWriter(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ writer.Write("1,2\r\n");
+ writer.Write("#abcdefghijklmnop\r\n");
+ writer.Write("3,4");
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+ parser.Read();
+ Assert.Equal("3", parser[0]);
+ Assert.Equal("4", parser[1]);
+ }
+ }
+
+ [Fact]
+ public void WriteCommentCharInFieldWithCommentsOffTest()
+ {
+ using (var stream = new MemoryStream())
+ using (var reader = new StreamReader(stream))
+ using (var writer = new StreamWriter(stream))
+ using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
+ {
+ csv.WriteField("#no comment");
+ csv.NextRecord();
+ writer.Flush();
+ stream.Position = 0;
+
+ var result = reader.ReadToEnd();
+
+ Assert.Equal("#no comment\r\n", result);
+ }
+ }
+
+ [Fact]
+ public void WriteCommentCharInFieldWithCommentsOnTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ AllowComments = true,
+ };
+ using (var stream = new MemoryStream())
+ using (var reader = new StreamReader(stream))
+ using (var writer = new StreamWriter(stream))
+ using (var csv = new CsvWriter(writer, config))
+ {
+ csv.WriteField("#no comment");
+ csv.NextRecord();
+ writer.Flush();
+ stream.Position = 0;
+
+ var result = reader.ReadToEnd();
+
+ Assert.Equal("#no comment\r\n", result);
+ }
+ }
+
+ [Fact]
+ public void WriteCommentWithCommentsOffTest()
+ {
+ using (var stream = new MemoryStream())
+ using (var reader = new StreamReader(stream))
+ using (var writer = new StreamWriter(stream))
+ using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
+ {
+ csv.WriteComment("comment\"has\" quote");
+ csv.NextRecord();
+ writer.Flush();
+ stream.Position = 0;
+
+ var result = reader.ReadToEnd();
+
+ Assert.Equal("#comment\"has\" quote\r\n", result);
+ }
+ }
+
+ [Fact]
+ public void WriteCommentWithCommentsOnTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ AllowComments = true,
+ };
+ using (var stream = new MemoryStream())
+ using (var reader = new StreamReader(stream))
+ using (var writer = new StreamWriter(stream))
+ using (var csv = new CsvWriter(writer, config))
+ {
+ csv.WriteComment("comment\"has\" quote");
+ csv.NextRecord();
+ writer.Flush();
+ stream.Position = 0;
+
+ var result = reader.ReadToEnd();
+
+ Assert.Equal("#comment\"has\" quote\r\n", result);
+ }
+ }
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/CrTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/CrTests.cs
new file mode 100644
index 0000000..e14d619
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/CrTests.cs
@@ -0,0 +1,235 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using Xunit;
+using System.Globalization;
+using System.IO;
+using System.Text;
+
+namespace CsvHelper.Tests.Parsing
+{
+
+ public class CrTests
+ {
+ [Fact]
+ public void SingleFieldAndSingleRowTest()
+ {
+ var s = new StringBuilder();
+ s.Append("1\r");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, CultureInfo.InvariantCulture))
+ {
+ parser.Read();
+ Assert.Equal("1", parser[0]);
+ }
+ }
+
+ [Fact]
+ public void SingleFieldAndSingleRowAndFieldIsQuotedTest()
+ {
+ var s = new StringBuilder();
+ s.Append("\"1\"\r");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, CultureInfo.InvariantCulture))
+ {
+ parser.Read();
+ Assert.Equal("1", parser[0]);
+ }
+ }
+
+ [Fact]
+ public void SingleFieldAndMultipleRowsAndFirstFieldInFirstRowIsQuotedAndNoLineEndingTest()
+ {
+ var s = new StringBuilder();
+ s.Append("\"1\"\r");
+ s.Append("2");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, CultureInfo.InvariantCulture))
+ {
+ parser.Read();
+ Assert.Equal("1", parser[0]);
+
+ parser.Read();
+ Assert.Equal("2", parser[0]);
+ }
+ }
+
+ [Fact]
+ public void SingleFieldAndMultipleRowsAndFirstFieldInFirstRowIsQuotedAndHasLineEndingTest()
+ {
+ var s = new StringBuilder();
+ s.Append("\"1\"\r");
+ s.Append("2\r");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, CultureInfo.InvariantCulture))
+ {
+ parser.Read();
+ Assert.Equal("1", parser[0]);
+
+ parser.Read();
+ Assert.Equal("2", parser[0]);
+ }
+ }
+
+ [Fact]
+ public void SingleFieldAndMultipleRowsTest()
+ {
+ var s = new StringBuilder();
+ s.Append("1\r");
+ s.Append("2\r");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, CultureInfo.InvariantCulture))
+ {
+ parser.Read();
+ Assert.Equal("1", parser[0]);
+
+ parser.Read();
+ Assert.Equal("2", parser[0]);
+ }
+ }
+
+ [Fact]
+ public void SingleFieldAndMultipleRowsAndLastRowHasNoLineEndingTest()
+ {
+ var s = new StringBuilder();
+ s.Append("1\r");
+ s.Append("2");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, CultureInfo.InvariantCulture))
+ {
+ parser.Read();
+ Assert.Equal("1", parser[0]);
+
+ parser.Read();
+ Assert.Equal("2", parser[0]);
+ }
+ }
+
+ [Fact]
+ public void SingleFieldAndSecondRowIsQuotedAndLastRowHasNoLineEndingTest()
+ {
+ var s = new StringBuilder();
+ s.Append("1\r");
+ s.Append("\"2\"");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, CultureInfo.InvariantCulture))
+ {
+ parser.Read();
+ Assert.Equal("1", parser[0]);
+
+ parser.Read();
+ Assert.Equal("2", parser[0]);
+ }
+ }
+
+ [Fact]
+ public void MultipleFieldsAndSingleRowAndLastRowHasNoLineEndingTest()
+ {
+ var s = new StringBuilder();
+ s.Append("1,2\r");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, CultureInfo.InvariantCulture))
+ {
+ parser.Read();
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("2", parser[1]);
+ }
+ }
+
+ [Fact]
+ public void MultipleFieldsAndMultipleRowsAndLastRowHasNoLineEndingTest()
+ {
+ var s = new StringBuilder();
+ s.Append("1,2\r");
+ s.Append("3,4");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, CultureInfo.InvariantCulture))
+ {
+ parser.Read();
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("2", parser[1]);
+
+ parser.Read();
+ Assert.Equal("3", parser[0]);
+ Assert.Equal("4", parser[1]);
+ }
+ }
+
+ [Fact]
+ public void MultipleFieldsAndMultipleRowsAndLastRowHasLineEndingTest()
+ {
+ var s = new StringBuilder();
+ s.Append("1,2\r");
+ s.Append("3,4\r");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, CultureInfo.InvariantCulture))
+ {
+ parser.Read();
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("2", parser[1]);
+
+ parser.Read();
+ Assert.Equal("3", parser[0]);
+ Assert.Equal("4", parser[1]);
+ }
+ }
+
+ [Fact]
+ public void MultipleFieldsAndMultipleRowsAndLastFieldInFirstRowIsQuotedAndLastRowHasLineEndingTest()
+ {
+ var s = new StringBuilder();
+ s.Append("1,\"2\"\r");
+ s.Append("3,4\r");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, CultureInfo.InvariantCulture))
+ {
+ parser.Read();
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("2", parser[1]);
+
+ parser.Read();
+ Assert.Equal("3", parser[0]);
+ Assert.Equal("4", parser[1]);
+ }
+ }
+
+ [Fact]
+ public void MultipleFieldsAndMultipleRowsAndSecondRowFirstFieldIsQuotedAndLastRowHasLineEndingTest()
+ {
+ var s = new StringBuilder();
+ s.Append("1,2\r");
+ s.Append("\"3\",4\r");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, CultureInfo.InvariantCulture))
+ {
+ parser.Read();
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("2", parser[1]);
+
+ parser.Read();
+ Assert.Equal("3", parser[0]);
+ Assert.Equal("4", parser[1]);
+ }
+ }
+
+ [Fact]
+ public void MultipleFieldsAndMultipleRowsAndAllFieldsQuotedAndHasLineEndingTest()
+ {
+ var s = new StringBuilder();
+ s.Append("\"1\",\"2\"\r");
+ s.Append("\"3\",\"4\"\r");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, CultureInfo.InvariantCulture))
+ {
+ parser.Read();
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("2", parser[1]);
+
+ parser.Read();
+ Assert.Equal("3", parser[0]);
+ Assert.Equal("4", parser[1]);
+ }
+ }
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/CsvModeTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/CsvModeTests.cs
new file mode 100644
index 0000000..f561f68
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/CsvModeTests.cs
@@ -0,0 +1,109 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using CsvHelper.Configuration;
+using Xunit;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CsvHelper.Tests.Parsing
+{
+
+ public class CsvModeTests
+ {
+ [Fact]
+ public void Read_HasEscapedDelimiter_Parses()
+ {
+ var s = new StringBuilder();
+ s.Append("a\\,b,c\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Mode = CsvMode.Escape,
+ Escape = '\\',
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ Assert.True(parser.Read());
+ Assert.Equal("a,b", parser[0]);
+ Assert.Equal("c", parser[1]);
+
+ Assert.False(parser.Read());
+ }
+ }
+
+ [Fact]
+ public void Read_HasEscapedLineEnding_Parses()
+ {
+ var s = new StringBuilder();
+ s.Append("a\\\nb,c\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Mode = CsvMode.Escape,
+ Escape = '\\',
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ Assert.True(parser.Read());
+ Assert.Equal("a\nb", parser[0]);
+ Assert.Equal("c", parser[1]);
+ Assert.False(parser.Read());
+ }
+ }
+
+ [Fact]
+ public void Read_NoEscapeMode_HasRFC4180Format_Parses()
+ {
+ var s = new StringBuilder();
+ s.Append("a,\"b,\"\"c\r\nd\",e");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Mode = CsvMode.NoEscape,
+ Escape = '"',
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ Assert.True(parser.Read());
+ Assert.Equal("a", parser[0]);
+ Assert.Equal("\"b", parser[1]);
+ Assert.Equal("\"\"c", parser[2]);
+
+ Assert.True(parser.Read());
+ Assert.Equal("d\"", parser[0]);
+ Assert.Equal("e", parser[1]);
+ }
+ }
+
+ [Fact]
+ public void Read_NoEscapeMode_HasEscapeFormat_Parses()
+ {
+ var s = new StringBuilder();
+ s.Append("a,\\b\\,c\\\nd,e");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Mode = CsvMode.NoEscape,
+ Escape = '\\',
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ Assert.True(parser.Read());
+ Assert.Equal("a", parser[0]);
+ Assert.Equal("\\b\\", parser[1]);
+ Assert.Equal("c\\", parser[2]);
+
+ Assert.True(parser.Read());
+ Assert.Equal("d", parser[0]);
+ Assert.Equal("e", parser[1]);
+ }
+ }
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/DelimiterTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/DelimiterTests.cs
new file mode 100644
index 0000000..66f599b
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/DelimiterTests.cs
@@ -0,0 +1,81 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using System.Globalization;
+using System.IO;
+using System.Text;
+using CsvHelper.Configuration;
+using Xunit;
+
+namespace CsvHelper.Tests.Parsing
+{
+
+ public class DelimiterTests
+ {
+ [Fact]
+ public void MultipleCharDelimiterWithPartOfDelimiterInFieldTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Delimiter = "<|>",
+ };
+ using (var stream = new MemoryStream())
+ using (var reader = new StreamReader(stream))
+ using (var writer = new StreamWriter(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ writer.Write("1<|>2<3<|>4\r\n");
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal(3, parser.Count);
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("2<3", parser[1]);
+ Assert.Equal("4", parser[2]);
+ }
+ }
+
+ [Fact]
+ public void NullDelimiterTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Delimiter = "\0",
+ };
+ var s = new StringBuilder();
+ s.Append("1\02\03\r\n");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(3, parser.Count);
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("2", parser[1]);
+ Assert.Equal("3", parser[2]);
+ }
+ }
+
+ [Fact]
+ public void FirstCharOfDelimiterNextToDelimiterTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Delimiter = "!#",
+ };
+ var s = new StringBuilder();
+ s.AppendLine("1!!#2");
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal("1!", parser[0]);
+ Assert.Equal("2", parser[1]);
+ }
+ }
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/DetectDelimiterTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/DetectDelimiterTests.cs
new file mode 100644
index 0000000..facc030
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/DetectDelimiterTests.cs
@@ -0,0 +1,286 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using CsvHelper.Configuration;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xunit;
+
+namespace CsvHelper.Tests.Parsing
+{
+ public class DetectDelimiterTests
+ {
+ [Fact]
+ public void GetDelimiter_TextHasCommas_DetectsComma()
+ {
+ var s = new StringBuilder();
+ s.Append("Id,Name\r\n");
+ s.Append("1,one\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Delimiter = "`",
+ };
+ Assert.Equal(",", ConfigurationFunctions.GetDelimiter(new Delegates.GetDelimiterArgs(s.ToString(), config)));
+ }
+
+ [Fact]
+ public void GetDelimiter_TextHasSemicolons_DetectsSemicolon()
+ {
+ var s = new StringBuilder();
+ s.Append("Id;Name\r\n");
+ s.Append("1;one\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Delimiter = "`",
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(";", ConfigurationFunctions.GetDelimiter(new Delegates.GetDelimiterArgs(s.ToString(), config)));
+ }
+ }
+
+ [Fact]
+ public void GetDelimiter_TextHasPipes_DetectsPipe()
+ {
+ var s = new StringBuilder();
+ s.Append("Id|Name\r\n");
+ s.Append("1|one\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Delimiter = "`",
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal("|", ConfigurationFunctions.GetDelimiter(new Delegates.GetDelimiterArgs(s.ToString(), config)));
+ }
+ }
+
+ [Fact]
+ public void GetDelimiter_TextHasTabs_DetectsTab()
+ {
+ var s = new StringBuilder();
+ s.Append("Id\tName\r\n");
+ s.Append("1\tone\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Delimiter = "`",
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal("\t", ConfigurationFunctions.GetDelimiter(new Delegates.GetDelimiterArgs(s.ToString(), config)));
+ }
+ }
+
+ [Fact]
+ public void GetDelimiter_EqualAmountOfDelimiters_DetectsFirstInDelimiterValuesList()
+ {
+ var s = new StringBuilder();
+ s.Append(";;,,\t\t||\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Delimiter = "`",
+ DetectDelimiter = true,
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(",", ConfigurationFunctions.GetDelimiter(new Delegates.GetDelimiterArgs(s.ToString(), config)));
+ }
+ }
+
+ [Fact]
+ public void GetDelimiter_TextHas2CharDelimiter_DetectsDelimiter()
+ {
+ var s = new StringBuilder();
+ s.Append("Id,,Name\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Delimiter = "`",
+ DetectDelimiter = true,
+ DetectDelimiterValues = new[] { ",," },
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(",,", ConfigurationFunctions.GetDelimiter(new Delegates.GetDelimiterArgs(s.ToString(), config)));
+ }
+ }
+
+ [Fact]
+ public void GetDelimiter_TextHasRegularCharDelimiter_DetectsDelimiter()
+ {
+ var s = new StringBuilder();
+ s.Append("IdþName\r\n");
+ s.Append("1þone\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Delimiter = "`",
+ DetectDelimiterValues = new[] { "þ" }
+ };
+ Assert.Equal("þ", ConfigurationFunctions.GetDelimiter(new Delegates.GetDelimiterArgs(s.ToString(), config)));
+ }
+
+ [Fact]
+ public void GetDelimiter_MultipleLines_DetectsDelimiterThatIsOnEveryLine()
+ {
+ var s = new StringBuilder();
+ s.Append("Id;Name\r\n");
+ s.Append("1,2,3,4;5,6,7,8\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Delimiter = "`",
+ DetectDelimiterValues = new[] { ",", ";" }
+ };
+ Assert.Equal(";", ConfigurationFunctions.GetDelimiter(new Delegates.GetDelimiterArgs(s.ToString(), config)));
+ }
+
+ [Fact]
+ public void GetDelimiter_NoDelimiter_DoesNotDetect()
+ {
+ var s = new StringBuilder();
+ s.Append("Id,Name\r\n");
+ s.Append("1,one\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Delimiter = "`",
+ DetectDelimiterValues = new[] { ";" }
+ };
+ Assert.Equal("`", ConfigurationFunctions.GetDelimiter(new Delegates.GetDelimiterArgs(s.ToString(), config)));
+ }
+
+ [Fact]
+ public void GetDelimiter_CulturesSeparatorOccursLessButIsOnEveryLine_CulturesSeparatorIsDetected()
+ {
+ var s = new StringBuilder();
+ s.Append("1;2,3;4\r\n");
+ s.Append("5;6,7;8\r\n");
+ s.Append("9;10,11;12\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ };
+ Assert.Equal(CultureInfo.InvariantCulture.TextInfo.ListSeparator, ConfigurationFunctions.GetDelimiter(new Delegates.GetDelimiterArgs(s.ToString(), config)));
+ }
+
+ [Fact]
+ public void GetDelimiter_CulturesSeparatorOccursLessAndIsOnFirstLine_CulturesSeparatorIsNotDetected()
+ {
+ var s = new StringBuilder();
+ s.Append("1;2,3;4\r\n");
+ s.Append("5;6;7;8\r\n");
+ s.Append("9;10,11;12\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ };
+ Assert.NotEqual(CultureInfo.InvariantCulture.TextInfo.ListSeparator, ConfigurationFunctions.GetDelimiter(new Delegates.GetDelimiterArgs(s.ToString(), config)));
+ }
+
+ [Fact]
+ public void GetDelimiter_CulturesSeparatorOccursLessAndHasSingleLine_CulturesSeparatorIsNotDetected()
+ {
+ var s = new StringBuilder();
+ s.Append("1;2,3;4\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ };
+ Assert.NotEqual(CultureInfo.InvariantCulture.TextInfo.ListSeparator, ConfigurationFunctions.GetDelimiter(new Delegates.GetDelimiterArgs(s.ToString(), config)));
+ }
+
+ [Fact]
+ public void GetDelimiter_CulturesSeparatorOccursLessAndHas2LinesAndIsOnEveryLine_CulturesSeparatorIsNotDetected()
+ {
+ var s = new StringBuilder();
+ s.Append("1;2,3;4\r\n");
+ s.Append("5;6,7;8\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ };
+ Assert.NotEqual(CultureInfo.InvariantCulture.TextInfo.ListSeparator, ConfigurationFunctions.GetDelimiter(new Delegates.GetDelimiterArgs(s.ToString(), config)));
+ }
+
+ [Fact]
+ public void GetDelimiter_CulturesSeparatorOccursLessAndIsOnSecondLine_CulturesSeparatorIsDetected()
+ {
+ var s = new StringBuilder();
+ s.Append("1;2;3;4\r\n");
+ s.Append("5;6,7;8\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ };
+ Assert.Equal(";", ConfigurationFunctions.GetDelimiter(new Delegates.GetDelimiterArgs(s.ToString(), config)));
+ }
+
+ [Fact]
+ public void GetDelimiter_TextHasLF_NewLineIsCRLF_DetectsDelimiter()
+ {
+ var s = new StringBuilder();
+ s.Append("name;num;date\nLily;1,005.25;2021-02-03\nJack;3.5;2021-02-04");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ };
+ var delimeter = ConfigurationFunctions.GetDelimiter(new Delegates.GetDelimiterArgs(s.ToString(), config));
+ Assert.Equal(";", delimeter);
+ }
+
+ [Fact]
+ public void CsvParserConstructor_DelimiterValuesEmpty_ThrowsException()
+ {
+ var s = new StringBuilder();
+ s.Append("Id,Name\r\n");
+ s.Append("1,one\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ DetectDelimiter = true,
+ DetectDelimiterValues = new string[0],
+ };
+ using (var reader = new StringReader(s.ToString()))
+ {
+ Assert.Throws<ConfigurationException>(() => new CsvParser(reader, config));
+ }
+ }
+
+ [Fact]
+ public void Read_TextHasCommas_ParsesRows()
+ {
+ var s = new StringBuilder();
+ s.Append("Id,Name\r\n");
+ s.Append("1,one\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Delimiter = "`",
+ DetectDelimiter = true,
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var row = parser.Read();
+
+ Assert.Equal("Id", parser[0]);
+ Assert.Equal("Name", parser[1]);
+
+ row = parser.Read();
+
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("one", parser[1]);
+ }
+ }
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/EndBufferTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/EndBufferTests.cs
new file mode 100644
index 0000000..9b1e2dd
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/EndBufferTests.cs
@@ -0,0 +1,79 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using CsvHelper.Configuration;
+using Xunit;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CsvHelper.Tests.Parsing
+{
+
+ public class EndBufferTests
+ {
+ [Fact]
+ public void Read_BufferEndsInOneCharDelimiter_ParsesFieldCorrectly()
+ {
+ var s = new StringBuilder();
+ s.Append("abcdefghijklmno,pqrs\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BufferSize = 16
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ Assert.True(parser.Read());
+ Assert.Equal(2, parser.Count);
+ Assert.Equal("abcdefghijklmno", parser[0]);
+ Assert.Equal("pqrs", parser[1]);
+ }
+ }
+
+ [Fact]
+ public void Read_BufferEndsInFirstCharOfTwoCharDelimiter_ParsesFieldCorrectly()
+ {
+ var s = new StringBuilder();
+ s.Append("abcdefghijklmnop;;qrs\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BufferSize = 16,
+ Delimiter = ";;",
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ Assert.True(parser.Read());
+ Assert.Equal(2, parser.Count);
+ Assert.Equal("abcdefghijklmnop", parser[0]);
+ Assert.Equal("qrs", parser[1]);
+ }
+ }
+
+ [Fact]
+ public void Read_BufferEndsInSecondCharOfTwoCharDelimiter_ParsesFieldCorrectly()
+ {
+ var s = new StringBuilder();
+ s.Append("abcdefghijklmno;;pqrs\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BufferSize = 16,
+ Delimiter = ";;",
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ Assert.True(parser.Read());
+ Assert.Equal(2, parser.Count);
+ Assert.Equal("abcdefghijklmno", parser[0]);
+ Assert.Equal("pqrs", parser[1]);
+ }
+ }
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/EscapeCharacterTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/EscapeCharacterTests.cs
new file mode 100644
index 0000000..bf0b801
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/EscapeCharacterTests.cs
@@ -0,0 +1,110 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using CsvHelper.Configuration;
+using Xunit;
+using System.Globalization;
+using System.IO;
+
+namespace CsvHelper.Tests.Parsing
+{
+
+ public class EscapeCharacterTests
+ {
+ [Fact]
+ public void EscapeTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Escape = '|',
+ };
+ using (var reader = new StringReader("\"|\"a|\"\"\r\n"))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ Assert.Equal("\"a\"", parser[0]);
+ }
+ }
+
+ [Fact]
+ public void EscapeNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Escape = '|',
+ };
+ using (var reader = new StringReader("\"|\"a|\"\""))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ Assert.Equal("\"a\"", parser[0]);
+ }
+ }
+
+ [Fact]
+ public void EscapeTrimOutsideTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Escape = '|',
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var reader = new StringReader(" \"|\"a|\"\" \r\n")) // ` "|"a|"" \r\n`
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ Assert.Equal("\"a\"", parser[0]);
+ }
+ }
+
+ [Fact]
+ public void EscapeTrimInsideTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Escape = '|',
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ using (var reader = new StringReader("\" |\"a|\" \"\r\n"))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ Assert.Equal("\"a\"", parser[0]);
+ }
+ }
+
+ [Fact]
+ public void EscapeTrimBothTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Escape = '|',
+ TrimOptions = TrimOptions.Trim | TrimOptions.InsideQuotes,
+ };
+ using (var reader = new StringReader(" \" |\"a|\" \" \r\n"))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ Assert.Equal("\"a\"", parser[0]);
+ }
+ }
+
+ [Fact]
+ public void EscapeWriteTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Escape = '|',
+ };
+ using (var writer = new StringWriter())
+ using (var csv = new CsvWriter(writer, config))
+ {
+ csv.WriteField("\"a\"");
+ csv.Flush();
+
+ Assert.Equal("\"|\"a|\"\"", writer.ToString());
+ }
+ }
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/ExcelCompatibilityTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/ExcelCompatibilityTests.cs
new file mode 100644
index 0000000..801443d
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/ExcelCompatibilityTests.cs
@@ -0,0 +1,123 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using System.Globalization;
+using System.IO;
+using System.Text;
+using CsvHelper.Configuration;
+using Xunit;
+
+namespace CsvHelper.Tests
+{
+
+ public class ExcelCompatibilityTests
+ {
+ [Fact]
+ public void Parse_EscapedFieldHasSpaceAfterLastQuote_FieldProcessedLeavingSpaceAtEnd()
+ {
+ var s = new StringBuilder();
+ s.Append("one,\"two\" ,three\r\n"); // one,"two" ,three
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BadDataFound = null,
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(3, parser.Count);
+ Assert.Equal("one", parser[0]);
+ Assert.Equal("two ", parser[1]);
+ Assert.Equal("three", parser[2]);
+ }
+ }
+
+ [Fact]
+ public void Parse_EscapedFieldHasSpaceBeforeFirstQuote_FieldIsNotProcessed()
+ {
+ var s = new StringBuilder();
+ s.Append("one, \"two\",three\r\n"); // one, "two",three
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BadDataFound = null,
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(3, parser.Count);
+ Assert.Equal("one", parser[0]);
+ Assert.Equal(" \"two\"", parser[1]);
+ Assert.Equal("three", parser[2]);
+ }
+ }
+
+ [Fact]
+ public void Parse_EscapedFieldHasExtraQuoteAfterLastQuote_CharsAfterLastQuoteAreNotProcessed()
+ {
+ var s = new StringBuilder();
+ s.Append("1,\"two\" \"2,3\r\n"); // 1,"two" "2,3
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BadDataFound = null,
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(3, parser.Count);
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("two \"2", parser[1]);
+ Assert.Equal("3", parser[2]);
+
+ Assert.False(parser.Read());
+ }
+ }
+
+ [Fact]
+ public void Parse_EscapedFieldHasNoEndingQuote_GoesToEndOfFile()
+ {
+ var s = new StringBuilder();
+ s.Append("a,b,\"c\r\n"); // a,b,"c\r\nd,e,f\r\n
+ s.Append("d,e,f\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BadDataFound = null,
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal("b", parser[1]);
+ Assert.Equal("c\r\nd,e,f\r\n", parser[2]);
+ }
+ }
+
+ [Fact]
+ public void Parse_NonEscapedFieldHasQuotesInIt_IgnoresQuotes()
+ {
+ var s = new StringBuilder();
+ s.Append("1,2\"3\"4,5\r\n"); // 1,2"3"4,5
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ BadDataFound = null,
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal(3, parser.Count);
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("2\"3\"4", parser[1]);
+ Assert.Equal("5", parser[2]);
+ }
+ }
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/FieldCacheTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/FieldCacheTests.cs
new file mode 100644
index 0000000..38bea21
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/FieldCacheTests.cs
@@ -0,0 +1,94 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using CsvHelper.Configuration;
+using Xunit;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CsvHelper.Tests.Parsing
+{
+
+ public class FieldCacheTests
+ {
+ [Fact]
+ public void Read_WithFieldCacheEnabled_ReturnsSameFieldInstance()
+ {
+ var s = new StringBuilder();
+ s.Append("1,2\r\n");
+ s.Append("2,1\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ CacheFields = true,
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ var a = parser[0];
+ parser.Read();
+ var b = parser[1];
+
+ Assert.Same(a, b);
+ }
+ }
+
+ [Fact]
+ public void Read_WithFieldCacheDisabled_ReturnsDifferentFieldInstance()
+ {
+ var s = new StringBuilder();
+ s.Append("1,2\r\n");
+ s.Append("2,1\r\n");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ CacheFields = false,
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ var a = parser[0];
+ parser.Read();
+ var b = parser[1];
+
+ Assert.NotSame(a, b);
+ }
+ }
+
+ [Fact]
+ public void Test1()
+ {
+ // "542008", "27721116", "98000820" have hash code 3769566006
+
+ var value1 = "542008";
+ var value2 = "27721116";
+ var value3 = "98000820";
+ var value4 = "542008";
+
+ var cache = new FieldCache(1);
+
+ var field1 = cache.GetField(value1.ToCharArray(), 0, value1.Length);
+ var field2 = cache.GetField(value2.ToCharArray(), 0, value2.Length);
+ var field3 = cache.GetField(value3.ToCharArray(), 0, value3.Length);
+ var field4 = cache.GetField(value4.ToCharArray(), 0, value4.Length);
+
+ Assert.Equal(value1, field1);
+ Assert.Equal(value2, field2);
+ Assert.Equal(value3, field3);
+ Assert.Equal(value4, field4);
+
+ Assert.NotSame(value1, field1);
+ Assert.NotSame(value2, field2);
+ Assert.NotSame(value3, field3);
+ Assert.NotSame(value4, field4);
+
+ Assert.Same(field1, field4);
+ }
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/MaxFieldSizeTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/MaxFieldSizeTests.cs
new file mode 100644
index 0000000..98567c6
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/MaxFieldSizeTests.cs
@@ -0,0 +1,50 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using CsvHelper.Configuration;
+using System.Globalization;
+using System.IO;
+using Xunit;
+
+namespace CsvHelper.Tests.Parsing
+{
+ public class MaxFieldSizeTests
+ {
+ [Fact]
+ public void LargeRecordFieldThrowsMaxFieldSizeExceptionTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ MaxFieldSize = 10
+ };
+ var s = new TestStringBuilder(config.NewLine);
+ s.AppendLine("1,2,3");
+ s.AppendLine("ok,1234567890,x");
+ s.AppendLine("nok,12345678901,y");
+ using (var reader = new StringReader(s))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+ parser.Read();
+ Assert.Throws<MaxFieldSizeException>(() => parser.Read());
+ }
+ }
+
+ [Fact]
+ public void LargeHeaderFieldThrowsMaxFieldSizeExceptionTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ MaxFieldSize = 10
+ };
+ var s = new TestStringBuilder(config.NewLine);
+ s.AppendLine("1,very long header name");
+ using (var reader = new StringReader(s))
+ using (var parser = new CsvParser(reader, config))
+ {
+ Assert.Throws<MaxFieldSizeException>(() => parser.Read());
+ }
+ }
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/NewLineTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/NewLineTests.cs
new file mode 100644
index 0000000..b943450
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/NewLineTests.cs
@@ -0,0 +1,176 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using CsvHelper.Configuration;
+using Xunit;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CsvHelper.Tests.Parsing
+{
+
+ public class NewLineTests
+ {
+ [Fact]
+ public void Read_RfcMode_2CharNewLine_Parses()
+ {
+ var s = new StringBuilder();
+ s.Append("Id,Name\a\b");
+ s.Append("1,one\a\b");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Mode = CsvMode.RFC4180,
+ NewLine = "\a\b",
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ Assert.True(parser.Read());
+ Assert.Equal("Id", parser[0]);
+ Assert.Equal("Name", parser[1]);
+
+ Assert.True(parser.Read());
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("one", parser[1]);
+
+ Assert.False(parser.Read());
+ }
+ }
+
+ [Fact]
+ public void Read_RfcMode_1CharNewLine_Parses()
+ {
+ var s = new StringBuilder();
+ s.Append("Id,Name\a");
+ s.Append("1,one\a");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Mode = CsvMode.RFC4180,
+ NewLine = "\a",
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ Assert.True(parser.Read());
+ Assert.Equal("Id", parser[0]);
+ Assert.Equal("Name", parser[1]);
+
+ Assert.True(parser.Read());
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("one", parser[1]);
+
+ Assert.False(parser.Read());
+ }
+ }
+
+ [Fact]
+ public void Read_RfcMode_2CharNewLine_NoneOnLastLine_Parses()
+ {
+ var s = new StringBuilder();
+ s.Append("Id,Name\a\b");
+ s.Append("1,one");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Mode = CsvMode.RFC4180,
+ NewLine = "\a\b",
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ Assert.True(parser.Read());
+ Assert.Equal("Id", parser[0]);
+ Assert.Equal("Name", parser[1]);
+
+ Assert.True(parser.Read());
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("one", parser[1]);
+
+ Assert.False(parser.Read());
+ }
+ }
+
+ [Fact]
+ public void Read_EscapeMode_2CharNewLine_Parses()
+ {
+ var s = new StringBuilder();
+ s.Append("Id,Name\a\b");
+ s.Append("1,one\a\b");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Mode = CsvMode.Escape,
+ NewLine = "\a\b",
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ Assert.True(parser.Read());
+ Assert.Equal("Id", parser[0]);
+ Assert.Equal("Name", parser[1]);
+
+ Assert.True(parser.Read());
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("one", parser[1]);
+
+ Assert.False(parser.Read());
+ }
+ }
+
+ [Fact]
+ public void Read_EscapeMode_1CharNewLine_Parses()
+ {
+ var s = new StringBuilder();
+ s.Append("Id,Name\a");
+ s.Append("1,one\a");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Mode = CsvMode.Escape,
+ NewLine = "\a",
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ Assert.True(parser.Read());
+ Assert.Equal("Id", parser[0]);
+ Assert.Equal("Name", parser[1]);
+
+ Assert.True(parser.Read());
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("one", parser[1]);
+
+ Assert.False(parser.Read());
+ }
+ }
+
+ [Fact]
+ public void Read_EscapeMode_2CharNewLine_NoneOnLastLine_Parses()
+ {
+ var s = new StringBuilder();
+ s.Append("Id,Name\a\b");
+ s.Append("1,one");
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ Mode = CsvMode.Escape,
+ NewLine = "\a\b",
+ };
+ using (var reader = new StringReader(s.ToString()))
+ using (var parser = new CsvParser(reader, config))
+ {
+ Assert.True(parser.Read());
+ Assert.Equal("Id", parser[0]);
+ Assert.Equal("Name", parser[1]);
+
+ Assert.True(parser.Read());
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("one", parser[1]);
+
+ Assert.False(parser.Read());
+ }
+ }
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/RefillingTextReaderTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/RefillingTextReaderTests.cs
new file mode 100644
index 0000000..9ad8c6f
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/RefillingTextReaderTests.cs
@@ -0,0 +1,59 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using CsvHelper.Configuration;
+using Xunit;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CsvHelper.Tests.Parsing
+{
+
+ public class RefillingTextReaderTests
+ {
+ [Fact]
+ public void RefillTextReaderMultipleTimesTest()
+ {
+ using (var stream = new MemoryStream())
+ using (var reader = new StreamReader(stream))
+ using (var writer = new StreamWriter(stream))
+ using (var parser = new CsvParser(reader, CultureInfo.InvariantCulture))
+ {
+ writer.Write("1,2\r\n");
+ writer.Flush();
+ stream.Position = 0;
+
+ Assert.True(parser.Read());
+ Assert.Equal("1", parser[0]);
+ Assert.Equal("2", parser[1]);
+ Assert.False(parser.Read());
+
+ var position = stream.Position;
+ writer.Write("3,4\r\n");
+ writer.Flush();
+ stream.Position = position;
+
+ Assert.True(parser.Read());
+ Assert.Equal("3", parser[0]);
+ Assert.Equal("4", parser[1]);
+ Assert.False(parser.Read());
+
+ position = stream.Position;
+ writer.Write("5,6\r\n");
+ writer.Flush();
+ stream.Position = position;
+
+ Assert.True(parser.Read());
+ Assert.Equal("5", parser[0]);
+ Assert.Equal("6", parser[1]);
+ Assert.False(parser.Read());
+ }
+ }
+ }
+}
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/TrimTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/TrimTests.cs
new file mode 100644
index 0000000..a4a4370
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing/TrimTests.cs
@@ -0,0 +1,1206 @@
+// Copyright 2009-2022 Josh Close
+// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
+// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
+// https://github.com/JoshClose/CsvHelper
+using CsvHelper.Configuration;
+using Xunit;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+
+namespace CsvHelper.Tests.Parsing
+{
+
+ public class TrimTests
+ {
+ [Fact]
+ public void OutsideStartTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " a,b\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideStartNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " a,b";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideStartSpacesInFieldTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " a b c,d\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideStartSpacesInFieldNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " a b c,d";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideEndTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "a ,b\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideEndNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "a ,b";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideEndSpacesInFieldTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "a b c ,d\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideEndSpacesInFieldNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "a b c ,d";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideBothTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " a ,b\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideBothNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " a ,b";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideBothSpacesInFieldTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " a b c ,d\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideBothSpacesInFieldNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " a b c ,d";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideQuotesStartTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " \"a\",b\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideQuotesStartNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " \"a\",b";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideQuotesStartSpacesInFieldTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " \"a b c\",d\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideQuotesStartSpacesInFieldNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " \"a b c\",d";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideQuotesEndTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\"a\" ,b";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideQuotesEndNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\"a\" ,b";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideQuotesEndSpacesInFieldTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\"a b c\" ,d\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideQuotesEndSpacesInFieldNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\"a b c\" ,d";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideQuotesBothTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " \"a\" ,b\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideQuotesBothNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " \"a\" ,b";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideQuotesBothSpacesInFieldTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " \"a b c\" ,d\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideQuotesBothSpacesInFieldNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " \"a b c\" ,d";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideQuotesBothSpacesInFieldMultipleRecordsTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " a b c , d e f \r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal("d e f", parser[1]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideQuotesBothSpacesInFieldMultipleRecordsNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " a b c , d e f ";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal("d e f", parser[1]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesStartTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\" a\",b\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesStartNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\" a\",b";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesStartSpacesInFieldTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\" a b c\",b\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesStartSpacesInFieldNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\" a b c\",b";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesStartSpacesInFieldDelimiterInFieldNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\" a ,b c\",b\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a ,b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesStartSpacesInFieldDelimiterInFieldSmallBufferNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ BufferSize = 1,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\" a ,b c\",b\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a ,b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesEndTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\"a \",b\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesEndNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\"a \",b";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesEndSpacesInFieldTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\"a b c \",d\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesEndSpacesInFieldNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\"a b c \",d";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesBothTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\" a \",b\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesBothNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\" a \",b";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesBothSpacesInFieldTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\" a b c \",d\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesBothSpacesInFieldNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\" a b c \",d";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesBothSpacesInFieldMultipleRecordsTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\" a b c \",\" d e f \"\r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal("d e f", parser[1]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesBothSpacesInFieldMultipleRecordsNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "\" a b c \",\" d e f \"";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal("d e f", parser[1]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideAndInsideQuotesTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim | TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " \" a b c \" , \" d e f \" \r\n";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal("d e f", parser[1]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideAndInsideQuotesNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim | TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = " \" a b c \" , \" d e f \" ";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b c", parser[0]);
+ Assert.Equal("d e f", parser[1]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideQuotesNoSpacesNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "abc";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("abc", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void OutsideQuotesNoSpacesHasSpaceInFieldNoNewlineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var parser = new CsvParser(reader, config))
+ {
+ var line = "a b";
+ writer.Write(line);
+ writer.Flush();
+ stream.Position = 0;
+
+ parser.Read();
+
+ Assert.Equal("a b", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideNoSpacesQuotesFieldHasEscapedQuotesTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ var line = "\"a \"\"b\"\" c\"";
+ using (var reader = new StringReader(line))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal("a \"b\" c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesBothSpacesFieldHasEscapedQuotesTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ var line = "\" a \"\"b\"\" c \"\r\n";
+ using (var reader = new StringReader(line))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal("a \"b\" c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void InsideQuotesBothSpacesFieldHasEscapedQuotesNoNewLineTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.InsideQuotes,
+ };
+ var line = "\" a \"\"b\"\" c \"";
+ using (var reader = new StringReader(line))
+ using (var parser = new CsvParser(reader, config))
+ {
+ parser.Read();
+
+ Assert.Equal("a \"b\" c", parser[0]);
+ Assert.Equal(line, parser.RawRecord.ToString());
+ }
+ }
+
+ [Fact]
+ public void ReadingTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ TrimOptions = TrimOptions.Trim | TrimOptions.InsideQuotes,
+ };
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ using (var reader = new StreamReader(stream))
+ using (var csv = new CsvReader(reader, config))
+ {
+ writer.WriteLine("A,B");
+ writer.WriteLine(" \" a b c \" , \" d e f \" ");
+ writer.Flush();
+ stream.Position = 0;
+
+ var records = csv.GetRecords<dynamic>().ToList();
+
+ var record = records[0];
+ Assert.Equal("a b c", record.A);
+ Assert.Equal("d e f", record.B);
+ }
+ }
+ }
+}