<?php

/*
 * @copyright NetMonsters <team@netmonsters.ru>
 * @link http://netmonsters.ru
 * @package Majestic
 * @subpackage UnitTests
 * @since 2011-10-31
 * 
 * Unit tests for Router class
 */

require_once dirname(__FILE__) . '/../../../app/router/Route.php';

class RouteTest extends PHPUnit_Framework_TestCase
{

    public function testConstructNoParams()
    {
        $route = new Route('index', 'user');
        $this->assertEquals('userAction', $route->getAction());
        $this->assertEquals('Layout', $route->getLayout());
        $this->assertEmpty($route->getParams());
        $this->assertAttributeEquals('index', 'route', $route);
    }

    public function testConstructWithParams()
    {
        $route = new Route('index', 'user', array('name' => 'tony', 'role' => 'user'));
        $this->assertArrayHasKey('role', $route->getParams());
        $this->assertEquals(array('name' => 'tony', 'role' => 'user'), $route->getParams());
    }

    public function testMatchDiffCount()
    {
        $route = new Route('user/account/id/142', 'user', array('name' => 'tony', 'role' => 'user'));
        $this->assertFalse($route->match(array('user', 'account')));
    }

    /**
     * @TODO: Route::match() - need to trim left-right slashes
     */
    public function testMatchDiffParts()
    {
        $route = new Route('user/account', 'user');
        $this->assertFalse($route->match(array('user', 'login')));
    }

    public function testMatchVariable()
    {
        $route = new Route('user/account/:id', 'user');
        $this->assertTrue($route->match(array('user', 'account', '142')));
        $this->assertEquals(array('id' => '142'), $route->getParams());
    }

    public function testMatchDiffPregParts()
    {
        $route = new Route('user/account/(?<key>value)', 'user');
        $this->assertFalse($route->match(array('user', 'account', 'wrong')));
        $this->assertEquals(0, count($route->getParams()));
    }

    public function testMatchPregPasses()
    {
        $route = new Route('user/account/(?<key>[a-z]+)', 'user');
        $this->assertTrue($route->match(array('user', 'account', 'value')));
        $this->assertEquals(array('key' => 'value'), $route->getParams());
        $this->assertEquals(1, count($route->getParams()));
    }

    /**
     * @expectedException PHPUnit_Framework_Error
     * @TODO Need check empty parameters from constructor Route
     */
    public function testMatchEmptyRequest()
    {
        $route = new Route('', 'user', array('name' => 'tony', 'role' => 'user'));
        $route->match('');
    }
}