From 1d09358e7bc5070a524b0edbf9d34ec519a61bb1 Mon Sep 17 00:00:00 2001 From: indifferentketchup Date: Thu, 30 Apr 2026 21:32:15 +0000 Subject: [PATCH] Add ModMissingProblem and ModMissingSolution --- .../ProjectZomboid/ModMissingProblem.php | 39 ++++++++++++++ .../ProjectZomboid/ModMissingSolution.php | 24 +++++++++ .../Analysis/ModMissingProblemTest.php | 51 +++++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 src/Analysis/ProjectZomboid/ModMissingProblem.php create mode 100644 src/Analysis/ProjectZomboid/ModMissingSolution.php create mode 100644 test/tests/Games/ProjectZomboid/Analysis/ModMissingProblemTest.php diff --git a/src/Analysis/ProjectZomboid/ModMissingProblem.php b/src/Analysis/ProjectZomboid/ModMissingProblem.php new file mode 100644 index 0000000..c5fc98e --- /dev/null +++ b/src/Analysis/ProjectZomboid/ModMissingProblem.php @@ -0,0 +1,39 @@ +modName = $matches['mod']; + $this->addSolution((new ModMissingSolution())->setModName($this->modName)); + } + + public function getModName(): string + { + return $this->modName; + } + + public function getMessage(): string + { + return sprintf('Required mod "%s" not found.', $this->modName); + } + + public function isEqual(InsightInterface $insight): bool + { + return $insight instanceof self && $insight->getModName() === $this->modName; + } +} diff --git a/src/Analysis/ProjectZomboid/ModMissingSolution.php b/src/Analysis/ProjectZomboid/ModMissingSolution.php new file mode 100644 index 0000000..3806d04 --- /dev/null +++ b/src/Analysis/ProjectZomboid/ModMissingSolution.php @@ -0,0 +1,24 @@ +modName = $modName; + return $this; + } + + public function getMessage(): string + { + return sprintf( + 'Subscribe to mod "%s" or remove its ID from the Mods= line in serverconfig.ini.', + $this->modName + ); + } +} diff --git a/test/tests/Games/ProjectZomboid/Analysis/ModMissingProblemTest.php b/test/tests/Games/ProjectZomboid/Analysis/ModMissingProblemTest.php new file mode 100644 index 0000000..41219f5 --- /dev/null +++ b/test/tests/Games/ProjectZomboid/Analysis/ModMissingProblemTest.php @@ -0,0 +1,51 @@ +assertSame([DebugServerPattern::MOD_MISSING], ModMissingProblem::getPatterns()); + } + + public function testSetMatchesExtractsModNameAndAttachesSolution(): void + { + $line = '[16-04-26 00:01:19.200] WARN : Mod f:0, t:1776297679200, st:48,648,194,378> ZomboidFileSystem.loadModAndRequired> required mod "absent_mod" not found.'; + $this->assertSame(1, preg_match(DebugServerPattern::MOD_MISSING, $line, $matches)); + + $problem = new ModMissingProblem(); + $problem->setMatches($matches, 0); + + $this->assertSame('absent_mod', $problem->getModName()); + $this->assertStringContainsString('absent_mod', $problem->getMessage()); + $this->assertCount(1, $problem->getSolutions()); + + $solution = $problem->getSolutions()[0]; + $this->assertInstanceOf(ModMissingSolution::class, $solution); + $this->assertStringContainsString('absent_mod', $solution->getMessage()); + $this->assertStringContainsString('serverconfig.ini', $solution->getMessage()); + } + + public function testIsEqualCoalescesSameMissingMod(): void + { + $a = $this->problemFor('mod_x'); + $b = $this->problemFor('mod_x'); + $c = $this->problemFor('mod_y'); + + $this->assertTrue($a->isEqual($b)); + $this->assertFalse($a->isEqual($c)); + } + + private function problemFor(string $modName): ModMissingProblem + { + $problem = new ModMissingProblem(); + $problem->setMatches(['mod' => $modName], 0); + return $problem; + } +}