setLogFile(new PathLogFile($this->fixturePath())); $log->parse(); $entries = $log->getEntries(); $this->assertNotEmpty($entries); $first = $entries[0]; $this->assertSame('General', $first->getPrefix()); $this->assertSame(Level::INFO, $first->getLevel()); $this->assertNotNull($first->getTime()); } public function testStackTraceLinesAttachToTriggeringErrorEntry(): void { $log = (new ProjectZomboidServerLog())->setLogFile(new PathLogFile($this->fixturePath())); $log->parse(); $errorEntry = null; foreach ($log->getEntries() as $entry) { if ($entry->getLevel() === Level::ERROR && $entry->getPrefix() === 'General') { $errorEntry = $entry; break; } } $this->assertNotNull($errorEntry); $this->assertGreaterThan(1, count($errorEntry->getLines())); } public function testWarnLevelMapsCorrectly(): void { $log = (new ProjectZomboidServerLog())->setLogFile(new PathLogFile($this->fixturePath())); $log->parse(); $warnEntries = array_filter($log->getEntries(), fn($e) => $e->getLevel() === Level::WARNING); $this->assertNotEmpty($warnEntries); } public function testDetectiveDispatchesByContent(): void { $detective = (new Detective()) ->setLogFile(new PathLogFile($this->fixturePath())) ->addPossibleLogClass(ProjectZomboidServerLog::class); $log = $detective->detect(); $this->assertInstanceOf(ProjectZomboidServerLog::class, $log); } }