public function testParse()
{
$this->assert('when using $_SERVER')->if($script = new \mock\mageekguy\atoum\script(uniqid()))->and($superglobals = new atoum\superglobals())->and($superglobals->_SERVER['argv'] = array())->and($parser = new script\arguments\parser($superglobals))->then->object($parser->parse($script))->isIdenticalTo($parser)->array($parser->getValues())->isEmpty()->if($superglobals->_SERVER['argv'] = array('scriptName'))->then->object($parser->parse($script))->isIdenticalTo($parser)->array($parser->getValues())->isEmpty()->if($superglobals->_SERVER['argv'] = array('scriptName', '-a'))->and($parser->addHandler(function ($script, $argument, $value) use(&$invokeA) {
$invokeA++;
}, array('-a')))->then->object($parser->parse($script))->isIdenticalTo($parser)->array($parser->getValues())->isEqualTo(array('-a' => array()))->integer($invokeA)->isEqualTo(1)->if($superglobals->_SERVER['argv'] = array('scriptName', '-a', '-b'))->and($parser->addHandler(function ($script, $argument, $value) use(&$invokeB) {
$invokeB++;
}, array('-b')))->then->object($parser->parse($script))->isIdenticalTo($parser)->array($parser->getValues())->isEqualTo(array('-a' => array(), '-b' => array()))->integer($invokeA)->isEqualTo(2)->integer($invokeB)->isEqualTo(1)->if($superglobals->_SERVER['argv'] = array('scriptName', '-a', 'a1'))->then->object($parser->parse($script))->isIdenticalTo($parser)->array($parser->getValues())->isEqualTo(array('-a' => array('a1')))->integer($invokeA)->isEqualTo(3)->integer($invokeB)->isEqualTo(1)->if($superglobals->_SERVER['argv'] = array('scriptName', '-a', 'a1', 'a2'))->then->object($parser->parse($script))->isIdenticalTo($parser)->array($parser->getValues())->isEqualTo(array('-a' => array('a1', 'a2')))->integer($invokeA)->isEqualTo(4)->integer($invokeB)->isEqualTo(1)->if($superglobals->_SERVER['argv'] = array('scriptName', '-a', 'a1', 'a2', '-b'))->then->object($parser->parse($script))->isIdenticalTo($parser)->array($parser->getValues())->isEqualTo(array('-a' => array('a1', 'a2'), '-b' => array()))->integer($invokeA)->isEqualTo(5)->integer($invokeB)->isEqualTo(2)->if($superglobals->_SERVER['argv'] = array('scriptName', '-a', 'a1', 'a2', '-b', 'b1', 'b2', 'b3'))->then->object($parser->parse($script))->isIdenticalTo($parser)->array($parser->getValues())->isEqualTo(array('-a' => array('a1', 'a2'), '-b' => array('b1', 'b2', 'b3')))->integer($invokeA)->isEqualTo(6)->integer($invokeB)->isEqualTo(3)->if($superglobals->_SERVER['argv'] = array('scriptName', '-a', 'a1', 'a2', '-b', 'b1', 'b2', 'b3', '--c'))->and($parser->addHandler(function ($script, $argument, $value) use(&$invokeC) {
$invokeC++;
}, array('--c')))->then->object($parser->parse($script))->isIdenticalTo($parser)->array($parser->getValues())->isEqualTo(array('-a' => array('a1', 'a2'), '-b' => array('b1', 'b2', 'b3'), '--c' => array()))->integer($invokeA)->isEqualTo(7)->integer($invokeB)->isEqualTo(4)->integer($invokeC)->isEqualTo(1)->assert('when using argument')->if($superglobals->_SERVER['argv'] = array())->then->object($parser->parse($script, array()))->isIdenticalTo($parser)->array($parser->getValues())->isEmpty()->integer($invokeA)->isEqualTo(7)->integer($invokeB)->isEqualTo(4)->integer($invokeC)->isEqualTo(1)->object($parser->parse($script, array('-a')))->isIdenticalTo($parser)->array($parser->getValues())->isEqualTo(array('-a' => array()))->integer($invokeA)->isEqualTo(8)->integer($invokeB)->isEqualTo(4)->integer($invokeC)->isEqualTo(1)->object($parser->parse($script, array('-a', '-b')))->isIdenticalTo($parser)->array($parser->getValues())->isEqualTo(array('-a' => array(), '-b' => array()))->integer($invokeA)->isEqualTo(9)->integer($invokeB)->isEqualTo(5)->integer($invokeC)->isEqualTo(1)->object($parser->parse($script, array('-a', 'a1')))->isIdenticalTo($parser)->array($parser->getValues())->isEqualTo(array('-a' => array('a1')))->integer($invokeA)->isEqualTo(10)->integer($invokeB)->isEqualTo(5)->integer($invokeC)->isEqualTo(1)->object($parser->parse($script, array('-a', 'a1', 'a2')))->isIdenticalTo($parser)->array($parser->getValues())->isEqualTo(array('-a' => array('a1', 'a2')))->integer($invokeA)->isEqualTo(11)->integer($invokeB)->isEqualTo(5)->integer($invokeC)->isEqualTo(1)->object($parser->parse($script, array('-a', 'a1', 'a2', '-b')))->isIdenticalTo($parser)->array($parser->getValues())->isEqualTo(array('-a' => array('a1', 'a2'), '-b' => array()))->integer($invokeA)->isEqualTo(12)->integer($invokeB)->isEqualTo(6)->integer($invokeC)->isEqualTo(1)->object($parser->parse($script, array('-a', 'a1', 'a2', '-b', 'b1', 'b2', 'b3')))->isIdenticalTo($parser)->array($parser->getValues())->isEqualTo(array('-a' => array('a1', 'a2'), '-b' => array('b1', 'b2', 'b3')))->integer($invokeA)->isEqualTo(13)->integer($invokeB)->isEqualTo(7)->integer($invokeC)->isEqualTo(1)->object($parser->parse($script, array('-a', 'a1', 'a2', '-b', 'b1', 'b2', 'b3', '--c')))->isIdenticalTo($parser)->array($parser->getValues())->isEqualTo(array('-a' => array('a1', 'a2'), '-b' => array('b1', 'b2', 'b3'), '--c' => array()))->integer($invokeA)->isEqualTo(14)->integer($invokeB)->isEqualTo(8)->integer($invokeC)->isEqualTo(2)->exception(function () use($parser, $script) {
$parser->parse($script, array('b'));
})->isInstanceOf('mageekguy\\atoum\\exceptions\\runtime\\unexpectedValue')->hasMessage('First argument \'b\' is invalid')->if($superglobals->_SERVER['argv'] = array('scriptName', '-a', 'a1', 'a2', '-b', 'b1', 'b2', 'b3', '-d', 'd1', 'd2', '--c'))->and($parser->addHandler(function ($script, $argument, $value) {
}, array('-d'), PHP_INT_MAX))->then->object($parser->parse($script))->isIdenticalTo($parser)->array($parser->getValues())->isEqualTo(array('-d' => array('d1', 'd2'), '-a' => array('a1', 'a2'), '-b' => array('b1', 'b2', 'b3'), '--c' => array()))->if($superglobals->_SERVER['argv'] = array('scriptName', '-d', 'd1', 'd2', '-a', 'a1', 'a2', '-b', 'b1', 'b2', 'b3', '--c'))->then->object($parser->parse($script))->isIdenticalTo($parser)->array($parser->getValues())->isEqualTo(array('-d' => array('d1', 'd2'), '-a' => array('a1', 'a2'), '-b' => array('b1', 'b2', 'b3'), '--c' => array()));
}