UNPKG

ts-prime

Version:

A utility library for JavaScript and Typescript.

317 lines (316 loc) 10.6 kB
import { isString, isBoolean, isArray, isDefined, isNil, isFunction, isError, isNumber, isObject, isPromise, isNot, haveKeys, } from './guards'; function assertType(data) { return data; } var dataProvider = function (t) { switch (t) { case 'number': return 5; case 'array': return [1, 2, 3]; case 'boolean': return false; case 'date': return new Date(); case 'function': return function () { }; case 'null': return null; case 'promise': return Promise.resolve(5); case 'string': return 'text'; case 'object': return { a: 'asd' }; case 'error': return new Error('asd'); } return 'text'; }; describe('Describe guards behavior', function () { test('isString: should work as type guard', function () { var data = dataProvider('string'); if (isString(data)) { expect(typeof data).toEqual('string'); assertType(data); } }); test('isString: should work even if data type is unknown', function () { var data = dataProvider('string'); if (isString(data)) { expect(typeof data).toEqual('string'); assertType(data); } }); test('isString: should work with literal types', function () { var data = function () { return 'a'; }; var x = data(); if (isString(x)) { expect(typeof x).toEqual('string'); assertType(x); } }); test('isString: should work as type guard in array', function () { var data = [ dataProvider('error'), dataProvider('string'), dataProvider('function'), dataProvider('null'), dataProvider('array'), dataProvider('boolean'), ].filter(isString); expect(data.every(function (c) { return typeof c === 'string'; })).toEqual(true); assertType(data); }); test('isBoolean: should work as type guard', function () { var data = dataProvider('boolean'); if (isBoolean(data)) { expect(typeof data).toEqual('boolean'); assertType(data); } var data1 = dataProvider('boolean'); if (isBoolean(data1)) { expect(typeof data1).toEqual('boolean'); assertType(data1); } var data2 = dataProvider('boolean'); if (isBoolean(data2)) { expect(typeof data2).toEqual('boolean'); assertType(data2); } }); test('isBoolean: should work as type guard in filter', function () { var data = [ dataProvider('error'), dataProvider('array'), dataProvider('function'), dataProvider('null'), dataProvider('array'), dataProvider('boolean'), ].filter(isBoolean); expect(data.every(function (c) { return typeof c === 'boolean'; })).toEqual(true); assertType(data); }); test('isArray: should work as type guard', function () { var data = dataProvider('array'); if (isArray(data)) { expect(Array.isArray(data)).toEqual(true); assertType(data); } var data1 = dataProvider('array'); if (isArray(data1)) { expect(Array.isArray(data1)).toEqual(true); assertType(data1); } }); test('isArray: should work as type guard in filter', function () { var data = [ dataProvider('error'), dataProvider('array'), dataProvider('function'), dataProvider('null'), dataProvider('array'), dataProvider('date'), ].filter(isArray); expect(data.every(function (c) { return Array.isArray(c); })).toEqual(true); assertType(data); }); test('isDefined": should work as type guard', function () { var data = dataProvider('date'); if (isDefined(data)) { expect(data instanceof Date).toEqual(true); assertType(data); } }); test('isDefined: should work as type guard in filter', function () { var data = [ dataProvider('error'), dataProvider('array'), dataProvider('function'), dataProvider('null'), dataProvider('number'), ].filter(isDefined); expect(data.length === 4).toEqual(true); assertType(data); }); test('isNil: should work as type guard', function () { var data = dataProvider('null'); if (isNil(data)) { expect(data).toEqual(null); assertType(data); } }); test('isNil: should work as type guard in filter', function () { var data = [ dataProvider('error'), dataProvider('array'), dataProvider('function'), dataProvider('function'), dataProvider('null'), dataProvider('number'), ].filter(isNil); expect(data.every(function (c) { return c == null; })).toEqual(true); assertType(data); }); test('isFunction: should work as type guard', function () { var data = dataProvider('null'); if (isFunction(data)) { expect(data).toEqual(null); assertType(data); } }); test('isFunction: should work as type guard in filter', function () { var data = [ dataProvider('error'), dataProvider('array'), dataProvider('function'), dataProvider('function'), dataProvider('object'), dataProvider('number'), ].filter(isFunction); expect(data.every(function (c) { return typeof c === 'function'; })).toEqual(true); assertType(data); }); test('isError: should work as type guard', function () { var data = dataProvider('error'); if (isError(data)) { expect(data instanceof Error).toEqual(true); assertType(data); } }); test('isError: should work as type guard in filter', function () { var data = [ dataProvider('error'), dataProvider('array'), dataProvider('boolean'), dataProvider('function'), dataProvider('object'), dataProvider('number'), ].filter(isError); expect(data.every(function (c) { return c instanceof Error; })).toEqual(true); assertType(data); }); test('isNumber: should work as type guard', function () { var data = dataProvider('number'); if (isNumber(data)) { expect(typeof data).toEqual('number'); assertType(data); } }); test('isNumber: should work as type guard in filter', function () { var data = [ dataProvider('promise'), dataProvider('array'), dataProvider('boolean'), dataProvider('function'), dataProvider('object'), dataProvider('number'), ].filter(isNumber); expect(data.every(function (c) { return typeof c === 'number'; })).toEqual(true); assertType(data); }); test('isObject: should work as type guard', function () { var data = dataProvider('object'); if (isObject(data)) { expect(typeof data).toEqual('object'); assertType(data); } }); test('isObject: should work as type guard', function () { var data = { data: 5 }; if (isObject(data)) { expect(typeof data).toEqual('object'); assertType(data); } }); test('isObject: should work as type guard', function () { var data = { data: 5 }; if (isObject(data)) { expect(typeof data).toEqual('object'); assertType(data); } }); test('isObject: should work as type guard in filter', function () { var data = [ dataProvider('promise'), dataProvider('array'), dataProvider('boolean'), dataProvider('function'), dataProvider('object'), ].filter(isObject); expect(data.every(function (c) { return typeof c === 'object' && !Array.isArray(c); })).toEqual(true); assertType(data); }); test('isPromise: should work as type guard', function () { var data = dataProvider('promise'); if (isPromise(data)) { expect(data instanceof Promise).toEqual(true); assertType(data); } }); test('isPromise: should work as type guard in filter', function () { var data = [ dataProvider('promise'), dataProvider('array'), dataProvider('boolean'), dataProvider('function'), ].filter(isPromise); expect(data.every(function (c) { return c instanceof Promise; })).toEqual(true); assertType(data); }); test('haveKeys: should work as type guard in filter', function () { var data = [ { x: 4, }, { a: 1, b: 2, }, { a: 1, b: 5, }, ].filter(haveKeys(['a', 'b'])); expect(data).toEqual([ { a: 1, b: 2, }, { a: 1, b: 5, }, ]); assertType(data); }); test('haveKeys: should work as type guard in filter', function () { var definedKeys = haveKeys(['a', 'b']); var obj = { x: 4, }; if (definedKeys(obj)) { assertType(obj); } }); test('isNot: should work as type guard', function () { var data = dataProvider('promise'); if (isNot(isString)(data)) { assertType(data); expect(data instanceof Promise).toEqual(true); } }); test('isNot: should work as type guard in filter', function () { var data = [ dataProvider('promise'), dataProvider('array'), dataProvider('boolean'), dataProvider('function'), ]; var result = data.filter(isNot(isPromise)); expect(result.some(function (c) { return c instanceof Promise; })).toEqual(false); assertType(result); }); });