- Add test for AssetMapper style match statement with nullsafe side effect and throw arm - Add test for Finder style lazy iterator using yield from callable property invocation - Add test for HttpFoundation style static reflection cache with coalesce assignment operator - Include proper skip conditions for unsupported features - Verify correct behavior of Symfony-style PHP constructs in AOT compilationpull/15/head
parent
ec4a12f122
commit
748eb37e99
3 changed files with 134 additions and 0 deletions
@ -0,0 +1,62 @@ |
|||||||
|
--TEST-- |
||||||
|
Symfony AssetMapper style match statement with nullsafe side effect and throw arm |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
interface SymfonyMissingImportLogger |
||||||
|
{ |
||||||
|
public function warning(string $message): void; |
||||||
|
} |
||||||
|
|
||||||
|
class SymfonyMissingImportMemoryLogger implements SymfonyMissingImportLogger |
||||||
|
{ |
||||||
|
public array $messages = []; |
||||||
|
|
||||||
|
public function warning(string $message): void |
||||||
|
{ |
||||||
|
$this->messages[] = $message; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class SymfonyMissingImportHandler |
||||||
|
{ |
||||||
|
public const IGNORE = 'ignore'; |
||||||
|
public const WARN = 'warn'; |
||||||
|
public const STRICT = 'strict'; |
||||||
|
|
||||||
|
public function __construct( |
||||||
|
private string $mode, |
||||||
|
private ?SymfonyMissingImportLogger $logger = null, |
||||||
|
) { |
||||||
|
} |
||||||
|
|
||||||
|
public function handle(string $message): void |
||||||
|
{ |
||||||
|
match ($this->mode) { |
||||||
|
self::IGNORE => null, |
||||||
|
self::WARN => $this->logger?->warning($message), |
||||||
|
self::STRICT => throw new RuntimeException($message), |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function main(): void |
||||||
|
{ |
||||||
|
$logger = new SymfonyMissingImportMemoryLogger(); |
||||||
|
(new SymfonyMissingImportHandler(SymfonyMissingImportHandler::IGNORE))->handle('ignored'); |
||||||
|
(new SymfonyMissingImportHandler(SymfonyMissingImportHandler::WARN, $logger))->handle('missing.js'); |
||||||
|
|
||||||
|
var_dump($logger->messages); |
||||||
|
|
||||||
|
try { |
||||||
|
(new SymfonyMissingImportHandler(SymfonyMissingImportHandler::STRICT))->handle('strict.js'); |
||||||
|
} catch (RuntimeException $e) { |
||||||
|
echo $e->getMessage(), "\n"; |
||||||
|
} |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
array(1) { |
||||||
|
[0]=> |
||||||
|
string(10) "missing.js" |
||||||
|
} |
||||||
|
strict.js |
||||||
@ -0,0 +1,36 @@ |
|||||||
|
--TEST-- |
||||||
|
Symfony Finder style lazy iterator: yield from callable property invocation |
||||||
|
--SKIPIF-- |
||||||
|
<?php exit('skip Expr_YieldFrom is not supported yet'); ?> |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
class SymfonyLazyIteratorCase implements IteratorAggregate |
||||||
|
{ |
||||||
|
private Closure $iteratorFactory; |
||||||
|
|
||||||
|
public function __construct(callable $iteratorFactory) |
||||||
|
{ |
||||||
|
$this->iteratorFactory = $iteratorFactory(...); |
||||||
|
} |
||||||
|
|
||||||
|
public function getIterator(): Traversable |
||||||
|
{ |
||||||
|
yield from ($this->iteratorFactory)(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function main(): void |
||||||
|
{ |
||||||
|
$iterator = new SymfonyLazyIteratorCase(static function (): Traversable { |
||||||
|
yield 'first' => 'alpha'; |
||||||
|
yield 'second' => 'beta'; |
||||||
|
}); |
||||||
|
|
||||||
|
foreach ($iterator as $key => $value) { |
||||||
|
echo $key, '=', $value, "\n"; |
||||||
|
} |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
first=alpha |
||||||
|
second=beta |
||||||
@ -0,0 +1,36 @@ |
|||||||
|
--TEST-- |
||||||
|
Symfony HttpFoundation style static reflection cache with coalesce assignment |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
class SymfonyReflectionCacheResponse |
||||||
|
{ |
||||||
|
private string $statusText = 'initial'; |
||||||
|
|
||||||
|
public function getStatusText(): string |
||||||
|
{ |
||||||
|
return $this->statusText; |
||||||
|
} |
||||||
|
|
||||||
|
public static function setProperty(self $response, string $name, mixed $value): void |
||||||
|
{ |
||||||
|
static $cache; |
||||||
|
|
||||||
|
$property = $cache[$name] ??= new ReflectionProperty(self::class, $name); |
||||||
|
$property->setValue($response, $value); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function main(): void |
||||||
|
{ |
||||||
|
$response = new SymfonyReflectionCacheResponse(); |
||||||
|
|
||||||
|
SymfonyReflectionCacheResponse::setProperty($response, 'statusText', 'created'); |
||||||
|
var_dump($response->getStatusText()); |
||||||
|
|
||||||
|
SymfonyReflectionCacheResponse::setProperty($response, 'statusText', 'accepted'); |
||||||
|
var_dump($response->getStatusText()); |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
string(7) "created" |
||||||
|
string(8) "accepted" |
||||||
Loading…
Reference in new issue