public function testEquivalenceGroups()
 {
     $fC = new Frontcontroller();
     PriorityAwareTestAction::$INITIAL_PRIORITY = 10;
     $fC->addAction(self::TEST_ACTION_NAMESPACE, self::TEST_ACTION_NAME, ['id' => '10-1']);
     PriorityAwareTestAction::$INITIAL_PRIORITY = 1;
     $fC->addAction(self::TEST_ACTION_NAMESPACE, self::TEST_ACTION_NAME);
     PriorityAwareTestAction::$INITIAL_PRIORITY = 5;
     $fC->addAction(self::TEST_ACTION_NAMESPACE, self::TEST_ACTION_NAME);
     PriorityAwareTestAction::$INITIAL_PRIORITY = 10;
     $fC->addAction(self::TEST_ACTION_NAMESPACE, self::TEST_ACTION_NAME, ['id' => '10-2']);
     PriorityAwareTestAction::$INITIAL_PRIORITY = 10;
     $fC->addAction(self::TEST_ACTION_NAMESPACE, self::TEST_ACTION_NAME, ['id' => '10-3']);
     PriorityAwareTestAction::$INITIAL_PRIORITY = 20;
     $fC->addAction(self::TEST_ACTION_NAMESPACE, self::TEST_ACTION_NAME, ['id' => '20-1']);
     PriorityAwareTestAction::$INITIAL_PRIORITY = 15;
     $fC->addAction(self::TEST_ACTION_NAMESPACE, self::TEST_ACTION_NAME);
     PriorityAwareTestAction::$INITIAL_PRIORITY = 20;
     $fC->addAction(self::TEST_ACTION_NAMESPACE, self::TEST_ACTION_NAME, ['id' => '20-2']);
     $actions = $fC->getActions();
     $keys = array_keys($actions);
     $this->assertEquals(20, $actions[$keys[0]]->getPriority());
     $this->assertEquals('20-1', $actions[$keys[0]]->getInput()->getParameter('id'));
     $this->assertEquals(20, $actions[$keys[1]]->getPriority());
     $this->assertEquals('20-2', $actions[$keys[1]]->getInput()->getParameter('id'));
     $this->assertEquals(15, $actions[$keys[2]]->getPriority());
     $this->assertEquals(10, $actions[$keys[3]]->getPriority());
     $this->assertEquals('10-1', $actions[$keys[3]]->getInput()->getParameter('id'));
     $this->assertEquals(10, $actions[$keys[4]]->getPriority());
     $this->assertEquals('10-2', $actions[$keys[4]]->getInput()->getParameter('id'));
     $this->assertEquals(10, $actions[$keys[5]]->getPriority());
     $this->assertEquals('10-3', $actions[$keys[5]]->getInput()->getParameter('id'));
     $this->assertEquals(5, $actions[$keys[6]]->getPriority());
     $this->assertEquals(1, $actions[$keys[7]]->getPriority());
 }
 public function testMappingRegistration()
 {
     $fC = new Frontcontroller();
     $fooUrlToken = 'foo';
     $barUrlToken = 'bar';
     $bazUrlToken = 'baz';
     $fooNamespace = 'VENDOR\\foo';
     $barNamespace = 'VENDOR\\bar';
     $bazNamespace = 'VENDOR\\baz';
     $fooName = 'say-foo';
     $barName = 'say-bar';
     $bazName = 'say-baz';
     $fooMapping = new ActionUrlMapping($fooUrlToken, $fooNamespace, $fooName);
     $barMapping = new ActionUrlMapping($barUrlToken, $barNamespace, $barName);
     $bazMapping = new ActionUrlMapping($bazUrlToken, $bazNamespace, $bazName);
     $fC->registerActionUrlMapping($fooMapping);
     $fC->registerActionUrlMapping($barMapping);
     $fC->registerActionUrlMapping($bazMapping);
     $this->assertEquals([$fooUrlToken, $barUrlToken, $bazUrlToken], $fC->getActionUrlMappingTokens());
     $this->assertCount(3, $fC->getActionUrlMappingTokens());
     $this->assertEquals($fooMapping, $fC->getActionUrlMapping($fooUrlToken));
     $this->assertEquals($fooMapping, $fC->getActionUrlMapping($fooNamespace, $fooName));
     $this->assertEquals($barMapping, $fC->getActionUrlMapping($barUrlToken));
     $this->assertEquals($barMapping, $fC->getActionUrlMapping($barNamespace, $barName));
     $this->assertEquals($bazMapping, $fC->getActionUrlMapping($bazUrlToken));
     $this->assertEquals($bazMapping, $fC->getActionUrlMapping($bazNamespace, $bazName));
     $this->assertNull($fC->getActionUrlMapping('123456'));
 }
 public function testMixedActions()
 {
     $fooUrlToken = 'foo';
     $fooActionNamespace = 'VENDOR\\foo';
     $fooActionName = 'say-foo';
     $barUrlToken = 'bar';
     $barActionNamespace = 'VENDOR\\bar';
     $barActionName = 'say-bar';
     // action on stack w/o params
     $_REQUEST = [];
     $_REQUEST[$fooUrlToken] = '';
     $_REQUEST['VENDOR_baz-action:say-baz'] = '';
     $_REQUEST[$barUrlToken] = '';
     $filter = new TestableChainedStandardInputFilter();
     $fC = new Frontcontroller();
     $fC->registerActionUrlMapping(new ActionUrlMapping($fooUrlToken, $fooActionNamespace, $fooActionName));
     $fC->registerActionUrlMapping(new ActionUrlMapping($barUrlToken, $barActionNamespace, $barActionName));
     $filter->setFrontcontroller($fC);
     $filter->filter(new TestableFilterChain(), null);
     $actions = $fC->getActions();
     $this->assertEquals($fooActionNamespace, $actions[0]->getActionNamespace());
     $this->assertEquals($fooActionName, $actions[0]->getActionName());
     $this->assertEquals([], $actions[0]->getInput()->getParameters());
     $this->assertEquals('VENDOR\\baz', $actions[1]->getActionNamespace());
     $this->assertEquals('say-baz', $actions[1]->getActionName());
     $this->assertEquals([], $actions[1]->getInput()->getParameters());
     $this->assertEquals($barActionNamespace, $actions[2]->getActionNamespace());
     $this->assertEquals($barActionName, $actions[2]->getActionName());
     $this->assertEquals([], $actions[2]->getInput()->getParameters());
     // action on stack w/ params
     $_REQUEST = [];
     $_REQUEST[$fooUrlToken] = 'one:1|two:2';
     $_REQUEST['VENDOR_baz-action:say-baz'] = 'one:1|two:2';
     $_REQUEST[$barUrlToken] = 'one:1|two:2';
     $filter = new TestableChainedStandardInputFilter();
     $fC = new Frontcontroller();
     $fC->registerActionUrlMapping(new ActionUrlMapping($fooUrlToken, $fooActionNamespace, $fooActionName));
     $fC->registerActionUrlMapping(new ActionUrlMapping($barUrlToken, $barActionNamespace, $barActionName));
     $filter->setFrontcontroller($fC);
     $filter->filter(new TestableFilterChain(), null);
     $actions = $fC->getActions();
     $this->assertEquals($fooActionNamespace, $actions[0]->getActionNamespace());
     $this->assertEquals($fooActionName, $actions[0]->getActionName());
     $this->assertEquals(['one' => '1', 'two' => '2'], $actions[0]->getInput()->getParameters());
     $this->assertEquals('VENDOR\\baz', $actions[1]->getActionNamespace());
     $this->assertEquals('say-baz', $actions[1]->getActionName());
     $this->assertEquals(['one' => '1', 'two' => '2'], $actions[1]->getInput()->getParameters());
     $this->assertEquals($barActionNamespace, $actions[2]->getActionNamespace());
     $this->assertEquals($barActionName, $actions[2]->getActionName());
     $this->assertEquals(['one' => '1', 'two' => '2'], $actions[2]->getInput()->getParameters());
 }
 public function testMixedActions()
 {
     $fooUrlToken = 'foo';
     $fooActionNamespace = 'VENDOR\\foo';
     $fooActionName = 'say-foo';
     $barUrlToken = 'bar';
     $barActionNamespace = 'VENDOR\\bar';
     $barActionName = 'say-bar';
     // action on stack w/o params - trailing slash special challenge ;)
     $_REQUEST = [];
     $_REQUEST[self::REWRITTEN_QUERY_ATTRIBUTE] = '/' . $fooUrlToken . '/~/VENDOR_baz-action/say-baz/~/' . $barUrlToken . '/';
     $filter = new TestableChainedUrlRewritingInputFilter();
     $fC = new Frontcontroller();
     $fC->registerActionUrlMapping(new ActionUrlMapping($fooUrlToken, $fooActionNamespace, $fooActionName));
     $fC->registerActionUrlMapping(new ActionUrlMapping($barUrlToken, $barActionNamespace, $barActionName));
     $filter->setFrontcontroller($fC);
     $filter->filter(new TestableFilterChain(), null);
     $actions = $fC->getActions();
     $this->assertEquals($fooActionNamespace, $actions[0]->getActionNamespace());
     $this->assertEquals($fooActionName, $actions[0]->getActionName());
     $this->assertEquals([], $actions[0]->getInput()->getParameters());
     $this->assertEquals('VENDOR\\baz', $actions[1]->getActionNamespace());
     $this->assertEquals('say-baz', $actions[1]->getActionName());
     $this->assertEquals([], $actions[1]->getInput()->getParameters());
     $this->assertEquals($barActionNamespace, $actions[2]->getActionNamespace());
     $this->assertEquals($barActionName, $actions[2]->getActionName());
     $this->assertEquals([], $actions[2]->getInput()->getParameters());
     // action on stack w/ params
     $_REQUEST = [];
     $_REQUEST[self::REWRITTEN_QUERY_ATTRIBUTE] = '/~/' . $fooUrlToken . '/one/1/two/2/~/VENDOR_baz-action/say-baz/one/1/two/2/~/' . $barUrlToken . '/one/1/two/2';
     $filter = new TestableChainedUrlRewritingInputFilter();
     $fC = new Frontcontroller();
     $fC->registerActionUrlMapping(new ActionUrlMapping($fooUrlToken, $fooActionNamespace, $fooActionName));
     $fC->registerActionUrlMapping(new ActionUrlMapping($barUrlToken, $barActionNamespace, $barActionName));
     $filter->setFrontcontroller($fC);
     $filter->filter(new TestableFilterChain(), null);
     $actions = $fC->getActions();
     $this->assertEquals($fooActionNamespace, $actions[0]->getActionNamespace());
     $this->assertEquals($fooActionName, $actions[0]->getActionName());
     $this->assertEquals(['one' => '1', 'two' => '2'], $actions[0]->getInput()->getParameters());
     $this->assertEquals('VENDOR\\baz', $actions[1]->getActionNamespace());
     $this->assertEquals('say-baz', $actions[1]->getActionName());
     $this->assertEquals(['one' => '1', 'two' => '2'], $actions[1]->getInput()->getParameters());
     $this->assertEquals($barActionNamespace, $actions[2]->getActionNamespace());
     $this->assertEquals($barActionName, $actions[2]->getActionName());
     $this->assertEquals(['one' => '1', 'two' => '2'], $actions[2]->getInput()->getParameters());
 }