Constraint
2 years ago
ApplicationTester.php
2 years ago
CommandCompletionTester.php
2 years ago
CommandTester.php
2 years ago
TesterTrait.php
2 years ago
TesterTrait.php
169 lines
| 1 | <?php |
| 2 | |
| 3 | /* |
| 4 | * This file is part of the Symfony package. |
| 5 | * |
| 6 | * (c) Fabien Potencier <fabien@symfony.com> |
| 7 | * |
| 8 | * For the full copyright and license information, please view the LICENSE |
| 9 | * file that was distributed with this source code. |
| 10 | */ |
| 11 | namespace IAWP_SCOPED\Symfony\Component\Console\Tester; |
| 12 | |
| 13 | use IAWP_SCOPED\PHPUnit\Framework\Assert; |
| 14 | use IAWP_SCOPED\Symfony\Component\Console\Input\InputInterface; |
| 15 | use IAWP_SCOPED\Symfony\Component\Console\Output\ConsoleOutput; |
| 16 | use IAWP_SCOPED\Symfony\Component\Console\Output\OutputInterface; |
| 17 | use IAWP_SCOPED\Symfony\Component\Console\Output\StreamOutput; |
| 18 | use IAWP_SCOPED\Symfony\Component\Console\Tester\Constraint\CommandIsSuccessful; |
| 19 | /** |
| 20 | * @author Amrouche Hamza <hamza.simperfit@gmail.com> |
| 21 | * @internal |
| 22 | */ |
| 23 | trait TesterTrait |
| 24 | { |
| 25 | /** @var StreamOutput */ |
| 26 | private $output; |
| 27 | private $inputs = []; |
| 28 | private $captureStreamsIndependently = \false; |
| 29 | /** @var InputInterface */ |
| 30 | private $input; |
| 31 | /** @var int */ |
| 32 | private $statusCode; |
| 33 | /** |
| 34 | * Gets the display returned by the last execution of the command or application. |
| 35 | * |
| 36 | * @return string |
| 37 | * |
| 38 | * @throws \RuntimeException If it's called before the execute method |
| 39 | */ |
| 40 | public function getDisplay(bool $normalize = \false) |
| 41 | { |
| 42 | if (null === $this->output) { |
| 43 | throw new \RuntimeException('Output not initialized, did you execute the command before requesting the display?'); |
| 44 | } |
| 45 | \rewind($this->output->getStream()); |
| 46 | $display = \stream_get_contents($this->output->getStream()); |
| 47 | if ($normalize) { |
| 48 | $display = \str_replace(\PHP_EOL, "\n", $display); |
| 49 | } |
| 50 | return $display; |
| 51 | } |
| 52 | /** |
| 53 | * Gets the output written to STDERR by the application. |
| 54 | * |
| 55 | * @param bool $normalize Whether to normalize end of lines to \n or not |
| 56 | * |
| 57 | * @return string |
| 58 | */ |
| 59 | public function getErrorOutput(bool $normalize = \false) |
| 60 | { |
| 61 | if (!$this->captureStreamsIndependently) { |
| 62 | throw new \LogicException('The error output is not available when the tester is run without "capture_stderr_separately" option set.'); |
| 63 | } |
| 64 | \rewind($this->output->getErrorOutput()->getStream()); |
| 65 | $display = \stream_get_contents($this->output->getErrorOutput()->getStream()); |
| 66 | if ($normalize) { |
| 67 | $display = \str_replace(\PHP_EOL, "\n", $display); |
| 68 | } |
| 69 | return $display; |
| 70 | } |
| 71 | /** |
| 72 | * Gets the input instance used by the last execution of the command or application. |
| 73 | * |
| 74 | * @return InputInterface |
| 75 | */ |
| 76 | public function getInput() |
| 77 | { |
| 78 | return $this->input; |
| 79 | } |
| 80 | /** |
| 81 | * Gets the output instance used by the last execution of the command or application. |
| 82 | * |
| 83 | * @return OutputInterface |
| 84 | */ |
| 85 | public function getOutput() |
| 86 | { |
| 87 | return $this->output; |
| 88 | } |
| 89 | /** |
| 90 | * Gets the status code returned by the last execution of the command or application. |
| 91 | * |
| 92 | * @return int |
| 93 | * |
| 94 | * @throws \RuntimeException If it's called before the execute method |
| 95 | */ |
| 96 | public function getStatusCode() |
| 97 | { |
| 98 | if (null === $this->statusCode) { |
| 99 | throw new \RuntimeException('Status code not initialized, did you execute the command before requesting the status code?'); |
| 100 | } |
| 101 | return $this->statusCode; |
| 102 | } |
| 103 | public function assertCommandIsSuccessful(string $message = '') : void |
| 104 | { |
| 105 | Assert::assertThat($this->statusCode, new CommandIsSuccessful(), $message); |
| 106 | } |
| 107 | /** |
| 108 | * Sets the user inputs. |
| 109 | * |
| 110 | * @param array $inputs An array of strings representing each input |
| 111 | * passed to the command input stream |
| 112 | * |
| 113 | * @return $this |
| 114 | */ |
| 115 | public function setInputs(array $inputs) |
| 116 | { |
| 117 | $this->inputs = $inputs; |
| 118 | return $this; |
| 119 | } |
| 120 | /** |
| 121 | * Initializes the output property. |
| 122 | * |
| 123 | * Available options: |
| 124 | * |
| 125 | * * decorated: Sets the output decorated flag |
| 126 | * * verbosity: Sets the output verbosity flag |
| 127 | * * capture_stderr_separately: Make output of stdOut and stdErr separately available |
| 128 | */ |
| 129 | private function initOutput(array $options) |
| 130 | { |
| 131 | $this->captureStreamsIndependently = \array_key_exists('capture_stderr_separately', $options) && $options['capture_stderr_separately']; |
| 132 | if (!$this->captureStreamsIndependently) { |
| 133 | $this->output = new StreamOutput(\fopen('php://memory', 'w', \false)); |
| 134 | if (isset($options['decorated'])) { |
| 135 | $this->output->setDecorated($options['decorated']); |
| 136 | } |
| 137 | if (isset($options['verbosity'])) { |
| 138 | $this->output->setVerbosity($options['verbosity']); |
| 139 | } |
| 140 | } else { |
| 141 | $this->output = new ConsoleOutput($options['verbosity'] ?? ConsoleOutput::VERBOSITY_NORMAL, $options['decorated'] ?? null); |
| 142 | $errorOutput = new StreamOutput(\fopen('php://memory', 'w', \false)); |
| 143 | $errorOutput->setFormatter($this->output->getFormatter()); |
| 144 | $errorOutput->setVerbosity($this->output->getVerbosity()); |
| 145 | $errorOutput->setDecorated($this->output->isDecorated()); |
| 146 | $reflectedOutput = new \ReflectionObject($this->output); |
| 147 | $strErrProperty = $reflectedOutput->getProperty('stderr'); |
| 148 | $strErrProperty->setAccessible(\true); |
| 149 | $strErrProperty->setValue($this->output, $errorOutput); |
| 150 | $reflectedParent = $reflectedOutput->getParentClass(); |
| 151 | $streamProperty = $reflectedParent->getProperty('stream'); |
| 152 | $streamProperty->setAccessible(\true); |
| 153 | $streamProperty->setValue($this->output, \fopen('php://memory', 'w', \false)); |
| 154 | } |
| 155 | } |
| 156 | /** |
| 157 | * @return resource |
| 158 | */ |
| 159 | private static function createStream(array $inputs) |
| 160 | { |
| 161 | $stream = \fopen('php://memory', 'r+', \false); |
| 162 | foreach ($inputs as $input) { |
| 163 | \fwrite($stream, $input . \PHP_EOL); |
| 164 | } |
| 165 | \rewind($stream); |
| 166 | return $stream; |
| 167 | } |
| 168 | } |
| 169 |