diff --git a/test/index.html b/test/index.html
index aa0db1874..8d21689f3 100644
--- a/test/index.html
+++ b/test/index.html
@@ -355,8 +355,16 @@
window._ = lodash;
}
if (ui.isModularize) {
- require(getConfig(), ['lodash/internal/baseEach'], function(baseEach) {
+ require(getConfig(), [
+ 'lodash/internal/baseEach',
+ 'lodash/internal/isIndex',
+ 'lodash/internal/isIterateeCall',
+ 'lodash/internal/isLength'
+ ], function(baseEach, isIndex, isIterateeCall, isLength) {
lodash._baseEach = baseEach;
+ lodash._isIndex = isIndex;
+ lodash._isIterateeCall = isIterateeCall;
+ lodash._isLength = isLength;
loadTests();
});
} else {
diff --git a/test/test.js b/test/test.js
index 7084c5b8a..07270aa79 100644
--- a/test/test.js
+++ b/test/test.js
@@ -16,6 +16,11 @@
/** Used as the maximum length an array-like object. */
var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;
+ /** `Object#toString` result references. */
+ var funcTag = '[object Function]',
+ numberTag = '[object Number]',
+ objectTag = '[object Object]';
+
/** Used as a reference to the global object. */
var root = (typeof global == 'object' && global) || this;
@@ -404,10 +409,12 @@
// Expose `baseEach` for better code coverage.
if (isModularize && !isNpm) {
- var path = require('path'),
- baseEach = require(path.join(path.dirname(filePath), 'internal', 'baseEach.js'));
+ _.each(['baseEach', 'isIndex', 'isIterateeCall', 'isLength'], function(funcName) {
+ var path = require('path'),
+ func = require(path.join(path.dirname(filePath), 'internal', 'baseEach.js'));
- _._baseEach = baseEach.baseEach || baseEach['default'] || baseEach;
+ _['_' + funcName] = func[funcName] || func['default'] || func;
+ });
}
// Allow bypassing native checks.
setProperty(funcProto, 'toString', function wrapper() {
@@ -7002,8 +7009,7 @@
QUnit.module('lodash.isFunction');
(function() {
- var args = arguments,
- funcTag = '[object Function]';
+ var args = arguments;
test('should return `true` for functions', 2, function() {
strictEqual(_.isFunction(_), true);
@@ -7016,8 +7022,7 @@
});
var actual = _.map(typedArrays, function(type) {
- var Ctor = root[type];
- return Ctor ? _.isFunction(Ctor) : false;
+ return _.isFunction(root[type]);
});
deepEqual(actual, expected);
@@ -7841,7 +7846,7 @@
Foo.prototype = root[methodName.slice(2)].prototype;
var object = new Foo;
- if (toString.call(object) == '[object Object]') {
+ if (toString.call(object) == objectTag) {
strictEqual(_[methodName](object), false, '`_.' + methodName + '` returns `false`');
} else {
skipTest();
@@ -12181,7 +12186,7 @@
'<%= a & b %>': '0',
'<%= a ^ b %>': '3',
'<%= a | b %>': '3',
- '<%= {}.toString.call(0) %>': '[object Number]',
+ '<%= {}.toString.call(0) %>': numberTag,
'<%= a.toFixed(2) %>': '1.00',
'<%= obj["a"] %>': '1',
'<%= delete a %>': 'true',
@@ -12947,71 +12952,6 @@
/*--------------------------------------------------------------------------*/
- QUnit.module('lodash.toArray');
-
- (function() {
- test('should return the values of objects', 1, function() {
- var array = [1, 2, 3],
- object = { 'a': 1, 'b': 2, 'c': 3 };
-
- deepEqual(_.toArray(object), array);
- });
-
- test('should work with a string for `collection` (test in Opera < 10.52)', 2, function() {
- deepEqual(_.toArray('abc'), ['a', 'b', 'c']);
- deepEqual(_.toArray(Object('abc')), ['a', 'b', 'c']);
- });
- }());
-
- /*--------------------------------------------------------------------------*/
-
- QUnit.module('lodash.slice and lodash.toArray');
-
- _.each(['slice', 'toArray'], function(methodName) {
- var args = (function() { return arguments; }(1, 2, 3)),
- array = [1, 2, 3],
- func = _[methodName];
-
- test('should return a dense array', 3, function() {
- var sparse = Array(3);
- sparse[1] = 2;
-
- var actual = func(sparse);
-
- ok('0' in actual);
- ok('2' in actual);
- deepEqual(actual, sparse);
- });
-
- test('should treat array-like objects like arrays', 2, function() {
- var object = { '0': 'a', '1': 'b', '2': 'c', 'length': 3 };
- deepEqual(func(object), ['a', 'b', 'c']);
- deepEqual(func(args), array);
- });
-
- test('should return a shallow clone of arrays', 2, function() {
- var actual = func(array);
- notStrictEqual(actual, array);
- deepEqual(func(array), array);
- });
-
- test('should work with a node list for `collection` (test in IE < 9)', 1, function() {
- if (document) {
- try {
- var nodeList = document.getElementsByTagName('body'),
- actual = func(nodeList);
- } catch(e) {}
-
- deepEqual(actual, [body]);
- }
- else {
- skipTest();
- }
- });
- });
-
- /*--------------------------------------------------------------------------*/
-
QUnit.module('lodash.times');
(function() {
@@ -13081,6 +13021,121 @@
/*--------------------------------------------------------------------------*/
+ QUnit.module('lodash.toArray');
+
+ (function() {
+ test('should return the values of objects', 1, function() {
+ var array = [1, 2, 3],
+ object = { 'a': 1, 'b': 2, 'c': 3 };
+
+ deepEqual(_.toArray(object), array);
+ });
+
+ test('should work with a string for `collection` (test in Opera < 10.52)', 2, function() {
+ deepEqual(_.toArray('abc'), ['a', 'b', 'c']);
+ deepEqual(_.toArray(Object('abc')), ['a', 'b', 'c']);
+ });
+ }());
+
+ /*--------------------------------------------------------------------------*/
+
+ QUnit.module('lodash.slice and lodash.toArray');
+
+ _.each(['slice', 'toArray'], function(methodName) {
+ var args = (function() { return arguments; }(1, 2, 3)),
+ array = [1, 2, 3],
+ func = _[methodName];
+
+ test('should return a dense array', 3, function() {
+ var sparse = Array(3);
+ sparse[1] = 2;
+
+ var actual = func(sparse);
+
+ ok('0' in actual);
+ ok('2' in actual);
+ deepEqual(actual, sparse);
+ });
+
+ test('should treat array-like objects like arrays', 2, function() {
+ var object = { '0': 'a', '1': 'b', '2': 'c', 'length': 3 };
+ deepEqual(func(object), ['a', 'b', 'c']);
+ deepEqual(func(args), array);
+ });
+
+ test('should return a shallow clone of arrays', 2, function() {
+ var actual = func(array);
+ notStrictEqual(actual, array);
+ deepEqual(func(array), array);
+ });
+
+ test('should work with a node list for `collection` (test in IE < 9)', 1, function() {
+ if (document) {
+ try {
+ var nodeList = document.getElementsByTagName('body'),
+ actual = func(nodeList);
+ } catch(e) {}
+
+ deepEqual(actual, [body]);
+ }
+ else {
+ skipTest();
+ }
+ });
+ });
+
+ /*--------------------------------------------------------------------------*/
+
+ QUnit.module('lodash.toPlainObject');
+
+ (function() {
+ var args = arguments;
+
+ test('should flatten inherited properties', 1, function() {
+ function Foo() { this.b = 2; }
+ Foo.prototype.c = 3;
+
+ var actual = _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
+ deepEqual(actual, { 'a': 1, 'b': 2, 'c': 3 });
+ });
+
+ test('should convert `arguments` objects to plain objects', 1, function() {
+ var actual = _.toPlainObject(args),
+ expected = { '0': 1, '1': 2, '2': 3, 'length': 3 };
+
+ deepEqual(actual, expected);
+ });
+
+ test('should convert arrays to plain objects', 1, function() {
+ var actual = _.toPlainObject(['a', 'b', 'c']),
+ expected = { '0': 'a', '1': 'b', '2': 'c', 'length': 3 };
+
+ deepEqual(actual, expected);
+ });
+
+ test('should convert typed arrays to plain objects', 1, function() {
+ var object1 = { '0': 0, '1': 0, '2': 0, 'length': 3 },
+ object2 = { '0': 0, '1': 0, '2': 0, '3': 0, '4': 0, '5': 0, 'length': 6 },
+ object3 = { '0': 0, '1': 0, '2': 0, '3': 0, '4': 0, '5': 0, '6': 0, '7': 0, '8': 0, '9': 0, '10': 0, '11': 0, 'length': 12 },
+ object4 = { '0': 0, '1': 0, '2': 0, '3': 0, '4': 0, '5': 0, '6': 0, '7': 0, '8': 0, '9': 0, '10': 0, '11': 0, '12': 0, '13': 0, '14': 0, '15': 0, '16': 0, '17': 0, '18': 0, '19': 0, '20': 0, '21': 0, '22': 0, '23': 0, 'length': 24 };
+
+ var objects = [object2, object1, object4, object3, object2, object4, object4, object3, object2];
+
+ var expected = _.map(typedArrays, function(type, index) {
+ return toString.call(root[type]) == funcTag && objects[index];
+ });
+
+ var actual = _.map(typedArrays, function(type) {
+ var Ctor = root[type];
+ return Ctor ? _.toPlainObject(new Ctor(new ArrayBuffer(24))) : false;
+ });
+
+ deepEqual(actual, expected);
+ });
+ }(1, 2, 3));
+
+ /*--------------------------------------------------------------------------*/
+
QUnit.module('lodash.transform');
(function() {
@@ -13255,8 +13310,7 @@
if (result === object) {
return false;
}
- if (typeof object.length == 'number' &&
- !_.isArray(object) && !_.isFunction(object) && !_.isString(object)) {
+ if (_.isTypedArray(object)) {
return result instanceof Array;
}
return result instanceof Ctor || !(new Ctor instanceof Ctor);