From 36c88e9574eafcdc6be2aa582056b118d4ebb33c Mon Sep 17 00:00:00 2001 From: mzhubail <mzhubail@gmail.com> Date: Tue, 27 Aug 2024 14:37:37 +0300 Subject: [PATCH] Error on a wrong line number --- packages/runner/src/utils/collect.ts | 103 ++++++++++++++++----------- 1 file changed, 63 insertions(+), 40 deletions(-) diff --git a/packages/runner/src/utils/collect.ts b/packages/runner/src/utils/collect.ts index 5f3c3f3bfa8e..544c3181f2fd 100644 --- a/packages/runner/src/utils/collect.ts +++ b/packages/runner/src/utils/collect.ts @@ -7,65 +7,88 @@ import type { Filter } from '../types/runner' * If any tasks been marked as `only`, mark all other tasks as `skip`. */ export function interpretTaskModes( - suite: Suite, + suite_: Suite, namePattern?: string | RegExp, locationFilters?: Required<Filter[]>, onlyMode?: boolean, parentIsOnly?: boolean, allowOnly?: boolean, ): void { - const suiteIsOnly = parentIsOnly || suite.mode === 'only' + const filtersMap = locationFilters + ? Object.fromEntries( + locationFilters.map(f => ([`${f.filename}-${f.lineNumber}`, { filter: f, matched: false }])), + ) + : {} - suite.tasks.forEach((t) => { - // Check if either the parent suite or the task itself are marked as included - const includeTask = suiteIsOnly || t.mode === 'only' - if (onlyMode) { - if (t.type === 'suite' && (includeTask || someTasksAreOnly(t))) { - // Don't skip this suite - if (t.mode === 'only') { + const traverseSuite = (suite: Suite) => { + const suiteIsOnly = parentIsOnly || suite.mode === 'only' + + suite.tasks.forEach((t) => { + // Check if either the parent suite or the task itself are marked as included + const includeTask = suiteIsOnly || t.mode === 'only' + if (onlyMode) { + if (t.type === 'suite' && (includeTask || someTasksAreOnly(t))) { + // Don't skip this suite + if (t.mode === 'only') { + checkAllowOnly(t, allowOnly) + t.mode = 'run' + } + } + else if (t.mode === 'run' && !includeTask) { + t.mode = 'skip' + } + else if (t.mode === 'only') { checkAllowOnly(t, allowOnly) t.mode = 'run' } } - else if (t.mode === 'run' && !includeTask) { - t.mode = 'skip' - } - else if (t.mode === 'only') { - checkAllowOnly(t, allowOnly) - t.mode = 'run' - } - } - if (t.type === 'test') { - if (namePattern && !getTaskFullName(t).match(namePattern)) { - t.mode = 'skip' - } + if (t.type === 'test') { + if (namePattern && !getTaskFullName(t).match(namePattern)) { + t.mode = 'skip' + } - const relevantFilters = locationFilters?.filter( - f => t.file.filepath.includes(f.filename), - ) + const relevantFilters = locationFilters?.filter( + f => t.file.filepath.includes(f.filename), + ) - if (relevantFilters && relevantFilters.length !== 0) { - t.mode = relevantFilters.some(f => f.lineNumber === t.location?.line) - ? 'run' - : 'skip' + if (relevantFilters && relevantFilters.length !== 0) { + const matchedFilter = relevantFilters.find(f => f.lineNumber === t.location?.line) + + if (matchedFilter !== undefined) { + filtersMap[`${matchedFilter.filename}-${matchedFilter.lineNumber}`].matched = true + t.mode = 'run' + } + else { + t.mode = 'skip' + } + } } - } - else if (t.type === 'suite') { - if (t.mode === 'skip') { - skipAllTasks(t) + else if (t.type === 'suite') { + if (t.mode === 'skip') { + skipAllTasks(t) + } + else { + traverseSuite(t) + // interpretTaskModes(t, namePattern, locationFilters, onlyMode, includeTask, allowOnly) + } } - else { - interpretTaskModes(t, namePattern, locationFilters, onlyMode, includeTask, allowOnly) + }) + + // if all subtasks are skipped, mark as skip + if (suite.mode === 'run') { + if (suite.tasks.length && suite.tasks.every(i => i.mode !== 'run')) { + suite.mode = 'skip' } } - }) + } + + traverseSuite(suite_) - // if all subtasks are skipped, mark as skip - if (suite.mode === 'run') { - if (suite.tasks.length && suite.tasks.every(i => i.mode !== 'run')) { - suite.mode = 'skip' + Object.values(filtersMap).forEach((entry) => { + if (!entry.matched) { + console.error('ERR: Failed to match filter:', entry.filter) } - } + }) } function getTaskFullName(task: TaskBase): string {