52 lines
1.4 KiB
Plaintext
52 lines
1.4 KiB
Plaintext
/*!
|
|
* Chai - expectTypes utility
|
|
* Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
|
|
* MIT Licensed
|
|
*/
|
|
|
|
/**
|
|
* ### .expectTypes(obj, types)
|
|
*
|
|
* Ensures that the object being tested against is of a valid type.
|
|
*
|
|
* utils.expectTypes(this, ['array', 'object', 'string']);
|
|
*
|
|
* @param {Mixed} obj constructed Assertion
|
|
* @param {Array} type A list of allowed types for this assertion
|
|
* @namespace Utils
|
|
* @name expectTypes
|
|
* @api public
|
|
*/
|
|
|
|
var AssertionError = require('assertion-error');
|
|
var flag = require('./flag');
|
|
var type = require('type-detect');
|
|
|
|
module.exports = function expectTypes(obj, types) {
|
|
var flagMsg = flag(obj, 'message');
|
|
var ssfi = flag(obj, 'ssfi');
|
|
|
|
flagMsg = flagMsg ? flagMsg + ': ' : '';
|
|
|
|
obj = flag(obj, 'object');
|
|
types = types.map(function (t) { return t.toLowerCase(); });
|
|
types.sort();
|
|
|
|
// Transforms ['lorem', 'ipsum'] into 'a lorem, or an ipsum'
|
|
var str = types.map(function (t, index) {
|
|
var art = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(t.charAt(0)) ? 'an' : 'a';
|
|
var or = types.length > 1 && index === types.length - 1 ? 'or ' : '';
|
|
return or + art + ' ' + t;
|
|
}).join(', ');
|
|
|
|
var objType = type(obj).toLowerCase();
|
|
|
|
if (!types.some(function (expected) { return objType === expected; })) {
|
|
throw new AssertionError(
|
|
flagMsg + 'object tested must be ' + str + ', but ' + objType + ' given',
|
|
undefined,
|
|
ssfi
|
|
);
|
|
}
|
|
};
|