Added the Search API Synonym module to deal specifically with licence and license...
[yaffs-website] / vendor / symfony / console / Tester / ApplicationTester.php
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
12 namespace Symfony\Component\Console\Tester;
13
14 use Symfony\Component\Console\Application;
15 use Symfony\Component\Console\Input\ArrayInput;
16 use Symfony\Component\Console\Input\InputInterface;
17 use Symfony\Component\Console\Output\ConsoleOutput;
18 use Symfony\Component\Console\Output\OutputInterface;
19 use Symfony\Component\Console\Output\StreamOutput;
20
21 /**
22  * Eases the testing of console applications.
23  *
24  * When testing an application, don't forget to disable the auto exit flag:
25  *
26  *     $application = new Application();
27  *     $application->setAutoExit(false);
28  *
29  * @author Fabien Potencier <fabien@symfony.com>
30  */
31 class ApplicationTester
32 {
33     private $application;
34     private $input;
35     private $statusCode;
36     /**
37      * @var OutputInterface
38      */
39     private $output;
40     private $captureStreamsIndependently = false;
41
42     public function __construct(Application $application)
43     {
44         $this->application = $application;
45     }
46
47     /**
48      * Executes the application.
49      *
50      * Available options:
51      *
52      *  * interactive:               Sets the input interactive flag
53      *  * decorated:                 Sets the output decorated flag
54      *  * verbosity:                 Sets the output verbosity flag
55      *  * capture_stderr_separately: Make output of stdOut and stdErr separately available
56      *
57      * @param array $input   An array of arguments and options
58      * @param array $options An array of options
59      *
60      * @return int The command exit code
61      */
62     public function run(array $input, $options = array())
63     {
64         $this->input = new ArrayInput($input);
65         if (isset($options['interactive'])) {
66             $this->input->setInteractive($options['interactive']);
67         }
68
69         $this->captureStreamsIndependently = array_key_exists('capture_stderr_separately', $options) && $options['capture_stderr_separately'];
70         if (!$this->captureStreamsIndependently) {
71             $this->output = new StreamOutput(fopen('php://memory', 'w', false));
72             if (isset($options['decorated'])) {
73                 $this->output->setDecorated($options['decorated']);
74             }
75             if (isset($options['verbosity'])) {
76                 $this->output->setVerbosity($options['verbosity']);
77             }
78         } else {
79             $this->output = new ConsoleOutput(
80                 isset($options['verbosity']) ? $options['verbosity'] : ConsoleOutput::VERBOSITY_NORMAL,
81                 isset($options['decorated']) ? $options['decorated'] : null
82             );
83
84             $errorOutput = new StreamOutput(fopen('php://memory', 'w', false));
85             $errorOutput->setFormatter($this->output->getFormatter());
86             $errorOutput->setVerbosity($this->output->getVerbosity());
87             $errorOutput->setDecorated($this->output->isDecorated());
88
89             $reflectedOutput = new \ReflectionObject($this->output);
90             $strErrProperty = $reflectedOutput->getProperty('stderr');
91             $strErrProperty->setAccessible(true);
92             $strErrProperty->setValue($this->output, $errorOutput);
93
94             $reflectedParent = $reflectedOutput->getParentClass();
95             $streamProperty = $reflectedParent->getProperty('stream');
96             $streamProperty->setAccessible(true);
97             $streamProperty->setValue($this->output, fopen('php://memory', 'w', false));
98         }
99
100         return $this->statusCode = $this->application->run($this->input, $this->output);
101     }
102
103     /**
104      * Gets the display returned by the last execution of the application.
105      *
106      * @param bool $normalize Whether to normalize end of lines to \n or not
107      *
108      * @return string The display
109      */
110     public function getDisplay($normalize = false)
111     {
112         rewind($this->output->getStream());
113
114         $display = stream_get_contents($this->output->getStream());
115
116         if ($normalize) {
117             $display = str_replace(PHP_EOL, "\n", $display);
118         }
119
120         return $display;
121     }
122
123     /**
124      * Gets the output written to STDERR by the application.
125      *
126      * @param bool $normalize Whether to normalize end of lines to \n or not
127      *
128      * @return string
129      */
130     public function getErrorOutput($normalize = false)
131     {
132         if (!$this->captureStreamsIndependently) {
133             throw new \LogicException('The error output is not available when the tester is run without "capture_stderr_separately" option set.');
134         }
135
136         rewind($this->output->getErrorOutput()->getStream());
137
138         $display = stream_get_contents($this->output->getErrorOutput()->getStream());
139
140         if ($normalize) {
141             $display = str_replace(PHP_EOL, "\n", $display);
142         }
143
144         return $display;
145     }
146
147     /**
148      * Gets the input instance used by the last execution of the application.
149      *
150      * @return InputInterface The current input instance
151      */
152     public function getInput()
153     {
154         return $this->input;
155     }
156
157     /**
158      * Gets the output instance used by the last execution of the application.
159      *
160      * @return OutputInterface The current output instance
161      */
162     public function getOutput()
163     {
164         return $this->output;
165     }
166
167     /**
168      * Gets the status code returned by the last execution of the application.
169      *
170      * @return int The status code
171      */
172     public function getStatusCode()
173     {
174         return $this->statusCode;
175     }
176 }