diff options
Diffstat (limited to 'spec/ast.js')
-rw-r--r-- | spec/ast.js | 166 |
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); + }); + }); + }); }); |