Example #1
0
        public void ExpressionHeap_ShareGlobals()
        {
            var p0 = Expression.Parameter(typeof(int));
            var p1 = Expression.Parameter(typeof(int));
            var ps = new Expression[]
            {
                /* 0 */ p0,
                /* 1 */ p1,
                /* 2 */ Expression.Parameter(typeof(int), "test:foo"),
                /* 3 */ Expression.Parameter(typeof(int), "test:foo"),
                /* 4 */ Expression.Parameter(typeof(int), "test:bar"),
                /* 5 */ Expression.Parameter(typeof(int), "not:foo"),
                /* 6 */ Expression.Parameter(typeof(int), "not:foo"),
                /* 7 */ Expression.Parameter(typeof(long), "test:foo"),
                /* 8 */ Expression.Invoke(Expression.Lambda(p0, p0), p0),
                /* 9 */ Expression.Invoke(Expression.Lambda(p0, p0), p1),
            };

            Assert.AreNotSame(ps[0], ps[1]);
            Assert.AreNotSame(ps[2], ps[3]);

            var heap = new TestHeap();
            var rs   = ps.Select(p => heap.Create(p)).ToArray();

            Assert.AreNotSame(rs[0].Value, rs[1].Value);
            Assert.AreNotSame(rs[2].Value, rs[4].Value);
            Assert.AreNotSame(rs[5].Value, rs[6].Value);
            Assert.AreNotSame(rs[2].Value, rs[7].Value);
            Assert.AreSame(rs[2].Value, rs[3].Value);

            // Rebuild must be scoped
            Assert.AreSame(((InvocationExpression)ps[8]).Expression, ((InvocationExpression)rs[9].Value).Expression);
        }