- Add SplObjectStorage promise pool test with clone options - Add __serialize/__unserialize parent state destructuring test - Add null coalesce assignment in comparison condition test - Add match(true) condition with assignment and negation testpull/15/head
parent
748eb37e99
commit
19d74e459d
4 changed files with 203 additions and 0 deletions
@ -0,0 +1,72 @@ |
||||
--TEST-- |
||||
Symfony HttpClient style SplObjectStorage promise pool with clone options |
||||
--ENV-- |
||||
USE_ZEND_ALLOC=0 |
||||
--FILE-- |
||||
<?php |
||||
class SymfonyHttpClientPoolCase |
||||
{ |
||||
private ?SplObjectStorage $promisePool; |
||||
private bool $autoUpgradeHttpVersion = true; |
||||
private array $options = []; |
||||
|
||||
public function __construct() |
||||
{ |
||||
$this->promisePool = class_exists(SplObjectStorage::class) ? new SplObjectStorage() : null; |
||||
} |
||||
|
||||
public function withOptions(array $options): static |
||||
{ |
||||
$clone = clone $this; |
||||
if (array_key_exists('auto_upgrade_http_version', $options)) { |
||||
$clone->autoUpgradeHttpVersion = $options['auto_upgrade_http_version']; |
||||
unset($options['auto_upgrade_http_version']); |
||||
} |
||||
$clone->options = $options; |
||||
|
||||
return $clone; |
||||
} |
||||
|
||||
public function remember(object $response, object $request, object $promise): void |
||||
{ |
||||
$this->promisePool?->attach($response, [$request, $promise]); |
||||
} |
||||
|
||||
public function resolve(object $response): string |
||||
{ |
||||
if (!$this->promisePool?->contains($response)) { |
||||
return 'missing'; |
||||
} |
||||
|
||||
[$request, $promise] = $this->promisePool[$response]; |
||||
|
||||
return $request->name . ':' . $promise->name; |
||||
} |
||||
|
||||
public function describe(): string |
||||
{ |
||||
return ($this->autoUpgradeHttpVersion ? 'auto' : 'manual') . ':' . implode(',', array_keys($this->options)); |
||||
} |
||||
} |
||||
|
||||
function main(): void |
||||
{ |
||||
$client = new SymfonyHttpClientPoolCase(); |
||||
$response = (object) ['name' => 'response']; |
||||
$request = (object) ['name' => 'request']; |
||||
$promise = (object) ['name' => 'promise']; |
||||
|
||||
$client->remember($response, $request, $promise); |
||||
var_dump($client->resolve($response)); |
||||
var_dump($client->resolve((object) ['name' => 'other'])); |
||||
|
||||
$clone = $client->withOptions(['auto_upgrade_http_version' => false, 'timeout' => 3]); |
||||
var_dump($client->describe()); |
||||
var_dump($clone->describe()); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
string(15) "request:promise" |
||||
string(7) "missing" |
||||
string(5) "auto:" |
||||
string(14) "manual:timeout" |
||||
@ -0,0 +1,78 @@ |
||||
--TEST-- |
||||
Symfony Mime style __serialize/__unserialize with parent state and array destructuring |
||||
--XFAIL-- |
||||
Known AOT bug: parent::__unserialize() does not restore parent private state in this pattern. |
||||
--FILE-- |
||||
<?php |
||||
class SymfonyMimeParentMessage |
||||
{ |
||||
private array $headers = []; |
||||
|
||||
public function header(string $name, string $value): void |
||||
{ |
||||
$this->headers[$name] = $value; |
||||
} |
||||
|
||||
public function getHeader(string $name): ?string |
||||
{ |
||||
return $this->headers[$name] ?? null; |
||||
} |
||||
|
||||
public function __serialize(): array |
||||
{ |
||||
return [$this->headers]; |
||||
} |
||||
|
||||
public function __unserialize(array $data): void |
||||
{ |
||||
[$this->headers] = $data; |
||||
} |
||||
} |
||||
|
||||
class SymfonyMimeEmailCase extends SymfonyMimeParentMessage |
||||
{ |
||||
private ?string $text = null; |
||||
private ?string $textCharset = null; |
||||
private ?string $html = null; |
||||
private ?string $htmlCharset = null; |
||||
private array $attachments = []; |
||||
|
||||
public function configure(): void |
||||
{ |
||||
$this->text = 'text body'; |
||||
$this->textCharset = 'utf-8'; |
||||
$this->html = '<b>html</b>'; |
||||
$this->htmlCharset = 'utf-8'; |
||||
$this->attachments = ['a.txt', 'b.txt']; |
||||
$this->header('Subject', 'demo'); |
||||
} |
||||
|
||||
public function __serialize(): array |
||||
{ |
||||
return [$this->text, $this->textCharset, $this->html, $this->htmlCharset, $this->attachments, parent::__serialize()]; |
||||
} |
||||
|
||||
public function __unserialize(array $data): void |
||||
{ |
||||
[$this->text, $this->textCharset, $this->html, $this->htmlCharset, $this->attachments, $parentData] = $data; |
||||
|
||||
parent::__unserialize($parentData); |
||||
} |
||||
|
||||
public function summary(): string |
||||
{ |
||||
return $this->text . '|' . $this->html . '|' . $this->getHeader('Subject') . '|' . count($this->attachments); |
||||
} |
||||
} |
||||
|
||||
function main(): void |
||||
{ |
||||
$email = new SymfonyMimeEmailCase(); |
||||
$email->configure(); |
||||
|
||||
$restored = unserialize(serialize($email)); |
||||
var_dump($restored->summary()); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
string(28) "text body|<b>html</b>|demo|2" |
||||
@ -0,0 +1,29 @@ |
||||
--TEST-- |
||||
Symfony String style coalesce assignment in comparison condition |
||||
--FILE-- |
||||
<?php |
||||
function symfony_string_split_limit(?int $limit = null): int |
||||
{ |
||||
if (1 > $limit ??= PHP_INT_MAX) { |
||||
throw new InvalidArgumentException('Split limit must be a positive integer.'); |
||||
} |
||||
|
||||
return $limit; |
||||
} |
||||
|
||||
function main(): void |
||||
{ |
||||
var_dump(symfony_string_split_limit()); |
||||
var_dump(symfony_string_split_limit(2)); |
||||
|
||||
try { |
||||
symfony_string_split_limit(0); |
||||
} catch (InvalidArgumentException $e) { |
||||
echo $e->getMessage(), "\n"; |
||||
} |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
int(9223372036854775807) |
||||
int(2) |
||||
Split limit must be a positive integer. |
||||
@ -0,0 +1,24 @@ |
||||
--TEST-- |
||||
Symfony Yaml style match(true) condition with assignment and negation |
||||
--FILE-- |
||||
<?php |
||||
function symfony_yaml_datetime_format(DateTimeInterface $value): string |
||||
{ |
||||
return $value->format(match (true) { |
||||
!$length = strlen(rtrim($value->format('u'), '0')) => 'c', |
||||
$length < 4 => 'Y-m-d\TH:i:s.vP', |
||||
default => 'Y-m-d\TH:i:s.uP', |
||||
}); |
||||
} |
||||
|
||||
function main(): void |
||||
{ |
||||
var_dump(symfony_yaml_datetime_format(new DateTimeImmutable('2024-01-02T03:04:05+00:00'))); |
||||
var_dump(symfony_yaml_datetime_format(new DateTimeImmutable('2024-01-02T03:04:05.120000+00:00'))); |
||||
var_dump(symfony_yaml_datetime_format(new DateTimeImmutable('2024-01-02T03:04:05.123456+00:00'))); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
string(25) "2024-01-02T03:04:05+00:00" |
||||
string(29) "2024-01-02T03:04:05.120+00:00" |
||||
string(32) "2024-01-02T03:04:05.123456+00:00" |
||||
Loading…
Reference in new issue