MNT Add generic arguments to Extension, bootstrap Silverstripe for phpstan tests

This commit is contained in:
Cameron Bryers 2023-11-15 15:11:16 +13:00
parent 74a088654f
commit 1c01e52415
No known key found for this signature in database
GPG Key ID: 8B8933A3D208A3F4
10 changed files with 166 additions and 3 deletions

View File

@ -13,6 +13,8 @@ use SilverStripe\ORM\DataObject;
* Every object instance gets its own set of extension instances,
* meaning you can set parameters specific to the "owner instance"
* in new Extension instances.
*
* @template T of object
*/
abstract class Extension
{
@ -25,7 +27,7 @@ abstract class Extension
/**
* The object this extension is applied to.
*
* @var Object
* @var T
*/
protected $owner;
@ -95,7 +97,7 @@ abstract class Extension
/**
* Returns the owner of this extension.
*
* @return Object
* @return T
*/
public function getOwner()
{

View File

@ -13,7 +13,8 @@ use Exception;
/**
* An extension that adds additional functionality to a {@link DataObject}.
*
* @property DataObject $owner
* @template T of DataObject
* @extends Extension<T|static>
*/
abstract class DataExtension extends Extension
{

View File

@ -0,0 +1,62 @@
<?php
namespace SilverStripe\Type\Tests;
use Generator;
use PHPStan\Testing\TypeInferenceTestCase;
use SilverStripe\Core\Config\Config;
use SilverStripe\Type\Tests\Source\ExtensibleMockOne;
use SilverStripe\Type\Tests\Source\ExtensibleMockTwo;
use SilverStripe\Type\Tests\Source\ExtensionMockOne;
use SilverStripe\Type\Tests\Source\ExtensionMockTwo;
use function glob;
class ExtensionTypeTest extends TypeInferenceTestCase
{
public function setUp(): void
{
parent::setUp();
Config::modify()->merge(
ExtensibleMockOne::class,
'extensions',
[
ExtensionMockOne::class,
ExtensionMockTwo::class,
]
);
Config::modify()->merge(
ExtensibleMockTwo::class,
'extensions',
[
ExtensionMockTwo::class,
]
);
}
public function typeFileAsserts(): Generator
{
$typeTests = glob(__DIR__ . '/data/extension-types.php') ?: [];
foreach ($typeTests as $typeTest) {
yield from $this->gatherAssertTypes($typeTest);
}
}
/**
* @dataProvider typeFileAsserts
*/
public function testFileAsserts(string $assertType, string $file, mixed ...$args): void
{
$this->assertFileAsserts($assertType, $file, ...$args);
}
/**
* @return string[]
*/
public static function getAdditionalConfigFiles(): array
{
return [__DIR__ . '/phpstan.neon.dist'];
}
}

View File

@ -0,0 +1,13 @@
<?php
namespace SilverStripe\Type\Tests\Source;
use SilverStripe\Core\Config\Configurable;
use SilverStripe\Core\Extensible;
use SilverStripe\Dev\TestOnly;
class ExtensibleMockOne implements TestOnly
{
use Extensible;
use Configurable;
}

View File

@ -0,0 +1,13 @@
<?php
namespace SilverStripe\Type\Tests\Source;
use SilverStripe\Core\Config\Configurable;
use SilverStripe\Core\Extensible;
use SilverStripe\Dev\TestOnly;
class ExtensibleMockTwo implements TestOnly
{
use Extensible;
use Configurable;
}

View File

@ -0,0 +1,13 @@
<?php
namespace SilverStripe\Type\Tests\Source;
use SilverStripe\Core\Extension;
use SilverStripe\Dev\TestOnly;
/**
* @extends Extension<ExtensibleMockOne|static>
*/
class ExtensionMockOne extends Extension implements TestOnly
{
}

View File

@ -0,0 +1,13 @@
<?php
namespace SilverStripe\Type\Tests\Source;
use SilverStripe\Core\Extension;
use SilverStripe\Dev\TestOnly;
/**
* @extends Extension<ExtensibleMockOne|ExtensibleMockTwo|static>
*/
class ExtensionMockTwo extends Extension implements TestOnly
{
}

View File

@ -0,0 +1,28 @@
<?php
namespace SilverStripe\Type\Tests\data;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Type\Tests\Source\ExtensibleMockOne;
use SilverStripe\Type\Tests\Source\ExtensibleMockTwo;
use SilverStripe\Type\Tests\Source\ExtensionMockOne;
use SilverStripe\Type\Tests\Source\ExtensionMockTwo;
use function PHPStan\Testing\assertType;
$extensionOne = Injector::inst()->get(ExtensionMockOne::class);
$extensionTwo = Injector::inst()->get(ExtensionMockTwo::class);
assertType(
sprintf('%s|static(%s)', ExtensibleMockOne::class, ExtensionMockOne::class),
$extensionOne->getOwner()
);
assertType(
sprintf(
'%s|%s|static(%s)',
ExtensibleMockOne::class,
ExtensibleMockTwo::class,
ExtensionMockTwo::class
),
$extensionTwo->getOwner()
);

View File

@ -0,0 +1,15 @@
<?php
use SilverStripe\Core\DatabaselessKernel;
$kernel = new class(BASE_PATH) extends DatabaselessKernel {
public function getIncludeTests()
{
return true;
}
};
try {
$kernel->boot();
} catch (\Throwable) {
}

View File

@ -0,0 +1,3 @@
parameters:
bootstrapFiles:
- phpstan-bootstrap.php