예제 #1
0
        public void Should_be_able_to_write_from_sub_model <T>(T model, string expectedResult)
        {
            var template = SyntaxTree.Block(SyntaxTree.WriteExpression(SyntaxTreeExpression.SubModel(SyntaxTreeExpression.Property(model.GetType(), "Sub"), SyntaxTreeExpression.Property(model.GetType().GetProperty("Sub").PropertyType, "SubData"))));
            var result   = ExecuteTemplate(template, model);

            Assert.That(result, Is.EqualTo(expectedResult));
        }
예제 #2
0
        public void Should_parse_sub_model_expression_from_current_model()
        {
            var model  = new { User = new { Name = "Bob" } };
            var result = SuperSimpleExpressionParser.Parse(CreateScopes(model.GetType()), "Current.User.Name");

            result.ShouldDeepEqual(SyntaxTreeExpression.SubModel(
                                       SyntaxTreeExpression.Property(model.GetType(), "User"),
                                       SyntaxTreeExpression.Property(model.User.GetType(), "Name")
                                       ));
        }
예제 #3
0
        public void Should_parse_field_from_subsubmodel()
        {
            var result = HandlebarsExpressionParser.Parse(CreateScopes(typeof(Model)), "SubModel.SubSubModel.SubSubField");

            result.ShouldDeepEqual(SyntaxTreeExpression.SubModel(
                                       SyntaxTreeExpression.Property(typeof(Model), "SubModel"),
                                       SyntaxTreeExpression.SubModel(
                                           SyntaxTreeExpression.Field(typeof(SubModel), "SubSubModel"),
                                           SyntaxTreeExpression.Field(typeof(SubSubModel), "SubSubField"))
                                       )
                                   );
        }
예제 #4
0
 public static object[] CaseInsensitiveTests()
 {
     return(new object[] {
         new object[] { "UserName", SyntaxTreeExpression.Property(typeof(CaseTestModel), "UserName") },
         new object[] { "userName", SyntaxTreeExpression.Field(typeof(CaseTestModel), "userName") },
         new object[] { "username", SyntaxTreeExpression.Property(typeof(CaseTestModel), "UserName") },
         new object[] { "USERNAME", SyntaxTreeExpression.Property(typeof(CaseTestModel), "UserName") },
         new object[] { "FOO", SyntaxTreeExpression.Field(typeof(CaseTestModel), "foo") },
         new object[] { "function()", SyntaxTreeExpression.Function(typeof(CaseTestModel), "Function") },
         new object[] { "submodel.subproperty", SyntaxTreeExpression.SubModel(SyntaxTreeExpression.Property(typeof(CaseTestModel), "SubModel"), SyntaxTreeExpression.Property(typeof(SubModel), "SubProperty")) },
         new object[] { "submodel.subsubmodel.subsubfield", SyntaxTreeExpression.SubModel(SyntaxTreeExpression.Property(typeof(CaseTestModel), "SubModel"), SyntaxTreeExpression.SubModel(SyntaxTreeExpression.Field(typeof(SubModel), "SubSubModel"), SyntaxTreeExpression.Field(typeof(SubSubModel), "SubSubField"))) }
     });
 }
예제 #5
0
        public void Should_parse_multiple_sub_model_expressions()
        {
            var model  = new { User = new { Department = new { Company = new { Name = "Foo" } } } };
            var result = SuperSimpleExpressionParser.Parse(CreateScopes(model.GetType()), "Model.User.Department.Company.Name");

            result.ShouldDeepEqual(SyntaxTreeExpression.SubModel(
                                       SyntaxTreeExpression.Property(model.GetType(), "User", ExpressionScope.RootModel),
                                       SyntaxTreeExpression.SubModel(
                                           SyntaxTreeExpression.Property(model.User.GetType(), "Department"),
                                           SyntaxTreeExpression.SubModel(
                                               SyntaxTreeExpression.Property(model.User.Department.GetType(), "Company"),
                                               SyntaxTreeExpression.Property(model.User.Department.Company.GetType(), "Name")
                                               )
                                           )
                                       ));
        }
예제 #6
0
        public void Should_not_get_mixed_up_by_caching_of_late_bindings()
        {
            var model = new Dictionary <string, object>();

            model.Add("Name", "D1");
            model.Add("User", new { Name = "U" });
            model.Add("Department", new Dictionary <string, object> {
                { "Name", "D2" }
            });
            var template = SyntaxTree.Block(
                SyntaxTree.WriteExpression(SyntaxTreeExpression.LateBound("Name")),
                SyntaxTree.WriteExpression(SyntaxTreeExpression.SubModel(SyntaxTreeExpression.LateBound("User"), SyntaxTreeExpression.LateBound("Name"))),
                SyntaxTree.WriteExpression(SyntaxTreeExpression.SubModel(SyntaxTreeExpression.LateBound("Department"), SyntaxTreeExpression.LateBound("Name")))
                );
            var result = ExecuteTemplate(template, model);

            Assert.That(result, Is.EqualTo("D1UD2"));
        }
예제 #7
0
        private static ExpressionNode ParseAgainstModel(Type modelType, string expression, ExpressionScope expressionScope, int recursionLevel, IMemberLocator memberLocator, SourceLocation location)
        {
            var dotIndex = expression.IndexOf('.');

            if (dotIndex >= 0)
            {
                var subModel = ParseAgainstModel(modelType, expression.Substring(0, dotIndex), expressionScope, recursionLevel, memberLocator, location.SetLength(dotIndex));
                return(SyntaxTreeExpression.SubModel(
                           subModel,
                           ParseAgainstModel(subModel.ResultType, expression.Substring(dotIndex + 1), ExpressionScope.CurrentModelOnStack, 0, memberLocator, location.MoveIndex(dotIndex + 1)),
                           location
                           ));
            }

            if (expression.EndsWith("()"))
            {
                var func = memberLocator.FindMember(modelType, expression.Substring(0, expression.Length - 2), MemberTypes.Method);
                if (func != null)
                {
                    return(SyntaxTreeExpression.Function(modelType, func.Name, location, expressionScope));
                }
            }

            var prop = memberLocator.FindMember(modelType, expression, MemberTypes.Property | MemberTypes.Field);

            if (prop != null)
            {
                switch (prop.MemberType)
                {
                case MemberTypes.Property: return(SyntaxTreeExpression.Property(modelType, prop.Name, location, expressionScope, recursionLevel));

                case MemberTypes.Field: return(SyntaxTreeExpression.Field(modelType, prop.Name, location, expressionScope, recursionLevel));
                }
            }

            if (IsLateBoundAcceptingType(modelType))
            {
                return(SyntaxTreeExpression.LateBound(expression, location, memberLocator, false, expressionScope, recursionLevel));
            }

            throw new VeilParserException(String.Format("Unable to parse model expression '{0}' againt model '{1}'", expression, modelType.Name), location);
        }
예제 #8
0
        private static ExpressionNode ParseAgainstModel(string originalExpression, string expression, SuperSimpleTemplateParserScope scope, ExpressionScope expressionScope)
        {
            var subModelIndex = expression.IndexOf('.');

            if (subModelIndex >= 0)
            {
                var subModel = ParseAgainstModel(originalExpression, expression.Substring(0, subModelIndex), scope, expressionScope);
                return(SyntaxTreeExpression.SubModel(
                           subModel,
                           ParseAgainstModel(originalExpression, expression.Substring(subModelIndex + 1), new SuperSimpleTemplateParserScope {
                    Block = scope.Block, ModelType = subModel.ResultType
                }, ExpressionScope.CurrentModelOnStack)
                           ));
            }

            var propertyInfo = scope.ModelType.GetProperty(expression);

            if (propertyInfo != null)
            {
                return(SyntaxTreeExpression.Property(scope.ModelType, expression, expressionScope));
            }

            var fieldInfo = scope.ModelType.GetField(expression);

            if (fieldInfo != null)
            {
                return(SyntaxTreeExpression.Field(scope.ModelType, expression, expressionScope));
            }

            if (IsLateBoundAcceptingType(scope.ModelType))
            {
                return(SyntaxTreeExpression.LateBound(expression, true, expressionScope));
            }

            if (expression.StartsWith("Has"))
            {
                var collectionExpression = ParseAgainstModel(originalExpression, expression.Substring(3), scope, expressionScope);
                return(SyntaxTreeExpression.HasItems(collectionExpression));
            }

            throw new VeilParserException(String.Format("Unable to parse model expression '{0}'", originalExpression));
        }
예제 #9
0
        private static ExpressionNode ParseAgainstModel(Type modelType, string expression, ExpressionScope expressionScope)
        {
            var dotIndex = expression.IndexOf('.');

            if (dotIndex >= 0)
            {
                var subModel = HandlebarsExpressionParser.ParseAgainstModel(modelType, expression.Substring(0, dotIndex), expressionScope);
                return(SyntaxTreeExpression.SubModel(
                           subModel,
                           HandlebarsExpressionParser.ParseAgainstModel(subModel.ResultType, expression.Substring(dotIndex + 1), ExpressionScope.CurrentModelOnStack)
                           ));
            }

            if (expression.EndsWith("()"))
            {
                var func = FindMember(modelType, expression.Substring(0, expression.Length - 2), MemberTypes.Method);
                if (func != null)
                {
                    return(SyntaxTreeExpression.Function(modelType, func.Name, expressionScope));
                }
            }

            var prop = FindMember(modelType, expression, MemberTypes.Property | MemberTypes.Field);

            if (prop != null)
            {
                switch (prop.MemberType)
                {
                case MemberTypes.Property: return(SyntaxTreeExpression.Property(modelType, prop.Name, expressionScope));

                case MemberTypes.Field: return(SyntaxTreeExpression.Field(modelType, prop.Name, expressionScope));
                }
            }

            if (IsLateBoundAcceptingType(modelType))
            {
                return(SyntaxTreeExpression.LateBound(expression, false, expressionScope));
            }

            throw new VeilParserException(String.Format("Unable to parse model expression '{0}' against model '{1}'", expression, modelType.Name));
        }