public void Test002()
        {
            var xgr = new ExpressionGenerator();

            var e1 = xgr.MultiProject(
                () => new {
                    FieldOne = 1,
                    FieldTwo = "ABC"
                },
                x => x.FieldTwo + x.FieldOne,
                x => "GHI" + x.FieldTwo + x.FieldTwo + "DEF",
                (x, y) => new {
                    InitializerOneResult = x,
                    InitializerTwoResult = y
                }
            );

            var inputPlaceholder = xgr.FromFunc(() => new {
                FieldOne = 1,
                FieldTwo = "ABC"
            });
            var expectations = xgr.FromFunc(inputPlaceholder, x => new {
                InitializerOneResult = x.FieldTwo + x.FieldOne,
                InitializerTwoResult = "GHI" + x.FieldTwo + x.FieldTwo + "DEF"
            });

            var inputParam = Expression.Parameter(inputPlaceholder.ReturnType);
            var expected = Expression.Lambda(
                ExpressionReplacer.Replace(expectations.Body, inputPlaceholder.Body, inputParam),
                inputParam
            );

            var comparer = new ExpressionComparer();
            Assert.IsTrue(comparer.AreEqual(expected, e1));
        }
        public void Test003()
        {
            var xgr = new ExpressionGenerator();
            var l2 = Expression.Lambda<Func<int>>(Expression.Default(typeof(int)));
            var l1 = xgr.FromFunc(l2, i2 => new MemberInitData()
            {
                FieldOne = i2
            });
            var e1 = (MemberInitExpression)l1.Body;
            var e2 = e1.NewExpression;
            var e3 = l2.Body;

            var replace = new Dictionary<Expression, Expression>
            {
                {e3,Expression.Constant(1) },
            };
            var assert = ExpressionVisitorVerifierTool.Test(e1, replace);

            assert.WasVisited(e1);
            assert.WasNotProduced(e1);
            assert.ProductionHas(e1, o1 => o1.NewExpression == e2);
            assert.ProductionHas(e1, o1 => o1.Bindings.Count == e1.Bindings.Count);
            assert.ProductionHas(e1, o1 => ((MemberAssignment)o1.Bindings[0]).Expression == replace[e3]);
            assert.WasVisited(e2);
            assert.WasProduced(e2);
            assert.WasVisited(e3);
            assert.WasProduced(replace[e3]);
            assert.WasNotProduced(e3);

            assert.TotalVisits(3);
            assert.TotalProduced(3);
        }
        public virtual void Test007()
        {
            var xgr = new ExpressionGenerator();

            var expr1 = xgr.FromFunc(() => new string[] { "A", "B", "C", "D" });
            var expr2 = xgr.FromFunc(() => new string[] { "A", "B", "C", "D" });

            _assert.AreEqual(expr1, expr2);
        }
        public virtual void Test002()
        {
            var xgr = new ExpressionGenerator();

            var expr1 = xgr.FromFunc(() => new NewConstructorData(default(string)));
            var expr2 = xgr.FromFunc(() => new NewConstructorData(default(int)));

            _assert.AreNotEqual(expr1, expr2);
        }
        public virtual void Test003()
        {
            var xgr = new ExpressionGenerator();

            var expr1 = Expression.Invoke(Expression.Lambda(Expression.Default(typeof(long))));
            var expr2 = Expression.Invoke(Expression.Lambda(Expression.Default(typeof(int))));

            _assert.AreNotEqual(expr1, expr2);
        }
        public virtual void Test007()
        {
            var xgr = new ExpressionGenerator();

            var expr1 = xgr.FromFunc(() => default(MethodCallTestData).TwoArgMethod(default(string), default(string)));
            var expr2 = xgr.FromFunc(() => default(MethodCallTestData).TwoArgMethod(default(string), default(string)));

            _assert.AreEqual(expr1, expr2);
        }
        public virtual void Test007()
        {
            var xgr = new ExpressionGenerator();

            var expr1 = xgr.FromFunc(() => default(MemberAccessTestData).IntOne);
            var expr2 = xgr.FromFunc(() => default(MemberAccessTestData).StringOne);

            _assert.AreNotEqual(expr1, expr2);
        }
        public virtual void Test004()
        {
            var xgr = new ExpressionGenerator();

            var expr1 = Expression.Parameter(typeof(int));
            var expr2 = Expression.Parameter(typeof(int));

            _assert.AreNotEqual(expr1, expr2);
        }
        public virtual void Test002()
        {
            var xgr = new ExpressionGenerator();

            var expr1 = xgr.FromFunc(() => new string[10]);
            var expr2 = xgr.FromFunc(() => new string[10]);

            _assert.AreEqual(expr1, expr2);
        }
        public virtual void Test003()
        {
            var xgr = new ExpressionGenerator();

            var expr1 = xgr.FromFunc(() => default(MethodCallTestData).IntMethodTwo());
            var expr2 = xgr.FromFunc(() => default(MethodCallTestData).IntMethodOne());

            _assert.AreNotEqual(expr1, expr2);
        }
        public void Test001()
        {
            var xgr = new ExpressionGenerator();
            var expr = Expression.Default(typeof(string));
            var expr2 = xgr.WithType<string>(expr);
            var expr3 = xgr.WithoutType(expr2);

            var xcr = new ExpressionComparer();
            Assert.IsTrue(xcr.AreEqual(expr, expr3));
        }
        public virtual void Test003()
        {
            var xgr = new ExpressionGenerator();

            var p1 = xgr.FromFunc(()=>default(string));
            var expr1 = xgr.FromFunc(p1, a => new NewConstructorData(a));
            var expr2 = xgr.FromFunc(p1, a => new NewConstructorData(a));

            _assert.AreEqual(expr1, expr2);
        }
        public void Test004()
        {
            var xgr = new ExpressionGenerator();
            var xpr = new ExpressionReader();

            var expr = xgr.FromFunc(() => default(IQueryable<int>).Where(x => x > 10));

            var result = xpr.GetLambda(expr);

            Assert.AreEqual(expr, result);
            Assert.IsInstanceOfType(result, typeof(LambdaExpression));
        }
        public virtual void Test006()
        {
            var xgr = new ExpressionGenerator();

            var p1 = Expression.Parameter(typeof(int));
            var p2 = Expression.Parameter(typeof(int));

            var expr1 = Expression.Invoke(Expression.Lambda(Expression.Default(typeof(int)), p1), Expression.Constant(0, typeof(int)));
            var expr2 = Expression.Invoke(Expression.Lambda(Expression.Default(typeof(int)), p2), Expression.Default(typeof(int)));

            _assert.AreNotEqual(expr1, expr2);
        }
        public void Test005()
        {
            var xgr = new ExpressionGenerator();

            var e1 = xgr.FromFunc(() => default(long?));
            var e2 = xgr.FromFunc(() => default(long?));

            var result = xgr.ConvertExpressions(e1, e2);

            Assert.AreEqual(e1.Body, result.Left);
            Assert.AreEqual(e2.Body, result.Right);
        }
        public virtual void Test001()
        {
            var xgr = new ExpressionGenerator();

            // this does not actually generate a ListInit expression
            var expr1 = xgr.FromFunc(()=>new Dictionary<int, int> {
            });
            var expr2 = xgr.FromFunc(() => new Dictionary<int, int> {
            });

            _assert.AreEqual(expr1, expr2);
            Assert.IsNotNull(expr1.Body as MemberInitExpression, "Expected this to be a memberInit");
        }
        public virtual void Test002()
        {
            var xgr = new ExpressionGenerator();

            var expr1 = Expression.Parameter(typeof(int));
            var expr2 = Expression.Parameter(typeof(long));

            _assert.AreNotEqual(
                new Dictionary<ParameterExpression, ParameterExpression> {
                    { expr1, expr2 }
                },
                expr1, expr2);
        }
        public void Test001()
        {
            var xgr = new ExpressionGenerator();
            var xpr = new ExpressionReader();

            var expr = xgr.FromFunc(()=>default(IQueryable<int>).Where(x=>x > 10));
            var expr2 = ((MethodCallExpression)expr.Body).Arguments[1];

            var body = xpr.GetLambda(expr2);

            Assert.AreNotEqual(expr2, body);
            Assert.IsInstanceOfType(body, typeof(LambdaExpression));
        }
Example #19
0
 public override void Generate(ExpressionGenerator gen, int level, Random rand)
 {
     int a = rand.Next(0, 100) > 15 ? level : 0;
     int b = rand.Next(0, 100) > 15 ? level : 0;
     if (rand.Next() % 2 == 0)
     {
         OperandA = Gen(gen, a, rand);
         OperandB = Gen(gen, b, rand);
     }
     else
     {
         OperandB = Gen(gen, b, rand);
         OperandA = Gen(gen, a, rand);
     }
 }
        public virtual void Test002()
        {
            var xgr = new ExpressionGenerator();

            var expr1 = xgr.FromFunc(() => new Dictionary<int, int>
            {
                {1, 1 }
            });
            var expr2 = xgr.FromFunc(() => new Dictionary<int, int>
            {
                {1, 1 }
            });

            _assert.AreEqual(expr1, expr2);
        }
        public void Test010()
        {
            var xgr    = new ExpressionGenerator();
            var args   = GetIntArgs(8);
            var actual = xgr.FromFunc(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7],
                                      (a, b, c, d, e, f, g, h) => paramFunc(a, b, c, d, e, f, g, h));

            var expected = Expression.Lambda <Func <int> >(
                Expression.Call(
                    null,
                    typeof(ExpressionGeneratorFromFuncTests).GetMethod("paramFunc").MakeGenericMethod(typeof(int)),
                    Expression.NewArrayInit(typeof(int), args.Select(a => a.Body).ToArray())
                    )
                );

            var comparer = new ExpressionComparer();

            Assert.IsTrue(comparer.AreEqual(expected, actual));
        }
        public virtual void Test006()
        {
            var xgr = new ExpressionGenerator();

            var expr1 = xgr.FromFunc(() => new {
                IntOne = default(int),
                IntTwo = 1,
                StringOne = default(string),
                StringTwo = default(string),
            });
            var expr2 = xgr.FromFunc(() => new {
                IntOne = default(int),
                IntTwo = default(int),
                StringOne = default(string),
                StringTwo = default(string),
            });

            _assert.AreNotEqual(expr1, expr2);
        }
Example #23
0
        public virtual void Test019()
        {
            var xgr = new ExpressionGenerator();

            var expr1 = xgr.FromFunc(() => new Dictionary <int, int>
            {
                { 4, 1 },
                { 2, 2 },
                { 3, 3 },
            });
            var expr2 = xgr.FromFunc(() => new Dictionary <int, int>
            {
                { 1, 1 },
                { 2, 2 },
                { 3, 3 },
            });

            _assert.AreNotEqual(expr1, expr2);
        }
        public virtual void Test005()
        {
            var xgr = new ExpressionGenerator();

            var expr1 = xgr.FromFunc(() => new {
                IntOne    = default(int),
                IntTwo    = default(int),
                StringOne = default(string),
                StringTwo = default(string),
            });
            var expr2 = xgr.FromFunc(() => new {
                IntOne    = default(int),
                IntTwo    = default(int),
                StringOne = default(string),
                StringTwo = default(string),
            });

            _assert.AreEqual(expr1, expr2);
        }
        public void Setup()
        {
            var typeMapper = new TypeMapper();

            typeMapper.RegisterTypeWrapper <Wrapped.NpgsqlBinaryImporter>(typeof(Original.NpgsqlBinaryImporter));
            typeMapper.RegisterTypeWrapper <Wrapped.NpgsqlDbType>(typeof(Original.NpgsqlDbType));

            typeMapper.FinalizeMappings();

            _wrappedImporter = typeMapper.Wrap <Wrapped.NpgsqlBinaryImporter>(_originalImporter);

            var ed = MappingSchema.GetEntityDescriptor(typeof(TestEntity));

            _columns = ed.Columns.ToArray();

            var generator = new ExpressionGenerator(typeMapper);

            var pMapping  = Expression.Parameter(typeof(MappingSchema));
            var pWriterIn = Expression.Parameter(typeof(Wrapped.NpgsqlBinaryImporter));
            var pColumns  = Expression.Parameter(typeof(ColumnDescriptor[]));
            var pEntity   = Expression.Parameter(typeof(TestEntity));
            var pWriter   = generator.AddVariable(Expression.Parameter(typeof(Original.NpgsqlBinaryImporter)));

            generator.Assign(pWriter, Expression.Convert(Expression.PropertyOrField(pWriterIn, "instance_"), typeof(Original.NpgsqlBinaryImporter)));
            generator.AddExpression(generator.MapAction((Wrapped.NpgsqlBinaryImporter importer) => importer.StartRow(), pWriter));

            for (var i = 0; i < _columns.Length; i++)
            {
                generator.AddExpression(
                    Expression.Call(
                        pWriter,
                        "Write",
                        new[] { typeof(object) },
                        Expression.Call(Expression.ArrayIndex(pColumns, Expression.Constant(i)), "GetValue", Array <Type> .Empty, pEntity),
                        Expression.Convert(Expression.Constant(Wrapped.NpgsqlDbType.Test), typeof(Original.NpgsqlDbType))));
            }

            _rowWriter = Expression.Lambda <Action <MappingSchema, Wrapped.NpgsqlBinaryImporter, ColumnDescriptor[], TestEntity> >(
                generator.Build(),
                pMapping, pWriterIn, pColumns, pEntity)
                         .Compile();
        }
Example #26
0
        public void Test013()
        {
            var xgr = new ExpressionGenerator();
            var l3  = Expression.Lambda <Func <int> >(Expression.Default(typeof(int)));
            var l4  = Expression.Lambda <Func <string> >(Expression.Default(typeof(string)));
            var l5  = Expression.Lambda <Func <bool> >(Expression.Default(typeof(bool)));
            var l1  = xgr.FromFunc(l3, l4, l5, (i3, i4, i5) => new MemberInitData()
            {
                FieldOne   = i3,
                FieldTwo   = i4,
                FieldThree = i5,
            });
            var e1 = (MemberInitExpression)l1.Body;
            var e2 = e1.NewExpression;
            var e3 = l3.Body;
            var e4 = l4.Body;
            var e5 = l5.Body;

            var replace = new Dictionary <Expression, Expression>
            {
            };
            var assert = ExpressionVisitorVerifierTool.Test(e1, replace);

            assert.WasVisited(e1);
            assert.WasProduced(e1);
            assert.ProductionHas(e1, o1 => o1.NewExpression == e2);
            assert.ProductionHas(e1, o1 => o1.Bindings.Count == e1.Bindings.Count);
            assert.ProductionHas(e1, o1 => ((MemberAssignment)o1.Bindings[0]).Expression == e3);
            assert.ProductionHas(e1, o1 => ((MemberAssignment)o1.Bindings[1]).Expression == e4);
            assert.ProductionHas(e1, o1 => ((MemberAssignment)o1.Bindings[2]).Expression == e5);
            assert.WasVisited(e2);
            assert.WasProduced(e2);
            assert.WasVisited(e3);
            assert.WasProduced(e3);
            assert.WasVisited(e4);
            assert.WasProduced(e4);
            assert.WasVisited(e5);
            assert.WasProduced(e5);

            assert.TotalVisits(5);
            assert.TotalProduced(5);
        }
Example #27
0
        public void Test012()
        {
            var xgr = new ExpressionGenerator();
            var l3  = Expression.Lambda <Func <int> >(Expression.Default(typeof(int)));
            var l4  = Expression.Lambda <Func <string> >(Expression.Default(typeof(string)));
            var l1  = xgr.FromFunc(l3, l4, (i3, i4) => new MemberInitData()
            {
                FieldOne = i3,
                FieldTwo = i4,
            });
            var e1 = (MemberInitExpression)l1.Body;
            var e2 = e1.NewExpression;
            var e3 = l3.Body;
            var e4 = l4.Body;

            var replace = new Dictionary <Expression, Expression>
            {
                { e2, Expression.New(e2.Constructor) },
                { e3, Expression.Constant(1) },
                { e4, Expression.Constant("ABC") },
            };
            var assert = ExpressionVisitorVerifierTool.Test(e1, replace);

            assert.WasVisited(e1);
            assert.WasNotProduced(e1);
            assert.ProductionHas(e1, o1 => o1.NewExpression == replace[e2]);
            assert.ProductionHas(e1, o1 => o1.Bindings.Count == e1.Bindings.Count);
            assert.ProductionHas(e1, o1 => ((MemberAssignment)o1.Bindings[0]).Expression == replace[e3]);
            assert.ProductionHas(e1, o1 => ((MemberAssignment)o1.Bindings[1]).Expression == replace[e4]);
            assert.WasVisited(e2);
            assert.WasProduced(replace[e2]);
            assert.WasNotProduced(e2);
            assert.WasVisited(e3);
            assert.WasProduced(replace[e3]);
            assert.WasNotProduced(e3);
            assert.WasVisited(e4);
            assert.WasProduced(replace[e4]);
            assert.WasNotProduced(e4);

            assert.TotalVisits(4);
            assert.TotalProduced(4);
        }
        public virtual void Test036()
        {
            var xgr = new ExpressionGenerator();

            var expr1 = xgr.FromFunc(() => new CompareNewBaseTests.NewConstructorData
            {
                NestedList =
                {
                }
            });
            var expr2 = xgr.FromFunc(() => new CompareNewBaseTests.NewConstructorData
            {
                NestedList =
                {
                    new CompareNewBaseTests.NewConstructorData()
                }
            });

            _assert.AreNotEqual(expr1, expr2);
        }
Example #29
0
        public override void Generate(ExpressionGenerator gen, int level, Random rand)
        {
            // if (AbsFunction == null)
            //     AbsFunction = gen.Module.Import(typeof(Math).GetMethod("Abs", new Type[] { typeof(Double) }));

            int a = rand.Next(0, 100) > 15 ? level : 0;
            int b = rand.Next(0, 100) > 15 ? level : 0;

            // Random choice based on equal or not
            if (rand.Next() % 2 == 0)
            {
                OperandA = Gen(gen, a, rand);
                OperandB = Gen(gen, b, rand);
            }
            else
            {
                OperandB = Gen(gen, b, rand);
                OperandA = Gen(gen, a, rand);
            }
        }
Example #30
0
        public virtual void Test007()
        {
            var xgr = new ExpressionGenerator();

            var p1 = Expression.Parameter(typeof(int));
            var p2 = Expression.Parameter(typeof(int));
            var p3 = Expression.Parameter(typeof(int));
            var p4 = Expression.Parameter(typeof(int));

            var expr1 = Expression.Invoke(
                Expression.Lambda(Expression.Default(typeof(int)), p1, p2),
                Expression.Default(typeof(int)),
                Expression.Default(typeof(int)));
            var expr2 = Expression.Invoke(
                Expression.Lambda(Expression.Default(typeof(int)), p3, p4),
                Expression.Default(typeof(int)),
                Expression.Default(typeof(int)));

            _assert.AreEqual(expr1, expr2);
        }
        public virtual void Test009()
        {
            var xgr = new ExpressionGenerator();

            var expr1 = xgr.FromFunc(() => new CompareNewBaseTests.NewConstructorData
            {
                StringTwo = default(string),
                IntOne    = default(int),
                IntTwo    = default(int),
            });
            var expr2 = xgr.FromFunc(() => new CompareNewBaseTests.NewConstructorData
            {
                StringOne = default(string),
                StringTwo = default(string),
                IntOne    = default(int),
                IntTwo    = default(int),
            });

            _assert.AreNotEqual(expr1, expr2);
        }
        public virtual void Test008()
        {
            var xgr = new ExpressionGenerator();

            var expr1 = xgr.FromFunc(() => new CompareNewBaseTests.NewConstructorData
            {
                StringOne = default(string),
                StringTwo = default(string),
                IntOne = default(int),
                IntTwo = default(int),
            });
            var expr2 = xgr.FromFunc(() => new CompareNewBaseTests.NewConstructorData
            {
                StringOne = default(string),
                StringTwo = default(string),
                IntOne = default(int),
            });

            _assert.AreNotEqual(expr1, expr2);
        }
Example #33
0
        public void FromString(string input)
        {
            var expressionGenerator = new ExpressionGenerator <SomeClass>(
                new UnWeightedRandom(),
                new []
            {
                new BoundValueExpression <SomeClass>(someClass => someClass.SomeValue, nameof(SomeClass.SomeValue)),
            },
                new []
            {
                new Operation((a, b) => a + b, "+"),
                new Operation((a, b) => a - b, "-"),
                new Operation((a, b) => a * b, "*"),
            });

            var fromString = expressionGenerator.FromString(input);

            Console.WriteLine(fromString);
            Assert.That(fromString.ToString(), Is.EqualTo(input));
        }
Example #34
0
        public void Test011()
        {
            var xgr = new ExpressionGenerator();
            var xc  = new ExpressionComparer();

            var e2 = xgr.WithType <int>(Expression.Default(typeof(int)));
            var e3 = xgr.WithType <int?>(Expression.Default(typeof(int?)));

            var e1 = xgr.MakeInequalityComparison(e2, e3);

            var expected = Expression.Lambda <Func <bool> >(
                Expression.MakeBinary(
                    ExpressionType.NotEqual,
                    Expression.Convert(Expression.Default(typeof(int)), typeof(int?)),
                    Expression.Default(typeof(int?))
                    )
                );

            Assert.IsTrue(xc.AreEqual(expected, e1));
        }
        public void Test011()
        {
            var xgr = new ExpressionGenerator();
            var xc = new ExpressionComparer();

            var e2 = xgr.WithType<int>(Expression.Default(typeof(int)));
            var e3 = xgr.WithType<int?>(Expression.Default(typeof(int?)));

            var e1 = xgr.MakeInequalityComparison(e2, e3);

            var expected = Expression.Lambda<Func<bool>>(
                Expression.MakeBinary(
                    ExpressionType.NotEqual,
                    Expression.Convert(Expression.Default(typeof(int)), typeof(int?)),
                    Expression.Default(typeof(int?))
                )
            );

            Assert.IsTrue(xc.AreEqual(expected, e1));
        }
Example #36
0
        public void Test063()
        {
            var xgr = new ExpressionGenerator();
            var xc  = new ExpressionComparer();

            var e2 = xgr.WithType <int>(Expression.Default(typeof(int)));
            var e3 = xgr.WithType <int>(Expression.Default(typeof(int)));

            var e1 = xgr.MakeLessThanComparison(e2, e3);

            var expected = Expression.Lambda <Func <bool> >(
                Expression.MakeBinary(
                    ExpressionType.LessThan,
                    Expression.Default(typeof(int)),
                    Expression.Default(typeof(int))
                    )
                );

            Assert.IsTrue(xc.AreEqual(expected, e1));
        }
Example #37
0
        public void Test004()
        {
            var xgr = new ExpressionGenerator();
            var q   = Enumerable.Range(0, 1).Select(x => new {
                FieldOne = 1,
                FieldTwo = "ABC"
            }).AsQueryable();

            var e1 = xgr.MultiProject(
                q,
                x => x.FieldTwo + x.FieldOne,
                x => "GHI" + x.FieldTwo + x.FieldTwo + "DEF",
                (x, y) => new {
                InitializerOneResult = x,
                InitializerTwoResult = y
            }
                );

            var inputPlaceholder = xgr.FromFunc(() => new {
                FieldOne = 1,
                FieldTwo = "ABC"
            });
            var expectations = xgr.FromFunc(inputPlaceholder, x => new {
                InitializerOneResult = x.FieldTwo + x.FieldOne,
                InitializerTwoResult = "GHI" + x.FieldTwo + x.FieldTwo + "DEF"
            });

            var inputParam = Expression.Parameter(inputPlaceholder.ReturnType);
            var expected   = Expression.Lambda(
                ExpressionReplacer.Replace(expectations.Body, inputPlaceholder.Body, inputParam),
                inputParam
                );

            var inner1 = e1.Expression as MethodCallExpression;
            var inner2 = inner1.Arguments[1] as UnaryExpression;
            var inner3 = inner2.Operand as LambdaExpression;

            var comparer = new ExpressionComparer();

            Assert.IsTrue(comparer.AreEqual(expected, inner3));
        }
        public void Test041()
        {
            var xgr = new ExpressionGenerator();
            Func <Expression, BinaryExpression> conv = x => (BinaryExpression)x;

            var el = new Expression[] {
                Expression.Default(typeof(int)),
                Expression.Default(typeof(int)),
                Expression.Default(typeof(int)),
            };

            var result = xgr.Join(el, ExpressionType.Add);

            Assert.IsInstanceOfType(result, typeof(BinaryExpression));
            Assert.AreEqual(ExpressionType.Add, result.NodeType);
            Assert.IsInstanceOfType(conv(result).Left, typeof(BinaryExpression));
            Assert.AreEqual(ExpressionType.Add, conv(result).Left.NodeType);
            Assert.AreEqual(el[0], conv(conv(result).Left).Left);
            Assert.AreEqual(el[1], conv(conv(result).Left).Right);
            Assert.AreEqual(el[2], conv(result).Right);
        }
Example #39
0
        public void Test026()
        {
            var xgr        = new ExpressionGenerator();
            var intArgs    = GetIntArgs(4);
            var stringArgs = GetStringArgs(4);
            var args       = intArgs.Zip(stringArgs, (a, b) => new { a = (Expression)a.Body, b = (Expression)b.Body }).SelectMany(a => new[] { a.a, a.b }).Concat(new[] { intArgs.Length != stringArgs.Length ? intArgs.Last().Body : null }).Where(a => a != null);

            var actual = xgr.FromAction(
                intArgs[0], stringArgs[0], intArgs[1], stringArgs[1], intArgs[2], stringArgs[2], intArgs[3], stringArgs[3],
                (a, b, c, d, e, f, g, h) => interleaveFunc(a, b, c, d, e, f, g, h));

            var expected = Expression.Call(
                null,
                typeof(ExpressionGeneratorFromActionTests).GetMethod("interleaveFunc"),
                Expression.NewArrayInit(typeof(object), args.Select(a => a.Type == typeof(string) ? a : Expression.Convert(a, typeof(object))).ToArray())
                );

            var comparer = new ExpressionComparer();

            Assert.IsTrue(comparer.AreEqual(expected, actual));
        }
Example #40
0
        public static Expression <Func <T> > ActualToDisk <T>(this IAssertionTool tool, Expression <Func <T> > content, Func <T, byte[]> toDisk = null, int stackDepth = 2)
        {
            string filename = GenerateTestFilename(tool, stackDepth);

            filename = string.Format("{3}{0}.{1}{2}", filename, GetFilesystemAssertionCount(tool), GetFilesystemAssertionActualSuffix(tool), GetFilesystemAssertionFilenamePrefix(tool));
            filename = Path.Combine(GetFilesystemAssertionRepositoryPath(tool), filename);
            EnsureDirectory(filename);

            if (toDisk == null)
            {
                toDisk = d => Encoding.UTF8.GetBytes(Convert.ToString(d));
            }

            var xgr      = new ExpressionGenerator();
            var content2 = xgr.FromFunc(
                content,
                c => WriteActualToDisk <T>(filename, c, toDisk, tool)
                );

            return(content2);
        }
        public IEnumerable <Expression <Func <T, bool> > > GetFiltersFor <T>() where T : class
        {
            var gen = new ExpressionGenerator <T>();

            List <Expression <Func <T, bool> > > opts = gen.ToStrongExpressions(Filters);

            if (!string.IsNullOrEmpty(SearchTerm))
            {
                var ex = ExpressionStore.GetSearchExpression <T>(SearchTerm);
                if (ex != null)
                {
                    opts.Add(ex);
                }
                else if (typeof(T).Implements(typeof(INamed)))
                {
                    Expression <Func <T, bool> > iex = e => ((INamed)e).Name.Contains(SearchTerm);
                    opts.Add(iex);
                }
            }
            return(opts);
        }
Example #42
0
        public static LoadResult LoadWith <T>(this IQueryable <T> q, GetOptions <T> opts) where T : class
        {
            LoadResult res = new LoadResult();

            ExpressionGenerator <T> gen = new ExpressionGenerator <T>();

            if (opts == null)
            {
                opts = new GetOptions <T>();
            }

            //Expression<Func<T, bool>> fil = null;
            if (opts.Filters != null)
            {
                //fil = (Expression<Func<T, bool>>)opts.Filters[0];
                for (int i = 0; i < opts.Filters.Count; i++)
                {
                    Expression <Func <T, bool> > e = (Expression <Func <T, bool> >)opts.Filters[i];
                    //fil = fil.Combine(e);
                    q = q.Where(e);
                }
            }

            res.TotalCount = q.Count(d => true);



            if (!string.IsNullOrEmpty(opts.OrderProperty))
            {
                q = gen.SortWith(q, opts.OrderProperty, opts.Direction);
            }

            if (opts.Showing > 0)
            {
                q = q.Skip(opts.Skip).Take(opts.Showing);
            }

            res.List = q.ToList();
            return(res);
        }
Example #43
0
            Expression BuildExpression(int fieldIndex, ISqlExpression?sqlExpression)
            {
                Expression expr;

                if (Sequence is DefaultIfEmptyBuilder.DefaultIfEmptyContext defaultIfEmpty)
                {
                    expr = Builder.BuildSql(_returnType, fieldIndex, sqlExpression);
                    if (defaultIfEmpty.DefaultValue != null && expr is ConvertFromDataReaderExpression convert)
                    {
                        var generator = new ExpressionGenerator();
                        expr = convert.MakeNullable();
                        if (expr.Type.IsNullable())
                        {
                            var exprVar   = generator.AssignToVariable(expr, "nullable");
                            var resultVar = generator.AssignToVariable(defaultIfEmpty.DefaultValue, "result");

                            generator.AddExpression(Expression.IfThen(
                                                        Expression.NotEqual(exprVar, Expression.Constant(null)),
                                                        Expression.Assign(resultVar, Expression.Convert(exprVar, resultVar.Type))));

                            generator.AddExpression(resultVar);

                            expr = generator.Build();
                        }
                    }
                }
                else
                if (_returnType.IsClass || _methodName == "Sum" || _returnType.IsNullable())
                {
                    expr = Builder.BuildSql(_returnType, fieldIndex, sqlExpression);
                }
                else
                {
                    expr = Expression.Block(
                        Expression.Call(null, MemberHelper.MethodOf(() => CheckNullValue(false, null !)), Expression.Call(ExpressionBuilder.DataReaderParam, Methods.ADONet.IsDBNull, Expression.Constant(0)), Expression.Constant(_methodName)),
                        Builder.BuildSql(_returnType, fieldIndex, sqlExpression));
                }

                return(expr);
            }
Example #44
0
        public static ExpressionGenerator <GameState> CreateExpressionGenerator()
        {
            var expressionGenerator = new ExpressionGenerator <GameState>(
                new BellWeightedRandom(0.5),
                new IExpression <GameState>[]
            {
                new BoundValueExpression <GameState>(game => game.HeroGold, nameof(GameState.HeroGold)),
                new BoundValueExpression <GameState>(game => game.HeroHealth, nameof(GameState.HeroHealth)),
                new BoundValueExpression <GameState>(game => game.HeroWeapon, nameof(GameState.HeroWeapon)),
                new BoundValueExpression <GameState>(game => game.CardGold, nameof(GameState.CardGold)),
                new BoundValueExpression <GameState>(game => game.MonsterHealth, nameof(GameState.MonsterHealth)),
                new BoundValueExpression <GameState>(game => game.CardWeapon, nameof(GameState.CardWeapon)),
            },
                new[]
            {
                new Operation((a, b) => a + b, "+"),
                new Operation((a, b) => a - b, "-"),
                new Operation((a, b) => a * b, "*"),
            });

            return(expressionGenerator);
        }
        public void Test003()
        {
            var xgr = new ExpressionGenerator();
            var xpr = new ExpressionReader();

            var param1 = Expression.Parameter(typeof(int));
            var expr   = Expression.Call(
                typeof(Queryable),
                "Where",
                new[] { typeof(int) },
                Expression.Default(typeof(IQueryable <int>)),
                Expression.Constant(
                    Expression.Lambda <Func <int, bool> >(
                        Expression.GreaterThan(param1, Expression.Constant(10)),
                        param1
                        )
                    )
                );
            var result = xpr.GetLambda(expr);

            Assert.IsNull(result);
        }
Example #46
0
        private UnaryFunc BuildUnaryFunc <TReturn>(string expressionName)
        {
            Contract.Requires(!string.IsNullOrEmpty(expressionName));
            var tParam     = typeof(TValue).CreateParameterExpression();
            var expression = ExpressionGenerator.Generate(expressionName, tParam);

            if (null == expression)
            {
                return(null);
            }

            if (typeof(TReturn) != typeof(void) && typeof(TReturn) != expression.Type)
            {
                expression = ExpressionGenerator.GenerateConversion(typeof(TReturn), expression);
                if (null == expression)
                {
                    return(null);
                }
            }

            return(Expression.Lambda <UnaryFunc>(expression, tParam).Compile());
        }
        public void Test003()
        {
            var xgr = new ExpressionGenerator();
            var xpr = new ExpressionReader();

            var param1 = Expression.Parameter(typeof(int));
            var expr = Expression.Call(
                typeof(Queryable),
                "Where",
                new[] { typeof(int) },
                Expression.Default(typeof(IQueryable<int>)),
                Expression.Constant(
                    Expression.Lambda<Func<int, bool>>(
                        Expression.GreaterThan(param1, Expression.Constant(10)),
                        param1
                    )
                )
            );
            var result = xpr.GetLambda(expr);

            Assert.IsNull(result);
        }
        public void Test019()
        {
            var xgr        = new ExpressionGenerator();
            var intArgs    = GetIntArgs(1);
            var stringArgs = GetStringArgs(0);
            var args       = intArgs.Zip(stringArgs, (a, b) => new { a = (Expression)a.Body, b = (Expression)b.Body }).SelectMany(a => new[] { a.a, a.b }).Concat(new [] { intArgs.Length != stringArgs.Length ? intArgs.Last().Body : null }).Where(a => a != null);

            var actual = xgr.FromFunc(
                intArgs[0],
                a => interleaveFunc(a));

            var expected = Expression.Lambda <Func <object> >(
                Expression.Call(
                    null,
                    typeof(ExpressionGeneratorFromFuncTests).GetMethod("interleaveFunc"),
                    Expression.NewArrayInit(typeof(object), args.Select(a => Expression.Convert(a, typeof(object))).ToArray())
                    )
                );

            var comparer = new ExpressionComparer();

            Assert.IsTrue(comparer.AreEqual(expected, actual));
        }
Example #49
0
        private TResult BuildBinaryFunc <TResult, TReturn>(string expressionName) where TResult : class
        {
            Contract.Requires(!string.IsNullOrEmpty(expressionName));
            var tParam0    = typeof(TValue).CreateParameterExpression();
            var tParam1    = typeof(TValue).CreateParameterExpression();
            var expression = ExpressionGenerator.Generate(expressionName, tParam0, tParam1);

            if (null == expression)
            {
                return(null);
            }

            if (typeof(TReturn) != typeof(void) && typeof(TReturn) != expression.Type)
            {
                expression = ExpressionGenerator.GenerateConversion(typeof(TReturn), expression);
                if (null == expression)
                {
                    return(null);
                }
            }

            return(Expression.Lambda <TResult>(expression, tParam0, tParam1).Compile());
        }
        public virtual void Test057()
        {
            var xgr = new ExpressionGenerator();

            var expr1 = xgr.FromFunc(() => new CompareNewBaseTests.NewConstructorData
            {
                IntOne     = default(int),
                NestedList =
                {
                    new CompareNewBaseTests.NewConstructorData(),
                },
                ChildOne =
                {
                    IntTwo    = default(int),
                    IntOne    = default(int),
                    StringTwo = default(string),
                    StringOne = default(string),
                },
            });
            var expr2 = xgr.FromFunc(() => new CompareNewBaseTests.NewConstructorData
            {
                IntOne     = default(int),
                NestedList =
                {
                    new CompareNewBaseTests.NewConstructorData(),
                },
                ChildOne =
                {
                    IntTwo    = default(int),
                    IntOne    = default(int),
                    StringTwo = default(string),
                    StringOne = default(string),
                },
            });

            _assert.AreEqual(expr1, expr2);
        }
Example #51
0
        public Func<double> Compile(Block block)
        {
            ParameterExpression result = Expression.Parameter(typeof(int), "result");

            var compiler = new ExpressionGenerator();
            compiler.SetReturnType<double>();

            foreach (var varDef in block.Variables.Values)
            {
                //var v = Expression.Variable(ExpressionCompiler.GetCsType(varDef.ValueType), varDef.Name.Name);
                //expressions.Add(v);
                compiler.AddVariable(varDef);
            }

            foreach (var statement in block.Statements)
            {
                compiler.AddExpression(statement);
            }

            BlockExpression blockExpression = compiler.Generate();
            var lambda = Expression.Lambda<Func<double>>(blockExpression);
            var compiled = lambda.Compile();
            return compiled;
        }
        public Expression Build(IEventTraceOperand operand, ParameterExpression eventRecordReader, ParameterExpression eventRecordWriter, ParameterExpression eventMetadataTable, ParameterExpression runtimeMetadata)
        {
            var eventMetadata = Expression.Parameter(typeof(EventMetadata));
            var properties = Expression.Parameter(typeof(PropertyMetadata[]));

            var variables = new List<ParameterExpression>
            {
                eventMetadata,
                properties
            };

            var expGenerator = new ExpressionGenerator(eventRecordReader, eventRecordWriter, properties);
            var list = new List<Expression>
            {
                Expression.Assign(eventMetadata, Expression.ArrayAccess(eventMetadataTable, Expression.Constant(operand.EventMetadataTableIndex))),
                Expression.Assign(properties, Expression.PropertyOrField(eventMetadata, "Properties")),
                eventRecordWriter.Call("WriteEventBegin", eventMetadata, runtimeMetadata),
                expGenerator.CodeGenerate(operand.EventPropertyOperands),
                eventRecordWriter.Call("WriteEventEnd")
            };

            var returnExpression = Expression.Block(variables, list);
            return returnExpression;
        }
        public void Test002()
        {
            var xgr = new ExpressionGenerator();
            var xpr = new ExpressionReader();

            var param1 = Expression.Parameter(typeof(int));
            var expr = Expression.Call(
                typeof(Queryable),
                "Where",
                new [] { typeof(int) },
                Expression.Default(typeof(IQueryable<int>)),
                Expression.Constant(
                    Expression.Lambda<Func<int, bool>>(
                        Expression.GreaterThan(param1, Expression.Constant(10)),
                        param1
                    )
                )
            );
            var expr2 = expr.Arguments[1];
            var result = xpr.GetLambda(expr2);

            Assert.AreNotEqual(expr2, result);
            Assert.IsInstanceOfType(result, typeof(LambdaExpression));
        }
        public void Test002()
        {
            var xgr = new ExpressionGenerator();
            var xpr = new ExpressionReader();

            var param1 = Expression.Parameter(typeof(int));
            var expr   = Expression.Call(
                typeof(Queryable),
                "Where",
                new [] { typeof(int) },
                Expression.Default(typeof(IQueryable <int>)),
                Expression.Constant(
                    Expression.Lambda <Func <int, bool> >(
                        Expression.GreaterThan(param1, Expression.Constant(10)),
                        param1
                        )
                    )
                );
            var expr2  = expr.Arguments[1];
            var result = xpr.GetLambda(expr2);

            Assert.AreNotEqual(expr2, result);
            Assert.IsInstanceOfType(result, typeof(LambdaExpression));
        }
Example #55
0
        public void Test002()
        {
            var xgr = new ExpressionGenerator();

            var e1 = xgr.MultiProject(
                () => new {
                FieldOne = 1,
                FieldTwo = "ABC"
            },
                x => x.FieldTwo + x.FieldOne,
                x => "GHI" + x.FieldTwo + x.FieldTwo + "DEF",
                (x, y) => new {
                InitializerOneResult = x,
                InitializerTwoResult = y
            }
                );

            var inputPlaceholder = xgr.FromFunc(() => new {
                FieldOne = 1,
                FieldTwo = "ABC"
            });
            var expectations = xgr.FromFunc(inputPlaceholder, x => new {
                InitializerOneResult = x.FieldTwo + x.FieldOne,
                InitializerTwoResult = "GHI" + x.FieldTwo + x.FieldTwo + "DEF"
            });

            var inputParam = Expression.Parameter(inputPlaceholder.ReturnType);
            var expected   = Expression.Lambda(
                ExpressionReplacer.Replace(expectations.Body, inputPlaceholder.Body, inputParam),
                inputParam
                );

            var comparer = new ExpressionComparer();

            Assert.IsTrue(comparer.AreEqual(expected, e1));
        }
Example #56
0
 /// <summary>
 /// Constructs a new matching.
 /// </summary>
 public Matching()
 {
     _func = x => true;
     _gen  = GetExpression;
 }
Example #57
0
        private static OracleProviderAdapter CreateAdapter(string assemblyName, string clientNamespace, string typesNamespace, string?factoryName)
        {
            var isNative = false;

#if NETFRAMEWORK
            isNative = assemblyName == NativeAssemblyName;
#endif

            var assembly = Common.Tools.TryLoadAssembly(assemblyName, factoryName);
            if (assembly == null)
            {
                throw new InvalidOperationException($"Cannot load assembly {assemblyName}");
            }

            var connectionType  = assembly.GetType($"{clientNamespace}.OracleConnection", true) !;
            var parameterType   = assembly.GetType($"{clientNamespace}.OracleParameter", true) !;
            var dataReaderType  = assembly.GetType($"{clientNamespace}.OracleDataReader", true) !;
            var transactionType = assembly.GetType($"{clientNamespace}.OracleTransaction", true) !;
            var dbType          = assembly.GetType($"{clientNamespace}.OracleDbType", true) !;
            var commandType     = assembly.GetType($"{clientNamespace}.OracleCommand", true) !;

            var mappingSchema = new MappingSchema();

            // do not set default conversion for BFile as it could be converted to file name, byte[], Stream and we don't know what user needs
            var oracleBFileType        = loadType("OracleBFile", DataType.BFile, skipConvertExpression: true) !;
            var oracleBinaryType       = loadType("OracleBinary", DataType.VarBinary) !;
            var oracleBlobType         = loadType("OracleBlob", DataType.Blob) !;
            var oracleClobType         = loadType("OracleClob", DataType.NText) !;
            var oracleDateType         = loadType("OracleDate", DataType.DateTime) !;
            var oracleDecimalType      = loadType("OracleDecimal", DataType.Decimal) !;
            var oracleIntervalDSType   = loadType("OracleIntervalDS", DataType.Time) !;
            var oracleIntervalYMType   = loadType("OracleIntervalYM", DataType.Date) !;
            var oracleStringType       = loadType("OracleString", DataType.NVarChar) !;
            var oracleTimeStampType    = loadType("OracleTimeStamp", DataType.DateTime2) !;
            var oracleTimeStampLTZType = loadType("OracleTimeStampLTZ", DataType.DateTimeOffset) !;
            var oracleTimeStampTZType  = loadType("OracleTimeStampTZ", DataType.DateTimeOffset) !;
            var oracleXmlTypeType      = loadType("OracleXmlType", DataType.Xml) !;
            var oracleXmlStreamType    = loadType("OracleXmlStream", DataType.Xml, true, false) !;
            var oracleRefCursorType    = loadType("OracleRefCursor", DataType.Binary, hasValue: false) !;
            var oracleRefType          = loadType("OracleRef", DataType.Binary, true);

            BulkCopyAdapter?bulkCopy   = null;
            var             typeMapper = new TypeMapper();

            typeMapper.RegisterTypeWrapper <OracleConnection>(connectionType);
            typeMapper.RegisterTypeWrapper <OracleParameter>(parameterType);
            typeMapper.RegisterTypeWrapper <OracleDbType>(dbType);
            typeMapper.RegisterTypeWrapper <OracleCommand>(commandType);
            typeMapper.RegisterTypeWrapper <OracleDataReader>(dataReaderType);
            typeMapper.RegisterTypeWrapper <OracleTimeStampTZ>(oracleTimeStampTZType);
            typeMapper.RegisterTypeWrapper <OracleTimeStampLTZ>(oracleTimeStampLTZType);
            typeMapper.RegisterTypeWrapper <OracleDecimal>(oracleDecimalType);

            if (isNative)
            {
                var bulkCopyType                        = assembly.GetType($"{clientNamespace}.OracleBulkCopy", true) !;
                var bulkCopyOptionsType                 = assembly.GetType($"{clientNamespace}.OracleBulkCopyOptions", true) !;
                var bulkRowsCopiedEventHandlerType      = assembly.GetType($"{clientNamespace}.OracleRowsCopiedEventHandler", true) !;
                var bulkCopyColumnMappingType           = assembly.GetType($"{clientNamespace}.OracleBulkCopyColumnMapping", true) !;
                var bulkCopyColumnMappingCollectionType = assembly.GetType($"{clientNamespace}.OracleBulkCopyColumnMappingCollection", true) !;
                var rowsCopiedEventArgsType             = assembly.GetType($"{clientNamespace}.OracleRowsCopiedEventArgs", true) !;

                // bulk copy types
                typeMapper.RegisterTypeWrapper <OracleBulkCopy>(bulkCopyType);
                typeMapper.RegisterTypeWrapper <OracleBulkCopyOptions>(bulkCopyOptionsType);
                typeMapper.RegisterTypeWrapper <OracleRowsCopiedEventHandler>(bulkRowsCopiedEventHandlerType);
                typeMapper.RegisterTypeWrapper <OracleBulkCopyColumnMapping>(bulkCopyColumnMappingType);
                typeMapper.RegisterTypeWrapper <OracleBulkCopyColumnMappingCollection>(bulkCopyColumnMappingCollectionType);
                typeMapper.RegisterTypeWrapper <OracleRowsCopiedEventArgs>(rowsCopiedEventArgsType);
                typeMapper.FinalizeMappings();

                bulkCopy = new BulkCopyAdapter(
                    typeMapper.BuildWrappedFactory((IDbConnection connection, OracleBulkCopyOptions options) => new OracleBulkCopy((OracleConnection)connection, options)),
                    typeMapper.BuildWrappedFactory((int source, string destination) => new OracleBulkCopyColumnMapping(source, destination)));
            }
            else
            {
                typeMapper.FinalizeMappings();
            }

            var paramMapper      = typeMapper.Type <OracleParameter>();
            var dbTypeBuilder    = paramMapper.Member(p => p.OracleDbType);
            var connectionMapper = typeMapper.Type <OracleConnection>();
            var commandMapper    = typeMapper.Type <OracleCommand>();

            // data reader expressions
            // rd.GetOracleTimeStampTZ(i) => DateTimeOffset
            var generator    = new ExpressionGenerator(typeMapper);
            var rdParam      = Expression.Parameter(typeof(IDataReader), "rd");
            var indexParam   = Expression.Parameter(typeof(int), "i");
            var tstzExpr     = generator.MapExpression((IDataReader rd, int i) => ((OracleDataReader)rd).GetOracleTimeStampTZ(i), rdParam, indexParam);
            var tstzVariable = generator.AssignToVariable(tstzExpr, "tstz");
            var expr         = generator.MapExpression((OracleTimeStampTZ tstz) => new DateTimeOffset(
                                                           tstz.Year, tstz.Month, tstz.Day,
                                                           tstz.Hour, tstz.Minute, tstz.Second,
                                                           tstz.GetTimeZoneOffset()).AddTicks(tstz.Nanosecond / NanosecondsPerTick), tstzVariable);
            generator.AddExpression(expr);
            var body = generator.Build();
            var readDateTimeOffsetFromOracleTimeStampTZ = (Expression <Func <IDataReader, int, DateTimeOffset> >)Expression.Lambda(body, rdParam, indexParam);

            // rd.GetOracleTimeStampLTZ(i) => DateTimeOffset
            generator    = new ExpressionGenerator(typeMapper);
            tstzExpr     = generator.MapExpression((IDataReader rd, int i) => ((OracleDataReader)rd).GetOracleTimeStampLTZ(i).ToOracleTimeStampTZ(), rdParam, indexParam);
            tstzVariable = generator.AssignToVariable(tstzExpr, "tstz");
            expr         = generator.MapExpression((OracleTimeStampTZ tstz) => new DateTimeOffset(
                                                       tstz.Year, tstz.Month, tstz.Day,
                                                       tstz.Hour, tstz.Minute, tstz.Second,
                                                       tstz.GetTimeZoneOffset()).AddTicks(tstz.Nanosecond / NanosecondsPerTick), tstzVariable);
            generator.AddExpression(expr);
            body = generator.Build();
            var readDateTimeOffsetFromOracleTimeStampLTZ = (Expression <Func <IDataReader, int, DateTimeOffset> >)Expression.Lambda(body, rdParam, indexParam);

            // rd.GetOracleDecimal(i) => decimal
            generator = new ExpressionGenerator(typeMapper);
            var decExpr          = generator.MapExpression((IDataReader rd, int i) => ((OracleDataReader)rd).GetOracleDecimal(i), rdParam, indexParam);
            var oracleDecimalVar = generator.AssignToVariable(decExpr, "dec");
            var precision        = generator.AssignToVariable(Expression.Constant(29), "precision");
            var decimalVar       = generator.AddVariable(Expression.Parameter(typeof(decimal), "dec"));
            var label            = Expression.Label(typeof(decimal));

            generator.AddExpression(
                Expression.Loop(
                    Expression.TryCatch(
                        Expression.Block(
                            Expression.Assign(oracleDecimalVar, generator.MapExpression((OracleDecimal d, int p) => OracleDecimal.SetPrecision(d, p), oracleDecimalVar, precision)),
                            Expression.Assign(decimalVar, Expression.Convert(oracleDecimalVar, typeof(decimal))),
                            Expression.Break(label, decimalVar)),
                        Expression.Catch(
                            typeof(OverflowException),
                            Expression.Block(
                                Expression.IfThen(
                                    Expression.LessThanOrEqual(Expression.SubtractAssign(precision, Expression.Constant(1)), Expression.Constant(26)),
                                    Expression.Rethrow())))),
                    label));

            body = generator.Build();

            var readOracleDecimalToDecimalAdv = (Expression <Func <IDataReader, int, decimal> >)Expression.Lambda(body, rdParam, indexParam);
            // workaround for mapper issue with complex reader expressions handling
            // https://github.com/linq2db/linq2db/issues/2032
            var compiledReader = readOracleDecimalToDecimalAdv.Compile();
            readOracleDecimalToDecimalAdv = (Expression <Func <IDataReader, int, decimal> >)Expression.Lambda(
                Expression.Invoke(Expression.Constant(compiledReader), rdParam, indexParam),
                rdParam,
                indexParam);

            var readOracleDecimalToInt     = (Expression <Func <IDataReader, int, int> >)typeMapper.MapLambda <IDataReader, int, int>((rd, i) => (int)(decimal)OracleDecimal.SetPrecision(((OracleDataReader)rd).GetOracleDecimal(i), 27));
            var readOracleDecimalToLong    = (Expression <Func <IDataReader, int, long> >)typeMapper.MapLambda <IDataReader, int, long>((rd, i) => (long)(decimal)OracleDecimal.SetPrecision(((OracleDataReader)rd).GetOracleDecimal(i), 27));
            var readOracleDecimalToDecimal = (Expression <Func <IDataReader, int, decimal> >)typeMapper.MapLambda <IDataReader, int, decimal>((rd, i) => (decimal)OracleDecimal.SetPrecision(((OracleDataReader)rd).GetOracleDecimal(i), 27));

            return(new OracleProviderAdapter(
                       connectionType,
                       dataReaderType,
                       parameterType,
                       commandType,
                       transactionType,
                       mappingSchema,

                       oracleBFileType,
                       oracleBinaryType,
                       oracleBlobType,
                       oracleClobType,
                       oracleDateType,
                       oracleDecimalType,
                       oracleIntervalDSType,
                       oracleIntervalYMType,
                       oracleStringType,
                       oracleTimeStampType,
                       oracleTimeStampLTZType,
                       oracleTimeStampTZType,
                       oracleXmlTypeType,
                       oracleXmlStreamType,
                       oracleRefCursorType,
                       oracleRefType,

                       typeMapper.BuildWrappedFactory((string connectionString) => new OracleConnection(connectionString)),

                       typesNamespace,

                       dbTypeBuilder.BuildSetter <IDbDataParameter>(),
                       dbTypeBuilder.BuildGetter <IDbDataParameter>(),

                       connectionMapper.Member(c => c.HostName).BuildGetter <IDbConnection>(),
                       connectionMapper.Member(c => c.DatabaseName).BuildGetter <IDbConnection>(),


                       commandMapper.Member(p => p.BindByName).BuildSetter <IDbCommand>(),
                       commandMapper.Member(p => p.ArrayBindCount).BuildSetter <IDbCommand>(),
                       commandMapper.Member(p => p.InitialLONGFetchSize).BuildSetter <IDbCommand>(),

                       typeMapper.BuildFactory((DateTimeOffset dto, string offset) => new OracleTimeStampTZ(dto.Year, dto.Month, dto.Day, dto.Hour, dto.Minute, dto.Second, GetDateTimeOffsetNanoseconds(dto), offset)),

                       readDateTimeOffsetFromOracleTimeStampTZ,
                       readDateTimeOffsetFromOracleTimeStampLTZ,
                       readOracleDecimalToDecimalAdv,
                       readOracleDecimalToInt,
                       readOracleDecimalToLong,
                       readOracleDecimalToDecimal,
                       bulkCopy));

            Type?loadType(string typeName, DataType dataType, bool optional = false, bool hasNull = true, bool hasValue = true, bool skipConvertExpression = false)
            {
                var type = assembly !.GetType($"{typesNamespace}.{typeName}", !optional);

                if (type == null)
                {
                    return(null);
                }

                if (hasNull)
                {
                    // if native provider fails here, check that you have ODAC installed properly
                    var getNullValue = Expression.Lambda <Func <object> >(Expression.Convert(ExpressionHelper.Field(type, "Null"), typeof(object))).Compile();
                    mappingSchema.AddScalarType(type, getNullValue(), true, dataType);
                }
                else
                {
                    mappingSchema.AddScalarType(type, null, true, dataType);
                }

                if (skipConvertExpression)
                {
                    return(type);
                }

                // conversion from provider-specific type
                var valueParam = Expression.Parameter(type);

                Expression memberExpression;

                if (!hasValue)
                {
                    memberExpression = valueParam;
                }
                else
                {
                    memberExpression = ExpressionHelper.Property(valueParam, "Value");
                }

                var condition = Expression.Condition(
                    Expression.Equal(valueParam, ExpressionHelper.Field(type, "Null")),
                    Expression.Constant(null, typeof(object)),
                    Expression.Convert(memberExpression, typeof(object)));

                var convertExpression = Expression.Lambda(condition, valueParam);

                mappingSchema.SetConvertExpression(type, typeof(object), convertExpression);

                return(type);
            }
        }
        public void Test005()
        {
            var xgr = new ExpressionGenerator();
            var l3 = Expression.Lambda<Func<int>>(Expression.Default(typeof(int)));
            var l4 = Expression.Lambda<Func<string>>(Expression.Default(typeof(string)));
            var l1 = xgr.FromFunc(l3, l4, (i3, i4) => new MemberInitData()
            {
                FieldOne = i3,
                FieldTwo = i4,
            });
            var e1 = (MemberInitExpression)l1.Body;
            var e2 = e1.NewExpression;
            var e3 = l3.Body;
            var e4 = l4.Body;

            var replace = new Dictionary<Expression, Expression>
            {
            };
            var assert = ExpressionVisitorVerifierTool.Test(e1, replace);

            assert.WasVisited(e1);
            assert.WasProduced(e1);
            assert.ProductionHas(e1, o1 => o1.NewExpression == e2);
            assert.ProductionHas(e1, o1 => o1.Bindings.Count == e1.Bindings.Count);
            assert.ProductionHas(e1, o1 => ((MemberAssignment)o1.Bindings[0]).Expression == e3);
            assert.ProductionHas(e1, o1 => ((MemberAssignment)o1.Bindings[1]).Expression == e4);
            assert.WasVisited(e2);
            assert.WasProduced(e2);
            assert.WasVisited(e3);
            assert.WasProduced(e3);
            assert.WasVisited(e4);
            assert.WasProduced(e4);

            assert.TotalVisits(4);
            assert.TotalProduced(4);
        }
        public void Test023()
        {
            var xgr = new ExpressionGenerator();
            var l3 = Expression.Lambda<Func<int>>(Expression.Default(typeof(int)));
            var l4 = Expression.Lambda<Func<string>>(Expression.Default(typeof(string)));
            var l5 = Expression.Lambda<Func<bool>>(Expression.Default(typeof(bool)));
            var l1 = xgr.FromFunc(l3, l4, l5, (i3, i4, i5) => new MemberInitData()
            {
                FieldOne = i3,
                FieldTwo = i4,
                FieldThree = i5,
            });
            var e1 = (MemberInitExpression)l1.Body;
            var e2 = e1.NewExpression;
            var e3 = l3.Body;
            var e4 = l4.Body;
            var e5 = l5.Body;

            var replace = new Dictionary<Expression, Expression>
            {
                {e2, Expression.New(e2.Constructor) },
                {e3, Expression.Constant(1) },
                {e4, Expression.Constant("ABC") },
                {e5, Expression.Constant(true) },
            };
            var assert = ExpressionVisitorVerifierTool.Test(e1, replace);

            assert.WasVisited(e1);
            assert.WasNotProduced(e1);
            assert.ProductionHas(e1, o1 => o1.NewExpression == replace[e2]);
            assert.ProductionHas(e1, o1 => o1.Bindings.Count == e1.Bindings.Count);
            assert.ProductionHas(e1, o1 => ((MemberAssignment)o1.Bindings[0]).Expression == replace[e3]);
            assert.ProductionHas(e1, o1 => ((MemberAssignment)o1.Bindings[1]).Expression == replace[e4]);
            assert.ProductionHas(e1, o1 => ((MemberAssignment)o1.Bindings[2]).Expression == replace[e5]);
            assert.WasVisited(e2);
            assert.WasProduced(replace[e2]);
            assert.WasNotProduced(e2);
            assert.WasVisited(e3);
            assert.WasProduced(replace[e3]);
            assert.WasNotProduced(e3);
            assert.WasVisited(e4);
            assert.WasProduced(replace[e4]);
            assert.WasNotProduced(e4);
            assert.WasVisited(e5);
            assert.WasProduced(replace[e5]);
            assert.WasNotProduced(e5);

            assert.TotalVisits(5);
            assert.TotalProduced(5);
        }
        public void Test004()
        {
            var xgr = new ExpressionGenerator();
            var q = Enumerable.Range(0, 1).Select(x => new {
                FieldOne = 1,
                FieldTwo = "ABC"
            }).AsQueryable();

            var e1 = xgr.MultiProject(
                q,
                x => x.FieldTwo + x.FieldOne,
                x => "GHI" + x.FieldTwo + x.FieldTwo + "DEF",
                (x, y) => new {
                    InitializerOneResult = x,
                    InitializerTwoResult = y
                }
            );

            var inputPlaceholder = xgr.FromFunc(() => new {
                FieldOne = 1,
                FieldTwo = "ABC"
            });
            var expectations = xgr.FromFunc(inputPlaceholder, x => new {
                InitializerOneResult = x.FieldTwo + x.FieldOne,
                InitializerTwoResult = "GHI" + x.FieldTwo + x.FieldTwo + "DEF"
            });

            var inputParam = Expression.Parameter(inputPlaceholder.ReturnType);
            var expected = Expression.Lambda(
                ExpressionReplacer.Replace(expectations.Body, inputPlaceholder.Body, inputParam),
                inputParam
            );

            var inner1 = e1.Expression as MethodCallExpression;
            var inner2 = inner1.Arguments[1] as UnaryExpression;
            var inner3 = inner2.Operand as LambdaExpression;

            var comparer = new ExpressionComparer();
            Assert.IsTrue(comparer.AreEqual(expected, inner3));
        }