PageRenderTime 1017ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/src/Should.Fluent/Model/BeMethodCallExpression.cs

http://should.codeplex.com
C# | 48 lines | 45 code | 3 blank | 0 comment | 21 complexity | 7b7b5feb46511cb0b67a33b16ce57978 MD5 | raw file
  1. using System.Linq.Expressions;
  2. namespace Should.Fluent.Model
  3. {
  4. public static class BeMethodCallExpressionExtensions
  5. {
  6. public static MethodCallExpression Equal(this IBe<MethodCallExpression> be, MethodCallExpression expectedCall)
  7. {
  8. return be.Should.Apply(
  9. (t, a) =>
  10. {
  11. if (GetMethodsAreUnEqual(expectedCall, t))
  12. {
  13. a.Fail("Expected method calls to be equal, but they were not.");
  14. }
  15. },
  16. (t, a) =>
  17. {
  18. if (GetMethodsAreUnEqual(expectedCall, t) == false)
  19. {
  20. a.Fail("Expected method calls to be equal, but they were not.");
  21. }
  22. });
  23. }
  24. private static bool GetMethodsAreUnEqual(MethodCallExpression expectedCall, MethodCallExpression target)
  25. {
  26. var bothNull = target == null && expectedCall == null;
  27. return !bothNull &&
  28. (target == null || expectedCall == null || !target.Method.Equals(expectedCall.Method) || !AllArgsAreEqual(expectedCall, target));
  29. }
  30. private static bool AllArgsAreEqual(MethodCallExpression expectedCall, MethodCallExpression target)
  31. {
  32. for (var i = 0; i < target.Arguments.Count; i++)
  33. {
  34. var targetArgValue = Expression.Lambda(target.Arguments[i]).Compile().DynamicInvoke();
  35. var expectedArgValue = Expression.Lambda(expectedCall.Arguments[i]).Compile().DynamicInvoke();
  36. var bothNull = targetArgValue == null && expectedArgValue == null;
  37. if (!bothNull && (targetArgValue == null || expectedArgValue == null || !targetArgValue.Equals(expectedArgValue)))
  38. {
  39. return false;
  40. }
  41. }
  42. return true;
  43. }
  44. }
  45. }