// 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.Globalization;
using System.IO;
using System.Linq;
using Xunit;
namespace CsvHelper.Tests.Mappings
{
public class RuntimeMapping
{
[Fact]
public void ConstantTest()
{
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
writer.WriteLine("AId,BId,CId");
writer.WriteLine("1,2,3");
writer.Flush();
stream.Position = 0;
var map = new DefaultClassMap();
var type = typeof(A);
var member = type.GetProperty("AId");
map.Map(type, member).Constant(4);
csv.Context.RegisterClassMap(map);
var records = csv.GetRecords().ToList();
Assert.Equal(4, records[0].AId);
}
}
[Fact]
public void DefaultTest()
{
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
writer.WriteLine("AId,BId,CId");
writer.WriteLine(",2,3");
writer.Flush();
stream.Position = 0;
var map = new DefaultClassMap();
var type = typeof(A);
var member = type.GetProperty("AId");
map.Map(type, member).Default(4);
csv.Context.RegisterClassMap(map);
var records = csv.GetRecords().ToList();
Assert.Equal(4, records[0].AId);
}
}
[Fact]
public void ConstantNullableTest()
{
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
writer.WriteLine("AId,BId,CId,NullableNum");
writer.WriteLine("1,2,3,1");
writer.Flush();
stream.Position = 0;
var map = new DefaultClassMap();
var type = typeof(A);
var member = type.GetProperty("NullableNum");
map.Map(type, member).Constant(4);
csv.Context.RegisterClassMap(map);
var records = csv.GetRecords().ToList();
Assert.Equal(4, records[0].NullableNum);
}
}
[Fact]
public void DefaultNullableTest()
{
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
writer.WriteLine("AId,BId,CId,NullableNum");
writer.WriteLine("1,2,3,");
writer.Flush();
stream.Position = 0;
var map = new DefaultClassMap();
var type = typeof(A);
var member = type.GetProperty("NullableNum");
map.Map(type, member).Default(4);
csv.Context.RegisterClassMap(map);
var records = csv.GetRecords().ToList();
Assert.Equal(4, records[0].NullableNum);
}
}
[Fact]
public void ConstantValueTypeNullTest()
{
Assert.Throws(() => new ConstantValueTypeNullMap());
}
[Fact]
public void ConstantTypeMismatchTest()
{
Assert.Throws(() => new ConstantTypeMismatchMap());
}
[Fact]
public void DefaultValueTypeNullTest()
{
Assert.Throws(() => new DefaultValueTypeNullMap());
}
[Fact]
public void DefaultTypeMismatchTest()
{
Assert.Throws(() => new DefaultTypeMismatchMap());
}
private class A
{
public int AId { get; set; }
public int? NullableNum { get; set; }
public B B { get; set; }
}
private class B
{
public int BId { get; set; }
public C C { get; set; }
}
private class C
{
public int CId { get; set; }
}
private class ObjectProperty
{
public object O { get; set; }
}
private class ConstantValueTypeNullMap : ClassMap
{
public ConstantValueTypeNullMap()
{
Map(m => m.AId).Constant(null);
}
}
private class ConstantTypeMismatchMap : ClassMap
{
public ConstantTypeMismatchMap()
{
Map(m => m.AId).Constant((uint)1);
}
}
private class DefaultValueTypeNullMap : ClassMap
{
public DefaultValueTypeNullMap()
{
Map(m => m.AId).Constant(null);
}
}
private class DefaultTypeMismatchMap : ClassMap
{
public DefaultTypeMismatchMap()
{
Map(m => m.AId).Constant((uint)1);
}
}
}
}