a023cb4dd9
Fixes #1284
Appearently, there is a use-case of stringifying the error in order to
evaluated its properties on another system. There was a regression
from 4.0.5 to 4.0.6 that the column-property of compilation errors
was not enumerable anymore in 4.0.6 (due to commit 20c965c) and
thus was not included in the output of "JSON.stringify".
100 lines
4.2 KiB
JavaScript
100 lines
4.2 KiB
JavaScript
describe('compiler', function() {
|
|
if (!Handlebars.compile) {
|
|
return;
|
|
}
|
|
|
|
describe('#equals', function() {
|
|
function compile(string) {
|
|
var ast = Handlebars.parse(string);
|
|
return new Handlebars.Compiler().compile(ast, {});
|
|
}
|
|
|
|
it('should treat as equal', function() {
|
|
equal(compile('foo').equals(compile('foo')), true);
|
|
equal(compile('{{foo}}').equals(compile('{{foo}}')), true);
|
|
equal(compile('{{foo.bar}}').equals(compile('{{foo.bar}}')), true);
|
|
equal(compile('{{foo.bar baz "foo" true false bat=1}}').equals(compile('{{foo.bar baz "foo" true false bat=1}}')), true);
|
|
equal(compile('{{foo.bar (baz bat=1)}}').equals(compile('{{foo.bar (baz bat=1)}}')), true);
|
|
equal(compile('{{#foo}} {{/foo}}').equals(compile('{{#foo}} {{/foo}}')), true);
|
|
});
|
|
it('should treat as not equal', function() {
|
|
equal(compile('foo').equals(compile('bar')), false);
|
|
equal(compile('{{foo}}').equals(compile('{{bar}}')), false);
|
|
equal(compile('{{foo.bar}}').equals(compile('{{bar.bar}}')), false);
|
|
equal(compile('{{foo.bar baz bat=1}}').equals(compile('{{foo.bar bar bat=1}}')), false);
|
|
equal(compile('{{foo.bar (baz bat=1)}}').equals(compile('{{foo.bar (bar bat=1)}}')), false);
|
|
equal(compile('{{#foo}} {{/foo}}').equals(compile('{{#bar}} {{/bar}}')), false);
|
|
equal(compile('{{#foo}} {{/foo}}').equals(compile('{{#foo}} {{foo}}{{/foo}}')), false);
|
|
});
|
|
});
|
|
|
|
describe('#compile', function() {
|
|
it('should fail with invalid input', function() {
|
|
shouldThrow(function() {
|
|
Handlebars.compile(null);
|
|
}, Error, 'You must pass a string or Handlebars AST to Handlebars.compile. You passed null');
|
|
shouldThrow(function() {
|
|
Handlebars.compile({});
|
|
}, Error, 'You must pass a string or Handlebars AST to Handlebars.compile. You passed [object Object]');
|
|
});
|
|
|
|
it('should include the location in the error (row and column)', function() {
|
|
try {
|
|
Handlebars.compile(' \n {{#if}}\n{{/def}}')();
|
|
equal(true, false, 'Statement must throw exception. This line should not be executed.');
|
|
} catch (err) {
|
|
equal(err.message, 'if doesn\'t match def - 2:5', 'Checking error message');
|
|
if (Object.getOwnPropertyDescriptor(err, 'column').writable) {
|
|
// In Safari 8, the column-property is read-only. This means that even if it is set with defineProperty,
|
|
// its value won't change (https://github.com/jquery/esprima/issues/1290#issuecomment-132455482)
|
|
// Since this was neither working in Handlebars 3 nor in 4.0.5, we only check the column for other browsers.
|
|
equal(err.column, 5, 'Checking error column');
|
|
}
|
|
equal(err.lineNumber, 2, 'Checking error row');
|
|
}
|
|
});
|
|
|
|
it('should include the location as enumerable property', function() {
|
|
try {
|
|
Handlebars.compile(' \n {{#if}}\n{{/def}}')();
|
|
equal(true, false, 'Statement must throw exception. This line should not be executed.');
|
|
} catch (err) {
|
|
equal(err.propertyIsEnumerable('column'), true, 'Checking error column');
|
|
}
|
|
});
|
|
|
|
it('can utilize AST instance', function() {
|
|
equal(Handlebars.compile({
|
|
type: 'Program',
|
|
body: [ {type: 'ContentStatement', value: 'Hello'}]
|
|
})(), 'Hello');
|
|
});
|
|
|
|
it('can pass through an empty string', function() {
|
|
equal(Handlebars.compile('')(), '');
|
|
});
|
|
});
|
|
|
|
describe('#precompile', function() {
|
|
it('should fail with invalid input', function() {
|
|
shouldThrow(function() {
|
|
Handlebars.precompile(null);
|
|
}, Error, 'You must pass a string or Handlebars AST to Handlebars.precompile. You passed null');
|
|
shouldThrow(function() {
|
|
Handlebars.precompile({});
|
|
}, Error, 'You must pass a string or Handlebars AST to Handlebars.precompile. You passed [object Object]');
|
|
});
|
|
|
|
it('can utilize AST instance', function() {
|
|
equal(/return "Hello"/.test(Handlebars.precompile({
|
|
type: 'Program',
|
|
body: [ {type: 'ContentStatement', value: 'Hello'}]
|
|
})), true);
|
|
});
|
|
|
|
it('can pass through an empty string', function() {
|
|
equal(/return ""/.test(Handlebars.precompile('')), true);
|
|
});
|
|
});
|
|
});
|