plugin = $plugin; } public function getPlugin() : Main{ return $this->plugin; } final public function start() : void{ $this->startTime = time(); try{ $this->run(); }catch(TestFailedException $e){ $this->getPlugin()->getLogger()->error($e->getMessage()); $this->setResult(Test::RESULT_FAILED); }catch(\Throwable $e){ $this->getPlugin()->getLogger()->logException($e); $this->setResult(Test::RESULT_ERROR); } } public function tick() : void{ } abstract public function run() : void; public function isFinished() : bool{ return $this->result !== Test::RESULT_WAITING; } public function isTimedOut() : bool{ return !$this->isFinished() && time() - $this->timeout > $this->startTime; } protected function setTimeout(int $timeout) : void{ $this->timeout = $timeout; } public function getResult() : int{ return $this->result; } public function setResult(int $result) : void{ $this->result = $result; } abstract public function getName() : string; abstract public function getDescription() : string; }