UNPKG

chai-include-ordered-with-gaps

Version:

A Chai plugin to check if an array contains some members, not necessarily successively.

62 lines (50 loc) 1.94 kB
'use strict'; /** * @param {import('chai')} chai * @param {Chai.ChaiUtils} utils */ module.exports = function(chai, utils) { const { Assertion, assert } = chai; const originalMembers = Assertion.prototype.members; Assertion.addChainableMethod( 'members', function() { originalMembers.apply(this, arguments); }, function(_super) {}, ); function strictEqual(a, b) { return a === b; } function indexableIncludesWithGaps(actual, expected, deep) { const comparer = deep ? utils.eql : strictEqual; let actualIndex = 0, expectedIndex = 0; for (actualIndex = 0, expectedIndex = 0; actualIndex < actual.length; actualIndex++) { if (comparer(actual[actualIndex], expected[expectedIndex])) { expectedIndex++; } } this.assert( expected.length === expectedIndex, 'expected #{this} to ' + (deep ? 'deep ' : '') + 'include values of #{exp}, ordered, possibly with gaps', 'expected #{this} to not ' + (deep ? 'deep ' : '') + 'include values of #{exp}, ordered, possibly with gaps', expected, ); } Assertion.addMethod('gaps', function(subset) { indexableIncludesWithGaps.call(this, this._obj, subset, utils.flag(this, 'deep')); }); assert.includeOrderedMembersWithGaps = function(superset, subset) { new Assertion(superset).to.include.ordered.members.with.gaps(subset); } assert.includeDeepOrderedMembersWithGaps = function(superset, subset) { new Assertion(superset).to.include.deep.ordered.members.with.gaps(subset); } assert.notIncludeOrderedMembersWithGaps = function(superset, subset) { new Assertion(superset).to.not.include.ordered.members.with.gaps(subset); } assert.notIncludeDeepOrderedMembersWithGaps = function(superset, subset) { new Assertion(superset).to.not.include.deep.ordered.members.with.gaps(subset); } };