diff --git a/.gitignore b/.gitignore index 9dcf445..b77d1e3 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ yui3 qooxdoo.mustache.js npm-debug.log + +test/render-test-browser.js \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 2101ff2..caf1487 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,13 @@ node_js: - 0.12 before_install: - "test $TRAVIS_NODE_VERSION = '0.6' && npm install -g npm@1.3.26 || npm install -g npm" +script: + - npm test + - npm run test-browser matrix: allow_failures: - node_js: 0.11 +env: + global: + - secure: TKDF1BgAR3S1bqFvikN6O3nbcLk20PDkL6QUVS6IkqQNtL1wXK4+2+GKcvJzOjCZg4OnXAFFtF/rfh9bcNlrGtWCG9CFkuGjUM7iONSQJr0kvCn7jris2jGGBupoPkX7MKlxaqrg6bmbp1QgA42/Hu4AlsNPCBiuFjpvL67VSqg= + - secure: sOyIxcOBaiFFUoL0+NcHPRVZm2LnG8u6qOzkrr4gSHil/qd8t91KOdJYVkZHWanI3R+T9sv8yDeZGTBz3QS993Wp0S0D3BjB2LKu8e7QFlMIms8dBQD6IR868qF6H22Qyaz5SNVwPuWVsEs8p92dc2C2xw9AvGSP3kpNe8aMjCA= diff --git a/.zuul.yml b/.zuul.yml new file mode 100644 index 0000000..4f27cc0 --- /dev/null +++ b/.zuul.yml @@ -0,0 +1,16 @@ +ui: mocha-bdd +browsers: + - name: chrome + version: latest + - name: firefox + version: latest + - name: safari + version: 6..latest + - name: opera + version: 11..latest + - name: ie + version: 8..latest + - name: iphone + version: 6.0..latest + - name: android + version: 4.0..latest \ No newline at end of file diff --git a/README.md b/README.md index 1d3911d..e21767c 100644 --- a/README.md +++ b/README.md @@ -522,6 +522,14 @@ Then, you can run the test with: $ TEST=mytest npm run test-render +### Browser tests + +Browser tests are not included in `npm test` as they run for too long, although they are runned automatically on Travis upon commit. Run browser tests locally in any browser: + + $ npm run test-browser-local + +then point your browser to `http://localhost:8080/__zuul` + ### Troubleshooting #### npm install fails diff --git a/package.json b/package.json index 11c742b..bcb5cf2 100644 --- a/package.json +++ b/package.json @@ -32,12 +32,16 @@ }, "scripts": { "pretest": "eslint mustache.js", - "test": "mocha --reporter spec", - "test-render": "mocha --reporter spec test/render-test" + "test": "mocha --reporter spec test/*-test.js", + "test-render": "mocha --reporter spec test/render-test", + "pre-test-browser": "node test/create-browser-suite.js", + "test-browser": "npm run pre-test-browser && zuul -- test/context-test.js test/parse-test.js test/scanner-test.js test/render-test-browser.js", + "test-browser-local": "npm run pre-test-browser && zuul --local 8080 -- test/context-test.js test/scanner-test.js test/parse-test.js test/render-test-browser.js" }, "devDependencies": { "eslint": "^0.20.0", - "mocha": "~2.1.0" + "mocha": "~2.1.0", + "zuul": "^2.1.1" }, "spm": { "main": "mustache.js", diff --git a/test/create-browser-suite.js b/test/create-browser-suite.js new file mode 100644 index 0000000..0f23da6 --- /dev/null +++ b/test/create-browser-suite.js @@ -0,0 +1,14 @@ +require('./helper'); + +var renderHelper = require('./render-helper'); + +var fs = require('fs'); +var path = require('path'); + +var _testsTemplate = path.join(__dirname, 'render-test-browser-tmpl.mustache'); +var _templateContent = fs.readFileSync(_testsTemplate).toString(); + +var tests = renderHelper.getTests(); +var content = Mustache.render(_templateContent, JSON.stringify(tests)); + +fs.writeFileSync(path.join(__dirname, 'render-test-browser.js'), content); \ No newline at end of file diff --git a/test/render-helper.js b/test/render-helper.js new file mode 100644 index 0000000..aa39951 --- /dev/null +++ b/test/render-helper.js @@ -0,0 +1,55 @@ +var fs = require('fs'); +var path = require('path'); + +var _files = path.join(__dirname, '_files'); + +function getContents(testName, ext) { + try { + return fs.readFileSync(path.join(_files, testName + '.' + ext), 'utf8'); + } catch (ex) { + return null; + } +} + +function getView(testName) { + var view = getContents(testName, 'js'); + if (!view) throw new Error('Cannot find view for test "' + testName + '"'); + return view; +} + +function getPartial(testName) { + try { + return getContents(testName, 'partial'); + } catch (error) { + // No big deal. Not all tests need to test partial support. + } +} + +// You can put the name of a specific test to run in the TEST environment +// variable (e.g. TEST=backslashes vows test/render-test.js) +var testToRun = process.env.TEST; + +var testNames; +if (testToRun) { + testNames = [testToRun]; +} else { + testNames = fs.readdirSync(_files).filter(function (file) { + return (/\.js$/).test(file); + }).map(function (file) { + return path.basename(file).replace(/\.js$/, ''); + }); +} + +function getTest(testName) { + return { + name: testName, + view: getView(testName), + template: getContents(testName, 'mustache'), + partial: getPartial(testName), + expect: getContents(testName, 'txt') + }; +} + +exports.getTests = function getTests() { + return testNames.map(getTest); +}; \ No newline at end of file diff --git a/test/render-test-browser-tmpl.mustache b/test/render-test-browser-tmpl.mustache new file mode 100644 index 0000000..2f2917c --- /dev/null +++ b/test/render-test-browser-tmpl.mustache @@ -0,0 +1,30 @@ +require('./helper'); + +describe('Mustache.render', function () { + beforeEach(function () { + Mustache.clearCache(); + }); + + var i; + var tests = {{{.}}}; + + for (i = 0; i < tests.length; i++) { + + (function indexClosure(test) { + var view = eval(test.view); + + it('knows how to render ' + test.name, function () { + + var output; + if (test.partial) { + output = Mustache.render(test.template, view, { partial: test.partial }); + } else { + output = Mustache.render(test.template, view); + } + + assert.equal(output, test.expect); + }); + })(tests[i]); + + } +}); \ No newline at end of file diff --git a/test/render-test.js b/test/render-test.js index 6aec0cf..c4f2779 100644 --- a/test/render-test.js +++ b/test/render-test.js @@ -1,72 +1,27 @@ require('./helper'); -var fs = require('fs'); -var path = require('path'); -var _files = path.join(__dirname, '_files'); +var renderHelper = require('./render-helper'); -function getContents(testName, ext) { - try { - return fs.readFileSync(path.join(_files, testName + '.' + ext), 'utf8'); - } catch (ex) { - return null; - } -} - -function getView(testName) { - var view = getContents(testName, 'js'); - if (!view) throw new Error('Cannot find view for test "' + testName + '"'); - return eval(view); -} - -function getPartial(testName) { - try { - return getContents(testName, 'partial'); - } catch (error) { - // No big deal. Not all tests need to test partial support. - } -} - -function getTest(testName) { - var test = {}; - test.view = getView(testName); - test.template = getContents(testName, 'mustache'); - test.partial = getPartial(testName); - test.expect = getContents(testName, 'txt'); - return test; -} - -// You can put the name of a specific test to run in the TEST environment -// variable (e.g. TEST=backslashes vows test/render-test.js) -var testToRun = process.env.TEST; - -var testNames; -if (testToRun) { - testNames = [testToRun]; -} else { - testNames = fs.readdirSync(_files).filter(function (file) { - return (/\.js$/).test(file); - }).map(function (file) { - return path.basename(file).replace(/\.js$/, ''); - }); -} +var tests = renderHelper.getTests(); describe('Mustache.render', function () { beforeEach(function () { Mustache.clearCache(); }); - testNames.forEach(function (testName) { - var test = getTest(testName); + tests.forEach(function (test) { + var view = eval(test.view); - it('knows how to render ' + testName, function () { + it('knows how to render ' + test.name, function () { var output; if (test.partial) { - output = Mustache.render(test.template, test.view, { partial: test.partial }); + output = Mustache.render(test.template, view, { partial: test.partial }); } else { - output = Mustache.render(test.template, test.view); + output = Mustache.render(test.template, view); } assert.equal(output, test.expect); }); + }); });