From 72b46f28bf8d37a166961b5aa2a22302b932b756 Mon Sep 17 00:00:00 2001
From: Max Edwards <youwontforgetthis@gmail.com>
Date: Wed, 11 Sep 2024 18:27:49 +0100
Subject: [PATCH] test: fix exclude parsing for functional runner

This restores previous behaviour of being able to exclude a test by name without having to specify .py extension.
---
 test/functional/test_runner.py | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py
index bee96227093..aad2af69df2 100755
--- a/test/functional/test_runner.py
+++ b/test/functional/test_runner.py
@@ -522,23 +522,24 @@ def main():
         test_list += BASE_SCRIPTS
 
     # Remove the test cases that the user has explicitly asked to exclude.
+    # The user can specify a test case with or without the .py extension.
     if args.exclude:
         def print_warning_missing_test(test_name):
             print("{}WARNING!{} Test '{}' not found in current test list.".format(BOLD[1], BOLD[0], test_name))
+        def remove_tests(exclude_list):
+            if not exclude_list:
+                print_warning_missing_test(exclude_test)
+            for exclude_item in exclude_list:
+                test_list.remove(exclude_item)
+
         exclude_tests = [test.strip() for test in args.exclude.split(",")]
         for exclude_test in exclude_tests:
-            if exclude_test.endswith('.py'):
-                # Remove <test_name>.py and <test_name>.py --arg from the test list
-                exclude_list = [test for test in test_list if test.split('.py')[0] == exclude_test.split('.py')[0]]
-                if not exclude_list:
-                    print_warning_missing_test(exclude_test)
-                for exclude_item in exclude_list:
-                    test_list.remove(exclude_item)
+            # A space in the name indicates it has arguments such as "wallet_basic.py --descriptors"
+            if ' ' in exclude_test:
+                remove_tests([test for test in test_list if test.replace('.py', '') == exclude_test.replace('.py', '')])
             else:
-                try:
-                    test_list.remove(exclude_test)
-                except ValueError:
-                    print_warning_missing_test(exclude_test)
+                # Exclude all variants of a test
+                remove_tests([test for test in test_list if test.split('.py')[0] == exclude_test.split('.py')[0]])
 
     if args.filter:
         test_list = list(filter(re.compile(args.filter).search, test_list))