1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797 |
- 'use strict';
- function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
- var getType = _interopDefault(require('should-type'));
- var eql = _interopDefault(require('should-equal'));
- var sformat = _interopDefault(require('should-format'));
- var shouldTypeAdaptors = require('should-type-adaptors');
- var shouldUtil = require('should-util');
- /*
- * should.js - assertion library
- * Copyright(c) 2010-2013 TJ Holowaychuk <tj@vision-media.ca>
- * Copyright(c) 2013-2016 Denis Bardadym <bardadymchik@gmail.com>
- * MIT Licensed
- */
- function isWrapperType(obj) {
- return obj instanceof Number ||
- obj instanceof String ||
- obj instanceof Boolean;
- }
- // XXX make it more strict: numbers, strings, symbols - and nothing else
- function convertPropertyName(name) {
- return (typeof name === 'symbol') ? name : String(name);
- }
- var functionName = sformat.functionName;
- /*
- * should.js - assertion library
- * Copyright(c) 2010-2013 TJ Holowaychuk <tj@vision-media.ca>
- * Copyright(c) 2013-2016 Denis Bardadym <bardadymchik@gmail.com>
- * MIT Licensed
- */
- var config = {
- typeAdaptors: shouldTypeAdaptors.defaultTypeAdaptorStorage,
- getFormatter: function(opts) {
- return new sformat.Formatter(opts || config);
- }
- };
- function format(value, opts) {
- return config.getFormatter(opts).format(value);
- }
- function formatProp(value) {
- var formatter = config.getFormatter();
- return sformat.formatPlainObjectKey.call(formatter, value);
- }
- /*
- * should.js - assertion library
- * Copyright(c) 2010-2013 TJ Holowaychuk <tj@vision-media.ca>
- * Copyright(c) 2013-2016 Denis Bardadym <bardadymchik@gmail.com>
- * MIT Licensed
- */
- /**
- * should AssertionError
- * @param {Object} options
- * @constructor
- * @memberOf should
- * @static
- */
- function AssertionError(options) {
- shouldUtil.merge(this, options);
- if (!options.message) {
- Object.defineProperty(this, 'message', {
- get: function() {
- if (!this._message) {
- this._message = this.generateMessage();
- this.generatedMessage = true;
- }
- return this._message;
- },
- configurable: true,
- enumerable: false
- }
- );
- }
- if (Error.captureStackTrace) {
- Error.captureStackTrace(this, this.stackStartFunction);
- } else {
- // non v8 browsers so we can have a stacktrace
- var err = new Error();
- if (err.stack) {
- var out = err.stack;
- if (this.stackStartFunction) {
- // try to strip useless frames
- var fn_name = functionName(this.stackStartFunction);
- var idx = out.indexOf('\n' + fn_name);
- if (idx >= 0) {
- // once we have located the function frame
- // we need to strip out everything before it (and its line)
- var next_line = out.indexOf('\n', idx + 1);
- out = out.substring(next_line + 1);
- }
- }
- this.stack = out;
- }
- }
- }
- var indent = ' ';
- function prependIndent(line) {
- return indent + line;
- }
- function indentLines(text) {
- return text.split('\n').map(prependIndent).join('\n');
- }
- // assert.AssertionError instanceof Error
- AssertionError.prototype = Object.create(Error.prototype, {
- name: {
- value: 'AssertionError'
- },
- generateMessage: {
- value: function() {
- if (!this.operator && this.previous) {
- return this.previous.message;
- }
- var actual = format(this.actual);
- var expected = 'expected' in this ? ' ' + format(this.expected) : '';
- var details = 'details' in this && this.details ? ' (' + this.details + ')' : '';
- var previous = this.previous ? '\n' + indentLines(this.previous.message) : '';
- return 'expected ' + actual + (this.negate ? ' not ' : ' ') + this.operator + expected + details + previous;
- }
- }
- });
- /*
- * should.js - assertion library
- * Copyright(c) 2010-2013 TJ Holowaychuk <tj@vision-media.ca>
- * Copyright(c) 2013-2016 Denis Bardadym <bardadymchik@gmail.com>
- * MIT Licensed
- */
- // a bit hacky way how to get error to do not have stack
- function LightAssertionError(options) {
- shouldUtil.merge(this, options);
- if (!options.message) {
- Object.defineProperty(this, 'message', {
- get: function() {
- if (!this._message) {
- this._message = this.generateMessage();
- this.generatedMessage = true;
- }
- return this._message;
- }
- });
- }
- }
- LightAssertionError.prototype = {
- generateMessage: AssertionError.prototype.generateMessage
- };
- /**
- * should Assertion
- * @param {*} obj Given object for assertion
- * @constructor
- * @memberOf should
- * @static
- */
- function Assertion(obj) {
- this.obj = obj;
- this.anyOne = false;
- this.negate = false;
- this.params = {actual: obj};
- }
- Assertion.prototype = {
- constructor: Assertion,
- /**
- * Base method for assertions.
- *
- * Before calling this method need to fill Assertion#params object. This method usually called from other assertion methods.
- * `Assertion#params` can contain such properties:
- * * `operator` - required string containing description of this assertion
- * * `obj` - optional replacement for this.obj, it usefull if you prepare more clear object then given
- * * `message` - if this property filled with string any others will be ignored and this one used as assertion message
- * * `expected` - any object used when you need to assert relation between given object and expected. Like given == expected (== is a relation)
- * * `details` - additional string with details to generated message
- *
- * @memberOf Assertion
- * @category assertion
- * @param {*} expr Any expression that will be used as a condition for asserting.
- * @example
- *
- * var a = new should.Assertion(42);
- *
- * a.params = {
- * operator: 'to be magic number',
- * }
- *
- * a.assert(false);
- * //throws AssertionError: expected 42 to be magic number
- */
- assert: function(expr) {
- if (expr) {
- return this;
- }
- var params = this.params;
- if ('obj' in params && !('actual' in params)) {
- params.actual = params.obj;
- } else if (!('obj' in params) && !('actual' in params)) {
- params.actual = this.obj;
- }
- params.stackStartFunction = params.stackStartFunction || this.assert;
- params.negate = this.negate;
- params.assertion = this;
- if (this.light) {
- throw new LightAssertionError(params);
- } else {
- throw new AssertionError(params);
- }
- },
- /**
- * Shortcut for `Assertion#assert(false)`.
- *
- * @memberOf Assertion
- * @category assertion
- * @example
- *
- * var a = new should.Assertion(42);
- *
- * a.params = {
- * operator: 'to be magic number',
- * }
- *
- * a.fail();
- * //throws AssertionError: expected 42 to be magic number
- */
- fail: function() {
- return this.assert(false);
- }
- };
- /**
- * Assertion used to delegate calls of Assertion methods inside of Promise.
- * It has almost all methods of Assertion.prototype
- *
- * @param {Promise} obj
- */
- function PromisedAssertion(/* obj */) {
- Assertion.apply(this, arguments);
- }
- /**
- * Make PromisedAssertion to look like promise. Delegate resolve and reject to given promise.
- *
- * @private
- * @returns {Promise}
- */
- PromisedAssertion.prototype.then = function(resolve, reject) {
- return this.obj.then(resolve, reject);
- };
- /**
- * Way to extend Assertion function. It uses some logic
- * to define only positive assertions and itself rule with negative assertion.
- *
- * All actions happen in subcontext and this method take care about negation.
- * Potentially we can add some more modifiers that does not depends from state of assertion.
- *
- * @memberOf Assertion
- * @static
- * @param {String} name Name of assertion. It will be used for defining method or getter on Assertion.prototype
- * @param {Function} func Function that will be called on executing assertion
- * @example
- *
- * Assertion.add('asset', function() {
- * this.params = { operator: 'to be asset' }
- *
- * this.obj.should.have.property('id').which.is.a.Number()
- * this.obj.should.have.property('path')
- * })
- */
- Assertion.add = function(name, func) {
- Object.defineProperty(Assertion.prototype, name, {
- enumerable: true,
- configurable: true,
- value: function() {
- var context = new Assertion(this.obj, this, name);
- context.anyOne = this.anyOne;
- context.onlyThis = this.onlyThis;
- // hack
- context.light = true;
- try {
- func.apply(context, arguments);
- } catch (e) {
- // check for fail
- if (e instanceof AssertionError || e instanceof LightAssertionError) {
- // negative fail
- if (this.negate) {
- this.obj = context.obj;
- this.negate = false;
- return this;
- }
- if (context !== e.assertion) {
- context.params.previous = e;
- }
- // positive fail
- context.negate = false;
- // hack
- context.light = false;
- context.fail();
- }
- // throw if it is another exception
- throw e;
- }
- // negative pass
- if (this.negate) {
- context.negate = true; // because .fail will set negate
- context.params.details = 'false negative fail';
- // hack
- context.light = false;
- context.fail();
- }
- // positive pass
- if (!this.params.operator) {
- this.params = context.params; // shortcut
- }
- this.obj = context.obj;
- this.negate = false;
- return this;
- }
- });
- Object.defineProperty(PromisedAssertion.prototype, name, {
- enumerable: true,
- configurable: true,
- value: function() {
- var args = arguments;
- this.obj = this.obj.then(function(a) {
- return a[name].apply(a, args);
- });
- return this;
- }
- });
- };
- /**
- * Add chaining getter to Assertion like .a, .which etc
- *
- * @memberOf Assertion
- * @static
- * @param {string} name name of getter
- * @param {function} [onCall] optional function to call
- */
- Assertion.addChain = function(name, onCall) {
- onCall = onCall || function() {};
- Object.defineProperty(Assertion.prototype, name, {
- get: function() {
- onCall.call(this);
- return this;
- },
- enumerable: true
- });
- Object.defineProperty(PromisedAssertion.prototype, name, {
- enumerable: true,
- configurable: true,
- get: function() {
- this.obj = this.obj.then(function(a) {
- return a[name];
- });
- return this;
- }
- });
- };
- /**
- * Create alias for some `Assertion` property
- *
- * @memberOf Assertion
- * @static
- * @param {String} from Name of to map
- * @param {String} to Name of alias
- * @example
- *
- * Assertion.alias('true', 'True')
- */
- Assertion.alias = function(from, to) {
- var desc = Object.getOwnPropertyDescriptor(Assertion.prototype, from);
- if (!desc) {
- throw new Error('Alias ' + from + ' -> ' + to + ' could not be created as ' + from + ' not defined');
- }
- Object.defineProperty(Assertion.prototype, to, desc);
- var desc2 = Object.getOwnPropertyDescriptor(PromisedAssertion.prototype, from);
- if (desc2) {
- Object.defineProperty(PromisedAssertion.prototype, to, desc2);
- }
- };
- /**
- * Negation modifier. Current assertion chain become negated. Each call invert negation on current assertion.
- *
- * @name not
- * @property
- * @memberOf Assertion
- * @category assertion
- */
- Assertion.addChain('not', function() {
- this.negate = !this.negate;
- });
- /**
- * Any modifier - it affect on execution of sequenced assertion to do not `check all`, but `check any of`.
- *
- * @name any
- * @property
- * @memberOf Assertion
- * @category assertion
- */
- Assertion.addChain('any', function() {
- this.anyOne = true;
- });
- /**
- * Only modifier - currently used with .keys to check if object contains only exactly this .keys
- *
- * @name only
- * @property
- * @memberOf Assertion
- * @category assertion
- */
- Assertion.addChain('only', function() {
- this.onlyThis = true;
- });
- // implement assert interface using already written peaces of should.js
- // http://wiki.commonjs.org/wiki/Unit_Testing/1.0
- //
- // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
- //
- // Originally from narwhal.js (http://narwhaljs.org)
- // Copyright (c) 2009 Thomas Robinson <280north.com>
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the 'Software'), to
- // deal in the Software without restriction, including without limitation the
- // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- // sell copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- // when used in node, this will actually load the util module we depend on
- // versus loading the builtin util module as happens otherwise
- // this is a bug in node module loading as far as I am concerned
- var pSlice = Array.prototype.slice;
- // 1. The assert module provides functions that throw
- // AssertionError's when particular conditions are not met. The
- // assert module must conform to the following interface.
- var assert = ok;
- // 3. All of the following functions must throw an AssertionError
- // when a corresponding condition is not met, with a message that
- // may be undefined if not provided. All assertion methods provide
- // both the actual and expected values to the assertion error for
- // display purposes.
- /**
- * Node.js standard [`assert.fail`](http://nodejs.org/api/assert.html#assert_assert_fail_actual_expected_message_operator).
- * @static
- * @memberOf should
- * @category assertion assert
- * @param {*} actual Actual object
- * @param {*} expected Expected object
- * @param {string} message Message for assertion
- * @param {string} operator Operator text
- */
- function fail(actual, expected, message, operator, stackStartFunction) {
- var a = new Assertion(actual);
- a.params = {
- operator: operator,
- expected: expected,
- message: message,
- stackStartFunction: stackStartFunction || fail
- };
- a.fail();
- }
- // EXTENSION! allows for well behaved errors defined elsewhere.
- assert.fail = fail;
- // 4. Pure assertion tests whether a value is truthy, as determined
- // by !!guard.
- // assert.ok(guard, message_opt);
- // This statement is equivalent to assert.equal(true, !!guard,
- // message_opt);. To test strictly for the value true, use
- // assert.strictEqual(true, guard, message_opt);.
- /**
- * Node.js standard [`assert.ok`](http://nodejs.org/api/assert.html#assert_assert_value_message_assert_ok_value_message).
- * @static
- * @memberOf should
- * @category assertion assert
- * @param {*} value
- * @param {string} [message]
- */
- function ok(value, message) {
- if (!value) {
- fail(value, true, message, '==', assert.ok);
- }
- }
- assert.ok = ok;
- // 5. The equality assertion tests shallow, coercive equality with
- // ==.
- // assert.equal(actual, expected, message_opt);
- /**
- * Node.js standard [`assert.equal`](http://nodejs.org/api/assert.html#assert_assert_equal_actual_expected_message).
- * @static
- * @memberOf should
- * @category assertion assert
- * @param {*} actual
- * @param {*} expected
- * @param {string} [message]
- */
- assert.equal = function equal(actual, expected, message) {
- if (actual != expected) {
- fail(actual, expected, message, '==', assert.equal);
- }
- };
- // 6. The non-equality assertion tests for whether two objects are not equal
- // with != assert.notEqual(actual, expected, message_opt);
- /**
- * Node.js standard [`assert.notEqual`](http://nodejs.org/api/assert.html#assert_assert_notequal_actual_expected_message).
- * @static
- * @memberOf should
- * @category assertion assert
- * @param {*} actual
- * @param {*} expected
- * @param {string} [message]
- */
- assert.notEqual = function notEqual(actual, expected, message) {
- if (actual == expected) {
- fail(actual, expected, message, '!=', assert.notEqual);
- }
- };
- // 7. The equivalence assertion tests a deep equality relation.
- // assert.deepEqual(actual, expected, message_opt);
- /**
- * Node.js standard [`assert.deepEqual`](http://nodejs.org/api/assert.html#assert_assert_deepequal_actual_expected_message).
- * But uses should.js .eql implementation instead of Node.js own deepEqual.
- *
- * @static
- * @memberOf should
- * @category assertion assert
- * @param {*} actual
- * @param {*} expected
- * @param {string} [message]
- */
- assert.deepEqual = function deepEqual(actual, expected, message) {
- if (eql(actual, expected).length !== 0) {
- fail(actual, expected, message, 'deepEqual', assert.deepEqual);
- }
- };
- // 8. The non-equivalence assertion tests for any deep inequality.
- // assert.notDeepEqual(actual, expected, message_opt);
- /**
- * Node.js standard [`assert.notDeepEqual`](http://nodejs.org/api/assert.html#assert_assert_notdeepequal_actual_expected_message).
- * But uses should.js .eql implementation instead of Node.js own deepEqual.
- *
- * @static
- * @memberOf should
- * @category assertion assert
- * @param {*} actual
- * @param {*} expected
- * @param {string} [message]
- */
- assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
- if (eql(actual, expected).result) {
- fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
- }
- };
- // 9. The strict equality assertion tests strict equality, as determined by ===.
- // assert.strictEqual(actual, expected, message_opt);
- /**
- * Node.js standard [`assert.strictEqual`](http://nodejs.org/api/assert.html#assert_assert_strictequal_actual_expected_message).
- * @static
- * @memberOf should
- * @category assertion assert
- * @param {*} actual
- * @param {*} expected
- * @param {string} [message]
- */
- assert.strictEqual = function strictEqual(actual, expected, message) {
- if (actual !== expected) {
- fail(actual, expected, message, '===', assert.strictEqual);
- }
- };
- // 10. The strict non-equality assertion tests for strict inequality, as
- // determined by !==. assert.notStrictEqual(actual, expected, message_opt);
- /**
- * Node.js standard [`assert.notStrictEqual`](http://nodejs.org/api/assert.html#assert_assert_notstrictequal_actual_expected_message).
- * @static
- * @memberOf should
- * @category assertion assert
- * @param {*} actual
- * @param {*} expected
- * @param {string} [message]
- */
- assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
- if (actual === expected) {
- fail(actual, expected, message, '!==', assert.notStrictEqual);
- }
- };
- function expectedException(actual, expected) {
- if (!actual || !expected) {
- return false;
- }
- if (Object.prototype.toString.call(expected) == '[object RegExp]') {
- return expected.test(actual);
- } else if (actual instanceof expected) {
- return true;
- } else if (expected.call({}, actual) === true) {
- return true;
- }
- return false;
- }
- function _throws(shouldThrow, block, expected, message) {
- var actual;
- if (typeof expected == 'string') {
- message = expected;
- expected = null;
- }
- try {
- block();
- } catch (e) {
- actual = e;
- }
- message = (expected && expected.name ? ' (' + expected.name + ')' : '.') +
- (message ? ' ' + message : '.');
- if (shouldThrow && !actual) {
- fail(actual, expected, 'Missing expected exception' + message);
- }
- if (!shouldThrow && expectedException(actual, expected)) {
- fail(actual, expected, 'Got unwanted exception' + message);
- }
- if ((shouldThrow && actual && expected && !expectedException(actual, expected)) || (!shouldThrow && actual)) {
- throw actual;
- }
- }
- // 11. Expected to throw an error:
- // assert.throws(block, Error_opt, message_opt);
- /**
- * Node.js standard [`assert.throws`](http://nodejs.org/api/assert.html#assert_assert_throws_block_error_message).
- * @static
- * @memberOf should
- * @category assertion assert
- * @param {Function} block
- * @param {Function} [error]
- * @param {String} [message]
- */
- assert.throws = function(/*block, error, message*/) {
- _throws.apply(this, [true].concat(pSlice.call(arguments)));
- };
- // EXTENSION! This is annoying to write outside this module.
- /**
- * Node.js standard [`assert.doesNotThrow`](http://nodejs.org/api/assert.html#assert_assert_doesnotthrow_block_message).
- * @static
- * @memberOf should
- * @category assertion assert
- * @param {Function} block
- * @param {String} [message]
- */
- assert.doesNotThrow = function(/*block, message*/) {
- _throws.apply(this, [false].concat(pSlice.call(arguments)));
- };
- /**
- * Node.js standard [`assert.ifError`](http://nodejs.org/api/assert.html#assert_assert_iferror_value).
- * @static
- * @memberOf should
- * @category assertion assert
- * @param {Error} err
- */
- assert.ifError = function(err) {
- if (err) {
- throw err;
- }
- };
- /*
- * should.js - assertion library
- * Copyright(c) 2010-2013 TJ Holowaychuk <tj@vision-media.ca>
- * Copyright(c) 2013-2016 Denis Bardadym <bardadymchik@gmail.com>
- * MIT Licensed
- */
- var assertExtensions = function(should) {
- var i = should.format;
- /*
- * Expose assert to should
- *
- * This allows you to do things like below
- * without require()ing the assert module.
- *
- * should.equal(foo.bar, undefined);
- *
- */
- shouldUtil.merge(should, assert);
- /**
- * Assert _obj_ exists, with optional message.
- *
- * @static
- * @memberOf should
- * @category assertion assert
- * @alias should.exists
- * @param {*} obj
- * @param {String} [msg]
- * @example
- *
- * should.exist(1);
- * should.exist(new Date());
- */
- should.exist = should.exists = function(obj, msg) {
- if (null == obj) {
- throw new AssertionError({
- message: msg || ('expected ' + i(obj) + ' to exist'), stackStartFunction: should.exist
- });
- }
- };
- should.not = {};
- /**
- * Asserts _obj_ does not exist, with optional message.
- *
- * @name not.exist
- * @static
- * @memberOf should
- * @category assertion assert
- * @alias should.not.exists
- * @param {*} obj
- * @param {String} [msg]
- * @example
- *
- * should.not.exist(null);
- * should.not.exist(void 0);
- */
- should.not.exist = should.not.exists = function(obj, msg) {
- if (null != obj) {
- throw new AssertionError({
- message: msg || ('expected ' + i(obj) + ' to not exist'), stackStartFunction: should.not.exist
- });
- }
- };
- };
- /*
- * should.js - assertion library
- * Copyright(c) 2010-2013 TJ Holowaychuk <tj@vision-media.ca>
- * Copyright(c) 2013-2016 Denis Bardadym <bardadymchik@gmail.com>
- * MIT Licensed
- */
- var chainAssertions = function(should, Assertion) {
- /**
- * Simple chaining to improve readability. Does nothing.
- *
- * @memberOf Assertion
- * @name be
- * @property {should.Assertion} be
- * @alias Assertion#an
- * @alias Assertion#of
- * @alias Assertion#a
- * @alias Assertion#and
- * @alias Assertion#been
- * @alias Assertion#have
- * @alias Assertion#has
- * @alias Assertion#with
- * @alias Assertion#is
- * @alias Assertion#which
- * @alias Assertion#the
- * @alias Assertion#it
- * @category assertion chaining
- */
- ['an', 'of', 'a', 'and', 'be', 'been', 'has', 'have', 'with', 'is', 'which', 'the', 'it'].forEach(function(name) {
- Assertion.addChain(name);
- });
- };
- /*
- * should.js - assertion library
- * Copyright(c) 2010-2013 TJ Holowaychuk <tj@vision-media.ca>
- * Copyright(c) 2013-2016 Denis Bardadym <bardadymchik@gmail.com>
- * MIT Licensed
- */
- var booleanAssertions = function(should, Assertion) {
- /**
- * Assert given object is exactly `true`.
- *
- * @name true
- * @memberOf Assertion
- * @category assertion bool
- * @alias Assertion#True
- * @param {string} [message] Optional message
- * @example
- *
- * (true).should.be.true();
- * false.should.not.be.true();
- *
- * ({ a: 10}).should.not.be.true();
- */
- Assertion.add('true', function(message) {
- this.is.exactly(true, message);
- });
- Assertion.alias('true', 'True');
- /**
- * Assert given object is exactly `false`.
- *
- * @name false
- * @memberOf Assertion
- * @category assertion bool
- * @alias Assertion#False
- * @param {string} [message] Optional message
- * @example
- *
- * (true).should.not.be.false();
- * false.should.be.false();
- */
- Assertion.add('false', function(message) {
- this.is.exactly(false, message);
- });
- Assertion.alias('false', 'False');
- /**
- * Assert given object is truthy according javascript type conversions.
- *
- * @name ok
- * @memberOf Assertion
- * @category assertion bool
- * @example
- *
- * (true).should.be.ok();
- * ''.should.not.be.ok();
- * should(null).not.be.ok();
- * should(void 0).not.be.ok();
- *
- * (10).should.be.ok();
- * (0).should.not.be.ok();
- */
- Assertion.add('ok', function() {
- this.params = { operator: 'to be truthy' };
- this.assert(this.obj);
- });
- };
- /*
- * should.js - assertion library
- * Copyright(c) 2010-2013 TJ Holowaychuk <tj@vision-media.ca>
- * Copyright(c) 2013-2016 Denis Bardadym <bardadymchik@gmail.com>
- * MIT Licensed
- */
- var numberAssertions = function(should, Assertion) {
- /**
- * Assert given object is NaN
- * @name NaN
- * @memberOf Assertion
- * @category assertion numbers
- * @example
- *
- * (10).should.not.be.NaN();
- * NaN.should.be.NaN();
- */
- Assertion.add('NaN', function() {
- this.params = { operator: 'to be NaN' };
- this.assert(this.obj !== this.obj);
- });
- /**
- * Assert given object is not finite (positive or negative)
- *
- * @name Infinity
- * @memberOf Assertion
- * @category assertion numbers
- * @example
- *
- * (10).should.not.be.Infinity();
- * NaN.should.not.be.Infinity();
- */
- Assertion.add('Infinity', function() {
- this.params = { operator: 'to be Infinity' };
- this.is.a.Number()
- .and.not.a.NaN()
- .and.assert(!isFinite(this.obj));
- });
- /**
- * Assert given number between `start` and `finish` or equal one of them.
- *
- * @name within
- * @memberOf Assertion
- * @category assertion numbers
- * @param {number} start Start number
- * @param {number} finish Finish number
- * @param {string} [description] Optional message
- * @example
- *
- * (10).should.be.within(0, 20);
- */
- Assertion.add('within', function(start, finish, description) {
- this.params = { operator: 'to be within ' + start + '..' + finish, message: description };
- this.assert(this.obj >= start && this.obj <= finish);
- });
- /**
- * Assert given number near some other `value` within `delta`
- *
- * @name approximately
- * @memberOf Assertion
- * @category assertion numbers
- * @param {number} value Center number
- * @param {number} delta Radius
- * @param {string} [description] Optional message
- * @example
- *
- * (9.99).should.be.approximately(10, 0.1);
- */
- Assertion.add('approximately', function(value, delta, description) {
- this.params = { operator: 'to be approximately ' + value + ' ±' + delta, message: description };
- this.assert(Math.abs(this.obj - value) <= delta);
- });
- /**
- * Assert given number above `n`.
- *
- * @name above
- * @alias Assertion#greaterThan
- * @memberOf Assertion
- * @category assertion numbers
- * @param {number} n Margin number
- * @param {string} [description] Optional message
- * @example
- *
- * (10).should.be.above(0);
- */
- Assertion.add('above', function(n, description) {
- this.params = { operator: 'to be above ' + n, message: description };
- this.assert(this.obj > n);
- });
- /**
- * Assert given number below `n`.
- *
- * @name below
- * @alias Assertion#lessThan
- * @memberOf Assertion
- * @category assertion numbers
- * @param {number} n Margin number
- * @param {string} [description] Optional message
- * @example
- *
- * (0).should.be.below(10);
- */
- Assertion.add('below', function(n, description) {
- this.params = { operator: 'to be below ' + n, message: description };
- this.assert(this.obj < n);
- });
- Assertion.alias('above', 'greaterThan');
- Assertion.alias('below', 'lessThan');
- /**
- * Assert given number above `n`.
- *
- * @name aboveOrEqual
- * @alias Assertion#greaterThanOrEqual
- * @memberOf Assertion
- * @category assertion numbers
- * @param {number} n Margin number
- * @param {string} [description] Optional message
- * @example
- *
- * (10).should.be.aboveOrEqual(0);
- * (10).should.be.aboveOrEqual(10);
- */
- Assertion.add('aboveOrEqual', function(n, description) {
- this.params = { operator: 'to be above or equal' + n, message: description };
- this.assert(this.obj >= n);
- });
- /**
- * Assert given number below `n`.
- *
- * @name belowOrEqual
- * @alias Assertion#lessThanOrEqual
- * @memberOf Assertion
- * @category assertion numbers
- * @param {number} n Margin number
- * @param {string} [description] Optional message
- * @example
- *
- * (0).should.be.belowOrEqual(10);
- * (0).should.be.belowOrEqual(0);
- */
- Assertion.add('belowOrEqual', function(n, description) {
- this.params = { operator: 'to be below or equal' + n, message: description };
- this.assert(this.obj <= n);
- });
- Assertion.alias('aboveOrEqual', 'greaterThanOrEqual');
- Assertion.alias('belowOrEqual', 'lessThanOrEqual');
- };
- /*
- * should.js - assertion library
- * Copyright(c) 2010-2013 TJ Holowaychuk <tj@vision-media.ca>
- * Copyright(c) 2013-2016 Denis Bardadym <bardadymchik@gmail.com>
- * MIT Licensed
- */
- var typeAssertions = function(should, Assertion) {
- /**
- * Assert given object is number
- * @name Number
- * @memberOf Assertion
- * @category assertion types
- */
- Assertion.add('Number', function() {
- this.params = {operator: 'to be a number'};
- this.have.type('number');
- });
- /**
- * Assert given object is arguments
- * @name arguments
- * @alias Assertion#Arguments
- * @memberOf Assertion
- * @category assertion types
- */
- Assertion.add('arguments', function() {
- this.params = {operator: 'to be arguments'};
- this.have.class('Arguments');
- });
- Assertion.alias('arguments', 'Arguments');
- /**
- * Assert given object has some type using `typeof`
- * @name type
- * @memberOf Assertion
- * @param {string} type Type name
- * @param {string} [description] Optional message
- * @category assertion types
- */
- Assertion.add('type', function(type, description) {
- this.params = {operator: 'to have type ' + type, message: description};
- should(typeof this.obj).be.exactly(type);
- });
- /**
- * Assert given object is instance of `constructor`
- * @name instanceof
- * @alias Assertion#instanceOf
- * @memberOf Assertion
- * @param {Function} constructor Constructor function
- * @param {string} [description] Optional message
- * @category assertion types
- */
- Assertion.add('instanceof', function(constructor, description) {
- this.params = {operator: 'to be an instance of ' + functionName(constructor), message: description};
- this.assert(Object(this.obj) instanceof constructor);
- });
- Assertion.alias('instanceof', 'instanceOf');
- /**
- * Assert given object is function
- * @name Function
- * @memberOf Assertion
- * @category assertion types
- */
- Assertion.add('Function', function() {
- this.params = {operator: 'to be a function'};
- this.have.type('function');
- });
- /**
- * Assert given object is object
- * @name Object
- * @memberOf Assertion
- * @category assertion types
- */
- Assertion.add('Object', function() {
- this.params = {operator: 'to be an object'};
- this.is.not.null().and.have.type('object');
- });
- /**
- * Assert given object is string
- * @name String
- * @memberOf Assertion
- * @category assertion types
- */
- Assertion.add('String', function() {
- this.params = {operator: 'to be a string'};
- this.have.type('string');
- });
- /**
- * Assert given object is array
- * @name Array
- * @memberOf Assertion
- * @category assertion types
- */
- Assertion.add('Array', function() {
- this.params = {operator: 'to be an array'};
- this.have.class('Array');
- });
- /**
- * Assert given object is boolean
- * @name Boolean
- * @memberOf Assertion
- * @category assertion types
- */
- Assertion.add('Boolean', function() {
- this.params = {operator: 'to be a boolean'};
- this.have.type('boolean');
- });
- /**
- * Assert given object is error
- * @name Error
- * @memberOf Assertion
- * @category assertion types
- */
- Assertion.add('Error', function() {
- this.params = {operator: 'to be an error'};
- this.have.instanceOf(Error);
- });
- /**
- * Assert given object is a date
- * @name Date
- * @memberOf Assertion
- * @category assertion types
- */
- Assertion.add('Date', function() {
- this.params = {operator: 'to be a date'};
- this.have.instanceOf(Date);
- });
- /**
- * Assert given object is null
- * @name null
- * @alias Assertion#Null
- * @memberOf Assertion
- * @category assertion types
- */
- Assertion.add('null', function() {
- this.params = {operator: 'to be null'};
- this.assert(this.obj === null);
- });
- Assertion.alias('null', 'Null');
- /**
- * Assert given object has some internal [[Class]], via Object.prototype.toString call
- * @name class
- * @alias Assertion#Class
- * @memberOf Assertion
- * @category assertion types
- */
- Assertion.add('class', function(cls) {
- this.params = {operator: 'to have [[Class]] ' + cls};
- this.assert(Object.prototype.toString.call(this.obj) === '[object ' + cls + ']');
- });
- Assertion.alias('class', 'Class');
- /**
- * Assert given object is undefined
- * @name undefined
- * @alias Assertion#Undefined
- * @memberOf Assertion
- * @category assertion types
- */
- Assertion.add('undefined', function() {
- this.params = {operator: 'to be undefined'};
- this.assert(this.obj === void 0);
- });
- Assertion.alias('undefined', 'Undefined');
- /**
- * Assert given object supports es6 iterable protocol (just check
- * that object has property Symbol.iterator, which is a function)
- * @name iterable
- * @memberOf Assertion
- * @category assertion es6
- */
- Assertion.add('iterable', function() {
- this.params = {operator: 'to be iterable'};
- should(this.obj).have.property(Symbol.iterator).which.is.a.Function();
- });
- /**
- * Assert given object supports es6 iterator protocol (just check
- * that object has property next, which is a function)
- * @name iterator
- * @memberOf Assertion
- * @category assertion es6
- */
- Assertion.add('iterator', function() {
- this.params = {operator: 'to be iterator'};
- should(this.obj).have.property('next').which.is.a.Function();
- });
- /**
- * Assert given object is a generator object
- * @name generator
- * @memberOf Assertion
- * @category assertion es6
- */
- Assertion.add('generator', function() {
- this.params = {operator: 'to be generator'};
- should(this.obj).be.iterable
- .and.iterator
- .and.it.is.equal(this.obj[Symbol.iterator]());
- });
- };
- /*
- * should.js - assertion library
- * Copyright(c) 2010-2013 TJ Holowaychuk <tj@vision-media.ca>
- * Copyright(c) 2013-2016 Denis Bardadym <bardadymchik@gmail.com>
- * MIT Licensed
- */
- function formatEqlResult(r, a, b) {
- return ((r.path.length > 0 ? 'at ' + r.path.map(formatProp).join(' -> ') : '') +
- (r.a === a ? '' : ', A has ' + format(r.a)) +
- (r.b === b ? '' : ' and B has ' + format(r.b)) +
- (r.showReason ? ' because ' + r.reason : '')).trim();
- }
- var equalityAssertions = function(should, Assertion) {
- /**
- * Deep object equality comparison. For full spec see [`should-equal tests`](https://github.com/shouldjs/equal/blob/master/test.js).
- *
- * @name eql
- * @memberOf Assertion
- * @category assertion equality
- * @alias Assertion#deepEqual
- * @param {*} val Expected value
- * @param {string} [description] Optional message
- * @example
- *
- * (10).should.be.eql(10);
- * ('10').should.not.be.eql(10);
- * (-0).should.not.be.eql(+0);
- *
- * NaN.should.be.eql(NaN);
- *
- * ({ a: 10}).should.be.eql({ a: 10 });
- * [ 'a' ].should.not.be.eql({ '0': 'a' });
- */
- Assertion.add('eql', function(val, description) {
- this.params = {operator: 'to equal', expected: val, message: description};
- var obj = this.obj;
- var fails = eql(this.obj, val, should.config);
- this.params.details = fails.map(function(fail) {
- return formatEqlResult(fail, obj, val);
- }).join(', ');
- this.params.showDiff = eql(getType(obj), getType(val)).length === 0;
- this.assert(fails.length === 0);
- });
- /**
- * Exact comparison using ===.
- *
- * @name equal
- * @memberOf Assertion
- * @category assertion equality
- * @alias Assertion#exactly
- * @param {*} val Expected value
- * @param {string} [description] Optional message
- * @example
- *
- * 10.should.be.equal(10);
- * 'a'.should.be.exactly('a');
- *
- * should(null).be.exactly(null);
- */
- Assertion.add('equal', function(val, description) {
- this.params = {operator: 'to be', expected: val, message: description};
- this.params.showDiff = eql(getType(this.obj), getType(val)).length === 0;
- this.assert(val === this.obj);
- });
- Assertion.alias('equal', 'exactly');
- Assertion.alias('eql', 'deepEqual');
- function addOneOf(name, message, method) {
- Assertion.add(name, function(vals) {
- if (arguments.length !== 1) {
- vals = Array.prototype.slice.call(arguments);
- } else {
- should(vals).be.Array();
- }
- this.params = {operator: message, expected: vals};
- var obj = this.obj;
- var found = false;
- shouldTypeAdaptors.forEach(vals, function(val) {
- try {
- should(val)[method](obj);
- found = true;
- return false;
- } catch (e) {
- if (e instanceof should.AssertionError) {
- return;//do nothing
- }
- throw e;
- }
- });
- this.assert(found);
- });
- }
- /**
- * Exact comparison using === to be one of supplied objects.
- *
- * @name equalOneOf
- * @memberOf Assertion
- * @category assertion equality
- * @param {Array|*} vals Expected values
- * @example
- *
- * 'ab'.should.be.equalOneOf('a', 10, 'ab');
- * 'ab'.should.be.equalOneOf(['a', 10, 'ab']);
- */
- addOneOf('equalOneOf', 'to be equals one of', 'equal');
- /**
- * Exact comparison using .eql to be one of supplied objects.
- *
- * @name oneOf
- * @memberOf Assertion
- * @category assertion equality
- * @param {Array|*} vals Expected values
- * @example
- *
- * ({a: 10}).should.be.oneOf('a', 10, 'ab', {a: 10});
- * ({a: 10}).should.be.oneOf(['a', 10, 'ab', {a: 10}]);
- */
- addOneOf('oneOf', 'to be one of', 'eql');
- };
- /*
- * should.js - assertion library
- * Copyright(c) 2010-2013 TJ Holowaychuk <tj@vision-media.ca>
- * Copyright(c) 2013-2016 Denis Bardadym <bardadymchik@gmail.com>
- * MIT Licensed
- */
- var promiseAssertions = function(should, Assertion$$1) {
- /**
- * Assert given object is a Promise
- *
- * @name Promise
- * @memberOf Assertion
- * @category assertion promises
- * @example
- *
- * promise.should.be.Promise()
- * (new Promise(function(resolve, reject) { resolve(10); })).should.be.a.Promise()
- * (10).should.not.be.a.Promise()
- */
- Assertion$$1.add('Promise', function() {
- this.params = {operator: 'to be promise'};
- var obj = this.obj;
- should(obj).have.property('then')
- .which.is.a.Function();
- });
- /**
- * Assert given promise will be fulfilled. Result of assertion is still .thenable and should be handled accordingly.
- *
- * @name fulfilled
- * @memberOf Assertion
- * @returns {Promise}
- * @category assertion promises
- * @example
- *
- * // don't forget to handle async nature
- * (new Promise(function(resolve, reject) { resolve(10); })).should.be.fulfilled();
- *
- * // test example with mocha it is possible to return promise
- * it('is async', () => {
- * return new Promise(resolve => resolve(10))
- * .should.be.fulfilled();
- * });
- */
- Assertion$$1.prototype.fulfilled = function Assertion$fulfilled() {
- this.params = {operator: 'to be fulfilled'};
- should(this.obj).be.a.Promise();
- var that = this;
- return this.obj.then(function next$onResolve(value) {
- if (that.negate) {
- that.fail();
- }
- return value;
- }, function next$onReject(err) {
- if (!that.negate) {
- that.params.operator += ', but it was rejected with ' + should.format(err);
- that.fail();
- }
- return err;
- });
- };
- /**
- * Assert given promise will be rejected. Result of assertion is still .thenable and should be handled accordingly.
- *
- * @name rejected
- * @memberOf Assertion
- * @category assertion promises
- * @returns {Promise}
- * @example
- *
- * // don't forget to handle async nature
- * (new Promise(function(resolve, reject) { resolve(10); }))
- * .should.not.be.rejected();
- *
- * // test example with mocha it is possible to return promise
- * it('is async', () => {
- * return new Promise((resolve, reject) => reject(new Error('boom')))
- * .should.be.rejected();
- * });
- */
- Assertion$$1.prototype.rejected = function() {
- this.params = {operator: 'to be rejected'};
- should(this.obj).be.a.Promise();
- var that = this;
- return this.obj.then(function(value) {
- if (!that.negate) {
- that.params.operator += ', but it was fulfilled';
- if (arguments.length != 0) {
- that.params.operator += ' with ' + should.format(value);
- }
- that.fail();
- }
- return value;
- }, function next$onError(err) {
- if (that.negate) {
- that.fail();
- }
- return err;
- });
- };
- /**
- * Assert given promise will be fulfilled with some expected value (value compared using .eql).
- * Result of assertion is still .thenable and should be handled accordingly.
- *
- * @name fulfilledWith
- * @memberOf Assertion
- * @category assertion promises
- * @returns {Promise}
- * @example
- *
- * // don't forget to handle async nature
- * (new Promise(function(resolve, reject) { resolve(10); }))
- * .should.be.fulfilledWith(10);
- *
- * // test example with mocha it is possible to return promise
- * it('is async', () => {
- * return new Promise((resolve, reject) => resolve(10))
- * .should.be.fulfilledWith(10);
- * });
- */
- Assertion$$1.prototype.fulfilledWith = function(expectedValue) {
- this.params = {operator: 'to be fulfilled with ' + should.format(expectedValue)};
- should(this.obj).be.a.Promise();
- var that = this;
- return this.obj.then(function(value) {
- if (that.negate) {
- that.fail();
- }
- should(value).eql(expectedValue);
- return value;
- }, function next$onError(err) {
- if (!that.negate) {
- that.params.operator += ', but it was rejected with ' + should.format(err);
- that.fail();
- }
- return err;
- });
- };
- /**
- * Assert given promise will be rejected with some sort of error. Arguments is the same for Assertion#throw.
- * Result of assertion is still .thenable and should be handled accordingly.
- *
- * @name rejectedWith
- * @memberOf Assertion
- * @category assertion promises
- * @returns {Promise}
- * @example
- *
- * function failedPromise() {
- * return new Promise(function(resolve, reject) {
- * reject(new Error('boom'))
- * })
- * }
- * failedPromise().should.be.rejectedWith(Error);
- * failedPromise().should.be.rejectedWith('boom');
- * failedPromise().should.be.rejectedWith(/boom/);
- * failedPromise().should.be.rejectedWith(Error, { message: 'boom' });
- * failedPromise().should.be.rejectedWith({ message: 'boom' });
- *
- * // test example with mocha it is possible to return promise
- * it('is async', () => {
- * return failedPromise().should.be.rejectedWith({ message: 'boom' });
- * });
- */
- Assertion$$1.prototype.rejectedWith = function(message, properties) {
- this.params = {operator: 'to be rejected'};
- should(this.obj).be.a.Promise();
- var that = this;
- return this.obj.then(function(value) {
- if (!that.negate) {
- that.fail();
- }
- return value;
- }, function next$onError(err) {
- if (that.negate) {
- that.fail();
- }
- var errorMatched = true;
- var errorInfo = '';
- if ('string' === typeof message) {
- errorMatched = message === err.message;
- } else if (message instanceof RegExp) {
- errorMatched = message.test(err.message);
- } else if ('function' === typeof message) {
- errorMatched = err instanceof message;
- } else if (message !== null && typeof message === 'object') {
- try {
- should(err).match(message);
- } catch (e) {
- if (e instanceof should.AssertionError) {
- errorInfo = ': ' + e.message;
- errorMatched = false;
- } else {
- throw e;
- }
- }
- }
- if (!errorMatched) {
- if ( typeof message === 'string' || message instanceof RegExp) {
- errorInfo = ' with a message matching ' + should.format(message) + ", but got '" + err.message + "'";
- } else if ('function' === typeof message) {
- errorInfo = ' of type ' + functionName(message) + ', but got ' + functionName(err.constructor);
- }
- } else if ('function' === typeof message && properties) {
- try {
- should(err).match(properties);
- } catch (e) {
- if (e instanceof should.AssertionError) {
- errorInfo = ': ' + e.message;
- errorMatched = false;
- } else {
- throw e;
- }
- }
- }
- that.params.operator += errorInfo;
- that.assert(errorMatched);
- return err;
- });
- };
- /**
- * Assert given object is promise and wrap it in PromisedAssertion, which has all properties of Assertion.
- * That means you can chain as with usual Assertion.
- * Result of assertion is still .thenable and should be handled accordingly.
- *
- * @name finally
- * @memberOf Assertion
- * @alias Assertion#eventually
- * @category assertion promises
- * @returns {PromisedAssertion} Like Assertion, but .then this.obj in Assertion
- * @example
- *
- * (new Promise(function(resolve, reject) { resolve(10); }))
- * .should.be.eventually.equal(10);
- *
- * // test example with mocha it is possible to return promise
- * it('is async', () => {
- * return new Promise(resolve => resolve(10))
- * .should.be.finally.equal(10);
- * });
- */
- Object.defineProperty(Assertion$$1.prototype, 'finally', {
- get: function() {
- should(this.obj).be.a.Promise();
- var that = this;
- return new PromisedAssertion(this.obj.then(function(obj) {
- var a = should(obj);
- a.negate = that.negate;
- a.anyOne = that.anyOne;
- return a;
- }));
- }
- });
- Assertion$$1.alias('finally', 'eventually');
- };
- /*
- * should.js - assertion library
- * Copyright(c) 2010-2013 TJ Holowaychuk <tj@vision-media.ca>
- * Copyright(c) 2013-2016 Denis Bardadym <bardadymchik@gmail.com>
- * MIT Licensed
- */
- var stringAssertions = function(should, Assertion) {
- /**
- * Assert given string starts with prefix
- * @name startWith
- * @memberOf Assertion
- * @category assertion strings
- * @param {string} str Prefix
- * @param {string} [description] Optional message
- * @example
- *
- * 'abc'.should.startWith('a');
- */
- Assertion.add('startWith', function(str, description) {
- this.params = { operator: 'to start with ' + should.format(str), message: description };
- this.assert(0 === this.obj.indexOf(str));
- });
- /**
- * Assert given string ends with prefix
- * @name endWith
- * @memberOf Assertion
- * @category assertion strings
- * @param {string} str Prefix
- * @param {string} [description] Optional message
- * @example
- *
- * 'abca'.should.endWith('a');
- */
- Assertion.add('endWith', function(str, description) {
- this.params = { operator: 'to end with ' + should.format(str), message: description };
- this.assert(this.obj.indexOf(str, this.obj.length - str.length) >= 0);
- });
- };
- /*
- * should.js - assertion library
- * Copyright(c) 2010-2013 TJ Holowaychuk <tj@vision-media.ca>
- * Copyright(c) 2013-2016 Denis Bardadym <bardadymchik@gmail.com>
- * MIT Licensed
- */
- var containAssertions = function(should, Assertion) {
- var i = should.format;
- /**
- * Assert that given object contain something that equal to `other`. It uses `should-equal` for equality checks.
- * If given object is array it search that one of elements was equal to `other`.
- * If given object is string it checks if `other` is a substring - expected that `other` is a string.
- * If given object is Object it checks that `other` is a subobject - expected that `other` is a object.
- *
- * @name containEql
- * @memberOf Assertion
- * @category assertion contain
- * @param {*} other Nested object
- * @example
- *
- * [1, 2, 3].should.containEql(1);
- * [{ a: 1 }, 'a', 10].should.containEql({ a: 1 });
- *
- * 'abc'.should.containEql('b');
- * 'ab1c'.should.containEql(1);
- *
- * ({ a: 10, c: { d: 10 }}).should.containEql({ a: 10 });
- * ({ a: 10, c: { d: 10 }}).should.containEql({ c: { d: 10 }});
- * ({ a: 10, c: { d: 10 }}).should.containEql({ b: 10 });
- * // throws AssertionError: expected { a: 10, c: { d: 10 } } to contain { b: 10 }
- * // expected { a: 10, c: { d: 10 } } to have property b
- */
- Assertion.add('containEql', function(other) {
- this.params = { operator: 'to contain ' + i(other) };
- this.is.not.null().and.not.undefined();
- var obj = this.obj;
- if (typeof obj == 'string') {
- this.assert(obj.indexOf(String(other)) >= 0);
- } else if (shouldTypeAdaptors.isIterable(obj)) {
- this.assert(shouldTypeAdaptors.some(obj, function(v) {
- return eql(v, other).length === 0;
- }));
- } else {
- shouldTypeAdaptors.forEach(other, function(value, key) {
- should(obj).have.value(key, value);
- }, this);
- }
- });
- /**
- * Assert that given object is contain equally structured object on the same depth level.
- * If given object is an array and `other` is an array it checks that the eql elements is going in the same sequence in given array (recursive)
- * If given object is an object it checks that the same keys contain deep equal values (recursive)
- * On other cases it try to check with `.eql`
- *
- * @name containDeepOrdered
- * @memberOf Assertion
- * @category assertion contain
- * @param {*} other Nested object
- * @example
- *
- * [ 1, 2, 3].should.containDeepOrdered([1, 2]);
- * [ 1, 2, [ 1, 2, 3 ]].should.containDeepOrdered([ 1, [ 2, 3 ]]);
- *
- * ({ a: 10, b: { c: 10, d: [1, 2, 3] }}).should.containDeepOrdered({a: 10});
- * ({ a: 10, b: { c: 10, d: [1, 2, 3] }}).should.containDeepOrdered({b: {c: 10}});
- * ({ a: 10, b: { c: 10, d: [1, 2, 3] }}).should.containDeepOrdered({b: {d: [1, 3]}});
- */
- Assertion.add('containDeepOrdered', function(other) {
- this.params = {operator: 'to contain ' + i(other)};
- var obj = this.obj;
- if (typeof obj == 'string') {// expect other to be string
- this.is.equal(String(other));
- } else if (shouldTypeAdaptors.isIterable(obj) && shouldTypeAdaptors.isIterable(other)) {
- var objIterator = shouldTypeAdaptors.iterator(obj);
- var otherIterator = shouldTypeAdaptors.iterator(other);
- var nextObj = objIterator.next();
- var nextOther = otherIterator.next();
- while (!nextObj.done && !nextOther.done) {
- try {
- should(nextObj.value[1]).containDeepOrdered(nextOther.value[1]);
- nextOther = otherIterator.next();
- } catch (e) {
- if (!(e instanceof should.AssertionError)) {
- throw e;
- }
- }
- nextObj = objIterator.next();
- }
- this.assert(nextOther.done);
- } else if (obj != null && other != null && typeof obj == 'object' && typeof other == 'object') {//TODO compare types object contains object case
- shouldTypeAdaptors.forEach(other, function(value, key) {
- should(obj[key]).containDeepOrdered(value);
- });
- // if both objects is empty means we finish traversing - and we need to compare for hidden values
- if (shouldTypeAdaptors.isEmpty(other)) {
- this.eql(other);
- }
- } else {
- this.eql(other);
- }
- });
- /**
- * The same like `Assertion#containDeepOrdered` but all checks on arrays without order.
- *
- * @name containDeep
- * @memberOf Assertion
- * @category assertion contain
- * @param {*} other Nested object
- * @example
- *
- * [ 1, 2, 3].should.containDeep([2, 1]);
- * [ 1, 2, [ 1, 2, 3 ]].should.containDeep([ 1, [ 3, 1 ]]);
- */
- Assertion.add('containDeep', function(other) {
- this.params = {operator: 'to contain ' + i(other)};
- var obj = this.obj;
- if (typeof obj == 'string') {// expect other to be string
- this.is.equal(String(other));
- } else if (shouldTypeAdaptors.isIterable(obj) && shouldTypeAdaptors.isIterable(other)) {
- var usedKeys = {};
- shouldTypeAdaptors.forEach(other, function(otherItem) {
- this.assert(shouldTypeAdaptors.some(obj, function(item, index) {
- if (index in usedKeys) {
- return false;
- }
- try {
- should(item).containDeep(otherItem);
- usedKeys[index] = true;
- return true;
- } catch (e) {
- if (e instanceof should.AssertionError) {
- return false;
- }
- throw e;
- }
- }));
- }, this);
- } else if (obj != null && other != null && typeof obj == 'object' && typeof other == 'object') {// object contains object case
- shouldTypeAdaptors.forEach(other, function(value, key) {
- should(obj[key]).containDeep(value);
- });
- // if both objects is empty means we finish traversing - and we need to compare for hidden values
- if (shouldTypeAdaptors.isEmpty(other)) {
- this.eql(other);
- }
- } else {
- this.eql(other);
- }
- });
- };
- /*
- * should.js - assertion library
- * Copyright(c) 2010-2013 TJ Holowaychuk <tj@vision-media.ca>
- * Copyright(c) 2013-2016 Denis Bardadym <bardadymchik@gmail.com>
- * MIT Licensed
- */
- var aSlice = Array.prototype.slice;
- var propertyAssertions = function(should, Assertion) {
- var i = should.format;
- /**
- * Asserts given object has some descriptor. **On success it change given object to be value of property**.
- *
- * @name propertyWithDescriptor
- * @memberOf Assertion
- * @category assertion property
- * @param {string} name Name of property
- * @param {Object} desc Descriptor like used in Object.defineProperty (not required to add all properties)
- * @example
- *
- * ({ a: 10 }).should.have.propertyWithDescriptor('a', { enumerable: true });
- */
- Assertion.add('propertyWithDescriptor', function(name, desc) {
- this.params = {actual: this.obj, operator: 'to have own property with descriptor ' + i(desc)};
- var obj = this.obj;
- this.have.ownProperty(name);
- should(Object.getOwnPropertyDescriptor(Object(obj), name)).have.properties(desc);
- });
- function processPropsArgs() {
- var args = {};
- if (arguments.length > 1) {
- args.names = aSlice.call(arguments);
- } else {
- var arg = arguments[0];
- if (typeof arg === 'string') {
- args.names = [arg];
- } else if (Array.isArray(arg)) {
- args.names = arg;
- } else {
- args.names = Object.keys(arg);
- args.values = arg;
- }
- }
- return args;
- }
- Assertion.add('enumerable', function(name, val) {
- name = convertPropertyName(name);
- this.params = {
- operator: "to have enumerable property " + formatProp(name) + (arguments.length > 1 ? " equal to " + i(val): "")
- };
- var desc = { enumerable: true };
- if (arguments.length > 1) {
- desc.value = val;
- }
- this.have.propertyWithDescriptor(name, desc);
- });
- Assertion.add('enumerables', function(/*names*/) {
- var args = processPropsArgs.apply(null, arguments);
- this.params = {
- operator: "to have enumerables " + args.names.map(formatProp)
- };
- var obj = this.obj;
- args.names.forEach(function(name) {
- should(obj).have.enumerable(name);
- });
- });
- /**
- * Asserts given object has property with optionally value. **On success it change given object to be value of property**.
- *
- * @name property
- * @memberOf Assertion
- * @category assertion property
- * @param {string} name Name of property
- * @param {*} [val] Optional property value to check
- * @example
- *
- * ({ a: 10 }).should.have.property('a');
- */
- Assertion.add('property', function(name, val) {
- name = convertPropertyName(name);
- if (arguments.length > 1) {
- var p = {};
- p[name] = val;
- this.have.properties(p);
- } else {
- this.have.properties(name);
- }
- this.obj = this.obj[name];
- });
- /**
- * Asserts given object has properties. On this method affect .any modifier, which allow to check not all properties.
- *
- * @name properties
- * @memberOf Assertion
- * @category assertion property
- * @param {Array|...string|Object} names Names of property
- * @example
- *
- * ({ a: 10 }).should.have.properties('a');
- * ({ a: 10, b: 20 }).should.have.properties([ 'a' ]);
- * ({ a: 10, b: 20 }).should.have.properties({ b: 20 });
- */
- Assertion.add('properties', function(names) {
- var values = {};
- if (arguments.length > 1) {
- names = aSlice.call(arguments);
- } else if (!Array.isArray(names)) {
- if (typeof names == 'string' || typeof names == 'symbol') {
- names = [names];
- } else {
- values = names;
- names = Object.keys(names);
- }
- }
- var obj = Object(this.obj), missingProperties = [];
- //just enumerate properties and check if they all present
- names.forEach(function(name) {
- if (!(name in obj)) {
- missingProperties.push(formatProp(name));
- }
- });
- var props = missingProperties;
- if (props.length === 0) {
- props = names.map(formatProp);
- } else if (this.anyOne) {
- props = names.filter(function(name) {
- return missingProperties.indexOf(formatProp(name)) < 0;
- }).map(formatProp);
- }
- var operator = (props.length === 1 ?
- 'to have property ' : 'to have ' + (this.anyOne ? 'any of ' : '') + 'properties ') + props.join(', ');
- this.params = {obj: this.obj, operator: operator};
- //check that all properties presented
- //or if we request one of them that at least one them presented
- this.assert(missingProperties.length === 0 || (this.anyOne && missingProperties.length != names.length));
- // check if values in object matched expected
- var valueCheckNames = Object.keys(values);
- if (valueCheckNames.length) {
- var wrongValues = [];
- props = [];
- // now check values, as there we have all properties
- valueCheckNames.forEach(function(name) {
- var value = values[name];
- if (eql(obj[name], value).length !== 0) {
- wrongValues.push(formatProp(name) + ' of ' + i(value) + ' (got ' + i(obj[name]) + ')');
- } else {
- props.push(formatProp(name) + ' of ' + i(value));
- }
- });
- if ((wrongValues.length !== 0 && !this.anyOne) || (this.anyOne && props.length === 0)) {
- props = wrongValues;
- }
- operator = (props.length === 1 ?
- 'to have property ' : 'to have ' + (this.anyOne ? 'any of ' : '') + 'properties ') + props.join(', ');
- this.params = {obj: this.obj, operator: operator};
- //if there is no not matched values
- //or there is at least one matched
- this.assert(wrongValues.length === 0 || (this.anyOne && wrongValues.length != valueCheckNames.length));
- }
- });
- /**
- * Asserts given object has property `length` with given value `n`
- *
- * @name length
- * @alias Assertion#lengthOf
- * @memberOf Assertion
- * @category assertion property
- * @param {number} n Expected length
- * @param {string} [description] Optional message
- * @example
- *
- * [1, 2].should.have.length(2);
- */
- Assertion.add('length', function(n, description) {
- this.have.property('length', n, description);
- });
- Assertion.alias('length', 'lengthOf');
- /**
- * Asserts given object has own property. **On success it change given object to be value of property**.
- *
- * @name ownProperty
- * @alias Assertion#hasOwnProperty
- * @memberOf Assertion
- * @category assertion property
- * @param {string} name Name of property
- * @param {string} [description] Optional message
- * @example
- *
- * ({ a: 10 }).should.have.ownProperty('a');
- */
- Assertion.add('ownProperty', function(name, description) {
- name = convertPropertyName(name);
- this.params = {
- actual: this.obj,
- operator: 'to have own property ' + formatProp(name),
- message: description
- };
- this.assert(shouldUtil.hasOwnProperty(this.obj, name));
- this.obj = this.obj[name];
- });
- Assertion.alias('ownProperty', 'hasOwnProperty');
- /**
- * Asserts given object is empty. For strings, arrays and arguments it checks .length property, for objects it checks keys.
- *
- * @name empty
- * @memberOf Assertion
- * @category assertion property
- * @example
- *
- * ''.should.be.empty();
- * [].should.be.empty();
- * ({}).should.be.empty();
- */
- Assertion.add('empty', function() {
- this.params = {operator: 'to be empty'};
- this.assert(shouldTypeAdaptors.isEmpty(this.obj));
- }, true);
- /**
- * Asserts given object has such keys. Compared to `properties`, `keys` does not accept Object as a argument.
- * When calling via .key current object in assertion changed to value of this key
- *
- * @name keys
- * @alias Assertion#key
- * @memberOf Assertion
- * @category assertion property
- * @param {...*} keys Keys to check
- * @example
- *
- * ({ a: 10 }).should.have.keys('a');
- * ({ a: 10, b: 20 }).should.have.keys('a', 'b');
- * (new Map([[1, 2]])).should.have.key(1);
- *
- * json.should.have.only.keys('type', 'version')
- */
- Assertion.add('keys', function(keys) {
- keys = aSlice.call(arguments);
- var obj = Object(this.obj);
- // first check if some keys are missing
- var missingKeys = keys.filter(function(key) {
- return !shouldTypeAdaptors.has(obj, key);
- });
- var verb = 'to have ' + (this.onlyThis ? 'only ': '') + (keys.length === 1 ? 'key ' : 'keys ');
- this.params = {operator: verb + keys.join(', ')};
- if (missingKeys.length > 0) {
- this.params.operator += '\n\tmissing keys: ' + missingKeys.join(', ');
- }
- this.assert(missingKeys.length === 0);
- if (this.onlyThis) {
- obj.should.have.size(keys.length);
- }
- });
- Assertion.add('key', function(key) {
- this.have.keys(key);
- this.obj = shouldTypeAdaptors.get(this.obj, key);
- });
- /**
- * Asserts given object has such value for given key
- *
- * @name value
- * @memberOf Assertion
- * @category assertion property
- * @param {*} key Key to check
- * @param {*} value Value to check
- * @example
- *
- * ({ a: 10 }).should.have.value('a', 10);
- * (new Map([[1, 2]])).should.have.value(1, 2);
- */
- Assertion.add('value', function(key, value) {
- this.have.key(key).which.is.eql(value);
- });
- /**
- * Asserts given object has such size.
- *
- * @name size
- * @memberOf Assertion
- * @category assertion property
- * @param {number} s Size to check
- * @example
- *
- * ({ a: 10 }).should.have.size(1);
- * (new Map([[1, 2]])).should.have.size(1);
- */
- Assertion.add('size', function(s) {
- this.params = { operator: 'to have size ' + s };
- shouldTypeAdaptors.size(this.obj).should.be.exactly(s);
- });
- /**
- * Asserts given object has nested property in depth by path. **On success it change given object to be value of final property**.
- *
- * @name propertyByPath
- * @memberOf Assertion
- * @category assertion property
- * @param {Array|...string} properties Properties path to search
- * @example
- *
- * ({ a: {b: 10}}).should.have.propertyByPath('a', 'b').eql(10);
- */
- Assertion.add('propertyByPath', function(properties) {
- properties = aSlice.call(arguments);
- var allProps = properties.map(formatProp);
- properties = properties.map(convertPropertyName);
- var obj = should(Object(this.obj));
- var foundProperties = [];
- var currentProperty;
- while (properties.length) {
- currentProperty = properties.shift();
- this.params = {operator: 'to have property by path ' + allProps.join(', ') + ' - failed on ' + formatProp(currentProperty)};
- obj = obj.have.property(currentProperty);
- foundProperties.push(currentProperty);
- }
- this.params = {obj: this.obj, operator: 'to have property by path ' + allProps.join(', ')};
- this.obj = obj.obj;
- });
- };
- /*
- * should.js - assertion library
- * Copyright(c) 2010-2013 TJ Holowaychuk <tj@vision-media.ca>
- * Copyright(c) 2013-2016 Denis Bardadym <bardadymchik@gmail.com>
- * MIT Licensed
- */
- var errorAssertions = function(should, Assertion) {
- var i = should.format;
- /**
- * Assert given function throws error with such message.
- *
- * @name throw
- * @memberOf Assertion
- * @category assertion errors
- * @alias Assertion#throwError
- * @param {string|RegExp|Function|Object|GeneratorFunction|GeneratorObject} [message] Message to match or properties
- * @param {Object} [properties] Optional properties that will be matched to thrown error
- * @example
- *
- * (function(){ throw new Error('fail') }).should.throw();
- * (function(){ throw new Error('fail') }).should.throw('fail');
- * (function(){ throw new Error('fail') }).should.throw(/fail/);
- *
- * (function(){ throw new Error('fail') }).should.throw(Error);
- * var error = new Error();
- * error.a = 10;
- * (function(){ throw error; }).should.throw(Error, { a: 10 });
- * (function(){ throw error; }).should.throw({ a: 10 });
- * (function*() {
- * yield throwError();
- * }).should.throw();
- */
- Assertion.add('throw', function(message, properties) {
- var fn = this.obj;
- var err = {};
- var errorInfo = '';
- var thrown = false;
- if (shouldUtil.isGeneratorFunction(fn)) {
- return should(fn()).throw(message, properties);
- } else if (shouldUtil.isIterator(fn)) {
- return should(fn.next.bind(fn)).throw(message, properties);
- }
- this.is.a.Function();
- var errorMatched = true;
- try {
- fn();
- } catch (e) {
- thrown = true;
- err = e;
- }
- if (thrown) {
- if (message) {
- if ('string' == typeof message) {
- errorMatched = message == err.message;
- } else if (message instanceof RegExp) {
- errorMatched = message.test(err.message);
- } else if ('function' == typeof message) {
- errorMatched = err instanceof message;
- } else if (null != message) {
- try {
- should(err).match(message);
- } catch (e) {
- if (e instanceof should.AssertionError) {
- errorInfo = ": " + e.message;
- errorMatched = false;
- } else {
- throw e;
- }
- }
- }
- if (!errorMatched) {
- if ('string' == typeof message || message instanceof RegExp) {
- errorInfo = " with a message matching " + i(message) + ", but got '" + err.message + "'";
- } else if ('function' == typeof message) {
- errorInfo = " of type " + functionName(message) + ", but got " + functionName(err.constructor);
- }
- } else if ('function' == typeof message && properties) {
- try {
- should(err).match(properties);
- } catch (e) {
- if (e instanceof should.AssertionError) {
- errorInfo = ": " + e.message;
- errorMatched = false;
- } else {
- throw e;
- }
- }
- }
- } else {
- errorInfo = " (got " + i(err) + ")";
- }
- }
- this.params = { operator: 'to throw exception' + errorInfo };
- this.assert(thrown);
- this.assert(errorMatched);
- });
- Assertion.alias('throw', 'throwError');
- };
- /*
- * should.js - assertion library
- * Copyright(c) 2010-2013 TJ Holowaychuk <tj@vision-media.ca>
- * Copyright(c) 2013-2016 Denis Bardadym <bardadymchik@gmail.com>
- * MIT Licensed
- */
- var matchingAssertions = function(should, Assertion) {
- var i = should.format;
- /**
- * Asserts if given object match `other` object, using some assumptions:
- * First object matched if they are equal,
- * If `other` is a regexp and given object is a string check on matching with regexp
- * If `other` is a regexp and given object is an array check if all elements matched regexp
- * If `other` is a regexp and given object is an object check values on matching regexp
- * If `other` is a function check if this function throws AssertionError on given object or return false - it will be assumed as not matched
- * If `other` is an object check if the same keys matched with above rules
- * All other cases failed.
- *
- * Usually it is right idea to add pre type assertions, like `.String()` or `.Object()` to be sure assertions will do what you are expecting.
- * Object iteration happen by keys (properties with enumerable: true), thus some objects can cause small pain. Typical example is js
- * Error - it by default has 2 properties `name` and `message`, but they both non-enumerable. In this case make sure you specify checking props (see examples).
- *
- * @name match
- * @memberOf Assertion
- * @category assertion matching
- * @param {*} other Object to match
- * @param {string} [description] Optional message
- * @example
- * 'foobar'.should.match(/^foo/);
- * 'foobar'.should.not.match(/^bar/);
- *
- * ({ a: 'foo', c: 'barfoo' }).should.match(/foo$/);
- *
- * ['a', 'b', 'c'].should.match(/[a-z]/);
- *
- * (5).should.not.match(function(n) {
- * return n < 0;
- * });
- * (5).should.not.match(function(it) {
- * it.should.be.an.Array();
- * });
- * ({ a: 10, b: 'abc', c: { d: 10 }, d: 0 }).should
- * .match({ a: 10, b: /c$/, c: function(it) {
- * return it.should.have.property('d', 10);
- * }});
- *
- * [10, 'abc', { d: 10 }, 0].should
- * .match({ '0': 10, '1': /c$/, '2': function(it) {
- * return it.should.have.property('d', 10);
- * }});
- *
- * var myString = 'abc';
- *
- * myString.should.be.a.String().and.match(/abc/);
- *
- * myString = {};
- *
- * myString.should.match(/abc/); //yes this will pass
- * //better to do
- * myString.should.be.an.Object().and.not.empty().and.match(/abc/);//fixed
- *
- * (new Error('boom')).should.match(/abc/);//passed because no keys
- * (new Error('boom')).should.not.match({ message: /abc/ });//check specified property
- */
- Assertion.add('match', function(other, description) {
- this.params = {operator: 'to match ' + i(other), message: description};
- if (eql(this.obj, other).length !== 0) {
- if (other instanceof RegExp) { // something - regex
- if (typeof this.obj == 'string') {
- this.assert(other.exec(this.obj));
- } else if (null != this.obj && typeof this.obj == 'object') {
- var notMatchedProps = [], matchedProps = [];
- shouldTypeAdaptors.forEach(this.obj, function(value, name) {
- if (other.exec(value)) {
- matchedProps.push(formatProp(name));
- } else {
- notMatchedProps.push(formatProp(name) + ' (' + i(value) + ')');
- }
- }, this);
- if (notMatchedProps.length) {
- this.params.operator += '\n not matched properties: ' + notMatchedProps.join(', ');
- }
- if (matchedProps.length) {
- this.params.operator += '\n matched properties: ' + matchedProps.join(', ');
- }
- this.assert(notMatchedProps.length === 0);
- } // should we try to convert to String and exec?
- else {
- this.assert(false);
- }
- } else if (typeof other == 'function') {
- var res;
- res = other(this.obj);
- //if we throw exception ok - it is used .should inside
- if (typeof res == 'boolean') {
- this.assert(res); // if it is just boolean function assert on it
- }
- } else if (other != null && this.obj != null && typeof other == 'object' && typeof this.obj == 'object') { // try to match properties (for Object and Array)
- notMatchedProps = [];
- matchedProps = [];
- shouldTypeAdaptors.forEach(other, function(value, key) {
- try {
- should(this.obj).have.property(key).which.match(value);
- matchedProps.push(formatProp(key));
- } catch (e) {
- if (e instanceof should.AssertionError) {
- notMatchedProps.push(formatProp(key) + ' (' + i(this.obj[key]) + ')');
- } else {
- throw e;
- }
- }
- }, this);
- if (notMatchedProps.length) {
- this.params.operator += '\n not matched properties: ' + notMatchedProps.join(', ');
- }
- if (matchedProps.length) {
- this.params.operator += '\n matched properties: ' + matchedProps.join(', ');
- }
- this.assert(notMatchedProps.length === 0);
- } else {
- this.assert(false);
- }
- }
- });
- /**
- * Asserts if given object values or array elements all match `other` object, using some assumptions:
- * First object matched if they are equal,
- * If `other` is a regexp - matching with regexp
- * If `other` is a function check if this function throws AssertionError on given object or return false - it will be assumed as not matched
- * All other cases check if this `other` equal to each element
- *
- * @name matchEach
- * @memberOf Assertion
- * @category assertion matching
- * @alias Assertion#matchEvery
- * @param {*} other Object to match
- * @param {string} [description] Optional message
- * @example
- * [ 'a', 'b', 'c'].should.matchEach(/\w+/);
- * [ 'a', 'a', 'a'].should.matchEach('a');
- *
- * [ 'a', 'a', 'a'].should.matchEach(function(value) { value.should.be.eql('a') });
- *
- * { a: 'a', b: 'a', c: 'a' }.should.matchEach(function(value) { value.should.be.eql('a') });
- */
- Assertion.add('matchEach', function(other, description) {
- this.params = {operator: 'to match each ' + i(other), message: description};
- shouldTypeAdaptors.forEach(this.obj, function(value) {
- should(value).match(other);
- }, this);
- });
- /**
- * Asserts if any of given object values or array elements match `other` object, using some assumptions:
- * First object matched if they are equal,
- * If `other` is a regexp - matching with regexp
- * If `other` is a function check if this function throws AssertionError on given object or return false - it will be assumed as not matched
- * All other cases check if this `other` equal to each element
- *
- * @name matchAny
- * @memberOf Assertion
- * @category assertion matching
- * @param {*} other Object to match
- * @alias Assertion#matchSome
- * @param {string} [description] Optional message
- * @example
- * [ 'a', 'b', 'c'].should.matchAny(/\w+/);
- * [ 'a', 'b', 'c'].should.matchAny('a');
- *
- * [ 'a', 'b', 'c'].should.matchAny(function(value) { value.should.be.eql('a') });
- *
- * { a: 'a', b: 'b', c: 'c' }.should.matchAny(function(value) { value.should.be.eql('a') });
- */
- Assertion.add('matchAny', function(other, description) {
- this.params = {operator: 'to match any ' + i(other), message: description};
- this.assert(shouldTypeAdaptors.some(this.obj, function(value) {
- try {
- should(value).match(other);
- return true;
- } catch (e) {
- if (e instanceof should.AssertionError) {
- // Caught an AssertionError, return false to the iterator
- return false;
- }
- throw e;
- }
- }));
- });
- Assertion.alias('matchAny', 'matchSome');
- Assertion.alias('matchEach', 'matchEvery');
- };
- /*
- * should.js - assertion library
- * Copyright(c) 2010-2013 TJ Holowaychuk <tj@vision-media.ca>
- * Copyright(c) 2013-2016 Denis Bardadym <bardadymchik@gmail.com>
- * MIT Licensed
- */
- /**
- * Our function should
- *
- * @param {*} obj Object to assert
- * @returns {should.Assertion} Returns new Assertion for beginning assertion chain
- * @example
- *
- * var should = require('should');
- * should('abc').be.a.String();
- */
- function should(obj) {
- return (new Assertion(obj));
- }
- should.AssertionError = AssertionError;
- should.Assertion = Assertion;
- // exposing modules dirty way
- should.modules = {
- format: sformat,
- type: getType,
- equal: eql
- };
- should.format = format;
- /**
- * Object with configuration.
- * It contains such properties:
- * * `checkProtoEql` boolean - Affect if `.eql` will check objects prototypes
- * * `plusZeroAndMinusZeroEqual` boolean - Affect if `.eql` will treat +0 and -0 as equal
- * Also it can contain options for should-format.
- *
- * @type {Object}
- * @memberOf should
- * @static
- * @example
- *
- * var a = { a: 10 }, b = Object.create(null);
- * b.a = 10;
- *
- * a.should.be.eql(b);
- * //not throws
- *
- * should.config.checkProtoEql = true;
- * a.should.be.eql(b);
- * //throws AssertionError: expected { a: 10 } to equal { a: 10 } (because A and B have different prototypes)
- */
- should.config = config;
- /**
- * Allow to extend given prototype with should property using given name. This getter will **unwrap** all standard wrappers like `Number`, `Boolean`, `String`.
- * Using `should(obj)` is the equivalent of using `obj.should` with known issues (like nulls and method calls etc).
- *
- * To add new assertions, need to use Assertion.add method.
- *
- * @param {string} [propertyName] Name of property to add. Default is `'should'`.
- * @param {Object} [proto] Prototype to extend with. Default is `Object.prototype`.
- * @memberOf should
- * @returns {{ name: string, descriptor: Object, proto: Object }} Descriptor enough to return all back
- * @static
- * @example
- *
- * var prev = should.extend('must', Object.prototype);
- *
- * 'abc'.must.startWith('a');
- *
- * var should = should.noConflict(prev);
- * should.not.exist(Object.prototype.must);
- */
- should.extend = function(propertyName, proto) {
- propertyName = propertyName || 'should';
- proto = proto || Object.prototype;
- var prevDescriptor = Object.getOwnPropertyDescriptor(proto, propertyName);
- Object.defineProperty(proto, propertyName, {
- set: function() {
- },
- get: function() {
- return should(isWrapperType(this) ? this.valueOf() : this);
- },
- configurable: true
- });
- return { name: propertyName, descriptor: prevDescriptor, proto: proto };
- };
- /**
- * Delete previous extension. If `desc` missing it will remove default extension.
- *
- * @param {{ name: string, descriptor: Object, proto: Object }} [desc] Returned from `should.extend` object
- * @memberOf should
- * @returns {Function} Returns should function
- * @static
- * @example
- *
- * var should = require('should').noConflict();
- *
- * should(Object.prototype).not.have.property('should');
- *
- * var prev = should.extend('must', Object.prototype);
- * 'abc'.must.startWith('a');
- * should.noConflict(prev);
- *
- * should(Object.prototype).not.have.property('must');
- */
- should.noConflict = function(desc) {
- desc = desc || should._prevShould;
- if (desc) {
- delete desc.proto[desc.name];
- if (desc.descriptor) {
- Object.defineProperty(desc.proto, desc.name, desc.descriptor);
- }
- }
- return should;
- };
- /**
- * Simple utility function for a bit more easier should assertion extension
- * @param {Function} f So called plugin function. It should accept 2 arguments: `should` function and `Assertion` constructor
- * @memberOf should
- * @returns {Function} Returns `should` function
- * @static
- * @example
- *
- * should.use(function(should, Assertion) {
- * Assertion.add('asset', function() {
- * this.params = { operator: 'to be asset' };
- *
- * this.obj.should.have.property('id').which.is.a.Number();
- * this.obj.should.have.property('path');
- * })
- * })
- */
- should.use = function(f) {
- f(should, should.Assertion);
- return this;
- };
- should
- .use(assertExtensions)
- .use(chainAssertions)
- .use(booleanAssertions)
- .use(numberAssertions)
- .use(equalityAssertions)
- .use(typeAssertions)
- .use(stringAssertions)
- .use(propertyAssertions)
- .use(errorAssertions)
- .use(matchingAssertions)
- .use(containAssertions)
- .use(promiseAssertions);
- module.exports = should;
|