<?php

namespace Ratchet\WebSocket;

use Guzzle\Http\Message\EntityEnclosingRequest;
use Ratchet\WebSocket\Version\Hixie76;
use Ratchet\WebSocket\Version\HyBi10;
use Ratchet\WebSocket\Version\RFC6455;

/**
 * @covers Ratchet\WebSocket\VersionManager
 */
class VersionManagerTest extends \PHPUnit_Framework_TestCase
{
    protected $vm;

    public function setUp()
    {
        $this->vm = new VersionManager();
    }

    public function testFluentInterface()
    {
        $rfc = new RFC6455();

        $this->assertSame($this->vm, $this->vm->enableVersion($rfc));
        $this->assertSame($this->vm, $this->vm->disableVersion(13));
    }

    public function testGetVersion()
    {
        $rfc = new RFC6455();
        $this->vm->enableVersion($rfc);

        $req = new EntityEnclosingRequest('get', '/', array(
            'Host' => 'socketo.me', 'Sec-WebSocket-Version' => 13,
        ));

        $this->assertSame($rfc, $this->vm->getVersion($req));
    }

    public function testGetNopeVersionAndDisable()
    {
        $req = new EntityEnclosingRequest('get', '/', array(
            'Host' => 'socketo.me', 'Sec-WebSocket-Version' => 13,
        ));

        $this->setExpectedException('InvalidArgumentException');

        $this->vm->getVersion($req);
    }

    public function testYesIsVersionEnabled()
    {
        $this->vm->enableVersion(new RFC6455());

        $this->assertTrue($this->vm->isVersionEnabled(new EntityEnclosingRequest('get', '/', array(
            'Host' => 'socketo.me', 'Sec-WebSocket-Version' => 13,
        ))));
    }

    public function testNoIsVersionEnabled()
    {
        $this->assertFalse($this->vm->isVersionEnabled(new EntityEnclosingRequest('get', '/', array(
            'Host' => 'socketo.me', 'Sec-WebSocket-Version' => 9000,
        ))));
    }

    public function testGetSupportedVersionString()
    {
        $v1 = new RFC6455();
        $v2 = new HyBi10();

        $this->vm->enableVersion($v1);
        $this->vm->enableVersion($v2);

        $string = $this->vm->getSupportedVersionString();
        $values = explode(',', $string);

        $this->assertContains($v1->getVersionNumber(), $values);
        $this->assertContains($v2->getVersionNumber(), $values);
    }

    public function testGetSupportedVersionAfterRemoval()
    {
        $this->vm->enableVersion(new RFC6455());
        $this->vm->enableVersion(new HyBi10());
        $this->vm->enableVersion(new Hixie76());

        $this->vm->disableVersion(0);

        $values = explode(',', $this->vm->getSupportedVersionString());

        $this->assertEquals(2, count($values));
        $this->assertFalse(array_search(0, $values));
    }
}
