Adapter
ary
Creates a function that accepts up to n arguments, ignoring any additional arguments.
Call the provided function, fn, with up to n arguments, using Array.slice(0,n) and the spread operator (...).
const ary = (fn, n) => (...args) => fn(...args.slice(0, n)); + }
30 seconds of code Curated collection of useful JavaScript snippets that you can understand in 30 seconds or less.
Adapter
ary
Creates a function that accepts up to
narguments, ignoring any additional arguments.Call the provided function,
fn, with up tonarguments, usingArray.slice(0,n)and the spread operator (...).const ary = (fn, n) => (...args) => fn(...args.slice(0, n));const firstTwoMax = ary(Math.max, 2); [[2, 6, 'a'], [8, 4, 6], [10]].map(x => firstTwoMax(...x)); // [6, 8, 10]call
Given a key and a set of arguments, call them when given a context. Primarily useful in composition.
Use a closure to call a stored key with stored arguments.
const call = (key, ...args) => context => context[key](...args); @@ -66,7 +66,7 @@ Promise.reso let p1 = Promise.resolve(1); let p2 = Promise.resolve(2); let p3 = new Promise(resolve => setTimeout(resolve, 2000, 3)); -Pall(p1, p2, p3).then(console.log); +Pall(p1, p2, p3).then(console.log); // [1, 2, 3] (after about 2 seconds)flip
Flip takes a function as an argument, then makes the first argument the last.
Return a closure that takes variadic inputs, and splices the last argument to make it the first argument before applying the rest.
const flip = fn => (first, ...rest) => fn(...rest, first);let a = { name: 'John Smith' }; let b = {}; @@ -78,6 +78,24 @@ Object.assigover
Creates a function that invokes each provided function with the arguments it receives and returns the results.
Use
Array.map()andFunction.apply()to apply each function to the given arguments.const over = (...fns) => (...args) => fns.map(fn => fn.apply(null, args));const minMax = over(Math.min, Math.max); minMax(1, 2, 3, 4, 5); // [1,5] +overArgs
Creates a function that invokes the provided function with its arguments transformed.
Use
Array.map()to applytransformstoargsin combination with the spread operator (...) to pass the transformed arguments tofn.const overArgs = (fn, transforms) => (...args) => fn(...args.map((val, i) => transforms[i](val))); +var func = overArgs( + function(x, y) { + return [x, y]; + }, + [square, doubled] +); +func(9, 3); // [81, 6] +pipeAsyncFunctions
Performs left-to-right function composition for asynchronous functions.
Use
Array.reduce()with the spread operator (...) to perform left-to-right function composition usingPromise.then(). The functions can return a combination of: simple values,Promise's, or they can be defined asasyncones returning throughawait. All functions must be unary.const pipeAsyncFunctions = (...fns) => arg => fns.reduce((p, f) => p.then(f), Promise.resolve(arg)); +const sum = pipeAsyncFunctions( + x => x + 1, + x => new Promise(resolve => setTimeout(() => resolve(x + 2), 1000)), + x => x + 3, + async x => (await x) + 4 +); +(async () => { + console.log(await sum(5)); // 15 (after one second) +})();pipeFunctions
Performs left-to-right function composition.
Use
Array.reduce()with the spread operator (...) to perform left-to-right function composition. The first (leftmost) function can accept one or more arguments; the remaining functions must be unary.const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args)));const add5 = x => x + 5; const multiply = (x, y) => x * y; @@ -89,6 +107,20 @@ Object.assig );const delay = promisify((d, cb) => setTimeout(cb, d)); delay(2000).then(() => console.log('Hi!')); // // Promise resolves after 2s +rearg
Creates a function that invokes the provided function with its arguments arranged according to the specified indexes.
Use
Array.reduce()andArray.indexOf()to reorder arguments based onindexesin combination with the spread operator (...) to pass the transformed arguments tofn.const rearg = (fn, indexes) => (...args) => + fn( + ...args.reduce( + (acc, val, i) => ((acc[indexes.indexOf(i)] = val), acc), + Array.from({ length: indexes.length }) + ) + ); +var rearged = rearg( + function(a, b, c) { + return [a, b, c]; + }, + [2, 0, 1] +); +rearged('b', 'c', 'a'); // ['a', 'b', 'c']spreadOver
Takes a variadic function and returns a closure that accepts an array of arguments to map to the inputs of the function.
Use closures and the spread operator (
...) to map the array of arguments to the inputs of the function.const spreadOver = fn => argsArr => fn(...argsArr);const arrayMax = spreadOver(Math.max); arrayMax([1, 2, 3]); // 3 @@ -752,7 +784,18 @@ document.bodypadStart(2, '0')}`; };tomorrow(); // 2017-12-27 (if current date is 2017-12-26) -Function
bind
Creates a function that invokes
fnwith a given context, optionally adding any additional supplied parameters to the beginning of the arguments.Return a
functionthat usesFunction.apply()to apply the givencontexttofn. UseArray.concat()to prepend any additional supplied parameters to the arguments.const bind = (fn, context, ...args) => +Function
attempt
Attempts to invoke a function with the provided arguments, returning either the result or the caught error object.
Use a
try... catchblock to return either the result of the function or an appropriate error.const attempt = (fn, ...args) => { + try { + return fn(args); + } catch (e) { + return e instanceof Error ? e : new Error(e); + } +}; +var elements = attempt(function(selector) { + return document.querySelectorAll(selector); +}, '>_>'); +if (elements instanceof Error) elements = []; // elements = [] +bind
Creates a function that invokes
fnwith a given context, optionally adding any additional supplied parameters to the beginning of the arguments.Return a
functionthat usesFunction.apply()to apply the givencontexttofn. UseArray.concat()to prepend any additional supplied parameters to the arguments.const bind = (fn, context, ...args) => function() { return fn.apply(context, args.concat(...arguments)); }; @@ -802,6 +845,22 @@ console.log< arity <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args);curry(Math.pow)(2)(10); // 1024 curry(Math.min, 3)(10)(50)(2); // 2 +debounce
Creates a debounced function that delays invoking the provided function until after
waitmilliseconds have elapsed since the last time the debounced function was invoked.Use
setTimeout()andclearTimeout()to debounce the given method,fn. UseFunction.apply()to apply thethiscontext to the function and provide the necessaryarguments. Omit the second argument,wait, to set the timeout at a default of 0 ms.const debounce = (fn, wait = 0) => { + let inDebounce; + return function() { + const context = this, + args = arguments; + clearTimeout(inDebounce); + inDebounce = setTimeout(() => fn.apply(context, args), wait); + }; +}; +window.addEventListener( + 'resize', + debounce(function(evt) { + console.log(window.innerWidth); + console.log(window.innerHeight); + }, 250) +); // Will log the window dimensions at most every 250msdefer
Defers invoking a function until the current call stack has cleared.
Use
setTimeout()with a timeout of 1ms to add a new event to the browser event queue and allow the rendering engine to complete its work. Use the spread (...) operator to supply the function with an arbitrary number of arguments.const defer = (fn, ...args) => setTimeout(fn, 1, ...args);// Example A: defer(console.log, 'a'), console.log('b'); // logs 'b' then 'a' @@ -868,6 +927,33 @@ document.bodyawait sleep(1000); console.log('I woke up after 1 second.'); } +throttle
Creates a throttled function that only invokes the provided function at most once per every
waitmillisecondsUse
setTimeout()andclearTimeout()to throttle the given method,fn. UseFunction.apply()to apply thethiscontext to the function and provide the necessaryarguments. UseDate.now()to keep track of the last time the throttled function was invoked. Omit the second argument,wait, to set the timeout at a default of 0 ms.const throttle = (fn, wait) => { + let inThrottle, lastFn, lastTime; + return function() { + const context = this, + args = arguments; + if (!inThrottle) { + fn.apply(context, args); + lastTime = Date.now(); + inThrottle = true; + } else { + clearTimeout(lastFn); + lastFn = setTimeout(function() { + if (Date.now() - lastTime >= wait) { + fn.apply(context, args); + lastTime = Date.now(); + } + }, wait - (Date.now() - lastTime)); + } + }; +}; +window.addEventListener( + 'resize', + throttle(function(evt) { + console.log(window.innerWidth); + console.log(window.innerHeight); + }, 250) +); // Will log the window dimensions at most every 250mstimes
Iterates over a callback
ntimesUse
Function.call()to callfnntimes or until it returnsfalse. Omit the last argument,context, to use anundefinedobject (or the global object in non-strict mode).const times = (n, fn, context = undefined) => { let i = 0; while (fn.call(context, i) !== false && ++i < n) {} @@ -1137,12 +1223,14 @@ console.log< (c ^ (crypto.randomBytes(1)[0] & (15 >> (c / 4)))).toString(16) );UUIDGeneratorNode(); // '79c7c136-60ee-40a2-beb2-856f1feabefc' -Object
bindAll
Explain briefly what the snippet does.
Use
Array.forEach()to return afunctionthat usesFunction.apply()to apply the given context (obj) tofnfor each function specified.const bindAll = (obj, ...fns) => +Object
bindAll
Use
Array.forEach()to return afunctionthat usesFunction.apply()to apply the given context (obj) tofnfor each function specified.const bindAll = (obj, ...fns) => fns.forEach( - fn => - (obj[fn] = function() { - return fn.apply(obj); + fn => ( + (f = obj[fn]), + (obj[fn] = function() { + return f.apply(obj); }) + ) );var view = { label: 'docs', diff --git a/snippets/attempt.md b/snippets/attempt.md new file mode 100644 index 000000000..c3dae169e --- /dev/null +++ b/snippets/attempt.md @@ -0,0 +1,22 @@ +### attempt + +Attempts to invoke a function with the provided arguments, returning either the result or the caught error object. + +Use a `try... catch` block to return either the result of the function or an appropriate error. + +```js +const attempt = (fn, ...args) => { + try { + return fn(args); + } catch (e) { + return e instanceof Error ? e : new Error(e); + } +}; +``` + +```js +var elements = attempt(function(selector) { + return document.querySelectorAll(selector); +}, '>_>'); +if (elements instanceof Error) elements = []; // elements = [] +``` diff --git a/snippets/bindAll.md b/snippets/bindAll.md index e5e618ae0..da869957f 100644 --- a/snippets/bindAll.md +++ b/snippets/bindAll.md @@ -1,16 +1,16 @@ ### bindAll -Explain briefly what the snippet does. - Use `Array.forEach()` to return a `function` that uses `Function.apply()` to apply the given context (`obj`) to `fn` for each function specified. ```js const bindAll = (obj, ...fns) => fns.forEach( - fn => + fn => ( + (f = obj[fn]), (obj[fn] = function() { - return fn.apply(obj); + return f.apply(obj); }) + ) ); ``` diff --git a/snippets/collectInto.md b/snippets/collectInto.md index 3da1173bd..da37626a2 100644 --- a/snippets/collectInto.md +++ b/snippets/collectInto.md @@ -13,5 +13,5 @@ const Pall = collectInto(Promise.all.bind(Promise)); let p1 = Promise.resolve(1); let p2 = Promise.resolve(2); let p3 = new Promise(resolve => setTimeout(resolve, 2000, 3)); -Pall(p1, p2, p3).then(console.log); +Pall(p1, p2, p3).then(console.log); // [1, 2, 3] (after about 2 seconds) ``` diff --git a/snippets/debounce.md b/snippets/debounce.md new file mode 100644 index 000000000..941ab59a3 --- /dev/null +++ b/snippets/debounce.md @@ -0,0 +1,29 @@ +### debounce + +Creates a debounced function that delays invoking the provided function until after `wait` milliseconds have elapsed since the last time the debounced function was invoked. + +Use `setTimeout()` and `clearTimeout()` to debounce the given method, `fn`. +Use `Function.apply()` to apply the `this` context to the function and provide the necessary `arguments`. +Omit the second argument, `wait`, to set the timeout at a default of 0 ms. + +```js +const debounce = (fn, wait = 0) => { + let inDebounce; + return function() { + const context = this, + args = arguments; + clearTimeout(inDebounce); + inDebounce = setTimeout(() => fn.apply(context, args), wait); + }; +}; +``` + +```js +window.addEventListener( + 'resize', + debounce(function(evt) { + console.log(window.innerWidth); + console.log(window.innerHeight); + }, 250) +); // Will log the window dimensions at most every 250ms +``` diff --git a/snippets/overArgs.md b/snippets/overArgs.md new file mode 100644 index 000000000..9a913e049 --- /dev/null +++ b/snippets/overArgs.md @@ -0,0 +1,19 @@ +### overArgs + +Creates a function that invokes the provided function with its arguments transformed. + +Use `Array.map()` to apply `transforms` to `args` in combination with the spread operator (`...`) to pass the transformed arguments to `fn`. + +```js +const overArgs = (fn, transforms) => (...args) => fn(...args.map((val, i) => transforms[i](val))); +``` + +```js +var func = overArgs( + function(x, y) { + return [x, y]; + }, + [square, doubled] +); +func(9, 3); // [81, 6] +``` diff --git a/snippets/pipeAsyncFunctions.md b/snippets/pipeAsyncFunctions.md new file mode 100644 index 000000000..574591cb0 --- /dev/null +++ b/snippets/pipeAsyncFunctions.md @@ -0,0 +1,23 @@ +### pipeAsyncFunctions + +Performs left-to-right function composition for asynchronous functions. + +Use `Array.reduce()` with the spread operator (`...`) to perform left-to-right function composition using `Promise.then()`. +The functions can return a combination of: simple values, `Promise`'s, or they can be defined as `async` ones returning through `await`. +All functions must be unary. + +```js +const pipeAsyncFunctions = (...fns) => arg => fns.reduce((p, f) => p.then(f), Promise.resolve(arg)); +``` + +```js +const sum = pipeAsyncFunctions( + x => x + 1, + x => new Promise(resolve => setTimeout(() => resolve(x + 2), 1000)), + x => x + 3, + async x => (await x) + 4 +); +(async () => { + console.log(await sum(5)); // 15 (after one second) +})(); +``` diff --git a/snippets/rearg.md b/snippets/rearg.md new file mode 100644 index 000000000..f58ea2f58 --- /dev/null +++ b/snippets/rearg.md @@ -0,0 +1,25 @@ +### rearg + +Creates a function that invokes the provided function with its arguments arranged according to the specified indexes. + +Use `Array.reduce()` and `Array.indexOf()` to reorder arguments based on `indexes` in combination with the spread operator (`...`) to pass the transformed arguments to `fn`. + +```js +const rearg = (fn, indexes) => (...args) => + fn( + ...args.reduce( + (acc, val, i) => ((acc[indexes.indexOf(i)] = val), acc), + Array.from({ length: indexes.length }) + ) + ); +``` + +```js +var rearged = rearg( + function(a, b, c) { + return [a, b, c]; + }, + [2, 0, 1] +); +rearged('b', 'c', 'a'); // ['a', 'b', 'c'] +``` diff --git a/snippets/throttle.md b/snippets/throttle.md new file mode 100644 index 000000000..5e1d01fd7 --- /dev/null +++ b/snippets/throttle.md @@ -0,0 +1,41 @@ +### throttle + +Creates a throttled function that only invokes the provided function at most once per every `wait` milliseconds + +Use `setTimeout()` and `clearTimeout()` to throttle the given method, `fn`. +Use `Function.apply()` to apply the `this` context to the function and provide the necessary `arguments`. +Use `Date.now()` to keep track of the last time the throttled function was invoked. +Omit the second argument, `wait`, to set the timeout at a default of 0 ms. + +```js +const throttle = (fn, wait) => { + let inThrottle, lastFn, lastTime; + return function() { + const context = this, + args = arguments; + if (!inThrottle) { + fn.apply(context, args); + lastTime = Date.now(); + inThrottle = true; + } else { + clearTimeout(lastFn); + lastFn = setTimeout(function() { + if (Date.now() - lastTime >= wait) { + fn.apply(context, args); + lastTime = Date.now(); + } + }, wait - (Date.now() - lastTime)); + } + }; +}; +``` + +```js +window.addEventListener( + 'resize', + throttle(function(evt) { + console.log(window.innerWidth); + console.log(window.innerHeight); + }, 250) +); // Will log the window dimensions at most every 250ms +``` diff --git a/tag_database b/tag_database index 0f8821946..4a5a0f084 100644 --- a/tag_database +++ b/tag_database @@ -2,6 +2,7 @@ anagrams:string,recursion arrayToHtmlList:browser,array ary:adapter,function atob:node,string,utility +attempt:function average:math,array averageBy:math,array,function bind:function,object @@ -32,6 +33,7 @@ createElement:browser,utility createEventHub:browser,event,advanced currentURL:browser,url curry:function,recursion +debounce:function decapitalize:string,array deepClone:object,recursion deepFlatten:array,recursion @@ -161,6 +163,7 @@ once:function onUserInputChange:browser,event,advanced orderBy:object,array over:adapter,function +overArgs:adapter,function palindrome:string parseCookie:utility,string partial:function @@ -169,6 +172,7 @@ partition:array,object,function percentile:math pick:object,array pickBy:object,array,function +pipeAsyncFunctions:adapter,function,promise pipeFunctions:adapter,function pluralize:string powerset:math @@ -184,6 +188,7 @@ randomIntArrayInRange:math,utility,random randomIntegerInRange:math,utility,random randomNumberInRange:math,utility,random readFileLines:node,array,string +rearg:adapter,function redirect:browser,url reducedFilter:array reduceSuccessive:array,function @@ -227,6 +232,7 @@ take:array takeRight:array takeRightWhile:array,function takeWhile:array,function +throttle:function times:function timeTaken:utility toCamelCase:string,regexp diff --git a/test/anagrams/anagrams.test.js b/test/anagrams/anagrams.test.js index 4318f4c46..a7987d63f 100644 --- a/test/anagrams/anagrams.test.js +++ b/test/anagrams/anagrams.test.js @@ -6,9 +6,11 @@ test('Testing anagrams', (t) => { //Please go to https://github.com/substack/tape t.true(typeof anagrams === 'function', 'anagrams is a Function'); t.deepEqual(anagrams('abc'), ['abc','acb','bac','bca','cab','cba'], "Generates all anagrams of a string"); + t.deepEqual(anagrams('a'), ['a'], "Works for single-letter strings"); + t.deepEqual(anagrams(''), [''], "Works for empty strings"); //t.deepEqual(anagrams(args..), 'Expected'); //t.equal(anagrams(args..), 'Expected'); //t.false(anagrams(args..), 'Expected'); //t.throws(anagrams(args..), 'Expected'); t.end(); -}); \ No newline at end of file +}); diff --git a/test/ary/ary.test.js b/test/ary/ary.test.js index 445b40618..065b18a96 100644 --- a/test/ary/ary.test.js +++ b/test/ary/ary.test.js @@ -5,9 +5,11 @@ test('Testing ary', (t) => { //For more information on all the methods supported by tape //Please go to https://github.com/substack/tape t.true(typeof ary === 'function', 'ary is a Function'); + const firstTwoMax = ary(Math.max, 2); + t.deepEquals([[2, 6, 'a'], [8, 4, 6], [10]].map(x => firstTwoMax(...x)), [6, 8, 10], 'Discards arguments with index >=n') //t.deepEqual(ary(args..), 'Expected'); //t.equal(ary(args..), 'Expected'); //t.false(ary(args..), 'Expected'); //t.throws(ary(args..), 'Expected'); t.end(); -}); \ No newline at end of file +}); diff --git a/test/attempt/attempt.js b/test/attempt/attempt.js new file mode 100644 index 000000000..6d079c71e --- /dev/null +++ b/test/attempt/attempt.js @@ -0,0 +1,8 @@ +const attempt = (fn, ...args) => { +try { +return fn(args); +} catch (e) { +return e instanceof Error ? e : new Error(e); +} +}; +module.exports = attempt \ No newline at end of file diff --git a/test/attempt/attempt.test.js b/test/attempt/attempt.test.js new file mode 100644 index 000000000..13ae65686 --- /dev/null +++ b/test/attempt/attempt.test.js @@ -0,0 +1,15 @@ +const test = require('tape'); +const attempt = require('./attempt.js'); + +test('Testing attempt', (t) => { + //For more information on all the methods supported by tape + //Please go to https://github.com/substack/tape + t.true(typeof attempt === 'function', 'attempt is a Function'); + t.equals(attempt(() => 0), 0, 'Returns a value'); + t.true(attempt(() => {throw new Error()}) instanceof Error, 'Returns an error'); + //t.deepEqual(attempt(args..), 'Expected'); + //t.equal(attempt(args..), 'Expected'); + //t.false(attempt(args..), 'Expected'); + //t.throws(attempt(args..), 'Expected'); + t.end(); +}); diff --git a/test/bind/bind.test.js b/test/bind/bind.test.js index 6ad403682..e3ba1054c 100644 --- a/test/bind/bind.test.js +++ b/test/bind/bind.test.js @@ -5,9 +5,15 @@ test('Testing bind', (t) => { //For more information on all the methods supported by tape //Please go to https://github.com/substack/tape t.true(typeof bind === 'function', 'bind is a Function'); + function greet(greeting, punctuation) { + return greeting + ' ' + this.user + punctuation; + } + const freddy = { user: 'fred' }; + const freddyBound = bind(greet, freddy); + t.equals(freddyBound('hi', '!'),'hi fred!', 'Binds to an object context'); //t.deepEqual(bind(args..), 'Expected'); //t.equal(bind(args..), 'Expected'); //t.false(bind(args..), 'Expected'); //t.throws(bind(args..), 'Expected'); t.end(); -}); \ No newline at end of file +}); diff --git a/test/bindAll/bindAll.js b/test/bindAll/bindAll.js index cf66ad583..187778935 100644 --- a/test/bindAll/bindAll.js +++ b/test/bindAll/bindAll.js @@ -1,8 +1,10 @@ const bindAll = (obj, ...fns) => fns.forEach( -fn => +fn => ( +(f = obj[fn]), (obj[fn] = function() { -return fn.apply(obj); +return f.apply(obj); }) +) ); module.exports = bindAll \ No newline at end of file diff --git a/test/bindAll/bindAll.test.js b/test/bindAll/bindAll.test.js index 513eae230..90c9e23a8 100644 --- a/test/bindAll/bindAll.test.js +++ b/test/bindAll/bindAll.test.js @@ -5,9 +5,17 @@ test('Testing bindAll', (t) => { //For more information on all the methods supported by tape //Please go to https://github.com/substack/tape t.true(typeof bindAll === 'function', 'bindAll is a Function'); + var view = { + label: 'docs', + 'click': function() { + return 'clicked ' + this.label; + } + } + bindAll(view, 'click'); + t.equal(view.click(), 'clicked docs', 'Binds to an object context') //t.deepEqual(bindAll(args..), 'Expected'); //t.equal(bindAll(args..), 'Expected'); //t.false(bindAll(args..), 'Expected'); //t.throws(bindAll(args..), 'Expected'); t.end(); -}); \ No newline at end of file +}); diff --git a/test/bindKey/bindKey.test.js b/test/bindKey/bindKey.test.js index 36619ebcd..2aed1fb1e 100644 --- a/test/bindKey/bindKey.test.js +++ b/test/bindKey/bindKey.test.js @@ -5,9 +5,17 @@ test('Testing bindKey', (t) => { //For more information on all the methods supported by tape //Please go to https://github.com/substack/tape t.true(typeof bindKey === 'function', 'bindKey is a Function'); + const freddy = { + user: 'fred', + greet: function(greeting, punctuation) { + return greeting + ' ' + this.user + punctuation; + } + }; + const freddyBound = bindKey(freddy, 'greet'); + t.equal(freddyBound('hi', '!'), 'hi fred!', 'Binds function to an object context'); //t.deepEqual(bindKey(args..), 'Expected'); //t.equal(bindKey(args..), 'Expected'); //t.false(bindKey(args..), 'Expected'); //t.throws(bindKey(args..), 'Expected'); t.end(); -}); \ No newline at end of file +}); diff --git a/test/byteSize/byteSize.test.js b/test/byteSize/byteSize.test.js index 32718fada..b79b83889 100644 --- a/test/byteSize/byteSize.test.js +++ b/test/byteSize/byteSize.test.js @@ -5,6 +5,9 @@ test('Testing byteSize', (t) => { //For more information on all the methods supported by tape //Please go to https://github.com/substack/tape t.true(typeof byteSize === 'function', 'byteSize is a Function'); + // Blob is not part of Node apparently? + //t.equal(byteSize('Hello World'), 11, 'Works for text'); + //t.equal(byteSize('😀'), 4, 'Works for emojis'); // Works only in browser // t.equal(byteSize('Hello World'), 11, "Returns the length of a string in bytes"); //t.deepEqual(byteSize(args..), 'Expected'); @@ -12,4 +15,4 @@ test('Testing byteSize', (t) => { //t.false(byteSize(args..), 'Expected'); //t.throws(byteSize(args..), 'Expected'); t.end(); -}); \ No newline at end of file +}); diff --git a/test/collectInto/collectInto.test.js b/test/collectInto/collectInto.test.js index a3d303e5a..557134336 100644 --- a/test/collectInto/collectInto.test.js +++ b/test/collectInto/collectInto.test.js @@ -5,9 +5,14 @@ test('Testing collectInto', (t) => { //For more information on all the methods supported by tape //Please go to https://github.com/substack/tape t.true(typeof collectInto === 'function', 'collectInto is a Function'); + const Pall = collectInto(Promise.all.bind(Promise)); + let p1 = Promise.resolve(1); + let p2 = Promise.resolve(2); + let p3 = new Promise(resolve => setTimeout(resolve, 2000, 3)); + Pall(p1, p2, p3).then(function(val){ t.deepEqual(val, [1,2,3], 'Works with multiple promises')}, function(reason){}); //t.deepEqual(collectInto(args..), 'Expected'); //t.equal(collectInto(args..), 'Expected'); //t.false(collectInto(args..), 'Expected'); //t.throws(collectInto(args..), 'Expected'); t.end(); -}); \ No newline at end of file +}); diff --git a/test/countBy/countBy.test.js b/test/countBy/countBy.test.js index ea6c3b748..94296d017 100644 --- a/test/countBy/countBy.test.js +++ b/test/countBy/countBy.test.js @@ -5,9 +5,11 @@ test('Testing countBy', (t) => { //For more information on all the methods supported by tape //Please go to https://github.com/substack/tape t.true(typeof countBy === 'function', 'countBy is a Function'); + t.deepEqual(countBy([6.1, 4.2, 6.3], Math.floor), {4: 1, 6: 2}, 'Works for functions'); + t.deepEqual(countBy(['one', 'two', 'three'], 'length'), {3: 2, 5: 1}, 'Works for property names'); //t.deepEqual(countBy(args..), 'Expected'); //t.equal(countBy(args..), 'Expected'); //t.false(countBy(args..), 'Expected'); //t.throws(countBy(args..), 'Expected'); t.end(); -}); \ No newline at end of file +}); diff --git a/test/debounce/debounce.js b/test/debounce/debounce.js new file mode 100644 index 000000000..430bfeaed --- /dev/null +++ b/test/debounce/debounce.js @@ -0,0 +1,10 @@ +const debounce = (fn, wait = 0) => { +let inDebounce; +return function() { +const context = this, +args = arguments; +clearTimeout(inDebounce); +inDebounce = setTimeout(() => fn.apply(context, args), wait); +}; +}; +module.exports = debounce \ No newline at end of file diff --git a/test/debounce/debounce.test.js b/test/debounce/debounce.test.js new file mode 100644 index 000000000..f1a35323c --- /dev/null +++ b/test/debounce/debounce.test.js @@ -0,0 +1,13 @@ +const test = require('tape'); +const debounce = require('./debounce.js'); + +test('Testing debounce', (t) => { + //For more information on all the methods supported by tape + //Please go to https://github.com/substack/tape + t.true(typeof debounce === 'function', 'debounce is a Function'); + //t.deepEqual(debounce(args..), 'Expected'); + //t.equal(debounce(args..), 'Expected'); + //t.false(debounce(args..), 'Expected'); + //t.throws(debounce(args..), 'Expected'); + t.end(); +}); \ No newline at end of file diff --git a/test/decapitalize/decapitalize.test.js b/test/decapitalize/decapitalize.test.js index c18264447..83bf6b32a 100644 --- a/test/decapitalize/decapitalize.test.js +++ b/test/decapitalize/decapitalize.test.js @@ -5,9 +5,11 @@ test('Testing decapitalize', (t) => { //For more information on all the methods supported by tape //Please go to https://github.com/substack/tape t.true(typeof decapitalize === 'function', 'decapitalize is a Function'); + t.equal(decapitalize('FooBar'), 'fooBar', 'Works with default parameter'); + t.equal(decapitalize('FooBar', true), 'fOOBAR', 'Works with second parameter set to true'); //t.deepEqual(decapitalize(args..), 'Expected'); //t.equal(decapitalize(args..), 'Expected'); //t.false(decapitalize(args..), 'Expected'); //t.throws(decapitalize(args..), 'Expected'); t.end(); -}); \ No newline at end of file +}); diff --git a/test/dropWhile/dropWhile.test.js b/test/dropWhile/dropWhile.test.js index 6e0ecf54e..198d8202a 100644 --- a/test/dropWhile/dropWhile.test.js +++ b/test/dropWhile/dropWhile.test.js @@ -10,4 +10,4 @@ test('Testing dropWhile', (t) => { //t.false(dropWhile(args..), 'Expected'); //t.throws(dropWhile(args..), 'Expected'); t.end(); -}); \ No newline at end of file +}); diff --git a/test/overArgs/overArgs.js b/test/overArgs/overArgs.js new file mode 100644 index 000000000..41250eb89 --- /dev/null +++ b/test/overArgs/overArgs.js @@ -0,0 +1,2 @@ +const overArgs = (fn, transforms) => (...args) => fn(...args.map((val, i) => transforms[i](val))); +module.exports = overArgs \ No newline at end of file diff --git a/test/overArgs/overArgs.test.js b/test/overArgs/overArgs.test.js new file mode 100644 index 000000000..81c194c90 --- /dev/null +++ b/test/overArgs/overArgs.test.js @@ -0,0 +1,13 @@ +const test = require('tape'); +const overArgs = require('./overArgs.js'); + +test('Testing overArgs', (t) => { + //For more information on all the methods supported by tape + //Please go to https://github.com/substack/tape + t.true(typeof overArgs === 'function', 'overArgs is a Function'); + //t.deepEqual(overArgs(args..), 'Expected'); + //t.equal(overArgs(args..), 'Expected'); + //t.false(overArgs(args..), 'Expected'); + //t.throws(overArgs(args..), 'Expected'); + t.end(); +}); \ No newline at end of file diff --git a/test/pipeAsyncFunctions/pipeAsyncFunctions.js b/test/pipeAsyncFunctions/pipeAsyncFunctions.js new file mode 100644 index 000000000..09091affc --- /dev/null +++ b/test/pipeAsyncFunctions/pipeAsyncFunctions.js @@ -0,0 +1,2 @@ +const pipeAsyncFunctions = (...fns) => arg => fns.reduce((p, f) => p.then(f), Promise.resolve(arg)); +module.exports = pipeAsyncFunctions \ No newline at end of file diff --git a/test/pipeAsyncFunctions/pipeAsyncFunctions.test.js b/test/pipeAsyncFunctions/pipeAsyncFunctions.test.js new file mode 100644 index 000000000..7a4ae346e --- /dev/null +++ b/test/pipeAsyncFunctions/pipeAsyncFunctions.test.js @@ -0,0 +1,24 @@ +const test = require('tape'); +const pipeAsyncFunctions = require('./pipeAsyncFunctions.js'); + +test('Testing pipeAsyncFunctions', async (t) => { + //For more information on all the methods supported by tape + //Please go to https://github.com/substack/tape + t.true(typeof pipeAsyncFunctions === 'function', 'pipeAsyncFunctions is a Function'); + //t.deepEqual(pipeAsyncFunctions(args..), 'Expected'); + //t.equal(pipeAsyncFunctions(args..), 'Expected'); + //t.false(pipeAsyncFunctions(args..), 'Expected'); + //t.throws(pipeAsyncFunctions(args..), 'Expected'); + t.equal( + await pipeAsyncFunctions( + (x) => x + 1, + (x) => new Promise((resolve) => setTimeout(() => resolve(x + 2), 0)), + (x) => x + 3, + async (x) => await x + 4, + ) + (5), + 15, + 'pipeAsyncFunctions result should be 15' + ); + t.end(); +}); \ No newline at end of file diff --git a/test/rearg/rearg.js b/test/rearg/rearg.js new file mode 100644 index 000000000..b2f97244c --- /dev/null +++ b/test/rearg/rearg.js @@ -0,0 +1,8 @@ +const rearg = (fn, indexes) => (...args) => +fn( +...args.reduce( +(acc, val, i) => ((acc[indexes.indexOf(i)] = val), acc), +Array.from({ length: indexes.length }) +) +); +module.exports = rearg \ No newline at end of file diff --git a/test/rearg/rearg.test.js b/test/rearg/rearg.test.js new file mode 100644 index 000000000..9139d3f64 --- /dev/null +++ b/test/rearg/rearg.test.js @@ -0,0 +1,13 @@ +const test = require('tape'); +const rearg = require('./rearg.js'); + +test('Testing rearg', (t) => { + //For more information on all the methods supported by tape + //Please go to https://github.com/substack/tape + t.true(typeof rearg === 'function', 'rearg is a Function'); + //t.deepEqual(rearg(args..), 'Expected'); + //t.equal(rearg(args..), 'Expected'); + //t.false(rearg(args..), 'Expected'); + //t.throws(rearg(args..), 'Expected'); + t.end(); +}); \ No newline at end of file diff --git a/test/round/round.test.js b/test/round/round.test.js index 7af718c04..2aa705899 100644 --- a/test/round/round.test.js +++ b/test/round/round.test.js @@ -5,9 +5,19 @@ test('Testing round', (t) => { //For more information on all the methods supported by tape //Please go to https://github.com/substack/tape t.true(typeof round === 'function', 'round is a Function'); - t.equal(round(1.005, 2), 1.01, "Rounds a number to a specified amount of digits."); - //t.equal(round(args..), 'Expected'); - //t.false(round(args..), 'Expected'); - //t.throws(round(args..), 'Expected'); + t.equal(round(1.005, 2), 1.01, "round(1.005, 2) returns 1.01"); + t.equal(round(123.3423345345345345344, 11), 123.34233453453, "round(123.3423345345345345344, 11) returns 123.34233453453"); + t.equal(round(3.342, 11), 3.342, "round(3.342, 11) returns 3.342"); + t.equal(round(1.005), 1, "round(1.005) returns 1"); + t.true(isNaN(round([1.005, 2])), 'round([1.005, 2]) returns NaN'); + t.true(isNaN(round('string')), 'round(string) returns NaN'); + t.true(isNaN(round()), 'round() returns NaN'); + t.true(isNaN(round(132, 413, 4134)), 'round(132, 413, 4134) returns NaN'); + t.true(isNaN(round({a: 132}, 413)), 'round({a: 132}, 413) returns NaN'); + + let start = new Date().getTime(); + round(123.3423345345345345344, 11); + let end = new Date().getTime(); + t.true((end - start) < 2000, 'round(123.3423345345345345344, 11) takes less than 2s to run'); t.end(); -}); \ No newline at end of file +}); diff --git a/test/throttle/throttle.js b/test/throttle/throttle.js new file mode 100644 index 000000000..b26b6b74b --- /dev/null +++ b/test/throttle/throttle.js @@ -0,0 +1,21 @@ +const throttle = (fn, wait) => { +let inThrottle, lastFn, lastTime; +return function() { +const context = this, +args = arguments; +if (!inThrottle) { +fn.apply(context, args); +lastTime = Date.now(); +inThrottle = true; +} else { +clearTimeout(lastFn); +lastFn = setTimeout(function() { +if (Date.now() - lastTime >= wait) { +fn.apply(context, args); +lastTime = Date.now(); +} +}, wait - (Date.now() - lastTime)); +} +}; +}; +module.exports = throttle \ No newline at end of file diff --git a/test/throttle/throttle.test.js b/test/throttle/throttle.test.js new file mode 100644 index 000000000..4de75afdb --- /dev/null +++ b/test/throttle/throttle.test.js @@ -0,0 +1,13 @@ +const test = require('tape'); +const throttle = require('./throttle.js'); + +test('Testing throttle', (t) => { + //For more information on all the methods supported by tape + //Please go to https://github.com/substack/tape + t.true(typeof throttle === 'function', 'throttle is a Function'); + //t.deepEqual(throttle(args..), 'Expected'); + //t.equal(throttle(args..), 'Expected'); + //t.false(throttle(args..), 'Expected'); + //t.throws(throttle(args..), 'Expected'); + t.end(); +}); \ No newline at end of file diff --git a/test/toCamelCase/toCamelCase.test.js b/test/toCamelCase/toCamelCase.test.js index b41794011..0f3efc557 100644 --- a/test/toCamelCase/toCamelCase.test.js +++ b/test/toCamelCase/toCamelCase.test.js @@ -5,13 +5,18 @@ test('Testing toCamelCase', (t) => { //For more information on all the methods supported by tape //Please go to https://github.com/substack/tape t.true(typeof toCamelCase === 'function', 'toCamelCase is a Function'); - t.equal(toCamelCase('some_database_field_name'), 'someDatabaseFieldName', "Converts a string to camelCase"); - t.equal(toCamelCase('Some label that needs to be camelized'), 'someLabelThatNeedsToBeCamelized', "Converts a string to camelCase"); - t.equal(toCamelCase('some-javascript-property'), 'someJavascriptProperty', "Converts a string to camelCase"); - t.equal(toCamelCase('some-mixed_string with spaces_underscores-and-hyphens'), 'someMixedStringWithSpacesUnderscoresAndHyphens', "Converts a string to camelCase"); - //t.deepEqual(toCamelCase(args..), 'Expected'); - //t.equal(toCamelCase(args..), 'Expected'); - //t.false(toCamelCase(args..), 'Expected'); - //t.throws(toCamelCase(args..), 'Expected'); + t.equal(toCamelCase('some_database_field_name'), 'someDatabaseFieldName', "toCamelCase('some_database_field_name') returns someDatabaseFieldName"); + t.equal(toCamelCase('Some label that needs to be camelized'), 'someLabelThatNeedsToBeCamelized', "toCamelCase('Some label that needs to be camelized') returns someLabelThatNeedsToBeCamelized"); + t.equal(toCamelCase('some-javascript-property'), 'someJavascriptProperty', "toCamelCase('some-javascript-property') return someJavascriptProperty"); + t.equal(toCamelCase('some-mixed_string with spaces_underscores-and-hyphens'), 'someMixedStringWithSpacesUnderscoresAndHyphens', "toCamelCase('some-mixed_string with spaces_underscores-and-hyphens') returns someMixedStringWithSpacesUnderscoresAndHyphens"); + t.throws(() => toCamelCase(), 'toCamelCase() throws a error'); + t.throws(() => toCamelCase([]), 'toCamelCase([]) throws a error'); + t.throws(() => toCamelCase({}), 'toCamelCase({}) throws a error'); + t.throws(() => toCamelCase(123), 'toCamelCase(123) throws a error'); + + let start = new Date().getTime(); + toCamelCase('some-mixed_string with spaces_underscores-and-hyphens'); + let end = new Date().getTime(); + t.true((end - start) < 2000, 'toCamelCase(some-mixed_string with spaces_underscores-and-hyphens) takes less than 2s to run'); t.end(); -}); \ No newline at end of file +}); diff --git a/test/toKebabCase/toKebabCase.test.js b/test/toKebabCase/toKebabCase.test.js index fe305e2b2..e2dfd8891 100644 --- a/test/toKebabCase/toKebabCase.test.js +++ b/test/toKebabCase/toKebabCase.test.js @@ -5,13 +5,18 @@ test('Testing toKebabCase', (t) => { //For more information on all the methods supported by tape //Please go to https://github.com/substack/tape t.true(typeof toKebabCase === 'function', 'toKebabCase is a Function'); - t.equal(toKebabCase('camelCase'), 'camel-case', "string converts to snake case"); - t.equal(toKebabCase('some text'), 'some-text', "string converts to snake case"); - t.equal(toKebabCase('some-mixed-string With spaces-underscores-and-hyphens'), 'some-mixed-string-with-spaces-underscores-and-hyphens', "string converts to snake case"); - t.equal(toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML'), 'i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-some-xml-and-html', "string converts to snake case"); - //t.deepEqual(toKebabCase(args..), 'Expected'); - //t.equal(toKebabCase(args..), 'Expected'); - //t.false(toKebabCase(args..), 'Expected'); - //t.throws(toKebabCase(args..), 'Expected'); + t.equal(toKebabCase('camelCase'), 'camel-case', "toKebabCase('camelCase') returns camel-case"); + t.equal(toKebabCase('some text'), 'some-text', "toKebabCase('some text') returns some-text"); + t.equal(toKebabCase('some-mixed-string With spaces-underscores-and-hyphens'), 'some-mixed-string-with-spaces-underscores-and-hyphens', "toKebabCase('some-mixed-string With spaces-underscores-and-hyphens') returns some-mixed-string-with-spaces-underscores-and-hyphens"); + t.equal(toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML'), 'i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-some-xml-and-html', "toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') returns i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-some-xml-and-html"); + t.equal(toKebabCase(), undefined, 'toKebabCase() return undefined'); + t.throws(() => toKebabCase([]), 'toKebabCase([]) throws an error'); + t.throws(() => toKebabCase({}), 'toKebabCase({}) throws an error'); + t.throws(() => toKebabCase(123), 'toKebabCase(123) throws an error'); + + let start = new Date().getTime(); + toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') + let end = new Date().getTime(); + t.true((end - start) < 2000, 'toKebabCase(IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML) takes less than 2s to run'); t.end(); -}); \ No newline at end of file +}); diff --git a/test/toSafeInteger/toSafeInteger.test.js b/test/toSafeInteger/toSafeInteger.test.js index 508da718a..885f6e324 100644 --- a/test/toSafeInteger/toSafeInteger.test.js +++ b/test/toSafeInteger/toSafeInteger.test.js @@ -5,14 +5,20 @@ test('Testing toSafeInteger', (t) => { //For more information on all the methods supported by tape //Please go to https://github.com/substack/tape t.true(typeof toSafeInteger === 'function', 'toSafeInteger is a Function'); + t.true(Number(toSafeInteger(3.2)), 'Number(toSafeInteger(3.2)) is a number'); t.equal(toSafeInteger(3.2), 3, "Converts a value to a safe integer"); - t.equal(toSafeInteger('4.2'), 4, "Converts a value to a safe integer"); - t.equal(toSafeInteger(4.6), 5, "Converts a value to a safe integer"); - t.equal(toSafeInteger(1.5), 2, "Converts a value to a safe integer"); - t.equal(toSafeInteger(Infinity), 9007199254740991, "Converts a value to a safe integer"); - //t.deepEqual(toSafeInteger(args..), 'Expected'); - //t.equal(toSafeInteger(args..), 'Expected'); - //t.false(toSafeInteger(args..), 'Expected'); - //t.throws(toSafeInteger(args..), 'Expected'); + t.equal(toSafeInteger('4.2'), 4, "toSafeInteger('4.2') returns 4"); + t.equal(toSafeInteger(4.6), 5, "toSafeInteger(4.6) returns 5"); + t.equal(toSafeInteger([]), 0, "toSafeInteger([]) returns 0"); + t.true(isNaN(toSafeInteger([1.5, 3124])), "isNaN(toSafeInteger([1.5, 3124])) is true"); + t.true(isNaN(toSafeInteger('string')), "isNaN(toSafeInteger('string')) is true"); + t.true(isNaN(toSafeInteger({})), "isNaN(toSafeInteger({})) is true"); + t.true(isNaN(toSafeInteger()), "isNaN(toSafeInteger()) is true"); + t.equal(toSafeInteger(Infinity), 9007199254740991, "toSafeInteger(Infinity) returns 9007199254740991"); + + let start = new Date().getTime(); + toSafeInteger(3.2); + let end = new Date().getTime(); + t.true((end - start) < 2000, 'toSafeInteger(3.2) takes less than 2s to run'); t.end(); -}); \ No newline at end of file +}); diff --git a/test/toSnakeCase/toSnakeCase.test.js b/test/toSnakeCase/toSnakeCase.test.js index 14bed623d..72190fda2 100644 --- a/test/toSnakeCase/toSnakeCase.test.js +++ b/test/toSnakeCase/toSnakeCase.test.js @@ -5,14 +5,18 @@ test('Testing toSnakeCase', (t) => { //For more information on all the methods supported by tape //Please go to https://github.com/substack/tape t.true(typeof toSnakeCase === 'function', 'toSnakeCase is a Function'); - t.equal(toSnakeCase('camelCase'), 'camel_case', "string converts to snake case"); - t.equal(toSnakeCase('some text'), 'some_text', "string converts to snake case"); - t.equal(toSnakeCase('some-mixed_string With spaces_underscores-and-hyphens'), 'some_mixed_string_with_spaces_underscores_and_hyphens', "string converts to snake case"); - t.equal(toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML'), 'i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html', "string converts to snake case"); + t.equal(toSnakeCase('camelCase'), 'camel_case', "toSnakeCase('camelCase') returns camel_case"); + t.equal(toSnakeCase('some text'), 'some_text', "toSnakeCase('some text') returns some_text"); + t.equal(toSnakeCase('some-mixed_string With spaces_underscores-and-hyphens'), 'some_mixed_string_with_spaces_underscores_and_hyphens', "toSnakeCase('some-mixed_string With spaces_underscores-and-hyphens') returns some_mixed_string_with_spaces_underscores_and_hyphens"); + t.equal(toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML'), 'i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html', "toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') returns i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html"); + t.equal(toSnakeCase(), undefined, 'toSnakeCase() returns undefined'); + t.throws(() => toSnakeCase([]), 'toSnakeCase([]) throws an error'); + t.throws(() => toSnakeCase({}), 'toSnakeCase({}) throws an error'); + t.throws(() => toSnakeCase(123), 'toSnakeCase(123) throws an error'); - //t.deepEqual(toSnakeCase(args..), 'Expected'); - //t.equal(toSnakeCase(args..), 'Expected'); - //t.false(toSnakeCase(args..), 'Expected'); - //t.throws(toSnakeCase(args..), 'Expected'); + let start = new Date().getTime(); + toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML'); + let end = new Date().getTime(); + t.true((end - start) < 2000, 'toSnakeCase(IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML) takes less than 2s to run'); t.end(); -}); \ No newline at end of file +}); diff --git a/test/union/union.test.js b/test/union/union.test.js index 73427934a..fd6157918 100644 --- a/test/union/union.test.js +++ b/test/union/union.test.js @@ -5,10 +5,20 @@ test('Testing union', (t) => { //For more information on all the methods supported by tape //Please go to https://github.com/substack/tape t.true(typeof union === 'function', 'union is a Function'); - t.deepEqual(union([1, 2, 3], [4, 3, 2]), [1, 2, 3, 4], "Returns every element that exists in any of the two arrays once"); - //t.deepEqual(union(args..), 'Expected'); - //t.equal(union(args..), 'Expected'); - //t.false(union(args..), 'Expected'); - //t.throws(union(args..), 'Expected'); + t.deepEqual(union([1, 2, 3], [4, 3, 2]), [1, 2, 3, 4], "union([1, 2, 3], [4, 3, 2]) returns [1, 2, 3, 4]"); + t.deepEqual(union('str', 'asd'), [ 's', 't', 'r', 'a', 'd' ], "union('str', 'asd') returns [ 's', 't', 'r', 'a', 'd' ]"); + t.deepEqual(union([[], {}], [1, 2, 3]), [[], {}, 1, 2, 3], "union([[], {}], [1, 2, 3]) returns [[], {}, 1, 2, 3]"); + t.deepEqual(union([], []), [], "union([], []) returns []"); + t.throws(() => union(), 'union() throws an error'); + t.throws(() => union(true, 'str'), 'union(true, str) throws an error'); + t.throws(() => union('false', true), 'union(false, true) throws an error'); + t.throws(() => union(123, {}), 'union(123, {}) throws an error'); + t.throws(() => union([], {}), 'union([], {}) throws an error'); + t.throws(() => union(undefined, null), 'union(undefined, null) throws an error'); + + let start = new Date().getTime(); + union([1, 2, 3], [4, 3, 2]); + let end = new Date().getTime(); + t.true((end - start) < 2000, 'union([1, 2, 3], [4, 3, 2]) takes less than 2s to run'); t.end(); -}); \ No newline at end of file +}); diff --git a/test/uniqueElements/uniqueElements.test.js b/test/uniqueElements/uniqueElements.test.js index 38d55aea5..137f791dc 100644 --- a/test/uniqueElements/uniqueElements.test.js +++ b/test/uniqueElements/uniqueElements.test.js @@ -5,10 +5,24 @@ test('Testing uniqueElements', (t) => { //For more information on all the methods supported by tape //Please go to https://github.com/substack/tape t.true(typeof uniqueElements === 'function', 'uniqueElements is a Function'); - t.deepEqual(uniqueElements([1, 2, 2, 3, 4, 4, 5]), [1,2,3,4,5], "Returns all unique values of an array"); - //t.deepEqual(uniqueElements(args..), 'Expected'); - //t.equal(uniqueElements(args..), 'Expected'); - //t.false(uniqueElements(args..), 'Expected'); - //t.throws(uniqueElements(args..), 'Expected'); + t.deepEqual(uniqueElements([1, 2, 2, 3, 4, 4, 5]), [1,2,3,4,5], "uniqueElements([1, 2, 2, 3, 4, 4, 5]) returns [1,2,3,4,5]"); + t.deepEqual(uniqueElements([1, 23, 53]), [1, 23, 53], "uniqueElements([1, 23, 53]) returns [1, 23, 53]"); + t.deepEqual(uniqueElements([true, 0, 1, false, false, undefined, null, '']), [true, 0, 1, false, undefined, null, ''], "uniqueElements([true, 0, 1, false, false, undefined, null, '']) returns [true, 0, 1, false, false, undefined, null, '']"); + t.deepEqual(uniqueElements(), [], "uniqueElements() returns []"); + t.deepEqual(uniqueElements(null), [], "uniqueElements(null) returns []"); + t.deepEqual(uniqueElements(undefined), [], "uniqueElements(undefined) returns []"); + t.deepEqual(uniqueElements('strt'), ['s', 't', 'r'], "uniqueElements('strt') returns ['s', 't', 'r']"); + t.throws(() => uniqueElements(1, 1, 2543, 534, 5), 'uniqueElements(1, 1, 2543, 534, 5) throws an error'); + t.throws(() => uniqueElements({}), 'uniqueElements({}) throws an error'); + t.throws(() => uniqueElements(true), 'uniqueElements(true) throws an error'); + t.throws(() => uniqueElements(false), 'uniqueElements(false) throws an error'); + + let start = new Date().getTime(); + uniqueElements([true, 0, 1, false, false, undefined, null, '']) + let end = new Date().getTime(); + t.true((end - start) < 2000, 'uniqueElements([true, 0, 1, false, false, undefined, null]) takes less than 2s to run'); + t.end(); -}); \ No newline at end of file +}); + +uniqueElements([1, 2, 2, '1', 4, 4, 4, 5, true]); // [1,2,3,4,5]