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 + } + ); + } + ); }); };