93516a0b07
- the goal is to get overall cleaner test. - chai and sinon are standard libraries for testing assertions and spies. We should not use custom ones.
166 lines
5.0 KiB
JavaScript
166 lines
5.0 KiB
JavaScript
var global = (function() {
|
|
return this;
|
|
}());
|
|
|
|
var AssertError;
|
|
if (Error.captureStackTrace) {
|
|
AssertError = function AssertError(message, caller) {
|
|
Error.prototype.constructor.call(this, message);
|
|
this.message = message;
|
|
|
|
if (Error.captureStackTrace) {
|
|
Error.captureStackTrace(this, caller || AssertError);
|
|
}
|
|
};
|
|
|
|
AssertError.prototype = new Error();
|
|
} else {
|
|
AssertError = Error;
|
|
}
|
|
|
|
/**
|
|
* @deprecated Use "expectTemplate(template)...toCompileTo(output)" instead
|
|
*/
|
|
global.shouldCompileTo = function(string, hashOrArray, expected, message) {
|
|
shouldCompileToWithPartials(string, hashOrArray, false, expected, message);
|
|
};
|
|
|
|
/**
|
|
* @deprecated Use "expectTemplate(template)...toCompileTo(output)" instead
|
|
*/
|
|
global.shouldCompileToWithPartials = function shouldCompileToWithPartials(string, hashOrArray, partials, expected, message) {
|
|
var result = compileWithPartials(string, hashOrArray, partials);
|
|
if (result !== expected) {
|
|
throw new AssertError("'" + result + "' should === '" + expected + "': " + message, shouldCompileToWithPartials);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* @deprecated Use "expectTemplate(template)...toCompileTo(output)" instead
|
|
*/
|
|
global.compileWithPartials = function(string, hashOrArray, partials) {
|
|
var template,
|
|
ary,
|
|
options;
|
|
if (hashOrArray && hashOrArray.hash) {
|
|
ary = [hashOrArray.hash, hashOrArray];
|
|
delete hashOrArray.hash;
|
|
} else if (Object.prototype.toString.call(hashOrArray) === '[object Array]') {
|
|
ary = [];
|
|
ary.push(hashOrArray[0]); // input
|
|
ary.push({helpers: hashOrArray[1], partials: hashOrArray[2]});
|
|
options = typeof hashOrArray[3] === 'object' ? hashOrArray[3] : {compat: hashOrArray[3]};
|
|
if (hashOrArray[4] != null) {
|
|
options.data = !!hashOrArray[4];
|
|
ary[1].data = hashOrArray[4];
|
|
}
|
|
} else {
|
|
ary = [hashOrArray];
|
|
}
|
|
|
|
template = CompilerContext[partials ? 'compileWithPartial' : 'compile'](string, options);
|
|
return template.apply(this, ary);
|
|
};
|
|
|
|
|
|
/**
|
|
* @deprecated Use chai's expect-style API instead (`expect(actualValue).to.equal(expectedValue)`)
|
|
* @see https://www.chaijs.com/api/bdd/
|
|
*/
|
|
global.equals = global.equal = function equals(a, b, msg) {
|
|
if (a !== b) {
|
|
throw new AssertError("'" + a + "' should === '" + b + "'" + (msg ? ': ' + msg : ''), equals);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* @deprecated Use chai's expect-style API instead (`expect(actualValue).to.equal(expectedValue)`)
|
|
* @see https://www.chaijs.com/api/bdd/#method_throw
|
|
*/
|
|
global.shouldThrow = function(callback, type, msg) {
|
|
var failed;
|
|
try {
|
|
callback();
|
|
failed = true;
|
|
} catch (caught) {
|
|
if (type && !(caught instanceof type)) {
|
|
throw new AssertError('Type failure: ' + caught);
|
|
}
|
|
if (msg && !(msg.test ? msg.test(caught.message) : msg === caught.message)) {
|
|
throw new AssertError('Throw mismatch: Expected ' + caught.message + ' to match ' + msg + '\n\n' + caught.stack, shouldThrow);
|
|
}
|
|
}
|
|
if (failed) {
|
|
throw new AssertError('It failed to throw', shouldThrow);
|
|
}
|
|
};
|
|
|
|
|
|
global.expectTemplate = function(templateAsString) {
|
|
return new HandlebarsTestBench(templateAsString);
|
|
};
|
|
|
|
|
|
function HandlebarsTestBench(templateAsString) {
|
|
this.templateAsString = templateAsString;
|
|
this.helpers = {};
|
|
this.partials = {};
|
|
this.input = {};
|
|
this.message = 'Template' + templateAsString + ' does not evaluate to expected output';
|
|
this.compileOptions = {};
|
|
this.runtimeOptions = {};
|
|
}
|
|
|
|
HandlebarsTestBench.prototype.withInput = function(input) {
|
|
this.input = input;
|
|
return this;
|
|
};
|
|
|
|
HandlebarsTestBench.prototype.withHelper = function(name, helperFunction) {
|
|
this.helpers[name] = helperFunction;
|
|
return this;
|
|
};
|
|
|
|
HandlebarsTestBench.prototype.withPartial = function(name, partialAsString) {
|
|
this.partials[name] = partialAsString;
|
|
return this;
|
|
};
|
|
|
|
HandlebarsTestBench.prototype.withCompileOptions = function(compileOptions) {
|
|
this.compileOptions = compileOptions;
|
|
return this;
|
|
};
|
|
|
|
HandlebarsTestBench.prototype.withRuntimeOptions = function(runtimeOptions) {
|
|
this.runtimeOptions = runtimeOptions;
|
|
return this;
|
|
};
|
|
|
|
HandlebarsTestBench.prototype.withMessage = function(message) {
|
|
this.message = message;
|
|
return this;
|
|
};
|
|
|
|
HandlebarsTestBench.prototype.toCompileTo = function(expectedOutputAsString) {
|
|
var self = this;
|
|
var compile = Object.keys(this.partials).length > 0
|
|
? CompilerContext.compileWithPartial
|
|
: CompilerContext.compile;
|
|
|
|
var combinedRuntimeOptions = {};
|
|
Object.keys(this.runtimeOptions).forEach(function(key) {
|
|
combinedRuntimeOptions[key] = self.runtimeOptions[key];
|
|
});
|
|
combinedRuntimeOptions.helpers = this.helpers;
|
|
combinedRuntimeOptions.partials = this.partials;
|
|
|
|
var template = compile(this.templateAsString, this.compileOptions);
|
|
var output = template(this.input, combinedRuntimeOptions);
|
|
|
|
if (output !== expectedOutputAsString) {
|
|
// Error message formatted so that IntelliJ-Idea shows "diff"-button
|
|
// https://stackoverflow.com/a/10945655/4251384
|
|
throw new AssertError(this.message + '\nexpected:' + expectedOutputAsString + 'but was:' + output);
|
|
}
|
|
};
|