diff --git a/spec/artifacts/known.helpers.handlebars b/spec/artifacts/known.helpers.handlebars
new file mode 100644
index 000000000..74ab9d47b
--- /dev/null
+++ b/spec/artifacts/known.helpers.handlebars
@@ -0,0 +1,6 @@
+{{#someHelper true}}
+
Some known helper
+ {{#anotherHelper true}}
+ Another known helper
+ {{/anotherHelper}}
+{{/someHelper}}
diff --git a/spec/expected/compiled.string.txt b/spec/expected/compiled.string.txt
new file mode 100644
index 000000000..8b1a14d8c
--- /dev/null
+++ b/spec/expected/compiled.string.txt
@@ -0,0 +1,3 @@
+{"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
+ return "Test String
";
+},"useData":true}
\ No newline at end of file
diff --git a/spec/expected/empty.amd.min.js b/spec/expected/empty.amd.min.js
new file mode 100644
index 000000000..8fc31a610
--- /dev/null
+++ b/spec/expected/empty.amd.min.js
@@ -0,0 +1 @@
+define(["handlebars.runtime"],function(e){var t=(e=e.default).template;return(e.templates=e.templates||{}).empty=t({compiler:[8,">= 4.3.0"],main:function(e,t,a,n,r){return""},useData:!0})});
\ No newline at end of file
diff --git a/spec/expected/empty.amd.namespace.js b/spec/expected/empty.amd.namespace.js
new file mode 100644
index 000000000..1972fb437
--- /dev/null
+++ b/spec/expected/empty.amd.namespace.js
@@ -0,0 +1,6 @@
+define(['handlebars.runtime'], function(Handlebars) {
+ Handlebars = Handlebars["default"]; var template = Handlebars.template, templates = CustomNamespace.templates = CustomNamespace.templates || {};
+return templates['empty'] = template({"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
+ return "";
+},"useData":true});
+});
diff --git a/spec/expected/empty.amd.simple.js b/spec/expected/empty.amd.simple.js
new file mode 100644
index 000000000..b4014bb83
--- /dev/null
+++ b/spec/expected/empty.amd.simple.js
@@ -0,0 +1,3 @@
+{"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
+ return "";
+},"useData":true}
\ No newline at end of file
diff --git a/spec/expected/help.menu.txt b/spec/expected/help.menu.txt
new file mode 100644
index 000000000..027bb73a7
--- /dev/null
+++ b/spec/expected/help.menu.txt
@@ -0,0 +1,25 @@
+Precompile handlebar templates.
+Usage: handlebars [template|directory]...
+
+Options:
+ --help Outputs this message [boolean]
+ -f, --output Output File [string]
+ --map Source Map File [string]
+ -a, --amd Exports amd style (require.js) [boolean]
+ -c, --commonjs Exports CommonJS style, path to Handlebars module [string] [default: null]
+ -h, --handlebarPath Path to handlebar.js (only valid for amd-style) [string] [default: ""]
+ -k, --known Known helpers [string]
+ -o, --knownOnly Known helpers only [boolean]
+ -m, --min Minimize output [boolean]
+ -n, --namespace Template namespace [string] [default: "Handlebars.templates"]
+ -s, --simple Output template function only. [boolean]
+ -N, --name Name of passed string templates. Optional if running in a simple mode. Required when operating on
+ multiple templates. [string]
+ -i, --string Generates a template from the passed CLI argument.
+ "-" is treated as a special value and causes stdin to be read for the template value. [string]
+ -r, --root Template root. Base value that will be stripped from template names. [string]
+ -p, --partial Compiling a partial template [boolean]
+ -d, --data Include data when compiling [boolean]
+ -e, --extension Template extension. [string] [default: "handlebars"]
+ -b, --bom Removes the BOM (Byte Order Mark) from the beginning of the templates. [boolean]
+ -v, --version Show version number [boolean]
\ No newline at end of file
diff --git a/spec/expected/non.empty.amd.known.helper.js b/spec/expected/non.empty.amd.known.helper.js
new file mode 100644
index 000000000..75c81cdce
--- /dev/null
+++ b/spec/expected/non.empty.amd.known.helper.js
@@ -0,0 +1,24 @@
+define(['handlebars.runtime'], function(Handlebars) {
+Handlebars = Handlebars["default"]; var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
+return templates['known.helpers'] = template({"1":function(container,depth0,helpers,partials,data) {
+var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) {
+if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
+return parent[propertyName];
+}
+return undefined
+};
+return " Some known helper
\n"
++ ((stack1 = lookupProperty(helpers,"anotherHelper").call(depth0 != null ? depth0 : (container.nullContext || {}),true,{"name":"anotherHelper","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":3,"column":4},"end":{"line":5,"column":22}}})) != null ? stack1 : "");
+},"2":function(container,depth0,helpers,partials,data) {
+return " Another known helper
\n";
+},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
+var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) {
+if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
+return parent[propertyName];
+}
+return undefined
+};
+return ((stack1 = lookupProperty(helpers,"someHelper").call(depth0 != null ? depth0 : (container.nullContext || {}),true,{"name":"someHelper","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":1,"column":0},"end":{"line":6,"column":15}}})) != null ? stack1 : "");
+},"useData":true});
+});
+
\ No newline at end of file
diff --git a/spec/expected/version.txt b/spec/expected/version.txt
new file mode 100644
index 000000000..4178d093f
--- /dev/null
+++ b/spec/expected/version.txt
@@ -0,0 +1 @@
+4.7.3
\ No newline at end of file
diff --git a/spec/precompiler.js b/spec/precompiler.js
index 2261023cc..e560dc6ff 100644
--- a/spec/precompiler.js
+++ b/spec/precompiler.js
@@ -317,7 +317,7 @@ describe('precompiler', function() {
Precompiler.loadTemplates(
{ files: [__dirname + '/artifacts'], extension: 'handlebars' },
function(err, opts) {
- equal(opts.templates.length, 3);
+ equal(opts.templates.length, 4);
equal(opts.templates[0].name, 'bom');
equal(opts.templates[1].name, 'empty');
equal(opts.templates[2].name, 'example_1');
diff --git a/tasks/test-bin.js b/tasks/test-bin.js
index 3a9c43095..762a544d3 100644
--- a/tasks/test-bin.js
+++ b/tasks/test-bin.js
@@ -7,22 +7,108 @@ const chai = require('chai');
chai.use(require('chai-diff'));
const expect = chai.expect;
-module.exports = function(grunt) {
- grunt.registerTask('test:bin', function() {
- const stdout = executeBinHandlebars(
+const testCases = [
+ {
+ binInputParameters: ['-a', 'spec/artifacts/empty.handlebars'],
+ outputLocation: 'stdout',
+ expectedOutputSpec: './spec/expected/empty.amd.js'
+ },
+ {
+ binInputParameters: [
'-a',
+ '-f',
+ 'TEST_OUTPUT',
'spec/artifacts/empty.handlebars'
- );
+ ],
+ outputLocation: 'TEST_OUTPUT',
+ expectedOutputSpec: './spec/expected/empty.amd.js'
+ },
+ {
+ binInputParameters: [
+ '-a',
+ '-n',
+ 'CustomNamespace.templates',
+ 'spec/artifacts/empty.handlebars'
+ ],
+ outputLocation: 'stdout',
+ expectedOutputSpec: './spec/expected/empty.amd.namespace.js'
+ },
+ {
+ binInputParameters: [
+ '-a',
+ '--namespace',
+ 'CustomNamespace.templates',
+ 'spec/artifacts/empty.handlebars'
+ ],
+ outputLocation: 'stdout',
+ expectedOutputSpec: './spec/expected/empty.amd.namespace.js'
+ },
+ {
+ binInputParameters: ['-a', '-s', 'spec/artifacts/empty.handlebars'],
+ outputLocation: 'stdout',
+ expectedOutputSpec: './spec/expected/empty.amd.simple.js'
+ },
+ {
+ binInputParameters: ['-a', '-m', 'spec/artifacts/empty.handlebars'],
+ outputLocation: 'stdout',
+ expectedOutputSpec: './spec/expected/empty.amd.min.js'
+ },
+ {
+ binInputParameters: [
+ 'spec/artifacts/known.helpers.handlebars',
+ '-a',
+ '-k',
+ 'someHelper',
+ '-k',
+ 'anotherHelper',
+ '-o'
+ ],
+ outputLocation: 'stdout',
+ expectedOutputSpec: './spec/expected/non.empty.amd.known.helper.js'
+ },
+ {
+ binInputParameters: ['--help'],
+ outputLocation: 'stdout',
+ expectedOutputSpec: './spec/expected/help.menu.txt'
+ },
+ {
+ binInputParameters: ['-v'],
+ outputLocation: 'stdout',
+ expectedOutputSpec: './spec/expected/version.txt'
+ },
+ {
+ binInputParameters: ['-i', 'Test String
'],
+ outputLocation: 'stdout',
+ expectedOutputSpec: './spec/expected/compiled.string.txt'
+ }
+];
- const expectedOutput = fs.readFileSync(
- './spec/expected/empty.amd.js',
- 'utf-8'
- );
+module.exports = function(grunt) {
+ grunt.registerTask('test:bin', function() {
+ testCases.forEach(
+ ({ binInputParameters, outputLocation, expectedOutputSpec }) => {
+ const stdout = executeBinHandlebars(...binInputParameters);
- const normalizedOutput = normalizeCrlf(stdout);
- const normalizedExpectedOutput = normalizeCrlf(expectedOutput);
+ const expectedOutput = fs.readFileSync(expectedOutputSpec, 'utf-8');
- expect(normalizedOutput).not.to.be.differentFrom(normalizedExpectedOutput);
+ const useStdout = outputLocation === 'stdout';
+ const normalizedOutput = normalizeCrlf(
+ useStdout ? stdout : fs.readFileSync(outputLocation, 'utf-8')
+ );
+ const normalizedExpectedOutput = normalizeCrlf(expectedOutput);
+
+ if (!useStdout) {
+ fs.unlinkSync(outputLocation);
+ }
+
+ expect(normalizedOutput).not.to.be.differentFrom(
+ normalizedExpectedOutput,
+ {
+ relaxedSpace: true
+ }
+ );
+ }
+ );
});
};