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