Skip to content

Commit

Permalink
Added *Parser unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
staabm committed Oct 6, 2024
1 parent 5bc1277 commit 8798959
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 0 deletions.
69 changes: 69 additions & 0 deletions tests/PHPStan/Parser/ParserTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<?php declare(strict_types = 1);

namespace PHPStan\Parser;

use PHPStan\Testing\PHPStanTestCase;
use PHPStan\TrinaryLogic;

/**
* @covers \PHPStan\Parser\RichParser
* @covers \PHPStan\Parser\SimpleParser
*/
class ParserTest extends PHPStanTestCase
{

public function dataVariadicCallLikes(): iterable
{
yield [
__DIR__ . '/data/variadic-functions.php',
VariadicFunctionsVisitor::ATTRIBUTE_NAME,
[
'VariadicFunctions\variadic_fn1' => TrinaryLogic::createYes(),
'VariadicFunctions\nonvariadic' => TrinaryLogic::createNo(),
'VariadicFunctions\maybe_variadic_fn1' => TrinaryLogic::createNo(),
],
];

yield [
__DIR__ . '/data/variadic-methods.php',
VariadicMethodsVisitor::ATTRIBUTE_NAME,
[
'VariadicMethod\X' => [
'non_variadic_fn1' => TrinaryLogic::createNo(),
'variadic_fn1' => TrinaryLogic::createNo(), // variadicness later on detected via reflection
],
],
];
}

/**
* @dataProvider dataVariadicCallLikes
* @param array<string, TrinaryLogic>|array<string, array<string, TrinaryLogic>> $expectedVariadics
* @throws ParserErrorsException
*/
public function testSimpleParserVariadicCallLikes(string $file, string $attributeName, array $expectedVariadics): void
{
/** @var RichParser $parser */
$parser = self::getContainer()->getService('currentPhpVersionSimpleParser');
$ast = $parser->parseFile($file);
$variadics = $ast[0]->getAttribute($attributeName);
$this->assertIsArray($variadics);
$this->assertSame($expectedVariadics, $variadics);
}

/**
* @dataProvider dataVariadicCallLikes
* @param array<string, TrinaryLogic>|array<string, array<string, TrinaryLogic>> $expectedVariadics
* @throws ParserErrorsException
*/
public function testRichParserVariadicCallLikes(string $file, string $attributeName, array $expectedVariadics): void
{
/** @var RichParser $parser */
$parser = self::getContainer()->getService('currentPhpVersionRichParser');
$ast = $parser->parseFile($file);
$variadics = $ast[0]->getAttribute($attributeName);
$this->assertIsArray($variadics);
$this->assertSame($expectedVariadics, $variadics);
}

}
27 changes: 27 additions & 0 deletions tests/PHPStan/Parser/data/variadic-functions.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace VariadicFunctions;

function variadic_fn1(...$v) {
}

function nonvariadic()
{
}

if (rand(0,1)) {
function maybe_variadic_fn1($v)
{
}
} else {
function maybe_variadic_fn1(...$v)
{
}
}

(function() {})();

$y = 1;
$fn2 = function ($x) use ($y) {
return $x + $y;
};
21 changes: 21 additions & 0 deletions tests/PHPStan/Parser/data/variadic-methods.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace VariadicMethod;

class X {

function non_variadic_fn1($v) {
}

function variadic_fn1(...$v) {
}
}


$x = new class {
function non_variadic_fn1($v) {
}

function variadic_fn1(...$v) {
}
};

0 comments on commit 8798959

Please sign in to comment.