from abc import ABC, abstractmethod
from pathlib import Path
import time


class BenchmarkBase(ABC):
    def __init__(self, test_file_name: Path) -> None:
        self.test_file_name = test_file_name

    def _read_test_file(self) -> str:
        with open(self.test_file_name, "r") as f:
            return f.read()

    def start_timer(self) -> None:
        self.__timer = time.perf_counter()

    def stop_timer(self) -> float:
        return time.perf_counter() - self.__timer

    def execute(self) -> float:
        print(f"*** Running {self.__class__.__name__}")
        self.start_timer()
        self._benchmark()

        benchmark_time = self.stop_timer()
        print(f"Finished in {benchmark_time:0.3f}s")

        return benchmark_time

    @abstractmethod
    def _benchmark(self):
        ...
