‪TYPO3CMS  ‪main
testMethodPrefixChecker.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 use PhpParser\Node;
6 use PhpParser\NodeTraverser;
7 use PhpParser\NodeVisitorAbstract;
8 use PhpParser\ParserFactory;
9 use PhpParser\PhpVersion;
10 use Symfony\Component\Console\Output\ConsoleOutput;
11 
12 require_once __DIR__ . '/../../vendor/autoload.php';
13 
22 class NodeVisitor extends NodeVisitorAbstract
23 {
24  public array ‪$matches = [];
25 
26  public function ‪enterNode(Node $node): void
27  {
28  if (($node instanceof Node\Stmt\ClassMethod) && str_starts_with($node->name->name, 'test')) {
29  $this->matches[$node->getLine()] = $node->name->name;
30  }
31  }
32 }
33 
34 ‪$parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
35 
36 ‪$finder = new Symfony\Component\Finder\Finder();
37 ‪$finder->files()
38  ->in([
39  __DIR__ . '/../../typo3/sysext/*/Tests/Unit/',
40  __DIR__ . '/../../typo3/sysext/*/Tests/UnitDeprecated/',
41  __DIR__ . '/../../typo3/sysext/*/Tests/Functional/',
42  ])
43  ->name('/Test\.php$/');
44 
45 ‪$output = new ConsoleOutput();
46 
47 ‪$errors = [];
48 foreach (‪$finder as $file) {
49  try {
50  $ast = ‪$parser->parse($file->getContents());
51  } catch (Error $error) {
52  ‪$output->writeln('<error>Parse error: ' . $error->getMessage() . '</error>');
53  exit(1);
54  }
55 
56  $visitor = new NodeVisitor();
57 
58  $traverser = new NodeTraverser();
59  $traverser->addVisitor($visitor);
60 
61  $ast = $traverser->traverse($ast);
62 
63  if (!empty($visitor->matches)) {
64  ‪$errors[$file->getRealPath()] = $visitor->matches;
65  ‪$output->write('<error>F</error>');
66  } else {
67  ‪$output->write('<fg=green>.</>');
68  }
69 }
70 
71 ‪$output->writeln('');
72 
73 if (!empty(‪$errors)) {
74  ‪$output->writeln('');
75 
76  foreach (‪$errors as $file => $matchesPerLine) {
77  ‪$output->writeln('');
78  ‪$output->writeln('<error>Method shoud not start "test". Use @test phpDoc annotation instead. Found in ' . $file . '</error>');
79 
85  foreach ($matchesPerLine as $line => $methodName) {
86  ‪$output->writeln('Method:' . $methodName . ' Line:' . $line);
87  }
88  }
89  exit(1);
90 }
91 
92 exit(0);
‪NodeVisitor\enterNode
‪enterNode(Node $node)
Definition: testMethodPrefixChecker.php:26
‪$finder
‪$finder
Definition: testMethodPrefixChecker.php:36
‪$errors
‪$errors
Definition: annotationChecker.php:116
‪$output
‪$output
Definition: annotationChecker.php:114
‪NodeVisitor\$matches
‪array $matches
Definition: annotationChecker.php:32
‪$parser
‪$parser
Definition: testMethodPrefixChecker.php:34