@@ -122,6 +122,16 @@ describe('builtin helpers', function() {
|
||||
equal(result, "0. goodbye! 0 1 2 After 0 1. Goodbye! 0 1 2 After 1 2. GOODBYE! 0 1 2 After 2 cruel world!", "The @index variable is used");
|
||||
});
|
||||
|
||||
it('each with block params', function() {
|
||||
var string = '{{#each goodbyes as |value index|}}{{index}}. {{value.text}}! {{#each ../goodbyes as |childValue childIndex|}} {{index}} {{childIndex}}{{/each}} After {{index}} {{/each}}{{index}}cruel {{world}}!';
|
||||
var hash = {goodbyes: [{text: 'goodbye'}, {text: 'Goodbye'}], world: 'world'};
|
||||
|
||||
var template = CompilerContext.compile(string);
|
||||
var result = template(hash);
|
||||
|
||||
equal(result, '0. goodbye! 0 0 0 1 After 0 1. Goodbye! 1 0 1 1 After 1 cruel world!');
|
||||
});
|
||||
|
||||
it("each object with @index", function() {
|
||||
var string = "{{#each goodbyes}}{{@index}}. {{text}}! {{/each}}cruel {{world}}!";
|
||||
var hash = {goodbyes: {'a': {text: "goodbye"}, b: {text: "Goodbye"}, c: {text: "GOODBYE"}}, world: "world"};
|
||||
|
||||
@@ -657,4 +657,64 @@ describe('helpers', function() {
|
||||
equals(result, "GOODBYE cruel WORLD goodbye", "Helper executed");
|
||||
});
|
||||
});
|
||||
|
||||
describe('block params', function() {
|
||||
it('should take presedence over context values', function() {
|
||||
var hash = {value: 'foo'};
|
||||
var helpers = {
|
||||
goodbyes: function(options) {
|
||||
equals(options.fn.blockParams, 1);
|
||||
return options.fn({value: 'bar'}, {blockParams: [1, 2]});
|
||||
}
|
||||
};
|
||||
shouldCompileTo('{{#goodbyes as |value|}}{{value}}{{/goodbyes}}{{value}}', [hash, helpers], '1foo');
|
||||
});
|
||||
it('should take presedence over helper values', function() {
|
||||
var hash = {};
|
||||
var helpers = {
|
||||
value: function() {
|
||||
return 'foo';
|
||||
},
|
||||
goodbyes: function(options) {
|
||||
equals(options.fn.blockParams, 1);
|
||||
return options.fn({}, {blockParams: [1, 2]});
|
||||
}
|
||||
};
|
||||
shouldCompileTo('{{#goodbyes as |value|}}{{value}}{{/goodbyes}}{{value}}', [hash, helpers], '1foo');
|
||||
});
|
||||
it('should not take presedence over pathed values', function() {
|
||||
var hash = {value: 'bar'};
|
||||
var helpers = {
|
||||
value: function() {
|
||||
return 'foo';
|
||||
},
|
||||
goodbyes: function(options) {
|
||||
equals(options.fn.blockParams, 1);
|
||||
return options.fn(this, {blockParams: [1, 2]});
|
||||
}
|
||||
};
|
||||
shouldCompileTo('{{#goodbyes as |value|}}{{./value}}{{/goodbyes}}{{value}}', [hash, helpers], 'barfoo');
|
||||
});
|
||||
it('should take presednece over parent block params', function() {
|
||||
var hash = {value: 'foo'},
|
||||
value = 1;
|
||||
var helpers = {
|
||||
goodbyes: function(options) {
|
||||
return options.fn({value: 'bar'}, {blockParams: options.fn.blockParams === 1 ? [value++, value++] : undefined});
|
||||
}
|
||||
};
|
||||
shouldCompileTo('{{#goodbyes as |value|}}{{#goodbyes}}{{value}}{{#goodbyes as |value|}}{{value}}{{/goodbyes}}{{/goodbyes}}{{/goodbyes}}{{value}}', [hash, helpers], '13foo');
|
||||
});
|
||||
|
||||
it('should allow block params on chained helpers', function() {
|
||||
var hash = {value: 'foo'};
|
||||
var helpers = {
|
||||
goodbyes: function(options) {
|
||||
equals(options.fn.blockParams, 1);
|
||||
return options.fn({value: 'bar'}, {blockParams: [1, 2]});
|
||||
}
|
||||
};
|
||||
shouldCompileTo('{{#if bar}}{{else goodbyes as |value|}}{{value}}{{/if}}{{value}}', [hash, helpers], '1foo');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
+11
-1
@@ -48,6 +48,16 @@ describe('runtime', function() {
|
||||
template._child(1);
|
||||
}, Error, 'must pass parent depths');
|
||||
});
|
||||
|
||||
it('should throw for block param methods without params', function() {
|
||||
shouldThrow(function() {
|
||||
var template = Handlebars.compile('{{#foo as |foo|}}{{foo}}{{/foo}}');
|
||||
// Calling twice to hit the non-compiled case.
|
||||
template._setup({});
|
||||
template._setup({});
|
||||
template._child(1);
|
||||
}, Error, 'must pass block params');
|
||||
});
|
||||
it('should expose child template', function() {
|
||||
var template = Handlebars.compile('{{#foo}}bar{{/foo}}');
|
||||
// Calling twice to hit the non-compiled case.
|
||||
@@ -57,7 +67,7 @@ describe('runtime', function() {
|
||||
it('should render depthed content', function() {
|
||||
var template = Handlebars.compile('{{#foo}}{{../bar}}{{/foo}}');
|
||||
// Calling twice to hit the non-compiled case.
|
||||
equal(template._child(1, undefined, [{bar: 'baz'}])(), 'baz');
|
||||
equal(template._child(1, undefined, [], [{bar: 'baz'}])(), 'baz');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -106,6 +106,27 @@ describe('track ids', function() {
|
||||
equals(template(context, {helpers: helpers}), 'HELP ME MY BOSS 1');
|
||||
});
|
||||
|
||||
it('should use block param paths', function() {
|
||||
var template = CompilerContext.compile('{{#doIt as |is|}}{{wycats is.a slave.driver is}}{{/doIt}}', {trackIds: true});
|
||||
|
||||
var helpers = {
|
||||
doIt: function(options) {
|
||||
var blockParams = [this.is];
|
||||
blockParams.path = ['zomg'];
|
||||
return options.fn(this, {blockParams: blockParams});
|
||||
},
|
||||
wycats: function(passiveVoice, noun, blah, options) {
|
||||
equal(options.ids[0], 'zomg.a');
|
||||
equal(options.ids[1], 'slave.driver');
|
||||
equal(options.ids[2], 'zomg');
|
||||
|
||||
return "HELP ME MY BOSS " + options.ids[0] + ':' + passiveVoice + ' ' + options.ids[1] + ':' + noun;
|
||||
}
|
||||
};
|
||||
|
||||
equals(template(context, {helpers: helpers}), 'HELP ME MY BOSS zomg.a:foo slave.driver:bar');
|
||||
});
|
||||
|
||||
describe('builtin helpers', function() {
|
||||
var helpers = {
|
||||
wycats: function(name, options) {
|
||||
@@ -129,6 +150,17 @@ describe('track ids', function() {
|
||||
|
||||
equals(template({array: [{name: 'foo'}, {name: 'bar'}]}, {helpers: helpers}), 'foo:.array..0\nbar:.array..1\n');
|
||||
});
|
||||
it('should handle block params', function() {
|
||||
var helpers = {
|
||||
wycats: function(name, options) {
|
||||
return name + ':' + options.ids[0] + '\n';
|
||||
}
|
||||
};
|
||||
|
||||
var template = CompilerContext.compile('{{#each array as |value|}}{{wycats value.name}}{{/each}}', {trackIds: true});
|
||||
|
||||
equals(template({array: [{name: 'foo'}, {name: 'bar'}]}, {helpers: helpers}), 'foo:array.0.name\nbar:array.1.name\n');
|
||||
});
|
||||
});
|
||||
describe('#with', function() {
|
||||
it('should track contextPath', function() {
|
||||
|
||||
Reference in New Issue
Block a user