2010-03-18 07:48:03 +00:00
< ? php
/*
2010-04-25 16:06:54 +01:00
* This file is part of the Symfony package .
2011-01-15 13:29:43 +00:00
*
2011-03-06 11:40:06 +00:00
* ( c ) Fabien Potencier < fabien @ symfony . com >
2010-03-18 07:48:03 +00:00
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
2012-03-28 14:43:52 +01:00
namespace Symfony\Component\Console\Tests\Input ;
2010-03-18 07:48:03 +00:00
2010-08-20 22:09:55 +01:00
use Symfony\Component\Console\Input\ArgvInput ;
use Symfony\Component\Console\Input\InputDefinition ;
use Symfony\Component\Console\Input\InputArgument ;
use Symfony\Component\Console\Input\InputOption ;
2010-03-18 07:48:03 +00:00
class ArgvInputTest extends \PHPUnit_Framework_TestCase
{
2010-05-06 12:25:53 +01:00
public function testConstructor ()
2010-03-18 07:48:03 +00:00
{
2010-05-06 12:25:53 +01:00
$_SERVER [ 'argv' ] = array ( 'cli.php' , 'foo' );
2011-03-11 11:53:42 +00:00
$input = new ArgvInput ();
$r = new \ReflectionObject ( $input );
$p = $r -> getProperty ( 'tokens' );
$p -> setAccessible ( true );
$this -> assertEquals ( array ( 'foo' ), $p -> getValue ( $input ), '__construct() automatically get its input from the argv server variable' );
2010-03-18 07:48:03 +00:00
}
2013-02-05 21:55:33 +00:00
public function testParseArguments ()
2010-03-18 07:48:03 +00:00
{
2011-03-11 11:53:42 +00:00
$input = new ArgvInput ( array ( 'cli.php' , 'foo' ));
2010-05-06 12:25:53 +01:00
$input -> bind ( new InputDefinition ( array ( new InputArgument ( 'name' ))));
$this -> assertEquals ( array ( 'name' => 'foo' ), $input -> getArguments (), '->parse() parses required arguments' );
$input -> bind ( new InputDefinition ( array ( new InputArgument ( 'name' ))));
$this -> assertEquals ( array ( 'name' => 'foo' ), $input -> getArguments (), '->parse() is stateless' );
2013-02-05 21:55:33 +00:00
}
2010-05-06 12:25:53 +01:00
2013-02-05 21:55:33 +00:00
/**
* @ dataProvider provideOptions
*/
public function testParseOptions ( $input , $options , $expectedOptions , $message )
{
$input = new ArgvInput ( $input );
$input -> bind ( new InputDefinition ( $options ));
2010-05-06 12:25:53 +01:00
2013-02-05 21:55:33 +00:00
$this -> assertEquals ( $expectedOptions , $input -> getOptions (), $message );
}
2010-05-06 12:25:53 +01:00
2013-02-05 21:55:33 +00:00
public function provideOptions ()
{
return array (
array (
array ( 'cli.php' , '--foo' ),
array ( new InputOption ( 'foo' )),
array ( 'foo' => true ),
'->parse() parses long options without a value'
),
array (
array ( 'cli.php' , '--foo=bar' ),
array ( new InputOption ( 'foo' , 'f' , InputOption :: VALUE_REQUIRED )),
array ( 'foo' => 'bar' ),
'->parse() parses long options with a required value (with a = separator)'
),
array (
array ( 'cli.php' , '--foo' , 'bar' ),
array ( new InputOption ( 'foo' , 'f' , InputOption :: VALUE_REQUIRED )),
array ( 'foo' => 'bar' ),
'->parse() parses long options with a required value (with a space separator)'
),
array (
array ( 'cli.php' , '-f' ),
array ( new InputOption ( 'foo' , 'f' )),
array ( 'foo' => true ),
'->parse() parses short options without a value'
),
array (
array ( 'cli.php' , '-fbar' ),
array ( new InputOption ( 'foo' , 'f' , InputOption :: VALUE_REQUIRED )),
array ( 'foo' => 'bar' ),
'->parse() parses short options with a required value (with no separator)'
),
array (
array ( 'cli.php' , '-f' , 'bar' ),
array ( new InputOption ( 'foo' , 'f' , InputOption :: VALUE_REQUIRED )),
array ( 'foo' => 'bar' ),
'->parse() parses short options with a required value (with a space separator)'
),
array (
array ( 'cli.php' , '-f' , '' ),
array ( new InputOption ( 'foo' , 'f' , InputOption :: VALUE_OPTIONAL )),
array ( 'foo' => '' ),
'->parse() parses short options with an optional empty value'
),
array (
array ( 'cli.php' , '-f' , '' , 'foo' ),
array ( new InputArgument ( 'name' ), new InputOption ( 'foo' , 'f' , InputOption :: VALUE_OPTIONAL )),
array ( 'foo' => '' ),
'->parse() parses short options with an optional empty value followed by an argument'
),
array (
array ( 'cli.php' , '-f' , '' , '-b' ),
array ( new InputOption ( 'foo' , 'f' , InputOption :: VALUE_OPTIONAL ), new InputOption ( 'bar' , 'b' )),
array ( 'foo' => '' , 'bar' => true ),
'->parse() parses short options with an optional empty value followed by an option'
),
array (
array ( 'cli.php' , '-f' , '-b' , 'foo' ),
array ( new InputArgument ( 'name' ), new InputOption ( 'foo' , 'f' , InputOption :: VALUE_OPTIONAL ), new InputOption ( 'bar' , 'b' )),
array ( 'foo' => null , 'bar' => true ),
'->parse() parses short options with an optional value which is not present'
),
array (
array ( 'cli.php' , '-fb' ),
array ( new InputOption ( 'foo' , 'f' ), new InputOption ( 'bar' , 'b' )),
array ( 'foo' => true , 'bar' => true ),
'->parse() parses short options when they are aggregated as a single one'
),
array (
array ( 'cli.php' , '-fb' , 'bar' ),
array ( new InputOption ( 'foo' , 'f' ), new InputOption ( 'bar' , 'b' , InputOption :: VALUE_REQUIRED )),
array ( 'foo' => true , 'bar' => 'bar' ),
'->parse() parses short options when they are aggregated as a single one and the last one has a required value'
),
array (
array ( 'cli.php' , '-fb' , 'bar' ),
array ( new InputOption ( 'foo' , 'f' ), new InputOption ( 'bar' , 'b' , InputOption :: VALUE_OPTIONAL )),
array ( 'foo' => true , 'bar' => 'bar' ),
'->parse() parses short options when they are aggregated as a single one and the last one has an optional value'
),
array (
array ( 'cli.php' , '-fbbar' ),
array ( new InputOption ( 'foo' , 'f' ), new InputOption ( 'bar' , 'b' , InputOption :: VALUE_OPTIONAL )),
array ( 'foo' => true , 'bar' => 'bar' ),
'->parse() parses short options when they are aggregated as a single one and the last one has an optional value with no separator'
),
array (
array ( 'cli.php' , '-fbbar' ),
array ( new InputOption ( 'foo' , 'f' , InputOption :: VALUE_OPTIONAL ), new InputOption ( 'bar' , 'b' , InputOption :: VALUE_OPTIONAL )),
array ( 'foo' => 'bbar' , 'bar' => null ),
'->parse() parses short options when they are aggregated as a single one and one of them takes a value'
)
);
}
2011-02-28 15:40:32 +00:00
2013-02-05 21:55:33 +00:00
/**
* @ dataProvider provideInvalidInput
*/
public function testInvalidInput ( $argv , $definition , $expectedExceptionMessage )
{
$this -> setExpectedException ( 'RuntimeException' , $expectedExceptionMessage );
$input = new ArgvInput ( $argv );
$input -> bind ( $definition );
}
public function provideInvalidInput ()
{
return array (
array (
array ( 'cli.php' , '--foo' ),
new InputDefinition ( array ( new InputOption ( 'foo' , 'f' , InputOption :: VALUE_REQUIRED ))),
'The "--foo" option requires a value.'
),
array (
array ( 'cli.php' , '-f' ),
new InputDefinition ( array ( new InputOption ( 'foo' , 'f' , InputOption :: VALUE_REQUIRED ))),
'The "--foo" option requires a value.'
),
array (
array ( 'cli.php' , '-ffoo' ),
new InputDefinition ( array ( new InputOption ( 'foo' , 'f' , InputOption :: VALUE_NONE ))),
'The "-o" option does not exist.'
),
array (
array ( 'cli.php' , 'foo' , 'bar' ),
new InputDefinition (),
'Too many arguments.'
),
array (
array ( 'cli.php' , '--foo' ),
new InputDefinition (),
'The "--foo" option does not exist.'
),
array (
array ( 'cli.php' , '-f' ),
new InputDefinition (),
'The "-f" option does not exist.'
),
array (
array ( 'cli.php' , '-1' ),
new InputDefinition ( array ( new InputArgument ( 'number' ))),
'The "-1" option does not exist.'
)
);
}
2011-06-07 13:57:18 +01:00
2013-02-05 21:55:33 +00:00
public function testParseArrayArgument ()
{
$input = new ArgvInput ( array ( 'cli.php' , 'foo' , 'bar' , 'baz' , 'bat' ));
$input -> bind ( new InputDefinition ( array ( new InputArgument ( 'name' , InputArgument :: IS_ARRAY ))));
$this -> assertEquals ( array ( 'name' => array ( 'foo' , 'bar' , 'baz' , 'bat' )), $input -> getArguments (), '->parse() parses array arguments' );
}
public function testParseArrayOption ()
{
2011-06-07 13:57:18 +01:00
$input = new ArgvInput ( array ( 'cli.php' , '--name=foo' , '--name=bar' , '--name=baz' ));
$input -> bind ( new InputDefinition ( array ( new InputOption ( 'name' , null , InputOption :: VALUE_OPTIONAL | InputOption :: VALUE_IS_ARRAY ))));
2012-03-16 19:28:57 +00:00
2013-02-05 21:55:33 +00:00
$this -> assertEquals ( array ( 'name' => array ( 'foo' , 'bar' , 'baz' )), $input -> getOptions ());
}
2012-03-16 19:28:57 +00:00
2013-02-05 21:55:33 +00:00
public function testParseNegativeNumberAfterDoubleDash ()
{
2012-03-16 19:28:57 +00:00
$input = new ArgvInput ( array ( 'cli.php' , '--' , '-1' ));
$input -> bind ( new InputDefinition ( array ( new InputArgument ( 'number' ))));
$this -> assertEquals ( array ( 'number' => '-1' ), $input -> getArguments (), '->parse() parses arguments with leading dashes as arguments after having encountered a double-dash sequence' );
$input = new ArgvInput ( array ( 'cli.php' , '-f' , 'bar' , '--' , '-1' ));
$input -> bind ( new InputDefinition ( array ( new InputArgument ( 'number' ), new InputOption ( 'foo' , 'f' , InputOption :: VALUE_OPTIONAL ))));
$this -> assertEquals ( array ( 'foo' => 'bar' ), $input -> getOptions (), '->parse() parses arguments with leading dashes as options before having encountered a double-dash sequence' );
$this -> assertEquals ( array ( 'number' => '-1' ), $input -> getArguments (), '->parse() parses arguments with leading dashes as arguments after having encountered a double-dash sequence' );
2013-02-05 21:55:33 +00:00
}
2012-03-29 19:59:08 +01:00
2013-02-05 21:55:33 +00:00
public function testParseEmptyStringArgument ()
{
2012-03-29 19:59:08 +01:00
$input = new ArgvInput ( array ( 'cli.php' , '-f' , 'bar' , '' ));
$input -> bind ( new InputDefinition ( array ( new InputArgument ( 'empty' ), new InputOption ( 'foo' , 'f' , InputOption :: VALUE_OPTIONAL ))));
2013-02-05 21:55:33 +00:00
2012-03-29 19:59:08 +01:00
$this -> assertEquals ( array ( 'empty' => '' ), $input -> getArguments (), '->parse() parses empty string arguments' );
2010-03-18 07:48:03 +00:00
}
2010-05-06 12:25:53 +01:00
public function testGetFirstArgument ()
2010-03-18 07:48:03 +00:00
{
2011-03-11 11:53:42 +00:00
$input = new ArgvInput ( array ( 'cli.php' , '-fbbar' ));
2010-05-06 12:25:53 +01:00
$this -> assertEquals ( '' , $input -> getFirstArgument (), '->getFirstArgument() returns the first argument from the raw input' );
2010-03-18 07:48:03 +00:00
2011-03-11 11:53:42 +00:00
$input = new ArgvInput ( array ( 'cli.php' , '-fbbar' , 'foo' ));
2010-05-06 12:25:53 +01:00
$this -> assertEquals ( 'foo' , $input -> getFirstArgument (), '->getFirstArgument() returns the first argument from the raw input' );
2010-03-18 07:48:03 +00:00
}
2010-05-06 12:25:53 +01:00
public function testHasParameterOption ()
2010-03-18 07:48:03 +00:00
{
2011-03-11 11:53:42 +00:00
$input = new ArgvInput ( array ( 'cli.php' , '-f' , 'foo' ));
2010-05-06 12:25:53 +01:00
$this -> assertTrue ( $input -> hasParameterOption ( '-f' ), '->hasParameterOption() returns true if the given short option is in the raw input' );
2010-03-18 07:48:03 +00:00
2011-03-11 11:53:42 +00:00
$input = new ArgvInput ( array ( 'cli.php' , '--foo' , 'foo' ));
2010-05-06 12:25:53 +01:00
$this -> assertTrue ( $input -> hasParameterOption ( '--foo' ), '->hasParameterOption() returns true if the given short option is in the raw input' );
2010-03-18 07:48:03 +00:00
2011-03-11 11:53:42 +00:00
$input = new ArgvInput ( array ( 'cli.php' , 'foo' ));
2010-05-06 12:25:53 +01:00
$this -> assertFalse ( $input -> hasParameterOption ( '--foo' ), '->hasParameterOption() returns false if the given short option is not in the raw input' );
}
2011-02-11 00:53:18 +00:00
/**
* @ dataProvider provideGetParameterOptionValues
*/
public function testGetParameterOptionEqualSign ( $argv , $key , $expected )
{
$input = new ArgvInput ( $argv );
$this -> assertEquals ( $expected , $input -> getParameterOption ( $key ), '->getParameterOption() returns the expected value' );
}
public function provideGetParameterOptionValues ()
{
return array (
array ( array ( 'app/console' , 'foo:bar' , '-e' , 'dev' ), '-e' , 'dev' ),
array ( array ( 'app/console' , 'foo:bar' , '--env=dev' ), '--env' , 'dev' ),
array ( array ( 'app/console' , 'foo:bar' , '-e' , 'dev' ), array ( '-e' , '--env' ), 'dev' ),
array ( array ( 'app/console' , 'foo:bar' , '--env=dev' ), array ( '-e' , '--env' ), 'dev' ),
);
}
2010-03-18 07:48:03 +00:00
}