From 4d98acd92b1bfc28dec0307fa5e123328b4435ab Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Sun, 1 Oct 2023 05:55:02 +0000 Subject: [PATCH] Auto-generated commit --- .github/.keepalive | 1 + .github/workflows/benchmark.yml | 6 +- .github/workflows/cancel.yml | 3 +- .github/workflows/close_pull_requests.yml | 36 +- .github/workflows/examples.yml | 10 +- .github/workflows/npm_downloads.yml | 12 +- .github/workflows/productionize.yml | 42 +- .github/workflows/publish.yml | 15 +- .github/workflows/test.yml | 9 +- .github/workflows/test_bundles.yml | 27 +- .github/workflows/test_coverage.yml | 15 +- .github/workflows/test_install.yml | 9 +- README.md | 4 +- package.json | 4 +- test/dist/test.js | 784 ++++++++++++++++++++++ 15 files changed, 910 insertions(+), 67 deletions(-) create mode 100644 .github/.keepalive create mode 100644 test/dist/test.js diff --git a/.github/.keepalive b/.github/.keepalive new file mode 100644 index 0000000..1d01d55 --- /dev/null +++ b/.github/.keepalive @@ -0,0 +1 @@ +2023-10-01T05:54:58.419Z diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index 06a9a75..ab56cca 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -41,11 +41,13 @@ jobs: # Checkout the repository: - name: 'Checkout repository' - uses: actions/checkout@v3 + # Pin action to full length commit SHA corresponding to v4.1.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # Install Node.js: - name: 'Install Node.js' - uses: actions/setup-node@v3 + # Pin action to full length commit SHA corresponding to v3.8.1 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: node-version: 16 timeout-minutes: 5 diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml index a00dbe5..3acd3a9 100644 --- a/.github/workflows/cancel.yml +++ b/.github/workflows/cancel.yml @@ -44,7 +44,8 @@ jobs: # Cancel existing workflow runs: - name: 'Cancel existing workflow runs' - uses: styfle/cancel-workflow-action@0.11.0 + # Pin action to full length commit SHA corresponding to v0.11.0 + uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 with: workflow_id: >- benchmark.yml, diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml index 8a2d9bb..ba9e4ad 100644 --- a/.github/workflows/close_pull_requests.yml +++ b/.github/workflows/close_pull_requests.yml @@ -26,19 +26,29 @@ on: # Workflow jobs: jobs: + + # Define job to close all pull requests: run: + + # Define the type of virtual host machine on which to run the job: runs-on: ubuntu-latest + + # Define the sequence of job steps... steps: - - uses: superbrothers/close-pull-request@v3 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/random/iter/gumbel) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file + + # Close pull request + - name: 'Close pull request' + # Pin action to full length commit SHA corresponding to v3.1.2 + uses: superbrothers/close-pull-request@9c18513d320d7b2c7185fb93396d0c664d5d8448 + with: + comment: | + Thank you for submitting a pull request. :raised_hands: + + We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). + + We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/random/iter/gumbel) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. + + Thank you again, and we look forward to receiving your contribution! :smiley: + + Best, + The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml index 7902a7d..c1c45e7 100644 --- a/.github/workflows/examples.yml +++ b/.github/workflows/examples.yml @@ -39,13 +39,15 @@ jobs: # Define the sequence of job steps... steps: - # Checkout the repository: - - name: 'Checkout the repository' - uses: actions/checkout@v3 + # Checkout repository: + - name: 'Checkout repository' + # Pin action to full length commit SHA corresponding to v4.1.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # Install Node.js: - name: 'Install Node.js' - uses: actions/setup-node@v3 + # Pin action to full length commit SHA corresponding to v3.8.1 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: node-version: 16 timeout-minutes: 5 diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml index 7ae60fe..7bed6e7 100644 --- a/.github/workflows/npm_downloads.yml +++ b/.github/workflows/npm_downloads.yml @@ -45,12 +45,14 @@ jobs: steps: # Checkout the repository: - name: 'Checkout repository' - uses: actions/checkout@v3 + # Pin action to full length commit SHA corresponding to v4.1.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 timeout-minutes: 10 # Install Node.js: - name: 'Install Node.js' - uses: actions/setup-node@v3 + # Pin action to full length commit SHA corresponding to v3.8.1 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: node-version: 16 timeout-minutes: 5 @@ -84,7 +86,8 @@ jobs: # Upload the download data: - name: 'Upload data' - uses: actions/upload-artifact@v3 + # Pin action to full length commit SHA corresponding to v3.1.3 + uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 with: # Define a name for the uploaded artifact (ensuring a unique name for each job): name: npm_downloads @@ -99,7 +102,8 @@ jobs: # Send data to events server: - name: 'Post data' - uses: distributhor/workflow-webhook@v3 + # Pin action to full length commit SHA corresponding to v3.0.3: + uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 env: webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml index 91f2b93..265afda 100644 --- a/.github/workflows/productionize.yml +++ b/.github/workflows/productionize.yml @@ -61,13 +61,15 @@ jobs: steps: # Checkout main branch of repository: - name: 'Checkout main branch' - uses: actions/checkout@v3 + # Pin action to full length commit SHA corresponding to v4.1.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 with: ref: main # Install Node.js: - name: 'Install Node.js' - uses: actions/setup-node@v3 + # Pin action to full length commit SHA corresponding to v3.8.1 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: node-version: 16 timeout-minutes: 5 @@ -132,7 +134,8 @@ jobs: # Checkout the repository: - name: 'Checkout repository' if: ${{ github.event.inputs.require-passing-tests == 'true' }} - uses: actions/checkout@v3 + # Pin action to full length commit SHA corresponding to v4.1.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 with: # Use the `production` branch: ref: production @@ -140,7 +143,8 @@ jobs: # Install Node.js: - name: 'Install Node.js' if: ${{ github.event.inputs.require-passing-tests == 'true' }} - uses: actions/setup-node@v3 + # Pin action to full length commit SHA corresponding to v3.8.1 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: node-version: 16 timeout-minutes: 5 @@ -184,7 +188,8 @@ jobs: steps: # Checkout the repository: - name: 'Checkout repository' - uses: actions/checkout@v3 + # Pin action to full length commit SHA corresponding to v4.1.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # Configure git: - name: 'Configure git' @@ -251,7 +256,8 @@ jobs: # Install Node.js: - name: 'Install Node.js' - uses: actions/setup-node@v3 + # Pin action to full length commit SHA corresponding to v3.8.1 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: node-version: 16 timeout-minutes: 5 @@ -334,7 +340,8 @@ jobs: # Send status to Slack channel if job fails: - name: 'Send status to Slack channel in case of failure' - uses: act10ns/slack@v2 + # Pin action to full length commit SHA corresponding to v2.0.0 + uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f with: status: ${{ job.status }} steps: ${{ toJson(steps) }} @@ -357,7 +364,8 @@ jobs: steps: # Checkout the repository: - name: 'Checkout repository' - uses: actions/checkout@v3 + # Pin action to full length commit SHA corresponding to v4.1.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # Configure git: - name: 'Configure git' @@ -416,7 +424,8 @@ jobs: # Install Node.js - name: 'Install Node.js' - uses: actions/setup-node@v3 + # Pin action to full length commit SHA corresponding to v3.8.1 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: node-version: 16 timeout-minutes: 5 @@ -505,7 +514,8 @@ jobs: # Send status to Slack channel if job fails: - name: 'Send status to Slack channel in case of failure' - uses: act10ns/slack@v2 + # Pin action to full length commit SHA corresponding to v2.0.0 + uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f with: status: ${{ job.status }} steps: ${{ toJson(steps) }} @@ -528,7 +538,8 @@ jobs: steps: # Checkout the repository: - name: 'Checkout repository' - uses: actions/checkout@v3 + # Pin action to full length commit SHA corresponding to v4.1.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # Configure git: - name: 'Configure git' @@ -595,7 +606,8 @@ jobs: # Install Node.js: - name: 'Install Node.js' - uses: actions/setup-node@v3 + # Pin action to full length commit SHA corresponding to v3.8.1 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: node-version: 16 timeout-minutes: 5 @@ -682,7 +694,8 @@ jobs: # Send status to Slack channel if job fails: - name: 'Send status to Slack channel in case of failure' - uses: act10ns/slack@v2 + # Pin action to full length commit SHA corresponding to v2.0.0 + uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f with: status: ${{ job.status }} steps: ${{ toJson(steps) }} @@ -706,7 +719,8 @@ jobs: # Checkout the repository: - name: 'Checkout repository' - uses: actions/checkout@v3 + # Pin action to full length commit SHA corresponding to v4.1.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 with: fetch-depth: 2 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 474004b..b17435b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -61,11 +61,13 @@ jobs: # Checkout the repository: - name: 'Checkout repository' - uses: actions/checkout@v3 + # Pin action to full length commit SHA corresponding to v4.1.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # Install Node.js: - name: 'Install Node.js' - uses: actions/setup-node@v3 + # Pin action to full length commit SHA corresponding to v3.8.1 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: node-version: 16 timeout-minutes: 5 @@ -197,7 +199,8 @@ jobs: # Publish package to npm: - name: 'Publish package to npm' - uses: JS-DevTools/npm-publish@v2 + # Pin action to full length commit SHA corresponding to v2.2.2 + uses: JS-DevTools/npm-publish@fe72237be0920f7a0cafd6a966c9b929c9466e9b with: token: ${{ secrets.NPM_TOKEN }} access: public @@ -209,7 +212,8 @@ jobs: # Send status to Slack channel if job fails: - name: 'Send status to Slack channel in case of failure' - uses: act10ns/slack@v2 + # Pin action to full length commit SHA corresponding to v2.0.0 + uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f with: status: ${{ job.status }} steps: ${{ toJson(steps) }} @@ -230,7 +234,8 @@ jobs: # Cancel any running or queued workflow runs: - name: 'Cancel running or queued workflow runs' - uses: styfle/cancel-workflow-action@0.11.0 + # Pin action to full length commit SHA corresponding to v0.11.0 + uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 with: workflow_id: >- benchmark.yml, diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9e0ff6c..7c652cc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -58,11 +58,13 @@ jobs: # Checkout the repository: - name: 'Checkout repository' - uses: actions/checkout@v3 + # Pin action to full length commit SHA corresponding to v4.1.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # Install Node.js: - name: 'Install Node.js' - uses: actions/setup-node@v3 + # Pin action to full length commit SHA corresponding to v3.8.1 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: node-version: 16 timeout-minutes: 5 @@ -89,7 +91,8 @@ jobs: # Send status to Slack channel if job fails: - name: 'Send status to Slack channel in case of failure' - uses: act10ns/slack@v2 + # Pin action to full length commit SHA corresponding to v2.0.0 + uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f with: status: ${{ job.status }} steps: ${{ toJson(steps) }} diff --git a/.github/workflows/test_bundles.yml b/.github/workflows/test_bundles.yml index 172cb2d..0d26143 100644 --- a/.github/workflows/test_bundles.yml +++ b/.github/workflows/test_bundles.yml @@ -49,13 +49,15 @@ jobs: steps: # Checkout UMD branch of the repository: - name: 'Checkout branch with UMD build' - uses: actions/checkout@v3 + # Pin action to full length commit SHA corresponding to v4.1.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 with: ref: umd # Install Node.js: - name: 'Install Node.js' - uses: actions/setup-node@v3 + # Pin action to full length commit SHA corresponding to v3.8.1 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: node-version: 17 @@ -88,7 +90,8 @@ jobs: # Send notification to Slack channel if job fails: - name: 'Send status to Slack channel in case of failure' - uses: act10ns/slack@v2 + # Pin action to full length commit SHA corresponding to v2.0.0 + uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f with: status: ${{ job.status }} steps: ${{ toJson(steps) }} @@ -113,13 +116,15 @@ jobs: # Checkout ES modules branch of the repository: - name: 'Checkout branch with ESM build' - uses: actions/checkout@v3 + # Pin action to full length commit SHA corresponding to v4.1.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 with: ref: esm # Install Node.js: - name: 'Install Node.js' - uses: actions/setup-node@v3 + # Pin action to full length commit SHA corresponding to v3.8.1 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: node-version: 17 @@ -130,7 +135,8 @@ jobs: # Send notification to Slack channel if job fails: - name: 'Send status to Slack channel in case of failure' - uses: act10ns/slack@v2 + # Pin action to full length commit SHA corresponding to v2.0.0 + uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f with: status: ${{ job.status }} steps: ${{ toJson(steps) }} @@ -155,13 +161,15 @@ jobs: # Checkout Deno branch of the repository: - name: 'Checkout branch with Deno build' - uses: actions/checkout@v3 + # Pin action to full length commit SHA corresponding to v4.1.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 with: ref: deno # Install Deno: - name: 'Install Deno' - uses: denoland/setup-deno@v1 + # Pin action to full length commit SHA corresponding to v1.1.2 + uses: denoland/setup-deno@61fe2df320078202e33d7d5ad347e7dcfa0e8f31 with: deno-version: vx.x.x @@ -172,7 +180,8 @@ jobs: # Send notification to Slack channel if job fails: - name: 'Send status to Slack channel in case of failure' - uses: act10ns/slack@v2 + # Pin action to full length commit SHA corresponding to v2.0.0 + uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f with: status: ${{ job.status }} steps: ${{ toJson(steps) }} diff --git a/.github/workflows/test_coverage.yml b/.github/workflows/test_coverage.yml index a73c515..5b2b1ea 100644 --- a/.github/workflows/test_coverage.yml +++ b/.github/workflows/test_coverage.yml @@ -46,11 +46,13 @@ jobs: # Checkout the repository: - name: 'Checkout repository' - uses: actions/checkout@v3 + # Pin action to full length commit SHA corresponding to v4.1.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # Install Node.js: - name: 'Install Node.js' - uses: actions/setup-node@v3 + # Pin action to full length commit SHA corresponding to v3.8.1 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: node-version: 16 timeout-minutes: 5 @@ -77,7 +79,8 @@ jobs: # Upload coverage report to Codecov: - name: 'Upload coverage to Codecov' id: upload - uses: codecov/codecov-action@v3 + # Pin action to full length commit SHA corresponding to v3.1.4 + uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d with: directory: reports/coverage flags: unittests @@ -106,7 +109,8 @@ jobs: # Send Slack notification if job fails: - name: 'Send status to Slack channel in case of failure' - uses: act10ns/slack@v2 + # Pin action to full length commit SHA corresponding to v2.0.0 + uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f with: status: ${{ job.status }} steps: ${{ toJson(steps) }} @@ -115,7 +119,8 @@ jobs: # Send data to events server: - name: 'Post data' - uses: distributhor/workflow-webhook@v3 + # Pin action to full length commit SHA corresponding to v3.0.3: + uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 env: webhook_url: ${{ secrets.STDLIB_COVERAGE_URL }} webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} diff --git a/.github/workflows/test_install.yml b/.github/workflows/test_install.yml index 022f003..f9736ae 100644 --- a/.github/workflows/test_install.yml +++ b/.github/workflows/test_install.yml @@ -58,11 +58,13 @@ jobs: # Checkout the repository: - name: 'Checkout repository' - uses: actions/checkout@v3 + # Pin action to full length commit SHA corresponding to v4.1.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # Install Node.js: - name: 'Install Node.js' - uses: actions/setup-node@v3 + # Pin action to full length commit SHA corresponding to v3.8.1 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: node-version: 16 timeout-minutes: 5 @@ -75,7 +77,8 @@ jobs: # Send Slack notification if job fails: - name: 'Send notification to Slack in case of failure' - uses: act10ns/slack@v2 + # Pin action to full length commit SHA corresponding to v2.0.0 + uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f with: status: ${{ job.status }} steps: ${{ toJson(steps) }} diff --git a/README.md b/README.md index 0e7927e..c0c96f5 100644 --- a/README.md +++ b/README.md @@ -287,8 +287,8 @@ Copyright © 2016-2023. The Stdlib [Authors][stdlib-authors]. [npm-image]: http://img.shields.io/npm/v/@stdlib/random-iter-gumbel.svg [npm-url]: https://npmjs.org/package/@stdlib/random-iter-gumbel -[test-image]: https://github.com/stdlib-js/random-iter-gumbel/actions/workflows/test.yml/badge.svg?branch=v0.1.0 -[test-url]: https://github.com/stdlib-js/random-iter-gumbel/actions/workflows/test.yml?query=branch:v0.1.0 +[test-image]: https://github.com/stdlib-js/random-iter-gumbel/actions/workflows/test.yml/badge.svg?branch=main +[test-url]: https://github.com/stdlib-js/random-iter-gumbel/actions/workflows/test.yml?query=branch:main [coverage-image]: https://img.shields.io/codecov/c/github/stdlib-js/random-iter-gumbel/main.svg [coverage-url]: https://codecov.io/github/stdlib-js/random-iter-gumbel?branch=main diff --git a/package.json b/package.json index e07747f..be8363d 100644 --- a/package.json +++ b/package.json @@ -61,8 +61,8 @@ "@stdlib/bench": "^0.1.0", "@stdlib/constants-float64-eps": "^0.1.0", "@stdlib/constants-uint32-max": "^0.1.0", - "@stdlib/random-base-minstd": "^0.0.6", - "@stdlib/random-base-randu": "^0.0.8", + "@stdlib/random-base-minstd": "^0.1.0", + "@stdlib/random-base-randu": "^0.1.0", "@stdlib/time-now": "^0.1.0", "proxyquire": "^2.0.0", "tape": "git+https://github.com/kgryte/tape.git#fix/globby", diff --git a/test/dist/test.js b/test/dist/test.js new file mode 100644 index 0000000..3a7307d --- /dev/null +++ b/test/dist/test.js @@ -0,0 +1,784 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2018 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. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +'use strict'; + +// MODULES // + +var tape = require( 'tape' ); +var proxyquire = require( 'proxyquire' ); +var now = require( '@stdlib/time-now' ); +var gumbel = require( '@stdlib/random-base-gumbel' ).factory; +var iteratorSymbol = require( '@stdlib/symbol-iterator' ); +var isUint32Array = require( '@stdlib/assert-is-uint32array' ); +var UINT32_MAX = require( '@stdlib/constants-uint32-max' ); +var Uint32Array = require( '@stdlib/array-uint32' ); +var minstd = require( '@stdlib/random-base-minstd' ); +var iterator = require( './../../dist' ); + + +// TESTS // + +tape( 'main export is a function', function test( t ) { + t.ok( true, __filename ); + t.strictEqual( typeof iterator, 'function', 'main export is a function' ); + t.end(); +}); + +tape( 'the function throws an error if mean `mu` is not a number primitive', function test( t ) { + var values; + var i; + + values = [ + '5', + null, + true, + false, + void 0, + NaN, + [], + {}, + 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() { + iterator( value, 2.0 ); + }; + } +}); + +tape( 'the function throws an error if scale parameter `beta` is not a positive number', function test( t ) { + var values; + var i; + + values = [ + '5', + null, + true, + false, + void 0, + NaN, + [], + {}, + function noop() {}, + -0.5, + 0.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() { + iterator( 2.0, value ); + }; + } +}); + +tape( 'the function throws an error if provided an options argument which is not an object', function test( t ) { + var values; + var i; + + values = [ + 'abc', + 5, + null, + true, + false, + void 0, + NaN, + [], + 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() { + iterator( 2.0, 5.0, value ); + }; + } +}); + +tape( 'the function throws an error if provided an invalid `iter` option', function test( t ) { + var values; + var i; + + values = [ + 'abc', + -5, + 3.14, + null, + true, + false, + void 0, + NaN, + [], + {}, + 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() { + iterator( 2.0, 5.0, { + 'iter': value + }); + }; + } +}); + +tape( 'if provided a `prng` option which is not a function, the function throws an error', function test( t ) { + var values; + var i; + + values = [ + '5', + 3.14, + NaN, + true, + false, + null, + void 0, + [], + {} + ]; + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[i] ), TypeError, 'throws a type error when provided '+values[i] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + iterator( 2.0, 5.0, { + 'prng': value + }); + }; + } +}); + +tape( 'if provided a `copy` option which is not a boolean, the function throws an error', function test( t ) { + var values; + var i; + + values = [ + '5', + 5, + NaN, + null, + void 0, + {}, + [], + function noop() {} + ]; + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[i] ), TypeError, 'throws a type error when provided '+values[i] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + iterator( 2.0, 5.0, { + 'copy': value + }); + }; + } +}); + +tape( 'if provided a `seed` which is not a positive integer or a non-empty array-like object, the function throws an error', function test( t ) { + var values; + var i; + + values = [ + '5', + 3.14, + 0.0, + -5.0, + NaN, + true, + false, + null, + void 0, + {}, + [], + function noop() {} + ]; + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[i] ), TypeError, 'throws a type error when provided '+values[i] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + iterator( 2.0, 5.0, { + 'seed': value + }); + }; + } +}); + +tape( 'the function throws a range error if provided a `seed` which is an integer greater than the maximum unsigned 32-bit integer', function test( t ) { + var values; + var i; + + values = [ + UINT32_MAX + 1, + UINT32_MAX + 2, + UINT32_MAX + 3 + ]; + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[i] ), RangeError, 'throws a range error when provided '+values[i] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + iterator( 2.0, 5.0, { + 'seed': value + }); + }; + } +}); + +tape( 'if provided a `state` option which is not a Uint32Array, the function throws an error', 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 a type error when provided '+values[i] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + iterator( 2.0, 5.0, { + 'state': value + }); + }; + } +}); + +tape( 'if provided an invalid `state` option, the function throws an error', function test( t ) { + var values; + var i; + + values = [ + new Uint32Array( 0 ), + new Uint32Array( 10 ), + new Uint32Array( 100 ) + ]; + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[i] ), RangeError, 'throws an error when provided '+values[i] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + iterator( 2.0, 5.0, { + 'state': value + }); + }; + } +}); + +tape( 'the function returns an iterator protocol-compliant object (no seed)', function test( t ) { + var it; + var r; + var i; + + it = iterator( -10.0, 10.0 ); + t.equal( it.next.length, 0, 'has zero arity' ); + + for ( i = 0; i < 100; i++ ) { + r = it.next(); + t.equal( typeof r.value, 'number', 'returns a number' ); + t.equal( typeof r.done, 'boolean', 'returns a boolean' ); + } + t.end(); +}); + +tape( 'the function returns an iterator protocol-compliant object (seed)', function test( t ) { + var seed; + var it1; + var it2; + var r1; + var r2; + var i; + + seed = now(); + + it1 = iterator( 0.0, 4.0, { + 'seed': seed + }); + it2 = iterator( 0.0, 4.0, { + 'seed': seed + }); + + t.notEqual( it1, it2, 'separate iterators' ); + + for ( i = 0; i < 100; i++ ) { + r1 = it1.next(); + r2 = it2.next(); + t.equal( r1.value, r2.value, 'both return same number' ); + } + t.end(); +}); + +tape( 'attached to the returned iterator is the underlying PRNG', function test( t ) { + var it = iterator( 2.0, 5.0 ); + t.equal( typeof it.PRNG, 'function', 'has property' ); + + it = iterator( 2.0, 5.0, { + 'prng': minstd.normalized + }); + t.equal( it.PRNG, minstd.normalized, 'has property' ); + t.end(); +}); + +tape( 'attached to the returned iterator is the generator seed', function test( t ) { + var it = iterator( 2.0, 5.0, { + 'seed': 12345 + }); + t.equal( isUint32Array( it.seed ), true, 'has property' ); + t.equal( it.seed[ 0 ], 12345, 'equal to provided seed' ); + + it = iterator( 2.0, 5.0, { + 'seed': 12345, + 'prng': minstd.normalized + }); + t.equal( it.seed, null, 'equal to `null`' ); + t.end(); +}); + +tape( 'attached to the returned iterator is the generator seed (array seed)', function test( t ) { + var actual; + var seed; + var it; + var i; + + seed = [ 1234, 5678 ]; + it = iterator( 2.0, 5.0, { + 'seed': seed + }); + + actual = it.seed; + t.equal( isUint32Array( actual ), true, 'has property' ); + for ( i = 0; i < seed.length; i++ ) { + t.equal( actual[ i ], seed[ i ], 'returns expected value for word '+i ); + } + t.end(); +}); + +tape( 'attached to the returned iterator is the generator seed length', function test( t ) { + var it = iterator( 2.0, 5.0 ); + t.equal( typeof it.seedLength, 'number', 'has property' ); + + it = iterator( 2.0, 5.0, { + 'prng': minstd.normalized + }); + t.equal( it.seedLength, null, 'equal to `null`' ); + t.end(); +}); + +tape( 'attached to the returned iterator is the generator state', function test( t ) { + var it = iterator( 2.0, 5.0 ); + t.equal( isUint32Array( it.state ), true, 'has property' ); + + it = iterator( 2.0, 5.0, { + 'prng': minstd.normalized + }); + t.equal( it.state, null, 'equal to `null`' ); + t.end(); +}); + +tape( 'attached to the returned iterator is the generator state length', function test( t ) { + var it = iterator( 2.0, 5.0 ); + t.equal( typeof it.stateLength, 'number', 'has property' ); + + it = iterator( 2.0, 5.0, { + 'prng': minstd.normalized + }); + t.equal( it.stateLength, null, 'equal to `null`' ); + t.end(); +}); + +tape( 'attached to the returned iterator is the generator state size', function test( t ) { + var it = iterator( 2.0, 5.0 ); + t.equal( typeof it.byteLength, 'number', 'has property' ); + + it = iterator( 2.0, 5.0, { + 'prng': minstd.normalized + }); + t.equal( it.byteLength, null, 'equal to `null`' ); + t.end(); +}); + +tape( 'the function returns an iterator for generating pseudorandom numbers from a Gumbel distribution', function test( t ) { + var rand; + var it; + var i; + + // Note: we assume that the underlying generator is the following PRNG... + rand = gumbel( 2.0, 5.0, { + 'seed': 12345 + }); + + it = iterator( 2.0, 5.0, { + 'seed': 12345 + }); + + for ( i = 0; i < 1e3; i++ ) { + t.equal( rand(), it.next().value, 'returns expected value' ); + } + t.end(); +}); + +tape( 'the function supports limiting the number of iterations', function test( t ) { + var niter; + var it; + var r; + var i; + var j; + + niter = 10; + + it = iterator( 2.0, 5.0, { + 'iter': niter + }); + + for ( i = 0; i < 100; i++ ) { + r = it.next(); + j = i + 1; + if ( j <= niter ) { + t.equal( typeof r.value, 'number', 'returns expected `value` value. iteration: '+j ); + t.equal( r.done, false, 'returns expected `done` value. iteration: '+j ); + } else { + t.equal( r.value, void 0, 'returns expected `value` value. iteration: '+j ); + t.equal( r.done, true, 'returns expected `done` value. iteration: '+j ); + } + } + t.end(); +}); + +tape( 'the returned iterator has a `return` method for closing an iterator (no argument)', function test( t ) { + var it; + var r; + + it = iterator( -10.0, 10.0 ); + + 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 = iterator( -10.0, 10.0 ); + + 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`, the returned iterator is iterable', function test( t ) { + var iterator; + var it1; + var it2; + var i; + + iterator = proxyquire( './../dist/main.js', { + '@stdlib/symbol-iterator': '__ITERATOR_SYMBOL__' + }); + + it1 = iterator( 2.0, 5.0 ); + 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' ); + t.deepEqual( it2.seed, it1.seed, 'has expected seed' ); + t.deepEqual( it2.state, it1.state, 'has expected state' ); + + for ( i = 0; i < 100; i++ ) { + t.equal( it2.next().value, it1.next().value, 'returns expected value' ); + } + t.end(); +}); + +tape( 'if an environment does not support `Symbol.iterator`, the returned iterator is not "iterable"', function test( t ) { + var iterator; + var it; + + iterator = proxyquire( './../dist/main.js', { + '@stdlib/symbol-iterator': false + }); + + it = iterator( 2.0, 5.0 ); + t.equal( it[ iteratorSymbol ], void 0, 'does not have property' ); + + t.end(); +}); + +tape( 'the function supports specifying the underlying PRNG', function test( t ) { + var it; + var r; + var i; + + it = iterator( 2.0, 5.0, { + 'prng': minstd.normalized + }); + + for ( i = 0; i < 1e2; i++ ) { + r = it.next().value; + t.equal( typeof r, 'number', 'returns a number' ); + } + t.end(); +}); + +tape( 'the function supports providing a seeded underlying PRNG', function test( t ) { + var randu; + var seed; + var it1; + var it2; + var r1; + var r2; + var i; + + seed = now(); + + randu = minstd.factory({ + 'seed': seed + }); + it1 = iterator( 2.0, 5.0, { + 'prng': randu.normalized + }); + + randu = minstd.factory({ + 'seed': seed + }); + it2 = iterator( 2.0, 5.0, { + 'prng': randu.normalized + }); + + t.notEqual( it1, it2, 'separate iterators' ); + + for ( i = 0; i < 1e2; i++ ) { + r1 = it1.next().value; + r2 = it2.next().value; + t.equal( r1, r2, 'both return same number' ); + } + t.end(); +}); + +tape( 'the function supports specifying the underlying generator state', function test( t ) { + var state; + var arr; + var it; + var i; + + it = iterator( 2.0, 5.0 ); + + // Move to a future state... + for ( i = 0; i < 100; i++ ) { + it.next(); + } + // Capture the current state: + state = it.state; + + // Move to a future state... + arr = []; + for ( i = 0; i < 100; i++ ) { + arr.push( it.next().value ); + } + + // Create another iterator using the captured state: + it = iterator( 2.0, 5.0, { + 'state': state + }); + + // Replay previously generated values... + for ( i = 0; i < 100; i++ ) { + t.equal( it.next().value, arr[ i ], 'returns expected value. i: '+i+'.' ); + } + t.end(); +}); + +tape( 'the function supports specifying a shared underlying generator state', function test( t ) { + var shared; + var state; + var arr; + var it1; + var it2; + var it; + var v1; + var v2; + var i; + var j; + + it = iterator( 2.0, 5.0 ); + + // Move to a future state... + for ( i = 0; i < 100; i++ ) { + it.next(); + } + // Capture the current state: + state = it.state; + + // Move to a future state... + arr = []; + for ( i = 0; i < 100; i++ ) { + arr.push( it.next().value ); + } + + // Create a copy of the state (to prevent mutation) which will be shared by more than one PRNG: + shared = new Uint32Array( state ); + + // Create iterators using the captured state: + it1 = iterator( 2.0, 5.0, { + 'state': shared, + 'copy': false + }); + it2 = iterator( 2.0, 5.0, { + 'state': shared, + 'copy': false + }); + + // Replay previously generated values... + j = 0; + for ( i = 0; i < 25; i++ ) { + v1 = it1.next().value; + v2 = it2.next().value; + t.equal( v1, arr[ j ], 'returns expected value. i: '+j+'.' ); + t.equal( v2, arr[ j+1 ], 'returns expected value. i: '+(j+1)+'.' ); + j += 2; // stride + } + + // Move to a future state... + for ( i = 0; i < 100; i++ ) { + it2.next(); + } + + // Reset the (shared) state: + it1.state = state; + + // Replay previously generated values... + j = 0; + for ( i = 0; i < 25; i++ ) { + v1 = it1.next().value; + v2 = it2.next().value; + t.equal( v1, arr[ j ], 'returns expected value. i: '+j+'.' ); + t.equal( v2, arr[ j+1 ], 'returns expected value. i: '+(j+1)+'.' ); + j += 2; // stride + } + t.end(); +}); + +tape( 'the returned iterator supports setting the underlying generator state', function test( t ) { + var state; + var arr; + var it; + var i; + + it = iterator( 2.0, 5.0 ); + + // Move to a future state... + for ( i = 0; i < 100; i++ ) { + it.next(); + } + // Capture the current state: + state = it.state; + + // Move to a future state... + arr = []; + for ( i = 0; i < 100; i++ ) { + arr.push( it.next().value ); + } + // Set the state: + it.state = state; + + // Replay previously generated values... + for ( i = 0; i < 100; i++ ) { + t.equal( it.next().value, arr[ i ], 'returns expected value. i: '+i+'.' ); + } + t.end(); +});