private static void FromIntAndBackAgain <TValue>(int value)
        {
            var generator = new CoreExpressionGenerator();

            var intParam   = Expression.Parameter(typeof(int), "iVal");
            var fromIntExp = generator.Generate(new ConversionExpressionRequest(generator, intParam, typeof(TValue)));

            Assert.NotNull(fromIntExp);
            var fromIntFunc  = Expression.Lambda <Func <int, TValue> >(fromIntExp, intParam).Compile();
            var genericParam = Expression.Parameter(typeof(TValue), "tVal");
            var toIntExp     = generator.Generate(new ConversionExpressionRequest(generator, genericParam, typeof(int)));

            Assert.NotNull(toIntExp);
            var toIntFunc = Expression.Lambda <Func <TValue, int> >(toIntExp, genericParam).Compile();

            var expectedGenericValue = ConvertTo <TValue>(value);

            var genericValue = fromIntFunc(value);

            Assert.Equal(expectedGenericValue, genericValue);

            var intResult = toIntFunc(genericValue);

            Assert.Equal(value, intResult);
        }
        private static void FromDoubleAndBackAgain <TValue>(double value)
        {
            var generator = new CoreExpressionGenerator();

            var doubleParam   = Expression.Parameter(typeof(double), "dVal");
            var fromDoubleExp = generator.Generate(new ConversionExpressionRequest(generator, doubleParam, typeof(TValue)));

            Assert.NotNull(fromDoubleExp);
            var fromDoubleFunc = Expression.Lambda <Func <double, TValue> >(fromDoubleExp, doubleParam).Compile();
            var genericParam   = Expression.Parameter(typeof(TValue), "tVal");
            var toDoubleExp    = generator.Generate(new ConversionExpressionRequest(generator, genericParam, typeof(double)));

            Assert.NotNull(toDoubleExp);
            var toDoubleFunc = Expression.Lambda <Func <TValue, double> >(toDoubleExp, genericParam).Compile();

            var expectedGenericValue = ConvertTo <TValue>(value);

            var genericValue = fromDoubleFunc(value);

            Assert.Equal(expectedGenericValue, genericValue);

            var doubleResult = toDoubleFunc(genericValue);

            Assert.Equal(value, doubleResult, 5);
        }
        private static void GenericAdd <TValue>(double a, double b)
        {
            var generator     = new CoreExpressionGenerator();
            var expected      = ConvertTo <TValue>(a + b);
            var leftHandSide  = Expression.Parameter(typeof(TValue), "leftHandSide");
            var rightHandSide = Expression.Parameter(typeof(TValue), "rightHandSide");
            var expression    = generator.Generate(new FunctionExpressionGenerationRequest(generator, "Add", leftHandSide, rightHandSide));

            Assert.NotNull(expression);
            var func   = Expression.Lambda <Func <TValue, TValue, TValue> >(expression, leftHandSide, rightHandSide).Compile();
            var result = func(ConvertTo <TValue>(a), ConvertTo <TValue>(b));

            Assert.Equal(expected, result);
        }
        private static void ConstantIs <TValue>(string constantName, double value)
        {
            var generator = new CoreExpressionGenerator();

            var expected = ConvertTo <TValue>(value);

            var expression = generator.Generate(
                new ConstantExpressionGenerationRequest(generator, constantName, typeof(TValue)));

            Assert.NotNull(expression);
            var func   = Expression.Lambda <Func <TValue> >(expression).Compile();
            var result = func();

            Assert.Equal(expected, result);
        }