From a4c5b0f93685347e7afe9bd51e8f63a9f22d6869 Mon Sep 17 00:00:00 2001 From: maks-rafalko Date: Tue, 20 Jul 2021 00:23:55 +0300 Subject: [PATCH] Use more performant way of building `--filter` option, not escaping non-unique test cases and using `foreach` --- .../ArgumentsAndOptionsBuilder.php | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/TestFramework/PhpUnit/CommandLine/ArgumentsAndOptionsBuilder.php b/src/TestFramework/PhpUnit/CommandLine/ArgumentsAndOptionsBuilder.php index db4054db7b..77e2a4717c 100644 --- a/src/TestFramework/PhpUnit/CommandLine/ArgumentsAndOptionsBuilder.php +++ b/src/TestFramework/PhpUnit/CommandLine/ArgumentsAndOptionsBuilder.php @@ -35,17 +35,16 @@ namespace Infection\TestFramework\PhpUnit\CommandLine; +use function array_key_exists; use function array_map; use function array_merge; -use function array_unique; use function count; use function escapeshellcmd; use function explode; -use function implode; use Infection\AbstractTestFramework\Coverage\TestLocation; use Infection\TestFramework\CommandLineArgumentsAndOptionsBuilder; use function ltrim; -use function Safe\sprintf; +use function rtrim; /** * @internal @@ -71,18 +70,33 @@ public function buildForInitialTestsRun(string $configPath, string $extraOptions return $options; } + /** + * @param TestLocation[] $tests + */ public function buildForMutant(string $configPath, string $extraOptions, array $tests): array { $options = $this->buildForInitialTestsRun($configPath, $extraOptions); if (count($tests) > 0) { - $escapedTests = array_map( - static fn (TestLocation $testLocation): string => escapeshellcmd($testLocation->getMethod()), - $tests - ); + $filterString = '/'; + $usedTestCases = []; + + foreach ($tests as $testLocation) { + $testCaseString = $testLocation->getMethod(); + + if (array_key_exists($testCaseString, $usedTestCases)) { + continue; + } + + $usedTestCases[$testCaseString] = true; + + $filterString .= escapeshellcmd($testCaseString) . '|'; + } + + $filterString = rtrim($filterString, '|') . '/'; $options[] = '--filter'; - $options[] = sprintf('/%s/', implode('|', array_unique($escapedTests))); + $options[] = $filterString; } return $options;