// 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); } } } }