@@ -39,6 +39,13 @@ Chai's `should()` [assertion style][assertion-style], just to be different.
3939[2 , 3 , 5 ].should .iterate .from ([2 , 3 ]);
4040[2 , 3 , 5 ].should .iterate .until ([3 , 5 ]);
4141
42+ [2 , 3 , 5 ].should .iterate .for .lengthOf (3 );
43+ [2 , 3 , 5 ].should .iterate .for .length .above (2 );
44+ [2 , 3 , 5 ].should .iterate .for .length .below (4 );
45+ [2 , 3 , 5 ].should .iterate .for .length .of .at .least (3 );
46+ [2 , 3 , 5 ].should .iterate .for .length .of .at .most (3 );
47+ [2 , 3 , 5 ].should .iterate .for .length .within (2 , 4 );
48+
4249[2 , 3 , 5 ].should .not .iterate .over ([1 , 2 , 3 ]);
4350[{n: 2 }, {n: 3 }].should .deep .iterate .from ([{n: 2 }]);
4451```
@@ -70,7 +77,7 @@ class Count {
7077 this .step = step;
7178 }
7279
73- * [Symbol .iterator ]() {
80+ * [Symbol .iterator ]() {
7481 for (let n = this .start ; true ; n += this .step ) {
7582 yield n;
7683 }
@@ -104,7 +111,7 @@ Let's generate the [fibonacci sequence][fibonacci-sequence]. A
104111iterable.
105112
106113``` js
107- function * fibonacci () {
114+ function * fibonacci () {
108115 for (let [x, y] = [1 , 1 ]; true ; [x, y] = [y, x + y]) {
109116 yield x;
110117 }
@@ -229,6 +236,12 @@ chai.use(chaiIterator);
229236- [ ` iterate.over() ` ] ( #iterateoverexpected )
230237- [ ` iterate.from() ` ] ( #iteratefromexpected )
231238- [ ` iterate.until() ` ] ( #iterateuntilexpected )
239+ - [ ` iterate.for.lengthOf() ` ] ( #iterateforlengthofn )
240+ - [ ` iterate.for.length.above() ` ] ( #iterateforlengthaboven )
241+ - [ ` iterate.for.length.below() ` ] ( #iterateforlengthbelown )
242+ - [ ` iterate.for.length.of.at.least() ` ] ( #iterateforlengthofatleastn )
243+ - [ ` iterate.for.length.of.at.most() ` ] ( #iterateforlengthofatmostn )
244+ - [ ` iterate.for.length.within() ` ] ( #iterateforlengthwithinmin-max )
232245
233246#### ` iterable `
234247
@@ -289,6 +302,90 @@ expect([2, 3, 5]).not.to.iterate.until([2, 3]);
289302expect ([{n: 2 }, {n: 3 }]).to .deep .iterate .until ([{n: 3 }]);
290303```
291304
305+ #### ` iterate.for.lengthOf(n) `
306+
307+ Asserts that the target yields exactly * n* values.
308+
309+ | Param | Type | Description |
310+ | :----- | :------- | :------------------ |
311+ | n | ` number ` | A positive integer |
312+
313+ ``` js
314+ expect ([2 , 3 , 5 ]).to .iterate .for .lengthOf (3 );
315+ expect (' abcdefg' ).to .iterate .for .lengthOf (7 );
316+ expect ([2 , 3 , 5 ]).not .to .iterate .for .lengthOf (7 );
317+ ```
318+
319+ #### ` iterate.for.length.above(n) `
320+
321+ Asserts that the target yields more than * n* values.
322+
323+ | Param | Type | Description |
324+ | :----- | :------- | :------------------ |
325+ | n | ` number ` | A positive integer |
326+
327+ ``` js
328+ expect ([2 , 3 , 5 ]).to .iterate .for .length .above (2 );
329+ expect (' abcdefg' ).to .iterate .for .length .above (5 );
330+ expect ([2 , 3 , 5 ]).not .to .iterate .for .length .above (3 );
331+ ```
332+
333+ #### ` iterate.for.length.below(n) `
334+
335+ Asserts that the target yields fewer than * n* values.
336+
337+ | Param | Type | Description |
338+ | :----- | :------- | :------------------ |
339+ | n | ` number ` | A positive integer |
340+
341+ ``` js
342+ expect ([2 , 3 , 5 ]).to .iterate .for .length .below (4 );
343+ expect (' abcdefg' ).to .iterate .for .length .below (10 );
344+ expect ([2 , 3 , 5 ]).not .to .iterate .for .length .below (3 );
345+ ```
346+
347+ #### ` iterate.for.length.of.at.least(n) `
348+
349+ Asserts that the target yields at least * n* values.
350+
351+ | Param | Type | Description |
352+ | :----- | :------- | :------------------ |
353+ | n | ` number ` | A positive integer |
354+
355+ ``` js
356+ expect ([2 , 3 , 5 ]).to .iterate .for .length .of .at .least (2 );
357+ expect ([2 , 3 , 5 ]).to .iterate .for .length .of .at .least (3 );
358+ expect ([2 , 3 , 5 ]).not .to .iterate .for .length .of .at .least (4 );
359+ ```
360+
361+ #### ` iterate.for.length.of.at.most(n) `
362+
363+ Asserts that the target yields at most * n* values.
364+
365+ | Param | Type | Description |
366+ | :----- | :------- | :------------------ |
367+ | n | ` number ` | A positive integer |
368+
369+ ``` js
370+ expect ([2 , 3 , 5 ]).to .iterate .for .length .of .at .most (4 );
371+ expect ([2 , 3 , 5 ]).to .iterate .for .length .of .at .most (3 );
372+ expect ([2 , 3 , 5 ]).not .to .iterate .for .length .of .at .most (2 );
373+ ```
374+
375+ #### ` iterate.for.length.within(min, max) `
376+
377+ Asserts that the target yields between * min* and * max* values, inclusive.
378+
379+ | Param | Type | Description |
380+ | :----- | :------- | :------------------ |
381+ | n | ` number ` | A positive integer |
382+
383+ ``` js
384+ expect ([2 , 3 , 5 ]).to .iterate .for .length .within (2 , 4 );
385+ expect ([2 , 3 , 5 ]).to .iterate .for .length .within (3 , 3 );
386+ expect ([2 , 3 , 5 ]).not .to .iterate .for .length .within (4 , 7 );
387+ ```
388+
292389## Assert API
293390
294391#### Assertions
@@ -307,6 +404,7 @@ expect([{n: 2}, {n: 3}]).to.deep.iterate.until([{n: 3}]);
307404- [ ` doesNotIterateUntil() ` ] ( #doesnotiterateuntilvalue-expected-message )
308405- [ ` deepIteratesUntil() ` ] ( #deepiteratesuntilvalue-expected-message )
309406- [ ` doesNotDeepIterateUntil() ` ] ( #doesnotdeepiterateuntilvalue-expected-message )
407+ - [ ` lengthOf() ` ] ( #lengthofvalue-expected-message )
310408
311409#### Parameters
312410
@@ -316,6 +414,7 @@ The parameters for the assert methods are as follows.
316414| :------- | :------- | :--------------------------------------- |
317415| value | ` any ` | Any value. |
318416| expected | ` object ` | An iterable object. |
417+ | n | ` number ` | A positive integer. |
319418| message? | ` string ` | An optional message to display on error. |
320419
321420#### ` isIterable(value, [message]) `
@@ -456,6 +555,23 @@ assert.doesNotDeepIterateUntil([{n: 2}, {n: 3}], [{n: 5}]);
456555assert .doesNotDeepIterateUntil ([[0 , 2 ], [1 , 3 ]], [[0 , 2 ]]);
457556```
458557
558+ #### ` lengthOf(value, n, [message]) `
559+
560+ Asserts that an iterable yields a given number of values. If * value* is not an
561+ iterable object, or if it has a ` 'length' ` property, Chai's native
562+ [ ` assert.lengthOf() ` ] [ chai-assert-lengthof ] will be used.
563+
564+ ``` js
565+ function * range (min = 0 , max = Infinity , step = 1 ) {
566+ for (let n = min; n < max; n += step) {
567+ yield n;
568+ }
569+ }
570+
571+ assert .lengthOf (range (0 , 10 ), 10 );
572+ assert .lengthOf (range (6 , 42 ), 36 );
573+ ```
574+
459575## License
460576
461577Copyright © ; 2016 Akim McMath. Licensed under the [ MIT License] [ license ] .
@@ -496,3 +612,4 @@ Copyright © 2016 Akim McMath. Licensed under the [MIT License][license].
496612[ es6-lib ] : https://github.com/Microsoft/TypeScript/blob/master/lib/lib.es6.d.ts
497613[ deep ] : http://chaijs.com/api/bdd/#method_deep
498614[ chai-npm ] : https://www.npmjs.com/package/chai
615+ [ chai-assert-lengthof ] : http://chaijs.com/api/assert/#method_lengthof
0 commit comments