| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301 |
- ;(function() {
- 'use strict';
- /** Used as a safe reference for `undefined` in pre-ES5 environments. */
- var undefined;
- /** Used as the size to cover large array optimizations. */
- var LARGE_ARRAY_SIZE = 200;
- /** Used as a reference to the global object. */
- var root = (typeof global == 'object' && global) || this;
- /** Used for native method references. */
- var arrayProto = Array.prototype;
- /** Method and object shortcuts. */
- var phantom = root.phantom,
- argv = root.process && process.argv,
- document = !phantom && root.document,
- slice = arrayProto.slice,
- 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;
- /*--------------------------------------------------------------------------*/
- /** Load QUnit and extras. */
- var QUnit = root.QUnit || require('qunit-extras');
- /** Load stable Lodash. */
- var _ = root._ || require('../lodash.js');
- var convert = (function() {
- var baseConvert = root.fp || require('../fp/_baseConvert.js');
- 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.
- *
- * @private
- * @param {Object} assert The QUnit assert object.
- * @param {number} [count=1] The number of tests to skip.
- */
- function skipAssert(assert, count) {
- count || (count = 1);
- while (count--) {
- 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 only add a `placeholder` property if needed', function(assert) {
- assert.expect(2);
- if (!document) {
- var methodNames = _.keys(mapping.placeholder),
- expected = _.map(methodNames, _.constant(true));
- var actual = _.map(methodNames, function(methodName) {
- var object = {};
- object[methodName] = _[methodName];
- var lodash = convert(object);
- return methodName in lodash;
- });
- assert.deepEqual(actual, expected);
- var lodash = convert({ 'add': _.add });
- assert.notOk('placeholder' in 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.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(assert) {
- 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(assert) {
- 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(assert) {
- assert.expect(4);
- _.times(4, function(index) {
- var aryCap = index + 1;
- var methodNames = _.filter(mapping.aryMethod[aryCap], function(methodName) {
- var key = _.get(mapping.remap, methodName, methodName),
- arity = _[key].length;
- return arity != 0 && arity < aryCap;
- });
- assert.deepEqual(methodNames, [], '`aryMethod[' + aryCap + ']`');
- });
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('method aliases');
- (function() {
- QUnit.test('should have correct aliases', function(assert) {
- assert.expect(1);
- var actual = _.transform(mapping.aliasToReal, function(result, realName, alias) {
- result.push([alias, fp[alias] === fp[realName]]);
- }, []);
- assert.deepEqual(_.reject(actual, 1), []);
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('method ary caps');
- (function() {
- QUnit.test('should have a cap of 1', function(assert) {
- assert.expect(1);
- var funcMethods = [
- 'curry', 'iteratee', 'memoize', 'over', 'overEvery', 'overSome',
- 'method', 'methodOf', 'rest', 'runInContext'
- ];
- var exceptions = funcMethods.concat('mixin', 'nthArg', 'template'),
- expected = _.map(mapping.aryMethod[1], _.constant(true));
- var actual = _.map(mapping.aryMethod[1], function(methodName) {
- var arg = _.includes(funcMethods, methodName) ? _.noop : 1,
- result = _.attempt(function() { return fp[methodName](arg); });
- if (_.includes(exceptions, methodName)
- ? typeof result == 'function'
- : typeof result != 'function'
- ) {
- return true;
- }
- console.log(methodName, result);
- return false;
- });
- assert.deepEqual(actual, expected);
- });
- QUnit.test('should have a cap of 2', function(assert) {
- assert.expect(1);
- var funcMethods = [
- 'after', 'ary', 'before', 'bind', 'bindKey', 'curryN', 'debounce',
- 'delay', 'overArgs', 'partial', 'partialRight', 'rearg', 'throttle',
- 'wrap'
- ];
- var exceptions = _.without(funcMethods.concat('matchesProperty'), 'delay'),
- expected = _.map(mapping.aryMethod[2], _.constant(true));
- var actual = _.map(mapping.aryMethod[2], function(methodName) {
- var args = _.includes(funcMethods, methodName) ? [methodName == 'curryN' ? 1 : _.noop, _.noop] : [1, []],
- result = _.attempt(function() { return fp[methodName](args[0])(args[1]); });
- if (_.includes(exceptions, methodName)
- ? typeof result == 'function'
- : typeof result != 'function'
- ) {
- return true;
- }
- console.log(methodName, result);
- return false;
- });
- assert.deepEqual(actual, expected);
- });
- QUnit.test('should have a cap of 3', function(assert) {
- assert.expect(1);
- var funcMethods = [
- 'assignWith', 'extendWith', 'isEqualWith', 'isMatchWith', 'reduce',
- 'reduceRight', 'transform', 'zipWith'
- ];
- var expected = _.map(mapping.aryMethod[3], _.constant(true));
- var actual = _.map(mapping.aryMethod[3], function(methodName) {
- var args = _.includes(funcMethods, methodName) ? [_.noop, 0, 1] : [0, 1, []],
- result = _.attempt(function() { return fp[methodName](args[0])(args[1])(args[2]); });
- if (typeof result != 'function') {
- return true;
- }
- console.log(methodName, result);
- return false;
- });
- assert.deepEqual(actual, expected);
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('methods that use `indexOf`');
- (function() {
- QUnit.test('should work with `fp.indexOf`', function(assert) {
- assert.expect(10);
- var array = ['a', 'b', 'c'],
- other = ['b', 'd', 'b'],
- object = { 'a': 1, 'b': 2, 'c': 2 },
- actual = fp.difference(array)(other);
- assert.deepEqual(actual, ['a', 'c'], 'fp.difference');
- actual = fp.includes('b')(array);
- assert.strictEqual(actual, true, 'fp.includes');
- actual = fp.intersection(other)(array);
- assert.deepEqual(actual, ['b'], 'fp.intersection');
- actual = fp.omit(other)(object);
- assert.deepEqual(actual, { 'a': 1, 'c': 2 }, 'fp.omit');
- actual = fp.union(other)(array);
- assert.deepEqual(actual, ['a', 'b', 'c', 'd'], 'fp.union');
- actual = fp.uniq(other);
- assert.deepEqual(actual, ['b', 'd'], 'fp.uniq');
- actual = fp.uniqBy(_.identity, other);
- assert.deepEqual(actual, ['b', 'd'], 'fp.uniqBy');
- actual = fp.without(other)(array);
- assert.deepEqual(actual, ['a', 'c'], 'fp.without');
- actual = fp.xor(other)(array);
- assert.deepEqual(actual, ['a', 'c', 'd'], 'fp.xor');
- actual = fp.pull('b')(array);
- assert.deepEqual(actual, ['a', 'c'], 'fp.pull');
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('cherry-picked methods');
- (function() {
- QUnit.test('should provide the correct `iteratee` arguments', function(assert) {
- assert.expect(4);
- var args,
- array = [1, 2, 3],
- object = { 'a': 1, 'b': 2 },
- isFIFO = _.keys(object)[0] == 'a',
- map = convert('map', _.map),
- 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]);
- });
- QUnit.test('should not support shortcut fusion', function(assert) {
- assert.expect(3);
- var array = fp.range(0, LARGE_ARRAY_SIZE),
- filterCount = 0,
- mapCount = 0;
- var iteratee = function(value) {
- mapCount++;
- return value * value;
- };
- var predicate = function(value) {
- filterCount++;
- return isEven(value);
- };
- var map1 = convert('map', _.map),
- filter1 = convert('filter', _.filter),
- take1 = convert('take', _.take);
- var filter2 = filter1(predicate),
- map2 = map1(iteratee),
- take2 = take1(2);
- var combined = fp.flow(map2, filter2, fp.compact, take2);
- assert.deepEqual(combined(array), [4, 16]);
- assert.strictEqual(filterCount, 200, 'filterCount');
- assert.strictEqual(mapCount, 200, 'mapCount');
- });
- }());
- /*--------------------------------------------------------------------------*/
- 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(assert) {
- 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']);
- });
- });
- _.forOwn(mapping.placeholder, function(truthy, methodName) {
- var func = fp[methodName];
- QUnit.test('`_.' + 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', function(assert) {
- assert.expect(1);
- assert.strictEqual(func('1')('2'), isAdd ? '12' : -1);
- });
- });
- /*--------------------------------------------------------------------------*/
- QUnit.module('assign methods');
- _.each(['assign', 'assignIn', 'defaults', 'defaultsDeep', 'merge'], function(methodName) {
- var func = fp[methodName];
- QUnit.test('`fp.' + methodName + '` should not mutate values', function(assert) {
- 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', 'mergeAll'], function(methodName) {
- var func = fp[methodName];
- QUnit.test('`fp.' + methodName + '` should not mutate values', function(assert) {
- 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 });
- });
- });
- /*--------------------------------------------------------------------------*/
- QUnit.module('assignWith methods');
- _.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 }]);
- });
- QUnit.test('`fp.' + methodName + '` should not mutate values', function(assert) {
- assert.expect(2);
- var objects = [{ 'a': 1 }, { 'b': 2 }],
- actual = func(_.nthArg(1))(objects[0])(objects[1]);
- assert.deepEqual(objects[0], { 'a': 1 });
- assert.deepEqual(actual, { 'a': 1, 'b': 2 });
- });
- });
- _.each(['assignAllWith', 'assignInAllWith', 'extendAllWith'], 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 }]);
- });
- QUnit.test('`fp.' + methodName + '` should not mutate values', function(assert) {
- assert.expect(2);
- var objects = [{ 'a': 1 }, { 'b': 2 }],
- actual = func(_.nthArg(1))(objects);
- assert.deepEqual(objects[0], { 'a': 1 });
- assert.deepEqual(actual, { 'a': 1, 'b': 2 });
- });
- });
- /*--------------------------------------------------------------------------*/
- 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');
- _.each(['curry', 'curryRight'], function(methodName) {
- var func = fp[methodName];
- QUnit.test('`_.' + methodName + '` should only accept a `func` param', function(assert) {
- assert.expect(1);
- assert.raises(function() { func(1, _.noop); }, TypeError);
- });
- });
- /*--------------------------------------------------------------------------*/
- QUnit.module('curryN methods');
- _.each(['curryN', 'curryRightN'], function(methodName) {
- var func = fp[methodName];
- QUnit.test('`_.' + methodName + '` should accept an `arity` param', function(assert) {
- assert.expect(1);
- var actual = func(1)(function(a, b) { return [a, b]; })('a');
- assert.deepEqual(actual, ['a', undefined]);
- });
- });
- /*--------------------------------------------------------------------------*/
- QUnit.module('fp.defaultTo');
- (function() {
- QUnit.test('should have an argument order of `defaultValue` then `value`', function(assert) {
- assert.expect(2);
- assert.strictEqual(fp.defaultTo(1)(0), 0);
- assert.strictEqual(fp.defaultTo(1)(undefined), 1);
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('fp.difference');
- (function() {
- QUnit.test('should return the elements of the first array not included in the second array', function(assert) {
- assert.expect(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 `values`', 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(assert) {
- 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 `values`', 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', function(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');
- (function() {
- QUnit.test('should have an argument order of `start`, `end`, then `value`', function(assert) {
- assert.expect(1);
- var array = [1, 2, 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'], function(methodName) {
- var func = fp[methodName];
- QUnit.test('`_.' + methodName + '` should provide the correct `predicate` arguments', 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 `array`', 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 `array`', 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('`_.' + 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('`_.' + 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 `collection`', 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('flow methods');
- _.each(['flow', 'flowRight'], function(methodName) {
- var func = fp[methodName],
- isFlow = methodName == 'flow';
- QUnit.test('`fp.' + methodName + '` should support shortcut fusion', function(assert) {
- assert.expect(6);
- var filterCount,
- mapCount,
- array = fp.range(0, LARGE_ARRAY_SIZE);
- var iteratee = function(value) {
- mapCount++;
- return square(value);
- };
- var predicate = function(value) {
- filterCount++;
- return isEven(value);
- };
- var filter = fp.filter(predicate),
- map = fp.map(iteratee),
- take = fp.take(2);
- _.times(2, function(index) {
- var combined = isFlow
- ? func(map, filter, fp.compact, take)
- : func(take, fp.compact, filter, map);
- filterCount = mapCount = 0;
- if (WeakMap && WeakMap.name) {
- assert.deepEqual(combined(array), [4, 16]);
- assert.strictEqual(filterCount, 5, 'filterCount');
- assert.strictEqual(mapCount, 5, 'mapCount');
- }
- else {
- skipAssert(assert, 3);
- }
- });
- });
- });
- /*--------------------------------------------------------------------------*/
- QUnit.module('forEach methods');
- _.each(['forEach', 'forEachRight', 'forIn', 'forInRight', 'forOwn', 'forOwnRight'], function(methodName) {
- var func = fp[methodName];
- QUnit.test('`fp.' + methodName + '` should provide `value` to `iteratee`', function(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(assert) {
- assert.expect(1);
- assert.strictEqual(func(2)(1), true);
- });
- });
- /*--------------------------------------------------------------------------*/
- QUnit.module('fp.inRange');
- (function() {
- QUnit.test('should have an argument order of `start`, `end`, then `value`', function(assert) {
- assert.expect(2);
- 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 `values`', 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(assert) {
- 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 `values`', 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(assert) {
- assert.expect(1);
- var args,
- iteration = 0,
- objects = [{ 'a': 1 }, { 'a': 2 }],
- stack = { '__data__': { '__data__': [objects, objects.slice().reverse()] } },
- 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(assert) {
- assert.expect(1);
- var args,
- objects = [{ 'a': 1 }, { 'a': 2 }],
- stack = { '__data__': { '__data__': [] } },
- 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');
- (function() {
- QUnit.test('should return a iteratee with capped params', function(assert) {
- assert.expect(1);
- var func = fp.iteratee(function(a, b, c) { return [a, b, c]; }, 3);
- assert.deepEqual(func(1, 2, 3), [1, undefined, undefined]);
- });
- QUnit.test('should convert by name', function(assert) {
- assert.expect(1);
- var iteratee = convert('iteratee', _.iteratee),
- func = iteratee(function(a, b, c) { return [a, b, c]; }, 3);
- assert.deepEqual(func(1, 2, 3), [1, undefined, undefined]);
- });
- }());
- /*--------------------------------------------------------------------------*/
- 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(assert) {
- 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');
- _.each(['maxBy', 'minBy'], function(methodName) {
- var array = [1, 2, 3],
- func = fp[methodName],
- isMax = methodName == 'maxBy';
- QUnit.test('`fp.' + methodName + '` should work with an `iteratee` argument', function(assert) {
- assert.expect(1);
- var actual = func(function(num) {
- return -num;
- })(array);
- assert.strictEqual(actual, isMax ? 1 : 3);
- });
- QUnit.test('`fp.' + methodName + '` should provide the correct `iteratee` arguments', function(assert) {
- assert.expect(1);
- var args;
- func(function() {
- args || (args = slice.call(arguments));
- })(array);
- assert.deepEqual(args, [1]);
- });
- });
- /*--------------------------------------------------------------------------*/
- QUnit.module('fp.mergeWith');
- (function() {
- QUnit.test('should provide the correct `customizer` arguments', function(assert) {
- assert.expect(1);
- var args,
- stack = { '__data__': { '__data__': [] } },
- 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(assert) {
- assert.expect(1);
- var args,
- stack = { '__data__': { '__data__': [] } },
- expected = [[1, 2], [3], 'a', { 'a': [1, 2] }, { 'a': [3] }, stack];
- fp.mergeAllWith(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.mergeAllWith(_.noop, objects);
- assert.deepEqual(objects[0], { 'a': [1, 2] });
- assert.deepEqual(actual, { 'a': [3, 2] });
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('fp.mixin');
- (function() {
- var source = { 'a': _.noop };
- QUnit.test('should mixin static methods but not prototype methods', function(assert) {
- assert.expect(2);
- fp.mixin(source);
- assert.strictEqual(typeof fp.a, 'function');
- assert.notOk('a' in fp.prototype);
- delete fp.a;
- delete fp.prototype.a;
- });
- QUnit.test('should not assign inherited `source` methods', function(assert) {
- assert.expect(2);
- function Foo() {}
- Foo.prototype.a = _.noop;
- fp.mixin(new Foo);
- assert.notOk('a' in fp);
- assert.notOk('a' in fp.prototype);
- delete fp.a;
- delete fp.prototype.a;
- });
- QUnit.test('should not remove existing prototype methods', function(assert) {
- assert.expect(2);
- var each1 = fp.each,
- each2 = fp.prototype.each;
- fp.mixin({ 'each': source.a });
- assert.strictEqual(fp.each, source.a);
- assert.strictEqual(fp.prototype.each, each2);
- fp.each = each1;
- fp.prototype.each = each2;
- });
- QUnit.test('should not export to the global when `source` is not an object', function(assert) {
- assert.expect(2);
- var props = _.without(_.keys(_), '_');
- _.times(2, function(index) {
- fp.mixin.apply(fp, index ? [1] : []);
- assert.ok(_.every(props, function(key) {
- return root[key] !== fp[key];
- }));
- _.each(props, function(key) {
- if (root[key] === fp[key]) {
- delete root[key];
- }
- });
- });
- });
- QUnit.test('should convert by name', function(assert) {
- assert.expect(3);
- var object = { 'mixin': convert('mixin', _.mixin) };
- function Foo() {}
- Foo.mixin = object.mixin;
- Foo.mixin(source);
- assert.ok('a' in Foo);
- assert.notOk('a' in Foo.prototype);
- object.mixin(source);
- assert.ok('a' in object);
- });
- }());
- /*--------------------------------------------------------------------------*/
- 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 `iteratee`', 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('`_.' + 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('`_.' + 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('`_.' + 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');
- (function() {
- var array = Array(1000);
- QUnit.test('should support a `min` and `max` argument', function(assert) {
- assert.expect(1);
- var min = 5,
- max = 10;
- assert.ok(_.some(array, function() {
- var result = fp.random(min)(max);
- return result >= min && result <= max;
- }));
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('fp.range');
- (function() {
- QUnit.test('should have an argument order of `start` then `end`', function(assert) {
- assert.expect(1);
- assert.deepEqual(fp.range(1)(4), [1, 2, 3]);
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('fp.rearg');
- (function() {
- function fn(a, b, c) {
- 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);
- var rearged = fp.rearg([1, 2, 0], fn);
- assert.deepEqual(rearged('c')('a')('b'), ['a', 'b', 'c']);
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('reduce methods');
- _.each(['reduce', 'reduceRight'], function(methodName) {
- var func = fp[methodName],
- isReduce = methodName == 'reduce';
- QUnit.test('`_.' + methodName + '` should provide the correct `iteratee` arguments when iterating an array', function(assert) {
- assert.expect(1);
- var args;
- func(function() {
- args || (args = slice.call(arguments));
- })(0)([1, 2, 3]);
- assert.deepEqual(args, isReduce ? [0, 1] : [0, 3]);
- });
- QUnit.test('`_.' + methodName + '` should provide the correct `iteratee` arguments when iterating an object', function(assert) {
- assert.expect(1);
- var args,
- object = { 'a': 1, 'b': 2 },
- isFIFO = _.keys(object)[0] == 'a';
- var expected = isFIFO
- ? (isReduce ? [0, 1] : [0, 2])
- : (isReduce ? [0, 2] : [0, 1]);
- func(function() {
- args || (args = slice.call(arguments));
- })(0)(object);
- 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');
- (function() {
- QUnit.test('should return a converted lodash instance', function(assert) {
- assert.expect(1);
- assert.strictEqual(typeof fp.runInContext({}).curryN, 'function');
- });
- QUnit.test('should convert by name', function(assert) {
- assert.expect(1);
- var runInContext = convert('runInContext', _.runInContext);
- assert.strictEqual(typeof runInContext({}).curryN, 'function');
- });
- }());
- /*--------------------------------------------------------------------------*/
- 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(assert) {
- 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, index) {
- var func = fp[methodName],
- parts = [];
- if (index != 2) {
- parts.push('leading');
- }
- if (index != 1) {
- parts.push('trailing');
- }
- parts = parts.join(' and ');
- QUnit.test('`_.' + methodName + '` should remove ' + parts + ' `chars`', function(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 `other`', 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(assert) {
- 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 `values`', 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(assert) {
- 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');
- (function() {
- var objects = [{ 'a': 2 }, { 'a': 3 }, { 'a': 1 }, { 'a': 2 }, { 'a': 3 }, { 'a': 1 }];
- QUnit.test('should work with an `iteratee` argument', function(assert) {
- assert.expect(1);
- var expected = objects.slice(0, 3),
- actual = fp.uniqBy(_.property('a'))(objects);
- assert.deepEqual(actual, expected);
- });
- QUnit.test('should provide the correct `iteratee` arguments', function(assert) {
- assert.expect(1);
- var args;
- fp.uniqBy(function() {
- args || (args = slice.call(arguments));
- })(objects);
- assert.deepEqual(args, [objects[0]]);
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('fp.uniqWith');
- (function() {
- QUnit.test('should have an argument order of `comparator`, `array`, then `values`', function(assert) {
- assert.expect(1);
- var actual = fp.uniqWith(fp.eq)([2, 1, 2]);
- assert.deepEqual(actual, [2, 1]);
- });
- QUnit.test('should provide the correct `comparator` arguments', function(assert) {
- assert.expect(1);
- var args;
- fp.uniqWith(function() {
- args || (args = slice.call(arguments));
- })([2, 1, 2]);
- assert.deepEqual(args, [1, 2]);
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('fp.update');
- (function() {
- QUnit.test('should not convert end of `path` to an object', function(assert) {
- assert.expect(1);
- var actual = fp.update('a.b')(_.identity)({ 'a': { 'b': 1 } });
- assert.strictEqual(typeof actual.a.b, 'number');
- });
- 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('fp.updateWith');
- (function() {
- QUnit.test('should provide the correct `customizer` arguments', function(assert) {
- var args;
- fp.updateWith(function() {
- args || (args = _.map(arguments, _.cloneDeep));
- })('b.c')(_.constant(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.updateWith(Object)('d.e')(_.constant(4))(object);
- assert.deepEqual(object, { 'a': { 'b': 2, 'c': 3 } });
- assert.deepEqual(actual, { 'a': { 'b': 2, 'c': 3 }, 'd': { 'e': 4 } });
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('fp.unset');
- (function() {
- QUnit.test('should not mutate values', function(assert) {
- assert.expect(2);
- var object = { 'a': { 'b': 2, 'c': 3 } },
- actual = fp.unset('a.b')(object);
- assert.deepEqual(object, { 'a': { 'b': 2, 'c': 3 } });
- assert.deepEqual(actual, { 'a': { 'c': 3 } });
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('fp.xorBy');
- (function() {
- QUnit.test('should have an argument order of `iteratee`, `array`, then `other`', function(assert) {
- assert.expect(1);
- var actual = fp.xorBy(Math.floor, [2.1, 1.2], [2.3, 3.4]);
- assert.deepEqual(actual, [1.2, 3.4]);
- });
- QUnit.test('should provide the correct `iteratee` arguments', function(assert) {
- assert.expect(1);
- var args;
- fp.xorBy(function() {
- args || (args = slice.call(arguments));
- })([2.1, 1.2], [2.3, 3.4]);
- assert.deepEqual(args, [2.3]);
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('fp.xorWith');
- (function() {
- QUnit.test('should have an argument order of `comparator`, `array`, then `values`', function(assert) {
- assert.expect(1);
- var actual = fp.xorWith(fp.eq)([2, 1])([2, 3]);
- assert.deepEqual(actual, [1, 3]);
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('with methods');
- _.each(['differenceWith', 'intersectionWith', 'xorWith'], function(methodName) {
- var func = fp[methodName];
- QUnit.test('`fp.' + methodName + '` should provide the correct `comparator` arguments', function(assert) {
- assert.expect(1);
- var args;
- func(function() {
- args || (args = slice.call(arguments));
- })([2, 1])([2, 3]);
- assert.deepEqual(args, [2, 2]);
- });
- });
- /*--------------------------------------------------------------------------*/
- QUnit.module('fp.zip');
- (function() {
- QUnit.test('should zip together two arrays', function(assert) {
- assert.expect(1);
- assert.deepEqual(fp.zip([1, 2])([3, 4]), [[1, 3], [2, 4]]);
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('fp.zipAll');
- (function() {
- QUnit.test('should zip together an array of arrays', function(assert) {
- assert.expect(1);
- assert.deepEqual(fp.zipAll([[1, 2], [3, 4], [5, 6]]), [[1, 3, 5], [2, 4, 6]]);
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('fp.zipObject');
- (function() {
- QUnit.test('should zip together key/value arrays into an object', function(assert) {
- assert.expect(1);
- assert.deepEqual(fp.zipObject(['a', 'b'])([1, 2]), { 'a': 1, 'b': 2 });
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.module('fp.zipWith');
- (function() {
- QUnit.test('should zip arrays combining grouped elements with `iteratee`', function(assert) {
- assert.expect(1);
- var array1 = [1, 2, 3],
- array2 = [4, 5, 6],
- actual = fp.zipWith(add)(array1)(array2);
- assert.deepEqual(actual, [5, 7, 9]);
- });
- }());
- /*--------------------------------------------------------------------------*/
- QUnit.config.asyncRetries = 10;
- QUnit.config.hidepassed = true;
- if (!document) {
- QUnit.config.noglobals = true;
- QUnit.load();
- QUnit.start();
- }
- }.call(this));
|