diff options
Diffstat (limited to 'ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/Parsing')
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); + } + } + } +} |