ava/test-tap/code-excerpt.js
Notas Hellout 1d62caf585
Upgrade xo to v0.57.0
* Upgrade xo to v0.57.0 and lint sources, tests, and examples

Disabled `unicorn/prevent-abbreviations` because it introduces too many
opinionated changes.

* Update reporter logs which are sensitive to line numbers changing

---------

Co-authored-by: Mark Wubben <mark@novemberborn.net>
2024-02-27 22:24:21 +01:00

97 lines
2.2 KiB
JavaScript

import {pathToFileURL} from 'node:url';
import {Chalk} from 'chalk'; // eslint-disable-line unicorn/import-style
import {test} from 'tap';
import {temporaryFile, temporaryWriteSync} from 'tempy';
import {set as setChalk} from '../lib/chalk.js';
import codeExcerpt from '../lib/code-excerpt.js';
setChalk({level: 1});
const chalk = new Chalk({level: 1});
test('read code excerpt', t => {
const file = pathToFileURL(temporaryWriteSync(`function a() {
alert();
}`));
const excerpt = codeExcerpt({
file, line: 2, isWithinProject: true, isDependency: false,
});
const expected = [
` ${chalk.grey('1:')} function a() {`,
chalk.bgRed.bold(' 2: alert(); '),
` ${chalk.grey('3:')} } `,
].join('\n');
t.equal(excerpt, expected);
t.end();
});
test('truncate lines', t => {
const file = pathToFileURL(temporaryWriteSync(`function a() {
alert();
}`));
const excerpt = codeExcerpt({
file, line: 2, isWithinProject: true, isDependency: false,
}, {maxWidth: 14});
const expected = [
` ${chalk.grey('1:')} functio…`,
chalk.bgRed.bold(' 2: alert…'),
` ${chalk.grey('3:')} } `,
].join('\n');
t.equal(excerpt, expected);
t.end();
});
test('format line numbers', t => {
const file = pathToFileURL(temporaryWriteSync(`
function a() {
alert();
}`));
const excerpt = codeExcerpt({
file, line: 10, isWithinProject: true, isDependency: false,
});
const expected = [
` ${chalk.grey(' 9:')} function a() {`,
chalk.bgRed.bold(' 10: alert(); '),
` ${chalk.grey('11:')} } `,
].join('\n');
t.equal(excerpt, expected);
t.end();
});
test('noop if file cannot be read', t => {
const file = pathToFileURL(temporaryFile());
const excerpt = codeExcerpt({
file, line: 10, isWithinProject: true, isDependency: false,
});
t.equal(excerpt, null);
t.end();
});
test('noop if file is not within project', t => {
const excerpt = codeExcerpt({isWithinProject: false, file: import.meta.url, line: 1});
t.equal(excerpt, null);
t.end();
});
test('noop if file is a dependency', t => {
const excerpt = codeExcerpt({
isWithinProject: true, isDependency: true, file: import.meta.url, line: 1,
});
t.equal(excerpt, null);
t.end();
});