// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschraenkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using System.Diagnostics; using Xunit; namespace Squidex.Infrastructure.Reflection { public class SimpleMapperTests { public class Class1Base { public T1 P1 { get; set; } } public class Class1 : Class1Base { public T2 P2 { get; set; } } public class Class2Base { public T2 P2 { get; set; } } public class Class2 : Class2Base { public T3 P3 { get; set; } } public class Readonly { public T P1 { get; } } public class Writeonly { #pragma warning disable MA0041 // Make property static public T P1 #pragma warning restore MA0041 // Make property static { set => Debug.WriteLine(value); } } [Fact] public void Should_throw_exception_if_mapping_with_null_source() { Assert.Throws(() => SimpleMapper.Map((Class2?)null!, new Class2())); } [Fact] public void Should_throw_exception_if_mapping_with_null_target() { Assert.Throws(() => SimpleMapper.Map(new Class2(), (Class2?)null!)); } [Fact] public void Should_map_to_same_type() { var obj1 = new Class1 { P1 = 6, P2 = 8 }; var obj2 = SimpleMapper.Map(obj1, new Class2()); Assert.Equal(8, obj2.P2); Assert.Equal(0, obj2.P3); } [Fact] public void Should_map_all_properties() { var obj1 = new Class1 { P1 = 6, P2 = 8 }; var obj2 = SimpleMapper.Map(obj1, new Class1()); Assert.Equal(6, obj2.P1); Assert.Equal(8, obj2.P2); } [Fact] public void Should_map_to_convertible_type() { var obj1 = new Class1 { P1 = 6, P2 = 8 }; var obj2 = SimpleMapper.Map(obj1, new Class2()); Assert.Equal(8, obj2.P2); Assert.Equal(0, obj2.P3); } [Fact] public void Should_map_from_nullable() { var obj1 = new Class1 { P1 = 6, P2 = 8 }; var obj2 = SimpleMapper.Map(obj1, new Class2()); Assert.Equal(8, obj2.P2); Assert.Equal(0, obj2.P3); } [Fact] public void Should_map_to_nullable() { var obj1 = new Class1 { P1 = 6, P2 = 8 }; var obj2 = SimpleMapper.Map(obj1, new Class2()); Assert.Equal(8, obj2.P2); Assert.Null(obj2.P3); } [Fact] public void Should_map_if_convertible_is_null() { var obj1 = new Class1 { P1 = null, P2 = null }; var obj2 = SimpleMapper.Map(obj1, new Class1()); Assert.Equal(0, obj2.P1); Assert.Equal(0, obj2.P2); } [Fact] public void Should_convert_to_string() { var obj1 = new Class1 { P1 = RefToken.User("1"), P2 = RefToken.User("2") }; var obj2 = SimpleMapper.Map(obj1, new Class2()); Assert.Equal("subject:2", obj2.P2); Assert.Null(obj2.P3); } [Fact] public void Should_return_default_if_conversion_failed() { var obj1 = new Class1 { P1 = long.MaxValue, P2 = long.MaxValue }; var obj2 = SimpleMapper.Map(obj1, new Class2()); Assert.Equal(0, obj2.P2); Assert.Equal(0, obj2.P3); } [Fact] public void Should_ignore_write_only() { var obj1 = new Writeonly(); var obj2 = SimpleMapper.Map(obj1, new Class1()); Assert.Equal(0, obj2.P1); } [Fact] public void Should_ignore_read_only() { var obj1 = new Class1 { P1 = 10 }; var obj2 = SimpleMapper.Map(obj1, new Readonly()); Assert.Equal(0, obj2.P1); } } }