diff --git a/Utils/Converter/FileSizeType.php b/Utils/Converter/FileSizeType.php index e40962f53..90c8c707d 100644 --- a/Utils/Converter/FileSizeType.php +++ b/Utils/Converter/FileSizeType.php @@ -15,6 +15,7 @@ declare(strict_types=1); namespace phpOMS\Utils\Converter; use phpOMS\Stdlib\Base\Enum; +use phpOMS\Utils\Converter\Measurement; /** * File size type enum. @@ -45,4 +46,26 @@ abstract class FileSizeType extends Enum public const KILOBIT = 'kbit'; public const BIT = 'bit'; + + /** + * Auto format file size in bytes + * + * @param float $size File size + * + * @return array + * + * @since 1.0.0 + */ + public static function autoFormat(float $size) : array + { + if ($size < 300) { + return [$size, 'B']; + } elseif ($size < 1000) { + return [Measurement::convertFileSize($size, FileSizeType::BYTE, FileSizeType::KILOBYTE), 'KB']; + } elseif ($size < 1000 * 1000 * 1000) { + return [Measurement::convertFileSize($size, FileSizeType::BYTE, FileSizeType::MEGABYTE), 'MB']; + } + + return [Measurement::convertFileSize($size, FileSizeType::BYTE, FileSizeType::GIGABYTE), 'GB']; + } } diff --git a/tests/Utils/Converter/FileSizeTypeTest.php b/tests/Utils/Converter/FileSizeTypeTest.php index b8ac157d3..479e4450e 100644 --- a/tests/Utils/Converter/FileSizeTypeTest.php +++ b/tests/Utils/Converter/FileSizeTypeTest.php @@ -17,6 +17,8 @@ namespace phpOMS\tests\Utils\Converter; use phpOMS\Utils\Converter\FileSizeType; /** + * @testdox phpOMS\tests\Utils\Converter\FileSizeTypeTest: File size types + * * @internal */ class FileSizeTypeTest extends \PHPUnit\Framework\TestCase @@ -56,4 +58,32 @@ class FileSizeTypeTest extends \PHPUnit\Framework\TestCase self::assertEquals('kbit', FileSizeType::KILOBIT); self::assertEquals('bit', FileSizeType::BIT); } + + /** + * @testdox File sizes can get automatically formatted according to their size + * @covers phpOMS\Utils\Converter\FileSizeType + * @group framework + */ + public function testAutoFormat() : void + { + self::assertEquals( + [250.0, 'B'], + FileSizeType::autoFormat(250) + ); + + self::assertEquals( + [0.5, 'KB'], + FileSizeType::autoFormat(500) + ); + + self::assertEquals( + [1.024, 'MB'], + FileSizeType::autoFormat(1024 * 1000) + ); + + self::assertEquals( + [1.024, 'GB'], + FileSizeType::autoFormat(1024 * 1000 * 1000) + ); + } }