1
0
mirror of https://github.com/danog/psalm.git synced 2024-12-02 17:52:45 +01:00
psalm/tests/FileUpdates/CachedStorageTest.php
Bruce Weirdan d19aad7db1
Display target PHP version
Historically it was often not quite clear to users what PHP version
Psalm assumes, and why. This PR addresses this issue by printing the
version and where we got it from right before scanning the files.
2021-11-27 02:18:09 +02:00

103 lines
3.3 KiB
PHP

<?php
namespace Psalm\Tests\FileUpdates;
use Psalm\Internal\Analyzer\ProjectAnalyzer;
use Psalm\Internal\Provider\FakeFileProvider;
use Psalm\Internal\Provider\Providers;
use Psalm\Tests\Internal\Provider;
use Psalm\Tests\TestConfig;
use function array_keys;
use function getcwd;
use function strpos;
use const DIRECTORY_SEPARATOR;
class CachedStorageTest extends \Psalm\Tests\TestCase
{
public function setUp() : void
{
parent::setUp();
$this->file_provider = new FakeFileProvider();
$config = new TestConfig();
$providers = new Providers(
$this->file_provider,
new Provider\ParserInstanceCacheProvider(),
new Provider\FileStorageInstanceCacheProvider(),
new Provider\ClassLikeStorageInstanceCacheProvider(),
new Provider\FakeFileReferenceCacheProvider(),
new Provider\ProjectCacheProvider()
);
$this->project_analyzer = new ProjectAnalyzer(
$config,
$providers
);
$this->project_analyzer->setPhpVersion('7.3', 'tests');
}
public function testValidInclude(): void
{
$test_name = $this->getTestName();
if (strpos($test_name, 'SKIPPED-') !== false) {
$this->markTestSkipped('Skipped due to a bug.');
}
$this->project_analyzer->getCodebase()->diff_methods = true;
$codebase = $this->project_analyzer->getCodebase();
$vendor_files = [
getcwd() . DIRECTORY_SEPARATOR . 'V1.php' => '<?php
namespace AnotherPackage;
interface StorageInterface {
public function getRecord(): OperationInterface;
}',
getcwd() . DIRECTORY_SEPARATOR . 'V2.php' => '<?php
namespace AnotherPackage;
interface OperationInterface {
public function getResult(): ResultInterface;
}',
getcwd() . DIRECTORY_SEPARATOR . 'V3.php' => '<?php
namespace AnotherPackage;
interface ResultInterface {}',
];
$analyzable_files = [
getcwd() . DIRECTORY_SEPARATOR . 'A.php' => '<?php
use AnotherPackage\StorageInterface;
class C {
/** @var ?StorageInterface */
private $storage;
public function zugzug() : void {
if (!$this->storage) {
return;
}
$result = $this->storage->getRecord()->getResult();
}
}',
];
foreach ($vendor_files as $file_path => $contents) {
$this->file_provider->registerFile($file_path, $contents);
$codebase->scanner->addFilesToShallowScan([$file_path => $file_path]);
}
foreach ($analyzable_files as $file_path => $contents) {
$this->file_provider->registerFile($file_path, $contents);
$codebase->addFilesToAnalyze([$file_path => $file_path]);
}
$codebase->scanFiles();
$codebase->analyzer->analyzeFiles($this->project_analyzer, 1, false);
$codebase->reloadFiles($this->project_analyzer, array_keys($analyzable_files + $vendor_files));
$codebase->analyzer->analyzeFiles($this->project_analyzer, 1, false);
}
}