Created
May 23, 2015 09:40
-
-
Save upsilon/3c8c3b2513501602c278 to your computer and use it in GitHub Desktop.
Equalsメソッドのテストを補助するやつ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace Program | |
{ | |
internal static class TestUtils | |
{ | |
public static void CheckEqualsMethod<T>(params Expression<Func<T, string>>[] fieldAccessLambda) | |
where T : new() | |
{ | |
foreach (var lambda in fieldAccessLambda) | |
{ | |
var assign = ConvertFieldAccessToAssign(lambda); | |
var fieldName = ((MemberExpression)lambda.Body).Member.Name; | |
var testObj1 = new T(); | |
var testObj2 = new T(); | |
assign(testObj1, "aaa"); | |
assign(testObj2, "aaa"); | |
Assert.True(testObj1.Equals(testObj2), fieldName); | |
assign(testObj1, "aaa"); | |
assign(testObj2, "bbb"); | |
Assert.False(testObj1.Equals(testObj2), fieldName); | |
Assert.False(testObj2.Equals(testObj1), fieldName); | |
assign(testObj1, null); | |
assign(testObj2, null); | |
Assert.True(testObj1.Equals(testObj2), fieldName); | |
assign(testObj1, null); | |
assign(testObj2, "aaa"); | |
Assert.False(testObj1.Equals(testObj2), fieldName); | |
Assert.False(testObj2.Equals(testObj1), fieldName); | |
} | |
} | |
/// <summary> | |
/// x => x.Hoge の式木を (x, y) => x.Hoge = y の形に変形します | |
/// </summary> | |
private static Action<Tin, Tout> ConvertFieldAccessToAssign<Tin, Tout>(Expression<Func<Tin, Tout>> fieldAccessLambda) | |
{ | |
var paramTestObject = fieldAccessLambda.Parameters.Single(); | |
var paramAssignValue = Expression.Parameter(typeof(Tout), "y"); | |
var fieldAssignLambda = Expression.Lambda<Action<Tin, Tout>>( | |
Expression.Assign((MemberExpression)fieldAccessLambda.Body, paramAssignValue), | |
paramTestObject, paramAssignValue); | |
return fieldAssignLambda.Compile(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment