1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-22 07:14:47 -05:00
denoland-deno/tests/node_compat/test/parallel/test-readable-from.js

231 lines
4.6 KiB
JavaScript
Raw Normal View History

// 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 { mustCall } = require('../common');
const { once } = require('events');
const { Readable } = require('stream');
const { strictEqual, throws } = require('assert');
const common = require('../common');
{
throws(() => {
Readable.from(null);
}, /ERR_INVALID_ARG_TYPE/);
}
async function toReadableBasicSupport() {
async function* generate() {
yield 'a';
yield 'b';
yield 'c';
}
const stream = Readable.from(generate());
const expected = ['a', 'b', 'c'];
for await (const chunk of stream) {
strictEqual(chunk, expected.shift());
}
}
async function toReadableSyncIterator() {
function* generate() {
yield 'a';
yield 'b';
yield 'c';
}
const stream = Readable.from(generate());
const expected = ['a', 'b', 'c'];
for await (const chunk of stream) {
strictEqual(chunk, expected.shift());
}
}
async function toReadablePromises() {
const promises = [
Promise.resolve('a'),
Promise.resolve('b'),
Promise.resolve('c'),
];
const stream = Readable.from(promises);
const expected = ['a', 'b', 'c'];
for await (const chunk of stream) {
strictEqual(chunk, expected.shift());
}
}
async function toReadableString() {
const stream = Readable.from('abc');
const expected = ['abc'];
for await (const chunk of stream) {
strictEqual(chunk, expected.shift());
}
}
async function toReadableBuffer() {
const stream = Readable.from(Buffer.from('abc'));
const expected = ['abc'];
for await (const chunk of stream) {
strictEqual(chunk.toString(), expected.shift());
}
}
async function toReadableOnData() {
async function* generate() {
yield 'a';
yield 'b';
yield 'c';
}
const stream = Readable.from(generate());
let iterations = 0;
const expected = ['a', 'b', 'c'];
stream.on('data', (chunk) => {
iterations++;
strictEqual(chunk, expected.shift());
});
await once(stream, 'end');
strictEqual(iterations, 3);
}
async function toReadableOnDataNonObject() {
async function* generate() {
yield 'a';
yield 'b';
yield 'c';
}
const stream = Readable.from(generate(), { objectMode: false });
let iterations = 0;
const expected = ['a', 'b', 'c'];
stream.on('data', (chunk) => {
iterations++;
strictEqual(chunk instanceof Buffer, true);
strictEqual(chunk.toString(), expected.shift());
});
await once(stream, 'end');
strictEqual(iterations, 3);
}
async function destroysTheStreamWhenThrowing() {
async function* generate() { // eslint-disable-line require-yield
throw new Error('kaboom');
}
const stream = Readable.from(generate());
stream.read();
const [err] = await once(stream, 'error');
strictEqual(err.message, 'kaboom');
strictEqual(stream.destroyed, true);
}
async function asTransformStream() {
async function* generate(stream) {
for await (const chunk of stream) {
yield chunk.toUpperCase();
}
}
const source = new Readable({
objectMode: true,
read() {
this.push('a');
this.push('b');
this.push('c');
this.push(null);
}
});
const stream = Readable.from(generate(source));
const expected = ['A', 'B', 'C'];
for await (const chunk of stream) {
strictEqual(chunk, expected.shift());
}
}
async function endWithError() {
async function* generate() {
yield 1;
yield 2;
yield Promise.reject('Boum');
}
const stream = Readable.from(generate());
const expected = [1, 2];
try {
for await (const chunk of stream) {
strictEqual(chunk, expected.shift());
}
throw new Error();
} catch (err) {
strictEqual(expected.length, 0);
strictEqual(err, 'Boum');
}
}
async function destroyingStreamWithErrorThrowsInGenerator() {
const validateError = common.mustCall((e) => {
strictEqual(e, 'Boum');
});
async function* generate() {
try {
yield 1;
yield 2;
yield 3;
throw new Error();
} catch (e) {
validateError(e);
}
}
const stream = Readable.from(generate());
stream.read();
stream.once('error', common.mustCall());
stream.destroy('Boum');
}
Promise.all([
toReadableBasicSupport(),
toReadableSyncIterator(),
toReadablePromises(),
toReadableString(),
toReadableBuffer(),
toReadableOnData(),
toReadableOnDataNonObject(),
destroysTheStreamWhenThrowing(),
asTransformStream(),
endWithError(),
destroyingStreamWithErrorThrowsInGenerator(),
]).then(mustCall());