|
|
- 'use strict';
- const assert = require('assert');
- const _ = require('lodash');
-
- describe('code snippet example', () => {
-
- it('compact', () => {
- assert.deepEqual(
- _.compact([0, 1, false, 2, '', 3]),
- [0, 1, false, 2, '', 3].filter(v => v)
- )
- })
-
- it('concat', () => {
- const lodashArray = [1]
- const lodashResult = _.concat(lodashArray, 2, [3], [[4]])
-
- const nativehArray = [1]
- const nativeResult = nativehArray.concat(2, [3], [[4]])
-
- assert.deepEqual(lodashResult, nativeResult)
- })
-
- it('pick', () => {
- var object = { 'a': 1, 'b': '2', 'c': 3 };
- function pick(object, paths) {
- const obj = {};
- for (const path of paths) {
- if (object[path]) {
- obj[path] = object[path]
- }
- }
- return obj;
- }
- assert.deepEqual(
- _.pick(object, ['a', 'c']),
- pick(object, ['a', 'c'])
- )
- })
-
- it('pickBy', () => {
- var object = { 'a': 1, 'b': null, 'c': 3, 'd': false, 'e': undefined, 'f': '', 'g': 0 };
- function pickBy(object) {
- const obj = {};
- for (const key in object) {
- if (object[key]) {
- obj[key] = object[key];
- }
- }
- return obj;
- }
- assert.deepEqual(
- _.pickBy(object),
- pickBy(object)
- )
- })
-
- describe('fill', () => {
- it("_.fill(array, 'a')", () => {
- var array = [1, 2, 3]
- assert.deepEqual(
- _.fill(array, 'a'),
- array.fill('a')
- )
- })
- it("_.fill(Array(3), 2)", () => {
- assert.deepEqual(
- _.fill(Array(3), 2),
- Array(3).fill(2)
- )
- })
-
- it("_.fill([4, 6, 8, 10], '*', 1, 3)", () => {
- assert.deepEqual(
- _.fill([4, 6, 8, 10], '*', 1, 3),
- [4, 6, 8, 10].fill('*', 1, 3)
- )
- })
- })
- describe('chunk', () => {
- const chunk = (input, size) => {
- return input.reduce((arr, item, idx) => {
- return idx % size === 0
- ? [...arr, [item]]
- : [...arr.slice(0, -1), [...arr.slice(-1)[0], item]];
- }, []);
- };
- it("_.chunk(['a', 'b', 'c', 'd'], 2);", () => {
- assert.deepEqual(
- _.chunk(['a', 'b', 'c', 'd'], 2),
- chunk(['a', 'b', 'c', 'd'], 2)
- )
- })
- it("_.chunk(['a', 'b', 'c', 'd'], 3);", () => {
- assert.deepEqual(
- _.chunk(['a', 'b', 'c', 'd'], 3),
- chunk(['a', 'b', 'c', 'd'], 3)
- )
- })
- })
- describe('times', () => {
- const times = (n, fn = (_, x) => x) => {
- return Array.from(Array(n), fn)
- };
- it("_.times(10);", () => {
- assert.deepEqual(
- _.times(10),
- times(10)
- )
- })
- it("_.times(10, x => x + 1);", () => {
- assert.deepEqual(
- _.times(10, x => x + 1),
- times(10, (_, x) => x + 1)
- )
- })
- })
-
- describe('assign', () => {
- function Foo() {
- this.c = 3;
- }
- function Bar() {
- this.e = 5;
- }
- Foo.prototype.d = 4;
- Bar.prototype.f = 6;
- const assign = (target, ...sources) => Object.assign(target, ...sources);
- it("_.assign({}, new Foo, new Bar);", () => {
- assert.deepEqual(
- _.assign({}, new Foo, new Bar),
- assign({}, new Foo, new Bar)
- )
- })
- it("_.assign(new Foo, new Bar);", () => {
- assert.deepEqual(
- _.assign(new Foo, new Bar),
- assign(new Foo, new Bar)
- )
- })
- })
- describe('extend', () => {
- function Foo() {
- this.c = 3;
- }
- function Bar() {
- this.e = 5;
- }
- Foo.prototype.d = 4;
- Bar.prototype.f = 6;
-
- const extend = (target, ...sources) => {
- const length = sources.length;
-
- if (length < 1 || target == null) return target;
- for (let i = 0; i < length; i++) {
- const source = sources[i];
-
- for (const key in source) {
- target[key] = source[key];
- }
- }
- return target;
- };
-
- it("_.extend({}, new Foo, new Bar);", () => {
- assert.deepEqual(
- _.extend({}, new Foo, new Bar),
- extend({}, new Foo, new Bar)
- )
- })
- it("_.extend(new Foo, new Bar);", () => {
- assert.deepEqual(
- _.extend(new Foo, new Bar),
- extend(new Foo, new Bar)
- )
- })
- })
- describe('isEmpty', () => {
- const isEmpty = (obj) => {
- return (obj ? [Object, Array].includes(obj.constructor) && !Object.entries(obj).length : true);
- };
- it ('_.isEmpty(null)', () => {
- assert.equal(
- _.isEmpty(null),
- isEmpty(null)
- )
- })
- it ("_.isEmpty('')", () => {
- assert.equal(
- _.isEmpty(''),
- isEmpty('')
- )
- })
- it ("_.isEmpty({})", () => {
- assert.equal(
- _.isEmpty({}),
- isEmpty({})
- )
- })
- it ("_.isEmpty([])", () => {
- assert.equal(
- _.isEmpty([]),
- isEmpty([])
- )
- })
- it ("_.isEmpty({a: '1'})", () => {
- assert.equal(
- _.isEmpty({a: '1'}),
- isEmpty({a: '1'})
- )
- })
- })
- describe('isInteger', () => {
- it('_.isInteger(3)', () => {
- assert.equal(
- _.isInteger(3),
- Number.isInteger(3)
- )
- })
- it('_.isInteger("3")', () => {
- assert.equal(
- _.isInteger("3"),
- Number.isInteger("3")
- )
- })
- it('_.isInteger(2.9)', () => {
- assert.equal(
- _.isInteger(2.9),
- Number.isInteger(2.9)
- )
- })
- it('_.isInteger(NaN)', () => {
- assert.equal(
- _.isInteger(NaN),
- Number.isInteger(NaN)
- )
- })
- })
- describe('get', () => {
- const get = (obj, path, defaultValue) => {
- const travel = regexp =>
- String.prototype.split
- .call(path, regexp)
- .filter(Boolean)
- .reduce((res, key) => (res !== null && res !== undefined ? res[key] : res), obj);
- const result = travel(/[,[\]]+?/) || travel(/[,[\].]+?/);
- return result === undefined || result === obj ? defaultValue : result;
- };
- var obj = {
- aa: [{ b: { c: 0 }, 1: 0 }],
- dd: { ee: { ff: 2 } },
- gg: { h: 2 },
- "gg.h": 1,
- "kk.ll": { "mm.n": [3, 4, { "oo.p": 5 }] }
- };
-
- it ("should handle falsey values", () => {
- var val = _.get(obj, 'aa[0].b.c', 1)
- assert.strictEqual(val, get(obj, 'aa[0].b.c', 1))
- assert.notEqual(val, 1)
- })
- it ("should handle just bracket notation", () => {
- var val = _.get(obj, 'aa[0][1]', 1)
- assert.strictEqual(val, get(obj, 'aa[0][1]', 1))
- assert.notEqual(val, 1)
- })
- it ("should handle just period notation", () => {
- var val = _.get(obj, 'dd.ee.ff', 1)
- assert.strictEqual(val, get(obj, 'dd.ee.ff', 1))
- assert.notEqual(val, 1)
- })
- it ("should handle neither notation", () => {
- var val = _.get(obj, 'aa', 1)
- assert.deepEqual(val, get(obj, 'aa', 1))
- assert.notEqual(val, 1)
- })
- it ("should handle both notation", () => {
- var val = _.get(obj, 'aa[0].b.c', 1)
- assert.strictEqual(val, get(obj, 'aa[0].b.c', 1))
- assert.notEqual(val, 1)
- })
- it ("should handle array path", () => {
- var val = _.get(obj, ['aa', [0], 'b', 'c'], 1)
- assert.strictEqual(val, get(obj, ['aa', [0], 'b', 'c'], 1))
- assert.notEqual(val, 1)
- })
- it ("should handle undefined without default", () => {
- var val = _.get(obj, 'dd.b')
- assert.strictEqual(val, get(obj, 'dd.b'))
- })
- it ("should handle undefined with default", () => {
- var val = _.get(obj, 'dd.b', 1)
- assert.strictEqual(val, get(obj, 'dd.b', 1))
- })
- it ("should handle deep undefined without default", () => {
- var val = _.get(obj, 'dd.b.c')
- assert.strictEqual(val, get(obj, 'dd.b.c'))
- })
- it ("should handle deep undefined with default", () => {
- var val = _.get(obj, 'dd.b.c', 1)
- assert.strictEqual(val, get(obj, 'dd.b.c', 1))
- assert.strictEqual(val, 1);
- })
- it ("should handle null default", () => {
- var val = _.get(obj, 'dd.b', null)
- assert.strictEqual(val, get(obj, 'dd.b', null))
- assert.strictEqual(val, null);
- })
- it ("should handle empty path", () => {
- var val = _.get(obj, '', 1)
- assert.strictEqual(val, get(obj, '', 1))
- assert.notEqual(val, obj);
- })
- it ("should handle undefined obj", () => {
- var val = _.get(undefined, 'aa')
- assert.strictEqual(val, get(undefined, 'aa'))
- })
- it ("should handle path contains a key with dots", () => {
- var val = _.get(obj, 'gg.h')
- assert.strictEqual(val, get(obj, 'gg.h'))
- assert.strictEqual(val, 1)
- })
- it ("should handle array path of keys with dots", () => {
- var val = _.get(obj, ["kk.ll", "mm.n", 0, "oo.p"])
- assert.strictEqual(
- val,
- get(obj, ["kk.ll", "mm.n", 0, "oo.p"])
- );
- })
- })
- describe('split', () => {
- const source = 'a-b-c';
- const separator = '-';
- const limit = 2;
- it(`_.split("${source}", "${separator}")`, () => {
- assert.deepEqual(
- _.split(source, separator),
- source.split(separator)
- );
- })
- it(`_.split("${source}", "${separator}", ${limit})`, () => {
- assert.deepEqual(
- _.split(source, separator, limit),
- source.split(separator, limit)
- );
- })
- })
- describe('inRange', () => {
- const inRange = (num, init, final) => {
- if(final === undefined){
- final = init;
- init = 0;
- }
- return (num >= Math.min(init, final) && num < Math.max(init, final));
- }
-
- it('_.inRange(3, 2, 4)', () => {
- assert.equal(
- _.inRange(3, 2, 4),
- inRange(3, 2, 4)
- )
- });
-
- it('_.inRange(4, 8)', () => {
- assert.equal(
- _.inRange(4, 8),
- inRange(4, 8)
- )
- });
-
- it('_.inRange(4, 2)', () => {
- assert.equal(
- _.inRange(4, 2),
- inRange(4, 2)
- )
- });
-
- it('_.inRange(2, 2)', () => {
- assert.equal(
- _.inRange(2, 2),
- inRange(2, 2)
- )
- });
-
- it('_.inRange(1.2, 2)', () => {
- assert.equal(
- _.inRange(1.2, 2),
- inRange(1.2, 2)
- )
- });
-
- it('_.inRange(5.2, 4)', () => {
- assert.equal(
- _.inRange(5.2, 4),
- inRange(5.2, 4)
- )
- });
-
- it('_.inRange(-3, -2, -6)', () => {
- assert.equal(
- _.inRange(-3, -2, -6),
- inRange(-3, -2, -6)
- )
- });
-
- it('_.inRange(1, 1, 5)', () => {
- assert.equal(
- _.inRange(1, 1, 5),
- inRange(1, 1, 5)
- )
- });
- })
-
- describe('random', () => {
- const random = (a = 1, b = 0) => {
- const lower = Math.min(a, b);
- const upper = Math.max(a, b);
- return lower + Math.random() * (upper - lower);
- };
-
- const array = Array(1000).fill(0);
-
- it('random() in range [0, 1]', () => {
- assert.ok(array.every(() => {
- const randomValue = random();
- return randomValue >= 0 && randomValue <= 1;
- }));
- });
-
- it('random() is float', () => {
- assert.ok(array.some(() => {
- const randomValue = random();
- return !Number.isInteger(randomValue);
- }));
- });
-
- it('random(5) in range [0, 5]', () => {
- assert.ok(array.every(() => {
- const randomValue = random(5);
- return randomValue >= 0 && randomValue <= 5;
- }));
- });
-
- it('random(5) is float', () => {
- assert.ok(array.some(() => {
- const randomValue = random(5);
- return !Number.isInteger(randomValue);
- }));
- });
-
- it('random(-10) supports negative', () => {
- assert.ok(array.every(() => {
- const randomValue = random(-10);
- return randomValue <= 0;
- }));
- });
-
- it('random(10, 5) swap the bounds', () => {
- assert.ok(array.every(() => {
- const randomValue = random(10, 5);
- return randomValue >= 5 && randomValue <= 10;
- }));
- });
-
- it('random(-10, 10) supports negative', () => {
- assert.ok(array.some(() => {
- const randomValue = random(-10, 10);
- return randomValue > 0;
- }));
- assert.ok(array.some(() => {
- const randomValue = random(-10, 10);
- return randomValue < 0;
- }));
- });
-
- it('random(-10, 10) in range [-10, 10]', () => {
- assert.ok(array.every(() => {
- const randomValue = random(-10, 10);
- return randomValue >= -10 && randomValue <= 10;
- }));
- });
-
- it('random(1.2, 5.2) supports floats', () => {
- assert.ok(array.every(() => {
- const randomValue = random(1.2, 5.2);
- return randomValue >= 1.2 && randomValue <= 5.2;
- }));
- });
-
- it('random(100000, 100001) in range [100000, 100001]', () => {
- assert.ok(array.every(() => {
- const randomValue = random(100000, 100001);
- return randomValue >= 100000 && randomValue <= 100001;
- }));
- });
- });
-
- describe('randomInt', () => {
- const randomInt = (a = 1, b = 0) => {
- const lower = Math.ceil(Math.min(a, b));
- const upper = Math.floor(Math.max(a, b));
- return Math.floor(lower + Math.random() * (upper - lower + 1))
- };
-
- const array = Array(1000).fill(0);
-
- const uniq = (arr) => [...new Set(arr)];
-
- it('randomInt() return `0` or `1`', () => {
- const randoms = uniq(array.map(() => {
- return randomInt();
- })).sort();
- assert.deepStrictEqual(randoms, [0, 1]);
- });
-
- it('randomInt(5) in range [0, 5]', () => {
- assert.ok(array.every(() => {
- const randomValue = randomInt(5);
- return randomValue >= 0 && randomValue <= 5;
- }));
- });
-
- it('randomInt(5) is integer', () => {
- assert.ok(array.some(() => {
- const randomValue = randomInt(5);
- return Number.isInteger(randomValue);
- }));
- });
-
- it('randomInt(-10) supports negative', () => {
- assert.ok(array.every(() => {
- const randomValue = randomInt(-10);
- return randomValue <= 0;
- }));
- });
-
- it('randomInt(10, 5) swap the bounds', () => {
- assert.ok(array.every(() => {
- const randomValue = randomInt(10, 5);
- return randomValue >= 5 && randomValue <= 10;
- }));
- });
-
- it('randomInt(-10, 10) supports negative', () => {
- assert.ok(array.some(() => {
- const randomValue = randomInt(-10, 10);
- return randomValue > 0;
- }));
- assert.ok(array.some(() => {
- const randomValue = randomInt(-10, 10);
- return randomValue < 0;
- }));
- });
-
- it('randomInt(-10, 10) in range [-10, 10]', () => {
- assert.ok(array.every(() => {
- const randomValue = randomInt(-10, 10);
- return randomValue >= -10 && randomValue <= 10;
- }));
- });
-
- it('randomInt(1.2, 5.2) supports floats', () => {
- assert.ok(array.every(() => {
- const randomValue = randomInt(1.2, 5.2);
- return randomValue >= 2 && randomValue <= 5;
- }));
- });
-
- it('randomInt(100000, 100001) return `100000` or `100001`', () => {
- const randoms = uniq(array.map(() => {
- return randomInt(100000, 100001);
- })).sort();
- assert.deepStrictEqual(randoms, [100000, 100001]);
- });
- });
-
- describe('clamp', () => {
- const clamp = (number, boundOne, boundTwo) => {
- if (!boundTwo) {
- return Math.max(number, boundOne) === boundOne ? number : boundOne;
- } else if (Math.min(number, boundOne) === number) {
- return boundOne;
- } else if (Math.max(number, boundTwo) === number) {
- return boundTwo;
- }
- return number;
- };
- it('clamp(-10, -5, 5) returns lower bound if number is less than it', () => {
- assert.deepStrictEqual(clamp(-10, -5, 5), -5);
- });
- it('clamp(10, -5, 5) returns upper bound if number is greater than it', () => {
- assert.deepStrictEqual(clamp(10, -5, 5), 10);
- });
- it('clamp(10, -5) treats second parameter as upper bound', () => {
- assert.deepStrictEqual(clamp(10, -5), -5);
- });
- });
-
- describe('padStart', () => {
- it('_.padStart("123", 5, "0")', () => {
- assert.equal(
- _.padStart("123", 5, '0'),
- "123".padStart(5, '0')
- );
- })
-
- it('_.padStart("123", 6, "_-")', () => {
- assert.equal(
- _.padStart("123", 6, '_-'),
- "123".padStart(6, '_-')
- );
- })
- })
-
- describe('padEnd', () => {
- it('_.padEnd("123", 5, "0")', () => {
- assert.equal(
- _.padEnd("123", 5, '0'),
- "123".padEnd(5, '0')
- );
- })
-
- it('_.padEnd("123", 6, "_-")', () => {
- assert.equal(
- _.padEnd("123", 6, '_-'),
- "123".padEnd(6, '_-')
- );
- })
- })
-
- describe('upperFirst', () => {
- const upperFirst = (string) => {
- return string ? string.charAt(0).toUpperCase() + string.slice(1) : ''
- }
-
- it('_.upperFirst("george")', () => {
- assert.equal(
- _.upperFirst('george'),
- upperFirst('george')
- )
- })
-
- it('_.upperFirst(null)', () => {
- assert.equal(
- _.upperFirst(null),
- upperFirst(null)
- )
- })
-
- it('_.upperFirst("")', () => {
- assert.equal(
- _.upperFirst(''),
- upperFirst('')
- )
- })
- })
-
-
-
- describe('isString', () => {
- function isString(str) {
- if (str && typeof str.valueOf() === "string") {
- return true
- }
- return false
- }
-
- it('_.isString(abc)', () => {
- assert.deepEqual(_.isString("abc"),
- isString("abc"))
- });
-
- it('_.isString(1)', () => {
- assert.deepEqual(_.isString(1),
- isString(1))
- });
-
-
- });
-
-
- describe('isUndefined', () => {
- const definedVariable = 1; //defined variable (will return false)
- let undefinedVariable; //undefined variable (will return true)
-
- it('_.isUndefined(definedVariable)', () => {
- assert.equal(_.isUndefined(definedVariable),
- (definedVariable === undefined))
- });
-
- it('_(definedVariable).isUndefined()', () => {
- assert.equal(_(definedVariable).isUndefined(),
- (definedVariable === undefined))
- });
-
- it('_.isUndefined(undefinedVariable)', () => {
- assert.equal(_.isUndefined(undefinedVariable),
- (undefinedVariable === undefined))
- });
-
- it('_(undefinedVariable).isUndefined()', () => {
- assert.equal(_(undefinedVariable).isUndefined(),
- (undefinedVariable === undefined))
- });
-
- });
-
- describe('flatten', () => {
-
- it('_.flatten(twoLayerArray)', () => {
- const testArray = [1,2[3,4]];
- assert.deepEqual(_.flatten(testArray),
- testArray.reduce((a,b) => a.concat(b), []))
- });
-
- it('_.flatten(multiLayerArray)', () => {
- const testArray = [1,2[3,4,[5,6,[7,8]]]];
- assert.deepEqual(_.flatten(testArray),
- testArray.reduce((a,b) => a.concat(b), []))
- });
-
- });
-
- describe('forEach', () => {
- it('_.forEach(array)', () => {
- const testArray = [1,2,3,4];
-
- let lodashOutput = []
- let nativeOutput = []
-
- _.forEach(testArray, element => {
- lodashOutput.push(element);
- });
- testArray.forEach(element => {
- nativeOutput.push(element);
- });
-
- assert.deepEqual(lodashOutput,nativeOutput);
- });
-
- it('_.forEach(object)', () => {
- const testObject = {
- 'one':1,
- 'two':2,
- 'three':3,
- 'four':4,
- }
-
- let lodashOutput = []
- let nativeOutput = []
-
- _.forEach(testObject, value => {
- lodashOutput.push(value);
- });
-
- Object.entries(testObject).forEach(([key,value]) => {
- nativeOutput.push(value);
- });
-
- assert.deepEqual(lodashOutput,nativeOutput);
- });
- });
-
- describe('startsWith', () => {
- it(`_.startsWith('abc', 'a')`, () => {
- assert.deepEqual(
- _.startsWith('abc', 'a'),
- 'abc'.startsWith('a')
- );
- });
- it(`_.startsWith('abc', 'b')`, () => {
- assert.deepEqual(
- _.startsWith('abc', 'b'),
- 'abc'.startsWith('b')
- );
- });
- it(`_.startsWith('abc', 'b', 1)`, () => {
- assert.deepEqual(
- _.startsWith('abc', 'b', 1),
- 'abc'.startsWith('b', 1)
- );
- });
- });
-
- describe('endsWith', () => {
- it(`_.endsWith('abc', 'c')`, () => {
- assert.deepEqual(
- _.endsWith('abc', 'c'),
- 'abc'.endsWith('c')
- );
- });
- it(`_.endsWith('abc', 'b')`, () => {
- assert.deepEqual(
- _.endsWith('abc', 'b'),
- 'abc'.endsWith('b')
- );
- });
- it(`_.endsWith('abc', 'b', 2)`, () => {
- assert.deepEqual(
- _.endsWith('abc', 'b', 2),
- 'abc'.endsWith('b', 2)
- );
- });
- });
-
- describe('throttle', () => {
- function throttle(func, timeFrame) {
- var lastTime = 0;
- return function () {
- var now = new Date();
- if (now - lastTime >= timeFrame) {
- func();
- lastTime = now;
- }
- };
- }
-
- it('throttle is not called more than once within timeframe', () => {
- let callCount = 0;
- const fn = throttle(() => callCount++, 100);
-
- fn();
- fn();
- fn();
-
- assert.equal(callCount, 1);
- });
- })
- });
|