// Flags: --expose-internals --no-warnings 'use strict'; const common = require('../common'); const assert = require('assert'); const { WriteStream } = require('tty'); const { internalBinding } = require('internal/test/binding'); const { TTY } = internalBinding('tty_wrap'); const getWindowSize = TTY.prototype.getWindowSize; function monkeyPatchGetWindowSize(fn) { TTY.prototype.getWindowSize = function() { TTY.prototype.getWindowSize = getWindowSize; return fn.apply(this, arguments); }; } { // tty.WriteStream constructor does not define columns and rows if an error // occurs while retrieving the window size from the handle. monkeyPatchGetWindowSize(function() { return -1; }); const stream = WriteStream(1); assert(stream instanceof WriteStream); assert.strictEqual(stream.columns, undefined); assert.strictEqual(stream.rows, undefined); } { // _refreshSize() emits an error if an error occurs while retrieving the // window size from the handle. const stream = WriteStream(1); stream.on('error', common.mustCall((err) => { assert.strictEqual(err.syscall, 'getWindowSize'); })); monkeyPatchGetWindowSize(function() { return -1; }); stream._refreshSize(); } { // _refreshSize() emits a 'resize' event when the window size changes. monkeyPatchGetWindowSize(function(size) { size[0] = 80; size[1] = 24; return 0; }); const stream = WriteStream(1); stream.on('resize', common.mustCall(() => { assert.strictEqual(stream.columns, 82); assert.strictEqual(stream.rows, 26); })); assert.strictEqual(stream.columns, 80); assert.strictEqual(stream.rows, 24); monkeyPatchGetWindowSize(function(size) { size[0] = 82; size[1] = 26; return 0; }); stream._refreshSize(); } { // WriteStream.prototype.getWindowSize() returns the current columns and rows. monkeyPatchGetWindowSize(function(size) { size[0] = 99; size[1] = 32; return 0; }); const stream = WriteStream(1); assert.strictEqual(stream.columns, 99); assert.strictEqual(stream.rows, 32); assert.deepStrictEqual(stream.getWindowSize(), [99, 32]); }