summaryrefslogtreecommitdiffstats
path: root/spec/ast.js
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ast.js')
-rw-r--r--spec/ast.js166
1 files changed, 157 insertions, 9 deletions
diff --git a/spec/ast.js b/spec/ast.js
index 17a982c..316d4a3 100644
--- a/spec/ast.js
+++ b/spec/ast.js
@@ -86,7 +86,7 @@ describe('ast', function() {
var sexprNode = new handlebarsEnv.AST.SexprNode([{ original: 'foo'}], null);
var mustacheNode = new handlebarsEnv.AST.MustacheNode(sexprNode, null, '{{', {});
var block = new handlebarsEnv.AST.BlockNode(mustacheNode,
- {strip: {}}, {strip: {}},
+ {statements: [], strip: {}}, {statements: [], strip: {}},
{
strip: {},
path: {original: 'foo'}
@@ -201,12 +201,12 @@ describe('ast', function() {
describe("storing location info", function(){
it("stores when `inverse` argument isn't passed", function(){
- var pn = new handlebarsEnv.AST.ProgramNode([], LOCATION_INFO);
+ var pn = new handlebarsEnv.AST.ProgramNode(false, [], LOCATION_INFO);
testLocationInfoStorage(pn);
});
it("stores when `inverse` or `stripInverse` arguments passed", function(){
- var pn = new handlebarsEnv.AST.ProgramNode([], {strip: {}}, undefined, LOCATION_INFO);
+ var pn = new handlebarsEnv.AST.ProgramNode(false, [], {strip: {}}, undefined, LOCATION_INFO);
testLocationInfoStorage(pn);
var clone = {
@@ -216,7 +216,7 @@ describe('ast', function() {
firstColumn: 0,
lastColumn: 0
};
- pn = new handlebarsEnv.AST.ProgramNode([], {strip: {}}, [ clone ], LOCATION_INFO);
+ pn = new handlebarsEnv.AST.ProgramNode(false, [], {strip: {}}, [ clone ], LOCATION_INFO);
testLocationInfoStorage(pn);
// Assert that the newly created ProgramNode has the same location
@@ -251,26 +251,174 @@ describe('ast', function() {
});
it('gets line numbers correct when newlines appear', function(){
- var secondContentNode = statements[2];
- testColumns(secondContentNode, 1, 2, 21, 8);
+ testColumns(statements[2], 1, 2, 21, 0);
+ testColumns(statements[3], 2, 2, 0, 8);
});
it('gets MustacheNode line numbers correct across newlines', function(){
- var secondMustacheNode = statements[3];
+ var secondMustacheNode = statements[4];
testColumns(secondMustacheNode, 2, 2, 8, 22);
});
it('gets the block helper information correct', function(){
- var blockHelperNode = statements[5];
+ var blockHelperNode = statements[7];
testColumns(blockHelperNode, 3, 7, 8, 23);
});
it('correctly records the line numbers of an inverse of a block helper', function(){
- var blockHelperNode = statements[5],
+ var blockHelperNode = statements[7],
inverse = blockHelperNode.inverse;
testColumns(inverse, 5, 6, 13, 0);
});
});
+
+ describe('standalone flags', function(){
+ describe('mustache', function() {
+ it('does not mark mustaches as standalone', function() {
+ var ast = Handlebars.parse(' {{comment}} ');
+ equals(ast.statements[0].omit, undefined);
+ equals(ast.statements[2].omit, undefined);
+ });
+ });
+ describe('blocks', function() {
+ it('marks block mustaches as standalone', function() {
+ var ast = Handlebars.parse(' {{# comment}} \nfoo\n {{else}} \n bar \n {{/comment}} '),
+ block = ast.statements[1];
+
+ equals(ast.statements[0].omit, true);
+
+ equals(block.program.statements[0].omit, true);
+ equals(block.program.statements[1].string, 'foo\n');
+ equals(block.program.statements[2].omit, true);
+
+ equals(block.inverse.statements[0].omit, true);
+ equals(block.inverse.statements[1].string, ' bar \n');
+ equals(block.inverse.statements[2].omit, true);
+
+ equals(ast.statements[2].omit, true);
+ });
+ it('marks initial block mustaches as standalone', function() {
+ var ast = Handlebars.parse('{{# comment}} \nfoo\n {{/comment}}'),
+ block = ast.statements[0];
+
+ equals(block.program.statements[0].omit, true);
+ equals(block.program.statements[1].string, 'foo\n');
+ equals(block.program.statements[2].omit, true);
+ });
+ it('marks mustaches with children as standalone', function() {
+ var ast = Handlebars.parse('{{# comment}} \n{{foo}}\n {{/comment}}'),
+ block = ast.statements[0];
+
+ equals(block.program.statements[0].omit, true);
+ equals(block.program.statements[1].id.original, 'foo');
+ equals(block.program.statements[2].omit, undefined);
+ equals(block.program.statements[3].omit, true);
+ });
+ it('marks nested block mustaches as standalone', function() {
+ var ast = Handlebars.parse('{{#foo}} \n{{# comment}} \nfoo\n {{else}} \n bar \n {{/comment}} \n{{/foo}}'),
+ statements = ast.statements[0].program.statements,
+ block = statements[1];
+
+ equals(statements[0].omit, true);
+
+ equals(block.program.statements[0].omit, true);
+ equals(block.program.statements[1].string, 'foo\n');
+ equals(block.program.statements[2].omit, true);
+
+ equals(block.inverse.statements[0].omit, true);
+ equals(block.inverse.statements[1].string, ' bar \n');
+ equals(block.inverse.statements[2].omit, true);
+
+ equals(statements[0].omit, true);
+ });
+ it('does not mark nested block mustaches as standalone', function() {
+ var ast = Handlebars.parse('{{#foo}} {{# comment}} \nfoo\n {{else}} \n bar \n {{/comment}} {{/foo}}'),
+ statements = ast.statements[0].program.statements,
+ block = statements[1];
+
+ equals(statements[0].omit, undefined);
+
+ equals(block.program.statements[0].omit, undefined);
+ equals(block.program.statements[1].string, 'foo\n');
+ equals(block.program.statements[2].omit, true);
+
+ equals(block.inverse.statements[0].omit, true);
+ equals(block.inverse.statements[1].string, ' bar \n');
+ equals(block.inverse.statements[2].omit, undefined);
+
+ equals(statements[0].omit, undefined);
+ });
+ it('does not mark nested initial block mustaches as standalone', function() {
+ var ast = Handlebars.parse('{{#foo}}{{# comment}} \nfoo\n {{else}} \n bar \n {{/comment}}{{/foo}}'),
+ statements = ast.statements[0].program.statements,
+ block = statements[0];
+
+ equals(block.program.statements[0].omit, undefined);
+ equals(block.program.statements[1].string, 'foo\n');
+ equals(block.program.statements[2].omit, true);
+
+ equals(block.inverse.statements[0].omit, true);
+ equals(block.inverse.statements[1].string, ' bar \n');
+ equals(block.inverse.statements[2].omit, undefined);
+
+ equals(statements[0].omit, undefined);
+ });
+
+ it('marks column 0 block mustaches as standalone', function() {
+ var ast = Handlebars.parse('test\n{{# comment}} \nfoo\n {{else}} \n bar \n {{/comment}} '),
+ block = ast.statements[1];
+
+ equals(ast.statements[0].omit, undefined);
+
+ equals(block.program.statements[0].omit, true);
+ equals(block.program.statements[1].string, 'foo\n');
+ equals(block.program.statements[2].omit, true);
+
+ equals(block.inverse.statements[0].omit, true);
+ equals(block.inverse.statements[1].string, ' bar \n');
+ equals(block.inverse.statements[2].omit, true);
+
+ equals(ast.statements[2].omit, true);
+ });
+ });
+ describe('partials', function() {
+ it('marks partial as standalone', function() {
+ var ast = Handlebars.parse('{{> partial }} ');
+ equals(ast.statements[1].omit, true);
+ });
+ it('marks indented partial as standalone', function() {
+ var ast = Handlebars.parse(' {{> partial }} ');
+ equals(ast.statements[0].omit, true);
+ equals(ast.statements[1].indent, ' ');
+ equals(ast.statements[2].omit, true);
+ });
+ it('marks those around content as not standalone', function() {
+ var ast = Handlebars.parse('a{{> partial }}');
+ equals(ast.statements[0].omit, undefined);
+
+ ast = Handlebars.parse('{{> partial }}a');
+ equals(ast.statements[1].omit, undefined);
+ });
+ });
+ describe('comments', function() {
+ it('marks comment as standalone', function() {
+ var ast = Handlebars.parse('{{! comment }} ');
+ equals(ast.statements[1].omit, true);
+ });
+ it('marks indented comment as standalone', function() {
+ var ast = Handlebars.parse(' {{! comment }} ');
+ equals(ast.statements[0].omit, true);
+ equals(ast.statements[2].omit, true);
+ });
+ it('marks those around content as not standalone', function() {
+ var ast = Handlebars.parse('a{{! comment }}');
+ equals(ast.statements[0].omit, undefined);
+
+ ast = Handlebars.parse('{{! comment }}a');
+ equals(ast.statements[1].omit, undefined);
+ });
+ });
+ });
});