Skip to content

Commit

Permalink
Auto-generated commit
Browse files Browse the repository at this point in the history
  • Loading branch information
stdlib-bot committed Oct 5, 2023
1 parent e264d78 commit 164088c
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 286 deletions.
1 change: 0 additions & 1 deletion .github/.keepalive

This file was deleted.

10 changes: 5 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,19 +37,19 @@
"url": "https://github.com/stdlib-js/stdlib/issues"
},
"dependencies": {
"@stdlib/assert-is-function": "^0.1.0",
"@stdlib/assert-is-iterator-like": "^0.1.0",
"@stdlib/assert-is-function": "^0.1.1",
"@stdlib/assert-is-iterator-like": "^0.1.1",
"@stdlib/assert-is-positive-integer": "^0.1.0",
"@stdlib/stats-incr-mprod": "^0.1.0",
"@stdlib/string-format": "^0.1.0",
"@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-to-iterator": "^0.1.0",
"@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-iter-randu": "^0.1.0",
"@stdlib/random-iter-uniform": "^0.1.0",
"proxyquire": "^2.0.0",
Expand Down
284 changes: 4 additions & 280 deletions test/dist/test.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/**
* @license Apache-2.0
*
* Copyright (c) 2019 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.
Expand All @@ -21,289 +21,13 @@
// MODULES //

var tape = require( 'tape' );
var proxyquire = require( 'proxyquire' );
var randu = require( '@stdlib/random-iter-randu' );
var array2iterator = require( '@stdlib/array-to-iterator' );
var iteratorSymbol = require( '@stdlib/symbol-iterator' );
var isnan = require( '@stdlib/math-base-assert-is-nan' );
var itermprod = 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 itermprod, 'function', 'main export is a function' );
t.end();
});

tape( 'the function throws an error if provided an iterator argument which is not an iterator protocol-compliant 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() {
itermprod( value, 3 );
};
}
});

tape( 'the function throws an error if provided a second argument which is not a positive integer', function test( t ) {
var values;
var i;

values = [
'5',
-5,
0,
3.14,
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() {
itermprod( randu(), value );
};
}
});

tape( 'the function returns an iterator protocol-compliant object which iteratively computes a moving product', function test( t ) {
var expected;
var actual;
var values;
var it;
var v;
var i;

values = [ 2.0, 3.0, 2.0, 4.0, 3.0, 4.0 ];
expected = [ 2.0, 6.0, 12.0, 24.0, 24.0, 48.0 ];

it = itermprod( array2iterator( values ), 3 );
t.equal( it.next.length, 0, 'has zero arity' );

actual = [];
for ( i = 0; i < values.length; i++ ) {
v = it.next();
t.equal( typeof v.value, 'number', 'returns a number' );
t.equal( typeof v.done, 'boolean', 'returns a boolean' );
actual.push( v.value );
}
t.deepEqual( actual, expected, 'returns expected results' );

v = it.next();
t.equal( v.value, void 0, 'returns expected value' );
t.equal( v.done, true, 'returns expected value' );

t.end();
});

tape( 'if an iterated value is a non-numeric value, the computed product is `NaN` for at least `W` invocations', function test( t ) {
var expected;
var values;
var it;
var v;
var i;

values = [
NaN, // NaN
3.0, // NaN, 3.0
3.0, // NaN, 3.0, 3.0
'beep', // 3.0, 3.0, 'beep'
3.0, // 3.0, 'beep', 3.0
3.0, // 'beep', 3.0, 3.0
3.0, // 3.0, 3.0, 3.0
NaN, // 3.0, 3.0, NaN
3.0, // 3.0, NaN, 3.0
3.0, // NaN, 3.0, 3.0
3.0, // 3.0, 3.0, 3.0
NaN, // 3.0, 3.0, NaN
3.0, // 3.0, NaN, 3.0
3.0, // NaN, 3.0, 3.0
NaN, // 3.0, 3.0, NaN
NaN, // 3.0, NaN, NaN
NaN, // NaN, NaN, NaN
NaN, // NaN, NaN, NaN
3.0 // NaN, NaN, 3.0
];

expected = [
NaN,
NaN,
NaN,
NaN,
NaN,
NaN,
27.0,
NaN,
NaN,
NaN,
27.0,
NaN,
NaN,
NaN,
NaN,
NaN,
NaN,
NaN,
NaN
];

it = itermprod( array2iterator( values ), 3 );

for ( i = 0; i < values.length; i++ ) {
v = it.next();
if ( isnan( expected[ i ] ) ) {
t.equal( isnan( v.value ), true, 'returns expected value for window '+i );
} else {
t.equal( v.value, expected[ i ], 'returns expected value for window '+i );
}
}
t.end();
});

tape( 'the returned iterator has a `return` method for closing an iterator (no argument)', function test( t ) {
var it;
var r;

it = itermprod( randu(), 3 );

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 (argument)', function test( t ) {
var it;
var r;

it = itermprod( randu(), 3 );

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( 'if an environment supports `Symbol.iterator` and the provided iterator is iterable, the returned iterator is iterable', function test( t ) {
var itermprod;
var opts;
var rand;
var it1;
var it2;
var i;

itermprod = proxyquire( './../dist/main.js', {
'@stdlib/symbol-iterator': '__ITERATOR_SYMBOL__'
});

opts = {
'seed': 12345
};
rand = randu( opts );
rand[ '__ITERATOR_SYMBOL__' ] = factory;

it1 = itermprod( rand, 3 );
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 < 100; i++ ) {
t.equal( it2.next().value, it1.next().value, 'returns expected value' );
}
t.end();

function factory() {
return randu( opts );
}
});

tape( 'if an environment does not support `Symbol.iterator`, the returned iterator is not "iterable"', function test( t ) {
var itermprod;
var it;

itermprod = proxyquire( './../dist/main.js', {
'@stdlib/symbol-iterator': false
});

it = itermprod( randu(), 3 );
t.equal( it[ iteratorSymbol ], void 0, 'does not have property' );

t.end();
});

tape( 'if a provided iterator is not iterable, the returned iterator is not iterable', function test( t ) {
var itermprod;
var rand;
var it;

itermprod = proxyquire( './../dist/main.js', {
'@stdlib/symbol-iterator': '__ITERATOR_SYMBOL__'
});

rand = randu();
rand[ '__ITERATOR_SYMBOL__' ] = null;

it = itermprod( rand, 3 );
t.equal( it[ iteratorSymbol ], void 0, 'does not have property' );

t.strictEqual( main !== void 0, true, 'main export is defined' );
t.end();
});

0 comments on commit 164088c

Please sign in to comment.