Files
instafeed/vendor/corneltek/getoptionkit/tests/ContinuousOptionParserTest.php
2022-10-23 01:39:27 +02:00

336 lines
11 KiB
PHP
Executable File

<?php
/*
* This file is part of the {{ }} package.
*
* (c) Yo-An Lin <cornelius.howl@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*
*/
namespace tests\GetOptionKit;
use GetOptionKit\ContinuousOptionParser;
use GetOptionKit\OptionCollection;
class ContinuousOptionParserTest extends \PHPUnit\Framework\TestCase
{
public function testOptionCollection()
{
$specs = new OptionCollection;
$specVerbose = $specs->add('v|verbose');
$specColor = $specs->add('c|color');
$specDebug = $specs->add('d|debug');
}
public function argumentProvider()
{
return [
[
['program','subcommand1', 'arg1', 'arg2', 'arg3', 'subcommand2', '-b', 1, 'subcommand3', '-b', 2],
[
'args' => ['arg1', 'arg2', 'arg3']
],
],
[
['program','-v', '-c', 'subcommand1', '--as', 99, 'arg1', 'arg2', 'arg3'],
[
'app' => ['verbose' => true ],
'args' => ['arg1', 'arg2', 'arg3']
],
],
[
['program','-v', '-c', 'subcommand1', '--as', 99, 'arg1', 'arg2', 'arg3', '--','zz','xx','vv'],
[
'app' => ['verbose' => true],
'args' => ['arg1', 'arg2', 'arg3']
],
],
];
}
/**
* @dataProvider argumentProvider
*/
public function testParseSubCommandOptions($argv, $expected)
{
$appspecs = new OptionCollection;
$appspecs->add('v|verbose');
$appspecs->add('c|color');
$appspecs->add('d|debug');
$cmdspecs = new OptionCollection;
$cmdspecs->add('as:');
$cmdspecs->add('b:');
$cmdspecs->add('c:');
$cmdspecs->add('def:')->isa('number')->defaultValue(3);
$parser = new ContinuousOptionParser( $appspecs );
$subcommands = array('subcommand1','subcommand2','subcommand3');
$subcommand_specs = array(
'subcommand1' => clone $cmdspecs,
'subcommand2' => clone $cmdspecs,
'subcommand3' => clone $cmdspecs,
);
$subcommand_options = array();
// $argv = explode(' ','program -v -c subcommand1 --as 99 arg1 arg2 arg3 -- zz xx vv');
// $argv = explode(' ','program subcommand1 -a 1 subcommand2 -a 2 subcommand3 -a 3 arg1 arg2 arg3');
$app_options = $parser->parse( $argv );
$arguments = array();
while (! $parser->isEnd()) {
if (!empty($subcommands) && $parser->getCurrentArgument() == $subcommands[0]) {
$parser->advance();
$subcommand = array_shift($subcommands);
$parser->setSpecs($subcommand_specs[$subcommand]);
$subcommand_options[$subcommand] = $parser->continueParse();
} else {
$arguments[] = $parser->advance();
}
}
$this->assertSame($expected['args'], $arguments);
if (isset($expected['app'])) {
foreach ($expected['app'] as $k => $v) {
$this->assertEquals($v, $app_options->get($k));
}
}
// $this->assertEquals(99, $subcommand_options['subcommand1']->as);
}
public function testParser3()
{
$appspecs = new OptionCollection;
$appspecs->add('v|verbose');
$appspecs->add('c|color');
$appspecs->add('d|debug');
$cmdspecs = new OptionCollection;
$cmdspecs->add('n|name:=string');
$cmdspecs->add('p|phone:=string');
$cmdspecs->add('a|address:=string');
$subcommands = array('subcommand1','subcommand2','subcommand3');
$subcommand_specs = array(
'subcommand1' => $cmdspecs,
'subcommand2' => $cmdspecs,
'subcommand3' => $cmdspecs,
);
$subcommand_options = array();
$arguments = array();
$argv = explode(' ','program -v -d -c subcommand1 --name=c9s --phone=123123123 --address=somewhere arg1 arg2 arg3');
$parser = new ContinuousOptionParser( $appspecs );
$app_options = $parser->parse( $argv );
while (! $parser->isEnd()) {
if (@$subcommands[0] && $parser->getCurrentArgument() == $subcommands[0]) {
$parser->advance();
$subcommand = array_shift( $subcommands );
$parser->setSpecs( $subcommand_specs[$subcommand] );
$subcommand_options[ $subcommand ] = $parser->continueParse();
} else {
$arguments[] = $parser->advance();
}
}
$this->assertCount(3, $arguments);
$this->assertEquals('arg1', $arguments[0]);
$this->assertEquals('arg2', $arguments[1]);
$this->assertEquals('arg3', $arguments[2]);
$this->assertNotNull($subcommand_options['subcommand1']);
$this->assertEquals('c9s', $subcommand_options['subcommand1']->name );
$this->assertEquals('123123123', $subcommand_options['subcommand1']->phone );
$this->assertEquals('somewhere', $subcommand_options['subcommand1']->address );
}
/* test parser without options */
function testParser4()
{
$appspecs = new OptionCollection;
$appspecs->add('v|verbose');
$appspecs->add('c|color');
$appspecs->add('d|debug');
$cmdspecs = new OptionCollection;
$cmdspecs->add('a:'); // required
$cmdspecs->add('b?'); // optional
$cmdspecs->add('c+'); // multiple (required)
$parser = new ContinuousOptionParser( $appspecs );
$this->assertNotNull( $parser );
$subcommands = array('subcommand1','subcommand2','subcommand3');
$subcommand_specs = array(
'subcommand1' => clone $cmdspecs,
'subcommand2' => clone $cmdspecs,
'subcommand3' => clone $cmdspecs,
);
$subcommand_options = array();
$argv = explode(' ','program subcommand1 subcommand2 subcommand3 -a a -b b -c c');
$app_options = $parser->parse( $argv );
$arguments = array();
while( ! $parser->isEnd() ) {
if( @$subcommands[0] && $parser->getCurrentArgument() == $subcommands[0] ) {
$parser->advance();
$subcommand = array_shift( $subcommands );
$parser->setSpecs( $subcommand_specs[$subcommand] );
$subcommand_options[ $subcommand ] = $parser->continueParse();
} else {
$arguments[] = $parser->advance();
}
}
$this->assertNotNull( $subcommand_options );
$this->assertNotNull( $subcommand_options['subcommand1'] );
$this->assertNotNull( $subcommand_options['subcommand2'] );
$this->assertNotNull( $subcommand_options['subcommand3'] );
$r = $subcommand_options['subcommand3'];
$this->assertNotNull( $r );
$this->assertNotNull( $r->a , 'option a' );
$this->assertNotNull( $r->b , 'option b' );
$this->assertNotNull( $r->c , 'option c' );
$this->assertEquals( 'a', $r->a );
$this->assertEquals( 'b', $r->b );
$this->assertEquals( 'c', $r->c[0] );
}
/* test parser without options */
function testParser5()
{
$appspecs = new OptionCollection;
$appspecs->add('v|verbose');
$appspecs->add('c|color');
$appspecs->add('d|debug');
$cmdspecs = new OptionCollection;
$cmdspecs->add('a:');
$cmdspecs->add('b');
$cmdspecs->add('c');
$parser = new ContinuousOptionParser( $appspecs );
$this->assertNotNull( $parser );
$subcommands = array('subcommand1','subcommand2','subcommand3');
$subcommand_specs = array(
'subcommand1' => clone $cmdspecs,
'subcommand2' => clone $cmdspecs,
'subcommand3' => clone $cmdspecs,
);
$subcommand_options = array();
$argv = explode(' ','program subcommand1 -a 1 subcommand2 -a 2 subcommand3 -a 3 arg1 arg2 arg3');
$app_options = $parser->parse( $argv );
$arguments = array();
while (! $parser->isEnd()) {
if (!empty($subcommands) && $parser->getCurrentArgument() == $subcommands[0] ) {
$parser->advance();
$subcommand = array_shift( $subcommands );
$parser->setSpecs($subcommand_specs[$subcommand]);
$subcommand_options[ $subcommand ] = $parser->continueParse();
} else {
$arguments[] = $parser->advance();
}
}
$this->assertEquals( 'arg1', $arguments[0] );
$this->assertEquals( 'arg2', $arguments[1] );
$this->assertEquals( 'arg3', $arguments[2] );
$this->assertNotNull( $subcommand_options );
$this->assertEquals(1, $subcommand_options['subcommand1']->a);
$this->assertNotNull( 2, $subcommand_options['subcommand2']->a );
$this->assertNotNull( 3, $subcommand_options['subcommand3']->a );
}
/**
* @expectedException GetOptionKit\Exception\InvalidOptionException
*/
public function testParseInvalidOptionException()
{
$parser = new ContinuousOptionParser(new OptionCollection);
$parser->parse(array('app','--foo'));
$arguments = array();
while (!$parser->isEnd())
{
$arguments[] = $parser->getCurrentArgument();
$parser->advance();
}
}
public function testMultipleShortOption()
{
$options = new OptionCollection;
$options->add("a");
$options->add("b");
$options->add("c");
$parser = new ContinuousOptionParser($options);
$result = $parser->parse(array('app', '-ab', 'foo', 'bar'));
while (!$parser->isEnd())
{
$arguments[] = $parser->getCurrentArgument();
$parser->advance();
}
$this->assertTrue($result->keys["a"]->value);
$this->assertTrue($result->keys["b"]->value);
}
public function testIncrementalValue()
{
$options = new OptionCollection;
$options->add("v|verbose")->incremental();
$parser = new ContinuousOptionParser($options);
$result = $parser->parse(array('app', '-vvv'));
$this->assertEquals(3, $result->keys["verbose"]->value);
}
/**
* @expectedException GetOptionKit\Exception\InvalidOptionException
*/
public function testUnknownOption()
{
$options = new OptionCollection;
$options->add("v|verbose");
$parser = new ContinuousOptionParser($options);
$result = $parser->parse(array('app', '-b'));
}
/**
* @expectedException LogicException
*/
public function testAdvancedOutOfBounds()
{
$options = new OptionCollection;
$options->add("v|verbose");
$parser = new ContinuousOptionParser($options);
$result = $parser->parse(array('app', '-v'));
$parser->advance();
}
}