summaryrefslogtreecommitdiff
path: root/test/pseudo-tty/test-tty-color-support.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/pseudo-tty/test-tty-color-support.js')
-rw-r--r--test/pseudo-tty/test-tty-color-support.js91
1 files changed, 91 insertions, 0 deletions
diff --git a/test/pseudo-tty/test-tty-color-support.js b/test/pseudo-tty/test-tty-color-support.js
new file mode 100644
index 0000000000..b5bc3aca24
--- /dev/null
+++ b/test/pseudo-tty/test-tty-color-support.js
@@ -0,0 +1,91 @@
+'use strict';
+
+const common = require('../common');
+const assert = require('assert').strict;
+const { WriteStream } = require('tty');
+const { inspect } = require('util');
+
+const fd = common.getTTYfd();
+const writeStream = new WriteStream(fd);
+
+{
+ const depth = writeStream.getColorDepth();
+ assert.strictEqual(typeof depth, 'number');
+ assert(depth >= 1 && depth <= 24);
+
+ const support = writeStream.hasColors();
+ assert.strictEqual(support, depth !== 1);
+}
+
+// Validate invalid input.
+[true, null, () => {}, Symbol(), 5n].forEach((input) => {
+ assert.throws(
+ () => writeStream.hasColors(input),
+ { code: 'ERR_INVALID_ARG_TYPE' }
+ );
+});
+
+[-1, 1].forEach((input) => {
+ assert.throws(
+ () => writeStream.hasColors(input),
+ { code: 'ERR_OUT_OF_RANGE' }
+ );
+});
+
+// Check different environment variables.
+[
+ [{ COLORTERM: '1' }, 4],
+ [{ COLORTERM: 'truecolor' }, 24],
+ [{ COLORTERM: '24bit' }, 24],
+ [{ TMUX: '1' }, 8],
+ [{ CI: '1' }, 1],
+ [{ CI: '1', TRAVIS: '1' }, 8],
+ [{ CI: '1', CIRCLECI: '1' }, 8],
+ [{ CI: '1', APPVEYOR: '1' }, 8],
+ [{ CI: '1', GITLAB_CI: '1' }, 8],
+ [{ CI: '1', CI_NAME: 'codeship' }, 8],
+ [{ TEAMCITY_VERSION: '1.0.0' }, 1],
+ [{ TEAMCITY_VERSION: '9.11.0' }, 4],
+ [{ TERM_PROGRAM: 'iTerm.app' }, 8],
+ [{ TERM_PROGRAM: 'iTerm.app', TERM_PROGRAM_VERSION: '3.0' }, 24],
+ [{ TERM_PROGRAM: 'iTerm.app', TERM_PROGRAM_VERSION: '2.0' }, 8],
+ [{ TERM_PROGRAM: 'HyperTerm' }, 24],
+ [{ TERM_PROGRAM: 'Hyper' }, 1],
+ [{ TERM_PROGRAM: 'MacTerm' }, 24],
+ [{ TERM_PROGRAM: 'Apple_Terminal' }, 8],
+ [{ TERM: 'xterm-256' }, 8],
+ [{ TERM: 'ansi' }, 4],
+ [{ TERM: 'ANSI' }, 4],
+ [{ TERM: 'color' }, 4],
+ [{ TERM: 'linux' }, 4],
+ [{ TERM: 'fail' }, 1],
+ [{ NODE_DISABLE_COLORS: '1' }, 1],
+ [{ TERM: 'dumb' }, 1],
+ [{ TERM: 'dumb', COLORTERM: '1' }, 1],
+ [{ TERM: 'terminator' }, 24],
+ [{ TERM: 'console' }, 4]
+].forEach(([env, depth], i) => {
+ const actual = writeStream.getColorDepth(env);
+ assert.strictEqual(
+ actual,
+ depth,
+ `i: ${i}, expected: ${depth}, ` +
+ `actual: ${actual}, env: ${inspect(env)}`
+ );
+ const colors = 2 ** actual;
+ assert(writeStream.hasColors(colors, env));
+ assert(!writeStream.hasColors(colors + 1, env));
+ assert(depth >= 4 ? writeStream.hasColors(env) : !writeStream.hasColors(env));
+});
+
+// OS settings
+{
+ const platform = Object.getOwnPropertyDescriptor(process, 'platform');
+ const [ value, depth1, depth2 ] = process.platform !== 'win32' ?
+ ['win32', 1, 4] : ['linux', 4, 1];
+
+ assert.strictEqual(writeStream.getColorDepth({}), depth1);
+ Object.defineProperty(process, 'platform', { value });
+ assert.strictEqual(writeStream.getColorDepth({}), depth2);
+ Object.defineProperty(process, 'platform', platform);
+}