Example #1
0
        private static void HandleEachOverSelf(SuperSimpleTemplateParserState state)
        {
            var each = SyntaxTree.Iterate(
                SyntaxTreeExpression.Self(state.CurrentTypeInScope()),
                SyntaxTree.Block()
                );

            state.AddNodeToCurrentBlock(each);
            state.PushNewScope(each.Body, each.ItemType);
        }
Example #2
0
        public void Should_parse_sub_model_expression_from_root_model()
        {
            var model  = new { User = new { Name = "Bob" } };
            var result = SuperSimpleExpressionParser.Parse(CreateScopes(model.GetType()), "Model.User.Name");

            result.ShouldDeepEqual(SyntaxTreeExpression.SubModel(
                                       SyntaxTreeExpression.Property(model.GetType(), "User", ExpressionScope.RootModel),
                                       SyntaxTreeExpression.Property(model.User.GetType(), "Name")
                                       ));
        }
        public void Should_trim_whitespace_from_next_literal()
        {
            var template = Parse("Hello {{this~}}\r\n!", typeof(string));

            AssertSyntaxTree(
                template,
                SyntaxTree.WriteString("Hello "),
                SyntaxTree.WriteExpression(SyntaxTreeExpression.Self(typeof(string)), true),
                SyntaxTree.WriteString("!")
                );
        }
Example #4
0
        public void Should_parse_if_statement()
        {
            var template = Parse("Hello {{#if Conditional }} John{{/if}}", typeof(TestModel));

            AssertSyntaxTree(template, new SyntaxTreeNode[] {
                SyntaxTree.WriteString("Hello "),
                SyntaxTree.Conditional(SyntaxTreeExpression.Property(typeof(TestModel), "Conditional"),
                                       SyntaxTree.Block(SyntaxTree.WriteString(" John"))
                                       )
            });
        }
Example #5
0
        public void Should_parse_partial_syntax()
        {
            var model    = new { };
            var template = Parse("Hello {{> person }}", model.GetType());

            AssertSyntaxTree(
                template,
                SyntaxTree.WriteString("Hello "),
                SyntaxTree.Include("person", SyntaxTreeExpression.Self(model.GetType()))
                );
        }
Example #6
0
        public void Should_replace_primitive_model_with_value()
        {
            var input  = @"<html><head></head><body>Hello there @Model;</body></html>";
            var output = Parse(input, typeof(string));

            AssertSyntaxTree(output,
                             SyntaxTree.WriteString("<html><head></head><body>Hello there "),
                             SyntaxTree.WriteExpression(SyntaxTreeExpression.Self(typeof(string), ExpressionScope.RootModel)),
                             SyntaxTree.WriteString("</body></html>")
                             );
        }
Example #7
0
        private static void HandlePartial(SuperSimpleTemplateParserState state)
        {
            var            details    = state.ParseCurrentTokenNameAndModelExpression();
            ExpressionNode expression = SyntaxTreeExpression.Self(state.CurrentTypeInScope());

            if (!String.IsNullOrEmpty(details.Model))
            {
                expression = state.ParseExpression(details.Model);
            }
            state.AddNodeToCurrentBlock(SyntaxTree.Include(details.Name, expression));
        }
Example #8
0
        public void Should_be_able_to_reference_parent_scopes_model()
        {
            var current = new { };
            var parent  = new { Name = "" };
            var root    = new { };

            var scopes = CreateScopes(root.GetType(), parent.GetType(), current.GetType());
            var result = HandlebarsExpressionParser.Parse(scopes, "../Name");

            result.ShouldDeepEqual(SyntaxTreeExpression.Property(parent.GetType(), "Name", ExpressionScope.ModelOfParentScope));
        }
Example #9
0
        public void Should_be_able_to_write_item_from_dictionary()
        {
            var model = new Dictionary <string, object>();

            model.Add("Name", "Joe");
            var template = SyntaxTree.Block(
                SyntaxTree.WriteExpression(SyntaxTreeExpression.LateBound("Name"))
                );
            var result = ExecuteTemplate(template, model);

            Assert.That(result, Is.EqualTo("Joe"));
        }
Example #10
0
        public void Should_replaces_valid_property()
        {
            var input  = @"<html><head></head><body>Hello there @Model.Name;</body></html>";
            var model  = new { Name = "bob" };
            var output = Parse(input, model.GetType());

            AssertSyntaxTree(output,
                             SyntaxTree.WriteString("<html><head></head><body>Hello there "),
                             SyntaxTree.WriteExpression(SyntaxTreeExpression.Property(model.GetType(), "Name", ExpressionScope.RootModel)),
                             SyntaxTree.WriteString("</body></html>")
                             );
        }
Example #11
0
        public void Should_parse_basic_partials()
        {
            var input  = @"<html><head></head><body>@Partial['testing'];</body></html>";
            var result = Parse(input, typeof(object));

            AssertSyntaxTree(
                result,
                SyntaxTree.WriteString("<html><head></head><body>"),
                SyntaxTree.Include("testing", SyntaxTreeExpression.Self(typeof(object))),
                SyntaxTree.WriteString("</body></html>")
                );
        }
Example #12
0
        public void Should_emit_all_nodes_in_block()
        {
            var model    = new { Name = "World" };
            var template = SyntaxTree.Block(
                SyntaxTree.WriteString("Hello "),
                SyntaxTree.WriteExpression(SyntaxTreeExpression.Property(model.GetType(), "Name")),
                SyntaxTree.WriteString("!")
                );
            var result = ExecuteTemplate(template, model);

            Assert.That(result, Is.EqualTo("Hello World!"));
        }
Example #13
0
        public void Should_allow_model_statement_to_be_followed_by_a_newline()
        {
            var input  = "<html><head></head><body>Hello there @Model.Name;\n</body></html>";
            var model  = new { Name = "Bob" };
            var output = Parse(input, model.GetType());

            AssertSyntaxTree(output,
                             SyntaxTree.WriteString("<html><head></head><body>Hello there "),
                             SyntaxTree.WriteExpression(SyntaxTreeExpression.Property(model.GetType(), "Name", ExpressionScope.RootModel)),
                             SyntaxTree.WriteString("\n</body></html>")
                             );
        }
Example #14
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"))
                                       )
                                   );
        }
Example #15
0
        public void Should_throw_if_unable_to_load_template()
        {
            var model    = new { Name = "Joe" };
            var template = SyntaxTree.Block(
                SyntaxTree.WriteString("Hello "),
                SyntaxTree.Include("person", SyntaxTreeExpression.Self(model.GetType()))
                );

            Assert.Throws <VeilCompilerException>(() =>
            {
                ExecuteTemplate(template, model);
            });
        }
Example #16
0
        public void Should_handle_has_items_expression <T>(T model, string expectedResult)
        {
            var template = SyntaxTree.Block(
                SyntaxTree.Conditional(
                    SyntaxTreeExpression.HasItems(SyntaxTreeExpression.Property(model.GetType(), "Items")),
                    SyntaxTree.Block(SyntaxTree.WriteString("HasItems")),
                    SyntaxTree.Block(SyntaxTree.WriteString("HasNoItems"))
                    )
                );
            var result = this.ExecuteTemplate(template, model);

            Assert.Equal(expectedResult, result);
        }
Example #17
0
        public void Should_parse_each_block()
        {
            var result = Parse("{{#each Items }}{{ this }}{{/each}}", typeof(TestModel));

            AssertSyntaxTree(result,
                             SyntaxTree.Iterate(
                                 SyntaxTreeExpression.Property(typeof(TestModel), "Items"),
                                 SyntaxTree.Block(
                                     SyntaxTree.WriteExpression(SyntaxTreeExpression.Self(typeof(string)), true)
                                     )
                                 )
                             );
        }
Example #18
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"))) }
     });
 }
Example #19
0
        public void Should_handle_empty_false_block(BlockNode falseBlock)
        {
            var model    = new { X = true };
            var template = SyntaxTree.Block(
                SyntaxTree.Conditional(
                    SyntaxTreeExpression.Property(model.GetType(), "X"),
                    SyntaxTree.Block(SyntaxTree.WriteString("Hello")),
                    falseBlock)
                );
            var result = this.ExecuteTemplate(template, model);

            Assert.Equal("Hello", result);
        }
Example #20
0
        public void Should_parse_partial_with_specified_model_property()
        {
            var input  = @"<html><head></head><body>@Partial['testing', Model.User];</body></html>";
            var model  = new { Name = "Jim", User = new { Name = "Bob" } };
            var result = Parse(input, model.GetType());

            AssertSyntaxTree(
                result,
                SyntaxTree.WriteString("<html><head></head><body>"),
                SyntaxTree.Include("testing", SyntaxTreeExpression.Property(model.GetType(), "User", ExpressionScope.RootModel)),
                SyntaxTree.WriteString("</body></html>")
                );
        }
Example #21
0
        public void Model_with_exclaimation_should_html_encode()
        {
            var input  = @"<html><head></head><body>Hello there @!Model.Name;</body></html>";
            var model  = new { Name = "<b>Bob</b>" };
            var output = Parse(input, model.GetType());

            AssertSyntaxTree(
                output,
                SyntaxTree.WriteString("<html><head></head><body>Hello there "),
                SyntaxTree.WriteExpression(SyntaxTreeExpression.Property(model.GetType(), "Name", ExpressionScope.RootModel), true),
                SyntaxTree.WriteString("</body></html>")
                );
        }
Example #22
0
        public void Should_be_able_to_output_value_types_from_collections()
        {
            var model    = new { Items = new[] { "1", "2", "3", "4" } };
            var template = SyntaxTree.Block(SyntaxTree.Iterate(
                                                SyntaxTreeExpression.Property(model.GetType(), "Items"),
                                                SyntaxTree.Block(
                                                    SyntaxTree.WriteExpression(SyntaxTreeExpression.Self(typeof(string)))
                                                    )
                                                ));

            var result = ExecuteTemplate(template, model);

            Assert.Equal("1234", result);
        }
Example #23
0
        public void Should_be_able_to_reference_parent_scope_from_within_each_block()
        {
            var result = Parse("{{#each Items }}{{ ../Prefix }}{{ this }}{{/each}}", typeof(TestModel));

            AssertSyntaxTree(result,
                             SyntaxTree.Iterate(
                                 SyntaxTreeExpression.Property(typeof(TestModel), "Items"),
                                 SyntaxTree.Block(
                                     SyntaxTree.WriteExpression(SyntaxTreeExpression.Property(typeof(TestModel), "Prefix", ExpressionScope.ModelOfParentScope), true),
                                     SyntaxTree.WriteExpression(SyntaxTreeExpression.Self(typeof(string)), true)
                                     )
                                 )
                             );
        }
Example #24
0
        public void Should_replace_multiple_properties_with_the_same_name()
        {
            const string input  = @"<html><head></head><body>Hello there @Model.Name;, nice to see you @Model.Name;</body></html>";
            var          model  = new { Name = "bob" };
            var          output = Parse(input, model.GetType());

            AssertSyntaxTree(output,
                             SyntaxTree.WriteString("<html><head></head><body>Hello there "),
                             SyntaxTree.WriteExpression(SyntaxTreeExpression.Property(model.GetType(), "Name", ExpressionScope.RootModel)),
                             SyntaxTree.WriteString(", nice to see you "),
                             SyntaxTree.WriteExpression(SyntaxTreeExpression.Property(model.GetType(), "Name", ExpressionScope.RootModel)),
                             SyntaxTree.WriteString("</body></html>")
                             );
        }
Example #25
0
        public static ExpressionNode Parse(HandlebarsBlockStack blockStack, string expression)
        {
            expression = expression.Trim();

            if (expression == "this")
            {
                return(SyntaxTreeExpression.Self(blockStack.GetCurrentModelType(), ExpressionScope.CurrentModelOnStack));
            }
            if (expression.StartsWith("../"))
            {
                return(ParseAgainstModel(blockStack.GetParentModelType(), expression.Substring(3), ExpressionScope.ModelOfParentScope));
            }

            return(ParseAgainstModel(blockStack.GetCurrentModelType(), expression, ExpressionScope.CurrentModelOnStack));
        }
Example #26
0
        public void Should_include_block_with_ifnull_if_value_null()
        {
            var input  = @"<html><head></head><body>@IfNull.Name;No users found@EndIf;</body></html>";
            var output = Parse(input, typeof(User));

            AssertSyntaxTree(
                output,
                SyntaxTree.WriteString("<html><head></head><body>"),
                SyntaxTree.Conditional(SyntaxTreeExpression.Property(typeof(User), "Name"),
                                       SyntaxTree.Block(),
                                       SyntaxTree.Block(SyntaxTree.WriteString("No users found"))
                                       ),
                SyntaxTree.WriteString("</body></html>")
                );
        }
Example #27
0
        public void Should_throw_with_empty_blocks(BlockNode emptyBlock)
        {
            var model    = new { X = true };
            var template = SyntaxTree.Block(
                SyntaxTree.Conditional(
                    SyntaxTreeExpression.Property(model.GetType(), "X"),
                    emptyBlock,
                    emptyBlock
                    ));

            Assert.Throws <VeilCompilerException>(() =>
            {
                this.ExecuteTemplate(template, model);
            });
        }
Example #28
0
        public void Should_support_this_inside_with_block()
        {
            var model    = new { User = "" };
            var template = Parse("Hello {{#with User}}{{this}}{{/with}}", model.GetType());

            AssertSyntaxTree(
                template,
                SyntaxTree.WriteString("Hello "),
                SyntaxTree.ScopeNode(
                    SyntaxTreeExpression.Property(model.GetType(), "User"),
                    SyntaxTree.Block(
                        SyntaxTree.WriteExpression(SyntaxTreeExpression.Self(model.User.GetType()), true)
                        )
                    )
                );
        }
Example #29
0
        public void Should_handle_conditional_on_dictionary_item <T>(T testModel, string expectedResult)
        {
            var model = new Dictionary <string, object>();

            model.Add("Bool", testModel.GetType().GetProperty("Condition").GetValue(testModel));
            var template = SyntaxTree.Block(
                SyntaxTree.Conditional(
                    SyntaxTreeExpression.LateBound("Bool"),
                    SyntaxTree.Block(SyntaxTree.WriteString("True")),
                    SyntaxTree.Block(SyntaxTree.WriteString("False"))
                    )
                );
            var result = ExecuteTemplate(template, model);

            Assert.Equal(expectedResult, result);
        }
Example #30
0
        public void Should_render_include_with_same_model()
        {
            var model = new { Name = "Joe" };

            RegisterTemplate("person", SyntaxTree.Block(
                                 SyntaxTree.WriteExpression(SyntaxTreeExpression.Property(model.GetType(), "Name"))
                                 ));
            var template = SyntaxTree.Block(
                SyntaxTree.WriteString("Hello "),
                SyntaxTree.Include("person", SyntaxTreeExpression.Self(model.GetType()))
                );

            var result = ExecuteTemplate(template, model);

            Assert.That(result, Is.EqualTo("Hello Joe"));
        }