diff --git a/packages/underscore-tests/.gitignore b/packages/underscore-tests/.gitignore new file mode 100644 index 0000000000..677a6fc263 --- /dev/null +++ b/packages/underscore-tests/.gitignore @@ -0,0 +1 @@ +.build* diff --git a/packages/underscore-tests/each_test.js b/packages/underscore-tests/each_test.js new file mode 100644 index 0000000000..50b071ee8d --- /dev/null +++ b/packages/underscore-tests/each_test.js @@ -0,0 +1,45 @@ +Tinytest.add("underscore - each", function (test) { + // arrays + _.each([42], function (val, index) { + test.equal(index, 0); + test.equal(val, 42); + }); + + // objects with 'length' field aren't treated as arrays + _.each({length: 42}, function (val, key) { + test.equal(key, 'length'); + test.equal(val, 42); + }); + + // The special 'arguments' variable is treated as an + // array + (function () { + _.each(arguments, function (val, index) { + test.equal(index, 0); + test.equal(val, 42); + }); + })(42); + + // An object with a 'callee' field isn't treated as arguments + _.each({callee: 42}, function (val, key) { + test.equal(key, 'callee'); + test.equal(val, 42); + }); + + // An object with a 'callee' field isn't treated as arguments + _.each({length: 4, callee: 42}, function (val, key) { + if (key === 'callee') + test.equal(val, 42); + else if (key === 'length') + test.equal(val, 4); + else + test.fail({message: 'unexpected key: ' + key}); + }); + + + // NOTE: An object with a numberic 'length' field *and* a function + // 'callee' field will be treated as an array in IE. This may or may + // not be fixable, but isn't a big deal since: (1) 'callee' is a + // pretty rare key, and (2) JSON objects can't have functions + // anyways, which is the main use-case for _.each. +}); diff --git a/packages/underscore-tests/package.js b/packages/underscore-tests/package.js new file mode 100644 index 0000000000..0eb7218126 --- /dev/null +++ b/packages/underscore-tests/package.js @@ -0,0 +1,10 @@ +Package.describe({ + // These tests can't be directly in the underscore packages since + // Tinytest depends on underscore + summary: "Tests for the underscore package" +}); + +Package.on_test(function (api) { + api.use(['tinytest', 'underscore']); + api.add_files('each_test.js'); +}); diff --git a/packages/underscore/underscore.js b/packages/underscore/underscore.js index 3ffa3c111f..f5ca16aa33 100644 --- a/packages/underscore/underscore.js +++ b/packages/underscore/underscore.js @@ -81,7 +81,7 @@ // there isn't any inspectable "Arguments" type. if (!_isArguments(arguments)) { _isArguments = function (obj) { - return !!(obj && hasOwnProperty.call(obj, 'callee')); + return !!(obj && hasOwnProperty.call(obj, 'callee') && typeof obj.callee === 'function'); }; }