285 lines
7.9 KiB
PHP
285 lines
7.9 KiB
PHP
|
<?php
|
||
|
|
||
|
use cli\Arguments;
|
||
|
|
||
|
/**
|
||
|
* Class TestArguments
|
||
|
* @todo add more tests to increase coverage
|
||
|
*
|
||
|
* @backupGlobals enabled
|
||
|
*/
|
||
|
class TestArguments extends PHPUnit_Framework_TestCase
|
||
|
{
|
||
|
/**
|
||
|
* Array of expected settings
|
||
|
* @var array
|
||
|
*/
|
||
|
protected $settings = null;
|
||
|
|
||
|
/**
|
||
|
* Array of flags
|
||
|
* @var array
|
||
|
*/
|
||
|
protected $flags = null;
|
||
|
|
||
|
/**
|
||
|
* Array of expected options
|
||
|
* @var array
|
||
|
*/
|
||
|
protected $options = null;
|
||
|
|
||
|
/**
|
||
|
* Clear the $_SERVER['argv'] array
|
||
|
*/
|
||
|
public static function clearArgv()
|
||
|
{
|
||
|
$_SERVER['argv'] = array();
|
||
|
$_SERVER['argc'] = 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add one or more element(s) at the end of the $_SERVER['argv'] array
|
||
|
*
|
||
|
* @param array $args: value(s) to add to the argv array
|
||
|
*/
|
||
|
public static function pushToArgv($args)
|
||
|
{
|
||
|
if (is_string($args)) {
|
||
|
$args = explode(' ', $args);
|
||
|
}
|
||
|
|
||
|
foreach ($args as $arg) {
|
||
|
array_push($_SERVER['argv'], $arg);
|
||
|
}
|
||
|
|
||
|
$_SERVER['argc'] += count($args);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set up valid flags and options
|
||
|
*/
|
||
|
public function setUp()
|
||
|
{
|
||
|
self::clearArgv();
|
||
|
self::pushToArgv('my_script.php');
|
||
|
|
||
|
$this->flags = array(
|
||
|
'flag1' => array(
|
||
|
'aliases' => 'f',
|
||
|
'description' => 'Test flag 1'
|
||
|
),
|
||
|
'flag2' => array(
|
||
|
'description' => 'Test flag 2'
|
||
|
)
|
||
|
);
|
||
|
|
||
|
$this->options = array(
|
||
|
'option1' => array(
|
||
|
'aliases' => 'o',
|
||
|
'description' => 'Test option 1'
|
||
|
),
|
||
|
'option2' => array(
|
||
|
'aliases' => array('x', 'y'),
|
||
|
'description' => 'Test option 2 with default',
|
||
|
'default' => 'some default value'
|
||
|
)
|
||
|
);
|
||
|
|
||
|
$this->settings = array(
|
||
|
'strict' => true,
|
||
|
'flags' => $this->flags,
|
||
|
'options' => $this->options
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tear down fixtures
|
||
|
*/
|
||
|
public function tearDown()
|
||
|
{
|
||
|
$this->flags = null;
|
||
|
$this->options = null;
|
||
|
$this->settings = null;
|
||
|
self::clearArgv();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Test adding a flag, getting a flag and getting all flags
|
||
|
*/
|
||
|
public function testAddFlags()
|
||
|
{
|
||
|
$args = new cli\Arguments($this->settings);
|
||
|
|
||
|
$expectedFlags = $this->flags;
|
||
|
$expectedFlags['flag1']['default'] = false;
|
||
|
$expectedFlags['flag1']['stackable'] = false;
|
||
|
$expectedFlags['flag2']['default'] = false;
|
||
|
$expectedFlags['flag2']['stackable'] = false;
|
||
|
$expectedFlags['flag2']['aliases'] = array();
|
||
|
|
||
|
$this->assertSame($expectedFlags, $args->getFlags());
|
||
|
|
||
|
$this->assertSame($expectedFlags['flag1'], $args->getFlag('flag1'));
|
||
|
$this->assertSame($expectedFlags['flag1'], $args->getFlag('f'));
|
||
|
|
||
|
$expectedFlag1Argument = new cli\arguments\Argument('-f');
|
||
|
$this->assertSame($expectedFlags['flag1'], $args->getFlag($expectedFlag1Argument));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Test adding a option, getting a option and getting all options
|
||
|
*/
|
||
|
public function testAddOptions()
|
||
|
{
|
||
|
$args = new cli\Arguments($this->settings);
|
||
|
|
||
|
$expectedOptions = $this->options;
|
||
|
$expectedOptions['option1']['default'] = null;
|
||
|
|
||
|
$this->assertSame($expectedOptions, $args->getOptions());
|
||
|
|
||
|
$this->assertSame($expectedOptions['option1'], $args->getOption('option1'));
|
||
|
$this->assertSame($expectedOptions['option1'], $args->getOption('o'));
|
||
|
|
||
|
$expectedOption1Argument = new cli\arguments\Argument('-o');
|
||
|
$this->assertSame($expectedOptions['option1'], $args->getOption($expectedOption1Argument));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Data provider with valid args and options
|
||
|
*
|
||
|
* @return array set of args and expected parsed values
|
||
|
*/
|
||
|
public function settingsWithValidOptions()
|
||
|
{
|
||
|
return array(
|
||
|
array(
|
||
|
array('-o', 'option_value', '-f'),
|
||
|
array('option1' => 'option_value', 'flag1' => true)
|
||
|
),
|
||
|
array(
|
||
|
array('--option1', 'option_value', '--flag1'),
|
||
|
array('option1' => 'option_value', 'flag1' => true)
|
||
|
),
|
||
|
array(
|
||
|
array('-f', '--option1', 'option_value'),
|
||
|
array('flag1' => true, 'option1' => 'option_value')
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Data provider with missing options
|
||
|
*
|
||
|
* @return array set of args and expected parsed values
|
||
|
*/
|
||
|
public function settingsWithMissingOptions()
|
||
|
{
|
||
|
return array(
|
||
|
array(
|
||
|
array('-f', '--option1'),
|
||
|
array('flag1' => true, 'option1' => 'Error should be triggered')
|
||
|
),
|
||
|
array(
|
||
|
array('--option1', '-f'),
|
||
|
array('option1' => 'Error should be triggered', 'flag1' => true)
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Data provider with missing options. The default value should be populated
|
||
|
*
|
||
|
* @return array set of args and expected parsed values
|
||
|
*/
|
||
|
public function settingsWithMissingOptionsWithDefault()
|
||
|
{
|
||
|
return array(
|
||
|
array(
|
||
|
array('-f', '--option2'),
|
||
|
array('flag1' => true, 'option2' => 'some default value')
|
||
|
),
|
||
|
array(
|
||
|
array('--option2', '-f'),
|
||
|
array('option2' => 'some default value', 'flag1' => true)
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
public function settingsWithNoOptionsWithDefault()
|
||
|
{
|
||
|
return array(
|
||
|
array(
|
||
|
array(),
|
||
|
array('flag1' => false, 'flag2' => false, 'option2' => 'some default value')
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Generic private testParse method.
|
||
|
*
|
||
|
* @param array $args arguments as they appear in the cli
|
||
|
* @param array $expectedValues expected values after parsing
|
||
|
*/
|
||
|
private function _testParse($cliParams, $expectedValues)
|
||
|
{
|
||
|
self::pushToArgv($cliParams);
|
||
|
|
||
|
$args = new cli\Arguments($this->settings);
|
||
|
$args->parse();
|
||
|
|
||
|
foreach ($expectedValues as $name => $value) {
|
||
|
if ($args->isFlag($name)) {
|
||
|
$this->assertEquals($value, $args[$name]);
|
||
|
}
|
||
|
|
||
|
if ($args->isOption($name)) {
|
||
|
$this->assertEquals($value, $args[$name]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array $args arguments as they appear in the cli
|
||
|
* @param array $expectedValues expected values after parsing
|
||
|
*
|
||
|
* @dataProvider settingsWithValidOptions
|
||
|
*/
|
||
|
public function testParseWithValidOptions($cliParams, $expectedValues)
|
||
|
{
|
||
|
$this->_testParse($cliParams, $expectedValues);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array $args arguments as they appear in the cli
|
||
|
* @param array $expectedValues expected values after parsing
|
||
|
* @dataProvider settingsWithMissingOptions
|
||
|
* @expectedException PHPUnit_Framework_Error_Warning
|
||
|
* @expectedExceptionMessage no value given for --option1
|
||
|
*/
|
||
|
public function testParseWithMissingOptions($cliParams, $expectedValues)
|
||
|
{
|
||
|
$this->_testParse($cliParams, $expectedValues);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array $args arguments as they appear in the cli
|
||
|
* @param array $expectedValues expected values after parsing
|
||
|
* @dataProvider settingsWithMissingOptionsWithDefault
|
||
|
*/
|
||
|
public function testParseWithMissingOptionsWithDefault($cliParams, $expectedValues)
|
||
|
{
|
||
|
$this->_testParse($cliParams, $expectedValues);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array $args arguments as they appear in the cli
|
||
|
* @param array $expectedValues expected values after parsing
|
||
|
* @dataProvider settingsWithNoOptionsWithDefault
|
||
|
*/
|
||
|
public function testParseWithNoOptionsWithDefault($cliParams, $expectedValues) {
|
||
|
$this->_testParse($cliParams, $expectedValues);
|
||
|
}
|
||
|
}
|