mirror of
https://github.com/denoland/deno.git
synced 2024-12-30 02:59:11 -05:00
140 lines
4.2 KiB
JavaScript
140 lines
4.2 KiB
JavaScript
|
// deno-fmt-ignore-file
|
||
|
// deno-lint-ignore-file
|
||
|
|
||
|
// Copyright Joyent and Node contributors. All rights reserved. MIT license.
|
||
|
// Taken from Node 20.11.1
|
||
|
// This file is automatically generated by `tests/node_compat/runner/setup.ts`. Do not modify this file manually.
|
||
|
|
||
|
'use strict';
|
||
|
|
||
|
const common = require('../common');
|
||
|
const {
|
||
|
Readable,
|
||
|
} = require('stream');
|
||
|
const assert = require('assert');
|
||
|
|
||
|
function sum(p, c) {
|
||
|
return p + c;
|
||
|
}
|
||
|
|
||
|
{
|
||
|
// Does the same thing as `(await stream.toArray()).reduce(...)`
|
||
|
(async () => {
|
||
|
const tests = [
|
||
|
[[], sum, 0],
|
||
|
[[1], sum, 0],
|
||
|
[[1, 2, 3, 4, 5], sum, 0],
|
||
|
[[...Array(100).keys()], sum, 0],
|
||
|
[['a', 'b', 'c'], sum, ''],
|
||
|
[[1, 2], sum],
|
||
|
[[1, 2, 3], (x, y) => y],
|
||
|
];
|
||
|
for (const [values, fn, initial] of tests) {
|
||
|
const streamReduce = await Readable.from(values)
|
||
|
.reduce(fn, initial);
|
||
|
const arrayReduce = values.reduce(fn, initial);
|
||
|
assert.deepStrictEqual(streamReduce, arrayReduce);
|
||
|
}
|
||
|
// Does the same thing as `(await stream.toArray()).reduce(...)` with an
|
||
|
// asynchronous reducer
|
||
|
for (const [values, fn, initial] of tests) {
|
||
|
const streamReduce = await Readable.from(values)
|
||
|
.map(async (x) => x)
|
||
|
.reduce(fn, initial);
|
||
|
const arrayReduce = values.reduce(fn, initial);
|
||
|
assert.deepStrictEqual(streamReduce, arrayReduce);
|
||
|
}
|
||
|
})().then(common.mustCall());
|
||
|
}
|
||
|
{
|
||
|
// Works with an async reducer, with or without initial value
|
||
|
(async () => {
|
||
|
const six = await Readable.from([1, 2, 3]).reduce(async (p, c) => p + c, 0);
|
||
|
assert.strictEqual(six, 6);
|
||
|
})().then(common.mustCall());
|
||
|
(async () => {
|
||
|
const six = await Readable.from([1, 2, 3]).reduce(async (p, c) => p + c);
|
||
|
assert.strictEqual(six, 6);
|
||
|
})().then(common.mustCall());
|
||
|
}
|
||
|
{
|
||
|
// Works lazily
|
||
|
assert.rejects(Readable.from([1, 2, 3, 4, 5, 6])
|
||
|
.map(common.mustCall((x) => {
|
||
|
return x;
|
||
|
}, 3)) // Two consumed and one buffered by `map` due to default concurrency
|
||
|
.reduce(async (p, c) => {
|
||
|
if (p === 1) {
|
||
|
throw new Error('boom');
|
||
|
}
|
||
|
return c;
|
||
|
}, 0)
|
||
|
, /boom/).then(common.mustCall());
|
||
|
}
|
||
|
|
||
|
{
|
||
|
// Support for AbortSignal
|
||
|
const ac = new AbortController();
|
||
|
assert.rejects(async () => {
|
||
|
await Readable.from([1, 2, 3]).reduce(async (p, c) => {
|
||
|
if (c === 3) {
|
||
|
await new Promise(() => {}); // Explicitly do not pass signal here
|
||
|
}
|
||
|
return Promise.resolve();
|
||
|
}, 0, { signal: ac.signal });
|
||
|
}, {
|
||
|
name: 'AbortError',
|
||
|
}).then(common.mustCall());
|
||
|
ac.abort();
|
||
|
}
|
||
|
|
||
|
|
||
|
{
|
||
|
// Support for AbortSignal - pre aborted
|
||
|
const stream = Readable.from([1, 2, 3]);
|
||
|
assert.rejects(async () => {
|
||
|
await stream.reduce(async (p, c) => {
|
||
|
if (c === 3) {
|
||
|
await new Promise(() => {}); // Explicitly do not pass signal here
|
||
|
}
|
||
|
return Promise.resolve();
|
||
|
}, 0, { signal: AbortSignal.abort() });
|
||
|
}, {
|
||
|
name: 'AbortError',
|
||
|
}).then(common.mustCall(() => {
|
||
|
assert.strictEqual(stream.destroyed, true);
|
||
|
}));
|
||
|
}
|
||
|
|
||
|
{
|
||
|
// Support for AbortSignal - deep
|
||
|
const stream = Readable.from([1, 2, 3]);
|
||
|
assert.rejects(async () => {
|
||
|
await stream.reduce(async (p, c, { signal }) => {
|
||
|
signal.addEventListener('abort', common.mustCall(), { once: true });
|
||
|
if (c === 3) {
|
||
|
await new Promise(() => {}); // Explicitly do not pass signal here
|
||
|
}
|
||
|
return Promise.resolve();
|
||
|
}, 0, { signal: AbortSignal.abort() });
|
||
|
}, {
|
||
|
name: 'AbortError',
|
||
|
}).then(common.mustCall(() => {
|
||
|
assert.strictEqual(stream.destroyed, true);
|
||
|
}));
|
||
|
}
|
||
|
|
||
|
{
|
||
|
// Error cases
|
||
|
assert.rejects(() => Readable.from([]).reduce(1), /TypeError/).then(common.mustCall());
|
||
|
assert.rejects(() => Readable.from([]).reduce('5'), /TypeError/).then(common.mustCall());
|
||
|
assert.rejects(() => Readable.from([]).reduce((x, y) => x + y, 0, 1), /ERR_INVALID_ARG_TYPE/).then(common.mustCall());
|
||
|
assert.rejects(() => Readable.from([]).reduce((x, y) => x + y, 0, { signal: true }), /ERR_INVALID_ARG_TYPE/).then(common.mustCall());
|
||
|
}
|
||
|
|
||
|
{
|
||
|
// Test result is a Promise
|
||
|
const result = Readable.from([1, 2, 3, 4, 5]).reduce(sum, 0);
|
||
|
assert.ok(result instanceof Promise);
|
||
|
}
|