summaryrefslogtreecommitdiff
path: root/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/CsvWriterTests.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/CsvWriterTests.cs')
-rw-r--r--ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/CsvWriterTests.cs1030
1 files changed, 1030 insertions, 0 deletions
diff --git a/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/CsvWriterTests.cs b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/CsvWriterTests.cs
new file mode 100644
index 0000000..2309ef7
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/tests/CsvHelper.Tests/CsvWriterTests.cs
@@ -0,0 +1,1030 @@
+// 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.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Text;
+using CsvHelper.Configuration;
+using CsvHelper.TypeConversion;
+using Int32Converter = CsvHelper.TypeConversion.Int32Converter;
+using System.Dynamic;
+using Xunit;
+using System.Threading;
+
+namespace CsvHelper.Tests
+{
+
+ public class CsvWriterTests
+ {
+ public CsvWriterTests()
+ {
+ Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
+ }
+
+ [Fact]
+ public void WriteFieldTest()
+ {
+ var stream = new MemoryStream();
+ var writer = new StreamWriter(stream) { AutoFlush = true };
+
+ var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
+
+ var date = DateTime.Now.ToString();
+ var guid = Guid.NewGuid().ToString();
+ csv.WriteField("one");
+ csv.WriteField("one, two");
+ csv.WriteField("one \"two\" three");
+ csv.WriteField(" one ");
+ csv.WriteField(date);
+ csv.WriteField((short)1);
+ csv.WriteField(2);
+ csv.WriteField((long)3);
+ csv.WriteField((float)4);
+ csv.WriteField((double)5);
+ csv.WriteField(guid);
+ csv.NextRecord();
+
+ var reader = new StreamReader(stream);
+ stream.Position = 0;
+ var data = reader.ReadToEnd();
+
+ Assert.Equal("one,\"one, two\",\"one \"\"two\"\" three\",\" one \"," + date + ",1,2,3,4,5," + guid + "\r\n", data);
+ }
+
+ [Fact]
+ public void WriteRecordTest()
+ {
+ var record = new TestRecord
+ {
+ IntColumn = 1,
+ StringColumn = "string column",
+ IgnoredColumn = "ignored column",
+ FirstColumn = "first column",
+ };
+
+ var stream = new MemoryStream();
+ var writer = new StreamWriter(stream) { AutoFlush = true };
+ var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
+ csv.Context.RegisterClassMap<TestRecordMap>();
+
+ csv.WriteRecord(record);
+ csv.NextRecord();
+
+ stream.Position = 0;
+ var reader = new StreamReader(stream);
+ var csvFile = reader.ReadToEnd();
+ var expected = "first column,1,string column,test\r\n";
+
+ Assert.Equal(expected, csvFile);
+ }
+
+ [Fact]
+ public void WriteRecordNoIndexesTest()
+ {
+ var record = new TestRecordNoIndexes
+ {
+ IntColumn = 1,
+ StringColumn = "string column",
+ IgnoredColumn = "ignored column",
+ FirstColumn = "first column",
+ };
+
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream) { AutoFlush = true })
+ using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
+ {
+ csv.Context.RegisterClassMap<TestRecordNoIndexesMap>();
+
+ csv.WriteRecord(record);
+ csv.NextRecord();
+
+ stream.Position = 0;
+ var reader = new StreamReader(stream);
+ var csvFile = reader.ReadToEnd();
+
+ var expected = "1,string column,first column,test\r\n";
+
+ Assert.Equal(expected, csvFile);
+ }
+ }
+
+ [Fact]
+ public void WriteRecordsTest()
+ {
+ var records = new List<TestRecord>
+ {
+ new TestRecord
+ {
+ IntColumn = 1,
+ StringColumn = "string column",
+ IgnoredColumn = "ignored column",
+ FirstColumn = "first column",
+ },
+ new TestRecord
+ {
+ IntColumn = 2,
+ StringColumn = "string column 2",
+ IgnoredColumn = "ignored column 2",
+ FirstColumn = "first column 2",
+ },
+ };
+
+ var stream = new MemoryStream();
+ var writer = new StreamWriter(stream) { AutoFlush = true };
+ var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
+ csv.Context.RegisterClassMap<TestRecordMap>();
+
+ csv.WriteRecords(records);
+
+ stream.Position = 0;
+ var reader = new StreamReader(stream);
+ var csvFile = reader.ReadToEnd();
+ var expected = "FirstColumn,Int Column,StringColumn,TypeConvertedColumn\r\n";
+ expected += "first column,1,string column,test\r\n";
+ expected += "first column 2,2,string column 2,test\r\n";
+
+ Assert.Equal(expected, csvFile);
+ }
+
+ [Fact]
+ public void WriteEmptyArrayTest()
+ {
+ var records = new TestRecord[] { };
+
+ var stream = new MemoryStream();
+ var writer = new StreamWriter(stream) { AutoFlush = true };
+ var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
+ csv.Context.RegisterClassMap<TestRecordMap>();
+
+ csv.WriteRecords(records);
+
+ stream.Position = 0;
+ var reader = new StreamReader(stream);
+ var csvFile = reader.ReadToEnd();
+ var expected = "FirstColumn,Int Column,StringColumn,TypeConvertedColumn\r\n";
+
+ Assert.Equal(expected, csvFile);
+ }
+
+ [Fact]
+ public void WriteRecordsCalledWithTwoParametersTest()
+ {
+ var records = new List<object>
+ {
+ new TestRecord
+ {
+ IntColumn = 1,
+ StringColumn = "string column",
+ IgnoredColumn = "ignored column",
+ FirstColumn = "first column",
+ },
+ new TestRecord
+ {
+ IntColumn = 2,
+ StringColumn = "string column 2",
+ IgnoredColumn = "ignored column 2",
+ FirstColumn = "first column 2",
+ },
+ };
+
+ var stream = new MemoryStream();
+ var writer = new StreamWriter(stream) { AutoFlush = true };
+ var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
+ csv.Context.RegisterClassMap<TestRecordMap>();
+
+ csv.WriteRecords(records);
+
+ stream.Position = 0;
+ var reader = new StreamReader(stream);
+ var csvFile = reader.ReadToEnd();
+ var expected = "FirstColumn,Int Column,StringColumn,TypeConvertedColumn\r\n";
+ expected += "first column,1,string column,test\r\n";
+ expected += "first column 2,2,string column 2,test\r\n";
+
+ Assert.Equal(expected, csvFile);
+ }
+
+ [Fact]
+ public void WriteRecordNoHeaderTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ HasHeaderRecord = false,
+ };
+ var stream = new MemoryStream();
+ var writer = new StreamWriter(stream) { AutoFlush = true };
+ var csv = new CsvWriter(writer, config);
+ csv.Context.RegisterClassMap<TestRecordMap>();
+ csv.WriteRecord(new TestRecord());
+ csv.NextRecord();
+
+ stream.Position = 0;
+ var reader = new StreamReader(stream);
+ var csvFile = reader.ReadToEnd();
+
+ Assert.Equal(",0,,test\r\n", csvFile);
+ }
+
+ [Fact]
+ public void WriteRecordWithNullRecordTest()
+ {
+ var record = new TestRecord
+ {
+ IntColumn = 1,
+ StringColumn = "string column",
+ IgnoredColumn = "ignored column",
+ FirstColumn = "first column",
+ };
+
+ var stream = new MemoryStream();
+ var writer = new StreamWriter(stream) { AutoFlush = true };
+ var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
+ csv.Context.RegisterClassMap<TestRecordMap>();
+
+ csv.WriteRecord(record);
+ csv.NextRecord();
+ csv.WriteRecord((TestRecord)null);
+ csv.NextRecord();
+ csv.WriteRecord(record);
+ csv.NextRecord();
+
+ stream.Position = 0;
+ var reader = new StreamReader(stream);
+ var csvFile = reader.ReadToEnd();
+ var expected = new TestStringBuilder(csv.Configuration.NewLine);
+ expected.AppendLine("first column,1,string column,test");
+ expected.AppendLine(",,,");
+ expected.AppendLine("first column,1,string column,test");
+
+ Assert.Equal(expected, csvFile);
+ }
+
+ [Fact]
+ public void WriteRecordWithReferencesTest()
+ {
+ var record = new Person
+ {
+ FirstName = "First Name",
+ LastName = "Last Name",
+ HomeAddress = new Address
+ {
+ Street = "Home Street",
+ City = "Home City",
+ State = "Home State",
+ Zip = "Home Zip",
+ },
+ WorkAddress = new Address
+ {
+ Street = "Work Street",
+ City = "Work City",
+ State = "Work State",
+ Zip = "Work Zip",
+ }
+ };
+
+ var stream = new MemoryStream();
+ var writer = new StreamWriter(stream) { AutoFlush = true };
+ var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
+ csv.Context.RegisterClassMap<PersonMap>();
+
+ csv.WriteRecord(record);
+ csv.NextRecord();
+
+ stream.Position = 0;
+ var reader = new StreamReader(stream);
+ var csvFile = reader.ReadToEnd();
+
+ var expected = "First Name,Last Name,Home Street,Home City,Home State,Home Zip,Work Street,Work City,Work State,Work Zip\r\n";
+
+ Assert.Equal(expected, csvFile);
+ }
+
+ [Fact]
+ public void WriteRecordsAllFieldsQuotedTest()
+ {
+ var record = new TestRecord
+ {
+ IntColumn = 1,
+ StringColumn = "string column",
+ IgnoredColumn = "ignored column",
+ FirstColumn = "first column",
+ };
+
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ ShouldQuote = _ => true,
+ };
+
+ string csv;
+ using (var stream = new MemoryStream())
+ using (var reader = new StreamReader(stream))
+ using (var writer = new StreamWriter(stream))
+ using (var csvWriter = new CsvWriter(writer, config))
+ {
+ csvWriter.Context.RegisterClassMap<TestRecordMap>();
+ csvWriter.WriteRecord(record);
+ csvWriter.NextRecord();
+
+ writer.Flush();
+ stream.Position = 0;
+
+ csv = reader.ReadToEnd();
+ }
+
+ var expected = "\"first column\",\"1\",\"string column\",\"test\"\r\n";
+
+ Assert.Equal(expected, csv);
+ }
+
+ [Fact]
+ public void WriteRecordsNoFieldsQuotedTest()
+ {
+ var record = new TestRecord
+ {
+ IntColumn = 1,
+ StringColumn = "string \" column",
+ IgnoredColumn = "ignored column",
+ FirstColumn = "first, column",
+ };
+
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ ShouldQuote = _ => false,
+ };
+ string csv;
+ using (var stream = new MemoryStream())
+ using (var reader = new StreamReader(stream))
+ using (var writer = new StreamWriter(stream))
+ using (var csvWriter = new CsvWriter(writer, config))
+ {
+ csvWriter.Context.RegisterClassMap<TestRecordMap>();
+ csvWriter.WriteRecord(record);
+ csvWriter.NextRecord();
+
+ writer.Flush();
+ stream.Position = 0;
+
+ csv = reader.ReadToEnd();
+ }
+
+ var expected = "first, column,1,string \" column,test\r\n";
+
+ Assert.Equal(expected, csv);
+ }
+
+ [Fact]
+ public void WriteHeaderTest()
+ {
+ string csv;
+ using (var stream = new MemoryStream())
+ using (var reader = new StreamReader(stream))
+ using (var writer = new StreamWriter(stream))
+ using (var csvWriter = new CsvWriter(writer, CultureInfo.InvariantCulture))
+ {
+ csvWriter.Context.RegisterClassMap<TestRecordMap>();
+ csvWriter.WriteHeader(typeof(TestRecord));
+ csvWriter.NextRecord();
+
+ writer.Flush();
+ stream.Position = 0;
+
+ csv = reader.ReadToEnd();
+ }
+
+ const string Expected = "FirstColumn,Int Column,StringColumn,TypeConvertedColumn\r\n";
+ Assert.Equal(Expected, csv);
+ }
+
+ [Fact]
+ public void WriteRecordWithDelimiterInFieldTest()
+ {
+ 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))
+ {
+ var record = new TestSinglePropertyRecord
+ {
+ Name = "one,two"
+ };
+ csv.WriteRecord(record);
+ csv.NextRecord();
+ writer.Flush();
+ stream.Position = 0;
+
+ var text = reader.ReadToEnd();
+
+ Assert.Equal("\"one,two\"\r\n", text);
+ }
+ }
+
+ [Fact]
+ public void WriteRecordWithQuoteInFieldTest()
+ {
+ 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))
+ {
+ var record = new TestSinglePropertyRecord
+ {
+ Name = "one\"two"
+ };
+ csv.WriteRecord(record);
+ csv.NextRecord();
+ writer.Flush();
+ stream.Position = 0;
+
+ var text = reader.ReadToEnd();
+
+ Assert.Equal("\"one\"\"two\"\r\n", text);
+ }
+ }
+
+ [Fact]
+ public void WriteRecordWithQuoteAllFieldsOnAndDelimiterInFieldTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ ShouldQuote = _ => 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))
+ {
+ var record = new TestSinglePropertyRecord
+ {
+ Name = "one,two"
+ };
+ csv.WriteRecord(record);
+ csv.NextRecord();
+ writer.Flush();
+ stream.Position = 0;
+
+ var text = reader.ReadToEnd();
+
+ Assert.Equal("\"one,two\"\r\n", text);
+ }
+ }
+
+ [Fact]
+ public void WriteRecordWithQuoteAllFieldsOnAndQuoteInFieldTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ ShouldQuote = _ => 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))
+ {
+ var record = new TestSinglePropertyRecord
+ {
+ Name = "one\"two"
+ };
+ csv.WriteRecord(record);
+ csv.NextRecord();
+ writer.Flush();
+ stream.Position = 0;
+
+ var text = reader.ReadToEnd();
+
+ Assert.Equal("\"one\"\"two\"\r\n", text);
+ }
+ }
+
+ [Fact]
+ public void WriteRecordsWithInvariantCultureTest()
+ {
+ 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.Context.RegisterClassMap<TestRecordMap>();
+
+ var record = new TestRecord
+ {
+ IntColumn = 1,
+ FirstColumn = "first column",
+ IgnoredColumn = "ignored column",
+ StringColumn = "string column",
+ };
+
+ csv.WriteRecord(record);
+ writer.Flush();
+ stream.Position = 0;
+
+ var csvString = reader.ReadToEnd();
+ }
+ }
+
+ [Fact]
+ public void WriteNoGetterTest()
+ {
+ 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))
+ {
+ var list = new List<TestPrivateGet>
+ {
+ new TestPrivateGet
+ {
+ Id = 1,
+ Name = "one"
+ }
+ };
+ csv.WriteRecords(list);
+ writer.Flush();
+ stream.Position = 0;
+
+ var data = reader.ReadToEnd();
+ var expected = new TestStringBuilder(csv.Configuration.NewLine);
+ expected.AppendLine("Id");
+ expected.AppendLine("1");
+
+ Assert.Equal(expected.ToString(), data);
+ }
+ }
+
+ [Fact]
+ public void WriteDynamicTest()
+ {
+ 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.WriteRecord(new { Id = 1, Name = "one" });
+ csv.NextRecord();
+ writer.Flush();
+ stream.Position = 0;
+
+ var text = reader.ReadToEnd();
+ Assert.Equal("1,one\r\n", text);
+ }
+ }
+
+ [Fact]
+ public void WritePrimitivesRecordsHasHeaderTrueTest()
+ {
+ 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))
+ {
+ var list = new List<int> { 1, 2, 3 };
+ csv.WriteRecords(list);
+ writer.Flush();
+ stream.Position = 0;
+
+ var text = reader.ReadToEnd();
+
+ Assert.Equal("1\r\n2\r\n3\r\n", text);
+ }
+ }
+
+ [Fact]
+ public void WritePrimitivesRecordsHasHeaderFalseTest()
+ {
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ HasHeaderRecord = false,
+ };
+ using (var stream = new MemoryStream())
+ using (var reader = new StreamReader(stream))
+ using (var writer = new StreamWriter(stream))
+ using (var csv = new CsvWriter(writer, config))
+ {
+ var list = new List<int> { 1, 2, 3 };
+ csv.WriteRecords(list);
+ writer.Flush();
+ stream.Position = 0;
+
+ var text = reader.ReadToEnd();
+
+ Assert.Equal("1\r\n2\r\n3\r\n", text);
+ }
+ }
+
+ [Fact]
+ public void WriteStructRecordsTest()
+ {
+ 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))
+ {
+ var list = new List<TestStruct>
+ {
+ new TestStruct { Id = 1, Name = "one" },
+ new TestStruct { Id = 2, Name = "two" },
+ };
+ csv.WriteRecords(list);
+ writer.Flush();
+ stream.Position = 0;
+
+ var text = reader.ReadToEnd();
+
+ Assert.Equal("Id,Name\r\n1,one\r\n2,two\r\n", text);
+ }
+ }
+
+ [Fact]
+ public void WriteStructReferenceRecordsTest()
+ {
+ var list = new List<TestStructParent>
+ {
+ new TestStructParent
+ {
+ Test = new TestStruct
+ {
+ Id = 1,
+ Name = "one",
+ },
+ },
+ };
+
+ 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.Context.RegisterClassMap<TestStructParentMap>();
+ csv.WriteRecords(list);
+ writer.Flush();
+ stream.Position = 0;
+
+ var data = reader.ReadToEnd();
+ Assert.Equal("Id,Name\r\n1,one\r\n", data);
+ }
+ }
+
+ [Fact]
+ public void WriteNestedHeadersTest()
+ {
+ var list = new List<Person>
+ {
+ new Person
+ {
+ FirstName = "first",
+ LastName = "last",
+ HomeAddress = new Address
+ {
+ City = "home city",
+ State = "home state",
+ Street = "home street",
+ Zip = "home zip",
+ },
+ WorkAddress = new Address
+ {
+ City = "work city",
+ State = "work state",
+ Street = "work street",
+ Zip = "work zip",
+ },
+ },
+ };
+
+ var config = new CsvConfiguration(CultureInfo.InvariantCulture)
+ {
+ ReferenceHeaderPrefix = args => $"{args.MemberName}."
+ };
+ 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.WriteRecords(list);
+ writer.Flush();
+ stream.Position = 0;
+
+ var text = reader.ReadToEnd();
+ var expected = new TestStringBuilder(csv.Configuration.NewLine);
+ expected.AppendLine("FirstName,LastName,HomeAddress.Street,HomeAddress.City,HomeAddress.State,HomeAddress.Zip,WorkAddress.Street,WorkAddress.City,WorkAddress.State,WorkAddress.Zip");
+ expected.AppendLine("first,last,home street,home city,home state,home zip,work street,work city,work state,work zip");
+ Assert.Equal(expected.ToString(), text);
+ }
+ }
+
+ [Fact]
+ public void WriteEmptyListTest()
+ {
+ 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))
+ {
+ var list = new List<TestRecord>();
+ csv.WriteRecords(list);
+ writer.Flush();
+ stream.Position = 0;
+
+ var data = reader.ReadToEnd();
+ Assert.False(string.IsNullOrWhiteSpace(data));
+ }
+ }
+
+ [Fact]
+ public void ClassWithStaticAutoMappingTest()
+ {
+ 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))
+ {
+ TestWithStatic.Name = "one";
+ var records = new List<TestWithStatic>
+ {
+ new TestWithStatic
+ {
+ Id = 1
+ },
+ };
+
+ csv.WriteRecords(records);
+ }
+ }
+
+ [Fact]
+ public void ClassWithStaticUsingMappingTest()
+ {
+ 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.Context.RegisterClassMap<TestWithStaticMap>();
+
+ TestWithStatic.Name = "one";
+ var records = new List<TestWithStatic>
+ {
+ new TestWithStatic
+ {
+ Id = 1
+ },
+ };
+
+ csv.WriteRecords(records);
+ }
+ }
+
+ [Fact]
+ public void WriteDynamicListTest()
+ {
+ 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))
+ {
+ var list = new List<dynamic>();
+ dynamic record = new { Id = 1, Name = "one" };
+ list.Add(record);
+ csv.WriteRecords(list);
+ writer.Flush();
+ stream.Position = 0;
+
+ var text = reader.ReadToEnd();
+ Assert.Equal("Id,Name\r\n1,one\r\n", text);
+ }
+ }
+
+ [Fact]
+ public void WriteExpandoListTest()
+ {
+ 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))
+ {
+ var list = new List<dynamic>();
+ dynamic record = new ExpandoObject();
+ record.Id = 1;
+ record.Name = "one";
+ list.Add(record);
+ csv.WriteRecords(list);
+ writer.Flush();
+ stream.Position = 0;
+
+ var text = reader.ReadToEnd();
+ Assert.Equal("Id,Name\r\n1,one\r\n", text);
+ }
+ }
+
+
+ [Fact]
+ public void WriteInternalConstructorClassTest()
+ {
+ 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.WriteRecords(new List<GetOnly>());
+ writer.Flush();
+ stream.Position = 0;
+
+ var text = reader.ReadToEnd();
+ Assert.Equal("One\r\n", text);
+ }
+ }
+
+ private class GetOnly
+ {
+ internal GetOnly(string someParam)
+ {
+ }
+
+ public int One { get; }
+ }
+
+ private class TestWithStatic
+ {
+ public int Id { get; set; }
+
+ public static string Name { get; set; }
+ }
+
+ private sealed class TestWithStaticMap : ClassMap<TestWithStatic>
+ {
+ public TestWithStaticMap()
+ {
+ Map(m => m.Id);
+ }
+ }
+
+ private class TestStructParent
+ {
+ public TestStruct Test { get; set; }
+ }
+
+ private sealed class TestStructParentMap : ClassMap<TestStructParent>
+ {
+ public TestStructParentMap()
+ {
+ References<TestStructMap>(m => m.Test);
+ }
+ }
+
+ private struct TestStruct
+ {
+ public int Id { get; set; }
+
+ public string Name { get; set; }
+ }
+
+ private sealed class TestStructMap : ClassMap<TestStruct>
+ {
+ public TestStructMap()
+ {
+ Map(m => m.Id);
+ Map(m => m.Name);
+ }
+ }
+
+ private class TestPrivateGet
+ {
+ public int Id { get; set; }
+
+ public string Name { private get; set; }
+ }
+
+ private class TestSinglePropertyRecord
+ {
+ public string Name { get; set; }
+ }
+
+ private class TestRecord
+ {
+ public int IntColumn { get; set; }
+
+ public string StringColumn { get; set; }
+
+ public string IgnoredColumn { get; set; }
+
+ public string FirstColumn { get; set; }
+
+ public string TypeConvertedColumn { get; set; }
+ }
+
+ private sealed class TestRecordMap : ClassMap<TestRecord>
+ {
+ public TestRecordMap()
+ {
+ Map(m => m.IntColumn).Name("Int Column").Index(1).TypeConverter<Int32Converter>();
+ Map(m => m.StringColumn);
+ Map(m => m.FirstColumn).Index(0);
+ Map(m => m.TypeConvertedColumn).TypeConverter<TestTypeConverter>();
+ }
+ }
+
+ private class TestRecordNoIndexes
+ {
+ public int IntColumn { get; set; }
+
+ public string StringColumn { get; set; }
+
+ public string IgnoredColumn { get; set; }
+
+ public string FirstColumn { get; set; }
+
+ public string TypeConvertedColumn { get; set; }
+ }
+
+ private sealed class TestRecordNoIndexesMap : ClassMap<TestRecordNoIndexes>
+ {
+ public TestRecordNoIndexesMap()
+ {
+ Map(m => m.IntColumn).Name("Int Column").TypeConverter<Int32Converter>();
+ Map(m => m.StringColumn);
+ Map(m => m.FirstColumn);
+ Map(m => m.TypeConvertedColumn).TypeConverter<TestTypeConverter>();
+ }
+ }
+
+ private class TestTypeConverter : ITypeConverter
+ {
+ public string ConvertToString(object value, IWriterRow row, MemberMapData propertyMapData)
+ {
+ return "test";
+ }
+
+ public object ConvertFromString(string text, IReaderRow row, MemberMapData propertyMapData)
+ {
+ throw new NotImplementedException();
+ }
+
+ public bool CanConvertFrom(Type type)
+ {
+ throw new NotImplementedException();
+ }
+
+ public bool CanConvertTo(Type type)
+ {
+ return true;
+ }
+ }
+
+ private class Person
+ {
+ public string FirstName { get; set; }
+
+ public string LastName { get; set; }
+
+ public Address HomeAddress { get; set; }
+
+ public Address WorkAddress { get; set; }
+ }
+
+ private class Address
+ {
+ public string Street { get; set; }
+
+ public string City { get; set; }
+
+ public string State { get; set; }
+
+ public string Zip { get; set; }
+ }
+
+ private sealed class PersonMap : ClassMap<Person>
+ {
+ public PersonMap()
+ {
+ Map(m => m.FirstName);
+ Map(m => m.LastName);
+ References<HomeAddressMap>(m => m.HomeAddress);
+ References<WorkAddressMap>(m => m.WorkAddress);
+ }
+ }
+
+ private sealed class HomeAddressMap : ClassMap<Address>
+ {
+ public HomeAddressMap()
+ {
+ Map(m => m.Street).Name("HomeStreet");
+ Map(m => m.City).Name("HomeCity");
+ Map(m => m.State).Name("HomeState");
+ Map(m => m.Zip).Name("HomeZip");
+ }
+ }
+
+ private sealed class WorkAddressMap : ClassMap<Address>
+ {
+ public WorkAddressMap()
+ {
+ Map(m => m.Street).Name("WorkStreet");
+ Map(m => m.City).Name("WorkCity");
+ Map(m => m.State).Name("WorkState");
+ Map(m => m.Zip).Name("WorkZip");
+ }
+ }
+
+ }
+}