<?php

declare(strict_types=1);

namespace Seka\Portal\Modul\Statistiky\Tests\Unit\Entities\Zaznam\ValueObjects;

use Seka\Portal\Modul\Statistiky\Tests\TestCase;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhEmisnejKontrolyEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\HodnotenieEmisnejKontrolyEnum;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\PocetKontrolPodlaDruhuAHodnotenia;

/**
 * Class PocetKontrolPodlaDruhuAHodnoteniaTest
 *
 * @package Seka\Portal\Modul\Statistiky\Tests\Unit\Entities\Zaznam\ValueObjects
 */
class PocetKontrolPodlaDruhuAHodnoteniaTest extends TestCase
{
    /**
     * @var \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\DruhEmisnejKontrolyEnum
     */
    private DruhEmisnejKontrolyEnum $druh;

    /**
     * @var \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Enums\HodnotenieEmisnejKontrolyEnum
     */
    private HodnotenieEmisnejKontrolyEnum $hodnotenie;

    /**
     * @var int
     */
    private int $pocet;

    /**
     * @var \Seka\Portal\Modul\Statistiky\Entities\Zaznam\ValueObjects\PocetKontrolPodlaDruhuAHodnotenia
     */
    private PocetKontrolPodlaDruhuAHodnotenia $pocetKontrolPodlaDruhuAHodnotenia;

    /**
     *
     */
    public function setUp(): void
    {
        parent::setUp();

        $this->druh = DruhEmisnejKontrolyEnum::PRAVIDELNA();
        $this->hodnotenie = HodnotenieEmisnejKontrolyEnum::SPOSOBILE();
        $this->pocet = 5;

        $this->pocetKontrolPodlaDruhuAHodnotenia = new PocetKontrolPodlaDruhuAHodnotenia(
            $this->druh,
            $this->hodnotenie,
            $this->pocet
        );
    }

    /**
     *
     */
    public function testInstancie()
    {
        $instancia = new PocetKontrolPodlaDruhuAHodnotenia($this->druh, $this->hodnotenie, $this->pocet);

        self::assertInstanceOf(PocetKontrolPodlaDruhuAHodnotenia::class, $instancia);
    }

    /**
     *
     */
    public function testHodnotenie()
    {
        self::assertEquals($this->hodnotenie, $this->pocetKontrolPodlaDruhuAHodnotenia->hodnotenie());
    }

    /**
     *
     */
    public function testDruh()
    {
        self::assertEquals($this->druh, $this->pocetKontrolPodlaDruhuAHodnotenia->druh());
    }

    /**
     *
     */
    public function testPocet()
    {
        self::assertEquals($this->pocet, $this->pocetKontrolPodlaDruhuAHodnotenia->pocet());
    }

    /**
     *
     */
    public function testNavysitPocet()
    {
        $new = $this->pocetKontrolPodlaDruhuAHodnotenia->navysitPocet(clone $this->pocetKontrolPodlaDruhuAHodnotenia);

        self::assertEquals($this->pocetKontrolPodlaDruhuAHodnotenia->pocet() * 2, $new->pocet());
    }

    /**
     *
     */
    public function testEqualsDruhAHodnotenie()
    {
        $clone = clone $this->pocetKontrolPodlaDruhuAHodnotenia;

        self::assertTrue($this->pocetKontrolPodlaDruhuAHodnotenia->equalsDruhAHodnotenie($clone));
    }

    /**
     *
     */
    public function testToArray()
    {
        $arr = $this->pocetKontrolPodlaDruhuAHodnotenia->toArray();

        self::assertIsArray($arr);
        self::assertArrayHasKey('druh', $arr);
        self::assertArrayHasKey('pocet', $arr);
        self::assertArrayHasKey('hodnotenie', $arr);
    }

    /**
     *
     */
    public function testJsonSerialize()
    {
        $json = $this->pocetKontrolPodlaDruhuAHodnotenia->jsonSerialize();

        self::assertJsonStringEqualsJsonString(
            '{"druh":"PRAVIDELNA","hodnotenie":"SPOSOBILE","pocet":5}',
            $json
        );
    }
}
