This commit is contained in:
Marek
2026-03-24 00:04:55 +01:00
commit c5229e48ed
4225 changed files with 511461 additions and 0 deletions

View File

@@ -0,0 +1,126 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Validator\Test;
use PHPUnit\Framework\ExpectationFailedException;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Translation\IdentityTranslator;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\Compound;
use Symfony\Component\Validator\Constraints\CompoundValidator;
use Symfony\Component\Validator\ConstraintViolationListInterface;
use Symfony\Component\Validator\Context\ExecutionContext;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Validation;
use Symfony\Component\Validator\Validator\ValidatorInterface;
/**
* A test case to ease testing Compound Constraints.
*
* @author Alexandre Daubois <alex.daubois@gmail.com>
*
* @template T of Compound
*/
abstract class CompoundConstraintTestCase extends TestCase
{
protected ValidatorInterface $validator;
protected ?ConstraintViolationListInterface $violationList = null;
protected ExecutionContextInterface $context;
protected mixed $root;
private mixed $validatedValue;
protected function setUp(): void
{
$this->root = 'root';
$this->validator = $this->createValidator();
$this->context = $this->createContext($this->validator);
}
protected function validateValue(mixed $value): void
{
$this->validator->inContext($this->context)->validate($this->validatedValue = $value, $this->createCompound());
}
protected function createValidator(): ValidatorInterface
{
return Validation::createValidator();
}
protected function createContext(?ValidatorInterface $validator = null): ExecutionContextInterface
{
return new ExecutionContext($validator ?? $this->createValidator(), $this->root, new IdentityTranslator());
}
public function assertViolationsRaisedByCompound(Constraint|array $constraints): void
{
if ($constraints instanceof Constraint) {
$constraints = [$constraints];
}
$validator = new CompoundValidator();
$context = $this->createContext();
$validator->initialize($context);
$validator->validate($this->validatedValue, new class($constraints) extends Compound {
public function __construct(private array $testedConstraints)
{
parent::__construct();
}
protected function getConstraints(array $options): array
{
return $this->testedConstraints;
}
});
$expectedViolations = iterator_to_array($context->getViolations());
if (!$expectedViolations) {
throw new ExpectationFailedException(\sprintf('Expected at least one violation for constraint(s) "%s", got none raised.', implode(', ', array_map(fn ($constraint) => $constraint::class, $constraints))));
}
$failedToAssertViolations = [];
reset($expectedViolations);
foreach ($this->context->getViolations() as $violation) {
if ($violation != current($expectedViolations)) {
$failedToAssertViolations[] = $violation;
}
next($expectedViolations);
}
$this->assertSame(
[],
$failedToAssertViolations,
\sprintf('Expected violation(s) for constraint(s) %s to be raised by compound.',
implode(', ', array_map(fn ($violation) => ($violation->getConstraint())::class, $failedToAssertViolations))
)
);
}
public function assertViolationsCount(int $count): void
{
$this->assertCount($count, $this->context->getViolations());
}
protected function assertNoViolation(): void
{
$violationsCount = \count($this->context->getViolations());
$this->assertSame(0, $violationsCount, \sprintf('No violation expected. Got %d.', $violationsCount));
}
/**
* @return T
*/
abstract protected function createCompound(): Compound;
}