create(ParserFactory::PREFER_PHP7); $fixtureFile = __DIR__ . '/Fixtures/MethodArgumentRequiredStaticMatcherFixture.php'; $statements = $parser->parse(file_get_contents($fixtureFile)); $traverser = new NodeTraverser(); $traverser->addVisitor(new NameResolver()); $configuration = [ 'TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addNavigationComponent' => [ 'numberOfMandatoryArguments' => 3, 'maximumNumberOfArguments' => 3, 'restFiles' => [ 'Breaking-82899-MoreRestrictingChecksForAPIMethodsInExtensionManagementUtility.rst', ], ], ]; $subject = new MethodArgumentRequiredStaticMatcher($configuration); $traverser->addVisitor($subject); $traverser->traverse($statements); $expectedHitLineNumbers = [ 28, 30, 32, ]; $actualHitLineNumbers = []; foreach ($subject->getMatches() as $hit) { $actualHitLineNumbers[] = $hit['line']; } $this->assertEquals($expectedHitLineNumbers, $actualHitLineNumbers); } /** * @return array */ public function matchesReturnsExpectedRestFilesDataProvider(): array { return [ 'two rest candidates with same number of arguments' => [ [ 'Foo::aMethod' => [ 'numberOfMandatoryArguments' => 1, 'maximumNumberOfArguments' => 1, 'restFiles' => [ 'Foo-1.rst', 'Foo-2.rst', ], ], 'Bar::aMethod' => [ 'numberOfMandatoryArguments' => 1, 'maximumNumberOfArguments' => 1, 'restFiles' => [ 'Bar-1.rst', 'Bar-2.rst', ], ], ], ' [ 'restFiles' => [ 'Foo-1.rst', 'Foo-2.rst', 'Bar-1.rst', 'Bar-2.rst', ], ], ], ], 'three candidates, first and second hits' => [ [ 'Foo::aMethod' => [ 'numberOfMandatoryArguments' => 3, 'maximumNumberOfArguments' => 3, 'restFiles' => [ 'Foo-1.rst', ], ], 'Bar::aMethod' => [ 'numberOfMandatoryArguments' => 3, 'maximumNumberOfArguments' => 3, 'restFiles' => [ 'Bar-1.rst', ], ], 'FooBar::aMethod' => [ 'numberOfMandatoryArguments' => 2, 'maximumNumberOfArguments' => 3, 'restFiles' => [ 'FooBar-1.rst', ], ], ], ' [ 'restFiles' => [ 'Foo-1.rst', 'Bar-1.rst', ], ], ], ], 'one candidate, does not hit, enough arguments given' => [ [ 'Foo::aMethod' => [ 'numberOfMandatoryArguments' => 1, 'maximumNumberOfArguments' => 1, 'restFiles' => [ 'Foo-1.rst', ], ], ], ' [ [ 'Foo::aMethod' => [ 'numberOfMandatoryArguments' => 1, 'maximumNumberOfArguments' => 1, 'restFiles' => [ 'Foo-1.rst', ], ], ], ' [ [ 'Foo::aMethod' => [ 'numberOfMandatoryArguments' => 1, 'maximumNumberOfArguments' => 1, 'restFiles' => [ 'aRest.rst', ], ], 'Bar::aMethod' => [ 'numberOfMandatoryArguments' => 1, 'maximumNumberOfArguments' => 1, 'restFiles' => [ 'aRest.rst', ], ], ], ' [ 'restFiles' => [ 'aRest.rst', ], ], ], ], ]; } /** * @test * @dataProvider matchesReturnsExpectedRestFilesDataProvider * @param array $configuration * @param string $phpCode * @param array $expected */ public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected) { $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7); $statements = $parser->parse($phpCode); $subject = new MethodArgumentRequiredStaticMatcher($configuration); $traverser = new NodeTraverser(); $traverser->addVisitor($subject); $traverser->traverse($statements); $result = $subject->getMatches(); if (isset($expected[0], $result[0])) { $this->assertEquals($expected[0]['restFiles'], $result[0]['restFiles']); } else { $this->assertEquals($expected, $result); } } }