using System; using ZeroLevel.Services.ObjectMapping; using ZeroMappingTest.Models; using System.Collections.Generic; using BusinessApp.DatabaseTest.Model; using Xunit; namespace ZeroMappingTest { public class MappingTest { [Fact] public void TestAbstractClassGetInfo() { // Arrange var mapper = TypeMapper.Create(); // Act var list = new List(); mapper.TraversalMembers(f => list.Add(f.Name)); // Assert Assert.True(mapper.Exists("Id")); Assert.True(mapper.Exists("Title")); Assert.True(mapper.Exists("Description")); Assert.Contains(list, s => s.Equals("Id", StringComparison.Ordinal)); Assert.Contains(list, s => s.Equals("Title", StringComparison.Ordinal)); Assert.Contains(list, s => s.Equals("Description", StringComparison.Ordinal)); Assert.False(mapper.Exists("Version")); Assert.False(mapper.Exists("Created")); Assert.DoesNotContain(list, s => s.Equals("Version", StringComparison.Ordinal)); Assert.DoesNotContain(list, s => s.Equals("Created", StringComparison.Ordinal)); Assert.Equal(typeof(BaseClass), mapper.EntityType); } [Fact] public void TestInheritedClassGetInfo() { // Arrange var mapper = TypeMapper.Create(); // Act var list = new List(); mapper.TraversalMembers(f => list.Add(f.Name)); // Assert Assert.True(mapper.Exists("Id")); Assert.True(mapper.Exists("Title")); Assert.True(mapper.Exists("Description")); Assert.True(mapper.Exists("Number")); Assert.True(mapper.Exists("Balance")); Assert.True(mapper.Exists("ReadOnlyProperty")); Assert.True(mapper.Exists("WriteOnlyProperty")); Assert.Contains(list, s => s.Equals("Id", StringComparison.Ordinal)); Assert.Contains(list, s => s.Equals("Title", StringComparison.Ordinal)); Assert.Contains(list, s => s.Equals("Description", StringComparison.Ordinal)); Assert.Contains(list, s => s.Equals("Number", StringComparison.Ordinal)); Assert.Contains(list, s => s.Equals("Balance", StringComparison.Ordinal)); Assert.Contains(list, s => s.Equals("ReadOnlyProperty", StringComparison.Ordinal)); Assert.Contains(list, s => s.Equals("WriteOnlyProperty", StringComparison.Ordinal)); Assert.False(mapper.Exists("HiddenField")); Assert.False(mapper.Exists("Version")); Assert.False(mapper.Exists("Created")); Assert.DoesNotContain(list, s => s.Equals("HiddenField", StringComparison.Ordinal)); Assert.DoesNotContain(list, s => s.Equals("Version", StringComparison.Ordinal)); Assert.DoesNotContain(list, s => s.Equals("Created", StringComparison.Ordinal)); Assert.Equal(typeof(ChildClass), mapper.EntityType); } [Fact] public void TestAbstractClassMapping() { // Arrange var instance = new ChildClass { Id = Guid.Empty, Title = "title", Description = "description", WriteOnlyProperty = 100, Balance = 100, Number = 100 }; var mapper = TypeMapper.Create(); // Act var id = Guid.NewGuid(); var title = "New title"; var description = "New description"; mapper.Set(instance, "Id", id); mapper.Set(instance, "Title", title); mapper.Set(instance, "Description", description); // Assert Assert.Equal(id, mapper.Get(instance, "Id")); Assert.Equal(title, mapper.Get(instance, "Title")); Assert.Equal(description, mapper.Get(instance, "Description")); Assert.Equal(id, mapper.Get(instance, "Id")); Assert.Equal(title, mapper.Get(instance, "Title")); Assert.Equal(description, mapper.Get(instance, "Description")); try { mapper.Get(instance, "Number"); Assert.True(false, "Must be inaccessability"); } catch { } } [Fact] public void TestInheritedClassMapping() { // Arrange var instance = new ChildClass { Id = Guid.Empty, Title = "title", Description = "description", WriteOnlyProperty = 100, Balance = 100, Number = 100 }; var mapper = TypeMapper.Create(); // Act var id = Guid.NewGuid(); var title = "New title"; var description = "New description"; var number = 5465; var balance = 5555; mapper.Set(instance, "Id", id); mapper.Set(instance, "Title", title); mapper.Set(instance, "Description", description); mapper.Set(instance, "Number", number); mapper.Set(instance, "Balance", balance); // Assert Assert.Equal(mapper.Get(instance, "Id"), id); Assert.Equal(mapper.Get(instance, "Title"), title); Assert.Equal(mapper.Get(instance, "Description"), description); Assert.Equal(mapper.Get(instance, "Number"), number); Assert.Equal(mapper.Get(instance, "Balance"), balance); Assert.Equal(mapper.Get(instance, "Id"), id); Assert.Equal(mapper.Get(instance, "Title"), title); Assert.Equal(mapper.Get(instance, "Description"), description); Assert.Equal(mapper.Get(instance, "Number"), number); Assert.Equal(mapper.Get(instance, "Balance"), balance); try { var test = 1000; mapper.Set(instance, "ReadOnlyProperty", test); Assert.True(false, "There should be no possibility to set a value."); } catch { } try { mapper.Get(instance, "WriteOnlyProperty"); Assert.True(false, "There should be no possibility to get a value."); } catch { } try { mapper.GetOrDefault(instance, "WriteOnlyProperty", null); } catch { Assert.True(false, "It should be possible to get the default value."); } try { mapper.Get(instance, "Number"); } catch (Exception ex) { Assert.True(false, ex.Message); } } [Fact] public void TestMapperscaching() { // Arrange var mapper1 = TypeMapper.Create(); var mapper2 = TypeMapper.Create(); var mapper3 = TypeMapper.Create(false); // Act // Assert Assert.Same(mapper1, mapper2); Assert.NotSame(mapper1, mapper3); Assert.NotSame(mapper3, mapper2); } [Fact] public void PocoFieldMapper() { // Arrange var date = new DateTime(2005, 09, 27); var mapper = new TypeMapper(typeof(PocoFields)); var obj = new PocoFields { Id = 1000, Date = date, Title = "Caption" }; // Assert Assert.Equal(typeof(PocoFields), mapper.EntityType); Assert.True(mapper.Exists("Id")); Assert.True(mapper.Exists("Date")); Assert.True(mapper.Exists("Title")); Assert.Equal((long)1000, mapper.Get(obj, "Id")); Assert.Equal(date, mapper.Get(obj, "Date")); Assert.Equal("Caption", mapper.Get(obj, "Title")); mapper.Set(obj, "Id", 1001); Assert.Equal(mapper.Get(obj, "Id"), (long)1001); } [Fact] public void PocoPropertiesMapper() { // Arrange var date = new DateTime(2005, 09, 27); var mapper = new TypeMapper(typeof(PocoProperties)); var obj = new PocoProperties { Id = 1000, Date = date, Title = "Caption" }; // Assert Assert.Equal(typeof(PocoProperties), mapper.EntityType); Assert.True(mapper.Exists("Id")); Assert.True(mapper.Exists("Date")); Assert.True(mapper.Exists("Title")); Assert.Equal((long)1000, mapper.Get(obj, "Id")); Assert.Equal(date, mapper.Get(obj, "Date")); Assert.Equal("Caption", mapper.Get(obj, "Title")); mapper.Set(obj, "Id", 1001); Assert.Equal(mapper.Get(obj, "Id"), (long)1001); } } }