node/test/parallel/test-stream-iter-namespace.js
James M Snell 2fa9c1bc58 test: add tests for experimental stream/iter implementation
Signed-off-by: James M Snell <jasnell@gmail.com>
Assisted-By: Claude/Opus 4.6
PR-URL: https://github.com/nodejs/node/pull/62066
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
2026-03-27 19:55:17 -07:00

210 lines
8.3 KiB
JavaScript

// Flags: --experimental-stream-iter
'use strict';
const common = require('../common');
const assert = require('assert');
const streamNew = require('stream/iter');
// =============================================================================
// Stream namespace object
// =============================================================================
async function testStreamNamespaceExists() {
assert.ok(streamNew.Stream);
assert.strictEqual(typeof streamNew.Stream, 'object');
}
async function testStreamNamespaceFrozen() {
assert.ok(Object.isFrozen(streamNew.Stream));
}
async function testStreamNamespaceFactories() {
const { Stream } = streamNew;
assert.strictEqual(typeof Stream.push, 'function');
assert.strictEqual(typeof Stream.duplex, 'function');
assert.strictEqual(typeof Stream.from, 'function');
assert.strictEqual(typeof Stream.fromSync, 'function');
}
async function testStreamNamespacePipelines() {
const { Stream } = streamNew;
assert.strictEqual(typeof Stream.pull, 'function');
assert.strictEqual(typeof Stream.pullSync, 'function');
assert.strictEqual(typeof Stream.pipeTo, 'function');
assert.strictEqual(typeof Stream.pipeToSync, 'function');
}
async function testStreamNamespaceAsyncConsumers() {
const { Stream } = streamNew;
assert.strictEqual(typeof Stream.bytes, 'function');
assert.strictEqual(typeof Stream.text, 'function');
assert.strictEqual(typeof Stream.arrayBuffer, 'function');
assert.strictEqual(typeof Stream.array, 'function');
}
async function testStreamNamespaceSyncConsumers() {
const { Stream } = streamNew;
assert.strictEqual(typeof Stream.bytesSync, 'function');
assert.strictEqual(typeof Stream.textSync, 'function');
assert.strictEqual(typeof Stream.arrayBufferSync, 'function');
assert.strictEqual(typeof Stream.arraySync, 'function');
}
async function testStreamNamespaceCombining() {
const { Stream } = streamNew;
assert.strictEqual(typeof Stream.merge, 'function');
assert.strictEqual(typeof Stream.broadcast, 'function');
assert.strictEqual(typeof Stream.share, 'function');
assert.strictEqual(typeof Stream.shareSync, 'function');
}
async function testStreamNamespaceUtilities() {
const { Stream } = streamNew;
assert.strictEqual(typeof Stream.tap, 'function');
assert.strictEqual(typeof Stream.tapSync, 'function');
assert.strictEqual(typeof Stream.ondrain, 'function');
}
async function testStreamNamespaceProtocols() {
const { Stream } = streamNew;
assert.strictEqual(typeof Stream.toStreamable, 'symbol');
assert.strictEqual(typeof Stream.toAsyncStreamable, 'symbol');
assert.strictEqual(typeof Stream.broadcastProtocol, 'symbol');
assert.strictEqual(typeof Stream.shareProtocol, 'symbol');
assert.strictEqual(typeof Stream.shareSyncProtocol, 'symbol');
assert.strictEqual(typeof Stream.drainableProtocol, 'symbol');
}
// =============================================================================
// Individual exports (destructured imports)
// =============================================================================
async function testIndividualExports() {
// Factories
assert.strictEqual(typeof streamNew.push, 'function');
assert.strictEqual(typeof streamNew.duplex, 'function');
assert.strictEqual(typeof streamNew.from, 'function');
assert.strictEqual(typeof streamNew.fromSync, 'function');
// Pipelines
assert.strictEqual(typeof streamNew.pull, 'function');
assert.strictEqual(typeof streamNew.pullSync, 'function');
assert.strictEqual(typeof streamNew.pipeTo, 'function');
assert.strictEqual(typeof streamNew.pipeToSync, 'function');
// Consumers
assert.strictEqual(typeof streamNew.bytes, 'function');
assert.strictEqual(typeof streamNew.bytesSync, 'function');
assert.strictEqual(typeof streamNew.text, 'function');
assert.strictEqual(typeof streamNew.textSync, 'function');
assert.strictEqual(typeof streamNew.arrayBuffer, 'function');
assert.strictEqual(typeof streamNew.arrayBufferSync, 'function');
assert.strictEqual(typeof streamNew.array, 'function');
assert.strictEqual(typeof streamNew.arraySync, 'function');
// Combining
assert.strictEqual(typeof streamNew.merge, 'function');
assert.strictEqual(typeof streamNew.broadcast, 'function');
assert.strictEqual(typeof streamNew.share, 'function');
assert.strictEqual(typeof streamNew.shareSync, 'function');
// Utilities
assert.strictEqual(typeof streamNew.tap, 'function');
assert.strictEqual(typeof streamNew.tapSync, 'function');
assert.strictEqual(typeof streamNew.ondrain, 'function');
// Protocol symbols
assert.strictEqual(typeof streamNew.toStreamable, 'symbol');
assert.strictEqual(typeof streamNew.toAsyncStreamable, 'symbol');
assert.strictEqual(typeof streamNew.broadcastProtocol, 'symbol');
assert.strictEqual(typeof streamNew.shareProtocol, 'symbol');
assert.strictEqual(typeof streamNew.shareSyncProtocol, 'symbol');
assert.strictEqual(typeof streamNew.drainableProtocol, 'symbol');
}
async function testMultiConsumerExports() {
// Broadcast and Share constructors/factories
assert.ok(streamNew.Broadcast);
assert.strictEqual(typeof streamNew.Broadcast.from, 'function');
assert.ok(streamNew.Share);
assert.strictEqual(typeof streamNew.Share.from, 'function');
assert.ok(streamNew.SyncShare);
assert.strictEqual(typeof streamNew.SyncShare.fromSync, 'function');
}
// =============================================================================
// Cross-check: namespace matches individual exports
// =============================================================================
async function testNamespaceMatchesExports() {
const { Stream } = streamNew;
// Every function on Stream should also be available as a direct export
assert.strictEqual(Stream.push, streamNew.push);
assert.strictEqual(Stream.duplex, streamNew.duplex);
assert.strictEqual(Stream.from, streamNew.from);
assert.strictEqual(Stream.fromSync, streamNew.fromSync);
assert.strictEqual(Stream.pull, streamNew.pull);
assert.strictEqual(Stream.pullSync, streamNew.pullSync);
assert.strictEqual(Stream.pipeTo, streamNew.pipeTo);
assert.strictEqual(Stream.pipeToSync, streamNew.pipeToSync);
assert.strictEqual(Stream.bytes, streamNew.bytes);
assert.strictEqual(Stream.text, streamNew.text);
assert.strictEqual(Stream.arrayBuffer, streamNew.arrayBuffer);
assert.strictEqual(Stream.array, streamNew.array);
assert.strictEqual(Stream.bytesSync, streamNew.bytesSync);
assert.strictEqual(Stream.textSync, streamNew.textSync);
assert.strictEqual(Stream.arrayBufferSync, streamNew.arrayBufferSync);
assert.strictEqual(Stream.arraySync, streamNew.arraySync);
assert.strictEqual(Stream.merge, streamNew.merge);
assert.strictEqual(Stream.broadcast, streamNew.broadcast);
assert.strictEqual(Stream.share, streamNew.share);
assert.strictEqual(Stream.shareSync, streamNew.shareSync);
assert.strictEqual(Stream.tap, streamNew.tap);
assert.strictEqual(Stream.tapSync, streamNew.tapSync);
assert.strictEqual(Stream.ondrain, streamNew.ondrain);
// Protocol symbols
assert.strictEqual(Stream.toStreamable, streamNew.toStreamable);
assert.strictEqual(Stream.toAsyncStreamable, streamNew.toAsyncStreamable);
assert.strictEqual(Stream.broadcastProtocol, streamNew.broadcastProtocol);
assert.strictEqual(Stream.shareProtocol, streamNew.shareProtocol);
assert.strictEqual(Stream.shareSyncProtocol, streamNew.shareSyncProtocol);
assert.strictEqual(Stream.drainableProtocol, streamNew.drainableProtocol);
}
// =============================================================================
// Require paths
// =============================================================================
async function testRequirePaths() {
// Both require('stream/iter') and require('node:stream/iter') should work
const fromPlain = require('stream/iter');
const fromNode = require('node:stream/iter');
assert.strictEqual(fromPlain.Stream, fromNode.Stream);
assert.strictEqual(fromPlain.push, fromNode.push);
}
Promise.all([
testStreamNamespaceExists(),
testStreamNamespaceFrozen(),
testStreamNamespaceFactories(),
testStreamNamespacePipelines(),
testStreamNamespaceAsyncConsumers(),
testStreamNamespaceSyncConsumers(),
testStreamNamespaceCombining(),
testStreamNamespaceUtilities(),
testStreamNamespaceProtocols(),
testIndividualExports(),
testMultiConsumerExports(),
testNamespaceMatchesExports(),
testRequirePaths(),
]).then(common.mustCall());