diff --git a/Tester/Constraint/CommandIsFaulty.php b/Tester/Constraint/CommandIsFaulty.php new file mode 100644 index 000000000..3df4fbf25 --- /dev/null +++ b/Tester/Constraint/CommandIsFaulty.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Tester\Constraint; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\Console\Command\Command; + +final class CommandIsFaulty extends Constraint +{ + public function toString(): string + { + return 'is faulty'; + } + + protected function matches($other): bool + { + return Command::FAILURE === $other || Command::INVALID === $other; + } + + protected function failureDescription($other): string + { + return 'the command '.$this->toString(); + } + + protected function additionalFailureDescription($other): string + { + $mapping = [ + Command::SUCCESS => 'Command was successful.' + ]; + + return $mapping[$other] ?? sprintf('Command returned exit status %d.', $other); + } +} diff --git a/Tester/TesterTrait.php b/Tester/TesterTrait.php index 497b8c8c7..8a05d2801 100644 --- a/Tester/TesterTrait.php +++ b/Tester/TesterTrait.php @@ -16,6 +16,7 @@ use Symfony\Component\Console\Output\ConsoleOutput; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\StreamOutput; +use Symfony\Component\Console\Tester\Constraint\CommandIsFaulty; use Symfony\Component\Console\Tester\Constraint\CommandIsSuccessful; /** @@ -104,6 +105,11 @@ public function assertCommandIsSuccessful(string $message = ''): void Assert::assertThat($this->statusCode, new CommandIsSuccessful(), $message); } + public function assertCommandIsFaulty(string $message = ''): void + { + Assert::assertThat($this->statusCode, new CommandIsFaulty(), $message); + } + /** * Sets the user inputs. * diff --git a/Tests/Tester/Constraint/CommandIsFaultyTest.php b/Tests/Tester/Constraint/CommandIsFaultyTest.php new file mode 100644 index 000000000..709ef8094 --- /dev/null +++ b/Tests/Tester/Constraint/CommandIsFaultyTest.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Tests\Tester\Constraint; + +use PHPUnit\Framework\ExpectationFailedException; +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\TestFailure; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Tester\Constraint\CommandIsFaulty; + +final class CommandIsFaultyTest extends TestCase +{ + public function testConstraint() + { + $constraint = new CommandIsFaulty(); + + $this->assertFalse($constraint->evaluate(Command::SUCCESS, '', true)); + $this->assertTrue($constraint->evaluate(Command::FAILURE, '', true)); + $this->assertTrue($constraint->evaluate(Command::INVALID, '', true)); + } + + public function testSuccessfulCommand() + { + $constraint = new CommandIsFaulty(); + + try { + $constraint->evaluate(Command::SUCCESS); + } catch (ExpectationFailedException $e) { + $this->assertStringContainsString('Failed asserting that the command is faulty.', $e->getMessage()); + + return; + } + + $this->fail(); + } +}