diff --git a/src/Symfony/Bridge/PhpUnit/ConstraintTrait.php b/src/Symfony/Bridge/PhpUnit/ConstraintTrait.php index 64b24ee166858..446dbf2f4fe03 100644 --- a/src/Symfony/Bridge/PhpUnit/ConstraintTrait.php +++ b/src/Symfony/Bridge/PhpUnit/ConstraintTrait.php @@ -20,9 +20,19 @@ trait ConstraintTrait { use Legacy\ConstraintTraitForV6; } -} else { +} elseif ($r->getProperty('exporter')->isProtected()) { trait ConstraintTrait { use Legacy\ConstraintTraitForV7; } +} elseif (\PHP_VERSION < 70100 || !$r->getMethod('evaluate')->hasReturnType()) { + trait ConstraintTrait + { + use Legacy\ConstraintTraitForV8; + } +} else { + trait ConstraintTrait + { + use Legacy\ConstraintTraitForV9; + } } diff --git a/src/Symfony/Bridge/PhpUnit/Legacy/ConstraintLogicTrait.php b/src/Symfony/Bridge/PhpUnit/Legacy/ConstraintLogicTrait.php new file mode 100644 index 0000000000000..e124358c4f724 --- /dev/null +++ b/src/Symfony/Bridge/PhpUnit/Legacy/ConstraintLogicTrait.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\PhpUnit\Legacy; + +/** + * @internal + */ +trait ConstraintLogicTrait +{ + private function doEvaluate($other, $description, $returnResult) + { + $success = false; + + if ($this->matches($other)) { + $success = true; + } + + if ($returnResult) { + return $success; + } + + if (!$success) { + $this->fail($other, $description); + } + + return null; + } + + private function doAdditionalFailureDescription($other): string + { + return ''; + } + + private function doCount(): int + { + return 1; + } + + private function doFailureDescription($other): string + { + return $this->exporter()->export($other).' '.$this->toString(); + } + + private function doMatches($other): bool + { + return false; + } + + private function doToString(): string + { + return ''; + } +} diff --git a/src/Symfony/Bridge/PhpUnit/Legacy/ConstraintTraitForV6.php b/src/Symfony/Bridge/PhpUnit/Legacy/ConstraintTraitForV6.php index 71b7c3c39d738..53819e4b3c4d7 100644 --- a/src/Symfony/Bridge/PhpUnit/Legacy/ConstraintTraitForV6.php +++ b/src/Symfony/Bridge/PhpUnit/Legacy/ConstraintTraitForV6.php @@ -18,6 +18,14 @@ */ trait ConstraintTraitForV6 { + /** + * @return bool|null + */ + public function evaluate($other, $description = '', $returnResult = false) + { + return $this->doEvaluate($other, $description, $returnResult); + } + /** * @return int */ @@ -86,6 +94,25 @@ private function doCount() return 1; } + private function doEvaluate($other, $description, $returnResult) + { + $success = false; + + if ($this->matches($other)) { + $success = true; + } + + if ($returnResult) { + return $success; + } + + if (!$success) { + $this->fail($other, $description); + } + + return null; + } + private function doFailureDescription($other) { return $this->exporter()->export($other).' '.$this->toString(); diff --git a/src/Symfony/Bridge/PhpUnit/Legacy/ConstraintTraitForV7.php b/src/Symfony/Bridge/PhpUnit/Legacy/ConstraintTraitForV7.php index 48c79a76dd0cf..f915d763befe1 100644 --- a/src/Symfony/Bridge/PhpUnit/Legacy/ConstraintTraitForV7.php +++ b/src/Symfony/Bridge/PhpUnit/Legacy/ConstraintTraitForV7.php @@ -16,6 +16,16 @@ */ trait ConstraintTraitForV7 { + use ConstraintLogicTrait; + + /** + * @return bool|null + */ + public function evaluate($other, $description = '', $returnResult = false) + { + return $this->doEvaluate($other, $description, $returnResult); + } + public function count(): int { return $this->doCount(); @@ -40,29 +50,4 @@ protected function matches($other): bool { return $this->doMatches($other); } - - private function doAdditionalFailureDescription($other): string - { - return ''; - } - - private function doCount(): int - { - return 1; - } - - private function doFailureDescription($other): string - { - return $this->exporter()->export($other).' '.$this->toString(); - } - - private function doMatches($other): bool - { - return false; - } - - private function doToString(): string - { - return ''; - } } diff --git a/src/Symfony/Bridge/PhpUnit/Legacy/ConstraintTraitForV8.php b/src/Symfony/Bridge/PhpUnit/Legacy/ConstraintTraitForV8.php new file mode 100644 index 0000000000000..d31cc1215877b --- /dev/null +++ b/src/Symfony/Bridge/PhpUnit/Legacy/ConstraintTraitForV8.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\PhpUnit\Legacy; + +/** + * @internal + */ +trait ConstraintTraitForV8 +{ + use ConstraintLogicTrait; + + /** + * @return bool|null + */ + public function evaluate($other, $description = '', $returnResult = false) + { + return $this->doEvaluate($other, $description, $returnResult); + } + + public function count(): int + { + return $this->doCount(); + } + + public function toString(): string + { + return $this->doToString(); + } + + protected function additionalFailureDescription($other): string + { + return $this->doAdditionalFailureDescription($other); + } + + protected function failureDescription($other): string + { + return $this->doFailureDescription($other); + } + + protected function matches($other): bool + { + return $this->doMatches($other); + } +} diff --git a/src/Symfony/Bridge/PhpUnit/Legacy/ConstraintTraitForV9.php b/src/Symfony/Bridge/PhpUnit/Legacy/ConstraintTraitForV9.php new file mode 100644 index 0000000000000..66da873e4243e --- /dev/null +++ b/src/Symfony/Bridge/PhpUnit/Legacy/ConstraintTraitForV9.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\PhpUnit\Legacy; + +/** + * @internal + */ +trait ConstraintTraitForV9 +{ + use ConstraintLogicTrait; + + public function evaluate($other, string $description = '', bool $returnResult = false): ?bool + { + return $this->doEvaluate($other, $description, $returnResult); + } + + public function count(): int + { + return $this->doCount(); + } + + public function toString(): string + { + return $this->doToString(); + } + + protected function additionalFailureDescription($other): string + { + return $this->doAdditionalFailureDescription($other); + } + + protected function failureDescription($other): string + { + return $this->doFailureDescription($other); + } + + protected function matches($other): bool + { + return $this->doMatches($other); + } +}