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);
}