From ba4dcd8e0a0458c1969d4ec7e3965d37d74f1958 Mon Sep 17 00:00:00 2001 From: Vladimir Kotikov Date: Wed, 29 Jul 2015 10:49:56 +0300 Subject: [PATCH 1/4] Enables/fixes browser-based tests Also enables both browser and JSDom tests for browserify flow. --- Gruntfile.js | 8 +++++--- package.json | 3 ++- tasks/lib/test-browser.js | 19 +++++++++++-------- tasks/lib/test-jsdom.js | 2 ++ tasks/templates/suite.html | 6 +----- test/ios/test.exec.js | 11 +++++++++-- 6 files changed, 30 insertions(+), 19 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 68f70b08e..3d4ede437 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -40,7 +40,7 @@ module.exports = function(grunt) { "blackberry10": {}, "ios": {}, "osx": {}, - //"test": {}, + "test": {}, "windows": { useWindowsLineEndings: true }, "wp8": { useWindowsLineEndings: true }, "firefoxos": {}, @@ -67,7 +67,9 @@ module.exports = function(grunt) { // defaults grunt.registerTask('default', ['build', 'test']); grunt.registerTask('build', ['compile', 'jshint', 'whitespace-check']); - grunt.registerTask('test', ['compile', 'jshint', '_test']); - grunt.registerTask('btest', ['compile', '_btest']); + grunt.registerTask('test', ['compile:test', 'jshint', '_test']); + grunt.registerTask('btest', ['compile:test', 'jshint', '_btest']); grunt.registerTask('cover', ['compile', '_cover']); + grunt.registerTask('test-browserify', ['compile-browserify:test', 'jshint', '_test']); + grunt.registerTask('btest-browserify', ['compile-browserify:test', 'jshint', '_btest']); }; diff --git a/package.json b/package.json index 763a33aa6..664141076 100644 --- a/package.json +++ b/package.json @@ -66,8 +66,9 @@ "grunt-contrib-jshint": "0.10.0", "istanbul": "^0.3.4", "jasmine-node": "1.14.5", - "node-jsdom": "~3.x", "mkdirp": "^0.5.0", + "node-jsdom": "~3.x", + "open": "0.0.5", "grunt-cli": "0.1.13" }, "dependencies": { diff --git a/tasks/lib/test-browser.js b/tasks/lib/test-browser.js index 01356a8f9..0ea4fe33a 100644 --- a/tasks/lib/test-browser.js +++ b/tasks/lib/test-browser.js @@ -23,9 +23,12 @@ var fs = require('fs'); var path = require('path'); var connect = require('connect'); -var exec = require('child_process').exec; var bundle = require('./bundle'); var collect = require('./collect'); +var start = require('open'); + +var testLibName = path.join(__dirname, '..', '..', 'pkg', 'cordova.test.js'); +var testLib = fs.readFileSync(testLibName, 'utf8'); var pathToTemplate = path.join(__dirname, '..', 'templates', 'suite.html'); var pathToVendor = path.join(__dirname, '..', 'vendor'); @@ -40,7 +43,7 @@ function cordovajs(req, res) { "Cache-Control": "no-cache", "Content-Type": "text/javascript" }); - res.end(bundle('test')); + res.end(testLib); } // middleware for GET '/' @@ -55,9 +58,9 @@ function root(req, res) { var tests = []; collect(path.join(__dirname, '..', '..', 'test'), tests); var specs = tests.map(function (file, path) { - return ''; - }).join(''); + }).join('\n'); //inject in the test script includes and write the document res.end(template.replace(//g, specs)); @@ -66,12 +69,12 @@ function root(req, res) { // connect router defn function routes(app) { app.get('/cordova.test.js', cordovajs); - app.get('/', root) + app.get('/', root); } module.exports = function() { - console.log('starting browser-based tests') + console.log('starting browser-based tests'); var vendor = connect.static(pathToVendor); var jasmine = connect.static(pathToJasmine); @@ -79,10 +82,10 @@ module.exports = function() { var router = connect.router(routes); connect(vendor, jasmine, tests, router).listen(3000); - + console.log("Test Server running on:\n"); console.log("http://127.0.0.1:3000\n"); - exec('open http://127.0.0.1:3000'); + start('http://127.0.0.1:3000'); }; diff --git a/tasks/lib/test-jsdom.js b/tasks/lib/test-jsdom.js index 5d3896eb4..8762731f3 100644 --- a/tasks/lib/test-jsdom.js +++ b/tasks/lib/test-jsdom.js @@ -54,6 +54,8 @@ module.exports = function(callback) { // hijack require require = window.cordova.require; define = window.cordova.define; + // Set up dummy navigator object + navigator = window.navigator || {}; // load in our tests var tests = []; diff --git a/tasks/templates/suite.html b/tasks/templates/suite.html index dd4295507..7444a8254 100644 --- a/tasks/templates/suite.html +++ b/tasks/templates/suite.html @@ -43,10 +43,6 @@ window.global = window; - window.cordova = { - platform: "" - }; - window.addEventListener("load", function () { jasmineEnv.execute(); }); @@ -62,7 +58,7 @@ - + diff --git a/test/ios/test.exec.js b/test/ios/test.exec.js index 0f051f1ae..f5c0d8b80 100644 --- a/test/ios/test.exec.js +++ b/test/ios/test.exec.js @@ -19,6 +19,8 @@ * */ +/*jshint jasmine:true*/ + describe('iOS exec', function () { var SERVICE = 'TestService'; var ACTION = 'TestAction'; @@ -29,18 +31,23 @@ describe('iOS exec', function () { var mockxhr = require('cordova/mockxhr'); var winSpy = jasmine.createSpy('win'); var failSpy = jasmine.createSpy('fail'); + var origUserAgent = navigator.userAgent; beforeEach(function() { winSpy.reset(); failSpy.reset(); mockxhr.install(); exec.setJsToNativeBridgeMode(exec.jsToNativeModes.XHR_NO_PAYLOAD); - navigator = { userAgent: 'hi there (' + VC_ADDR + ')' }; + navigator.__defineGetter__('userAgent', function(){ + return 'hi there (' + VC_ADDR + ')'; + }); }); afterEach(function() { expect(mockxhr.activeXhrs.length).toBe(0); - delete navigator; + navigator.__defineGetter__('userAgent', function(){ + return origUserAgent; + }); }); afterEach(mockxhr.uninstall); From adbe1885b118161f0bd19d82a748653ae0f8ba25 Mon Sep 17 00:00:00 2001 From: Vladimir Kotikov Date: Wed, 29 Jul 2015 13:42:11 +0300 Subject: [PATCH 2/4] CB-9429 Enables jsdom/browser tests for browserify --- Gruntfile.js | 4 ++-- tasks/lib/bundle-browserify.js | 26 ++++++++++++++++++++++++-- tasks/lib/test-browser.js | 34 +++++++++++++++++++++------------- tasks/lib/test-jsdom.js | 14 ++++++++------ tasks/test.js | 4 ++-- 5 files changed, 57 insertions(+), 25 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 3d4ede437..8869b7a43 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -70,6 +70,6 @@ module.exports = function(grunt) { grunt.registerTask('test', ['compile:test', 'jshint', '_test']); grunt.registerTask('btest', ['compile:test', 'jshint', '_btest']); grunt.registerTask('cover', ['compile', '_cover']); - grunt.registerTask('test-browserify', ['compile-browserify:test', 'jshint', '_test']); - grunt.registerTask('btest-browserify', ['compile-browserify:test', 'jshint', '_btest']); + grunt.registerTask('test-browserify', ['compile-browserify:test', 'jshint', '_test:skip-tests']); + grunt.registerTask('btest-browserify', ['compile-browserify:test', 'jshint', '_btest:skip-tests']); }; diff --git a/tasks/lib/bundle-browserify.js b/tasks/lib/bundle-browserify.js index a6b868727..50478f681 100644 --- a/tasks/lib/bundle-browserify.js +++ b/tasks/lib/bundle-browserify.js @@ -20,8 +20,10 @@ var fs = require('fs'); var path = require('path'); var browserify = require('browserify'); var require_tr = require('./require-tr'); -var root = path.join(__dirname, '..', '..') - +var root = path.join(__dirname, '..', '..'); +var pkgJson = require('../../package.json'); +var collectFiles = require('./collect-files'); +var copyProps = require('./copy-props'); module.exports = function bundle(platform, debug, commitId, platformVersion) { require_tr.platform = platform; @@ -43,6 +45,26 @@ module.exports = function bundle(platform, debug, commitId, platformVersion) { b.add(path.join(root, 'src', 'legacy-exec', platform, 'platform.js')); } + if (platform === 'test') { + // Add tests to bundle + // TODO: Also need to include android/ios tests + fs.readdirSync('test').forEach(function (item) { + var itemPath = path.resolve('test', item); + if (fs.statSync(itemPath).isFile()) b.add(itemPath); + }); + + // Add rest of modules from cordova-js-src/legacy-exec directory + // TODO: this probably should be done for all platforms? + fs.readdirSync(path.join(root, 'src', 'legacy-exec', platform, platform)).forEach(function (item) { + var itemPath = path.resolve(root, 'src', 'legacy-exec', platform, platform, item); + if (fs.statSync(itemPath).isFile()) b.add(itemPath); + }); + + // Ignore fake modules from tests, otherwise browserify fails to generate bundle + ['your mom', 'dino', 'a', 'ModuleA', 'ModuleB', 'ModuleC'] + .forEach(b.ignore.bind(b)); + } + b.add(path.join(root, 'src', 'scripts', 'bootstrap.js')); return b; diff --git a/tasks/lib/test-browser.js b/tasks/lib/test-browser.js index 0ea4fe33a..80c8fb2af 100644 --- a/tasks/lib/test-browser.js +++ b/tasks/lib/test-browser.js @@ -35,6 +35,8 @@ var pathToVendor = path.join(__dirname, '..', 'vendor'); var pathToJasmine = path.join(__dirname, '..', '..', 'node_modules', 'jasmine-node', 'lib', 'jasmine-node'); var pathToTests = path.join(__dirname, '..', '..', 'test'); +var SKIP_TESTS = false; + var template = fs.readFileSync(pathToTemplate, "utf-8"); // middlewar for GET '/cordova.test.js' @@ -53,17 +55,23 @@ function root(req, res) { "Content-Type": "text/html" }); - //FIXME in place collect thing is atrocious - //create the script tags to include - var tests = []; - collect(path.join(__dirname, '..', '..', 'test'), tests); - var specs = tests.map(function (file, path) { - return ''; - }).join('\n'); - - //inject in the test script includes and write the document - res.end(template.replace(//g, specs)); + // When we testing browserify bundle, we don't need to include + // tests since they're already bundled with cordova. + if (!SKIP_TESTS) { + //FIXME in place collect thing is atrocious + //create the script tags to include + var tests = []; + collect(path.join(__dirname, '..', '..', 'test'), tests); + var specs = tests.map(function (file, path) { + return ''; + }).join('\n'); + + template = template.replace(//g, specs); + } + + // write the document + res.end(template); } // connect router defn @@ -72,8 +80,8 @@ function routes(app) { app.get('/', root); } -module.exports = function() { - +module.exports = function(skipTests) { + SKIP_TESTS = skipTests; console.log('starting browser-based tests'); var vendor = connect.static(pathToVendor); diff --git a/tasks/lib/test-jsdom.js b/tasks/lib/test-jsdom.js index 8762731f3..f996f6ca8 100644 --- a/tasks/lib/test-jsdom.js +++ b/tasks/lib/test-jsdom.js @@ -30,7 +30,7 @@ var jsdom = require("node-jsdom").jsdom; var document = jsdom(undefined, { url: 'file:///jsdomtest.info/a?b#c' }); var window = document.parentWindow; -module.exports = function(callback) { +module.exports = function(callback, skipTests) { console.log('starting node-based tests'); @@ -57,11 +57,13 @@ module.exports = function(callback) { // Set up dummy navigator object navigator = window.navigator || {}; - // load in our tests - var tests = []; - collect(path.join(__dirname, '..', '..', 'test'), tests); - for (var x in tests) { - eval(fs.readFileSync(tests[x], "utf-8")); + if (!skipTests) { + // load in our tests + var tests = []; + collect(path.join(__dirname, '..', '..', 'test'), tests); + for (var x in tests) { + eval(fs.readFileSync(tests[x], "utf-8")); + } } var env = jasmine.getEnv(); diff --git a/tasks/test.js b/tasks/test.js index 5e8306b8d..2714d9314 100644 --- a/tasks/test.js +++ b/tasks/test.js @@ -26,11 +26,11 @@ try { module.exports = function(grunt) { grunt.registerTask('_test', 'Runs test in node', function() { var done = this.async(); - require('./lib/test-jsdom')(done); + require('./lib/test-jsdom')(done, arguments[0] === ('skip-tests')); }); grunt.registerTask('_btest', 'Runs tests in the browser', function() { - require('./lib/test-browser')(); + require('./lib/test-browser')(arguments[0] === ('skip-tests')); this.async(); // never finish. }); }; From 42e6a6d26f7eb224e7317d6831f4028f9f7abc69 Mon Sep 17 00:00:00 2001 From: Vladimir Kotikov Date: Wed, 29 Jul 2015 13:42:11 +0300 Subject: [PATCH 3/4] Moves test platform sources to platforms directory Updates tests with new test platform paths Updates bundlers to use new test platform path --- src/{ => legacy-exec}/test/exec.js | 0 src/{ => legacy-exec}/test/platform.js | 2 +- src/{ => legacy-exec/test}/test/mockxhr.js | 0 .../test}/test/modulereplacer.js | 2 +- .../test}/test/propertyreplacer.js | 0 src/{ => legacy-exec/test}/test/testmodule.js | 0 tasks/lib/bundle.js | 23 +++---- tasks/lib/require-tr.js | 17 +++-- test/ios/test.exec.js | 2 +- test/test.modulemapper.js | 68 +++++++++---------- 10 files changed, 57 insertions(+), 57 deletions(-) rename src/{ => legacy-exec}/test/exec.js (100%) rename src/{ => legacy-exec}/test/platform.js (94%) rename src/{ => legacy-exec/test}/test/mockxhr.js (100%) rename src/{ => legacy-exec/test}/test/modulereplacer.js (94%) rename src/{ => legacy-exec/test}/test/propertyreplacer.js (100%) rename src/{ => legacy-exec/test}/test/testmodule.js (100%) diff --git a/src/test/exec.js b/src/legacy-exec/test/exec.js similarity index 100% rename from src/test/exec.js rename to src/legacy-exec/test/exec.js diff --git a/src/test/platform.js b/src/legacy-exec/test/platform.js similarity index 94% rename from src/test/platform.js rename to src/legacy-exec/test/platform.js index fcc31aeb6..b0ff2d720 100644 --- a/src/test/platform.js +++ b/src/legacy-exec/test/platform.js @@ -22,7 +22,7 @@ module.exports = { id: 'test platform', bootstrap: function() { - var propertyreplacer = require('cordova/propertyreplacer'); + var propertyreplacer = require('cordova/test/propertyreplacer'); require('cordova/builder').replaceHookForTesting = function(obj, key) { // This doesn't clean up non-clobbering assignments, nor does it work for diff --git a/src/test/mockxhr.js b/src/legacy-exec/test/test/mockxhr.js similarity index 100% rename from src/test/mockxhr.js rename to src/legacy-exec/test/test/mockxhr.js diff --git a/src/test/modulereplacer.js b/src/legacy-exec/test/test/modulereplacer.js similarity index 94% rename from src/test/modulereplacer.js rename to src/legacy-exec/test/test/modulereplacer.js index b5a24611a..f9f1c0cf0 100644 --- a/src/test/modulereplacer.js +++ b/src/legacy-exec/test/test/modulereplacer.js @@ -21,7 +21,7 @@ /*global spyOn:false */ -var propertyreplacer = require('cordova/propertyreplacer'); +var propertyreplacer = require('cordova/test/propertyreplacer'); exports.replace = function(moduleName, newValue) { propertyreplacer.stub(define.moduleMap, moduleName, null); diff --git a/src/test/propertyreplacer.js b/src/legacy-exec/test/test/propertyreplacer.js similarity index 100% rename from src/test/propertyreplacer.js rename to src/legacy-exec/test/test/propertyreplacer.js diff --git a/src/test/testmodule.js b/src/legacy-exec/test/test/testmodule.js similarity index 100% rename from src/test/testmodule.js rename to src/legacy-exec/test/test/testmodule.js diff --git a/tasks/lib/bundle.js b/tasks/lib/bundle.js index 2c1cb4641..0446e7287 100644 --- a/tasks/lib/bundle.js +++ b/tasks/lib/bundle.js @@ -35,14 +35,9 @@ module.exports = function bundle(platform, debug, commitId, platformVersion, pla if(fs.existsSync(platformPath) && fs.existsSync(path.join(platformPath, 'cordova-js-src'))) { copyProps(modules, collectFiles(path.join(platformPath, 'cordova-js-src'))); } else { - if(platform !== 'test') { - //for platforms that don't have a release with cordova-js-src yet - copyProps(modules, collectFiles(path.join('src', 'legacy-exec', platform))); - } else { - //platform === test - copyProps(modules, collectFiles(path.join('src', platform))); - } - + // for platforms that don't have a release with cordova-js-src yet + // or if platform === test + copyProps(modules, collectFiles(path.join('src', 'legacy-exec', platform))); } //test doesn't support custom paths if (platform === 'test') { @@ -68,7 +63,7 @@ module.exports = function bundle(platform, debug, commitId, platformVersion, pla } var output = []; - + output.push("// Platform: " + platform); output.push("// " + commitId); @@ -82,16 +77,16 @@ module.exports = function bundle(platform, debug, commitId, platformVersion, pla if (!scripts['require']) { throw new Error("didn't find a script for 'require'") } - + writeScript(output, scripts['require'], debug) // write modules var moduleIds = Object.keys(modules) moduleIds.sort() - + for (var i=0; i cordova.js if(module === "cordova") { @@ -158,17 +161,19 @@ function _updateRequires(code, platform) { } else if(module.match(/cordova\/init/)) { scriptPath = node.args[0].value = module.replace(/cordova\/init/, path.join(root, "src", "common", "init_b")); - // android and amazon-fireos have some special require's - } else if(module.match(/cordova\/(android|amazon-fireos)\/(.+)/)) { + // handle platform's special special requires + } else if(module.match(platformModuleRe)) { if(fs.existsSync(cordovajssrc)) { //cordova cli project with cordova-js-src in platform - scriptPath = node.args[0].value = module.replace(/cordova\/(android|amazon-fireos)\/(.+)/, path.join(cordovajssrc, "android", "$2")); + scriptPath = node.args[0].value = module.replace(platformModuleRe, + path.join(cordovajssrc, platformName, "$2")); } else { //non cli or no cordova-js-src directory - scriptPath = node.args[0].value = module.replace(/cordova\/(android|amazon-fireos)\/(.+)/, path.join(root, "src", "legacy-exec", "$1", "android", "$2")); + scriptPath = node.args[0].value = module.replace(platformModuleRe, + path.join(root, "src", "legacy-exec", "$1", platformName, "$2")); } // require('cordova/exec') and require('cordova/platform') -> platform's exec/platform - } else if(module.match(/cordova\/(platform|exec)$/)) { + } else if(module.match(/cordova\/(platform|exec)$/)) { if(fs.existsSync(cordovajssrc)) { //cordova cli project with cordova-js-src in platform scriptPath = node.args[0].value = module.replace(/cordova\/(platform|exec)/, path.join(cordovajssrc, "$1")); diff --git a/test/ios/test.exec.js b/test/ios/test.exec.js index f5c0d8b80..9b1d35a9a 100644 --- a/test/ios/test.exec.js +++ b/test/ios/test.exec.js @@ -28,7 +28,7 @@ describe('iOS exec', function () { var cordova = require('cordova'); var exec = require('cordova/ios/exec'); - var mockxhr = require('cordova/mockxhr'); + var mockxhr = require('cordova/test/mockxhr'); var winSpy = jasmine.createSpy('win'); var failSpy = jasmine.createSpy('fail'); var origUserAgent = navigator.userAgent; diff --git a/test/test.modulemapper.js b/test/test.modulemapper.js index d4c2806ec..289109967 100644 --- a/test/test.modulemapper.js +++ b/test/test.modulemapper.js @@ -20,7 +20,7 @@ describe('modulemapper', function() { var modulemapper = require('cordova/modulemapper'), - testmodule = require('cordova/testmodule'), + testmodule = require('cordova/test/testmodule'), utils = require('cordova/utils'); var context; @@ -45,46 +45,46 @@ describe('modulemapper', function() { expect(function() { modulemapper.clobbers('cordova/invalid', 'newProp'); }).toThrow(); }); it('should properly set a new top-level property', function() { - modulemapper.clobbers('cordova/testmodule', 'newProp1'); - modulemapper.defaults('cordova/testmodule', 'newProp2'); - modulemapper.merges('cordova/testmodule', 'newProp3'); + modulemapper.clobbers('cordova/test/testmodule', 'newProp1'); + modulemapper.defaults('cordova/test/testmodule', 'newProp2'); + modulemapper.merges('cordova/test/testmodule', 'newProp3'); modulemapper.mapModules(context); expect(context.newProp1).toBe(testmodule); expect(context.newProp2).toBe(testmodule); expect(context.newProp3).toBe(testmodule); }); it('should properly set a new non-top-level property', function() { - modulemapper.clobbers('cordova/testmodule', 'foo1.newProp'); - modulemapper.defaults('cordova/testmodule', 'foo2.newProp'); - modulemapper.merges('cordova/testmodule', 'foo3.newProp'); + modulemapper.clobbers('cordova/test/testmodule', 'foo1.newProp'); + modulemapper.defaults('cordova/test/testmodule', 'foo2.newProp'); + modulemapper.merges('cordova/test/testmodule', 'foo3.newProp'); modulemapper.mapModules(context); expect(context.foo1.newProp).toBe(testmodule); expect(context.foo2.newProp).toBe(testmodule); expect(context.foo3.newProp).toBe(testmodule); }); it('should properly set a new non-top-level property #2', function() { - modulemapper.clobbers('cordova/testmodule', 'foo1.bar.newProp'); - modulemapper.defaults('cordova/testmodule', 'foo2.bar.newProp'); - modulemapper.merges('cordova/testmodule', 'foo3.bar.newProp'); + modulemapper.clobbers('cordova/test/testmodule', 'foo1.bar.newProp'); + modulemapper.defaults('cordova/test/testmodule', 'foo2.bar.newProp'); + modulemapper.merges('cordova/test/testmodule', 'foo3.bar.newProp'); modulemapper.mapModules(context); expect(context.foo1.bar.newProp).toBe(testmodule); expect(context.foo2.bar.newProp).toBe(testmodule); expect(context.foo3.bar.newProp).toBe(testmodule); }); it('should properly set a non-new non-top-level property', function() { - modulemapper.clobbers('cordova/testmodule', 'obj.newProp1'); - modulemapper.defaults('cordova/testmodule', 'obj.newProp2'); - modulemapper.merges('cordova/testmodule', 'obj.newProp3'); + modulemapper.clobbers('cordova/test/testmodule', 'obj.newProp1'); + modulemapper.defaults('cordova/test/testmodule', 'obj.newProp2'); + modulemapper.merges('cordova/test/testmodule', 'obj.newProp3'); modulemapper.mapModules(context); expect(context.obj.newProp1).toBe(testmodule); expect(context.obj.newProp2).toBe(testmodule); expect(context.obj.newProp3).toBe(testmodule); }); it('should clobber existing properties', function() { - modulemapper.clobbers('cordova/testmodule', 'num'); - modulemapper.clobbers('cordova/testmodule', 'obj.str'); - modulemapper.clobbers('cordova/testmodule', 'getme'); - modulemapper.clobbers('cordova/testmodule', 'TestClass'); + modulemapper.clobbers('cordova/test/testmodule', 'num'); + modulemapper.clobbers('cordova/test/testmodule', 'obj.str'); + modulemapper.clobbers('cordova/test/testmodule', 'getme'); + modulemapper.clobbers('cordova/test/testmodule', 'TestClass'); modulemapper.mapModules(context); expect(context.num).toBe(testmodule); expect(context.obj.str).toBe(testmodule); @@ -92,10 +92,10 @@ describe('modulemapper', function() { expect(context.TestClass).toBe(testmodule); }); it('should not clobber existing properties when using defaults', function() { - modulemapper.defaults('cordova/testmodule', 'num'); - modulemapper.defaults('cordova/testmodule', 'obj.str'); - modulemapper.defaults('cordova/testmodule', 'obj.getme'); - modulemapper.defaults('cordova/testmodule', 'TestClass'); + modulemapper.defaults('cordova/test/testmodule', 'num'); + modulemapper.defaults('cordova/test/testmodule', 'obj.str'); + modulemapper.defaults('cordova/test/testmodule', 'obj.getme'); + modulemapper.defaults('cordova/test/testmodule', 'TestClass'); modulemapper.mapModules(context); expect(context.num).not.toBe(testmodule); expect(context.obj.str).not.toBe(testmodule); @@ -104,12 +104,12 @@ describe('modulemapper', function() { }); it('should throw when namespace is a non-object', function() { expect(function() { - modulemapper.merges('cordova/testmodule', 'num'); + modulemapper.merges('cordova/test/testmodule', 'num'); modulemapper.mapModules(context); }).toThrow(); }); it('should merge into objects', function() { - modulemapper.merges('cordova/testmodule', 'obj'); + modulemapper.merges('cordova/test/testmodule', 'obj'); modulemapper.mapModules(context); for (var k in testmodule) { if (k != 'subObj') { @@ -121,22 +121,22 @@ describe('modulemapper', function() { expect(context.obj.subObj.str).toBe(testmodule.subObj.str); }); it('should merge into constructor prototypes', function() { - modulemapper.merges('cordova/testmodule', 'TestClass'); + modulemapper.merges('cordova/test/testmodule', 'TestClass'); modulemapper.mapModules(context); for (var k in testmodule) { expect(context.TestClass.prototype[k]).toBe(testmodule[k]); } }); it('should maintain order of calls', function() { - modulemapper.merges('cordova/testmodule', 'obj'); - modulemapper.clobbers('cordova/testmodule', 'obj'); + modulemapper.merges('cordova/test/testmodule', 'obj'); + modulemapper.clobbers('cordova/test/testmodule', 'obj'); modulemapper.mapModules(context); expect(context.obj).toBe(testmodule); }); it('should maintain order of calls2', function() { - modulemapper.merges('cordova/testmodule', 'obj.foo'); - modulemapper.clobbers('cordova/testmodule', 'obj'); - modulemapper.merges('cordova/testmodule', 'obj.obj'); + modulemapper.merges('cordova/test/testmodule', 'obj.foo'); + modulemapper.clobbers('cordova/test/testmodule', 'obj'); + modulemapper.merges('cordova/test/testmodule', 'obj.obj'); modulemapper.mapModules(context); expect(context.obj.foo).toBeUndefined(); expect(context.obj).toBe(testmodule); @@ -150,14 +150,14 @@ describe('modulemapper', function() { }); it('should remember original symbols when clobbering', function() { var orig = context.obj; - modulemapper.clobbers('cordova/testmodule', 'obj'); + modulemapper.clobbers('cordova/test/testmodule', 'obj'); modulemapper.mapModules(context); expect(modulemapper.getOriginalSymbol(context, 'obj')).toBe(orig); }); it('should remember original symbols when double clobbering', function() { var orig = context.obj; - modulemapper.clobbers('cordova/testmodule', 'obj'); - modulemapper.clobbers('cordova/testmodule', 'obj'); + modulemapper.clobbers('cordova/test/testmodule', 'obj'); + modulemapper.clobbers('cordova/test/testmodule', 'obj'); modulemapper.mapModules(context); expect(modulemapper.getOriginalSymbol(context, 'obj')).toBe(orig); }); @@ -172,8 +172,8 @@ describe('modulemapper', function() { this.after(function() { console.log = origConsoleLog; }); - modulemapper.clobbers('cordova/testmodule', 'obj', 'Use foo instead'); - modulemapper.defaults('cordova/testmodule', 'newProp', 'Use foo instead'); + modulemapper.clobbers('cordova/test/testmodule', 'obj', 'Use foo instead'); + modulemapper.defaults('cordova/test/testmodule', 'newProp', 'Use foo instead'); modulemapper.mapModules(context); context.obj.func(); context.obj.func(); From 4107d66a0f59000096f868a46aebb40d8f6688f2 Mon Sep 17 00:00:00 2001 From: Vladimir Kotikov Date: Wed, 29 Jul 2015 13:42:11 +0300 Subject: [PATCH 4/4] Fixes malformed bundle by adding symbol list --- package.json | 3 ++- tasks/lib/packager-browserify.js | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 664141076..71392923e 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "devDependencies": { "connect": "1.8.5", "grunt": "0.4.1", + "grunt-cli": "0.1.13", "grunt-contrib-clean": "0.6.0", "grunt-contrib-jshint": "0.10.0", "istanbul": "^0.3.4", @@ -69,7 +70,7 @@ "mkdirp": "^0.5.0", "node-jsdom": "~3.x", "open": "0.0.5", - "grunt-cli": "0.1.13" + "through2": "^2.0.0" }, "dependencies": { "browserify": "10.1.3", diff --git a/tasks/lib/packager-browserify.js b/tasks/lib/packager-browserify.js index d26f35dee..5bdb39a24 100644 --- a/tasks/lib/packager-browserify.js +++ b/tasks/lib/packager-browserify.js @@ -19,6 +19,8 @@ var fs = require('fs'); var path = require('path'); var util = require('util'); +var through = require('through2'); +var requireTr = require('./require-tr'); var bundle = require('./bundle-browserify'); var computeCommitId = require('./compute-commit-id'); var writeLicenseHeader = require('./write-license-header'); @@ -43,7 +45,20 @@ module.exports = function generate(platform, useWindowsLineEndings, platformVers outReleaseFile = path.join('pkg', 'cordova.' + platform + '.js'); outReleaseFileStream = fs.createWriteStream(outReleaseFile); - + + var symbolList = null; + var addSymbolList = through.obj(function(row, enc, next) { + if(symbolList === null) { + symbolList = requireTr.getModules(platform); + this.push(util.format('var symbolList = %s;\n%s\n', JSON.stringify(symbolList, null, 4), row)); + } else { + this.push(row); + } + next(); + }); + + libraryRelease.pipeline.get('wrap').push(addSymbolList); + // write license header writeLicenseHeader(outReleaseFileStream, platform, commitId, platformVersion);