4 * This file is part of Psy Shell.
6 * (c) 2012-2017 Justin Hileman
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Psy\Tests\Input;
14 use Psy\Input\CodeArgument;
15 use Psy\Input\ShellInput;
16 use Symfony\Component\Console\Input\InputArgument;
17 use Symfony\Component\Console\Input\InputDefinition;
18 use Symfony\Component\Console\Input\InputOption;
20 class ShellInputTest extends \PHPUnit_Framework_TestCase
23 * @dataProvider getTokenizeData
25 public function testTokenize($input, $tokens, $message)
27 $input = new ShellInput($input);
28 $r = new \ReflectionClass('Psy\Input\ShellInput');
29 $p = $r->getProperty('tokenPairs');
30 $p->setAccessible(true);
31 $this->assertEquals($tokens, $p->getValue($input), $message);
34 public function testInputOptionWithGivenString()
36 $definition = new InputDefinition(array(
37 new InputOption('foo', null, InputOption::VALUE_REQUIRED),
38 new CodeArgument('code', null, InputOption::VALUE_REQUIRED),
41 $input = new ShellInput('--foo=bar echo "baz\n";');
42 $input->bind($definition);
43 $this->assertEquals('bar', $input->getOption('foo'));
44 $this->assertEquals('echo "baz\n";', $input->getArgument('code'));
47 public function testInputOptionWithoutCodeArguments()
49 $definition = new InputDefinition(array(
50 new InputOption('foo', null, InputOption::VALUE_REQUIRED),
51 new InputArgument('bar', null, InputOption::VALUE_REQUIRED),
52 new InputArgument('baz', null, InputOption::VALUE_REQUIRED),
55 $input = new ShellInput('--foo=foo bar "baz\n"');
56 $input->bind($definition);
57 $this->assertEquals('foo', $input->getOption('foo'));
58 $this->assertEquals('bar', $input->getArgument('bar'));
59 $this->assertEquals("baz\n", $input->getArgument('baz'));
62 public function getTokenizeData()
64 // Test all the cases from StringInput test, ensuring they have an appropriate $rest token.
69 '->tokenize() parses an empty string',
73 array(array('foo', 'foo')),
74 '->tokenize() parses arguments',
78 array(array('foo', 'foo bar '), array('bar', 'bar ')),
79 '->tokenize() ignores whitespaces between arguments',
83 array(array('quoted', '"quoted"')),
84 '->tokenize() parses quoted arguments',
88 array(array('quoted', "'quoted'")),
89 '->tokenize() parses quoted arguments',
93 array(array("a\rb\nc\td", "'a\rb\nc\td'")),
94 '->tokenize() parses whitespace chars in strings',
99 array('a', "'a'\r'b'\n'c'\t'd'"),
100 array('b', "'b'\n'c'\t'd'"),
101 array('c', "'c'\t'd'"),
104 '->tokenize() parses whitespace chars between args as spaces',
108 array(array('"quoted"', '\"quoted\"')),
109 '->tokenize() parses escaped-quoted arguments',
113 array(array('\'quoted\'', "\'quoted\'")),
114 '->tokenize() parses escaped-quoted arguments',
118 array(array('-a', '-a')),
119 '->tokenize() parses short options',
123 array(array('-azc', '-azc')),
124 '->tokenize() parses aggregated short options',
128 array(array('-awithavalue', '-awithavalue')),
129 '->tokenize() parses short options with a value',
133 array(array('-afoo bar', '-a"foo bar"')),
134 '->tokenize() parses short options with a value',
137 '-a"foo bar""foo bar"',
138 array(array('-afoo barfoo bar', '-a"foo bar""foo bar"')),
139 '->tokenize() parses short options with a value',
143 array(array('-afoo bar', '-a\'foo bar\'')),
144 '->tokenize() parses short options with a value',
147 '-a\'foo bar\'\'foo bar\'',
148 array(array('-afoo barfoo bar', '-a\'foo bar\'\'foo bar\'')),
149 '->tokenize() parses short options with a value',
152 '-a\'foo bar\'"foo bar"',
153 array(array('-afoo barfoo bar', '-a\'foo bar\'"foo bar"')),
154 '->tokenize() parses short options with a value',
158 array(array('--long-option', '--long-option')),
159 '->tokenize() parses long options',
163 array(array('--long-option=foo', '--long-option=foo')),
164 '->tokenize() parses long options with a value',
167 '--long-option="foo bar"',
168 array(array('--long-option=foo bar', '--long-option="foo bar"')),
169 '->tokenize() parses long options with a value',
172 '--long-option="foo bar""another"',
173 array(array('--long-option=foo baranother', '--long-option="foo bar""another"')),
174 '->tokenize() parses long options with a value',
177 '--long-option=\'foo bar\'',
178 array(array('--long-option=foo bar', '--long-option=\'foo bar\'')),
179 '->tokenize() parses long options with a value',
182 "--long-option='foo bar''another'",
183 array(array('--long-option=foo baranother', "--long-option='foo bar''another'")),
184 '->tokenize() parses long options with a value',
187 "--long-option='foo bar'\"another\"",
188 array(array('--long-option=foo baranother', "--long-option='foo bar'\"another\"")),
189 '->tokenize() parses long options with a value',
192 'foo -a -ffoo --long bar',
194 array('foo', 'foo -a -ffoo --long bar'),
195 array('-a', '-a -ffoo --long bar'),
196 array('-ffoo', '-ffoo --long bar'),
197 array('--long', '--long bar'),
200 '->tokenize() parses when several arguments and options',