<?php
namespace Ratchet\Tests\Resource\Command;
use Ratchet\Resource\Command\Composite;
use Ratchet\Resource\Connection;
use Ratchet\Tests\Mock\FakeSocket;
use Ratchet\Resource\Command\Action\Null as NullAction;

/**
 * @covers Ratchet\Resource\Command\Composite
 */
class CompositeTest extends \PHPUnit_Framework_TestCase {
    protected $_comp;

    public function setUp() {
        $this->_comp = new Composite;
    }

    protected function newNull() {
        return new NullAction(new Connection(new FakeSocket));
    }

    public function testCanEnqueueNull() {
        $count = $this->_comp->count();

        $this->_comp->enqueue(null);

        $this->assertEquals($count, $this->_comp->count());
    }

    public function testEnqueueCommand() {
        $count = $this->_comp->count();

        $this->_comp->enqueue($this->newNull());

        $this->assertEquals($count + 1, $this->_comp->count());
    }

    public function badEnqueueProviders() {
        return array(
            array(array())
          , array('string')
        );
    }

    /**
     * @dataProvider badEnqueueProviders
     */
    public function testCanNotPassOtherThings($object) {
        $this->setExpectedException('InvalidArgumentException');

        $this->_comp->enqueue($object);
    }

    public function testCompositeComposite() {
        $compTwo = new Composite;
        $compTwo->enqueue($this->newNull());
        $compTwo->enqueue($this->newNull());

        $this->_comp->enqueue($this->newNull());
        $this->_comp->enqueue($compTwo);

        $this->assertEquals(3, $this->_comp->count());
    }
}