public function testAppendRoute()
{
/* @var $tableItem \Scalr\Api\Rest\Routing\Item */
$ret = $table = new Table();
$route1 = (new Route('/api/users/v:apiversion/hotels', function () {
}, ['apiversion' => '[\\d]+']))->setMethods([Request::METHOD_GET]);
$route2 = (new Route('/api/users/v:apiversion/flights', function () {
}, ['apiversion' => '[\\d]+']))->setMethods([Request::METHOD_POST]);
$table->appendRoute($route1);
$table->appendRoute($route2);
//api level
$this->assertEquals(1, $table->count());
$this->assertSubClassOf('Traversable', $table);
$this->assertInstanceOf('ArrayAccess', $table);
$this->assertArrayHasKey('api', $table);
$this->assertEmpty($table->hasRegexp());
$this->assertEquals([], $table->getRegexpItemIterator()->getArrayCopy());
$tableItem = $table['api'];
$this->assertInstanceOf('Scalr\\Api\\Rest\\Routing\\Item', $tableItem);
$this->assertInstanceOf('Scalr\\Api\\Rest\\Routing\\PathPart', $tableItem->getPathPart());
$this->assertEquals('api', $tableItem->getPathPart()->value);
$this->assertEmpty($tableItem->routes);
//users level
$table = $tableItem->getTable();
$this->assertEquals(1, $table->count());
$this->assertSubClassOf('Traversable', $table);
$this->assertInstanceOf('ArrayAccess', $table);
$this->assertArrayHasKey('users', $table);
$this->assertEmpty($table->hasRegexp());
$this->assertEquals([], $table->getRegexpItemIterator()->getArrayCopy());
$tableItem = $table['users'];
$this->assertInstanceOf('Scalr\\Api\\Rest\\Routing\\Item', $tableItem);
$this->assertInstanceOf('Scalr\\Api\\Rest\\Routing\\PathPart', $tableItem->getPathPart());
$this->assertEquals('users', $tableItem->getPathPart()->value);
$this->assertEmpty($tableItem->routes);
//v:apiversion level
$table = $tableItem->getTable();
$this->assertEquals(1, $table->count());
$this->assertSubClassOf('Traversable', $table);
$this->assertInstanceOf('ArrayAccess', $table);
$iterator = $table->getIterator();
list($uriPart, $tableItem) = each($iterator);
$this->assertContains('^v(?<apiversion>', $uriPart);
$this->assertNotEmpty($table->hasRegexp());
$this->assertInstanceOf('Scalr\\Api\\Rest\\Routing\\Item', $tableItem);
$this->assertInstanceOf('Scalr\\Api\\Rest\\Routing\\PathPart', $tableItem->getPathPart());
$this->assertContains('^v(?<apiversion>', $tableItem->getPathPart()->value);
$this->assertTrue(!$tableItem->getPathPart()->isString());
$this->assertEmpty($tableItem->routes);
//last level
$table = $tableItem->getTable();
$this->assertEquals(2, $table->count());
$this->assertSubClassOf('Traversable', $table);
$this->assertInstanceOf('ArrayAccess', $table);
$this->assertArrayHasKey('hotels', $table);
$this->assertArrayHasKey('flights', $table);
$this->assertEmpty($table->hasRegexp());
$this->assertEquals([], $table->getRegexpItemIterator()->getArrayCopy());
$this->assertNotEmpty($table['hotels']->routes);
$this->assertEquals($route1, $table['hotels']->routes[0]);
$this->assertNotEmpty($table['flights']->routes);
$this->assertEquals($route2, $table['flights']->routes[0]);
return $ret;
}