ConverterExpressionVisitorTest.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using Masuit.Tools.Mapping;
  2. using Masuit.Tools.Mapping.Visitor;
  3. using Masuit.Tools.UnitTest.Mapping.ClassTests;
  4. using Microsoft.VisualStudio.TestTools.UnitTesting;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Linq.Expressions;
  9. namespace Masuit.Tools.UnitTest.Mapping.Core
  10. {
  11. [TestClass]
  12. public class ConverterExpressionVisitorTest
  13. {
  14. [ClassInitialize]
  15. public static void Init(TestContext context)
  16. {
  17. Clean();
  18. ExpressionMapper.CreateMap<ClassSource, ClassDest>().ForMember(s => s.PropString1, d => d.PropString2).ReverseMap();
  19. ExpressionMapper.CreateMap<ClassDest2, ClassSource2>().ForMember(s => s.PropString2, d => d.PropString1).ReverseMap();
  20. ExpressionMapper.Initialize();
  21. }
  22. [ClassCleanup]
  23. public static void Clean()
  24. {
  25. ExpressionMapper.Reset();
  26. }
  27. [TestMethod]
  28. public void VisitMember_Expression_SimpleProperty_Success()
  29. {
  30. Init(null);
  31. Expression<Func<ClassDest, bool>> expected = x => x.PropString2 == "test";
  32. ConverterExpressionVisitor visitor = new ConverterExpressionVisitor(GetParametersDictionnary(expected, typeof(ClassSource)), typeof(ClassSource));
  33. var actual = visitor.Visit(expected);
  34. var test = actual as BinaryExpression;
  35. Assert.IsNotNull(test);
  36. Assert.IsInstanceOfType(test.Left, typeof(MemberExpression));
  37. Assert.AreEqual((test.Left as MemberExpression).Member.ReflectedType, typeof(ClassSource));
  38. Assert.AreEqual((test.Left as MemberExpression).Member.Name, "PropString1");
  39. Clean();
  40. }
  41. [TestMethod]
  42. public void VisitMember_Expression_SubClassProperty_Success()
  43. {
  44. Init(null);
  45. Expression<Func<ClassSource, bool>> expected = x => x.SubClass.PropString1 == "test";
  46. ConverterExpressionVisitor visitor = new ConverterExpressionVisitor(GetParametersDictionnary(expected, typeof(ClassDest)), typeof(ClassDest));
  47. var actual = visitor.Visit(expected);
  48. var test = actual as BinaryExpression;
  49. Assert.IsNotNull(test);
  50. Assert.IsInstanceOfType(test.Left, typeof(MemberExpression));
  51. Assert.AreEqual((test.Left as MemberExpression).Member.ReflectedType, typeof(ClassDest2));
  52. Assert.AreEqual((test.Left as MemberExpression).Member.Name, "PropString2");
  53. }
  54. [TestMethod]
  55. public void VisitMember_Expression_SimpleProperty_MultiCondition_Success()
  56. {
  57. Init(null);
  58. Expression<Func<ClassDest, bool>> expected = x => x.PropString2 == "test" && x.PropString2 == "test3";
  59. ConverterExpressionVisitor visitor = new ConverterExpressionVisitor(GetParametersDictionnary(expected, typeof(ClassSource)), typeof(ClassSource));
  60. var actual = visitor.Visit(expected);
  61. var test = actual as BinaryExpression;
  62. Assert.IsNotNull(test);
  63. Assert.IsInstanceOfType(test.Left, typeof(BinaryExpression));
  64. Assert.IsInstanceOfType(test.Right, typeof(BinaryExpression));
  65. Assert.AreEqual(((test.Left as BinaryExpression).Left as MemberExpression).Member.Name, "PropString1");
  66. Assert.AreEqual(((test.Right as BinaryExpression).Left as MemberExpression).Member.Name, "PropString1");
  67. Clean();
  68. }
  69. [TestMethod]
  70. public void VisitMember_Expression_SimpleProperty_MultiCondition_SubClass_Success()
  71. {
  72. Init(null);
  73. Expression<Func<ClassDest, bool>> expected = x => x.PropString2 == "test" && x.SubClass.PropString2 == "test";
  74. ConverterExpressionVisitor visitor = new ConverterExpressionVisitor(GetParametersDictionnary(expected, typeof(ClassSource)), typeof(ClassSource));
  75. var actual = visitor.Visit(expected);
  76. var test = actual as BinaryExpression;
  77. Assert.IsNotNull(test);
  78. Assert.IsInstanceOfType(test.Left, typeof(BinaryExpression));
  79. Assert.IsInstanceOfType(test.Right, typeof(BinaryExpression));
  80. Assert.AreEqual(((test.Left as BinaryExpression).Left as MemberExpression).Member.Name, "PropString1");
  81. Assert.AreEqual(((test.Right as BinaryExpression).Left as MemberExpression).Member.Name, "PropString1");
  82. Clean();
  83. }
  84. [TestMethod]
  85. public void VisitMember_Expression_ExtentionMethod_Success()
  86. {
  87. Clean();
  88. ExpressionMapper.CreateMap<ClassDest, ClassSource>().ForMember(s => s.PropString2, d => d.PropString1).ForMember(s => s.SubClass, d => d.SubClass).ForMember(s => s.CountListProp, d => d.ListProp.Count());
  89. Expression<Func<ClassDest, bool>> expected = x => x.CountListProp > 0;
  90. ConverterExpressionVisitor visitor = new ConverterExpressionVisitor(GetParametersDictionnary(expected, typeof(ClassSource)), typeof(ClassSource));
  91. var actual = visitor.Visit(expected);
  92. var test = actual as BinaryExpression;
  93. Assert.IsNotNull(test);
  94. Clean();
  95. }
  96. [TestMethod]
  97. public void Visit_Null_Expression_Success()
  98. {
  99. Init(null);
  100. Expression<Func<ClassDest, bool>> expected = null;
  101. ConverterExpressionVisitor visitor = new ConverterExpressionVisitor(GetParametersDictionnary(expected, typeof(ClassSource)), typeof(ClassSource));
  102. var actual = visitor.Visit(expected);
  103. Assert.IsNull(actual);
  104. }
  105. private Dictionary<Expression, Expression> GetParametersDictionnary<TFrom>(Expression<TFrom> from, Type toType)
  106. {
  107. Dictionary<Expression, Expression> parameterMap = new Dictionary<Expression, Expression>();
  108. if (from != null)
  109. {
  110. ParameterExpression[] newParams = new ParameterExpression[from.Parameters.Count];
  111. for (int i = 0; i < newParams.Length; i++)
  112. {
  113. newParams[i] = Expression.Parameter(toType, from.Parameters[i].Name);
  114. parameterMap[from.Parameters[i]] = newParams[i];
  115. }
  116. }
  117. return parameterMap;
  118. }
  119. }
  120. }