<?php

declare(strict_types=1);

namespace Benzine\Tests;

use PHPUnit\Framework\TestCase;

abstract class AbstractTestCase extends TestCase
{
    use Traits\OverrideProtectionTrait;
    use Traits\ArrayEquitabilityTrait;

    private $singleTestTime;

    private $waypoint_count;
    private $waypoint_last_time;

    public function setUp(): void
    {
        parent::setUp();
        $this->singleTestTime     = microtime(true);
        $this->waypoint_count     = 0;
        $this->waypoint_last_time = $this->singleTestTime;
    }

    public function tearDown(): void
    {
        parent::tearDown();
        if (defined('DEBUG') && DEBUG) {
            $time = microtime(true) - $this->singleTestTime;
            echo '' . get_called_class() . ':' . $this->getName() . ': Took ' . number_format($time, 3) . " seconds\n\n";
        }
    }

    public function waypoint($message = ''): void
    {
        if (defined('DEBUG') && DEBUG) {
            $time_since_last_waypoint = number_format((microtime(true) - $this->waypoint_last_time) * 1000, 2, '.', '');
            $time_since_begin         = number_format((microtime(true) - $this->singleTestTime) * 1000, 2, '.', '');
            ++$this->waypoint_count;
            if (1 == $this->waypoint_count) {
                echo "\n";
            }
            echo " > Waypoint {$this->waypoint_count} - {$time_since_last_waypoint}ms / {$time_since_begin}ms {$message}\n";
            $this->waypoint_last_time = microtime(true);
        }
    }
}