<?php

namespace goodboyalex\php_components_pack\tests\classes;

use goodboyalex\php_components_pack\classes\File;
use PHPUnit\Framework\TestCase;

class FileTest extends TestCase
{
    public function testExtractFileName ()
    {
        $this->PrepareForTest();

        $this->assertEquals("test.txt", File::ExtractFileName("c:\\tmp\\test.txt"));
        $this->assertEquals("test.txt", File::ExtractFileName("c:/tmp/test.txt"));
        $this->assertEquals("test.txt", File::ExtractFileName("\\tmp\\test.txt"));
    }

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

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

        $result = File::FindFiles(__DIR__);

        $this->assertIsArray($result);
        $this->assertCount(8, $result);
    }

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

        $fullPath = "c:\\source\\tmp\\test.txt";

        $basePath = "c:\\source\\";

        $this->assertEquals("tmp\\test.txt", File::GetRelativePath($fullPath, $basePath));
    }

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

        $this->assertEquals("txt", File::ExtractFileExtension("c:\\tmp\\test.txt"));
        $this->assertEquals("txt", File::ExtractFileExtension("c:/tmp/test.txt"));
        $this->assertEquals("txt", File::ExtractFileExtension("\\tmp\\test.txt"));
    }

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

        $this->assertEquals("test", File::ExtractFileNameWithoutExtension("c:\\tmp\\test.txt"));
        $this->assertEquals("test", File::ExtractFileNameWithoutExtension("c:/tmp/test.txt"));
        $this->assertEquals("test", File::ExtractFileNameWithoutExtension("\\tmp\\test.txt"));
    }

    public function testRemoveDir ()
    {
        /**
         * ВАЖНО! Перед запуском теста необходимо создать директорию D:\TestDelete и наполнить её ненужными файлами
         */

        $this->PrepareForTest();

        $result = File::RemoveDir("D:/TestDelete");

        $this->assertTrue($result->Value);
        $this->assertFalse(File::DirectoryExists("D:\\TestDelete"));
    }

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

        $size = File::FileSize("C:\\Windows/explorer.exe");

        $this->assertEquals(2774080, $size->Value);
    }

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

        $size = File::FileSizeToString(2774080);

        $this->assertEquals("2,65 МБ", $size);
    }
}