Skip to content

Commit

Permalink
Changed enumerable converters to use header value if one is set.
Browse files Browse the repository at this point in the history
Updated exceptions to throw a more specific exception than CsvHelperException.
  • Loading branch information
JoshClose committed Sep 23, 2016
1 parent c6f7471 commit c5e7ba1
Show file tree
Hide file tree
Showing 21 changed files with 1,487 additions and 141 deletions.
2 changes: 1 addition & 1 deletion src/CsvHelper.Tests/Exceptions/ExceptionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public void NoDefaultConstructorTest()
var list = csv.GetRecords<NoDefaultConstructor>().ToList();
Assert.Fail();
}
catch( ArgumentException )
catch( CsvReaderException )
{
}
}
Expand Down
167 changes: 166 additions & 1 deletion src/CsvHelper.Tests/TypeConversion/ArrayConverterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,10 @@ public class ArrayConverterTests
[TestMethod]
public void ReadConvertNoIndexEndTest()
{
var config = new CsvConfiguration { HasHeaderRecord = false };
var rowMock = new Mock<ICsvReaderRow>();
var currentRecord = new[] { "1", "one", "1", "2", "3" };
rowMock.Setup( m => m.Configuration ).Returns( config );
rowMock.Setup( m => m.CurrentRecord ).Returns( currentRecord );
rowMock.Setup( m => m.GetField( It.IsAny<Type>(), It.IsAny<int>() ) ).Returns<Type, int>( ( type, index ) => Convert.ToInt32( currentRecord[index] ) );
var data = new CsvPropertyMapData( typeof( Test ).GetProperty( "List" ) )
Expand All @@ -43,8 +45,10 @@ public void ReadConvertNoIndexEndTest()
[TestMethod]
public void ReadConvertWithIndexEndTest()
{
var config = new CsvConfiguration { HasHeaderRecord = false };
var rowMock = new Mock<ICsvReaderRow>();
var currentRecord = new[] { "1", "one", "1", "2", "3" };
rowMock.Setup( m => m.Configuration ).Returns( config );
rowMock.Setup( m => m.CurrentRecord ).Returns( currentRecord );
rowMock.Setup( m => m.GetField( It.IsAny<Type>(), It.IsAny<int>() ) ).Returns<Type, int>( ( type, index ) => Convert.ToInt32( currentRecord[index] ) );
var data = new CsvPropertyMapData( typeof( Test ).GetProperty( "List" ) )
Expand Down Expand Up @@ -108,13 +112,174 @@ public void FullWriteTest()

var result = reader.ReadToEnd();

Assert.AreEqual( "1,2,3\r\n", result );
Assert.AreEqual( ",1,2,3,\r\n", result );
}
}

[TestMethod]
public void FullReadNoHeaderTest()
{
using( var stream = new MemoryStream() )
using( var reader = new StreamReader( stream ) )
using( var writer = new StreamWriter( stream ) )
using( var csv = new CsvReader( reader ) )
{
writer.WriteLine( "1,2,3,4,5" );
writer.Flush();
stream.Position = 0;

csv.Configuration.HasHeaderRecord = false;
csv.Configuration.RegisterClassMap<TestIndexMap>();
var records = csv.GetRecords<Test>().ToList();

var list = records[0].List.ToList();

Assert.AreEqual( 3, list.Count );
Assert.AreEqual( 2, list[0] );
Assert.AreEqual( 3, list[1] );
Assert.AreEqual( 4, list[2] );
}
}

[TestMethod]
public void FullReadWithHeaderTest()
{
using( var stream = new MemoryStream() )
using( var reader = new StreamReader( stream ) )
using( var writer = new StreamWriter( stream ) )
using( var csv = new CsvReader( reader ) )
{
writer.WriteLine( "Before,List,List,List,After" );
writer.WriteLine( "1,2,3,4,5" );
writer.Flush();
stream.Position = 0;

csv.Configuration.HasHeaderRecord = true;
csv.Configuration.RegisterClassMap<TestIndexMap>();
var records = csv.GetRecords<Test>().ToList();

var list = records[0].List.ToList();

Assert.AreEqual( 3, list.Count );
Assert.AreEqual( 2, list[0] );
Assert.AreEqual( 3, list[1] );
Assert.AreEqual( 4, list[2] );
}
}

[TestMethod]
public void FullReadWithDefaultHeaderTest()
{
using( var stream = new MemoryStream() )
using( var reader = new StreamReader( stream ) )
using( var writer = new StreamWriter( stream ) )
using( var csv = new CsvReader( reader ) )
{
writer.WriteLine( "Before,List,List,List,After" );
writer.WriteLine( "1,2,3,4,5" );
writer.Flush();
stream.Position = 0;

csv.Configuration.HasHeaderRecord = true;
csv.Configuration.RegisterClassMap<TestDefaultMap>();
var records = csv.GetRecords<Test>().ToList();

var list = records[0].List.ToList();

Assert.AreEqual( 3, list.Count );
Assert.AreEqual( 2, list[0] );
Assert.AreEqual( 3, list[1] );
Assert.AreEqual( 4, list[2] );
}
}

[TestMethod]
public void FullReadWithNamedHeaderTest()
{
using( var stream = new MemoryStream() )
using( var reader = new StreamReader( stream ) )
using( var writer = new StreamWriter( stream ) )
using( var csv = new CsvReader( reader ) )
{
writer.WriteLine( "Before,List,List,List,After" );
writer.WriteLine( "1,2,3,4,5" );
writer.Flush();
stream.Position = 0;

csv.Configuration.HasHeaderRecord = true;
csv.Configuration.RegisterClassMap<TestNamedMap>();
var records = csv.GetRecords<Test>().ToList();

var list = records[0].List.ToList();

Assert.AreEqual( 3, list.Count );
Assert.AreEqual( 2, list[0] );
Assert.AreEqual( 3, list[1] );
Assert.AreEqual( 4, list[2] );
}
}

[TestMethod]
public void FullReadWithHeaderListItemsScattered()
{
using( var stream = new MemoryStream() )
using( var reader = new StreamReader( stream ) )
using( var writer = new StreamWriter( stream ) )
using( var csv = new CsvReader( reader ) )
{
writer.WriteLine( "Before,List,A,List,B,List,After" );
writer.WriteLine( "1,2,3,4,5,6,7" );
writer.Flush();
stream.Position = 0;

csv.Configuration.HasHeaderRecord = true;
csv.Configuration.RegisterClassMap<TestNamedMap>();
var records = csv.GetRecords<Test>().ToList();

var list = records[0].List.ToList();

Assert.AreEqual( 3, list.Count );
Assert.AreEqual( 2, list[0] );
Assert.AreEqual( 4, list[1] );
Assert.AreEqual( 6, list[2] );
}
}

private class Test
{
public string Before { get; set; }
public int[] List { get; set; }
public string After { get; set; }
}

private sealed class TestIndexMap : CsvClassMap<Test>
{
public TestIndexMap()
{
Map( m => m.Before ).Index( 0 );
Map( m => m.List ).Index( 1, 3 );
Map( m => m.After ).Index( 4 );
}
}

private sealed class TestNamedMap : CsvClassMap<Test>
{
public TestNamedMap()
{
Map( m => m.Before ).Name( "Before" );
Map( m => m.List ).Name( "List" );
Map( m => m.After ).Name( "After" );
}
}

private sealed class TestDefaultMap : CsvClassMap<Test>
{
public TestDefaultMap()
{
Map( m => m.Before );
Map( m => m.List );
Map( m => m.After );
}
}
}
}
Loading

0 comments on commit c5e7ba1

Please sign in to comment.