public void ShouldUnindentGotoTargetLabels() { var labelTargetOne = Expression.Label(typeof(void), "One"); var labelOne = Expression.Label(labelTargetOne); var gotoOne = Expression.Goto(labelTargetOne); var labelTargetTwo = Expression.Label(typeof(void), "Two"); var labelTwo = Expression.Label(labelTargetTwo); var gotoTwo = Expression.Goto(labelTargetTwo); var gotoBlock = Expression.Block(labelOne, gotoTwo, labelTwo, gotoOne); var ifTrueGoto = Expression.IfThen(Expression.Constant(true), gotoBlock); var translated = ToReadableString(ifTrueGoto); const string EXPECTED = @" if (true) { One: goto Two; Two: goto One; }"; translated.ShouldBe(EXPECTED.TrimStart()); }
public void ShouldTranslateAGotoReturnStatement() { var returnTarget = Expression.Label(typeof(int), "Return"); var numberParameter = Expression.Parameter(typeof(string), "i"); var numberEqualsOne = Expression.Equal(numberParameter, Expression.Constant("One")); var returnOne = Expression.Goto(returnTarget, Expression.Constant(1)); var ifOneReturnOne = Expression.IfThen(numberEqualsOne, returnOne); var returnLabel = Expression.Label(returnTarget, Expression.Constant(0)); var gotoBlock = Expression.Block(ifOneReturnOne, returnLabel); var gotoLambda = Expression.Lambda <Func <string, int> >(gotoBlock, numberParameter); gotoLambda.Compile(); var translated = ToReadableString(gotoLambda); const string EXPECTED = @" i => { if (i == ""One"") { return 1; } return 0; }"; translated.ShouldBe(EXPECTED.TrimStart()); }
public void ShouldTranslateGotoStatements() { var labelTargetOne = Expression.Label(typeof(void), "One"); var labelOne = Expression.Label(labelTargetOne); var writeOne = CreateLambda(() => Console.Write("One")); var gotoOne = Expression.Goto(labelTargetOne); var labelTargetTwo = Expression.Label(typeof(void), "Two"); var labelTwo = Expression.Label(labelTargetTwo); var writeTwo = CreateLambda(() => Console.Write("Two")); var gotoTwo = Expression.Goto(labelTargetTwo); var intVariable = Expression.Variable(typeof(int), "i"); var intEqualsOne = Expression.Equal(intVariable, Expression.Constant(1)); var intEqualsTwo = Expression.Equal(intVariable, Expression.Constant(2)); var ifTwoGotoTwo = Expression.IfThen(intEqualsTwo, gotoTwo); var gotoOneOrTwo = Expression.IfThenElse(intEqualsOne, gotoOne, ifTwoGotoTwo); var writeNeither = CreateLambda(() => Console.Write("Neither")); var returnFromBlock = Expression.Return(Expression.Label()); var block = Expression.Block( gotoOneOrTwo, writeNeither.Body, returnFromBlock, labelOne, writeOne.Body, labelTwo, writeTwo.Body); var translated = ToReadableString(block); const string EXPECTED = @" if (i == 1) { goto One; } else if (i == 2) { goto Two; } Console.Write(""Neither""); return; One: Console.Write(""One""); Two: Console.Write(""Two""); "; translated.ShouldBe(EXPECTED.Trim()); }