"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "test/test-fp.js" between
lodash-4.0.0.tar.gz and lodash-4.17.21.tar.gz

About: lodash is a modern JavaScript utility library delivering modularity, performance, & extras. Tagged version.

test-fp.js  (lodash-4.0.0):test-fp.js  (lodash-4.17.21)
;(function() { ;(function() {
'use strict';
/** Used as a safe reference for `undefined` in pre-ES5 environments. */ /** Used as a safe reference for `undefined` in pre-ES5 environments. */
var undefined; var undefined;
/** Used as the size to cover large array optimizations. */ /** Used as the size to cover large array optimizations. */
var LARGE_ARRAY_SIZE = 200; var LARGE_ARRAY_SIZE = 200;
/** Used as a reference to the global object. */ /** Used as a reference to the global object. */
var root = (typeof global == 'object' && global) || this; var root = (typeof global == 'object' && global) || this;
/** Used for native method references. */ /** Used for native method references. */
var arrayProto = Array.prototype; var arrayProto = Array.prototype;
/** Method and object shortcuts. */ /** Method and object shortcuts. */
var phantom = root.phantom, var phantom = root.phantom,
amd = root.define && define.amd, argv = root.process && process.argv,
document = !phantom && root.document, document = !phantom && root.document,
noop = function() {},
slice = arrayProto.slice, slice = arrayProto.slice,
WeakMap = root.WeakMap; WeakMap = root.WeakMap;
/** Math helpers. */
var add = function(x, y) { return x + y; },
isEven = function(n) { return n % 2 == 0; },
isEvenIndex = function(n, index) { return isEven(index); },
square = function(n) { return n * n; };
// Leak to avoid sporadic `noglobals` fails on Edge in Sauce Labs.
root.msWDfn = undefined;
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
/** Use a single "load" function. */ /** Load QUnit and extras. */
var load = (!amd && typeof require == 'function') var QUnit = root.QUnit || require('qunit-extras');
? require
: noop; /** Load stable Lodash. */
var _ = root._ || require('../lodash.js');
/** The unit testing framework. */
var QUnit = root.QUnit || (root.QUnit = (
QUnit = load('../node_modules/qunitjs/qunit/qunit.js') || root.QUnit,
QUnit = QUnit.QUnit || QUnit
));
/** Load stable Lodash and QUnit Extras. */
var _ = root._ || load('../lodash.js');
if (_) {
_ = _.runInContext(root);
}
var QUnitExtras = load('../node_modules/qunit-extras/qunit-extras.js');
if (QUnitExtras) {
QUnitExtras.runInContext(root);
}
var convert = root.fp || load('../lib/fp/convert.js'), var convert = (function() {
mapping = root.mapping || load('../lib/fp/mapping.js'), var baseConvert = root.fp || require('../fp/_baseConvert.js');
fp = convert(_.runInContext()); if (!root.fp) {
return function(name, func, options) {
return baseConvert(_, name, func, options);
};
}
return function(name, func, options) {
if (typeof name == 'function') {
options = func;
func = name;
name = undefined;
}
return name === undefined
? baseConvert(func, options)
: baseConvert(_.runInContext(), options)[name];
};
}());
var allFalseOptions = {
'cap': false,
'curry': false,
'fixed': false,
'immutable': false,
'rearg': false
};
var fp = root.fp
? (fp = _.noConflict(), _ = root._, fp)
: convert(_.runInContext());
var mapping = root.mapping || require('../fp/_mapping.js');
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
/** /**
* Skips a given number of tests with a passing result. * Skips a given number of tests with a passing result.
* *
* @private * @private
* @param {Object} assert The QUnit assert object. * @param {Object} assert The QUnit assert object.
* @param {number} [count=1] The number of tests to skip. * @param {number} [count=1] The number of tests to skip.
*/ */
function skipTest(assert, count) { function skipAssert(assert, count) {
count || (count = 1); count || (count = 1);
while (count--) { while (count--) {
assert.ok(true, 'test skipped'); assert.ok(true, 'test skipped');
} }
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
if (argv) {
console.log('Running lodash/fp tests.');
}
QUnit.module('convert module');
(function() {
QUnit.test('should work with `name` and `func`', function(assert) {
assert.expect(2);
var array = [1, 2, 3, 4],
remove = convert('remove', _.remove),
actual = remove(isEven)(array);
assert.deepEqual(array, [1, 2, 3, 4]);
assert.deepEqual(actual, [1, 3]);
});
QUnit.test('should work with `name`, `func`, and `options`', function(assert
) {
assert.expect(3);
var array = [1, 2, 3, 4],
remove = convert('remove', _.remove, allFalseOptions);
var actual = remove(array, function(n, index) {
return isEven(index);
});
assert.deepEqual(array, [2, 4]);
assert.deepEqual(actual, [1, 3]);
assert.deepEqual(remove(), []);
});
QUnit.test('should work with an object', function(assert) {
assert.expect(2);
if (!document) {
var array = [1, 2, 3, 4],
lodash = convert({ 'remove': _.remove }),
actual = lodash.remove(isEven)(array);
assert.deepEqual(array, [1, 2, 3, 4]);
assert.deepEqual(actual, [1, 3]);
}
else {
skipAssert(assert, 2);
}
});
QUnit.test('should work with an object and `options`', function(assert) {
assert.expect(3);
if (!document) {
var array = [1, 2, 3, 4],
lodash = convert({ 'remove': _.remove }, allFalseOptions),
actual = lodash.remove(array, isEvenIndex);
assert.deepEqual(array, [2, 4]);
assert.deepEqual(actual, [1, 3]);
assert.deepEqual(lodash.remove(), []);
}
else {
skipAssert(assert, 3);
}
});
QUnit.test('should work with lodash and `options`', function(assert) {
assert.expect(3);
var array = [1, 2, 3, 4],
lodash = convert(_.runInContext(), allFalseOptions),
actual = lodash.remove(array, isEvenIndex);
assert.deepEqual(array, [2, 4]);
assert.deepEqual(actual, [1, 3]);
assert.deepEqual(lodash.remove(), []);
});
QUnit.test('should work with `runInContext` and `options`', function(assert)
{
assert.expect(3);
var array = [1, 2, 3, 4],
runInContext = convert('runInContext', _.runInContext, allFalseOptions
),
lodash = runInContext(),
actual = lodash.remove(array, isEvenIndex);
assert.deepEqual(array, [2, 4]);
assert.deepEqual(actual, [1, 3]);
assert.deepEqual(lodash.remove(), []);
});
QUnit.test('should accept a variety of options', function(assert) {
assert.expect(8);
var array = [1, 2, 3, 4],
value = _.clone(array),
remove = convert('remove', _.remove, { 'cap': false }),
actual = remove(isEvenIndex)(value);
assert.deepEqual(value, [1, 2, 3, 4]);
assert.deepEqual(actual, [2, 4]);
remove = convert('remove', _.remove, { 'curry': false });
actual = remove(isEven);
assert.deepEqual(actual, []);
var trim = convert('trim', _.trim, { 'fixed': false });
assert.strictEqual(trim('_-abc-_', '_-'), 'abc');
value = _.clone(array);
remove = convert('remove', _.remove, { 'immutable': false });
actual = remove(isEven)(value);
assert.deepEqual(value, [1, 3]);
assert.deepEqual(actual, [2, 4]);
value = _.clone(array);
remove = convert('remove', _.remove, { 'rearg': false });
actual = remove(value)(isEven);
assert.deepEqual(value, [1, 2, 3, 4]);
assert.deepEqual(actual, [1, 3]);
});
QUnit.test('should respect the `cap` option', function(assert) {
assert.expect(1);
var iteratee = convert('iteratee', _.iteratee, { 'cap': false });
var func = iteratee(function(a, b, c) {
return [a, b, c];
}, 3);
assert.deepEqual(func(1, 2, 3), [1, 2, 3]);
});
QUnit.test('should respect the `rearg` option', function(assert) {
assert.expect(1);
var add = convert('add', _.add, { 'rearg': true });
assert.strictEqual(add('2')('1'), '12');
});
QUnit.test('should add a `placeholder` property', function(assert) {
assert.expect(2);
if (!document) {
var lodash = convert({ 'add': _.add });
assert.strictEqual(lodash.placeholder, lodash);
assert.strictEqual(lodash.add.placeholder, lodash);
}
else {
skipAssert(assert, 2);
}
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('method.convert');
(function() {
QUnit.test('should exist on unconverted methods', function(assert) {
assert.expect(2);
var array = [],
isArray = fp.isArray.convert({ 'curry': true });
assert.strictEqual(fp.isArray(array), true);
assert.strictEqual(isArray()(array), true);
});
QUnit.test('should convert method aliases', function(assert) {
assert.expect(1);
var all = fp.all.convert({ 'rearg': false }),
actual = all([0])(_.identity);
assert.strictEqual(actual, false);
});
QUnit.test('should convert remapped methods', function(assert) {
assert.expect(1);
var extendAll = fp.extendAll.convert({ 'immutable': false }),
object = {};
extendAll([object, { 'a': 1 }, { 'b': 2 }]);
assert.deepEqual(object, { 'a': 1, 'b': 2 });
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('convert methods');
_.each(['fp.convert', 'method.convert'], function(methodName) {
var isFp = methodName == 'fp.convert',
func = isFp ? fp.convert : fp.remove.convert;
QUnit.test('`' + methodName + '` should work with an object', function(asser
t) {
assert.expect(3);
var array = [1, 2, 3, 4],
lodash = func(allFalseOptions),
remove = isFp ? lodash.remove : lodash,
actual = remove(array, isEvenIndex);
assert.deepEqual(array, [2, 4]);
assert.deepEqual(actual, [1, 3]);
assert.deepEqual(remove(), []);
});
QUnit.test('`' + methodName + '` should extend existing configs', function(a
ssert) {
assert.expect(2);
var array = [1, 2, 3, 4],
lodash = func({ 'cap': false }),
remove = (isFp ? lodash.remove : lodash).convert({ 'rearg': false }),
actual = remove(array)(isEvenIndex);
assert.deepEqual(array, [1, 2, 3, 4]);
assert.deepEqual(actual, [2, 4]);
});
});
/*--------------------------------------------------------------------------*/
QUnit.module('method arity checks');
(function() {
QUnit.test('should wrap methods with an arity > `1`', function(assert) {
assert.expect(1);
var methodNames = _.filter(_.functions(fp), function(methodName) {
return fp[methodName].length > 1;
});
assert.deepEqual(methodNames, []);
});
QUnit.test('should have >= arity of `aryMethod` designation', function(asser
t) {
assert.expect(4);
_.times(4, function(index) {
var aryCap = index + 1;
var methodNames = _.filter(mapping.aryMethod[aryCap], function(methodNam
e) {
var key = _.get(mapping.remap, methodName, methodName),
arity = _[key].length;
return arity != 0 && arity < aryCap;
});
assert.deepEqual(methodNames, [], '`aryMethod[' + aryCap + ']`');
});
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('method aliases'); QUnit.module('method aliases');
(function() { (function() {
QUnit.test('should have correct aliases', function(assert) { QUnit.test('should have correct aliases', function(assert) {
assert.expect(1); assert.expect(1);
var actual = _.transform(mapping.aliasMap, function(result, aliases, metho var actual = _.transform(mapping.aliasToReal, function(result, realName, a
dName) { lias) {
var func = fp[methodName]; result.push([alias, fp[alias] === fp[realName]]);
_.each(aliases, function(alias) {
result.push([alias, fp[alias] === func]);
});
}, []); }, []);
assert.deepEqual(_.reject(actual, 1), []); assert.deepEqual(_.reject(actual, 1), []);
}); });
}()); }());
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('method ary caps'); QUnit.module('method ary caps');
(function() { (function() {
QUnit.test('should have a cap of 1', function(assert) { QUnit.test('should have a cap of 1', function(assert) {
assert.expect(1); assert.expect(1);
var funcMethods = [ var funcMethods = [
'curry', 'iteratee', 'memoize', 'over', 'overEvery', 'overSome', 'curry', 'iteratee', 'memoize', 'over', 'overEvery', 'overSome',
'method', 'methodOf', 'restParam', 'runInContext' 'method', 'methodOf', 'rest', 'runInContext'
]; ];
var exceptions = funcMethods.concat('mixin', 'template'), var exceptions = funcMethods.concat('mixin', 'nthArg', 'template'),
expected = _.map(mapping.aryMethodMap[1], _.constant(true)); expected = _.map(mapping.aryMethod[1], _.constant(true));
var actual = _.map(mapping.aryMethodMap[1], function(methodName) { var actual = _.map(mapping.aryMethod[1], function(methodName) {
var arg = _.includes(funcMethods, methodName) ? _.noop : 1, var arg = _.includes(funcMethods, methodName) ? _.noop : 1,
result = _.attempt(function() { return fp[methodName](arg); }); result = _.attempt(function() { return fp[methodName](arg); });
if (_.includes(exceptions, methodName) if (_.includes(exceptions, methodName)
? typeof result == 'function' ? typeof result == 'function'
: typeof result != 'function' : typeof result != 'function'
) { ) {
return true; return true;
} }
console.log(methodName, result); console.log(methodName, result);
return false; return false;
}); });
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
QUnit.test('should have a cap of 2', function(assert) { QUnit.test('should have a cap of 2', function(assert) {
assert.expect(1); assert.expect(1);
var funcMethods = [ var funcMethods = [
'after', 'ary', 'before', 'bind', 'bindKey', 'cloneDeepWith', 'cloneWith 'after', 'ary', 'before', 'bind', 'bindKey', 'curryN', 'debounce',
', 'delay', 'overArgs', 'partial', 'partialRight', 'rearg', 'throttle',
'curryN', 'debounce', 'delay', 'overArgs', 'rearg', 'throttle', 'wrap' 'wrap'
]; ];
var exceptions = _.difference(funcMethods.concat('matchesProperty'), ['clo var exceptions = _.without(funcMethods.concat('matchesProperty'), 'delay')
neDeepWith', 'cloneWith', 'delay']), ,
expected = _.map(mapping.aryMethodMap[2], _.constant(true)); expected = _.map(mapping.aryMethod[2], _.constant(true));
var actual = _.map(mapping.aryMethodMap[2], function(methodName) { var actual = _.map(mapping.aryMethod[2], function(methodName) {
var args = _.includes(funcMethods, methodName) ? [methodName == 'curryN' ? 1 : _.noop, _.noop] : [1, []], var args = _.includes(funcMethods, methodName) ? [methodName == 'curryN' ? 1 : _.noop, _.noop] : [1, []],
result = _.attempt(function() { return fp[methodName](args[0])(args[ 1]); }); result = _.attempt(function() { return fp[methodName](args[0])(args[ 1]); });
if (_.includes(exceptions, methodName) if (_.includes(exceptions, methodName)
? typeof result == 'function' ? typeof result == 'function'
: typeof result != 'function' : typeof result != 'function'
) { ) {
return true; return true;
} }
console.log(methodName, result); console.log(methodName, result);
return false; return false;
}); });
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
QUnit.test('should have a cap of 3', function(assert) { QUnit.test('should have a cap of 3', function(assert) {
assert.expect(1); assert.expect(1);
var funcMethods = [ var funcMethods = [
'assignWith', 'extendWith', 'isEqualWith', 'isMatchWith', 'omitBy', 'assignWith', 'extendWith', 'isEqualWith', 'isMatchWith', 'reduce',
'pickBy', 'reduce', 'reduceRight', 'transform', 'zipWith' 'reduceRight', 'transform', 'zipWith'
]; ];
var expected = _.map(mapping.aryMethodMap[3], _.constant(true)); var expected = _.map(mapping.aryMethod[3], _.constant(true));
var actual = _.map(mapping.aryMethodMap[3], function(methodName) { var actual = _.map(mapping.aryMethod[3], function(methodName) {
var args = _.includes(funcMethods, methodName) ? [_.noop, 0, 1] : [0, 1, []], var args = _.includes(funcMethods, methodName) ? [_.noop, 0, 1] : [0, 1, []],
result = _.attempt(function() { return fp[methodName](args[0])(args[ 1])(args[2]); }); result = _.attempt(function() { return fp[methodName](args[0])(args[ 1])(args[2]); });
if (typeof result != 'function') { if (typeof result != 'function') {
return true; return true;
} }
console.log(methodName, result); console.log(methodName, result);
return false; return false;
}); });
skipping to change at line 180 skipping to change at line 465
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('methods that use `indexOf`'); QUnit.module('methods that use `indexOf`');
(function() { (function() {
QUnit.test('should work with `fp.indexOf`', function(assert) { QUnit.test('should work with `fp.indexOf`', function(assert) {
assert.expect(10); assert.expect(10);
var array = ['a', 'b', 'c'], var array = ['a', 'b', 'c'],
other = ['b', 'b', 'd'], other = ['b', 'd', 'b'],
object = { 'a': 1, 'b': 2, 'c': 2 }, object = { 'a': 1, 'b': 2, 'c': 2 },
actual = fp.difference(array, other); actual = fp.difference(array)(other);
assert.deepEqual(actual, ['a', 'c'], 'fp.difference'); assert.deepEqual(actual, ['a', 'c'], 'fp.difference');
actual = fp.includes('b', array); actual = fp.includes('b')(array);
assert.strictEqual(actual, true, 'fp.includes'); assert.strictEqual(actual, true, 'fp.includes');
actual = fp.intersection(other, array); actual = fp.intersection(other)(array);
assert.deepEqual(actual, ['b'], 'fp.intersection'); assert.deepEqual(actual, ['b'], 'fp.intersection');
actual = fp.omit(other, object); actual = fp.omit(other)(object);
assert.deepEqual(actual, { 'a': 1, 'c': 2 }, 'fp.omit'); assert.deepEqual(actual, { 'a': 1, 'c': 2 }, 'fp.omit');
actual = fp.union(other, array); actual = fp.union(other)(array);
assert.deepEqual(actual, ['a', 'b', 'c', 'd'], 'fp.union'); assert.deepEqual(actual, ['a', 'b', 'c', 'd'], 'fp.union');
actual = fp.uniq(other); actual = fp.uniq(other);
assert.deepEqual(actual, ['b', 'd'], 'fp.uniq'); assert.deepEqual(actual, ['b', 'd'], 'fp.uniq');
actual = fp.uniqBy(_.identity, other); actual = fp.uniqBy(_.identity, other);
assert.deepEqual(actual, ['b', 'd'], 'fp.uniqBy'); assert.deepEqual(actual, ['b', 'd'], 'fp.uniqBy');
actual = fp.without('b', array); actual = fp.without(other)(array);
assert.deepEqual(actual, ['a', 'c'], 'fp.without'); assert.deepEqual(actual, ['a', 'c'], 'fp.without');
actual = fp.xor(other, array); actual = fp.xor(other)(array);
assert.deepEqual(actual, ['a', 'c', 'd'], 'fp.xor'); assert.deepEqual(actual, ['a', 'c', 'd'], 'fp.xor');
actual = fp.pull('b', array); actual = fp.pull('b')(array);
assert.deepEqual(actual, ['a', 'c'], 'fp.pull'); assert.deepEqual(actual, ['a', 'c'], 'fp.pull');
}); });
}()); }());
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('cherry-picked methods'); QUnit.module('cherry-picked methods');
(function() { (function() {
QUnit.test('should provide the correct `iteratee` arguments', function(asser t) { QUnit.test('should provide the correct `iteratee` arguments', function(asser t) {
assert.expect(4); assert.expect(4);
if (!document) { var args,
var args, array = [1, 2, 3],
array = [1, 2, 3], object = { 'a': 1, 'b': 2 },
object = { 'a': 1, 'b': 2 }, isFIFO = _.keys(object)[0] == 'a',
isFIFO = _.keys(object)[0] == 'a', map = convert('map', _.map),
map = convert('map', _.map), reduce = convert('reduce', _.reduce);
reduce = convert('reduce', _.reduce);
map(function() {
args || (args = slice.call(arguments));
})(array);
assert.deepEqual(args, [1]);
args = undefined;
map(function() {
args || (args = slice.call(arguments));
})(object);
assert.deepEqual(args, isFIFO ? [1] : [2]);
args = undefined;
reduce(function() {
args || (args = slice.call(arguments));
})(0, array);
assert.deepEqual(args, [0, 1]);
args = undefined;
reduce(function() {
args || (args = slice.call(arguments));
})(0, object);
assert.deepEqual(args, isFIFO ? [0, 1] : [0, 2]); map(function() {
} args || (args = slice.call(arguments));
else { })(array);
skipTest(assert, 4);
} assert.deepEqual(args, [1]);
args = undefined;
map(function() {
args || (args = slice.call(arguments));
})(object);
assert.deepEqual(args, isFIFO ? [1] : [2]);
args = undefined;
reduce(function() {
args || (args = slice.call(arguments));
})(0)(array);
assert.deepEqual(args, [0, 1]);
args = undefined;
reduce(function() {
args || (args = slice.call(arguments));
})(0)(object);
assert.deepEqual(args, isFIFO ? [0, 1] : [0, 2]);
}); });
QUnit.test('should not support shortcut fusion', function(assert) { QUnit.test('should not support shortcut fusion', function(assert) {
assert.expect(3); assert.expect(3);
if (!document) { var array = fp.range(0, LARGE_ARRAY_SIZE),
var array = fp.range(0, LARGE_ARRAY_SIZE), filterCount = 0,
filterCount = 0, mapCount = 0;
mapCount = 0;
var iteratee = function(value) {
var iteratee = function(value) { mapCount++;
mapCount++; return value * value;
return value * value; };
};
var predicate = function(value) {
var predicate = function(value) { filterCount++;
filterCount++; return isEven(value);
return value % 2 == 0; };
};
var map1 = convert('map', _.map),
var map1 = convert('map', _.map), filter1 = convert('filter', _.filter),
filter1 = convert('filter', _.filter), take1 = convert('take', _.take);
take1 = convert('take', _.take);
var filter2 = filter1(predicate),
var filter2 = filter1(predicate), map2 = map1(iteratee),
map2 = map1(iteratee), take2 = take1(2);
take2 = take1(2);
var combined = fp.flow(map2, filter2, fp.compact, take2);
var combined = fp.flow(map2, filter2, fp.compact, take2);
assert.deepEqual(combined(array), [4, 16]);
assert.deepEqual(combined(array), [4, 16]); assert.strictEqual(filterCount, 200, 'filterCount');
assert.strictEqual(filterCount, 200, 'filterCount'); assert.strictEqual(mapCount, 200, 'mapCount');
assert.strictEqual(mapCount, 200, 'mapCount'); });
} }());
else {
skipTest(assert, 3); /*--------------------------------------------------------------------------*/
}
QUnit.module('iteratee shorthands');
(function() {
var objects = [{ 'a': 1, 'b': 2 }, { 'a': 3, 'b': 4 }];
QUnit.test('should work with "_.matches" shorthands', function(assert) {
assert.expect(1);
assert.deepEqual(fp.filter({ 'a': 3 })(objects), [objects[1]]);
});
QUnit.test('should work with "_.matchesProperty" shorthands', function(asser
t) {
assert.expect(1);
assert.deepEqual(fp.filter(['a', 3])(objects), [objects[1]]);
});
QUnit.test('should work with "_.property" shorthands', function(assert) {
assert.expect(1);
assert.deepEqual(fp.map('a')(objects), [1, 3]);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('placeholder methods');
(function() {
QUnit.test('should use `fp` as the default placeholder', function(assert) {
assert.expect(3);
var actual = fp.add(fp, 'b')('a');
assert.strictEqual(actual, 'ab');
actual = fp.fill(fp, 2)(1, '*')([1, 2, 3]);
assert.deepEqual(actual, [1, '*', 3]);
actual = fp.slice(fp, 2)(1)(['a', 'b', 'c']);
assert.deepEqual(actual, ['b']);
});
QUnit.test('should support `fp.placeholder`', function(assert) {
assert.expect(6);
_.each([[], fp.__], function(ph) {
fp.placeholder = ph;
var actual = fp.add(ph, 'b')('a');
assert.strictEqual(actual, 'ab');
actual = fp.fill(ph, 2)(1, '*')([1, 2, 3]);
assert.deepEqual(actual, [1, '*', 3]);
actual = fp.slice(ph, 2)(1)(['a', 'b', 'c']);
assert.deepEqual(actual, ['b']);
});
});
var methodNames = [
'bind',
'bindKey',
'curry',
'curryRight',
'partial',
'partialRight'
];
_.each(methodNames, function(methodName) {
var func = fp[methodName];
QUnit.test('fp.' + methodName + '` should have a `placeholder` property',
function(assert) {
assert.expect(2);
assert.ok(_.isObject(func.placeholder));
assert.strictEqual(func.placeholder, fp.__);
});
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('setter methods');
(function() {
QUnit.test('should only clone objects in `path`', function(assert) {
assert.expect(11);
var object = { 'a': { 'b': 2, 'c': 3 }, 'd': { 'e': 4 } },
value = _.cloneDeep(object),
actual = fp.set('a.b.c.d', 5, value);
assert.ok(_.isObject(actual.a.b), 'fp.set');
assert.ok(_.isNumber(actual.a.b), 'fp.set');
assert.strictEqual(actual.a.b.c.d, 5, 'fp.set');
assert.strictEqual(actual.d, value.d, 'fp.set');
value = _.cloneDeep(object);
actual = fp.setWith(Object)('[0][1]')('a')(value);
assert.deepEqual(actual[0], { '1': 'a' }, 'fp.setWith');
value = _.cloneDeep(object);
actual = fp.unset('a.b')(value);
assert.notOk('b' in actual.a, 'fp.unset');
assert.strictEqual(actual.a.c, value.a.c, 'fp.unset');
value = _.cloneDeep(object);
actual = fp.update('a.b')(square)(value);
assert.strictEqual(actual.a.b, 4, 'fp.update');
assert.strictEqual(actual.d, value.d, 'fp.update');
value = _.cloneDeep(object);
actual = fp.updateWith(Object)('[0][1]')(_.constant('a'))(value);
assert.deepEqual(actual[0], { '1': 'a' }, 'fp.updateWith');
assert.strictEqual(actual.d, value.d, 'fp.updateWith');
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.add and fp.subtract');
_.each(['add', 'subtract'], function(methodName) {
var func = fp[methodName],
isAdd = methodName == 'add';
QUnit.test('`fp.' + methodName + '` should not have `rearg` applied', functi
on(assert) {
assert.expect(1);
assert.strictEqual(func('1')('2'), isAdd ? '12' : -1);
});
});
/*--------------------------------------------------------------------------*/
QUnit.module('object assignments');
_.each(['assign', 'assignIn', 'defaults', 'defaultsDeep', 'merge'], function(m
ethodName) {
var func = fp[methodName];
QUnit.test('`fp.' + methodName + '` should not mutate values', function(asse
rt) {
assert.expect(2);
var object = { 'a': 1 },
actual = func(object)({ 'b': 2 });
assert.deepEqual(object, { 'a': 1 });
assert.deepEqual(actual, { 'a': 1, 'b': 2 });
});
});
_.each(['assignAll', 'assignInAll', 'defaultsAll', 'defaultsDeepAll', 'mergeAl
l'], function(methodName) {
var func = fp[methodName];
QUnit.test('`fp.' + methodName + '` should not mutate values', function(asse
rt) {
assert.expect(2);
var objects = [{ 'a': 1 }, { 'b': 2 }],
actual = func(objects);
assert.deepEqual(objects[0], { 'a': 1 });
assert.deepEqual(actual, { 'a': 1, 'b': 2 });
});
});
_.each(['assignWith', 'assignInWith', 'extendWith'], function(methodName) {
var func = fp[methodName];
QUnit.test('`fp.' + methodName + '` should provide the correct `customizer`
arguments', function(assert) {
assert.expect(1);
var args;
func(function() {
args || (args = _.map(arguments, _.cloneDeep));
})({ 'a': 1 })({ 'b': 2 });
assert.deepEqual(args, [undefined, 2, 'b', { 'a': 1 }, { 'b': 2 }]);
});
});
_.each(['assignAllWith', 'assignInAllWith', 'extendAllWith', 'mergeAllWith'],
function(methodName) {
var func = fp[methodName];
QUnit.test('`fp.' + methodName + '` should not mutate values', function(asse
rt) {
assert.expect(2);
var objects = [{ 'a': 1 }, { 'b': 2 }],
actual = func(_.noop)(objects);
assert.deepEqual(objects[0], { 'a': 1 });
assert.deepEqual(actual, { 'a': 1, 'b': 2 });
});
QUnit.test('`fp.' + methodName + '` should work with more than two sources',
function(assert) {
assert.expect(2);
var pass = false,
objects = [{ 'a': 1 }, { 'b': 2 }, { 'c': 3 }],
actual = func(function() { pass = true; })(objects);
assert.ok(pass);
assert.deepEqual(actual, { 'a': 1, 'b': 2, 'c': 3 });
});
});
/*--------------------------------------------------------------------------*/
QUnit.module('fp.castArray');
(function() {
QUnit.test('should shallow clone array values', function(assert) {
assert.expect(2);
var array = [1],
actual = fp.castArray(array);
assert.deepEqual(actual, array);
assert.notStrictEqual(actual, array);
});
QUnit.test('should not shallow clone non-array values', function(assert) {
assert.expect(2);
var object = { 'a': 1 },
actual = fp.castArray(object);
assert.deepEqual(actual, [object]);
assert.strictEqual(actual[0], object);
});
QUnit.test('should convert by name', function(assert) {
assert.expect(4);
var array = [1],
object = { 'a': 1 },
castArray = convert('castArray', _.castArray),
actual = castArray(array);
assert.deepEqual(actual, array);
assert.notStrictEqual(actual, array);
actual = castArray(object);
assert.deepEqual(actual, [object]);
assert.strictEqual(actual[0], object);
}); });
}()); }());
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('curry methods'); QUnit.module('curry methods');
_.each(['curry', 'curryRight'], function(methodName) { _.each(['curry', 'curryRight'], function(methodName) {
var func = fp[methodName]; var func = fp[methodName];
QUnit.test('`_.' + methodName + '` should only accept a `func` param', funct ion(assert) { QUnit.test('fp.' + methodName + '` should only accept a `func` param', funct ion(assert) {
assert.expect(1); assert.expect(1);
assert.raises(function() { func(1, _.noop); }, TypeError); assert.raises(function() { func(1, _.noop); }, TypeError);
}); });
}); });
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('curryN methods'); QUnit.module('curryN methods');
_.each(['curryN', 'curryRightN'], function(methodName) { _.each(['curryN', 'curryRightN'], function(methodName) {
var func = fp[methodName]; var func = fp[methodName];
QUnit.test('`_.' + methodName + '` accept an `arity` param', function(assert ) { QUnit.test('fp.' + methodName + '` should accept an `arity` param', function (assert) {
assert.expect(1); assert.expect(1);
var actual = func(1, function(a, b) { return [a, b]; })('a'); var actual = func(1)(function(a, b) { return [a, b]; })('a');
assert.deepEqual(actual, ['a', undefined]); assert.deepEqual(actual, ['a', undefined]);
}); });
}); });
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('fp.defaultTo');
(function() {
QUnit.test('should have an argument order of `defaultValue` then `value`', f
unction(assert) {
assert.expect(2);
assert.strictEqual(fp.defaultTo(1)(0), 0);
assert.strictEqual(fp.defaultTo(1)(undefined), 1);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.difference'); QUnit.module('fp.difference');
(function() { (function() {
QUnit.test('should return the elements of the first array not included in th e second array', function(assert) { QUnit.test('should return the elements of the first array not included in th e second array', function(assert) {
assert.expect(1); assert.expect(1);
assert.deepEqual(fp.difference([1, 2])([2, 3]), [1]); var actual = fp.difference([2, 1], [2, 3]);
assert.deepEqual(actual, [1]);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.differenceBy');
(function() {
QUnit.test('should have an argument order of `iteratee`, `array`, then `valu
es`', function(assert) {
assert.expect(1);
var actual = fp.differenceBy(Math.floor, [2.1, 1.2], [2.3, 3.4]);
assert.deepEqual(actual, [1.2]);
});
QUnit.test('should provide the correct `iteratee` arguments', function(asser
t) {
assert.expect(1);
var args;
fp.differenceBy(function() {
args || (args = slice.call(arguments));
})([2.1, 1.2], [2.3, 3.4]);
assert.deepEqual(args, [2.3]);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.differenceWith');
(function() {
QUnit.test('should have an argument order of `comparator`, `array`, then `va
lues`', function(assert) {
assert.expect(1);
var actual = fp.differenceWith(fp.eq)([2, 1])([2, 3]);
assert.deepEqual(actual, [1]);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.divide and fp.multiply');
_.each(['divide', 'multiply'], function(methodName) {
var func = fp[methodName],
isDivide = methodName == 'divide';
QUnit.test('`fp.' + methodName + '` should not have `rearg` applied', functi
on(assert) {
assert.expect(1);
assert.strictEqual(func('2')('4'), isDivide ? 0.5 : 8);
});
});
/*--------------------------------------------------------------------------*/
QUnit.module('fp.extend');
(function() {
QUnit.test('should convert by name', function(assert) {
assert.expect(2);
function Foo() {}
Foo.prototype = { 'b': 2 };
var object = { 'a': 1 },
extend = convert('extend', _.extend),
actual = extend(object)(new Foo);
assert.deepEqual(object, { 'a': 1 });
assert.deepEqual(actual, { 'a': 1, 'b': 2 });
}); });
}()); }());
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('fp.fill'); QUnit.module('fp.fill');
(function() { (function() {
QUnit.test('should have an argument order of `start`, `end`, then `value`', function(assert) { QUnit.test('should have an argument order of `start`, `end`, then `value`', function(assert) {
assert.expect(1); assert.expect(1);
var array = [1, 2, 3]; var array = [1, 2, 3];
assert.deepEqual(fp.fill(1)(2)('*')(array), [1, '*', 3]); assert.deepEqual(fp.fill(1)(2)('*')(array), [1, '*', 3]);
}); });
QUnit.test('should not mutate values', function(assert) {
assert.expect(2);
var array = [1, 2, 3],
actual = fp.fill(1)(2)('*')(array);
assert.deepEqual(array, [1, 2, 3]);
assert.deepEqual(actual, [1, '*', 3]);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.findFrom methods');
_.each(['findFrom', 'findIndexFrom', 'findLastFrom', 'findLastIndexFrom'], fun
ction(methodName) {
var func = fp[methodName];
QUnit.test('fp.' + methodName + '` should provide the correct `predicate` ar
guments', function(assert) {
assert.expect(1);
var args;
func(function() {
args || (args = slice.call(arguments));
})(1)([1, 2, 3]);
assert.deepEqual(args, [2]);
});
});
/*--------------------------------------------------------------------------*/
QUnit.module('fp.findFrom');
(function() {
function resolve(value) {
return fp.flow(fp.property('a'), fp.eq(value));
}
QUnit.test('should have an argument order of `value`, `fromIndex`, then `arr
ay`', function(assert) {
assert.expect(2);
var objects = [{ 'a': 1 }, { 'a': 2 }, { 'a': 1 }, { 'a': 2 }];
assert.strictEqual(fp.findFrom(resolve(1))(1)(objects), objects[2]);
assert.strictEqual(fp.findFrom(resolve(2))(-2)(objects), objects[3]);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.findLastFrom');
(function() {
function resolve(value) {
return fp.flow(fp.property('a'), fp.eq(value));
}
QUnit.test('should have an argument order of `value`, `fromIndex`, then `arr
ay`', function(assert) {
assert.expect(2);
var objects = [{ 'a': 1 }, { 'a': 2 }, { 'a': 1 }, { 'a': 2 }];
assert.strictEqual(fp.findLastFrom(resolve(1))(1)(objects), objects[0]);
assert.strictEqual(fp.findLastFrom(resolve(2))(-2)(objects), objects[1]);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.findIndexFrom and fp.indexOfFrom');
_.each(['findIndexFrom', 'indexOfFrom'], function(methodName) {
var func = fp[methodName],
resolve = methodName == 'findIndexFrom' ? fp.eq : _.identity;
QUnit.test('fp.' + methodName + '` should have an argument order of `value`,
`fromIndex`, then `array`', function(assert) {
assert.expect(2);
var array = [1, 2, 3, 1, 2, 3];
assert.strictEqual(func(resolve(1))(2)(array), 3);
assert.strictEqual(func(resolve(2))(-3)(array), 4);
});
});
/*--------------------------------------------------------------------------*/
QUnit.module('fp.findLastIndexFrom and fp.lastIndexOfFrom');
_.each(['findLastIndexFrom', 'lastIndexOfFrom'], function(methodName) {
var func = fp[methodName],
resolve = methodName == 'findLastIndexFrom' ? fp.eq : _.identity;
QUnit.test('fp.' + methodName + '` should have an argument order of `value`,
`fromIndex`, then `array`', function(assert) {
assert.expect(2);
var array = [1, 2, 3, 1, 2, 3];
assert.strictEqual(func(resolve(2))(3)(array), 1);
assert.strictEqual(func(resolve(3))(-3)(array), 2);
});
});
/*--------------------------------------------------------------------------*/
QUnit.module('fp.flatMapDepth');
(function() {
QUnit.test('should have an argument order of `iteratee`, `depth`, then `coll
ection`', function(assert) {
assert.expect(2);
function duplicate(n) {
return [[[n, n]]];
}
var array = [1, 2],
object = { 'a': 1, 'b': 2 },
expected = [[1, 1], [2, 2]];
assert.deepEqual(fp.flatMapDepth(duplicate)(2)(array), expected);
assert.deepEqual(fp.flatMapDepth(duplicate)(2)(object), expected);
});
}()); }());
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('fp.flow and fp.flowRight'); QUnit.module('flow methods');
_.each(['flow', 'flowRight'], function(methodName, index) { _.each(['flow', 'flowRight'], function(methodName) {
var func = fp[methodName], var func = fp[methodName],
isFlow = methodName == 'flow'; isFlow = methodName == 'flow';
QUnit.test('`fp.' + methodName + '` should support shortcut fusion', functio n(assert) { QUnit.test('`fp.' + methodName + '` should support shortcut fusion', functio n(assert) {
assert.expect(6); assert.expect(6);
var filterCount, var filterCount,
mapCount, mapCount,
array = fp.range(0, LARGE_ARRAY_SIZE); array = fp.range(0, LARGE_ARRAY_SIZE);
var iteratee = function(value) { var iteratee = function(value) {
mapCount++; mapCount++;
return value * value; return square(value);
}; };
var predicate = function(value) { var predicate = function(value) {
filterCount++; filterCount++;
return value % 2 == 0; return isEven(value);
}; };
var filter = fp.filter(predicate), var filter = fp.filter(predicate),
map = fp.map(iteratee), map = fp.map(iteratee),
take = fp.take(2); take = fp.take(2);
_.times(2, function(index) { _.times(2, function(index) {
var combined = isFlow var combined = isFlow
? func(map, filter, fp.compact, take) ? func(map, filter, fp.compact, take)
: func(take, fp.compact, filter, map); : func(take, fp.compact, filter, map);
filterCount = mapCount = 0; filterCount = mapCount = 0;
if (WeakMap && WeakMap.name) { if (WeakMap && WeakMap.name) {
assert.deepEqual(combined(array), [4, 16]); assert.deepEqual(combined(array), [4, 16]);
assert.strictEqual(filterCount, 5, 'filterCount'); assert.strictEqual(filterCount, 5, 'filterCount');
assert.strictEqual(mapCount, 5, 'mapCount'); assert.strictEqual(mapCount, 5, 'mapCount');
} }
else { else {
skipTest(assert, 3); skipAssert(assert, 3);
} }
}); });
}); });
}); });
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('forEach methods');
_.each(['forEach', 'forEachRight', 'forIn', 'forInRight', 'forOwn', 'forOwnRig
ht'], function(methodName) {
var func = fp[methodName];
QUnit.test('`fp.' + methodName + '` should provide `value` to `iteratee`', f
unction(assert) {
assert.expect(2);
var args;
func(function() {
args || (args = slice.call(arguments));
})(['a']);
assert.deepEqual(args, ['a']);
args = undefined;
func(function() {
args || (args = slice.call(arguments));
})({ 'a': 1 });
assert.deepEqual(args, [1]);
});
});
/*--------------------------------------------------------------------------*/
QUnit.module('fp.getOr');
(function() {
QUnit.test('should accept a `defaultValue` param', function(assert) {
assert.expect(1);
var actual = fp.getOr('default')('path')({});
assert.strictEqual(actual, 'default');
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.gt and fp.gte');
_.each(['gt', 'gte'], function(methodName) {
var func = fp[methodName];
QUnit.test('`fp.' + methodName + '` should have `rearg` applied', function(a
ssert) {
assert.expect(1);
assert.strictEqual(func(2)(1), true);
});
});
/*--------------------------------------------------------------------------*/
QUnit.module('fp.inRange'); QUnit.module('fp.inRange');
(function() { (function() {
QUnit.test('should have an argument order of `start`, `end`, then `value`', function(assert) { QUnit.test('should have an argument order of `start`, `end`, then `value`', function(assert) {
assert.expect(1); assert.expect(2);
assert.strictEqual(fp.inRange(2)(4)(3), true); assert.strictEqual(fp.inRange(2)(4)(3), true);
assert.strictEqual(fp.inRange(-2)(-6)(-3), true);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.intersectionBy');
(function() {
QUnit.test('should have an argument order of `iteratee`, `array`, then `valu
es`', function(assert) {
assert.expect(1);
var actual = fp.intersectionBy(Math.floor, [2.1, 1.2], [2.3, 3.4]);
assert.deepEqual(actual, [2.1]);
});
QUnit.test('should provide the correct `iteratee` arguments', function(asser
t) {
assert.expect(1);
var args;
fp.intersectionBy(function() {
args || (args = slice.call(arguments));
})([2.1, 1.2], [2.3, 3.4]);
assert.deepEqual(args, [2.3]);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.intersectionWith');
(function() {
QUnit.test('should have an argument order of `comparator`, `array`, then `va
lues`', function(assert) {
assert.expect(1);
var actual = fp.intersectionWith(fp.eq)([2, 1])([2, 3]);
assert.deepEqual(actual, [2]);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.invoke');
(function() {
QUnit.test('should not accept an `args` param', function(assert) {
assert.expect(1);
var actual = fp.invoke('toUpperCase')('a');
assert.strictEqual(actual, 'A');
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.invokeMap');
(function() {
QUnit.test('should not accept an `args` param', function(assert) {
assert.expect(1);
var actual = fp.invokeMap('toUpperCase')(['a', 'b']);
assert.deepEqual(actual, ['A', 'B']);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.invokeArgs');
(function() {
QUnit.test('should accept an `args` param', function(assert) {
assert.expect(1);
var actual = fp.invokeArgs('concat')(['b', 'c'])('a');
assert.strictEqual(actual, 'abc');
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.invokeArgsMap');
(function() {
QUnit.test('should accept an `args` param', function(assert) {
assert.expect(1);
var actual = fp.invokeArgsMap('concat')(['b', 'c'])(['a', 'A']);
assert.deepEqual(actual, ['abc', 'Abc']);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.isEqualWith');
(function() {
QUnit.test('should provide the correct `customizer` arguments', function(ass
ert) {
assert.expect(1);
var args,
iteration = 0,
objects = [{ 'a': 1 }, { 'a': 2 }],
stack = { '__data__': { '__data__': [objects, objects.slice().reverse(
)], 'size': 2 }, 'size': 2 },
expected = [1, 2, 'a', objects[0], objects[1], stack];
fp.isEqualWith(function() {
if (++iteration == 2) {
args = _.map(arguments, _.cloneDeep);
}
})(objects[0])(objects[1]);
args[5] = _.omitBy(args[5], _.isFunction);
args[5].__data__ = _.omitBy(args[5].__data__, _.isFunction);
assert.deepEqual(args, expected);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.isMatchWith');
(function() {
QUnit.test('should provide the correct `customizer` arguments', function(ass
ert) {
assert.expect(1);
var args,
objects = [{ 'a': 1 }, { 'a': 2 }],
stack = { '__data__': { '__data__': [], 'size': 0 }, 'size': 0 },
expected = [2, 1, 'a', objects[1], objects[0], stack];
fp.isMatchWith(function() {
args || (args = _.map(arguments, _.cloneDeep));
})(objects[0])(objects[1]);
args[5] = _.omitBy(args[5], _.isFunction);
args[5].__data__ = _.omitBy(args[5].__data__, _.isFunction);
assert.deepEqual(args, expected);
}); });
}()); }());
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('fp.iteratee'); QUnit.module('fp.iteratee');
(function() { (function() {
QUnit.test('should return a iteratee with capped params', function(assert) { QUnit.test('should return a iteratee with capped params', function(assert) {
assert.expect(1); assert.expect(1);
var func = fp.iteratee(function(a, b, c) { return [a, b, c]; }, undefined, 3); var func = fp.iteratee(function(a, b, c) { return [a, b, c]; }, 3);
assert.deepEqual(func(1, 2, 3), [1, undefined, undefined]); assert.deepEqual(func(1, 2, 3), [1, undefined, undefined]);
}); });
QUnit.test('should convert by name', function(assert) { QUnit.test('should convert by name', function(assert) {
assert.expect(1); assert.expect(1);
if (!document) { var iteratee = convert('iteratee', _.iteratee),
var iteratee = convert('iteratee', _.iteratee), func = iteratee(function(a, b, c) { return [a, b, c]; }, 3);
func = iteratee(function(a, b, c) { return [a, b, c]; }, undefined,
3);
assert.deepEqual(func(1, 2, 3), [1, undefined, undefined]); assert.deepEqual(func(1, 2, 3), [1, undefined, undefined]);
} });
else { }());
skipTest(assert);
} /*--------------------------------------------------------------------------*/
QUnit.module('fp.lt and fp.lte');
_.each(['lt', 'lte'], function(methodName) {
var func = fp[methodName];
QUnit.test('`fp.' + methodName + '` should have `rearg` applied', function(a
ssert) {
assert.expect(1);
assert.strictEqual(func(1)(2), true);
});
});
/*--------------------------------------------------------------------------*/
QUnit.module('fp.mapKeys');
(function() {
QUnit.test('should only provide `key` to `iteratee`', function(assert) {
assert.expect(1);
var args;
fp.mapKeys(function() {
args || (args = slice.call(arguments));
}, { 'a': 1 });
assert.deepEqual(args, ['a']);
}); });
}()); }());
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('fp.maxBy and fp.minBy'); QUnit.module('fp.maxBy and fp.minBy');
_.each(['maxBy', 'minBy'], function(methodName, index) { _.each(['maxBy', 'minBy'], function(methodName) {
var array = [1, 2, 3], var array = [1, 2, 3],
func = fp[methodName], func = fp[methodName],
isMax = !index; isMax = methodName == 'maxBy';
QUnit.test('`fp.' + methodName + '` should work with an `iteratee` argument' , function(assert) { QUnit.test('`fp.' + methodName + '` should work with an `iteratee` argument' , function(assert) {
assert.expect(1); assert.expect(1);
var actual = func(function(num) { var actual = func(function(num) {
return -num; return -num;
})(array); })(array);
assert.strictEqual(actual, isMax ? 1 : 3); assert.strictEqual(actual, isMax ? 1 : 3);
}); });
skipping to change at line 476 skipping to change at line 1442
func(function() { func(function() {
args || (args = slice.call(arguments)); args || (args = slice.call(arguments));
})(array); })(array);
assert.deepEqual(args, [1]); assert.deepEqual(args, [1]);
}); });
}); });
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('fp.mergeWith');
(function() {
QUnit.test('should provide the correct `customizer` arguments', function(ass
ert) {
assert.expect(1);
var args,
stack = { '__data__': { '__data__': [], 'size': 0 }, 'size': 0 },
expected = [[1, 2], [3], 'a', { 'a': [1, 2] }, { 'a': [3] }, stack];
fp.mergeWith(function() {
args || (args = _.map(arguments, _.cloneDeep));
})({ 'a': [1, 2] })({ 'a': [3] });
args[5] = _.omitBy(args[5], _.isFunction);
args[5].__data__ = _.omitBy(args[5].__data__, _.isFunction);
assert.deepEqual(args, expected);
});
QUnit.test('should not mutate values', function(assert) {
assert.expect(2);
var objects = [{ 'a': [1, 2] }, { 'a': [3] }],
actual = fp.mergeWith(_.noop, objects[0], objects[1]);
assert.deepEqual(objects[0], { 'a': [1, 2] });
assert.deepEqual(actual, { 'a': [3, 2] });
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.mergeAllWith');
(function() {
QUnit.test('should provide the correct `customizer` arguments', function(ass
ert) {
assert.expect(1);
var args,
objects = [{ 'a': [1, 2] }, { 'a': [3] }],
stack = { '__data__': { '__data__': [], 'size': 0 }, 'size': 0 },
expected = [[1, 2], [3], 'a', { 'a': [1, 2] }, { 'a': [3] }, stack];
fp.mergeAllWith(function() {
args || (args = _.map(arguments, _.cloneDeep));
})(objects);
args[5] = _.omitBy(args[5], _.isFunction);
args[5].__data__ = _.omitBy(args[5].__data__, _.isFunction);
assert.deepEqual(args, expected);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.mixin'); QUnit.module('fp.mixin');
(function() { (function() {
var source = { 'a': _.noop }; var source = { 'a': _.noop };
QUnit.test('should mixin static methods but not prototype methods', function (assert) { QUnit.test('should mixin static methods but not prototype methods', function (assert) {
assert.expect(2); assert.expect(2);
fp.mixin(source); fp.mixin(source);
skipping to change at line 545 skipping to change at line 1568
if (root[key] === fp[key]) { if (root[key] === fp[key]) {
delete root[key]; delete root[key];
} }
}); });
}); });
}); });
QUnit.test('should convert by name', function(assert) { QUnit.test('should convert by name', function(assert) {
assert.expect(3); assert.expect(3);
if (!document) { var object = { 'mixin': convert('mixin', _.mixin) };
var object = { 'mixin': convert('mixin', _.mixin) };
function Foo() {} function Foo() {}
Foo.mixin = object.mixin; Foo.mixin = object.mixin;
Foo.mixin(source); Foo.mixin(source);
assert.strictEqual(typeof Foo.a, 'function'); assert.ok('a' in Foo);
assert.notOk('a' in Foo.prototype); assert.notOk('a' in Foo.prototype);
object.mixin(source); object.mixin(source);
assert.strictEqual(typeof object.a, 'function'); assert.ok('a' in object);
} });
else { }());
skipTest(assert, 3);
/*--------------------------------------------------------------------------*/
QUnit.module('fp.nthArg');
(function() {
QUnit.test('should return a curried function', function(assert) {
assert.expect(2);
var func = fp.nthArg(1);
assert.strictEqual(func(1)(2), 2);
func = fp.nthArg(-1);
assert.strictEqual(func(1), 1);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.over');
(function() {
QUnit.test('should not cap iteratee args', function(assert) {
assert.expect(2);
_.each([fp.over, convert('over', _.over)], function(func) {
var over = func([Math.max, Math.min]);
assert.deepEqual(over(1, 2, 3, 4), [4, 1]);
});
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.omitBy and fp.pickBy');
_.each(['omitBy', 'pickBy'], function(methodName) {
var func = fp[methodName];
QUnit.test('`fp.' + methodName + '` should provide `value` and `key` to `ite
ratee`', function(assert) {
assert.expect(1);
var args;
func(function() {
args || (args = slice.call(arguments));
})({ 'a': 1 });
assert.deepEqual(args, [1, 'a']);
});
});
/*--------------------------------------------------------------------------*/
QUnit.module('padChars methods');
_.each(['padChars', 'padCharsStart', 'padCharsEnd'], function(methodName) {
var func = fp[methodName],
isPad = methodName == 'padChars',
isStart = methodName == 'padCharsStart';
QUnit.test('fp.' + methodName + '` should truncate pad characters to fit the
pad length', function(assert) {
assert.expect(1);
if (isPad) {
assert.strictEqual(func('_-')(8)('abc'), '_-abc_-_');
} else {
assert.strictEqual(func('_-')(6)('abc'), isStart ? '_-_abc' : 'abc_-_');
} }
}); });
});
/*--------------------------------------------------------------------------*/
QUnit.module('partial methods');
_.each(['partial', 'partialRight'], function(methodName) {
var func = fp[methodName],
isPartial = methodName == 'partial';
QUnit.test('fp.' + methodName + '` should accept an `args` param', function(
assert) {
assert.expect(1);
var expected = isPartial ? [1, 2, 3] : [0, 1, 2];
var actual = func(function(a, b, c) {
return [a, b, c];
})([1, 2])(isPartial ? 3 : 0);
assert.deepEqual(actual, expected);
});
QUnit.test('fp.' + methodName + '` should convert by name', function(assert)
{
assert.expect(2);
var expected = isPartial ? [1, 2, 3] : [0, 1, 2],
par = convert(methodName, _[methodName]),
ph = par.placeholder;
var actual = par(function(a, b, c) {
return [a, b, c];
})([1, 2])(isPartial ? 3 : 0);
assert.deepEqual(actual, expected);
actual = par(function(a, b, c) {
return [a, b, c];
})([ph, 2])(isPartial ? 1 : 0, isPartial ? 3 : 1);
assert.deepEqual(actual, expected);
});
});
/*--------------------------------------------------------------------------*/
QUnit.module('fp.propertyOf');
(function() {
QUnit.test('should be curried', function(assert) {
assert.expect(2);
var object = { 'a': 1 };
assert.strictEqual(fp.propertyOf(object, 'a'), 1);
assert.strictEqual(fp.propertyOf(object)('a'), 1);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.pull');
(function() {
QUnit.test('should not mutate values', function(assert) {
assert.expect(2);
var array = [1, 2, 3],
actual = fp.pull(2)(array);
assert.deepEqual(array, [1, 2, 3]);
assert.deepEqual(actual, [1, 3]);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.pullAll');
(function() {
QUnit.test('should not mutate values', function(assert) {
assert.expect(2);
var array = [1, 2, 3],
actual = fp.pullAll([1, 3])(array);
assert.deepEqual(array, [1, 2, 3]);
assert.deepEqual(actual, [2]);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.pullAt');
(function() {
QUnit.test('should not mutate values', function(assert) {
assert.expect(2);
var array = [1, 2, 3],
actual = fp.pullAt([0, 2])(array);
assert.deepEqual(array, [1, 2, 3]);
assert.deepEqual(actual, [2]);
});
}()); }());
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('fp.random'); QUnit.module('fp.random');
(function() { (function() {
var array = Array(1000); var array = Array(1000);
QUnit.test('should support a `min` and `max` argument', function(assert) { QUnit.test('should support a `min` and `max` argument', function(assert) {
skipping to change at line 586 skipping to change at line 1779
assert.ok(_.some(array, function() { assert.ok(_.some(array, function() {
var result = fp.random(min)(max); var result = fp.random(min)(max);
return result >= min && result <= max; return result >= min && result <= max;
})); }));
}); });
}()); }());
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('fp.range'); QUnit.module('range methods');
_.each(['range', 'rangeRight'], function(methodName) {
var func = fp[methodName],
isRange = methodName == 'range';
QUnit.test('fp.' + methodName + '` should have an argument order of `start`
then `end`', function(assert) {
assert.expect(1);
assert.deepEqual(func(1)(4), isRange ? [1, 2, 3] : [3, 2, 1]);
});
});
/*--------------------------------------------------------------------------*/
QUnit.module('rangeStep methods');
_.each(['rangeStep', 'rangeStepRight'], function(methodName) {
var func = fp[methodName],
isRange = methodName == 'rangeStep';
QUnit.test('fp.' + methodName + '` should have an argument order of `step`,
`start`, then `end`', function(assert) {
assert.expect(1);
assert.deepEqual(func(2)(1)(4), isRange ? [1, 3] : [3, 1]);
});
});
/*--------------------------------------------------------------------------*/
QUnit.module('fp.rearg');
(function() { (function() {
QUnit.test('should have an argument order of `start` then `end`', function(a function fn(a, b, c) {
ssert) { return [a, b, c];
}
QUnit.test('should be curried', function(assert) {
assert.expect(1);
var rearged = fp.rearg([1, 2, 0])(fn);
assert.deepEqual(rearged('c', 'a', 'b'), ['a', 'b', 'c']);
});
QUnit.test('should return a curried function', function(assert) {
assert.expect(1); assert.expect(1);
assert.deepEqual(fp.range(1)(4), [1, 2, 3]); var rearged = fp.rearg([1, 2, 0], fn);
assert.deepEqual(rearged('c')('a')('b'), ['a', 'b', 'c']);
}); });
}()); }());
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('reduce methods'); QUnit.module('reduce methods');
_.each(['reduce', 'reduceRight'], function(methodName) { _.each(['reduce', 'reduceRight'], function(methodName) {
var func = fp[methodName], var func = fp[methodName],
isReduce = methodName == 'reduce'; isReduce = methodName == 'reduce';
QUnit.test('`_.' + methodName + '` should provide the correct `iteratee` arg uments when iterating an array', function(assert) { QUnit.test('`fp.' + methodName + '` should provide the correct `iteratee` ar guments when iterating an array', function(assert) {
assert.expect(1); assert.expect(1);
var args, var args;
array = [1, 2, 3];
func(function() { func(function() {
args || (args = slice.call(arguments)); args || (args = slice.call(arguments));
})(0, array); })(0)([1, 2, 3]);
assert.deepEqual(args, isReduce ? [0, 1] : [0, 3]); assert.deepEqual(args, isReduce ? [0, 1] : [3, 0]);
}); });
QUnit.test('`_.' + methodName + '` should provide the correct `iteratee` arg uments when iterating an object', function(assert) { QUnit.test('`fp.' + methodName + '` should provide the correct `iteratee` ar guments when iterating an object', function(assert) {
assert.expect(1); assert.expect(1);
var args, var args,
object = { 'a': 1, 'b': 2 }, object = { 'a': 1, 'b': 2 },
isFIFO = _.keys(object)[0] == 'a'; isFIFO = _.keys(object)[0] == 'a';
var expected = isFIFO var expected = isFIFO
? (isReduce ? [0, 1] : [0, 2]) ? (isReduce ? [0, 1] : [2, 0])
: (isReduce ? [0, 2] : [0, 1]); : (isReduce ? [0, 2] : [1, 0]);
func(function() { func(function() {
args || (args = slice.call(arguments)); args || (args = slice.call(arguments));
})(0, object); })(0)(object);
assert.deepEqual(args, expected); assert.deepEqual(args, expected);
}); });
}); });
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('fp.remove');
(function() {
QUnit.test('should not mutate values', function(assert) {
assert.expect(2);
var array = [1, 2, 3],
actual = fp.remove(fp.eq(2))(array);
assert.deepEqual(array, [1, 2, 3]);
assert.deepEqual(actual, [1, 3]);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.restFrom');
(function() {
QUnit.test('should accept a `start` param', function(assert) {
assert.expect(1);
var actual = fp.restFrom(2)(function() {
return slice.call(arguments);
})('a', 'b', 'c', 'd');
assert.deepEqual(actual, ['a', 'b', ['c', 'd']]);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.reverse');
(function() {
QUnit.test('should not mutate values', function(assert) {
assert.expect(2);
var array = [1, 2, 3],
actual = fp.reverse(array);
assert.deepEqual(array, [1, 2, 3]);
assert.deepEqual(actual, [3, 2, 1]);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.runInContext'); QUnit.module('fp.runInContext');
(function() { (function() {
QUnit.test('should return a converted lodash instance', function(assert) { QUnit.test('should return a converted lodash instance', function(assert) {
assert.expect(1); assert.expect(1);
assert.strictEqual(typeof fp.runInContext({}).curryN, 'function'); assert.strictEqual(typeof fp.runInContext({}).curryN, 'function');
}); });
QUnit.test('should convert by name', function(assert) { QUnit.test('should convert by name', function(assert) {
assert.expect(1); assert.expect(1);
if (!document) { var runInContext = convert('runInContext', _.runInContext);
var runInContext = convert('runInContext', _.runInContext); assert.strictEqual(typeof runInContext({}).curryN, 'function');
assert.strictEqual(typeof runInContext({}).curryN, 'function'); });
} }());
else {
skipTest(assert); /*--------------------------------------------------------------------------*/
}
QUnit.module('fp.set');
(function() {
QUnit.test('should not mutate values', function(assert) {
assert.expect(2);
var object = { 'a': { 'b': 2, 'c': 3 } },
actual = fp.set('a.b')(3)(object);
assert.deepEqual(object, { 'a': { 'b': 2, 'c': 3 } });
assert.deepEqual(actual, { 'a': { 'b': 3, 'c': 3 } });
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.setWith');
(function() {
QUnit.test('should provide the correct `customizer` arguments', function(ass
ert) {
assert.expect(1);
var args;
fp.setWith(function() {
args || (args = _.map(arguments, _.cloneDeep));
})('b.c')(2)({ 'a': 1 });
assert.deepEqual(args, [undefined, 'b', { 'a': 1 }]);
});
QUnit.test('should not mutate values', function(assert) {
assert.expect(2);
var object = { 'a': { 'b': 2, 'c': 3 } },
actual = fp.setWith(Object)('d.e')(4)(object);
assert.deepEqual(object, { 'a': { 'b': 2, 'c': 3 } });
assert.deepEqual(actual, { 'a': { 'b': 2, 'c': 3 }, 'd': { 'e': 4 } });
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.spreadFrom');
(function() {
QUnit.test('should accept a `start` param', function(assert) {
assert.expect(1);
var actual = fp.spreadFrom(2)(function() {
return slice.call(arguments);
})('a', 'b', ['c', 'd']);
assert.deepEqual(actual, ['a', 'b', 'c', 'd']);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('trimChars methods');
_.each(['trimChars', 'trimCharsStart', 'trimCharsEnd'], function(methodName, i
ndex) {
var func = fp[methodName],
parts = [];
if (index != 2) {
parts.push('leading');
}
if (index != 1) {
parts.push('trailing');
}
parts = parts.join(' and ');
QUnit.test('`fp.' + methodName + '` should remove ' + parts + ' `chars`', fu
nction(assert) {
assert.expect(1);
var string = '-_-a-b-c-_-',
expected = (index == 2 ? '-_-' : '') + 'a-b-c' + (index == 1 ? '-_-' :
'');
assert.strictEqual(func('_-')(string), expected);
});
});
/*--------------------------------------------------------------------------*/
QUnit.module('fp.unionBy');
(function() {
QUnit.test('should have an argument order of `iteratee`, `array`, then `othe
r`', function(assert) {
assert.expect(1);
var actual = fp.unionBy(Math.floor, [2.1], [1.2, 2.3]);
assert.deepEqual(actual, [2.1, 1.2]);
});
QUnit.test('should provide the correct `iteratee` arguments', function(asser
t) {
assert.expect(1);
var args;
fp.unionBy(function() {
args || (args = slice.call(arguments));
})([2.1], [1.2, 2.3]);
assert.deepEqual(args, [2.1]);
});
}());
/*--------------------------------------------------------------------------*/
QUnit.module('fp.unionWith');
(function() {
QUnit.test('should have an argument order of `comparator`, `array`, then `va
lues`', function(assert) {
assert.expect(1);
var actual = fp.unionWith(fp.eq)([2, 1])([2, 3]);
assert.deepEqual(actual, [2, 1, 3]);
});
QUnit.test('should provide the correct `comparator` arguments', function(ass
ert) {
assert.expect(1);
var args;
fp.unionWith(function() {
args || (args = slice.call(arguments));
})([2, 1])([2, 3]);
assert.deepEqual(args, [1, 2]);
}); });
}()); }());
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('fp.uniqBy'); QUnit.module('fp.uniqBy');
(function() { (function() {
var objects = [{ 'a': 2 }, { 'a': 3 }, { 'a': 1 }, { 'a': 2 }, { 'a': 3 }, { 'a': 1 }]; var objects = [{ 'a': 2 }, { 'a': 3 }, { 'a': 1 }, { 'a': 2 }, { 'a': 3 }, { 'a': 1 }];
QUnit.test('should work with an `iteratee` argument', function(assert) { QUnit.test('should work with an `iteratee` argument', function(assert) {
assert.expect(1); assert.expect(1);
var expected = objects.slice(0, 3); var expected = objects.slice(0, 3),
actual = fp.uniqBy(_.property('a'))(objects);
var actual = fp.uniqBy(function(object) {
return object.a;
})(objects);
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
QUnit.test('should provide the correct `iteratee` arguments', function(asser t) { QUnit.test('should provide the correct `iteratee` arguments', function(asser t) {
assert.expect(1); assert.expect(1);
var args; var args;
fp.uniqBy(function() { fp.uniqBy(function() {
args || (args = slice.call(arguments)); args || (args = slice.call(arguments));
})(objects); })(objects);
assert.deepEqual(args, [objects[0]]); assert.deepEqual(args, [objects[0]]);
}); });
}()); }());
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('fp.zip'); QUnit.module('fp.uniqWith');
(function() { (function() {
QUnit.test('should zip together two arrays', function(assert) { QUnit.test('should have an argument order of `comparator`, `array`, then `va lues`', function(assert) {
assert.expect(1); assert.expect(1);
assert.deepEqual(fp.zip([1, 2], [3, 4]), [[1, 3], [2, 4]]); var actual = fp.uniqWith(fp.eq)([2, 1, 2]);
assert.deepEqual(actual, [2, 1]);
});
QUnit.test('should provide the correct `comparator` arguments', function(ass
ert) {
assert.expect(1);
var args;
fp.uniqWith(function() {
args || (args = slice.call(arguments));
})([2, 1, 2]);
assert.deepEqual(args, [1, 2]);
}); });
}()); }());
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('fp.zipObject'); QUnit.module('fp.update');
(function() { (function() {
QUnit.test('should zip together key/value arrays into an object', function(a ssert) { QUnit.test('should not convert end of `path` to an object', function(assert) {
assert.expect(1); assert.expect(1);
assert.deepEqual(fp.zipObject(['a', 'b'], [1, 2]), { 'a': 1, 'b': 2 }); var actual = fp.update('a.b')(_.identity)({ 'a': { 'b': 1 } });
assert.strictEqual(typeof actual.a.b, 'number');
});
QUnit.test('should not convert uncloneables to objects', function(assert) {
assert.expect(2);
var object = { 'a': { 'b': _.constant(true) } },
actual = fp.update('a.b')(_.identity)(object);
assert.strictEqual(typeof object.a.b, 'function');
assert.strictEqual(object.a.b, actual.a.b);
});
QUnit.test('should not mutate values', function(assert) {
assert.expect(2);
var object = { 'a': { 'b': 2, 'c': 3 } },
actual = fp.update('a.b')(square)(object);
assert.deepEqual(object, { 'a': { 'b': 2, 'c': 3 } });
assert.deepEqual(actual, { 'a': { 'b': 4, 'c': 3 } });
}); });
}()); }());
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('mutation methods'); QUnit.module('fp.updateWith');
(function() { (function() {
var array = [1, 2, 3], QUnit.test('should provide the correct `customizer` arguments', function(ass
object = { 'a': 1 }, ert) {
deepObject = { 'a': { 'b': 2, 'c': 3 } }; var args;
QUnit.test('should not mutate values', function(assert) {
assert.expect(32);
function Foo() {} fp.updateWith(function() {
Foo.prototype = { 'b': 2 }; args || (args = _.map(arguments, _.cloneDeep));
})('b.c')(_.constant(2))({ 'a': 1 });
var value = _.clone(object), assert.deepEqual(args, [undefined, 'b', { 'a': 1 }]);
actual = fp.assign({ 'b': 2 }, value); });
assert.deepEqual(value, object, 'fp.assign'); QUnit.test('should not mutate values', function(assert) {
assert.deepEqual(actual, { 'a': 1, 'b': 2 }, 'fp.assign'); assert.expect(2);
value = _.clone(object); var object = { 'a': { 'b': 2, 'c': 3 } },
actual = fp.assignWith(function(objValue, srcValue) { actual = fp.updateWith(Object)('d.e')(_.constant(4))(object);
return srcValue;
}, { 'b': 2 }, value);
assert.deepEqual(value, object, 'fp.assignWith'); assert.deepEqual(object, { 'a': { 'b': 2, 'c': 3 } });
assert.deepEqual(actual, { 'a': 1, 'b': 2 }, 'fp.assignWith'); assert.deepEqual(actual, { 'a': { 'b': 2, 'c': 3 }, 'd': { 'e': 4 } });
});
}());
value = _.clone(object); /*--------------------------------------------------------------------------*/
actual = fp.defaults({ 'a': 2, 'b': 2 }, value);
assert.deepEqual(value, object, 'fp.defaults'); QUnit.module('fp.unset');
assert.deepEqual(actual, { 'a': 1, 'b': 2 }, 'fp.defaults');
value = _.clone(object); (function() {
value.b = { 'c': 1 }; QUnit.test('should not mutate values', function(assert) {
actual = fp.defaultsDeep({ 'b': { 'c': 2, 'd': 2 } }, value); assert.expect(2);
assert.deepEqual(value, { 'a': 1, 'b': { 'c': 1 } } , 'fp.defaultsDeep'); var object = { 'a': { 'b': 2, 'c': 3 } },
assert.deepEqual(actual, { 'a': 1, 'b': { 'c': 1, 'd': 2 } }, 'fp.defaults actual = fp.unset('a.b')(object);
Deep');
value = _.clone(object); assert.deepEqual(object, { 'a': { 'b': 2, 'c': 3 } });
actual = fp.extend(new Foo, value); assert.deepEqual(actual, { 'a': { 'c': 3 } });
});
}());
assert.deepEqual(value, object, 'fp.extend'); /*--------------------------------------------------------------------------*/
assert.deepEqual(actual, { 'a': 1, 'b': 2 }, 'fp.extend');
value = _.clone(object); QUnit.module('fp.xorBy');
actual = fp.extendWith(function(objValue, srcValue) {
return srcValue;
}, new Foo, value);
assert.deepEqual(value, object, 'fp.extendWith'); (function() {
assert.deepEqual(actual, { 'a': 1, 'b': 2 }, 'fp.extendWith'); QUnit.test('should have an argument order of `iteratee`, `array`, then `othe
r`', function(assert) {
assert.expect(1);
value = _.clone(array); var actual = fp.xorBy(Math.floor, [2.1, 1.2], [2.3, 3.4]);
actual = fp.fill(1, 2, '*', value); assert.deepEqual(actual, [1.2, 3.4]);
});
assert.deepEqual(value, array, 'fp.fill'); QUnit.test('should provide the correct `iteratee` arguments', function(asser
assert.deepEqual(actual, [1, '*', 3], 'fp.fill'); t) {
assert.expect(1);
value = { 'a': { 'b': 2 } }; var args;
actual = fp.merge({ 'a': { 'c': 3 } }, value);
assert.deepEqual(value, { 'a': { 'b': 2 } }, 'fp.merge'); fp.xorBy(function() {
assert.deepEqual(actual, { 'a': { 'b': 2, 'c': 3 } }, 'fp.merge'); args || (args = slice.call(arguments));
})([2.1, 1.2], [2.3, 3.4]);
value = { 'a': [1] }; assert.deepEqual(args, [2.3]);
actual = fp.mergeWith(function(objValue, srcValue) { });
if (_.isArray(objValue)) { }());
return objValue.concat(srcValue);
}
}, { 'a': [2, 3] }, value);
assert.deepEqual(value, { 'a': [1] }, 'fp.mergeWith'); /*--------------------------------------------------------------------------*/
assert.deepEqual(actual, { 'a': [1, 2, 3] }, 'fp.mergeWith');
value = _.clone(array); QUnit.module('fp.xorWith');
actual = fp.pull(2, value);
assert.deepEqual(value, array, 'fp.pull'); (function() {
assert.deepEqual(actual, [1, 3], 'fp.pull'); QUnit.test('should have an argument order of `comparator`, `array`, then `va
lues`', function(assert) {
assert.expect(1);
value = _.clone(array); var actual = fp.xorWith(fp.eq)([2, 1])([2, 3]);
actual = fp.pullAll([1, 3], value); assert.deepEqual(actual, [1, 3]);
});
}());
assert.deepEqual(value, array, 'fp.pullAll'); /*--------------------------------------------------------------------------*/
assert.deepEqual(actual, [2], 'fp.pullAll');
value = _.clone(array); QUnit.module('with methods');
actual = fp.pullAt([0, 2], value);
assert.deepEqual(value, array, 'fp.pullAt'); _.each(['differenceWith', 'intersectionWith', 'xorWith'], function(methodName)
assert.deepEqual(actual, [2], 'fp.pullAt'); {
var func = fp[methodName];
value = _.clone(array); QUnit.test('`fp.' + methodName + '` should provide the correct `comparator`
actual = fp.remove(function(value) { arguments', function(assert) {
return value === 2; assert.expect(1);
}, value);
assert.deepEqual(value, array, 'fp.remove'); var args;
assert.deepEqual(actual, [1, 3], 'fp.remove');
value = _.clone(array); func(function() {
actual = fp.reverse(value); args || (args = slice.call(arguments));
})([2, 1])([2, 3]);
assert.deepEqual(value, array, 'fp.reverse'); assert.deepEqual(args, [2, 2]);
assert.deepEqual(actual, [3, 2, 1], 'fp.reverse'); });
});
value = _.cloneDeep(deepObject); /*--------------------------------------------------------------------------*/
actual = fp.set(3, 'a.b', value);
assert.deepEqual(value, deepObject, 'fp.set'); QUnit.module('fp.zip');
assert.deepEqual(actual, { 'a': { 'b': 3, 'c': 3 } }, 'fp.set');
value = _.cloneDeep(deepObject); (function() {
actual = fp.setWith(Object, 4, 'd.e', value); QUnit.test('should zip together two arrays', function(assert) {
assert.expect(1);
assert.deepEqual(value, deepObject, 'fp.setWith'); assert.deepEqual(fp.zip([1, 2])([3, 4]), [[1, 3], [2, 4]]);
assert.deepEqual(actual, { 'a': { 'b': 2, 'c': 3 }, 'd': { 'e': 4 } }, 'fp
.setWith');
}); });
}()); }());
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.module('with methods'); QUnit.module('fp.zipAll');
(function() { (function() {
var array = [1, 2, 3], QUnit.test('should zip together an array of arrays', function(assert) {
object = { 'a': 1 }; assert.expect(1);
QUnit.test('should provide the correct `customizer` arguments', function(ass assert.deepEqual(fp.zipAll([[1, 2], [3, 4], [5, 6]]), [[1, 3, 5], [2, 4, 6
ert) { ]]);
assert.expect(3); });
}());
var args, /*--------------------------------------------------------------------------*/
value = _.clone(object);
var actual = fp.assignWith(function(objValue, srcValue) { QUnit.module('fp.zipObject');
args || (args = _.map(arguments, _.cloneDeep));
return srcValue;
}, { 'b': 2 }, value);
assert.deepEqual(args, [undefined, 2, 'b', { 'a': 1 }, { 'b': 2 }], 'fp.as (function() {
signWith'); QUnit.test('should zip together key/value arrays into an object', function(a
ssert) {
assert.expect(1);
args = undefined; assert.deepEqual(fp.zipObject(['a', 'b'])([1, 2]), { 'a': 1, 'b': 2 });
value = _.clone(object); });
actual = fp.extendWith(function(objValue, srcValue) { }());
args || (args = _.map(arguments, _.cloneDeep));
return srcValue;
}, { 'b': 2 }, value);
assert.deepEqual(args, [undefined, 2, 'b', { 'a': 1 }, { 'b': 2 }], 'fp.ex tendWith'); /*--------------------------------------------------------------------------*/
var stack = { '__data__': { 'array': [], 'map': null } }, QUnit.module('fp.zipWith');
expected = [[1], [2, 3], 'a', { 'a': [ 1 ] }, { 'a': [2, 3] }, stack];
args = undefined; (function() {
value = { 'a': [1] }; QUnit.test('should zip arrays combining grouped elements with `iteratee`', f
actual = fp.mergeWith(function(objValue, srcValue) { unction(assert) {
args || (args = _.map(arguments, _.cloneDeep)); assert.expect(1);
if (_.isArray(objValue)) {
return objValue.concat(srcValue);
}
}, { 'a': [2, 3] }, value);
args[5] = _.omitBy(args[5], _.isFunction); var array1 = [1, 2, 3],
assert.deepEqual(args, expected, 'fp.mergeWith'); array2 = [4, 5, 6],
actual = fp.zipWith(add)(array1)(array2);
assert.deepEqual(actual, [5, 7, 9]);
}); });
}()); }());
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
QUnit.config.asyncRetries = 10; QUnit.config.asyncRetries = 10;
QUnit.config.hidepassed = true; QUnit.config.hidepassed = true;
if (!document) { if (!document) {
QUnit.config.noglobals = true; QUnit.config.noglobals = true;
QUnit.load(); QUnit.load();
QUnit.start();
} }
}.call(this)); }.call(this));
 End of changes. 121 change blocks. 
309 lines changed or deleted 1794 lines changed or added

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)