Skip to content

Instantly share code, notes, and snippets.

@upsilon
Created May 23, 2015 09:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save upsilon/3c8c3b2513501602c278 to your computer and use it in GitHub Desktop.
Save upsilon/3c8c3b2513501602c278 to your computer and use it in GitHub Desktop.
Equalsメソッドのテストを補助するやつ
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