Files
lodash/test/cond.spec.js
2023-09-21 07:45:49 -07:00

82 lines
2.4 KiB
JavaScript

import lodashStable from 'lodash';
import cond from '../src/cond';
import { stubA, stubB, stubC, slice, stubFalse, stubTrue } from './utils';
describe('cond', () => {
it('should create a conditional function', () => {
const resultFunc = cond([
[lodashStable.matches({ a: 1 }), stubA],
[lodashStable.matchesProperty('b', 1), stubB],
[lodashStable.property('c'), stubC],
]);
expect(resultFunc({ a: 1, b: 2, c: 3 })).toBe('a');
expect(resultFunc({ a: 0, b: 1, c: 2 })).toBe('b');
expect(resultFunc({ a: -1, b: 0, c: 1 })).toBe('c');
});
it('should provide arguments to functions', () => {
let args1;
let args2;
const expected = ['a', 'b', 'c'];
const resultFunc = cond([
[
function () {
args1 || (args1 = slice.call(arguments));
return true;
},
function () {
args2 || (args2 = slice.call(arguments));
},
],
]);
resultFunc('a', 'b', 'c');
expect(args1).toEqual(expected);
expect(args2).toEqual(expected);
});
it('should work with predicate shorthands', () => {
const resultFunc = cond([
[{ a: 1 }, stubA],
[['b', 1], stubB],
['c', stubC],
]);
expect(resultFunc({ a: 1, b: 2, c: 3 })).toBe('a');
expect(resultFunc({ a: 0, b: 1, c: 2 })).toBe('b');
expect(resultFunc({ a: -1, b: 0, c: 1 })).toBe('c');
});
it('should return `undefined` when no condition is met', () => {
const resultFunc = cond([[stubFalse, stubA]]);
expect(resultFunc({ a: 1 })).toBe(undefined);
});
it('should throw a TypeError if `pairs` is not resultFunc of functions', () => {
lodashStable.each([false, true], (value) => {
expect(() => {
cond([[stubTrue, value]])();
}).toThrowError(TypeError);
});
});
it('should use `this` binding of function for `pairs`', () => {
const resultFunc = cond([
[
function (a) {
return this[a];
},
function (a, b) {
return this[b];
},
],
]);
const object = { resultFunc, a: 1, b: 2 };
expect(object.resultFunc('a', 'b')).toBe(2);
});
});