Beispiel #1
0
 public void Visit(FuncExpression <T> expression)
 {
     if (_random.NextDouble() < _mutationRate.GetValue())
     {
         MutateFuncExpression(expression);
     }
 }
            public void Evaluate_WhenCalled_ReturnsExpected()
            {
                var expression = new FuncExpression <SomeClass>()
                {
                    Left      = new ValueExpression <SomeClass>(5.0),
                    Right     = new ValueExpression <SomeClass>(9.0),
                    Operation = new Operation((a, b) => a + b, "+"),
                };

                var someClass = new SomeClass();

                Assert.That(expression.Evaluate(someClass), Is.EqualTo(14.0));
            }
Beispiel #3
0
        private void MutateFuncExpression(FuncExpression <T> expression)
        {
            var rand = _random.NextDouble();

            if (rand < 0.33)
            {
                expression.Left = _expressionGenerator.GetRandomExpression();
            }
            else if (rand < 0.67)
            {
                expression.Right = _expressionGenerator.GetRandomExpression();
            }
            else
            {
                expression.Operation = _expressionGenerator.GetRandomOperation();
            }
        }
            public void Evaluate_WhenClonedAndCloneHasRightChanged_Unchanged()
            {
                var expression = new FuncExpression <SomeClass>()
                {
                    Left      = new ValueExpression <SomeClass>(5.0),
                    Right     = new ValueExpression <SomeClass>(9.0),
                    Operation = new Operation((a, b) => a + b, "+"),
                };

                var clone = (FuncExpression <SomeClass>)expression.Clone();

                clone.Right = new ValueExpression <SomeClass>(3.0);

                var someClass = new SomeClass();

                Assert.That(expression.Evaluate(someClass), Is.EqualTo(14.0));
                Assert.That(clone.Evaluate(someClass), Is.EqualTo(8.0));
            }
Beispiel #5
0
 /// <summary>
 /// Creates an expression from a 2-argument function delegate
 /// </summary>
 /// <typeparam name="X1">The type of the delegate's first argument</typeparam>
 /// <typeparam name="X2">The type of the delegate's second argument</typeparam>
 /// <typeparam name="Y">The delegate return type</typeparam>
 /// <param name="f"></param>
 /// <returns></returns>
 public static Expression <Func <X1, X2, Y> > funcx <X1, X2, Y>(Func <X1, X2, Y> f)
 => FuncExpression.make(f);
Beispiel #6
0
    //public static Converter converter(MethodInfo m)
    //{
    //    var src = Expression.Parameter(typeof(object), "src");
    //    var convert = Expression.Convert(src, m.GetParameters()[0].ParameterType);
    //    var callResult = Expression.Call(null, m, convert);
    //    var result = Expression.Convert(callResult, typeof(object));
    //    return Expression.Lambda<Converter>(result, src).Compile();
    //}

    //public static Converter<TDst> converter<TDst>(MethodInfo m)
    //{
    //    var src = Expression.Parameter(typeof(object), "src");
    //    var convert = Expression.Convert(src, m.GetParameters()[0].ParameterType);
    //    var callResult = Expression.Call(null, m, convert);
    //    return Expression.Lambda<Converter<TDst>>(callResult, src).Compile();
    //}

    /// <summary>
    /// Creates an expression from a parameterless function delegate delegate
    /// </summary>
    /// <typeparam name="T">The delegate return type</typeparam>
    /// <param name="f"></param>
    /// <returns></returns>
    public static Expression <Func <T> > funcx <T>(Func <T> f)
    => FuncExpression.make(f);
Beispiel #7
0
 static FuncExpression <X, Y> Converter()
 => FuncExpression.make((X x) => (Y)Convert.ChangeType(x, typeof(Y)));