in src/client/testing/testController/pytest/arguments.ts [149:263]
function pytestFilterArguments(args: string[], argumentToRemoveOrFilter: string[] | TestFilter): string[] {
const optionsWithoutArgsToRemove: string[] = [];
const optionsWithArgsToRemove: string[] = [];
// Positional arguments in pytest are test directories and files.
// So if we want to run a specific test, then remove positional args.
let removePositionalArgs = false;
if (Array.isArray(argumentToRemoveOrFilter)) {
argumentToRemoveOrFilter.forEach((item) => {
if (OptionsWithArguments.indexOf(item) >= 0) {
optionsWithArgsToRemove.push(item);
}
if (OptionsWithoutArguments.indexOf(item) >= 0) {
optionsWithoutArgsToRemove.push(item);
}
});
} else {
switch (argumentToRemoveOrFilter) {
case TestFilter.removeTests: {
optionsWithoutArgsToRemove.push(
...['--lf', '--last-failed', '--ff', '--failed-first', '--nf', '--new-first'],
);
optionsWithArgsToRemove.push(...['-k', '-m', '--lfnf', '--last-failed-no-failures']);
removePositionalArgs = true;
break;
}
case TestFilter.discovery: {
optionsWithoutArgsToRemove.push(
...[
'-x',
'--exitfirst',
'--fixtures',
'--funcargs',
'--fixtures-per-test',
'--pdb',
'--lf',
'--last-failed',
'--ff',
'--failed-first',
'--nf',
'--new-first',
'--cache-show',
'-v',
'--verbose',
'-q',
'-quiet',
'-l',
'--showlocals',
'--no-print-logs',
'--debug',
'--setup-only',
'--setup-show',
'--setup-plan',
'--trace',
],
);
optionsWithArgsToRemove.push(
...[
'-m',
'--maxfail',
'--pdbcls',
'--capture',
'--lfnf',
'--last-failed-no-failures',
'--verbosity',
'-r',
'--tb',
'--show-capture',
'--durations',
'--junit-xml',
'--junit-prefix',
'--result-log',
'-W',
'--pythonwarnings',
'--log-*',
],
);
removePositionalArgs = true;
break;
}
case TestFilter.debugAll:
case TestFilter.runAll: {
optionsWithoutArgsToRemove.push(...['--collect-only', '--trace']);
break;
}
case TestFilter.debugSpecific:
case TestFilter.runSpecific: {
optionsWithoutArgsToRemove.push(
...[
'--collect-only',
'--lf',
'--last-failed',
'--ff',
'--failed-first',
'--nf',
'--new-first',
'--trace',
],
);
optionsWithArgsToRemove.push(...['-k', '-m', '--lfnf', '--last-failed-no-failures']);
removePositionalArgs = true;
break;
}
default: {
throw new Error(`Unsupported Filter '${argumentToRemoveOrFilter}'`);
}
}
}
let filteredArgs = args.slice();
if (removePositionalArgs) {
const positionalArgs = getPositionalArguments(filteredArgs, OptionsWithArguments, OptionsWithoutArguments);
filteredArgs = filteredArgs.filter((item) => positionalArgs.indexOf(item) === -1);
}
return filterArguments(filteredArgs, optionsWithArgsToRemove, optionsWithoutArgsToRemove);
}