// Copyright (c) 2025 Cloudflare, Inc. // Licensed under the Apache 2.0 license found in the LICENSE file or at: // https://opensource.org/licenses/Apache-2.0 import * as tty from 'node:tty'; import { strictEqual, deepStrictEqual } from 'node:assert'; export const ttyTest = { test() { // Note: test was generated by claude with manual tweaks // Test that required exports exist strictEqual(typeof tty.isatty, 'function'); strictEqual(typeof tty.ReadStream, 'function'); strictEqual(typeof tty.WriteStream, 'function'); // Test isatty function - should always return false strictEqual(tty.isatty(0), false); // stdin strictEqual(tty.isatty(1), false); // stdout strictEqual(tty.isatty(2), false); // stderr strictEqual(tty.isatty(3), false); // arbitrary fd strictEqual(tty.isatty(-1), false); // invalid fd strictEqual(tty.isatty(999), false); // high fd number // Test ReadStream constructor - should succeed and store fd const readStream = new tty.ReadStream(0); strictEqual(readStream.fd, 0); strictEqual(readStream.isRaw, false); strictEqual(readStream.isTTY, false); const readStream2 = new tty.ReadStream(1, {}); strictEqual(readStream2.fd, 1); const readStream3 = new tty.ReadStream(2, { readable: true }); strictEqual(readStream3.fd, 2); // Test WriteStream constructor - should succeed and store fd const writeStream = new tty.WriteStream(1); strictEqual(writeStream.fd, 1); strictEqual(writeStream.columns, 0); strictEqual(writeStream.rows, 0); strictEqual(writeStream.isTTY, true); const writeStream2 = new tty.WriteStream(2, {}); strictEqual(writeStream2.fd, 2); const writeStream3 = new tty.WriteStream(1, { writable: true }); strictEqual(writeStream3.fd, 1); // Test ReadStream prototype methods and properties strictEqual(typeof tty.ReadStream.prototype.setRawMode, 'function'); // Test WriteStream prototype properties and methods strictEqual(tty.WriteStream.prototype.isTTY, true); strictEqual(typeof tty.WriteStream.prototype.getColorDepth, 'function'); strictEqual(typeof tty.WriteStream.prototype.hasColors, 'function'); strictEqual(typeof tty.WriteStream.prototype._refreshSize, 'function'); strictEqual(typeof tty.WriteStream.prototype.cursorTo, 'function'); strictEqual(typeof tty.WriteStream.prototype.moveCursor, 'function'); strictEqual(typeof tty.WriteStream.prototype.clearLine, 'function'); strictEqual(typeof tty.WriteStream.prototype.clearScreenDown, 'function'); strictEqual(typeof tty.WriteStream.prototype.getWindowSize, 'function'); // Test WriteStream instance methods behavior // Test getColorDepth - should return 8 const colorDepth = writeStream.getColorDepth(); strictEqual(colorDepth, 8); // Test hasColors - should return false const hasColors = writeStream.hasColors(); strictEqual(hasColors, false); // Test _refreshSize - should be a no-op (not throw) writeStream._refreshSize(); // Test getWindowSize - should return [columns, rows] const windowSize = writeStream.getWindowSize(); deepStrictEqual(windowSize, [0, 0]); // Test cursorTo - should be a no-op and return false strictEqual(writeStream.cursorTo(10, 5), false); let callbackCalled = false; strictEqual( writeStream.cursorTo(0, 0, () => { callbackCalled = true; }), false ); strictEqual(callbackCalled, true); // Test cursorTo with callback as second argument callbackCalled = false; strictEqual( writeStream.cursorTo(0, () => { callbackCalled = true; }), false ); strictEqual(callbackCalled, true); // Test moveCursor - should be a no-op and return false strictEqual(writeStream.moveCursor(1, 1), false); callbackCalled = false; strictEqual( writeStream.moveCursor(-1, 0, () => { callbackCalled = true; }), false ); strictEqual(callbackCalled, true); // Test clearLine - should be a no-op and return false strictEqual(writeStream.clearLine(0), false); callbackCalled = false; strictEqual( writeStream.clearLine(1, () => { callbackCalled = true; }), false ); strictEqual(callbackCalled, true); // Test clearScreenDown - should be a no-op and return false strictEqual(writeStream.clearScreenDown(), false); callbackCalled = false; strictEqual( writeStream.clearScreenDown(() => { callbackCalled = true; }), false ); strictEqual(callbackCalled, true); // Test ReadStream setRawMode - should set isRaw and return this const setRawModeResult = readStream.setRawMode(true); strictEqual(setRawModeResult, readStream); strictEqual(readStream.isRaw, true); const setRawModeFalseResult = readStream.setRawMode(false); strictEqual(setRawModeFalseResult, readStream); strictEqual(readStream.isRaw, false); // Test edge cases for isatty strictEqual(tty.isatty(Number.MAX_SAFE_INTEGER), false); strictEqual(tty.isatty(Number.MIN_SAFE_INTEGER), false); strictEqual(tty.isatty(0.5), false); // Non-integer strictEqual(tty.isatty(NaN), false); strictEqual(tty.isatty(Infinity), false); strictEqual(tty.isatty(-Infinity), false); // Test that constructors are functions strictEqual(typeof tty.ReadStream, 'function'); strictEqual(typeof tty.WriteStream, 'function'); // Test default export strictEqual(typeof tty.default, 'object'); strictEqual(tty.default.isatty, tty.isatty); strictEqual(tty.default.ReadStream, tty.ReadStream); strictEqual(tty.default.WriteStream, tty.WriteStream); // Test hasColors with different arguments (should always return false) strictEqual(writeStream.hasColors(), false); strictEqual(writeStream.hasColors(8), false); strictEqual(writeStream.hasColors(256), false); // Test getColorDepth with different arguments (should always return 8) strictEqual(writeStream.getColorDepth(), 8); strictEqual(writeStream.getColorDepth({}), 8); // Test setRawMode with different argument types strictEqual(readStream.setRawMode(true), readStream); strictEqual(readStream.setRawMode(false), readStream); strictEqual(readStream.setRawMode(1), readStream); strictEqual(readStream.setRawMode(0), readStream); strictEqual(readStream.setRawMode('true'), readStream); }, };