You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
6.2 KiB
199 lines
6.2 KiB
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); |
|
}); |
|
}); |
|
}
|
|
|