<?php

namespace goodboyalex\php_components_pack\tests\classes;

use goodboyalex\php_components_pack\classes\VersionInfo;
use goodboyalex\php_components_pack\enums\VersionInfoStage;
use PHPUnit\Framework\TestCase;

class VersionInfoTest extends TestCase
{
    public function testCompareWith ()
    {
        $this->PrepareForTest();

        $versionInfo1 = new VersionInfo(1, 2, 3, 4, VersionInfoStage::Beta, 1);
        $versionInfo2 = new VersionInfo(1, 1, 3, 4, VersionInfoStage::Alpha, 2);

        $this->assertEquals(1, $versionInfo1->CompareWith($versionInfo2));

    }

    private function PrepareForTest (): void
    {
        require_once __DIR__ . '/../../sources/enums/VersionInfoStage.php';
        require_once __DIR__ . '/../../sources/classes/VersionInfo.php';
    }

    public function test__toString ()
    {
        $this->PrepareForTest();
        $versionInfo = new VersionInfo(1, 2, 3, 4, VersionInfoStage::Beta, 1);
        $this->assertEquals('1.2.3.4 Beta 1', $versionInfo->__toString());
    }

    public function testToString ()
    {
        $this->PrepareForTest();
        $versionInfo = new VersionInfo(1, 2, 3, 4, VersionInfoStage::Beta, 1);

        $template = "Это #{Stage} #{StageNumber} версии #{Major}.#{Minor}.#{Release}.#{Build}";

        $stageNames = [
            VersionInfoStage::PreAlpha->value => 'рано',
            VersionInfoStage::Alpha->value => 'начало',
            VersionInfoStage::Beta->value => 'середнячок',
            VersionInfoStage::ReleaseCandidate->value => 'почти',
            VersionInfoStage::Stable->value => 'это релиз, детка!'
        ];

        $this->assertEquals('Это середнячок 1 версии 1.2.3.4', $versionInfo->ToString($template, $stageNames));
    }

    public function testParse ()
    {
        $this->PrepareForTest();

        $stageNames = [
            VersionInfoStage::PreAlpha->value => 'pre',
            VersionInfoStage::Alpha->value => 'alpha',
            VersionInfoStage::Beta->value => 'beta',
            VersionInfoStage::ReleaseCandidate->value => 'rc',
            VersionInfoStage::Stable->value => 'stable'
        ];

        $version = VersionInfo::Parse('1.2.3.4 beta 1', $stageNames);

        $this->assertEquals(1, $version->Major);
        $this->assertEquals(2, $version->Minor);
        $this->assertEquals(3, $version->Release);
        $this->assertEquals(4, $version->Build);
        $this->assertEquals(VersionInfoStage::Beta, $version->Stage);
        $this->assertEquals(1, $version->StageNumber);
    }

    public function test__construct ()
    {
        $this->PrepareForTest();

        $version = new VersionInfo(1, 2, 3, 4, VersionInfoStage::Beta, 1);

        $this->assertEquals(2, $version->Minor);
    }

    public function testCompare ()
    {
        $this->PrepareForTest();

        $versionInfo1 = new VersionInfo(1, 2, 3, 4, VersionInfoStage::Beta, 1);
        $versionInfo2 = new VersionInfo(1, 1, 3, 4, VersionInfoStage::Alpha, 2);

        $this->assertEquals(1, VersionInfo::Compare($versionInfo1, $versionInfo2));
    }
}