public void TestExpressionDataToStringWhenNameIsSpecifiedReturnsTypeAndName()
        {
            var expression = Expression.Constant(null, typeof(object));
            var expressionData = new ExpressionData(expression, expression.Type, "SomeProperty");

            Assert.AreEqual("Type: System.Object, Name: SomeProperty", expressionData.ToString());
        }
        public void TestExpressionDataToStringReturnsType()
        {
            var expression = Expression.Constant(null, typeof(object));
            var expressionData = new ExpressionData(expression, expression.Type);

            Assert.AreEqual("Type: System.Object", expressionData.ToString());
        }
        public void TestExpressionDataWhenConstructedReturnsTheConstructedValues()
        {
            var expression = Expression.Constant(null, typeof(object));
            var expressionData = new ExpressionData(expression, expression.Type);

            Assert.AreSame(expression, expressionData.Expression);
            Assert.AreEqual(typeof(object), expressionData.Type);
        }
        public void TestPageBuilderContextWhenConstructedReturnsTheConstructedValues()
        {
            var browser = new ExpressionData(null, typeof(object));
            var document = new ExpressionData(null, typeof(object));
            var parentElement = new ExpressionData(null, typeof(object));

            var context = new PageBuilderContext(browser, parentElement, document);

            Assert.AreSame(browser, context.Browser);
            Assert.AreSame(document, context.Document);
            Assert.AreSame(parentElement, context.ParentElement);
            Assert.IsNull(context.RootLocator);
            Assert.IsNull(context.CurrentElement);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Creates the new item expression that creates the object and initial mapping.
        /// </summary>
        /// <param name="elementType">Type of the element.</param>
        /// <returns>The initial creation lambda expression.</returns>
        /// <exception cref="System.InvalidOperationException">Thrown if the constructor is invalid.</exception>
        private Expression <Func <TParent, IBrowser, Action <TOutput>, TOutput> > CreateNewItemExpression(Type elementType)
        {
            var browserParameter = Expression.Parameter(typeof(IBrowser), "browser");
            var browserArgument  = new ExpressionData(browserParameter, typeof(IBrowser), "browser");

            var parentParameter = Expression.Parameter(typeof(TParent), "parent");
            var parentArgument  = new ExpressionData(parentParameter, typeof(TParent), "rootContext");

            var docVariable  = Expression.Variable(elementType);
            var documentData = new ExpressionData(docVariable, elementType, elementType.Name);

            var context = new PageBuilderContext(browserArgument, parentArgument, documentData);

            var constructor = this.GetConstructor(elementType, context);

            if (constructor == null)
            {
                throw this.CreateConstructorException(null, elementType);
            }

            var actionParameter = Expression.Parameter(typeof(Action <TOutput>), "action");


            //Spin though properties and make an initializer for anything we can set that has an attribute
            var pageMethodInfo = new Action <TOutput, Action <TOutput> >(this.AssignPageAttributes).GetMethodInfo();
            var expressions    = new List <Expression>
            {
                Expression.Assign(docVariable, Expression.New(constructor.Item1, constructor.Item2)),
                Expression.Call(
                    Expression.Constant(this),
                    pageMethodInfo,
                    Expression.Convert(docVariable, typeof(TOutput)),
                    actionParameter)
            };



            this.MapObjectProperties(expressions, elementType, context);
            expressions.Add(docVariable);

            var methodCall = Expression.Block(new[] { docVariable }, expressions);

            return(Expression.Lambda <Func <TParent, IBrowser, Action <TOutput>, TOutput> >(methodCall, parentParameter, browserParameter, actionParameter));
        }
Exemplo n.º 6
0
 /// <summary>
 /// Gets the constructor parameter for the given type.
 /// </summary>
 /// <param name="parameterType">Type of the parameter to fill.</param>
 /// <param name="parentArgument">The parent argument.</param>
 /// <param name="rootLocator">The root locator argument if different from the parent.</param>
 /// <returns>The constructor information that matches.</returns>
 protected virtual Expression FillConstructorParameter(Type parameterType, ExpressionData parentArgument, ExpressionData rootLocator)
 {
     return(typeof(TParent).IsAssignableFrom(parameterType) ? parentArgument.Expression : null);
 }
        public void TestCreateChildContextWhenMultipleContextsAreCreatedThenTheRootContextIsTheFirstParent()
        {
            var browser = new ExpressionData(null, typeof(object));
            var document = new ExpressionData(null, typeof(object));
            var parentElement = new ExpressionData(null, typeof(object));
            var context = new PageBuilderContext(browser, parentElement, document);

            var child1 = new ExpressionData(null, typeof(object));
            var child2 = new ExpressionData(null, typeof(object));
            var childContext1 = context.CreateChildContext(child1);
            var childContext2 = childContext1.CreateChildContext(child2);

            Assert.AreSame(document, childContext1.ParentElement);
            Assert.AreSame(parentElement, childContext1.RootLocator);
            
            Assert.AreSame(child1, childContext2.ParentElement);
            Assert.AreSame(parentElement, childContext2.RootLocator);
        }