public void ShouldTranslateAMultipleVariableBlockWithNoReturnValue() { var countOneVariable = Expression.Variable(typeof(int), "countOne"); var countTwoVariable = Expression.Variable(typeof(int), "countTwo"); var countThreeVariable = Expression.Variable(typeof(byte), "countThree"); var assignOneToCountOne = Expression.Assign(countOneVariable, Expression.Constant(1)); var assignTwoToCountTwo = Expression.Assign(countTwoVariable, Expression.Constant(2)); var sumCounts = Expression.Add(countOneVariable, countTwoVariable); var castSumToBye = Expression.Convert(sumCounts, typeof(byte)); var assignSumToCountThree = Expression.Assign(countThreeVariable, castSumToBye); var countBlock = Expression.Block( new[] { countOneVariable, countTwoVariable, countThreeVariable }, assignOneToCountOne, assignTwoToCountTwo, assignSumToCountThree); var translated = ToReadableString(countBlock); const string EXPECTED = @" var countOne = 1; var countTwo = 2; var countThree = (byte)(countOne + countTwo);"; translated.ShouldBe(EXPECTED.TrimStart()); }
public void ShouldIncludeReturnKeywordsForConstantsAndCasts() { var nullLong = Expression.Constant(null, typeof(long?)); var writeOne = CreateLambda(() => Console.WriteLine("One!")); var oneCastToLong = Expression.Convert(Expression.Constant(1), typeof(long?)); var elseBlock = Expression.Block(writeOne.Body, writeOne.Body, oneCastToLong); var nullOrOne = Expression.IfThenElse(Expression.Constant(true), nullLong, elseBlock); var translated = ToReadableString(nullOrOne); const string EXPECTED = @" if (true) { return null; } Console.WriteLine(""One!""); Console.WriteLine(""One!""); return ((long?)1);"; translated.ShouldBe(EXPECTED.TrimStart()); }
public void ShouldNotTerminateMethodCallArguments() { var objectVariable = Expression.Variable(typeof(object), "o"); var objectCastToInt = Expression.Convert(objectVariable, typeof(int)); var intToStringMethod = typeof(int).GetPublicInstanceMethods("ToString").First(); var intToStringCall = Expression.Call(objectCastToInt, intToStringMethod); var intToStringBlock = Expression.Block(intToStringCall); var openTextFile = CreateLambda((string str) => File.OpenText(str)); var openTextFileMethod = ((MethodCallExpression)openTextFile.Body).Method; var openTextFileCall = Expression.Call(openTextFileMethod, intToStringBlock); var translated = ToReadableString(openTextFileCall); translated.ShouldBe("File.OpenText(((int)o).ToString())"); }
public void ShouldTranslateConversionWithCustomStaticMethod() { var stringParameter = Expression.Parameter(typeof(string), "str"); var targetType = typeof(int); var body = Expression.Convert( stringParameter, targetType, targetType.GetPublicStaticMethod(nameof(int.Parse), stringParameter.Type)); var stringToIntParseLambda = Expression.Lambda <Func <string, int> >(body, stringParameter); var translated = ToReadableString(stringToIntParseLambda.Body); translated.ShouldBe("int.Parse(str)"); }
public void ShouldTranslateABlockAssignmentResultAssignment() { var longVariable = Expression.Variable(typeof(long), "i"); var intVariable = Expression.Variable(typeof(int), "j"); var assignInt = Expression.Assign(intVariable, Expression.Constant(10)); var castAssignmentResult = Expression.Convert(assignInt, typeof(long)); var assignIntBlock = Expression.Block(castAssignmentResult); var setLongVariableToAssignmentResult = Expression.Assign(longVariable, assignIntBlock); var assignmentBlock = Expression.Block( new[] { longVariable, intVariable }, setLongVariableToAssignmentResult); var translated = ToReadableString(assignmentBlock); const string EXPECTED = @" int j; var i = ((long)(j = 10));"; translated.ShouldBe(EXPECTED.TrimStart()); }
public void ShouldOnlyRemoveParenthesesIfNecessary() { var intVariable = Expression.Variable(typeof(int), "i"); var intVariableIsOne = Expression.Equal(intVariable, Expression.Constant(1)); var objectVariable = Expression.Variable(typeof(object), "o"); var objectCastToInt = Expression.Convert(objectVariable, typeof(int)); var intToStringMethod = typeof(object).GetPublicInstanceMethod("ToString"); var intToStringCall = Expression.Call(objectCastToInt, intToStringMethod); var emptyString = CreateLambda(() => string.Empty); var toStringOrEmptyString = Expression.Condition( intVariableIsOne, emptyString.Body, intToStringCall); var translated = ToReadableString(toStringOrEmptyString); translated.ShouldBe("(i == 1) ? string.Empty : ((int)o).ToString()"); }
public void ShouldTranslateAShortCircuitingIfStatement() { var oneCastToDouble = Expression.Convert(Expression.Constant(1), typeof(double?)); var ifTrueOne = Expression.IfThen(Expression.Constant(true), oneCastToDouble); var nullDouble = Expression.Constant(null, typeof(double?)); var block = Expression.Block(ifTrueOne, nullDouble); var translated = ToReadableString(block); const string EXPECTED = @" if (true) { return (double?)1; } return null;"; translated.ShouldBe(EXPECTED.TrimStart()); }