diff --git a/tests/aot/symfony/dynamic-enum-tryfrom-throw.phpt b/tests/aot/symfony/dynamic-enum-tryfrom-throw.phpt new file mode 100644 index 00000000..27b69ff1 --- /dev/null +++ b/tests/aot/symfony/dynamic-enum-tryfrom-throw.phpt @@ -0,0 +1,57 @@ +--TEST-- +Symfony pattern: dynamic BackedEnum tryFrom with coalesce throw +--FILE-- +typeName) { + return $value; + } + + if (!is_string($value) && !is_int($value)) { + throw new InvalidArgumentException(get_debug_type($value)); + } + + return $argument->typeName::tryFrom($value) + ?? throw new InvalidArgumentException(sprintf('Invalid "%s" value "%s".', $argument->name, $value)); +} + +function main(): void +{ + $argument = new Argument('priority', Priority::class, [1, 10]); + + var_dump(resolveEnum($argument, 10)); + var_dump(resolveEnum($argument, Priority::Low)); + + try { + resolveEnum($argument, 2); + } catch (InvalidArgumentException $e) { + echo $e->getMessage(), "\n"; + } +} +?> +--EXPECT-- +enum(Priority::High) +enum(Priority::Low) +Invalid "priority" value "2". diff --git a/tests/aot/symfony/lazy-listener-self-replacing-closure.phpt b/tests/aot/symfony/lazy-listener-self-replacing-closure.phpt new file mode 100644 index 00000000..b3756b4d --- /dev/null +++ b/tests/aot/symfony/lazy-listener-self-replacing-closure.phpt @@ -0,0 +1,45 @@ +--TEST-- +Symfony pattern: lazy listener closure replaces itself with first-class callable +--FILE-- + +--EXPECT-- +factory +handle:first +string(5) "FIRST" +handle:second +string(6) "SECOND" +string(8) "__invoke" diff --git a/tests/aot/symfony/nested-array-merge-unpack-method-call.phpt b/tests/aot/symfony/nested-array-merge-unpack-method-call.phpt new file mode 100644 index 00000000..5a32b6e8 --- /dev/null +++ b/tests/aot/symfony/nested-array-merge-unpack-method-call.phpt @@ -0,0 +1,71 @@ +--TEST-- +Symfony pattern: nested array_merge unpack passed to method variadic +--FILE-- +groups; + } + + public function with(string ...$stamps): self + { + $groups = $this->groups; + $groups['added'] = $stamps; + + return new self($groups); + } + + public function flat(): array + { + return array_merge(...array_values($this->groups)); + } +} + +function mergeStamps(Envelope $decodedEnvelope, Envelope $failedEnvelope): Envelope +{ + return $decodedEnvelope->with(...array_merge(...array_values($failedEnvelope->all()))); +} + +function main(): void +{ + $failed = new Envelope([ + 'first' => ['red', 'blue'], + 'second' => ['green'], + ]); + $decoded = new Envelope([ + 'decoded' => ['base'], + ]); + + var_dump(mergeStamps($decoded, $failed)->flat()); + var_dump(array_unique(array_merge(...array_values([ + 'bus-a' => ['json', 'php'], + 'bus-b' => ['json', 'xml'], + ])))); +} +?> +--EXPECT-- +array(4) { + [0]=> + string(4) "base" + [1]=> + string(3) "red" + [2]=> + string(4) "blue" + [3]=> + string(5) "green" +} +array(3) { + [0]=> + string(4) "json" + [1]=> + string(3) "php" + [3]=> + string(3) "xml" +} diff --git a/tests/aot/symfony/nullsafe-array-dim-short-circuit.phpt b/tests/aot/symfony/nullsafe-array-dim-short-circuit.phpt new file mode 100644 index 00000000..b979add8 --- /dev/null +++ b/tests/aot/symfony/nullsafe-array-dim-short-circuit.phpt @@ -0,0 +1,53 @@ +--TEST-- +Symfony pattern: array dim nullsafe call with boolean short-circuit +--FILE-- +completed; + } + + public function complete(): void + { + echo "complete\n"; + $this->completed = true; + } +} + +final class Multi +{ + public array $openHandles = []; +} + +function cancelHandle(Multi $multi, string $id): void +{ + $multi->openHandles[$id]?->isComplete() || $multi->openHandles[$id]?->complete(); +} + +function main(): void +{ + $multi = new Multi(); + $multi->openHandles['a'] = new DeferredFuture(); + + cancelHandle($multi, 'a'); + var_dump($multi->openHandles['a']->completed); + + cancelHandle($multi, 'a'); + + $multi->openHandles['b'] = null; + cancelHandle($multi, 'b'); + echo "done\n"; +} +?> +--EXPECT-- +isComplete +complete +bool(true) +isComplete +done