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 {