public void ExpressionSlimEntityTypeRecordizer_Enum1_RoslynV1_Regression()
        {
            var p = Expression.Parameter(typeof(Persoon1), "p");

            var e =
                Expression.Lambda <Func <Persoon1, bool> >(
                    Expression.Equal(
                        Expression.Convert(
                            Expression.Property(p, "Geslacht"),
                            typeof(int)
                            ),
                        Expression.Convert(
                            // NB: We used to choke on this, because our rewriter wants to erase enum types but didn't know how to
                            //     erase constants thereof. Roslyn v1.0 generates the tree below, while C# 5.0 and Roslyn v1.2
                            //     generate a tree with Expression.Constant(0, typeof(int)), which does not require a type
                            //     change in our rewriter, so the constant is kept as-is.
                            Expression.Constant(Sex.Male, typeof(Sex)),
                            typeof(int)
                            )
                        ),
                    p
                    );

            var eta       = new ExpressionSlimEntityTypeRecordizer();
            var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace());
            var slim      = converter.Visit(e);

            var r = (LambdaExpression)eta.Apply(slim).ToExpression();

            var m = (MemberExpression)((UnaryExpression)((BinaryExpression)r.Body).Left).Operand;

            Assert.AreEqual("contoso://entities/person/sex", m.Member.Name);
            Assert.AreEqual(typeof(int), ((PropertyInfo)m.Member).PropertyType);
        }
Exemplo n.º 2
0
#pragma warning restore IDE0060 // Remove unused parameter

        protected static Expression ExpressionRoundtrip(Expression e)
        {
            var exprToSlim = new ExpressionToExpressionSlimConverter();
            var slimToExpr = new ExpressionSlimToExpressionConverter();

            return(slimToExpr.Visit(exprToSlim.Visit(e)));
        }
Exemplo n.º 3
0
        private static void AssertRoundtrip(Expression e)
        {
            var toSlim = new ExpressionToExpressionSlimConverter();
            var toLinq = new ExpressionSlimToExpressionConverter();
            var eqComp = new ExpressionEqualityComparer(() => new Comparator());

            var s = toSlim.Visit(e);
            var r = toLinq.Visit(s);

            Assert.IsTrue(eqComp.Equals(e, r), e.ToString());
        }
        public void ExpressionSlimEntityTypeRecordizer_Constants_Null()
        {
            var eta       = new ExpressionSlimEntityTypeRecordizer();
            var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace());
            var slim      = converter.Visit(Expression.Constant(value: null, typeof(Qux)));

            var res = eta.Apply(slim).ToExpression();

            Assert.IsNotNull(res); // TODO: semantic equivalence checks
            Assert.IsTrue(res is ConstantExpression);
            Assert.IsNull(((ConstantExpression)res).Value);
        }
        public void ExpressionSlimEntityTypeRecordizer_Constants_Errors1()
        {
            foreach (var o in new object[]
            {
                new Func <Qux, Qux>(x => x),
            })
            {
                var eta       = new ExpressionSlimEntityTypeRecordizer();
                var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace());

                Assert.ThrowsException <InvalidOperationException>(() => eta.Apply(converter.Visit(Expression.Constant(o))).ToExpression());
            }
        }
Exemplo n.º 6
0
        private static void OneWayParseException(IEnumerable <Expression> expressions, ConstructorInfo deserializerCtor)
        {
            var state      = new SerializationState(BonsaiVersion.Default);
            var serializer = new TestBonsaiSerializer(state);
            var slimifier  = new ExpressionToExpressionSlimConverter();

            foreach (var expr in expressions)
            {
                var slim         = slimifier.Visit(expr);
                var json         = serializer.Visit(slim);
                var deserializer = (BonsaiToExpressionSlimConverter)deserializerCtor.Invoke(new object[] { state.ToJson() });
                Assert.ThrowsException <BonsaiParseException>(() => deserializer.Visit(json));
            }
        }
        public void ExpressionSlimEntityTypeRecordizer_Enum1()
        {
            var e = (Expression <Func <Persoon1, bool> >)(p => p.Geslacht == Sex.Male);

            var eta       = new ExpressionSlimEntityTypeRecordizer();
            var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace());
            var slim      = converter.Visit(e);

            var r = (LambdaExpression)eta.Apply(slim).ToExpression();

            var m = (MemberExpression)((UnaryExpression)((BinaryExpression)r.Body).Left).Operand;

            Assert.AreEqual("contoso://entities/person/sex", m.Member.Name);
            Assert.AreEqual(typeof(int), ((PropertyInfo)m.Member).PropertyType);
        }
        public void ExpressionSlimEntityTypeRecordizer_Errors()
        {
            foreach (var e in new Expression[]
            {
                (Expression <Func <Qux> >)(() => new Qux(1)
                {
                    Baz = 1
                }),
                (Expression <Func <MissingMapping> >)(() => new MissingMapping(1)),
                (Expression <Func <NonMatchingMapping> >)(() => new NonMatchingMapping(1)),
                (Expression <Func <DuplicateMapping> >)(() => new DuplicateMapping(1, 2)),
            })
            {
                var eta       = new ExpressionSlimEntityTypeRecordizer();
                var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace());

                Assert.ThrowsException <InvalidOperationException>(() => eta.Apply(converter.Visit(e)));
            }
        }
        public void ExpressionSlimEntityTypeRecordizer_Enum3_Nullable2()
        {
            var p = Expression.Parameter(typeof(Persoon2));
            var e = Expression.Equal(Expression.Property(p, "Geslacht"), Expression.Constant(value: null, typeof(Sex?)));

            var eta       = new ExpressionSlimEntityTypeRecordizer();
            var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace());
            var slim      = converter.Visit(e);

            var r = (BinaryExpression)eta.Apply(slim).ToExpression();

            var m = (MemberExpression)r.Left;
            var c = (ConstantExpression)r.Right;

            Assert.AreEqual("contoso://entities/person/sex", m.Member.Name);
            Assert.AreEqual(typeof(int?), ((PropertyInfo)m.Member).PropertyType);
            Assert.AreEqual(typeof(int?), c.Type);
            Assert.IsNull(c.Value);
        }
        public void ExpressionSlimEntityTypeRecordizer_Enum2()
        {
            var e = (Expression <Func <Persoon1, Persoon1> >)(x => x);

            var eta       = new ExpressionSlimEntityTypeRecordizer();
            var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace());
            var slim      = converter.Visit(e);

            var r = (LambdaExpression)eta.Apply(slim).ToExpression();

            var t = r.Parameters.Single().Type;

            Assert.IsTrue(t.IsRecordType());

            var ps = t.GetProperties();
            var s  = ps.Single(p => p.Name == "contoso://entities/person/sex");

            Assert.AreEqual(typeof(int), s.PropertyType);
        }
Exemplo n.º 11
0
        public void ExpressionSlimEntityTypeRecordizer_Errors()
        {
            foreach (var e in new Expression[]
            {
#pragma warning disable IDE0004 // Remove Unnecessary Cast. (Only unnecessary on C# 10 or later.)
                (Expression <Func <Qux> >)(() => new Qux(1)
                {
                    Baz = 1
                }),
                (Expression <Func <MissingMapping> >)(() => new MissingMapping(1)),
                (Expression <Func <NonMatchingMapping> >)(() => new NonMatchingMapping(1)),
                (Expression <Func <DuplicateMapping> >)(() => new DuplicateMapping(1, 2)),
#pragma warning restore IDE0004 // Remove Unnecessary Cast
            })
            {
                var eta       = new ExpressionSlimEntityTypeRecordizer();
                var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace());

                Assert.ThrowsException <InvalidOperationException>(() => eta.Apply(converter.Visit(e)));
            }
        }
        public void ExpressionSlimEntityTypeRecordizer_Constants_ManOrBoy2()
        {
            Expression <Func <IEnumerable <A>, IEnumerable <int> > > f = xs => from x in xs
                                                                         let b = x.B
                                                                                 from c in b.Cs
                                                                                 let d = c.D
                                                                                         where d > 0
                                                                                         let e = new A {
                B = new B {
                    Cs = new C[] { c, new C {
                                       D = d + 1, Es = new List <E> {
                                           new E {
                                               F = d * d
                                           }
                                       }
                                   } }
                }
            }
            let z = new A {
                B = { Cs                                         = new C[] { c, new C {
                                                                                 D                       = d + 1, Es ={ new E {
                                                                                                                         F = d * d
                                                                                                                     } }
                                                                             } } }
            }
            where e.B.Cs[1].Es[0].F == z.B.Cs[1].Es[0].F
            select 7 * e.B.Cs.Sum(y => y.D);

            var g = f.Compile();

            var res = g(new[] {
                new A {
                    B = new B {
                        Cs = new C[] { new C {
                                           D = 23
                                       } }
                    }
                },
                new A {
                    B = new B {
                        Cs = new C[] { new C {
                                           D = -1
                                       } }
                    }
                },
                new A {
                    B = new B {
                        Cs = new C[] { new C {
                                           D = 87
                                       } }
                    }
                },
            });

            var eta       = new ExpressionSlimEntityTypeRecordizer();
            var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace());
            var slim      = converter.Visit(f);

            var h = (LambdaExpression)eta.Apply(slim).ToExpression();

            var anonA  = h.Parameters[0].Type.GetGenericArguments()[0];
            var propB  = anonA.GetProperty("b");
            var anonB  = propB.PropertyType;
            var propCs = anonB.GetProperty("cs");
            var anonC  = propCs.PropertyType.GetElementType();
            var propD  = anonC.GetProperty("d");

            var c23 = Activator.CreateInstance(anonC);

            propD.SetValue(c23, 23);
            var cm1 = Activator.CreateInstance(anonC);

            propD.SetValue(cm1, -1);
            var c87 = Activator.CreateInstance(anonC);

            propD.SetValue(c87, 87);

            var cs23 = (IList)Array.CreateInstance(anonC, 1);

            cs23[0] = c23;
            var csm1 = (IList)Array.CreateInstance(anonC, 1);

            csm1[0] = cm1;
            var cs87 = (IList)Array.CreateInstance(anonC, 1);

            cs87[0] = c87;

            var b23 = Activator.CreateInstance(anonB);

            propCs.SetValue(b23, cs23);
            var bm1 = Activator.CreateInstance(anonB);

            propCs.SetValue(bm1, csm1);
            var b87 = Activator.CreateInstance(anonB);

            propCs.SetValue(b87, cs87);

            var a23 = Activator.CreateInstance(anonA);

            propB.SetValue(a23, b23);
            var am1 = Activator.CreateInstance(anonA);

            propB.SetValue(am1, bm1);
            var a87 = Activator.CreateInstance(anonA);

            propB.SetValue(a87, b87);

            var inp = (IList)Array.CreateInstance(anonA, 3);

            inp[0] = a23;
            inp[1] = am1;
            inp[2] = a87;

            var p = CompilerGeneratedNameEliminator.Prettify(h).ToCSharpString(allowCompilerGeneratedNames: true).Replace("<>a__RecordType", "rec").Replace("<>h__TransparentIdentifier", "__t");

            Assert.IsTrue(true, p);

            var output = (IEnumerable <int>)h.Compile().DynamicInvoke(new object[] { inp });

            Assert.IsTrue(res.SequenceEqual(output));
        }