Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
handlebars.js/spec/strict.js
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
164 lines (140 sloc)
5.13 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var Exception = Handlebars.Exception; | |
describe('strict', function () { | |
describe('strict mode', function () { | |
it('should error on missing property lookup', function () { | |
expectTemplate('{{hello}}') | |
.withCompileOptions({ strict: true }) | |
.toThrow(Exception, /"hello" not defined in/); | |
}); | |
it('should error on missing child', function () { | |
expectTemplate('{{hello.bar}}') | |
.withCompileOptions({ strict: true }) | |
.withInput({ hello: { bar: 'foo' } }) | |
.toCompileTo('foo'); | |
expectTemplate('{{hello.bar}}') | |
.withCompileOptions({ strict: true }) | |
.withInput({ hello: {} }) | |
.toThrow(Exception, /"bar" not defined in/); | |
}); | |
it('should handle explicit undefined', function () { | |
expectTemplate('{{hello.bar}}') | |
.withCompileOptions({ strict: true }) | |
.withInput({ hello: { bar: undefined } }) | |
.toCompileTo(''); | |
}); | |
it('should error on missing property lookup in known helpers mode', function () { | |
expectTemplate('{{hello}}') | |
.withCompileOptions({ | |
strict: true, | |
knownHelpersOnly: true, | |
}) | |
.toThrow(Exception, /"hello" not defined in/); | |
}); | |
it('should error on missing context', function () { | |
expectTemplate('{{hello}}') | |
.withCompileOptions({ strict: true }) | |
.toThrow(Error); | |
}); | |
it('should error on missing data lookup', function () { | |
var xt = expectTemplate('{{@hello}}').withCompileOptions({ | |
strict: true, | |
}); | |
xt.toThrow(Error); | |
xt.withRuntimeOptions({ data: { hello: 'foo' } }).toCompileTo('foo'); | |
}); | |
it('should not run helperMissing for helper calls', function () { | |
expectTemplate('{{hello foo}}') | |
.withCompileOptions({ strict: true }) | |
.withInput({ foo: true }) | |
.toThrow(Exception, /"hello" not defined in/); | |
expectTemplate('{{#hello foo}}{{/hello}}') | |
.withCompileOptions({ strict: true }) | |
.withInput({ foo: true }) | |
.toThrow(Exception, /"hello" not defined in/); | |
}); | |
it('should throw on ambiguous blocks', function () { | |
expectTemplate('{{#hello}}{{/hello}}') | |
.withCompileOptions({ strict: true }) | |
.toThrow(Exception, /"hello" not defined in/); | |
expectTemplate('{{^hello}}{{/hello}}') | |
.withCompileOptions({ strict: true }) | |
.toThrow(Exception, /"hello" not defined in/); | |
expectTemplate('{{#hello.bar}}{{/hello.bar}}') | |
.withCompileOptions({ strict: true }) | |
.withInput({ hello: {} }) | |
.toThrow(Exception, /"bar" not defined in/); | |
}); | |
it('should allow undefined parameters when passed to helpers', function () { | |
expectTemplate('{{#unless foo}}success{{/unless}}') | |
.withCompileOptions({ strict: true }) | |
.toCompileTo('success'); | |
}); | |
it('should allow undefined hash when passed to helpers', function () { | |
expectTemplate('{{helper value=@foo}}') | |
.withCompileOptions({ | |
strict: true, | |
}) | |
.withHelpers({ | |
helper: function (options) { | |
equals('value' in options.hash, true); | |
equals(options.hash.value, undefined); | |
return 'success'; | |
}, | |
}) | |
.toCompileTo('success'); | |
}); | |
it('should show error location on missing property lookup', function () { | |
expectTemplate('\n\n\n {{hello}}') | |
.withCompileOptions({ strict: true }) | |
.toThrow(Exception, '"hello" not defined in [object Object] - 4:5'); | |
}); | |
it('should error contains correct location properties on missing property lookup', function () { | |
try { | |
var template = CompilerContext.compile('\n\n\n {{hello}}', { | |
strict: true, | |
}); | |
template({}); | |
} catch (error) { | |
equals(error.lineNumber, 4); | |
equals(error.endLineNumber, 4); | |
equals(error.column, 5); | |
equals(error.endColumn, 10); | |
} | |
}); | |
}); | |
describe('assume objects', function () { | |
it('should ignore missing property', function () { | |
expectTemplate('{{hello}}') | |
.withCompileOptions({ assumeObjects: true }) | |
.toCompileTo(''); | |
}); | |
it('should ignore missing child', function () { | |
expectTemplate('{{hello.bar}}') | |
.withCompileOptions({ assumeObjects: true }) | |
.withInput({ hello: {} }) | |
.toCompileTo(''); | |
}); | |
it('should error on missing object', function () { | |
expectTemplate('{{hello.bar}}') | |
.withCompileOptions({ assumeObjects: true }) | |
.toThrow(Error); | |
}); | |
it('should error on missing context', function () { | |
expectTemplate('{{hello}}') | |
.withCompileOptions({ assumeObjects: true }) | |
.withInput(undefined) | |
.toThrow(Error); | |
}); | |
it('should error on missing data lookup', function () { | |
expectTemplate('{{@hello.bar}}') | |
.withCompileOptions({ assumeObjects: true }) | |
.withInput(undefined) | |
.toThrow(Error); | |
}); | |
it('should execute blockHelperMissing', function () { | |
expectTemplate('{{^hello}}foo{{/hello}}') | |
.withCompileOptions({ assumeObjects: true }) | |
.toCompileTo('foo'); | |
}); | |
}); | |
}); |