<?php 
 
declare(strict_types=1); 
 
/** 
 * Bench - Micro PHP library for benchmarking. 
 * 
 * @author    Eric Sizemore <[email protected]> 
 * @version   3.1.0 
 * @copyright (C) 2024 Eric Sizemore 
 * @license   The MIT License (MIT) 
 * 
 * Copyright (C) 2024 Eric Sizemore<https://www.secondversion.com/>. 
 * Copyright (C) 2012-2020 Jeremy Perret<[email protected]> 
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy 
 * of this software and associated documentation files (the "Software"), to 
 * deal in the Software without restriction, including without limitation the 
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 
 * sell copies of the Software, and to permit persons to whom the Software is 
 * furnished to do so, subject to the following conditions: 
 * 
 * The above copyright notice and this permission notice shall be included in 
 * all copies or substantial portions of the Software. 
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
 * THE SOFTWARE. 
 */ 
 
/** 
 * Esi\Bench is a fork of Ubench (https://github.com/devster/ubench) which is: 
 *     Copyright (c) 2012-2020 Jeremy Perret<[email protected]> 
 * 
 * For a list of changes in this library, in comparison to the original library, please {@see CHANGELOG.md}. 
 */ 
 
namespace Esi\Bench\Tests; 
 
use Esi\Bench\Bench; 
use Iterator; 
use LogicException; 
use PHPUnit\Framework\Attributes\CoversClass; 
use PHPUnit\Framework\Attributes\DataProvider; 
use PHPUnit\Framework\TestCase; 
 
use function sleep; 
 
/** 
 * Bench tests. 
 * @internal 
 */ 
#[CoversClass(Bench::class)] 
class BenchTest extends TestCase 
{ 
    public static function sizeProvider(): Iterator 
    { 
        yield ['90B', 90, null]; 
        yield ['1024B', 1024, null]; 
        yield ['1.47KB', 1500, null]; 
        yield ['9.54MB', 10000000, null]; 
        yield ['9.31GB', 10000000000, null]; 
        yield ['9.10TB', 10000000000000, null]; 
 
        yield ['90B', 90, '%.3f%s']; 
        yield ['1024B', 1024, '%.3f%s']; 
        yield ['1.465KB', 1500, '%.3f%s']; 
        yield ['9.537MB', 10000000, '%.3f%s']; 
        yield ['9.313GB', 10000000000, '%.3f%s']; 
        yield ['9.095TB', 10000000000000, '%.3f%s']; 
    } 
 
    #[DataProvider('sizeProvider')] 
    public function testReadableSize(string $expected, int $size, string | null $format): void 
    { 
        self::assertSame($expected, Bench::readableSize($size, $format)); 
    } 
 
    public static function timeProvider(): Iterator 
    { 
        yield ['900ms', 0.9004213]; 
        yield ['1.156s', 1.1557845]; 
    } 
 
    #[DataProvider('timeProvider')] 
    public function testReadableElapsedTime(string $expected, float $time): void 
    { 
        self::assertSame($expected, Bench::readableElapsedTime($time, '%.3f%s')); 
    } 
 
    public function testGetTime(): void 
    { 
        $bench = new Bench(); 
        $bench->start(); 
        $bench->end(); 
 
        self::assertMatchesRegularExpression('/^[0-9.]+ms/', $bench->getTime()); 
 
        $bench = new Bench(); 
        $bench->start(); 
        sleep(2); 
        $bench->end(); 
 
        self::assertMatchesRegularExpression('/^[0-9.]+s/', $bench->getTime()); 
        self::assertIsFloat($bench->getTime(true)); 
        self::assertMatchesRegularExpression('/^\d+s/', $bench->getTime(false, '%d%s')); 
    } 
 
    public function testGetMemoryUsage(): void 
    { 
        $bench = new Bench(); 
        $bench->start(); 
        $bench->end(); 
 
        self::assertMatchesRegularExpression('/^[0-9.]+MB/', $bench->getMemoryUsage()); 
        self::assertIsInt($bench->getMemoryUsage(true)); 
        self::assertMatchesRegularExpression('/^\d+MB/', $bench->getMemoryUsage(false, '%d%s')); 
    } 
 
    public function testGetMemoryPeak(): void 
    { 
        $bench = new Bench(); 
 
        self::assertMatchesRegularExpression('/^[0-9.]+MB/', $bench->getMemoryPeak()); 
        self::assertIsInt($bench->getMemoryPeak(true)); 
        self::assertMatchesRegularExpression('/^\d+MB/', $bench->getMemoryPeak(false, '%d%s')); 
    } 
 
    public function testCallableWithoutArguments(): void 
    { 
        $bench  = new Bench(); 
        $result = $bench->run(static fn (): true => true); 
 
        self::assertTrue($result); 
    } 
 
    public function testCallableWithArguments(): void 
    { 
        $bench  = new Bench(); 
        $result = $bench->run(static fn (int $one, int $two): int => $one + $two, 1, 2); 
 
        self::assertSame(3, $result); 
    } 
 
    public function testWasStart(): void 
    { 
        $bench = new Bench(); 
 
        self::assertFalse($bench->hasStarted()); 
        $bench->start(); 
        self::assertTrue($bench->hasStarted()); 
    } 
 
    public function testWasEnd(): void 
    { 
        $bench = new Bench(); 
        $bench->start(); 
 
        self::assertFalse($bench->hasEnded()); 
        $bench->end(); 
        self::assertTrue($bench->hasEnded()); 
    } 
 
    public function testEndException(): void 
    { 
        $this->expectException(LogicException::class); 
        $bench = new Bench(); 
        $bench->end(); 
    } 
 
    public function testGetTimeExceptionWithoutStart(): void 
    { 
        $this->expectException(LogicException::class); 
        $bench = new Bench(); 
        $bench->getTime(); 
    } 
 
 
    public function testGetTimeExceptionWithoutEnd(): void 
    { 
        $this->expectException(LogicException::class); 
        $bench = new Bench(); 
        $bench->start(); 
        $bench->getTime(); 
    } 
 
    public function testGetMemoryUsageWithoutStart(): void 
    { 
        $this->expectException(LogicException::class); 
        $bench = new Bench(); 
        $bench->getMemoryUsage(); 
    } 
 
    public function testGetMemoryUsageWithoutEnd(): void 
    { 
        $this->expectException(LogicException::class); 
        $bench = new Bench(); 
        $bench->start(); 
        $bench->getMemoryUsage(); 
    } 
} 
 
 |