Yaffs site version 1.1
[yaffs-website] / vendor / symfony / console / Tests / Input / ArgvInputTest.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\Tests\Input;
13
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\Console\Input\ArgvInput;
16 use Symfony\Component\Console\Input\InputDefinition;
17 use Symfony\Component\Console\Input\InputArgument;
18 use Symfony\Component\Console\Input\InputOption;
19
20 class ArgvInputTest extends TestCase
21 {
22     public function testConstructor()
23     {
24         $_SERVER['argv'] = array('cli.php', 'foo');
25         $input = new ArgvInput();
26         $r = new \ReflectionObject($input);
27         $p = $r->getProperty('tokens');
28         $p->setAccessible(true);
29
30         $this->assertEquals(array('foo'), $p->getValue($input), '__construct() automatically get its input from the argv server variable');
31     }
32
33     public function testParseArguments()
34     {
35         $input = new ArgvInput(array('cli.php', 'foo'));
36         $input->bind(new InputDefinition(array(new InputArgument('name'))));
37         $this->assertEquals(array('name' => 'foo'), $input->getArguments(), '->parse() parses required arguments');
38
39         $input->bind(new InputDefinition(array(new InputArgument('name'))));
40         $this->assertEquals(array('name' => 'foo'), $input->getArguments(), '->parse() is stateless');
41     }
42
43     /**
44      * @dataProvider provideOptions
45      */
46     public function testParseOptions($input, $options, $expectedOptions, $message)
47     {
48         $input = new ArgvInput($input);
49         $input->bind(new InputDefinition($options));
50
51         $this->assertEquals($expectedOptions, $input->getOptions(), $message);
52     }
53
54     public function provideOptions()
55     {
56         return array(
57             array(
58                 array('cli.php', '--foo'),
59                 array(new InputOption('foo')),
60                 array('foo' => true),
61                 '->parse() parses long options without a value',
62             ),
63             array(
64                 array('cli.php', '--foo=bar'),
65                 array(new InputOption('foo', 'f', InputOption::VALUE_REQUIRED)),
66                 array('foo' => 'bar'),
67                 '->parse() parses long options with a required value (with a = separator)',
68             ),
69             array(
70                 array('cli.php', '--foo', 'bar'),
71                 array(new InputOption('foo', 'f', InputOption::VALUE_REQUIRED)),
72                 array('foo' => 'bar'),
73                 '->parse() parses long options with a required value (with a space separator)',
74             ),
75             array(
76                 array('cli.php', '--foo='),
77                 array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL)),
78                 array('foo' => null),
79                 '->parse() parses long options with optional value which is empty (with a = separator) as null',
80             ),
81             array(
82                 array('cli.php', '--foo=', 'bar'),
83                 array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL), new InputArgument('name', InputArgument::REQUIRED)),
84                 array('foo' => null),
85                 '->parse() parses long options with optional value which is empty (with a = separator) followed by an argument',
86             ),
87             array(
88                 array('cli.php', '-f'),
89                 array(new InputOption('foo', 'f')),
90                 array('foo' => true),
91                 '->parse() parses short options without a value',
92             ),
93             array(
94                 array('cli.php', '-fbar'),
95                 array(new InputOption('foo', 'f', InputOption::VALUE_REQUIRED)),
96                 array('foo' => 'bar'),
97                 '->parse() parses short options with a required value (with no separator)',
98             ),
99             array(
100                 array('cli.php', '-f', 'bar'),
101                 array(new InputOption('foo', 'f', InputOption::VALUE_REQUIRED)),
102                 array('foo' => 'bar'),
103                 '->parse() parses short options with a required value (with a space separator)',
104             ),
105             array(
106                 array('cli.php', '-f', ''),
107                 array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL)),
108                 array('foo' => ''),
109                 '->parse() parses short options with an optional empty value',
110             ),
111             array(
112                 array('cli.php', '-f', '', 'foo'),
113                 array(new InputArgument('name'), new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL)),
114                 array('foo' => ''),
115                 '->parse() parses short options with an optional empty value followed by an argument',
116             ),
117             array(
118                 array('cli.php', '-f', '', '-b'),
119                 array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL), new InputOption('bar', 'b')),
120                 array('foo' => '', 'bar' => true),
121                 '->parse() parses short options with an optional empty value followed by an option',
122             ),
123             array(
124                 array('cli.php', '-f', '-b', 'foo'),
125                 array(new InputArgument('name'), new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL), new InputOption('bar', 'b')),
126                 array('foo' => null, 'bar' => true),
127                 '->parse() parses short options with an optional value which is not present',
128             ),
129             array(
130                 array('cli.php', '-fb'),
131                 array(new InputOption('foo', 'f'), new InputOption('bar', 'b')),
132                 array('foo' => true, 'bar' => true),
133                 '->parse() parses short options when they are aggregated as a single one',
134             ),
135             array(
136                 array('cli.php', '-fb', 'bar'),
137                 array(new InputOption('foo', 'f'), new InputOption('bar', 'b', InputOption::VALUE_REQUIRED)),
138                 array('foo' => true, 'bar' => 'bar'),
139                 '->parse() parses short options when they are aggregated as a single one and the last one has a required value',
140             ),
141             array(
142                 array('cli.php', '-fb', 'bar'),
143                 array(new InputOption('foo', 'f'), new InputOption('bar', 'b', InputOption::VALUE_OPTIONAL)),
144                 array('foo' => true, 'bar' => 'bar'),
145                 '->parse() parses short options when they are aggregated as a single one and the last one has an optional value',
146             ),
147             array(
148                 array('cli.php', '-fbbar'),
149                 array(new InputOption('foo', 'f'), new InputOption('bar', 'b', InputOption::VALUE_OPTIONAL)),
150                 array('foo' => true, 'bar' => 'bar'),
151                 '->parse() parses short options when they are aggregated as a single one and the last one has an optional value with no separator',
152             ),
153             array(
154                 array('cli.php', '-fbbar'),
155                 array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL), new InputOption('bar', 'b', InputOption::VALUE_OPTIONAL)),
156                 array('foo' => 'bbar', 'bar' => null),
157                 '->parse() parses short options when they are aggregated as a single one and one of them takes a value',
158             ),
159         );
160     }
161
162     /**
163      * @dataProvider provideInvalidInput
164      */
165     public function testInvalidInput($argv, $definition, $expectedExceptionMessage)
166     {
167         if (method_exists($this, 'expectException')) {
168             $this->expectException('RuntimeException');
169             $this->expectExceptionMessage($expectedExceptionMessage);
170         } else {
171             $this->setExpectedException('RuntimeException', $expectedExceptionMessage);
172         }
173
174         $input = new ArgvInput($argv);
175         $input->bind($definition);
176     }
177
178     public function provideInvalidInput()
179     {
180         return array(
181             array(
182                 array('cli.php', '--foo'),
183                 new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_REQUIRED))),
184                 'The "--foo" option requires a value.',
185             ),
186             array(
187                 array('cli.php', '-f'),
188                 new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_REQUIRED))),
189                 'The "--foo" option requires a value.',
190             ),
191             array(
192                 array('cli.php', '-ffoo'),
193                 new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_NONE))),
194                 'The "-o" option does not exist.',
195             ),
196             array(
197                 array('cli.php', '--foo=bar'),
198                 new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_NONE))),
199                 'The "--foo" option does not accept a value.',
200             ),
201             array(
202                 array('cli.php', 'foo', 'bar'),
203                 new InputDefinition(),
204                 'No arguments expected, got "foo".',
205             ),
206             array(
207                 array('cli.php', 'foo', 'bar'),
208                 new InputDefinition(array(new InputArgument('number'))),
209                 'Too many arguments, expected arguments "number".',
210             ),
211             array(
212                 array('cli.php', 'foo', 'bar', 'zzz'),
213                 new InputDefinition(array(new InputArgument('number'), new InputArgument('county'))),
214                 'Too many arguments, expected arguments "number" "county".',
215             ),
216             array(
217                 array('cli.php', '--foo'),
218                 new InputDefinition(),
219                 'The "--foo" option does not exist.',
220             ),
221             array(
222                 array('cli.php', '-f'),
223                 new InputDefinition(),
224                 'The "-f" option does not exist.',
225             ),
226             array(
227                 array('cli.php', '-1'),
228                 new InputDefinition(array(new InputArgument('number'))),
229                 'The "-1" option does not exist.',
230             ),
231         );
232     }
233
234     public function testParseArrayArgument()
235     {
236         $input = new ArgvInput(array('cli.php', 'foo', 'bar', 'baz', 'bat'));
237         $input->bind(new InputDefinition(array(new InputArgument('name', InputArgument::IS_ARRAY))));
238
239         $this->assertEquals(array('name' => array('foo', 'bar', 'baz', 'bat')), $input->getArguments(), '->parse() parses array arguments');
240     }
241
242     public function testParseArrayOption()
243     {
244         $input = new ArgvInput(array('cli.php', '--name=foo', '--name=bar', '--name=baz'));
245         $input->bind(new InputDefinition(array(new InputOption('name', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY))));
246
247         $this->assertEquals(array('name' => array('foo', 'bar', 'baz')), $input->getOptions(), '->parse() parses array options ("--option=value" syntax)');
248
249         $input = new ArgvInput(array('cli.php', '--name', 'foo', '--name', 'bar', '--name', 'baz'));
250         $input->bind(new InputDefinition(array(new InputOption('name', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY))));
251         $this->assertEquals(array('name' => array('foo', 'bar', 'baz')), $input->getOptions(), '->parse() parses array options ("--option value" syntax)');
252
253         $input = new ArgvInput(array('cli.php', '--name=foo', '--name=bar', '--name='));
254         $input->bind(new InputDefinition(array(new InputOption('name', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY))));
255         $this->assertSame(array('name' => array('foo', 'bar', null)), $input->getOptions(), '->parse() parses empty array options as null ("--option=value" syntax)');
256
257         $input = new ArgvInput(array('cli.php', '--name', 'foo', '--name', 'bar', '--name', '--anotherOption'));
258         $input->bind(new InputDefinition(array(
259             new InputOption('name', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY),
260             new InputOption('anotherOption', null, InputOption::VALUE_NONE),
261         )));
262         $this->assertSame(array('name' => array('foo', 'bar', null), 'anotherOption' => true), $input->getOptions(), '->parse() parses empty array options as null ("--option value" syntax)');
263     }
264
265     public function testParseNegativeNumberAfterDoubleDash()
266     {
267         $input = new ArgvInput(array('cli.php', '--', '-1'));
268         $input->bind(new InputDefinition(array(new InputArgument('number'))));
269         $this->assertEquals(array('number' => '-1'), $input->getArguments(), '->parse() parses arguments with leading dashes as arguments after having encountered a double-dash sequence');
270
271         $input = new ArgvInput(array('cli.php', '-f', 'bar', '--', '-1'));
272         $input->bind(new InputDefinition(array(new InputArgument('number'), new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL))));
273         $this->assertEquals(array('foo' => 'bar'), $input->getOptions(), '->parse() parses arguments with leading dashes as options before having encountered a double-dash sequence');
274         $this->assertEquals(array('number' => '-1'), $input->getArguments(), '->parse() parses arguments with leading dashes as arguments after having encountered a double-dash sequence');
275     }
276
277     public function testParseEmptyStringArgument()
278     {
279         $input = new ArgvInput(array('cli.php', '-f', 'bar', ''));
280         $input->bind(new InputDefinition(array(new InputArgument('empty'), new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL))));
281
282         $this->assertEquals(array('empty' => ''), $input->getArguments(), '->parse() parses empty string arguments');
283     }
284
285     public function testGetFirstArgument()
286     {
287         $input = new ArgvInput(array('cli.php', '-fbbar'));
288         $this->assertNull($input->getFirstArgument(), '->getFirstArgument() returns null when there is no arguments');
289
290         $input = new ArgvInput(array('cli.php', '-fbbar', 'foo'));
291         $this->assertEquals('foo', $input->getFirstArgument(), '->getFirstArgument() returns the first argument from the raw input');
292     }
293
294     public function testHasParameterOption()
295     {
296         $input = new ArgvInput(array('cli.php', '-f', 'foo'));
297         $this->assertTrue($input->hasParameterOption('-f'), '->hasParameterOption() returns true if the given short option is in the raw input');
298
299         $input = new ArgvInput(array('cli.php', '--foo', 'foo'));
300         $this->assertTrue($input->hasParameterOption('--foo'), '->hasParameterOption() returns true if the given short option is in the raw input');
301
302         $input = new ArgvInput(array('cli.php', 'foo'));
303         $this->assertFalse($input->hasParameterOption('--foo'), '->hasParameterOption() returns false if the given short option is not in the raw input');
304
305         $input = new ArgvInput(array('cli.php', '--foo=bar'));
306         $this->assertTrue($input->hasParameterOption('--foo'), '->hasParameterOption() returns true if the given option with provided value is in the raw input');
307     }
308
309     public function testToString()
310     {
311         $input = new ArgvInput(array('cli.php', '-f', 'foo'));
312         $this->assertEquals('-f foo', (string) $input);
313
314         $input = new ArgvInput(array('cli.php', '-f', '--bar=foo', 'a b c d', "A\nB'C"));
315         $this->assertEquals('-f --bar=foo '.escapeshellarg('a b c d').' '.escapeshellarg("A\nB'C"), (string) $input);
316     }
317
318     /**
319      * @dataProvider provideGetParameterOptionValues
320      */
321     public function testGetParameterOptionEqualSign($argv, $key, $expected)
322     {
323         $input = new ArgvInput($argv);
324         $this->assertEquals($expected, $input->getParameterOption($key), '->getParameterOption() returns the expected value');
325     }
326
327     public function provideGetParameterOptionValues()
328     {
329         return array(
330             array(array('app/console', 'foo:bar', '-e', 'dev'), '-e', 'dev'),
331             array(array('app/console', 'foo:bar', '--env=dev'), '--env', 'dev'),
332             array(array('app/console', 'foo:bar', '-e', 'dev'), array('-e', '--env'), 'dev'),
333             array(array('app/console', 'foo:bar', '--env=dev'), array('-e', '--env'), 'dev'),
334             array(array('app/console', 'foo:bar', '--env=dev', '--en=1'), array('--en'), '1'),
335             array(array('app/console', 'foo:bar', '--env=dev', '', '--en=1'), array('--en'), '1'),
336         );
337     }
338
339     public function testParseSingleDashAsArgument()
340     {
341         $input = new ArgvInput(array('cli.php', '-'));
342         $input->bind(new InputDefinition(array(new InputArgument('file'))));
343         $this->assertEquals(array('file' => '-'), $input->getArguments(), '->parse() parses single dash as an argument');
344     }
345
346     public function testParseOptionWithValueOptionalGivenEmptyAndRequiredArgument()
347     {
348         $input = new ArgvInput(array('cli.php', '--foo=', 'bar'));
349         $input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL), new InputArgument('name', InputArgument::REQUIRED))));
350         $this->assertEquals(array('foo' => null), $input->getOptions(), '->parse() parses optional options with empty value as null');
351         $this->assertEquals(array('name' => 'bar'), $input->getArguments(), '->parse() parses required arguments');
352
353         $input = new ArgvInput(array('cli.php', '--foo=0', 'bar'));
354         $input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL), new InputArgument('name', InputArgument::REQUIRED))));
355         $this->assertEquals(array('foo' => '0'), $input->getOptions(), '->parse() parses optional options with empty value as null');
356         $this->assertEquals(array('name' => 'bar'), $input->getArguments(), '->parse() parses required arguments');
357     }
358
359     public function testParseOptionWithValueOptionalGivenEmptyAndOptionalArgument()
360     {
361         $input = new ArgvInput(array('cli.php', '--foo=', 'bar'));
362         $input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL), new InputArgument('name', InputArgument::OPTIONAL))));
363         $this->assertEquals(array('foo' => null), $input->getOptions(), '->parse() parses optional options with empty value as null');
364         $this->assertEquals(array('name' => 'bar'), $input->getArguments(), '->parse() parses optional arguments');
365
366         $input = new ArgvInput(array('cli.php', '--foo=0', 'bar'));
367         $input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL), new InputArgument('name', InputArgument::OPTIONAL))));
368         $this->assertEquals(array('foo' => '0'), $input->getOptions(), '->parse() parses optional options with empty value as null');
369         $this->assertEquals(array('name' => 'bar'), $input->getArguments(), '->parse() parses optional arguments');
370     }
371 }