public void ForBreak() { var counter = new Counter(); var c = Expression.Parameter(typeof(Counter), "c"); var l = Expression.Parameter(typeof(int), "l"); var i = Expression.Variable(typeof(int), "i"); var for_break = Expression.Label("for_break"); var hitcounter = Expression.Lambda <Action <Counter, int> > ( CustomExpression.For( i, Expression.Constant(0), Expression.LessThan(i, l), Expression.PreIncrementAssign(i), Expression.Block( Expression.Condition( Expression.LessThan(i, Expression.Constant(10)), Expression.Call(c, typeof(Counter).GetMethod("Hit", Type.EmptyTypes)), Expression.Goto(for_break))), for_break), c, l).Compile(); hitcounter(counter, 100); Assert.AreEqual(10, counter.Count); }
public void ForVisit() { var i = Expression.Variable(typeof(int), "i"); var for_break = Expression.Label("for_break"); var for_continue = Expression.Label("for_continue"); var forExpression = CustomExpression.For( i, Expression.Constant(0), Expression.LessThan(i, Expression.Constant(1)), Expression.PreIncrementAssign(i), Expression.Constant(null), for_break, for_continue); var visitedForExpression = (ForExpression)(new ReplaceNullByDefaultVisitor().Visit(forExpression)); Assert.AreNotEqual(forExpression, visitedForExpression); Assert.AreEqual(forExpression.Variable, visitedForExpression.Variable); Assert.AreEqual(forExpression.Initializer, visitedForExpression.Initializer); Assert.AreEqual(forExpression.Test, visitedForExpression.Test); Assert.AreEqual(forExpression.Step, visitedForExpression.Step); Assert.AreEqual(ExpressionType.Default, visitedForExpression.Body.NodeType); Assert.AreEqual(forExpression.BreakTarget, visitedForExpression.BreakTarget); Assert.AreEqual(forExpression.ContinueTarget, visitedForExpression.ContinueTarget); }
public void For() { var l = Expression.Parameter(typeof(int), "l"); var i = Expression.Variable(typeof(int), "i"); var lambda = Expression.Lambda <Action <int> > ( CustomExpression.For( i, Expression.Constant(0), Expression.LessThan(i, l), Expression.PreIncrementAssign(i), Expression.Call(typeof(Console).GetMethod("WriteLine", new [] { typeof(int) }), i)), l); AssertExpression(@" void (int l) { for (int i = 0; i < l; ++i) { Console.WriteLine(i); } } ", lambda); }
public ForExpression Update(ParameterExpression variable, Expression initializer, Expression test, Expression step, Expression body, LabelTarget breakTarget, LabelTarget continueTarget) { if (this.variable == variable && this.initializer == initializer && this.test == test && this.step == step && this.body == body && this.break_target == breakTarget && this.continue_target == continueTarget) { return(this); } return(CustomExpression.For(variable, initializer, test, step, body, breakTarget, continueTarget)); }
public void Never() { var counter = new Counter(); var c = Expression.Parameter(typeof(Counter), "c"); var l = Expression.Parameter(typeof(int), "l"); var i = Expression.Variable(typeof(int), "i"); var hitcounter = Expression.Lambda <Action <Counter, int> > ( CustomExpression.For( i, Expression.Constant(0), Expression.LessThan(i, l), Expression.PreIncrementAssign(i), Expression.Call(c, typeof(Counter).GetMethod("Hit", Type.EmptyTypes))), c, l).Compile(); hitcounter(counter, 0); Assert.AreEqual(0, counter.Count); }