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());
        }
Esempio n. 2
0
        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())");
        }
Esempio n. 4
0
        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()");
        }
Esempio n. 7
0
        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());
        }