import childProcess from 'node:child_process';import fs from 'node:fs';import path from 'node:path';import {fileURLToPath} from 'node:url';import ciInfo from 'ci-info';import stripAnsi from 'strip-ansi';import {test} from 'tap';import {execCli} from '../helper/cli.js';const __dirname = fileURLToPath(new URL('.', import.meta.url));test('timeout', {skip: ciInfo.isCI}, t => {execCli(['long-running.cjs', '-T', '1s'], (error, stdout) => {t.ok(error);t.match(stdout, 'helpful log of a pending test');t.match(stdout, /Timed out/);t.end();});});test('interrupt', {skip: ciInfo.isCI}, t => {const proc = execCli(['long-running.cjs'], (_, stdout) => {t.match(stdout, 'helpful log of a pending test');t.match(stdout, /SIGINT/);t.end();});setTimeout(() => {proc.kill('SIGINT');}, 2000);});test('include anonymous functions in error reports', t => {execCli('error-in-anonymous-function.cjs', (error, stdout) => {t.ok(error);t.match(stdout, /error-in-anonymous-function\.cjs:4:8/);t.end();});});test('--match works', t => {execCli(['-m=foo', '-m=bar', '-m=!baz', '-m=t* a* f*', '-m=!t* a* n* f*', 'matcher-skip.cjs'], error => {t.error(error);t.end();});});for (const tapFlag of ['--tap', '-t']) {test(`${tapFlag} should produce TAP output`, t => {execCli([tapFlag, 'test.cjs'], {dirname: 'fixture/tap'}, error => {t.ok(!error);t.end();});});}test('works when no files are found', t => {execCli([], {dirname: 'fixture/globs/no-files'}, (error, stdout) => {t.equal(error.code, 1);t.match(stdout, 'Couldnβt find any files to test');t.end();});});test('should warn ava is required without the cli', t => {childProcess.execFile(process.execPath, [path.resolve(__dirname, '../../entrypoints/main.cjs')], error => {t.ok(error);t.match(error.message, /Test files must be run with the AVA CLI/);t.end();});});test('tests without assertions do not fail if failWithoutAssertions option is set to false', t => {execCli([], {dirname: 'fixture/package-config/fail-without-assertions'}, error => {t.error(error);t.end();});});test('--no-color disables formatting colors', t => {execCli(['--no-color', 'formatting-color.cjs'], (error, stdout) => {t.ok(error);t.equal(stripAnsi(stdout), stdout);t.end();});});test('--color enables formatting colors', t => {execCli(['--color', 'formatting-color.cjs'], (error, stdout) => {t.ok(error);t.not(stripAnsi(stdout), stdout);t.end();});});test('sets NODE_ENV to test when it is not set', t => {execCli('node-env-test.cjs', {env: {}}, (error, stdout) => {t.error(error);t.match(stdout, /1 test passed/);t.end();});});test('doesnβt set NODE_ENV when it is set', t => {execCli('node-env-foo.cjs', {env: {NODE_ENV: 'foo'}}, (error, stdout) => {t.error(error);t.match(stdout, /1 test passed/);t.end();});});test('additional arguments are forwarded to the worker', t => {execCli(['worker-argv.cjs', '--serial', '--', '--hello', 'world'], error => {t.error(error);t.end();});});test('reset-cache resets cache', t => {const cacheDir = path.join(__dirname, '..', 'fixture', 'reset-cache', 'node_modules', '.cache', 'ava');fs.mkdirSync(cacheDir, {recursive: true});fs.writeFileSync(path.join(cacheDir, 'file'), '');t.ok(fs.readdirSync(cacheDir).length > 0);execCli(['reset-cache'], {dirname: 'fixture/reset-cache'}, error => {t.error(error);t.ok(fs.readdirSync(cacheDir).length === 0);t.end();});});test('selects .cjs test files', t => {execCli('cjs.cjs', (error, stdout) => {t.error(error);t.match(stdout, /1 test passed/);t.end();});});test('load .mjs test files', t => {execCli('mjs.mjs', (error, stdout) => {t.error(error);t.match(stdout, /1 test passed/);t.end();});});test('load .js test files as ESM modules', t => {execCli('test.js', {dirname: 'fixture/pkg-type-module'}, (error, stdout) => {t.error(error);t.match(stdout, /1 test passed/);t.end();});});test('uses sortTestFiles to sort test files', t => {execCli([], {dirname: 'fixture/sort-tests'}, (error, stdout) => {t.error(error);t.match(stdout, /should run first[\s\S]+?should run second[\s\S]+?should run third/);t.end();});});