toString()); $path2 = UnixPath::parse('/invalid/level/of/nesting/../../../../../../../../../../i/am/test/unix/path'); self::assertEquals('/i/am/test/unix/path', $path2->toString()); $path3 = UnixPath::parse('/i/./am/./skipme/./.././test/./unix/path', true); self::assertEquals('/i/am/test/unix/path', $path3->toString()); } public function testCreateStrict(): void { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Path went beyond root'); UnixPath::parse('/invalid/level/of/nesting/../../../../../../../../../../i/am/test/unix/path', true); } public function testCreateInvalid(): void { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Valid unix path must begin with a slash'); UnixPath::parse('not/starting/with/slash', true); } public function testResolveRelative(): void { $path = UnixPath::parse('/i/am/test/unix/path'); $rp = new RelativePath('/i/am/test/relative/path'); self::assertEquals( '/i/am/test/relative/path', $path->resolveRelative($rp)->toString() ); $rp = new RelativePath('i/am/test/relative/path'); self::assertEquals( '/i/am/test/unix/path/i/am/test/relative/path', $path->resolveRelative($rp)->toString() ); $rp = new RelativePath('../../i/am/test/relative/path'); self::assertEquals( '/i/am/test/i/am/test/relative/path', $path->resolveRelative($rp)->toString() ); $rp = new RelativePath('../../../../../../../../i/am/test/relative/path'); self::assertEquals( '/i/am/test/relative/path', $path->resolveRelative($rp)->toString() ); $rp = new RelativePath('..'); self::assertEquals( '/i/am/test/unix', $path->resolveRelative($rp)->toString() ); $rp = new RelativePath('.'); self::assertEquals( '/i/am/test/unix/path', $path->resolveRelative($rp)->toString() ); } public function testResolveRelativeStrict(): void { $path = UnixPath::parse('/i/am/test/unix/path'); $rp = new RelativePath('/i/am/test/relative/path'); self::assertEquals( '/i/am/test/relative/path', $path->resolveRelative($rp, true)->toString() ); $rp = new RelativePath('i/am/test/relative/path'); self::assertEquals( '/i/am/test/unix/path/i/am/test/relative/path', $path->resolveRelative($rp, true)->toString() ); $rp = new RelativePath('../../i/am/test/relative/path'); self::assertEquals( '/i/am/test/i/am/test/relative/path', $path->resolveRelative($rp, true)->toString() ); $rp = new RelativePath('..'); self::assertEquals( '/i/am/test/unix', $path->resolveRelative($rp)->toString() ); $rp = new RelativePath('.'); self::assertEquals( '/i/am/test/unix/path', $path->resolveRelative($rp)->toString() ); } public function testResolveRelativeStrictInvalid(): void { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Relative path went beyond root'); $path = UnixPath::parse('/i/am/test/unix/path'); $rp4 = new RelativePath('../../../../../../../../i/am/test/relative/path'); $path->resolveRelative($rp4, true); } }