MNT Add generic arguments to Extension, bootstrap Silverstripe for phpstan tests
This commit is contained in:
parent
74a088654f
commit
1c01e52415
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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'];
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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
|
||||
{
|
||||
}
|
|
@ -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
|
||||
{
|
||||
}
|
|
@ -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()
|
||||
);
|
|
@ -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) {
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
parameters:
|
||||
bootstrapFiles:
|
||||
- phpstan-bootstrap.php
|
Loading…
Reference in New Issue