60 lines
2.0 KiB
C#
60 lines
2.0 KiB
C#
using System.Linq.Expressions;
|
|
|
|
namespace YLErp.BasicTests
|
|
{
|
|
[TestClass]
|
|
public class LinqExpressionTest
|
|
{
|
|
[TestMethod]
|
|
public void TestAddAssign()
|
|
{
|
|
var data = new LinqData { N1 = 3 };
|
|
|
|
Expression<Func<LinqData, double>> propExp = n => n.N1;
|
|
|
|
var pinvoke = Expression.Invoke(propExp, propExp.Parameters);
|
|
var addExp = Expression.Add(pinvoke, Expression.Constant(2d, typeof(double)));
|
|
var assign = Expression.Assign(propExp.Body, addExp);
|
|
var action = Expression.Lambda<Action<LinqData>>(assign, propExp.Parameters).Compile();
|
|
action(data);
|
|
|
|
Assert.AreEqual(data.N1, 5);
|
|
|
|
var data2 = new LinqData { N1 = 3 };
|
|
var assign2 = Expression.AddAssign(propExp.Body, Expression.Constant(3d, typeof(double)));
|
|
var action2 = Expression.Lambda<Action<LinqData>>(assign2, propExp.Parameters).Compile();
|
|
action2(data2);
|
|
|
|
Assert.AreEqual(data2.N1, 6);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void TestMultiplyAssign()
|
|
{
|
|
var data = new LinqData { N1 = 3 };
|
|
|
|
Expression<Func<LinqData, double>> propExp = n => n.N1;
|
|
|
|
var pinvoke = Expression.Invoke(propExp, propExp.Parameters);
|
|
var multiply = Expression.Multiply(pinvoke, Expression.Constant(1 + 0.2, typeof(double)));
|
|
var assign = Expression.Assign(propExp.Body, multiply);
|
|
var action = Expression.Lambda<Action<LinqData>>(assign, propExp.Parameters).Compile();
|
|
action(data);
|
|
|
|
Assert.AreEqual(data.N1, 3.6, 1e-4);
|
|
|
|
var data2 = new LinqData { N1 = 3 };
|
|
var assign2 = Expression.MultiplyAssign(propExp.Body, Expression.Constant(1.5, typeof(double)));
|
|
var action2 = Expression.Lambda<Action<LinqData>>(assign2, propExp.Parameters).Compile();
|
|
action2(data2);
|
|
|
|
Assert.AreEqual(data2.N1, 4.5, 1e-4);
|
|
}
|
|
|
|
class LinqData
|
|
{
|
|
public double N1 { get; set; }
|
|
}
|
|
}
|
|
}
|