Skip to content

Commit

Permalink
chore: ProjectCodeTests - dry for function usage extractions (PHP-CS-…
Browse files Browse the repository at this point in the history
  • Loading branch information
keradus authored and danog committed Feb 2, 2024
1 parent 50db3d8 commit 867ef67
Showing 1 changed file with 42 additions and 43 deletions.
85 changes: 42 additions & 43 deletions tests/AutoReview/ProjectCodeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -376,58 +376,37 @@ public function testThatTestClassCoversAreCorrect(string $testClassName): void
*/
public function testThereIsNoPregFunctionUsedDirectly(string $className): void
{
$tokens = $this->createTokensForClass($className);

$stringTokens = array_filter(
$tokens->toArray(),
static fn (Token $token): bool => $token->isGivenKind(T_STRING)
);
$calledFunctions = $this->extractFunctionNamesCalledInClass($className);

$strings = array_map(
static fn (Token $token): string => $token->getContent(),
$stringTokens
);

$strings = array_unique($strings);
$message = sprintf('Class %s must not use preg_*, it shall use Preg::* instead.', $className);
self::assertNotContains('preg_filter', $strings, $message);
self::assertNotContains('preg_grep', $strings, $message);
self::assertNotContains('preg_match', $strings, $message);
self::assertNotContains('preg_match_all', $strings, $message);
self::assertNotContains('preg_replace', $strings, $message);
self::assertNotContains('preg_replace_callback', $strings, $message);
self::assertNotContains('preg_split', $strings, $message);
self::assertNotContains('preg_filter', $calledFunctions, $message);
self::assertNotContains('preg_grep', $calledFunctions, $message);
self::assertNotContains('preg_match', $calledFunctions, $message);
self::assertNotContains('preg_match_all', $calledFunctions, $message);
self::assertNotContains('preg_replace', $calledFunctions, $message);
self::assertNotContains('preg_replace_callback', $calledFunctions, $message);
self::assertNotContains('preg_split', $calledFunctions, $message);
}

/**
* @dataProvider provideTestClassCases
*/
public function testNoPHPUnitMockUsed(string $testClassName): void
public function testNoPHPUnitMockUsed(string $className): void
{
$tokens = $this->createTokensForClass($testClassName);
$stringTokens = array_filter(
$tokens->toArray(),
static fn (Token $token): bool => $token->isGivenKind(T_STRING)
);
$calledFunctions = $this->extractFunctionNamesCalledInClass($className);

$strings = array_map(
static fn (Token $token): string => $token->getContent(),
$stringTokens
);
$strings = array_unique($strings);

$message = sprintf('Class %s must not use PHPUnit\'s mock, it shall use anonymous class instead.', $testClassName);
self::assertNotContains('getMockBuilder', $strings, $message);
self::assertNotContains('createMock', $strings, $message);
self::assertNotContains('createMockForIntersectionOfInterfaces', $strings, $message);
self::assertNotContains('createPartialMock', $strings, $message);
self::assertNotContains('createTestProxy', $strings, $message);
self::assertNotContains('getMockForAbstractClass', $strings, $message);
self::assertNotContains('getMockFromWsdl', $strings, $message);
self::assertNotContains('getMockForTrait', $strings, $message);
self::assertNotContains('getMockClass', $strings, $message);
self::assertNotContains('createConfiguredMock', $strings, $message);
self::assertNotContains('getObjectForTrait', $strings, $message);
$message = sprintf('Class %s must not use PHPUnit\'s mock, it shall use anonymous class instead.', $className);
self::assertNotContains('getMockBuilder', $calledFunctions, $message);
self::assertNotContains('createMock', $calledFunctions, $message);
self::assertNotContains('createMockForIntersectionOfInterfaces', $calledFunctions, $message);
self::assertNotContains('createPartialMock', $calledFunctions, $message);
self::assertNotContains('createTestProxy', $calledFunctions, $message);
self::assertNotContains('getMockForAbstractClass', $calledFunctions, $message);
self::assertNotContains('getMockFromWsdl', $calledFunctions, $message);
self::assertNotContains('getMockForTrait', $calledFunctions, $message);
self::assertNotContains('getMockClass', $calledFunctions, $message);
self::assertNotContains('createConfiguredMock', $calledFunctions, $message);
self::assertNotContains('getObjectForTrait', $calledFunctions, $message);
}

/**
Expand Down Expand Up @@ -829,6 +808,26 @@ public function testConstantsAreInUpperCase(string $className): void
}
}

/**
* @return list<string>
*/
private function extractFunctionNamesCalledInClass(string $className): array
{
$tokens = $this->createTokensForClass($className);

$stringTokens = array_filter(
$tokens->toArray(),
static fn (Token $token): bool => $token->isGivenKind(T_STRING)
);

$strings = array_map(
static fn (Token $token): string => $token->getContent(),
$stringTokens
);

return array_unique($strings);
}

private function createTokensForClass(string $className): Tokens
{
$file = $className;
Expand Down

0 comments on commit 867ef67

Please sign in to comment.