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); }
/// <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)); }
/// <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); }