<?php

namespace tests\unit\Entity\Source\Operand;

use PHPUnit\Framework\TestCase;
use App\Entity\Source\Operation\AbstractOperation;
use App\Entity\Source\Operation\OperationInterface;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;
use App\Logic\Operation\OperandInterface;
use App\Logic\Result\ResultInterface;
use App\Logic\Result\Result;
use App\Exception\NotProcessedException;

class AbstractOperationTest extends TestCase
{
    /**
     * @var OperationInterface
     */
    protected $operation;

    public function setUp(): void
    {
        $this->operation = new class() extends AbstractOperation {
            public function process(): void
            {
                $this->result = new Result();
            }
        };
    }

    public function testConstructor(): void
    {
        $this->assertInstanceOf(Collection::class, $this->operation->getOperands());
    }

    public function testOperands(): void
    {
        $operand = new class() implements OperandInterface {
            public function getResult(): ResultInterface
            {
                return new Result();
            }
        };
        $operands = new ArrayCollection();
        $operands->add($operand);
        $this->assertNull($this->operation->setOperands($operands));
        $this->assertEquals($operand, $this->operation->getOperands()
            ->get(0));
    }

    public function testNotProcessedException(): void
    {
        $this->expectException(NotProcessedException::class);
        $this->operation->getResult();
    }

    public function testResult(): void
    {
        $this->setUp();
        $this->operation->process();
        $this->assertInstanceOf(ResultInterface::class, $this->operation->getResult());
    }

    public function testProcess(): void
    {
        $this->assertEquals(null, $this->operation->process());
    }
}