Ace.CSharp.StructuredAutoMapper
record BarEntity ( Guid Id , string Value ) ;
record BarDto ( Guid Id , string Value ) ;
class BarMappingProfile : OneWayProfile < BarEntity , BarDto >
{
}
record FooEntity ( Guid Id , string Value ) ;
record FooDto ( Guid Id , string Value ) ;
class FooMappingProfile : TwoWayProfile < FooEntity , FooDto >
{
}
Two-way Mapping Profile (Explicit)
class TransactionEntity
{
public int Id { get ; set ; }
public Guid OperatorId { get ; set ; }
public DateTimeOffset ProcessedAt { get ; set ; }
public double Amount { get ; set ; }
}
class TransactionDto
{
public int Id { get ; set ; }
public long ProcessedAt { get ; set ; }
public double Amount { get ; set ; }
}
class TransactionMappingProfile : TwoWayProfile < TransactionEntity , TransactionDto >
{
public override void ConfigureLeftToRightMapping ( )
{
CreateMap < TransactionEntity , TransactionDto > ( )
. ForMember (
dto => dto . Id ,
options => options . MapFrom ( entity => entity . Id ) )
. ForMember (
dto => dto . ProcessedAt ,
options => options . MapFrom ( entity => entity . ProcessedAt . ToUnixTimeMilliseconds ( ) ) )
. ForMember (
dto => dto . Amount ,
options => options . MapFrom ( entity => entity . Amount ) ) ;
}
public override void ConfigureRightToLeftMapping ( )
{
CreateMap < TransactionDto , TransactionEntity > ( )
. ForMember (
entity => entity . Id ,
options => options . MapFrom ( dto => dto . Id ) )
. ForMember (
entity => entity . OperatorId ,
options => options . Ignore ( ) )
. ForMember (
entity => entity . ProcessedAt ,
options => options . MapFrom ( dto => DateTimeOffset . FromUnixTimeMilliseconds ( dto . ProcessedAt ) ) )
. ForMember (
entity => entity . Amount ,
options => options . MapFrom ( dto => dto . Amount ) ) ;
}
}
public sealed class BarMappingProfileTests
: BaseOneWayProfileTests < BarMappingProfile , BarEntity , BarDto >
{
protected sealed override Func < BarEntity > Left =>
( ) => new BarEntity ( Guid . NewGuid ( ) , "bar" ) ;
protected sealed override Action < BarEntity , BarDto > LeftToRightAssertions =>
( entity , dto ) =>
{
// FluentAssertions
dto . Id . Should ( ) . Be ( entity . Id ) ;
dto . Value . Should ( ) . Be ( entity . Value ) ;
// xUnit Assertions
Assert . Equal ( entity . Id , dto . Id ) ;
Assert . Equal ( entity . Value , dto . Value ) ;
} ;
[ Fact ]
public sealed override void GivenMapFromLeftToRightWhenSourceIsNotNullThenMapsData ( )
{
base . GivenMapFromLeftToRightWhenSourceIsNotNullThenMapsData ( ) ;
}
[ Fact ]
public sealed override void GivenMapFromLeftToRightWhenSourceIsNullThenHandlesGracefully ( )
{
base . GivenMapFromLeftToRightWhenSourceIsNullThenHandlesGracefully ( ) ;
}
[ Fact ]
public sealed override void GivenMapFromRightToLeftWhenMappingIsNotConfiguredThenThrowsException ( )
{
base . GivenMapFromRightToLeftWhenMappingIsNotConfiguredThenThrowsException ( ) ;
}
}
public sealed class FooMappingProfileTests
: BaseTwoWayProfileTests < FooMappingProfile , FooEntity , FooDto >
{
protected sealed override Func < FooEntity > Left =>
( ) => new FooEntity ( Guid . NewGuid ( ) , "foo" ) ;
protected sealed override Func < FooDto > Right =>
( ) => new FooDto ( Guid . NewGuid ( ) , "foo-dto" ) ;
protected sealed override Action < FooEntity , FooDto > ? LeftToRightAssertions =>
( entity , dto ) =>
{
dto . Id . Should ( ) . Be ( entity . Id ) ;
dto . Value . Should ( ) . Be ( entity . Value ) ;
} ;
protected sealed override Action < FooDto , FooEntity > ? RightToLeftAssertions =>
( dto , entity ) =>
{
entity . Id . Should ( ) . Be ( dto . Id ) ;
entity . Value . Should ( ) . Be ( dto . Value ) ;
} ;
[ Fact ]
public sealed override void GivenMapFromLeftToRightWhenSourceIsNullThenHandlesGracefully ( )
{
base . GivenMapFromLeftToRightWhenSourceIsNullThenHandlesGracefully ( ) ;
}
[ Fact ]
public sealed override void GivenMapFromLeftToRightWhenSourceIsNotNullThenMapsData ( )
{
base . GivenMapFromLeftToRightWhenSourceIsNotNullThenMapsData ( ) ;
}
[ Fact ]
public sealed override void GivenMapFromRightToLeftWhenSourceIsNullThenHandlesGracefully ( )
{
base . GivenMapFromRightToLeftWhenSourceIsNullThenHandlesGracefully ( ) ;
}
[ Fact ]
public sealed override void GivenMapFromRightToLeftWhenSourceIsNotNullThenMapsData ( )
{
base . GivenMapFromRightToLeftWhenSourceIsNotNullThenMapsData ( ) ;
}
}
public sealed class TransactionMappingProfileTests
: BaseTwoWayProfileTests < TransactionMappingProfile , TransactionEntity , TransactionDto >
{
protected sealed override Func < TransactionEntity > Left =>
( ) =>
new TransactionEntity
{
Id = 1 ,
OperatorId = Guid . Empty ,
ProcessedAt = DateTimeOffset . UtcNow ,
Amount = 1.2345D
} ;
protected sealed override Func < TransactionDto > Right =>
( ) =>
new TransactionDto
{
Id = 1 ,
ProcessedAt = DateTimeOffset . UtcNow . ToUnixTimeMilliseconds ( ) ,
Amount = 9.8765D
} ;
protected sealed override Action < TransactionEntity , TransactionDto > ? LeftToRightAssertions =>
( entity , dto ) =>
{
dto . Id . Should ( ) . Be ( entity . Id ) ;
dto . ProcessedAt . Should ( ) . Be ( entity . ProcessedAt . ToUnixTimeMilliseconds ( ) ) ;
dto . Amount . Should ( ) . Be ( entity . Amount ) ;
} ;
protected sealed override Action < TransactionDto , TransactionEntity > ? RightToLeftAssertions =>
( dto , entity ) =>
{
entity . Id . Should ( ) . Be ( dto . Id ) ;
entity . OperatorId . Should ( ) . BeEmpty ( ) ;
entity . ProcessedAt . Should ( ) . Be ( DateTimeOffset . FromUnixTimeMilliseconds ( dto . ProcessedAt ) ) ;
entity . Amount . Should ( ) . Be ( dto . Amount ) ;
} ;
[ Fact ]
public sealed override void GivenMapFromLeftToRightWhenSourceIsNullThenHandlesGracefully ( )
{
base . GivenMapFromLeftToRightWhenSourceIsNullThenHandlesGracefully ( ) ;
}
[ Fact ]
public sealed override void GivenMapFromLeftToRightWhenSourceIsNotNullThenMapsData ( )
{
base . GivenMapFromLeftToRightWhenSourceIsNotNullThenMapsData ( ) ;
}
[ Fact ]
public sealed override void GivenMapFromRightToLeftWhenSourceIsNullThenHandlesGracefully ( )
{
base . GivenMapFromRightToLeftWhenSourceIsNullThenHandlesGracefully ( ) ;
}
[ Fact ]
public sealed override void GivenMapFromRightToLeftWhenSourceIsNotNullThenMapsData ( )
{
base . GivenMapFromRightToLeftWhenSourceIsNotNullThenMapsData ( ) ;
}
}
AceCSharp.StructuredAutoMapper is Copyright © 2023 Dimitrie Tataru and other contributors under the MIT license .