michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: // Tests that source URLs in the Web Console can be clicked to display the michael@0: // standard View Source window. michael@0: michael@0: let [ define, require ] = (function() { michael@0: let tempScope = {}; michael@0: Components.utils.import("resource://gre/modules/devtools/Require.jsm", tempScope); michael@0: return [ tempScope.define, tempScope.require ]; michael@0: })(); michael@0: michael@0: function test() { michael@0: addTab("about:blank", function() { michael@0: info("Starting Require Tests"); michael@0: setup(); michael@0: michael@0: testWorking(); michael@0: testDomains(); michael@0: testLeakage(); michael@0: testMultiImport(); michael@0: testRecursive(); michael@0: testUncompilable(); michael@0: testFirebug(); michael@0: michael@0: shutdown(); michael@0: }); michael@0: } michael@0: michael@0: function setup() { michael@0: define('gclitest/requirable', [ 'require', 'exports', 'module' ], function(require, exports, module) { michael@0: exports.thing1 = 'thing1'; michael@0: exports.thing2 = 2; michael@0: michael@0: let status = 'initial'; michael@0: exports.setStatus = function(aStatus) { status = aStatus; }; michael@0: exports.getStatus = function() { return status; }; michael@0: }); michael@0: michael@0: define('gclitest/unrequirable', [ 'require', 'exports', 'module' ], function(require, exports, module) { michael@0: null.throwNPE(); michael@0: }); michael@0: michael@0: define('gclitest/recurse', [ 'require', 'exports', 'module', 'gclitest/recurse' ], function(require, exports, module) { michael@0: require('gclitest/recurse'); michael@0: }); michael@0: michael@0: define('gclitest/firebug', [ 'gclitest/requirable' ], function(requirable) { michael@0: return { requirable: requirable, fb: true }; michael@0: }); michael@0: } michael@0: michael@0: function shutdown() { michael@0: delete define.modules['gclitest/requirable']; michael@0: delete define.globalDomain.modules['gclitest/requirable']; michael@0: delete define.modules['gclitest/unrequirable']; michael@0: delete define.globalDomain.modules['gclitest/unrequirable']; michael@0: delete define.modules['gclitest/recurse']; michael@0: delete define.globalDomain.modules['gclitest/recurse']; michael@0: delete define.modules['gclitest/firebug']; michael@0: delete define.globalDomain.modules['gclitest/firebug']; michael@0: michael@0: define = undefined; michael@0: require = undefined; michael@0: michael@0: finish(); michael@0: } michael@0: michael@0: function testWorking() { michael@0: // There are lots of requirement tests that we could be doing here michael@0: // The fact that we can get anything at all working is a testament to michael@0: // require doing what it should - we don't need to test the michael@0: let requireable = require('gclitest/requirable'); michael@0: is('thing1', requireable.thing1, 'thing1 was required'); michael@0: is(2, requireable.thing2, 'thing2 was required'); michael@0: is(requireable.thing3, undefined, 'thing3 was not required'); michael@0: } michael@0: michael@0: function testDomains() { michael@0: let requireable = require('gclitest/requirable'); michael@0: is(requireable.status, undefined, 'requirable has no status'); michael@0: requireable.setStatus(null); michael@0: is(null, requireable.getStatus(), 'requirable.getStatus changed to null'); michael@0: is(requireable.status, undefined, 'requirable still has no status'); michael@0: requireable.setStatus('42'); michael@0: is('42', requireable.getStatus(), 'requirable.getStatus changed to 42'); michael@0: is(requireable.status, undefined, 'requirable *still* has no status'); michael@0: michael@0: let domain = new define.Domain(); michael@0: let requireable2 = domain.require('gclitest/requirable'); michael@0: is(requireable2.status, undefined, 'requirable2 has no status'); michael@0: is('initial', requireable2.getStatus(), 'requirable2.getStatus is initial'); michael@0: requireable2.setStatus(999); michael@0: is(999, requireable2.getStatus(), 'requirable2.getStatus changed to 999'); michael@0: is(requireable2.status, undefined, 'requirable2 still has no status'); michael@0: michael@0: is('42', requireable.getStatus(), 'status 42'); michael@0: ok(requireable.status === undefined, 'requirable has no status (as expected)'); michael@0: michael@0: delete domain.modules['gclitest/requirable']; michael@0: } michael@0: michael@0: function testLeakage() { michael@0: let requireable = require('gclitest/requirable'); michael@0: is(requireable.setup, null, 'leakage of setup'); michael@0: is(requireable.shutdown, null, 'leakage of shutdown'); michael@0: is(requireable.testWorking, null, 'leakage of testWorking'); michael@0: } michael@0: michael@0: function testMultiImport() { michael@0: let r1 = require('gclitest/requirable'); michael@0: let r2 = require('gclitest/requirable'); michael@0: is(r1, r2, 'double require was strict equal'); michael@0: } michael@0: michael@0: function testUncompilable() { michael@0: // It's not totally clear how a module loader should perform with unusable michael@0: // modules, however at least it should go into a flat spin ... michael@0: // GCLI mini_require reports an error as it should michael@0: try { michael@0: let unrequireable = require('gclitest/unrequirable'); michael@0: fail(); michael@0: } michael@0: catch (ex) { michael@0: // an exception is expected michael@0: } michael@0: } michael@0: michael@0: function testRecursive() { michael@0: // See Bug 658583 michael@0: // require('gclitest/recurse'); michael@0: // Also see the comments in the testRecursive() function michael@0: } michael@0: michael@0: function testFirebug() { michael@0: let requirable = require('gclitest/requirable'); michael@0: let firebug = require('gclitest/firebug'); michael@0: ok(firebug.fb, 'firebug.fb is true'); michael@0: is(requirable, firebug.requirable, 'requirable pass-through'); michael@0: }