blob: bd11254711b5baa0b2f908d948f45c4188d3cd23 [file] [edit]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {assert} from 'chai';
import {
computeBuildTestId,
escapeTestIdBlock,
formatFailedTestsSummary,
generateExactTestId,
} from './TestIdGeneration.js';
describe('TestIdGeneration', () => {
describe('escapeTestIdBlock', () => {
it('converts to lowercase', () => {
assert.strictEqual(escapeTestIdBlock('HELLO'), 'hello');
});
it('replaces spaces with underscores', () => {
assert.strictEqual(escapeTestIdBlock('hello world test'), 'hello_world_test');
});
it('replaces colons with underscores', () => {
assert.strictEqual(escapeTestIdBlock('hello:world::test'), 'hello_world__test');
});
it('replaces specific non-printable characters', () => {
// \n, \r, and \t are matched by \s+ and replaced by underscore before replaceNonPrintable
assert.strictEqual(escapeTestIdBlock('a\nb'), 'a_lf_b');
assert.strictEqual(escapeTestIdBlock('a\rb'), 'a_cr_b');
assert.strictEqual(escapeTestIdBlock('a\tb'), 'a_tab_b');
assert.strictEqual(escapeTestIdBlock('a\x00b'), 'a_null_b');
assert.strictEqual(escapeTestIdBlock('a\x07b'), 'a_bell_b');
});
it('strips other non-printable characters', () => {
// \x08 is backspace, a control character (category C)
assert.strictEqual(escapeTestIdBlock('a\x08b'), 'ab');
});
it('replaces double quote characters', () => {
assert.strictEqual(escapeTestIdBlock('a"b'), 'a_dblquote_b');
});
it('handles combinations of replacements', () => {
assert.strictEqual(escapeTestIdBlock(' HELLO: world\n'), '_hello__world_lf_');
});
it('handles strange dashes correctly', () => {
assert.strictEqual(escapeTestIdBlock('PerformanceAgent – call tree focus'), 'performanceagent_call_tree_focus');
assert.strictEqual(escapeTestIdBlock('PerformanceAgent — call tree focus'), 'performanceagent_call_tree_focus');
assert.strictEqual(escapeTestIdBlock('PerformanceAgent ⸺ call tree focus'), 'performanceagent_call_tree_focus');
assert.strictEqual(escapeTestIdBlock('PerformanceAgent ⸻ call tree focus'), 'performanceagent_call_tree_focus');
});
});
describe('computeBuildTestId', () => {
it('computes correct test id', () => {
const file = '/base/test.ts';
const titlePath = ['Suite', 'sub suite', 'test:case'];
const result = computeBuildTestId(file, titlePath);
assert.strictEqual(result, '/base/test.ts:suite:sub_suite:test_case');
});
});
describe('generateExactTestId', () => {
it('computes correct exact test id from file inside genDir', () => {
const genDir = '/gen';
const file = '/gen/front_end/my_test.js';
const titlePath = ['Suite', 'test case'];
const result = generateExactTestId(genDir, file, titlePath);
assert.deepEqual(result, {
exactTestId: 'front_end/my_test.ts:suite:test_case',
coarseName: 'front_end/',
fineName: 'my_test.ts',
caseName: 'suite:test_case',
});
});
it('computes correct exact test id from file outside genDir', () => {
const genDir = '/gen';
const file = '/other/front_end/my_test.js';
const titlePath = ['Suite', 'test case'];
const result = generateExactTestId(genDir, file, titlePath);
assert.deepEqual(result, {
exactTestId: '/other/front_end/my_test.ts:suite:test_case',
coarseName: '/other/front_end/',
fineName: 'my_test.ts',
caseName: 'suite:test_case',
});
});
it('normalizes backslashes', () => {
const genDir = 'C:\\gen';
const file = 'C:\\gen\\front_end\\my_test.js';
const titlePath = ['test'];
const result = generateExactTestId(genDir, file, titlePath);
assert.deepEqual(result, {
exactTestId: 'front_end/my_test.ts:test',
coarseName: 'front_end/',
fineName: 'my_test.ts',
caseName: 'test',
});
});
it('handles root relative files correctly', () => {
const genDir = '/gen';
const file = '/my_test.js';
const titlePath = ['test'];
const result = generateExactTestId(genDir, file, titlePath);
assert.deepEqual(result, {
exactTestId: '/my_test.ts:test',
coarseName: '/',
fineName: 'my_test.ts',
caseName: 'test',
});
});
it('handles files with no directory correctly', () => {
const genDir = '/gen';
const file = 'my_test.js';
const titlePath = ['test'];
const result = generateExactTestId(genDir, file, titlePath);
assert.deepEqual(result, {
exactTestId: 'my_test.ts:test',
coarseName: '',
fineName: 'my_test.ts',
caseName: 'test',
});
});
it('throws when exactTestId is too long', () => {
const genDir = '/gen';
const file = '/gen/front_end/my_test.js';
const titlePath = ['a'.repeat(600)];
assert.throws(() => generateExactTestId(genDir, file, titlePath), /Test ID is too long/);
});
});
describe('formatFailedTestsSummary', () => {
it('returns empty string when there are no failed tests', () => {
assert.strictEqual(formatFailedTestsSummary([]), '');
assert.strictEqual(formatFailedTestsSummary(new Set()), '');
});
it('formats a single failed test correctly', () => {
const failed = ['front_end/core/common/Color.test.ts:color:parses_hex'];
const expected =
'\nFailed tests (1):\n front_end/core/common/Color.test.ts:color:parses_hex\n\nTo rerun:\n npm run test -- front_end/core/common/Color.test.ts:color:parses_hex\n\n';
assert.strictEqual(formatFailedTestsSummary(failed), expected);
});
it('formats multiple failed tests correctly', () => {
const failed = new Set([
'front_end/core/common/Color.test.ts:color:parses_hex',
'test/e2e/console/console-log.test.ts:the_console_tab:shows_console_messages',
]);
const expected =
'\nFailed tests (2):\n front_end/core/common/Color.test.ts:color:parses_hex\n test/e2e/console/console-log.test.ts:the_console_tab:shows_console_messages\n\nTo rerun:\n npm run test -- front_end/core/common/Color.test.ts:color:parses_hex test/e2e/console/console-log.test.ts:the_console_tab:shows_console_messages\n\n';
assert.strictEqual(formatFailedTestsSummary(failed), expected);
});
});
});