基础代码
This commit is contained in:
@@ -0,0 +1,284 @@
|
||||
<?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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user