Add ProjectZomboidPerkLog (PerkLog.txt)

Per-line skill snapshot log; each Login event is paired with a perks
row containing comma-separated Skill=N tokens. PERK_PAIR regex extracts
each pair via preg_match_all for analyser use. Detectors: filename
match plus content signature on the unique '[Cooking=N, Fitness=N,
Strength=N,' prefix of the perks-row bracket.
This commit is contained in:
2026-04-30 20:38:39 +00:00
parent 6387fb1c52
commit 00c17261a3
4 changed files with 130 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
<?php
namespace IndifferentKetchup\Codex\Test\Tests\Games\ProjectZomboid\Log;
use IndifferentKetchup\Codex\Detective\Detective;
use IndifferentKetchup\Codex\Log\File\PathLogFile;
use IndifferentKetchup\Codex\Log\ProjectZomboid\ProjectZomboidPerkLog;
use IndifferentKetchup\Codex\Pattern\ProjectZomboid\PerkPattern;
use PHPUnit\Framework\TestCase;
class ProjectZomboidPerkLogTest extends TestCase
{
private function fixturePath(): string
{
return __DIR__ . '/../../../../src/Games/ProjectZomboid/fixtures/perk-minimal.txt';
}
public function testParsesEachLineAsAnEntry(): void
{
$log = (new ProjectZomboidPerkLog())->setLogFile(new PathLogFile($this->fixturePath()));
$log->parse();
$this->assertCount(6, $log->getEntries());
}
public function testFieldsRegexHandlesEventRow(): void
{
$line = '[16-04-26 18:29:08.171] [76561198000000001][Player1][1000,2000,1][Login][Hours Survived: 100].';
$this->assertSame(1, preg_match(PerkPattern::FIELDS, $line, $m));
$this->assertSame('Player1', $m['player']);
$this->assertSame('Login', $m['event']);
$this->assertSame('100', $m['hours']);
}
public function testFieldsRegexHandlesPerksRow(): void
{
$line = '[16-04-26 18:30:02.500] [76561198000000003][AdminUser][1020,2020,0][Logout][Hours Survived: 75].';
$this->assertSame(1, preg_match(PerkPattern::FIELDS, $line, $m));
$this->assertSame('Logout', $m['event']);
}
public function testPerkPairRegexExtractsSkillsFromBracketedList(): void
{
$bracket = 'Cooking=5, Fitness=6, Strength=7';
$count = preg_match_all(PerkPattern::PERK_PAIR, $bracket, $matches, PREG_SET_ORDER);
$this->assertSame(3, $count);
$this->assertSame('Cooking', $matches[0]['skill']);
$this->assertSame('5', $matches[0]['level']);
}
public function testDetectiveDispatchesByContent(): void
{
$detective = (new Detective())
->setLogFile(new PathLogFile($this->fixturePath()))
->addPossibleLogClass(ProjectZomboidPerkLog::class);
$this->assertInstanceOf(ProjectZomboidPerkLog::class, $detective->detect());
}
}