diff --git a/.github/.keepalive b/.github/.keepalive deleted file mode 100644 index 7e4300f..0000000 --- a/.github/.keepalive +++ /dev/null @@ -1 +0,0 @@ -2023-10-01T05:28:38.646Z diff --git a/package.json b/package.json index b332353..5941602 100644 --- a/package.json +++ b/package.json @@ -41,24 +41,24 @@ "@stdlib/array-base-assert-is-accessor-array": "^0.1.0", "@stdlib/array-base-getter": "^0.1.0", "@stdlib/array-dtype": "^0.1.0", - "@stdlib/assert-has-own-property": "^0.1.0", + "@stdlib/assert-has-own-property": "^0.1.1", "@stdlib/assert-is-collection": "^0.1.0", - "@stdlib/assert-is-function": "^0.1.0", + "@stdlib/assert-is-function": "^0.1.1", "@stdlib/assert-is-nonnegative-integer": "^0.1.0", - "@stdlib/assert-is-plain-object": "^0.1.0", - "@stdlib/string-format": "^0.1.0", + "@stdlib/assert-is-plain-object": "^0.1.1", + "@stdlib/string-format": "^0.1.1", "@stdlib/symbol-iterator": "^0.1.0", "@stdlib/types": "^0.1.0", - "@stdlib/utils-define-nonenumerable-read-only-property": "^0.1.0" + "@stdlib/utils-define-nonenumerable-read-only-property": "^0.1.1" }, "devDependencies": { "@stdlib/array-float64": "^0.1.0", - "@stdlib/assert-is-iterator-like": "^0.1.0", + "@stdlib/assert-is-iterator-like": "^0.1.1", "@stdlib/bench": "^0.1.0", - "@stdlib/math-base-assert-is-nan": "^0.1.0", + "@stdlib/math-base-assert-is-nan": "^0.1.1", "@stdlib/random-base-randu": "^0.1.0", "@stdlib/utils-inmap": "^0.1.0", - "@stdlib/utils-noop": "^0.1.0", + "@stdlib/utils-noop": "^0.1.1", "proxyquire": "^2.0.0", "tape": "git+https://github.com/kgryte/tape.git#fix/globby", "istanbul": "^0.4.1", diff --git a/test/dist/test.js b/test/dist/test.js index c7f27c4..a8a9c60 100644 --- a/test/dist/test.js +++ b/test/dist/test.js @@ -1,7 +1,7 @@ /** * @license Apache-2.0 * -* Copyright (c) 2018 The Stdlib Authors. +* Copyright (c) 2023 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,1047 +21,13 @@ // MODULES // var tape = require( 'tape' ); -var proxyquire = require( 'proxyquire' ); -var iteratorSymbol = require( '@stdlib/symbol-iterator' ); -var noop = require( '@stdlib/utils-noop' ); -var circarray2iterator = require( './../../dist' ); +var main = require( './../../dist' ); // TESTS // -tape( 'main export is a function', function test( t ) { +tape( 'main export is defined', function test( t ) { t.ok( true, __filename ); - t.strictEqual( typeof circarray2iterator, 'function', 'main export is a function' ); + t.strictEqual( main !== void 0, true, 'main export is defined' ); t.end(); }); - -tape( 'the function throws an error if provided a first argument which is not an array-like object', function test( t ) { - var values; - var i; - - values = [ - '5', - 5, - NaN, - true, - false, - null, - void 0, - {}, - function noop() {} - ]; - - for ( i = 0; i < values.length; i++ ) { - t.throws( badValue( values[i] ), TypeError, 'throws an error when provided '+values[i] ); - } - t.end(); - - function badValue( value ) { - return function badValue() { - circarray2iterator( value ); - }; - } -}); - -tape( 'the function throws an error if provided a first argument which is not an array-like object (options)', function test( t ) { - var values; - var i; - - values = [ - '5', - 5, - NaN, - true, - false, - null, - void 0, - {}, - function noop() {} - ]; - - for ( i = 0; i < values.length; i++ ) { - t.throws( badValue( values[i] ), TypeError, 'throws an error when provided '+values[i] ); - } - t.end(); - - function badValue( value ) { - return function badValue() { - circarray2iterator( value, {} ); - }; - } -}); - -tape( 'the function throws an error if provided a first argument which is not an array-like object (callback)', function test( t ) { - var values; - var i; - - values = [ - '5', - 5, - NaN, - true, - false, - null, - void 0, - {}, - function noop() {} - ]; - - for ( i = 0; i < values.length; i++ ) { - t.throws( badValue( values[i] ), TypeError, 'throws an error when provided '+values[i] ); - } - t.end(); - - function badValue( value ) { - return function badValue() { - circarray2iterator( value, noop ); - }; - } -}); - -tape( 'the function throws an error if provided a callback argument which is not a function (no options)', function test( t ) { - var values; - var i; - - values = [ - '5', - 5, - NaN, - true, - false, - null, - void 0, - [] - ]; - - for ( i = 0; i < values.length; i++ ) { - t.throws( badValue( values[i] ), TypeError, 'throws an error when provided '+values[i] ); - } - t.end(); - - function badValue( value ) { - return function badValue() { - circarray2iterator( [ 1, 2, 3, 4 ], value ); - }; - } -}); - -tape( 'the function throws an error if provided a callback argument which is not a function (options)', function test( t ) { - var values; - var i; - - values = [ - '5', - 5, - NaN, - true, - false, - null, - void 0, - [], - {} - ]; - - for ( i = 0; i < values.length; i++ ) { - t.throws( badValue( values[i] ), TypeError, 'throws an error when provided '+values[i] ); - } - t.end(); - - function badValue( value ) { - return function badValue() { - circarray2iterator( [ 1, 2, 3, 4 ], {}, value ); - }; - } -}); - -tape( 'the function throws an error if provided an `iter` option which is not a nonnegative integer (no callback)', function test( t ) { - var values; - var i; - - values = [ - '5', - -5, - 3.14, - NaN, - true, - false, - null, - void 0, - [], - {}, - function noop() {} - ]; - - for ( i = 0; i < values.length; i++ ) { - t.throws( badValue( values[i] ), TypeError, 'throws an error when provided '+values[i] ); - } - t.end(); - - function badValue( value ) { - return function badValue() { - circarray2iterator( [ 1, 2, 3, 4 ], { - 'iter': value - }); - }; - } -}); - -tape( 'the function throws an error if provided an `iter` option which is not a nonnegative integer (callback)', function test( t ) { - var values; - var i; - - values = [ - '5', - -5, - 3.14, - NaN, - true, - false, - null, - void 0, - [], - {}, - function noop() {} - ]; - - for ( i = 0; i < values.length; i++ ) { - t.throws( badValue( values[i] ), TypeError, 'throws an error when provided '+values[i] ); - } - t.end(); - - function badValue( value ) { - return function badValue() { - var opts = { - 'iter': value - }; - circarray2iterator( [ 1, 2, 3, 4 ], opts, noop ); - }; - } -}); - -tape( 'the function throws an error if provided a `dir` option which is neither `1` nor `-1` (no callback)', function test( t ) { - var values; - var i; - - values = [ - '5', - 5, - 0, - -5, - NaN, - true, - false, - null, - void 0, - [], - {}, - function noop() {} - ]; - - for ( i = 0; i < values.length; i++ ) { - t.throws( badValue( values[i] ), TypeError, 'throws an error when provided '+values[i] ); - } - t.end(); - - function badValue( value ) { - return function badValue() { - circarray2iterator( [ 1, 2, 3, 4 ], { - 'dir': value - }); - }; - } -}); - -tape( 'the function throws an error if provided a `dir` option which is neither `1` nor `-1` (callback)', function test( t ) { - var values; - var i; - - values = [ - '5', - 5, - 0, - -5, - NaN, - true, - false, - null, - void 0, - [], - {}, - function noop() {} - ]; - - for ( i = 0; i < values.length; i++ ) { - t.throws( badValue( values[i] ), TypeError, 'throws an error when provided '+values[i] ); - } - t.end(); - - function badValue( value ) { - return function badValue() { - var opts = { - 'dir': value - }; - circarray2iterator( [ 1, 2, 3, 4 ], opts, noop ); - }; - } -}); - -tape( 'the function returns an iterator protocol-compliant object which repeatedly iterates over elements of an array-like object (array)', function test( t ) { - var expected; - var actual; - var values; - var it; - var r; - var i; - - values = [ 1, 2, 3, 4 ]; - expected = [ - { - 'value': 1, - 'done': false - }, - { - 'value': 2, - 'done': false - }, - { - 'value': 3, - 'done': false - }, - { - 'value': 4, - 'done': false - }, - { - 'value': 1, - 'done': false - }, - { - 'value': 2, - 'done': false - }, - { - 'value': 3, - 'done': false - }, - { - 'value': 4, - 'done': false - } - ]; - - it = circarray2iterator( values ); - t.equal( it.next.length, 0, 'has zero arity' ); - - actual = []; - for ( i = 0; i < values.length*2; i++ ) { - r = it.next(); - actual.push( r ); - t.equal( typeof r.value, 'number', 'returns a number' ); - t.equal( typeof r.done, 'boolean', 'returns a boolean' ); - } - t.deepEqual( actual, expected, 'returns expected values' ); - t.end(); -}); - -tape( 'the function returns an iterator protocol-compliant object which repeatedly iterates over elements of an array-like object (array; options)', function test( t ) { - var expected; - var actual; - var values; - var it; - var r; - var i; - - values = [ 1, 2, 3, 4 ]; - expected = [ - { - 'value': 1, - 'done': false - }, - { - 'value': 2, - 'done': false - }, - { - 'value': 3, - 'done': false - }, - { - 'value': 4, - 'done': false - }, - { - 'value': 1, - 'done': false - }, - { - 'value': 2, - 'done': false - }, - { - 'value': 3, - 'done': false - }, - { - 'value': 4, - 'done': false - } - ]; - - it = circarray2iterator( values, {} ); - t.equal( it.next.length, 0, 'has zero arity' ); - - actual = []; - for ( i = 0; i < values.length*2; i++ ) { - r = it.next(); - actual.push( r ); - t.equal( typeof r.value, 'number', 'returns a number' ); - t.equal( typeof r.done, 'boolean', 'returns a boolean' ); - } - t.deepEqual( actual, expected, 'returns expected values' ); - t.end(); -}); - -tape( 'the function returns an iterator protocol-compliant object which repeatedly iterates over the elements of an array-like object (array-like object)', function test( t ) { - var expected; - var actual; - var values; - var it; - var r; - var i; - - values = { - 'length': 4, - '0': 1, - '1': 2, - '2': 3, - '3': 4 - }; - expected = [ - { - 'value': 1, - 'done': false - }, - { - 'value': 2, - 'done': false - }, - { - 'value': 3, - 'done': false - }, - { - 'value': 4, - 'done': false - }, - { - 'value': 1, - 'done': false - }, - { - 'value': 2, - 'done': false - }, - { - 'value': 3, - 'done': false - }, - { - 'value': 4, - 'done': false - } - ]; - - it = circarray2iterator( values ); - t.equal( it.next.length, 0, 'has zero arity' ); - - actual = []; - for ( i = 0; i < values.length*2; i++ ) { - r = it.next(); - actual.push( r ); - t.equal( typeof r.value, 'number', 'returns a number' ); - t.equal( typeof r.done, 'boolean', 'returns a boolean' ); - } - t.deepEqual( actual, expected, 'returns expected values' ); - t.end(); -}); - -tape( 'the function returns an iterator protocol-compliant object which repeatedly iterates over elements of an array-like object (empty)', function test( t ) { - var expected; - var actual; - var values; - var it; - - values = []; - expected = [ - { - 'done': true - } - ]; - - it = circarray2iterator( values ); - t.equal( it.next.length, 0, 'has zero arity' ); - - actual = [ it.next() ]; - t.deepEqual( actual, expected, 'returns expected values' ); - t.end(); -}); - -tape( 'the function returns an iterator protocol-compliant object which supports invoking a provided function for each iterated value', function test( t ) { - var expected; - var values; - var it; - var r; - var i; - - values = [ 1, 2, 3, 4 ]; - - it = circarray2iterator( values, scale ); - t.equal( it.next.length, 0, 'has zero arity' ); - - expected = []; - for ( i = 0; i < values.length; i++ ) { - r = it.next(); - t.equal( r.value, expected[ i ], 'returns expected value' ); - t.equal( typeof r.done, 'boolean', 'returns a boolean' ); - } - t.equal( expected.length, values.length, 'has expected length' ); - - r = it.next(); - t.equal( r.done, false, 'returns expected value' ); - - t.end(); - - function scale( v, i ) { - v *= i + 1; - expected.push( v ); - return v; - } -}); - -tape( 'the function returns an iterator protocol-compliant object which supports invoking a provided function for each iterated value (array-like)', function test( t ) { - var expected; - var values; - var it; - var r; - var i; - - values = { - 'length': 4, - '0': 1, - '1': 2, - '2': 3, - '3': 4 - }; - - it = circarray2iterator( values, scale ); - t.equal( it.next.length, 0, 'has zero arity' ); - - expected = []; - for ( i = 0; i < values.length; i++ ) { - r = it.next(); - t.equal( r.value, expected[ i ], 'returns expected value' ); - t.equal( typeof r.done, 'boolean', 'returns a boolean' ); - } - t.equal( expected.length, values.length, 'has expected length' ); - - r = it.next(); - t.equal( r.done, false, 'returns expected value' ); - - t.end(); - - function scale( v, i ) { - v *= i + 1; - expected.push( v ); - return v; - } -}); - -tape( 'the function returns an iterator protocol-compliant object which supports invoking a provided function for each iterated value (empty)', function test( t ) { - var expected; - var actual; - var values; - var it; - - values = []; - - it = circarray2iterator( values, scale ); - t.equal( it.next.length, 0, 'has zero arity' ); - - expected = [ - { - 'done': true - } - ]; - actual = [ it.next() ]; - t.deepEqual( actual, expected, 'returns expected values' ); - - t.end(); - - function scale( v, i ) { - v *= i + 1; - return v; - } -}); - -tape( 'the function supports limiting the number of iterations', function test( t ) { - var expected; - var actual; - var values; - var opts; - var it; - var r; - var i; - - values = [ 1, 2, 3, 4 ]; - expected = [ - { - 'value': 1, - 'done': false - }, - { - 'value': 2, - 'done': false - }, - { - 'value': 3, - 'done': false - }, - { - 'value': 4, - 'done': false - }, - { - 'value': 1, - 'done': false - }, - { - 'value': 2, - 'done': false - }, - { - 'value': 3, - 'done': false - }, - { - 'done': true - } - ]; - - opts = { - 'iter': 7 - }; - it = circarray2iterator( values, opts ); - t.equal( it.next.length, 0, 'has zero arity' ); - - actual = []; - for ( i = 0; i < opts.iter; i++ ) { - r = it.next(); - actual.push( r ); - t.equal( typeof r.value, 'number', 'returns a number' ); - t.equal( typeof r.done, 'boolean', 'returns a boolean' ); - } - actual.push( it.next() ); - - t.deepEqual( actual, expected, 'returns expected values' ); - t.end(); -}); - -tape( 'the function supports limiting the number of iterations (callback)', function test( t ) { - var expected; - var actual; - var values; - var opts; - var it; - var r; - var i; - - values = [ 1, 2, 3, 4 ]; - expected = [ - { - 'value': 1, - 'done': false - }, - { - 'value': 4, - 'done': false - }, - { - 'value': 9, - 'done': false - }, - { - 'value': 16, - 'done': false - }, - { - 'value': 5, - 'done': false - }, - { - 'value': 12, - 'done': false - }, - { - 'value': 21, - 'done': false - }, - { - 'done': true - } - ]; - - opts = { - 'iter': 7 - }; - it = circarray2iterator( values, opts, scale ); - t.equal( it.next.length, 0, 'has zero arity' ); - - actual = []; - for ( i = 0; i < opts.iter; i++ ) { - r = it.next(); - actual.push( r ); - t.equal( typeof r.value, 'number', 'returns a number' ); - t.equal( typeof r.done, 'boolean', 'returns a boolean' ); - } - actual.push( it.next() ); - - t.deepEqual( actual, expected, 'returns expected values' ); - t.end(); - - function scale( v, i, n ) { - return v * n; - } -}); - -tape( 'the function supports specifying the iteration direction', function test( t ) { - var expected; - var actual; - var values; - var opts; - var it; - var r; - var i; - - values = [ 1, 2, 3, 4 ]; - expected = [ - { - 'value': 4, - 'done': false - }, - { - 'value': 3, - 'done': false - }, - { - 'value': 2, - 'done': false - }, - { - 'value': 1, - 'done': false - }, - { - 'value': 4, - 'done': false - }, - { - 'value': 3, - 'done': false - }, - { - 'value': 2, - 'done': false - }, - { - 'done': true - } - ]; - - opts = { - 'iter': 7, - 'dir': -1 - }; - it = circarray2iterator( values, opts ); - t.equal( it.next.length, 0, 'has zero arity' ); - - actual = []; - for ( i = 0; i < opts.iter; i++ ) { - r = it.next(); - actual.push( r ); - t.equal( typeof r.value, 'number', 'returns a number' ); - t.equal( typeof r.done, 'boolean', 'returns a boolean' ); - } - actual.push( it.next() ); - - t.deepEqual( actual, expected, 'returns expected values' ); - t.end(); -}); - -tape( 'the function supports specifying the iteration direction (callback)', function test( t ) { - var expected; - var actual; - var values; - var opts; - var it; - var r; - var i; - - values = [ 1, 2, 3, 4 ]; - expected = [ - { - 'value': 4, - 'done': false - }, - { - 'value': 6, - 'done': false - }, - { - 'value': 6, - 'done': false - }, - { - 'value': 4, - 'done': false - }, - { - 'value': 20, - 'done': false - }, - { - 'value': 18, - 'done': false - }, - { - 'value': 14, - 'done': false - }, - { - 'done': true - } - ]; - - opts = { - 'iter': 7, - 'dir': -1 - }; - it = circarray2iterator( values, opts, scale ); - t.equal( it.next.length, 0, 'has zero arity' ); - - actual = []; - for ( i = 0; i < opts.iter; i++ ) { - r = it.next(); - actual.push( r ); - t.equal( typeof r.value, 'number', 'returns a number' ); - t.equal( typeof r.done, 'boolean', 'returns a boolean' ); - } - actual.push( it.next() ); - - t.deepEqual( actual, expected, 'returns expected values' ); - t.end(); - - function scale( v, i, n ) { - return v * n; - } -}); - -tape( 'the returned iterator has a `return` method for closing an iterator (no argument)', function test( t ) { - var it; - var r; - - it = circarray2iterator( [ 1, 2, 3, 4 ] ); - - r = it.next(); - t.equal( typeof r.value, 'number', 'returns a number' ); - t.equal( r.done, false, 'returns expected value' ); - - r = it.next(); - t.equal( typeof r.value, 'number', 'returns a number' ); - t.equal( r.done, false, 'returns expected value' ); - - r = it.return(); - t.equal( r.value, void 0, 'returns expected value' ); - t.equal( r.done, true, 'returns expected value' ); - - r = it.next(); - t.equal( r.value, void 0, 'returns expected value' ); - t.equal( r.done, true, 'returns expected value' ); - - t.end(); -}); - -tape( 'the returned iterator has a `return` method for closing an iterator (no argument; callback)', function test( t ) { - var it; - var r; - - it = circarray2iterator( [ 1, 2, 3, 4 ], scale ); - - r = it.next(); - t.equal( typeof r.value, 'number', 'returns a number' ); - t.equal( r.done, false, 'returns expected value' ); - - r = it.next(); - t.equal( typeof r.value, 'number', 'returns a number' ); - t.equal( r.done, false, 'returns expected value' ); - - r = it.return(); - t.equal( r.value, void 0, 'returns expected value' ); - t.equal( r.done, true, 'returns expected value' ); - - r = it.next(); - t.equal( r.value, void 0, 'returns expected value' ); - t.equal( r.done, true, 'returns expected value' ); - - t.end(); - - function scale( v, i ) { - return v * (i+1); - } -}); - -tape( 'the returned iterator has a `return` method for closing an iterator (argument)', function test( t ) { - var it; - var r; - - it = circarray2iterator( [ 1, 2, 3, 4 ] ); - - r = it.next(); - t.equal( typeof r.value, 'number', 'returns a number' ); - t.equal( r.done, false, 'returns expected value' ); - - r = it.next(); - t.equal( typeof r.value, 'number', 'returns a number' ); - t.equal( r.done, false, 'returns expected value' ); - - r = it.return( 'finished' ); - t.equal( r.value, 'finished', 'returns expected value' ); - t.equal( r.done, true, 'returns expected value' ); - - r = it.next(); - t.equal( r.value, void 0, 'returns expected value' ); - t.equal( r.done, true, 'returns expected value' ); - - t.end(); -}); - -tape( 'the returned iterator has a `return` method for closing an iterator (argument; callback)', function test( t ) { - var it; - var r; - - it = circarray2iterator( [ 1, 2, 3, 4 ], scale ); - - r = it.next(); - t.equal( typeof r.value, 'number', 'returns a number' ); - t.equal( r.done, false, 'returns expected value' ); - - r = it.next(); - t.equal( typeof r.value, 'number', 'returns a number' ); - t.equal( r.done, false, 'returns expected value' ); - - r = it.return( 'finished' ); - t.equal( r.value, 'finished', 'returns expected value' ); - t.equal( r.done, true, 'returns expected value' ); - - r = it.next(); - t.equal( r.value, void 0, 'returns expected value' ); - t.equal( r.done, true, 'returns expected value' ); - - t.end(); - - function scale( v, i ) { - return v * (i+1); - } -}); - -tape( 'if an environment supports `Symbol.iterator`, the returned iterator is iterable', function test( t ) { - var circarray2iterator; - var values; - var it1; - var it2; - var i; - - circarray2iterator = proxyquire( './../dist/main.js', { - '@stdlib/symbol-iterator': '__ITERATOR_SYMBOL__' - }); - - values = [ 1, 2, 3, 4 ]; - - it1 = circarray2iterator( values ); - t.equal( typeof it1[ '__ITERATOR_SYMBOL__' ], 'function', 'has method' ); - t.equal( it1[ '__ITERATOR_SYMBOL__' ].length, 0, 'has zero arity' ); - - it2 = it1[ '__ITERATOR_SYMBOL__' ](); - t.equal( typeof it2, 'object', 'returns an object' ); - t.equal( typeof it2.next, 'function', 'has method' ); - t.equal( typeof it2.return, 'function', 'has method' ); - - for ( i = 0; i < values.length; i++ ) { - t.equal( it2.next().value, it1.next().value, 'returns expected value' ); - } - t.end(); -}); - -tape( 'if an environment supports `Symbol.iterator`, the returned iterator is iterable (callback)', function test( t ) { - var circarray2iterator; - var values; - var it1; - var it2; - var i; - - circarray2iterator = proxyquire( './../dist/main.js', { - '@stdlib/symbol-iterator': '__ITERATOR_SYMBOL__' - }); - - values = [ 1, 2, 3, 4 ]; - - it1 = circarray2iterator( values, scale ); - t.equal( typeof it1[ '__ITERATOR_SYMBOL__' ], 'function', 'has method' ); - t.equal( it1[ '__ITERATOR_SYMBOL__' ].length, 0, 'has zero arity' ); - - it2 = it1[ '__ITERATOR_SYMBOL__' ](); - t.equal( typeof it2, 'object', 'returns an object' ); - t.equal( typeof it2.next, 'function', 'has method' ); - t.equal( typeof it2.return, 'function', 'has method' ); - - for ( i = 0; i < values.length; i++ ) { - t.equal( it2.next().value, it1.next().value, 'returns expected value' ); - } - t.end(); - - function scale( v ) { - return v * 10.0; - } -}); - -tape( 'if an environment does not support `Symbol.iterator`, the returned iterator is not "iterable"', function test( t ) { - var circarray2iterator; - var it; - - circarray2iterator = proxyquire( './../dist/main.js', { - '@stdlib/symbol-iterator': false - }); - - it = circarray2iterator( [ 1, 2, 3, 4 ] ); - t.equal( it[ iteratorSymbol ], void 0, 'does not have property' ); - - t.end(); -}); - -tape( 'if an environment does not support `Symbol.iterator`, the returned iterator is not "iterable" (callback)', function test( t ) { - var circarray2iterator; - var it; - - circarray2iterator = proxyquire( './../dist/main.js', { - '@stdlib/symbol-iterator': false - }); - - it = circarray2iterator( [ 1, 2, 3, 4 ], scale ); - t.equal( it[ iteratorSymbol ], void 0, 'does not have property' ); - - t.end(); - - function scale( v, i ) { - return v * (i+1); - } -});