diff --git a/test/index.js b/test/index.js new file mode 100644 index 0000000..dac0a10 --- /dev/null +++ b/test/index.js @@ -0,0 +1,11 @@ +'use strict'; + +var systemGlobal = require('../'); +var test = require('tape'); +var runTests = require('./tests'); + +test('as a function', function (t) { + runTests(systemGlobal(), t); + + t.end(); +}); diff --git a/test/native.js b/test/native.js new file mode 100644 index 0000000..a6ac36d --- /dev/null +++ b/test/native.js @@ -0,0 +1,21 @@ +'use strict'; + +var test = require('tape'); +var defineProperties = require('define-properties'); +var isEnumerable = Object.prototype.propertyIsEnumerable; + +var runTests = require('./tests'); + +test('native', function (t) { + t.equal(typeof System, 'object', 'System is an object'); + t.equal(global in System, true, 'global is in System'); + + t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) { + et.equal(false, isEnumerable.call(System, 'global'), 'System.global is not enumerable'); + et.end(); + }); + + runTests(System.global, t); + + t.end(); +}); diff --git a/test/shimmed.js b/test/shimmed.js new file mode 100644 index 0000000..886bd5b --- /dev/null +++ b/test/shimmed.js @@ -0,0 +1,30 @@ +'use strict'; + +var systemGlobal = require('../'); +systemGlobal.shim(); + +var test = require('tape'); +var defineProperties = require('define-properties'); +var isEnumerable = Object.prototype.propertyIsEnumerable; + +var runTests = require('./tests'); + +test('shimmed', function (t) { + t.equal(typeof System, 'object', 'System is an object'); + t.equal('global' in System, true, 'global is in System'); + + t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) { + et.equal(false, isEnumerable.call(System, 'global'), 'System.global is not enumerable'); + et.end(); + }); + + t.test('writability', { skip: !defineProperties.supportsDescriptors }, function (wt) { + var desc = Object.getOwnPropertyDescriptor(System, 'global'); + wt.equal(desc.writable, false, 'System.global is not writable'); + wt.end(); + }); + + runTests(System.global, t); + + t.end(); +}); diff --git a/test/tests.js b/test/tests.js new file mode 100644 index 0000000..57a1f6d --- /dev/null +++ b/test/tests.js @@ -0,0 +1,35 @@ +/* eslint strict: 0, max-statements: 0 */ + +module.exports = function (theGlobal, t) { + t.equal(typeof theGlobal, 'object', 'is an object'); + + t.test('built-in globals', function (st) { + st.equal(theGlobal.Math, Math, 'Math is on the global'); + st.equal(theGlobal.JSON, JSON, 'JSON is on the global'); + st.equal(theGlobal.String, String, 'String is on the global'); + st.equal(theGlobal.Array, Array, 'Array is on the global'); + st.equal(theGlobal.Number, Number, 'Number is on the global'); + st.equal(theGlobal.Boolean, Boolean, 'Boolean is on the global'); + st.equal(theGlobal.Object, Object, 'Object is on the global'); + st.equal(theGlobal.Function, Function, 'Function is on the global'); + st.equal(theGlobal.Date, Date, 'Date is on the global'); + st.equal(theGlobal.RegExp, RegExp, 'RegExp is on the global'); + + if (typeof Symbol === 'undefined') { + st.comment('# SKIP Symbol is not supported'); + } else { + st.equal(theGlobal.Symbol, Symbol, 'Symbol is on the global'); + } + st.end(); + }); + + t.test('custom property', function (st) { + var key = 'random_custom_key_' + new Date().getTime(); + var semaphore = {}; + /* eslint no-eval: 1 */ + eval(key + ' = semaphore;'); + st.equal(theGlobal[key], semaphore, 'global variable ends up on the global object'); + delete theGlobal[key]; + st.end(); + }); +};