ts-prime
Version:
A utility library for JavaScript and Typescript.
319 lines (318 loc) • 10.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var guards_1 = require("./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 (guards_1.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 (guards_1.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 (guards_1.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(guards_1.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 (guards_1.isBoolean(data)) {
expect(typeof data).toEqual('boolean');
assertType(data);
}
var data1 = dataProvider('boolean');
if (guards_1.isBoolean(data1)) {
expect(typeof data1).toEqual('boolean');
assertType(data1);
}
var data2 = dataProvider('boolean');
if (guards_1.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(guards_1.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 (guards_1.isArray(data)) {
expect(Array.isArray(data)).toEqual(true);
assertType(data);
}
var data1 = dataProvider('array');
if (guards_1.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(guards_1.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 (guards_1.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(guards_1.isDefined);
expect(data.length === 4).toEqual(true);
assertType(data);
});
test('isNil: should work as type guard', function () {
var data = dataProvider('null');
if (guards_1.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(guards_1.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 (guards_1.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(guards_1.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 (guards_1.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(guards_1.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 (guards_1.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(guards_1.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 (guards_1.isObject(data)) {
expect(typeof data).toEqual('object');
assertType(data);
}
});
test('isObject: should work as type guard', function () {
var data = { data: 5 };
if (guards_1.isObject(data)) {
expect(typeof data).toEqual('object');
assertType(data);
}
});
test('isObject: should work as type guard', function () {
var data = { data: 5 };
if (guards_1.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(guards_1.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 (guards_1.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(guards_1.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(guards_1.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 = guards_1.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 (guards_1.isNot(guards_1.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(guards_1.isNot(guards_1.isPromise));
expect(result.some(function (c) { return c instanceof Promise; })).toEqual(false);
assertType(result);
});
});