resolver = new SharePathResolver(); } public function testNormalizeRelativeKeepsSimplePath(): void { self::assertSame('a/b', $this->resolver->normalizeRelative('a/b')); } public function testNormalizeRelativeStripsDotsAndSlashes(): void { self::assertSame('a/b', $this->resolver->normalizeRelative('/a/./b/')); } public function testNormalizeRelativeConvertsBackslashes(): void { self::assertSame('a/b', $this->resolver->normalizeRelative('a\b')); } public function testNormalizeRelativeRejectsParentTraversal(): void { $this->expectException(InvalidPathException::class); $this->resolver->normalizeRelative('a/../b'); } public function testNormalizeRelativeRejectsLeadingParent(): void { $this->expectException(InvalidPathException::class); $this->resolver->normalizeRelative('../etc/passwd'); } public function testFullPathJoinsBaseAndRelative(): void { self::assertSame('/Projets/a/b', $this->resolver->fullPath('/Projets', 'a/b')); } public function testFullPathWithEmptyBaseAndEmptyRelativeIsRoot(): void { self::assertSame('/', $this->resolver->fullPath('', '')); } public function testFullPathTrimsBaseSlashes(): void { self::assertSame('/Projets/a', $this->resolver->fullPath('/Projets/', 'a')); } }