using System; using NUnit.Framework; using System.Linq.Expressions; namespace DynamicExpresso.UnitTest { [TestFixture] public class GenerateLambdaTest { [Test] public void Parse_as_LambdaExpression() { var target = new Interpreter(); Expression> lambdaExpression = target.ParseAsExpression>("arg + 5"); Assert.That(lambdaExpression.Compile()(10), Is.EqualTo(15)); } [Test] public void Parse_as_LambdaExpression_with_parameter() { var target = new Interpreter(); Expression> lambdaExpression = target.ParseAsExpression>("arg + 5"); Assert.That(lambdaExpression.Compile()(10), Is.EqualTo(15)); lambdaExpression = target.ParseAsExpression>("arg + .5"); Assert.That(lambdaExpression.Compile()(10), Is.EqualTo(10.5)); } [Test] public void Parse_To_a_Delegate_With_Two_Parameters() { var target = new Interpreter(); var lambdaExpression = target.ParseAsExpression>("arg1 * arg2"); Assert.That(lambdaExpression.Compile()(3, 2), Is.EqualTo(6)); Assert.That(lambdaExpression.Compile()(5, 10), Is.EqualTo(50)); } [Test] public void Parse_To_a_Delegate_With_Two_Parameters_With_Custom_Name() { var target = new Interpreter(); var argumentNames = new string[] { "x", "y" }; var lambdaExpression = target.ParseAsExpression>("x * y", argumentNames); Assert.That(lambdaExpression.Compile()(3, 2), Is.EqualTo(6)); Assert.That(lambdaExpression.Compile()(5, 10), Is.EqualTo(50)); } [Test] public void Generate_a_LambdaExpression_From_Lambda() { var target = new Interpreter(); var lambda = target.Parse("Math.Pow(x, y) + 5", new Parameter("x", typeof(double)), new Parameter("y", typeof(double)) ); Expression> lambdaExpression = lambda.LambdaExpression>(); Assert.That(lambdaExpression.Compile()(10, 2), Is.EqualTo(Math.Pow(10, 2) + 5)); } [Test] public void Cannot_Generate_a_LambdaExpression_From_Lambda_with_parameters_count_mismatch() { var target = new Interpreter(); // Func delegate has 2 inputs, I just use one var lambda = target.Parse("x + 5", new Parameter("x", typeof(double)) ); Assert.Throws(() => lambda.LambdaExpression>()); } [Test] public void Cannot_Generate_a_LambdaExpression_From_Lambda_with_parameters_type_mismatch() { var target = new Interpreter(); // Func delegate takes a string, I pass a double var lambda = target.Parse("x + 5", new Parameter("x", typeof(double)) ); Assert.Throws(() => lambda.LambdaExpression>()); } [Test] public void Cannot_generate_a_Lambda_with_return_type_mismatch() { var target = new Interpreter(); // Func delegate returns a string, I return a double var lambda = target.Parse("x + 5", new Parameter("x", typeof(double)) ); Assert.Throws(() => lambda.LambdaExpression>()); } } }