var assert = require('assert'); var ourProcess = require('./browser'); describe('test against our process', function () { test(ourProcess); }); if (!process.browser) { describe('test against node', function () { test(process); }); vmtest(); } function test (ourProcess) { describe('test arguments', function () { it ('works', function (done) { var order = 0; ourProcess.nextTick(function (num) { assert.equal(num, order++, 'first one works'); ourProcess.nextTick(function (num) { assert.equal(num, order++, 'recursive one is 4th'); }, 3); }, 0); ourProcess.nextTick(function (num) { assert.equal(num, order++, 'second one starts'); ourProcess.nextTick(function (num) { assert.equal(num, order++, 'this is third'); ourProcess.nextTick(function (num) { assert.equal(num, order++, 'this is last'); done(); }, 5); }, 4); }, 1); ourProcess.nextTick(function (num) { assert.equal(num, order++, '3rd schedualed happens after the error'); }, 2); }); }); if (!process.browser) { describe('test errors', function (t) { it ('works', function (done) { var order = 0; process.removeAllListeners('uncaughtException'); process.once('uncaughtException', function(err) { assert.equal(2, order++, 'error is third'); ourProcess.nextTick(function () { assert.equal(5, order++, 'schedualed in error is last'); done(); }); }); ourProcess.nextTick(function () { assert.equal(0, order++, 'first one works'); ourProcess.nextTick(function () { assert.equal(4, order++, 'recursive one is 4th'); }); }); ourProcess.nextTick(function () { assert.equal(1, order++, 'second one starts'); throw(new Error('an error is thrown')); }); ourProcess.nextTick(function () { assert.equal(3, order++, '3rd schedualed happens after the error'); }); }); }); } describe('rename globals', function (t) { var oldTimeout = setTimeout; var oldClear = clearTimeout; it('clearTimeout', function (done){ var ok = true; clearTimeout = function () { ok = false; } var ran = false; function cleanup() { clearTimeout = oldClear; var err; try { assert.ok(ok, 'fake clearTimeout ran'); assert.ok(ran, 'should have run'); } catch (e) { err = e; } done(err); } setTimeout(cleanup, 1000); ourProcess.nextTick(function () { ran = true; }); }); it('just setTimeout', function (done){ setTimeout = function () { setTimeout = oldTimeout; try { assert.ok(false, 'fake setTimeout called') } catch (e) { done(e); } } ourProcess.nextTick(function () { setTimeout = oldTimeout; done(); }); }); }); } function vmtest() { var vm = require('vm'); var fs = require('fs'); var process = fs.readFileSync('./browser.js', {encoding: 'utf8'}); describe('should work in vm in strict mode with no globals', function () { it('should parse', function (done) { var str = '"use strict";var module = {exports:{}};'; str += process; str += 'this.works = process.browser;'; var script = new vm.Script(str); var context = { works: false }; script.runInNewContext(context); assert.ok(context.works); done(); }); it('setTimeout throws error', function (done) { var str = '"use strict";var module = {exports:{}};'; str += process; str += 'try {process.nextTick(function () {})} catch (e){this.works = e;}'; var script = new vm.Script(str); var context = { works: false }; script.runInNewContext(context); assert.ok(context.works); done(); }); it('should generally work', function (done) { var str = '"use strict";var module = {exports:{}};'; str += process; str += 'process.nextTick(function () {assert.ok(true);done();})'; var script = new vm.Script(str); var context = { clearTimeout: clearTimeout, setTimeout: setTimeout, done: done, assert: assert }; script.runInNewContext(context); }); it('late defs setTimeout', function (done) { var str = '"use strict";var module = {exports:{}};'; str += process; str += 'var setTimeout = hiddenSetTimeout;process.nextTick(function () {assert.ok(true);done();})'; var script = new vm.Script(str); var context = { clearTimeout: clearTimeout, hiddenSetTimeout: setTimeout, done: done, assert: assert }; script.runInNewContext(context); }); it('late defs clearTimeout', function (done) { var str = '"use strict";var module = {exports:{}};'; str += process; str += 'var clearTimeout = hiddenClearTimeout;process.nextTick(function () {assert.ok(true);done();})'; var script = new vm.Script(str); var context = { hiddenClearTimeout: clearTimeout, setTimeout: setTimeout, done: done, assert: assert }; script.runInNewContext(context); }); it('late defs setTimeout and then redefine', function (done) { var str = '"use strict";var module = {exports:{}};'; str += process; str += 'var setTimeout = hiddenSetTimeout;process.nextTick(function () {setTimeout = function (){throw new Error("foo")};hiddenSetTimeout(function(){process.nextTick(function (){assert.ok(true);done();});});});'; var script = new vm.Script(str); var context = { clearTimeout: clearTimeout, hiddenSetTimeout: setTimeout, done: done, assert: assert }; script.runInNewContext(context); }); }); }