Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Webmozart\PathUtil\Tests; Chris@0: Chris@0: use Webmozart\PathUtil\Path; Chris@0: Chris@0: /** Chris@0: * @since 1.0 Chris@0: * Chris@0: * @author Bernhard Schussek Chris@0: * @author Thomas Schulz Chris@0: */ Chris@0: class PathTest extends \PHPUnit_Framework_TestCase Chris@0: { Chris@0: protected $storedEnv = array(); Chris@0: Chris@0: public function setUp() Chris@0: { Chris@0: $this->storedEnv['HOME'] = getenv('HOME'); Chris@0: $this->storedEnv['HOMEDRIVE'] = getenv('HOMEDRIVE'); Chris@0: $this->storedEnv['HOMEPATH'] = getenv('HOMEPATH'); Chris@0: Chris@0: putenv('HOME=/home/webmozart'); Chris@0: putenv('HOMEDRIVE='); Chris@0: putenv('HOMEPATH='); Chris@0: } Chris@0: Chris@0: public function tearDown() Chris@0: { Chris@0: putenv('HOME='.$this->storedEnv['HOME']); Chris@0: putenv('HOMEDRIVE='.$this->storedEnv['HOMEDRIVE']); Chris@0: putenv('HOMEPATH='.$this->storedEnv['HOMEPATH']); Chris@0: } Chris@0: Chris@0: public function provideCanonicalizationTests() Chris@0: { Chris@0: return array( Chris@0: // relative paths (forward slash) Chris@0: array('css/./style.css', 'css/style.css'), Chris@0: array('css/../style.css', 'style.css'), Chris@0: array('css/./../style.css', 'style.css'), Chris@0: array('css/.././style.css', 'style.css'), Chris@0: array('css/../../style.css', '../style.css'), Chris@0: array('./css/style.css', 'css/style.css'), Chris@0: array('../css/style.css', '../css/style.css'), Chris@0: array('./../css/style.css', '../css/style.css'), Chris@0: array('.././css/style.css', '../css/style.css'), Chris@0: array('../../css/style.css', '../../css/style.css'), Chris@0: array('', ''), Chris@0: array('.', ''), Chris@0: array('..', '..'), Chris@0: array('./..', '..'), Chris@0: array('../.', '..'), Chris@0: array('../..', '../..'), Chris@0: Chris@0: // relative paths (backslash) Chris@0: array('css\\.\\style.css', 'css/style.css'), Chris@0: array('css\\..\\style.css', 'style.css'), Chris@0: array('css\\.\\..\\style.css', 'style.css'), Chris@0: array('css\\..\\.\\style.css', 'style.css'), Chris@0: array('css\\..\\..\\style.css', '../style.css'), Chris@0: array('.\\css\\style.css', 'css/style.css'), Chris@0: array('..\\css\\style.css', '../css/style.css'), Chris@0: array('.\\..\\css\\style.css', '../css/style.css'), Chris@0: array('..\\.\\css\\style.css', '../css/style.css'), Chris@0: array('..\\..\\css\\style.css', '../../css/style.css'), Chris@0: Chris@0: // absolute paths (forward slash, UNIX) Chris@0: array('/css/style.css', '/css/style.css'), Chris@0: array('/css/./style.css', '/css/style.css'), Chris@0: array('/css/../style.css', '/style.css'), Chris@0: array('/css/./../style.css', '/style.css'), Chris@0: array('/css/.././style.css', '/style.css'), Chris@0: array('/./css/style.css', '/css/style.css'), Chris@0: array('/../css/style.css', '/css/style.css'), Chris@0: array('/./../css/style.css', '/css/style.css'), Chris@0: array('/.././css/style.css', '/css/style.css'), Chris@0: array('/../../css/style.css', '/css/style.css'), Chris@0: Chris@0: // absolute paths (backslash, UNIX) Chris@0: array('\\css\\style.css', '/css/style.css'), Chris@0: array('\\css\\.\\style.css', '/css/style.css'), Chris@0: array('\\css\\..\\style.css', '/style.css'), Chris@0: array('\\css\\.\\..\\style.css', '/style.css'), Chris@0: array('\\css\\..\\.\\style.css', '/style.css'), Chris@0: array('\\.\\css\\style.css', '/css/style.css'), Chris@0: array('\\..\\css\\style.css', '/css/style.css'), Chris@0: array('\\.\\..\\css\\style.css', '/css/style.css'), Chris@0: array('\\..\\.\\css\\style.css', '/css/style.css'), Chris@0: array('\\..\\..\\css\\style.css', '/css/style.css'), Chris@0: Chris@0: // absolute paths (forward slash, Windows) Chris@0: array('C:/css/style.css', 'C:/css/style.css'), Chris@0: array('C:/css/./style.css', 'C:/css/style.css'), Chris@0: array('C:/css/../style.css', 'C:/style.css'), Chris@0: array('C:/css/./../style.css', 'C:/style.css'), Chris@0: array('C:/css/.././style.css', 'C:/style.css'), Chris@0: array('C:/./css/style.css', 'C:/css/style.css'), Chris@0: array('C:/../css/style.css', 'C:/css/style.css'), Chris@0: array('C:/./../css/style.css', 'C:/css/style.css'), Chris@0: array('C:/.././css/style.css', 'C:/css/style.css'), Chris@0: array('C:/../../css/style.css', 'C:/css/style.css'), Chris@0: Chris@0: // absolute paths (backslash, Windows) Chris@0: array('C:\\css\\style.css', 'C:/css/style.css'), Chris@0: array('C:\\css\\.\\style.css', 'C:/css/style.css'), Chris@0: array('C:\\css\\..\\style.css', 'C:/style.css'), Chris@0: array('C:\\css\\.\\..\\style.css', 'C:/style.css'), Chris@0: array('C:\\css\\..\\.\\style.css', 'C:/style.css'), Chris@0: array('C:\\.\\css\\style.css', 'C:/css/style.css'), Chris@0: array('C:\\..\\css\\style.css', 'C:/css/style.css'), Chris@0: array('C:\\.\\..\\css\\style.css', 'C:/css/style.css'), Chris@0: array('C:\\..\\.\\css\\style.css', 'C:/css/style.css'), Chris@0: array('C:\\..\\..\\css\\style.css', 'C:/css/style.css'), Chris@0: Chris@0: // Windows special case Chris@0: array('C:', 'C:/'), Chris@0: Chris@0: // Don't change malformed path Chris@0: array('C:css/style.css', 'C:css/style.css'), Chris@0: Chris@0: // absolute paths (stream, UNIX) Chris@0: array('phar:///css/style.css', 'phar:///css/style.css'), Chris@0: array('phar:///css/./style.css', 'phar:///css/style.css'), Chris@0: array('phar:///css/../style.css', 'phar:///style.css'), Chris@0: array('phar:///css/./../style.css', 'phar:///style.css'), Chris@0: array('phar:///css/.././style.css', 'phar:///style.css'), Chris@0: array('phar:///./css/style.css', 'phar:///css/style.css'), Chris@0: array('phar:///../css/style.css', 'phar:///css/style.css'), Chris@0: array('phar:///./../css/style.css', 'phar:///css/style.css'), Chris@0: array('phar:///.././css/style.css', 'phar:///css/style.css'), Chris@0: array('phar:///../../css/style.css', 'phar:///css/style.css'), Chris@0: Chris@0: // absolute paths (stream, Windows) Chris@0: array('phar://C:/css/style.css', 'phar://C:/css/style.css'), Chris@0: array('phar://C:/css/./style.css', 'phar://C:/css/style.css'), Chris@0: array('phar://C:/css/../style.css', 'phar://C:/style.css'), Chris@0: array('phar://C:/css/./../style.css', 'phar://C:/style.css'), Chris@0: array('phar://C:/css/.././style.css', 'phar://C:/style.css'), Chris@0: array('phar://C:/./css/style.css', 'phar://C:/css/style.css'), Chris@0: array('phar://C:/../css/style.css', 'phar://C:/css/style.css'), Chris@0: array('phar://C:/./../css/style.css', 'phar://C:/css/style.css'), Chris@0: array('phar://C:/.././css/style.css', 'phar://C:/css/style.css'), Chris@0: array('phar://C:/../../css/style.css', 'phar://C:/css/style.css'), Chris@0: Chris@0: // paths with "~" UNIX Chris@0: array('~/css/style.css', '/home/webmozart/css/style.css'), Chris@0: array('~/css/./style.css', '/home/webmozart/css/style.css'), Chris@0: array('~/css/../style.css', '/home/webmozart/style.css'), Chris@0: array('~/css/./../style.css', '/home/webmozart/style.css'), Chris@0: array('~/css/.././style.css', '/home/webmozart/style.css'), Chris@0: array('~/./css/style.css', '/home/webmozart/css/style.css'), Chris@0: array('~/../css/style.css', '/home/css/style.css'), Chris@0: array('~/./../css/style.css', '/home/css/style.css'), Chris@0: array('~/.././css/style.css', '/home/css/style.css'), Chris@0: array('~/../../css/style.css', '/css/style.css'), Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideCanonicalizationTests Chris@0: */ Chris@0: public function testCanonicalize($path, $canonicalized) Chris@0: { Chris@0: $this->assertSame($canonicalized, Path::canonicalize($path)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The path must be a string. Got: array Chris@0: */ Chris@0: public function testCanonicalizeFailsIfInvalidPath() Chris@0: { Chris@0: Path::canonicalize(array()); Chris@0: } Chris@0: Chris@0: public function provideGetDirectoryTests() Chris@0: { Chris@0: return array( Chris@0: array('/webmozart/puli/style.css', '/webmozart/puli'), Chris@0: array('/webmozart/puli', '/webmozart'), Chris@0: array('/webmozart', '/'), Chris@0: array('/', '/'), Chris@0: array('', ''), Chris@0: Chris@0: array('\\webmozart\\puli\\style.css', '/webmozart/puli'), Chris@0: array('\\webmozart\\puli', '/webmozart'), Chris@0: array('\\webmozart', '/'), Chris@0: array('\\', '/'), Chris@0: Chris@0: array('C:/webmozart/puli/style.css', 'C:/webmozart/puli'), Chris@0: array('C:/webmozart/puli', 'C:/webmozart'), Chris@0: array('C:/webmozart', 'C:/'), Chris@0: array('C:/', 'C:/'), Chris@0: array('C:', 'C:/'), Chris@0: Chris@0: array('C:\\webmozart\\puli\\style.css', 'C:/webmozart/puli'), Chris@0: array('C:\\webmozart\\puli', 'C:/webmozart'), Chris@0: array('C:\\webmozart', 'C:/'), Chris@0: array('C:\\', 'C:/'), Chris@0: Chris@0: array('phar:///webmozart/puli/style.css', 'phar:///webmozart/puli'), Chris@0: array('phar:///webmozart/puli', 'phar:///webmozart'), Chris@0: array('phar:///webmozart', 'phar:///'), Chris@0: array('phar:///', 'phar:///'), Chris@0: Chris@0: array('phar://C:/webmozart/puli/style.css', 'phar://C:/webmozart/puli'), Chris@0: array('phar://C:/webmozart/puli', 'phar://C:/webmozart'), Chris@0: array('phar://C:/webmozart', 'phar://C:/'), Chris@0: array('phar://C:/', 'phar://C:/'), Chris@0: Chris@0: array('webmozart/puli/style.css', 'webmozart/puli'), Chris@0: array('webmozart/puli', 'webmozart'), Chris@0: array('webmozart', ''), Chris@0: Chris@0: array('webmozart\\puli\\style.css', 'webmozart/puli'), Chris@0: array('webmozart\\puli', 'webmozart'), Chris@0: array('webmozart', ''), Chris@0: Chris@0: array('/webmozart/./puli/style.css', '/webmozart/puli'), Chris@0: array('/webmozart/../puli/style.css', '/puli'), Chris@0: array('/webmozart/./../puli/style.css', '/puli'), Chris@0: array('/webmozart/.././puli/style.css', '/puli'), Chris@0: array('/webmozart/../../puli/style.css', '/puli'), Chris@0: array('/.', '/'), Chris@0: array('/..', '/'), Chris@0: Chris@0: array('C:webmozart', ''), Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideGetDirectoryTests Chris@0: */ Chris@0: public function testGetDirectory($path, $directory) Chris@0: { Chris@0: $this->assertSame($directory, Path::getDirectory($path)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The path must be a string. Got: array Chris@0: */ Chris@0: public function testGetDirectoryFailsIfInvalidPath() Chris@0: { Chris@0: Path::getDirectory(array()); Chris@0: } Chris@0: Chris@0: public function provideGetFilenameTests() Chris@0: { Chris@0: return array( Chris@0: array('/webmozart/puli/style.css', 'style.css'), Chris@0: array('/webmozart/puli/STYLE.CSS', 'STYLE.CSS'), Chris@0: array('/webmozart/puli/style.css/', 'style.css'), Chris@0: array('/webmozart/puli/', 'puli'), Chris@0: array('/webmozart/puli', 'puli'), Chris@0: array('/', ''), Chris@0: array('', ''), Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideGetFilenameTests Chris@0: */ Chris@0: public function testGetFilename($path, $filename) Chris@0: { Chris@0: $this->assertSame($filename, Path::getFilename($path)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The path must be a string. Got: array Chris@0: */ Chris@0: public function testGetFilenameFailsIfInvalidPath() Chris@0: { Chris@0: Path::getFilename(array()); Chris@0: } Chris@0: Chris@0: public function provideGetFilenameWithoutExtensionTests() Chris@0: { Chris@0: return array( Chris@0: array('/webmozart/puli/style.css.twig', null, 'style.css'), Chris@0: array('/webmozart/puli/style.css.', null, 'style.css'), Chris@0: array('/webmozart/puli/style.css', null, 'style'), Chris@0: array('/webmozart/puli/.style.css', null, '.style'), Chris@0: array('/webmozart/puli/', null, 'puli'), Chris@0: array('/webmozart/puli', null, 'puli'), Chris@0: array('/', null, ''), Chris@0: array('', null, ''), Chris@0: Chris@0: array('/webmozart/puli/style.css', 'css', 'style'), Chris@0: array('/webmozart/puli/style.css', '.css', 'style'), Chris@0: array('/webmozart/puli/style.css', 'twig', 'style.css'), Chris@0: array('/webmozart/puli/style.css', '.twig', 'style.css'), Chris@0: array('/webmozart/puli/style.css', '', 'style.css'), Chris@0: array('/webmozart/puli/style.css.', '', 'style.css'), Chris@0: array('/webmozart/puli/style.css.', '.', 'style.css'), Chris@0: array('/webmozart/puli/style.css.', '.css', 'style.css'), Chris@0: array('/webmozart/puli/.style.css', 'css', '.style'), Chris@0: array('/webmozart/puli/.style.css', '.css', '.style'), Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideGetFilenameWithoutExtensionTests Chris@0: */ Chris@0: public function testGetFilenameWithoutExtension($path, $extension, $filename) Chris@0: { Chris@0: $this->assertSame($filename, Path::getFilenameWithoutExtension($path, $extension)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The path must be a string. Got: array Chris@0: */ Chris@0: public function testGetFilenameWithoutExtensionFailsIfInvalidPath() Chris@0: { Chris@0: Path::getFilenameWithoutExtension(array(), '.css'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The extension must be a string or null. Got: array Chris@0: */ Chris@0: public function testGetFilenameWithoutExtensionFailsIfInvalidExtension() Chris@0: { Chris@0: Path::getFilenameWithoutExtension('/style.css', array()); Chris@0: } Chris@0: Chris@0: public function provideGetExtensionTests() Chris@0: { Chris@0: $tests = array( Chris@0: array('/webmozart/puli/style.css.twig', false, 'twig'), Chris@0: array('/webmozart/puli/style.css', false, 'css'), Chris@0: array('/webmozart/puli/style.css.', false, ''), Chris@0: array('/webmozart/puli/', false, ''), Chris@0: array('/webmozart/puli', false, ''), Chris@0: array('/', false, ''), Chris@0: array('', false, ''), Chris@0: Chris@0: array('/webmozart/puli/style.CSS', false, 'CSS'), Chris@0: array('/webmozart/puli/style.CSS', true, 'css'), Chris@0: array('/webmozart/puli/style.ÄÖÜ', false, 'ÄÖÜ'), Chris@0: ); Chris@0: Chris@0: if (extension_loaded('mbstring')) { Chris@0: // This can only be tested, when mbstring is installed Chris@0: $tests[] = array('/webmozart/puli/style.ÄÖÜ', true, 'äöü'); Chris@0: } Chris@0: Chris@0: return $tests; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideGetExtensionTests Chris@0: */ Chris@0: public function testGetExtension($path, $forceLowerCase, $extension) Chris@0: { Chris@0: $this->assertSame($extension, Path::getExtension($path, $forceLowerCase)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The path must be a string. Got: array Chris@0: */ Chris@0: public function testGetExtensionFailsIfInvalidPath() Chris@0: { Chris@0: Path::getExtension(array()); Chris@0: } Chris@0: Chris@0: public function provideHasExtensionTests() Chris@0: { Chris@0: $tests = array( Chris@0: array(true, '/webmozart/puli/style.css.twig', null, false), Chris@0: array(true, '/webmozart/puli/style.css', null, false), Chris@0: array(false, '/webmozart/puli/style.css.', null, false), Chris@0: array(false, '/webmozart/puli/', null, false), Chris@0: array(false, '/webmozart/puli', null, false), Chris@0: array(false, '/', null, false), Chris@0: array(false, '', null, false), Chris@0: Chris@0: array(true, '/webmozart/puli/style.css.twig', 'twig', false), Chris@0: array(false, '/webmozart/puli/style.css.twig', 'css', false), Chris@0: array(true, '/webmozart/puli/style.css', 'css', false), Chris@0: array(true, '/webmozart/puli/style.css', '.css', false), Chris@0: array(true, '/webmozart/puli/style.css.', '', false), Chris@0: array(false, '/webmozart/puli/', 'ext', false), Chris@0: array(false, '/webmozart/puli', 'ext', false), Chris@0: array(false, '/', 'ext', false), Chris@0: array(false, '', 'ext', false), Chris@0: Chris@0: array(false, '/webmozart/puli/style.css', 'CSS', false), Chris@0: array(true, '/webmozart/puli/style.css', 'CSS', true), Chris@0: array(false, '/webmozart/puli/style.CSS', 'css', false), Chris@0: array(true, '/webmozart/puli/style.CSS', 'css', true), Chris@0: array(true, '/webmozart/puli/style.ÄÖÜ', 'ÄÖÜ', false), Chris@0: Chris@0: array(true, '/webmozart/puli/style.css', array('ext', 'css'), false), Chris@0: array(true, '/webmozart/puli/style.css', array('.ext', '.css'), false), Chris@0: array(true, '/webmozart/puli/style.css.', array('ext', ''), false), Chris@0: array(false, '/webmozart/puli/style.css', array('foo', 'bar', ''), false), Chris@0: array(false, '/webmozart/puli/style.css', array('.foo', '.bar', ''), false), Chris@0: ); Chris@0: Chris@0: if (extension_loaded('mbstring')) { Chris@0: // This can only be tested, when mbstring is installed Chris@0: $tests[] = array(true, '/webmozart/puli/style.ÄÖÜ', 'äöü', true); Chris@0: $tests[] = array(true, '/webmozart/puli/style.ÄÖÜ', array('äöü'), true); Chris@0: } Chris@0: Chris@0: return $tests; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideHasExtensionTests Chris@0: */ Chris@0: public function testHasExtension($hasExtension, $path, $extension, $ignoreCase) Chris@0: { Chris@0: $this->assertSame($hasExtension, Path::hasExtension($path, $extension, $ignoreCase)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The path must be a string. Got: array Chris@0: */ Chris@0: public function testHasExtensionFailsIfInvalidPath() Chris@0: { Chris@0: Path::hasExtension(array()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The extensions must be strings. Got: stdClass Chris@0: */ Chris@0: public function testHasExtensionFailsIfInvalidExtension() Chris@0: { Chris@0: Path::hasExtension('/style.css', (object) array()); Chris@0: } Chris@0: Chris@0: public function provideChangeExtensionTests() Chris@0: { Chris@0: return array( Chris@0: array('/webmozart/puli/style.css.twig', 'html', '/webmozart/puli/style.css.html'), Chris@0: array('/webmozart/puli/style.css', 'sass', '/webmozart/puli/style.sass'), Chris@0: array('/webmozart/puli/style.css', '.sass', '/webmozart/puli/style.sass'), Chris@0: array('/webmozart/puli/style.css', '', '/webmozart/puli/style.'), Chris@0: array('/webmozart/puli/style.css.', 'twig', '/webmozart/puli/style.css.twig'), Chris@0: array('/webmozart/puli/style.css.', '', '/webmozart/puli/style.css.'), Chris@0: array('/webmozart/puli/style.css', 'äöü', '/webmozart/puli/style.äöü'), Chris@0: array('/webmozart/puli/style.äöü', 'css', '/webmozart/puli/style.css'), Chris@0: array('/webmozart/puli/', 'css', '/webmozart/puli/'), Chris@0: array('/webmozart/puli', 'css', '/webmozart/puli.css'), Chris@0: array('/', 'css', '/'), Chris@0: array('', 'css', ''), Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideChangeExtensionTests Chris@0: */ Chris@0: public function testChangeExtension($path, $extension, $pathExpected) Chris@0: { Chris@0: static $call = 0; Chris@0: $this->assertSame($pathExpected, Path::changeExtension($path, $extension)); Chris@0: ++$call; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The path must be a string. Got: array Chris@0: */ Chris@0: public function testChangeExtensionFailsIfInvalidPath() Chris@0: { Chris@0: Path::changeExtension(array(), '.sass'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The extension must be a string. Got: array Chris@0: */ Chris@0: public function testChangeExtensionFailsIfInvalidExtension() Chris@0: { Chris@0: Path::changeExtension('/style.css', array()); Chris@0: } Chris@0: Chris@0: public function provideIsAbsolutePathTests() Chris@0: { Chris@0: return array( Chris@0: array('/css/style.css', true), Chris@0: array('/', true), Chris@0: array('css/style.css', false), Chris@0: array('', false), Chris@0: Chris@0: array('\\css\\style.css', true), Chris@0: array('\\', true), Chris@0: array('css\\style.css', false), Chris@0: Chris@0: array('C:/css/style.css', true), Chris@0: array('D:/', true), Chris@0: Chris@0: array('E:\\css\\style.css', true), Chris@0: array('F:\\', true), Chris@0: Chris@0: array('phar:///css/style.css', true), Chris@0: array('phar:///', true), Chris@0: Chris@0: // Windows special case Chris@0: array('C:', true), Chris@0: Chris@0: // Not considered absolute Chris@0: array('C:css/style.css', false), Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideIsAbsolutePathTests Chris@0: */ Chris@0: public function testIsAbsolute($path, $isAbsolute) Chris@0: { Chris@0: $this->assertSame($isAbsolute, Path::isAbsolute($path)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The path must be a string. Got: array Chris@0: */ Chris@0: public function testIsAbsoluteFailsIfInvalidPath() Chris@0: { Chris@0: Path::isAbsolute(array()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideIsAbsolutePathTests Chris@0: */ Chris@0: public function testIsRelative($path, $isAbsolute) Chris@0: { Chris@0: $this->assertSame(!$isAbsolute, Path::isRelative($path)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The path must be a string. Got: array Chris@0: */ Chris@0: public function testIsRelativeFailsIfInvalidPath() Chris@0: { Chris@0: Path::isRelative(array()); Chris@0: } Chris@0: Chris@0: public function provideGetRootTests() Chris@0: { Chris@0: return array( Chris@0: array('/css/style.css', '/'), Chris@0: array('/', '/'), Chris@0: array('css/style.css', ''), Chris@0: array('', ''), Chris@0: Chris@0: array('\\css\\style.css', '/'), Chris@0: array('\\', '/'), Chris@0: array('css\\style.css', ''), Chris@0: Chris@0: array('C:/css/style.css', 'C:/'), Chris@0: array('C:/', 'C:/'), Chris@0: array('C:', 'C:/'), Chris@0: Chris@0: array('D:\\css\\style.css', 'D:/'), Chris@0: array('D:\\', 'D:/'), Chris@0: Chris@0: array('phar:///css/style.css', 'phar:///'), Chris@0: array('phar:///', 'phar:///'), Chris@0: Chris@0: array('phar://C:/css/style.css', 'phar://C:/'), Chris@0: array('phar://C:/', 'phar://C:/'), Chris@0: array('phar://C:', 'phar://C:/'), Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideGetRootTests Chris@0: */ Chris@0: public function testGetRoot($path, $root) Chris@0: { Chris@0: $this->assertSame($root, Path::getRoot($path)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The path must be a string. Got: array Chris@0: */ Chris@0: public function testGetRootFailsIfInvalidPath() Chris@0: { Chris@0: Path::getRoot(array()); Chris@0: } Chris@0: Chris@0: public function providePathTests() Chris@0: { Chris@0: return array( Chris@0: // relative to absolute path Chris@0: array('css/style.css', '/webmozart/puli', '/webmozart/puli/css/style.css'), Chris@0: array('../css/style.css', '/webmozart/puli', '/webmozart/css/style.css'), Chris@0: array('../../css/style.css', '/webmozart/puli', '/css/style.css'), Chris@0: Chris@0: // relative to root Chris@0: array('css/style.css', '/', '/css/style.css'), Chris@0: array('css/style.css', 'C:', 'C:/css/style.css'), Chris@0: array('css/style.css', 'C:/', 'C:/css/style.css'), Chris@0: Chris@0: // same sub directories in different base directories Chris@0: array('../../puli/css/style.css', '/webmozart/css', '/puli/css/style.css'), Chris@0: Chris@0: array('', '/webmozart/puli', '/webmozart/puli'), Chris@0: array('..', '/webmozart/puli', '/webmozart'), Chris@0: ); Chris@0: } Chris@0: Chris@0: public function provideMakeAbsoluteTests() Chris@0: { Chris@0: return array_merge($this->providePathTests(), array( Chris@0: // collapse dots Chris@0: array('css/./style.css', '/webmozart/puli', '/webmozart/puli/css/style.css'), Chris@0: array('css/../style.css', '/webmozart/puli', '/webmozart/puli/style.css'), Chris@0: array('css/./../style.css', '/webmozart/puli', '/webmozart/puli/style.css'), Chris@0: array('css/.././style.css', '/webmozart/puli', '/webmozart/puli/style.css'), Chris@0: array('./css/style.css', '/webmozart/puli', '/webmozart/puli/css/style.css'), Chris@0: Chris@0: array('css\\.\\style.css', '\\webmozart\\puli', '/webmozart/puli/css/style.css'), Chris@0: array('css\\..\\style.css', '\\webmozart\\puli', '/webmozart/puli/style.css'), Chris@0: array('css\\.\\..\\style.css', '\\webmozart\\puli', '/webmozart/puli/style.css'), Chris@0: array('css\\..\\.\\style.css', '\\webmozart\\puli', '/webmozart/puli/style.css'), Chris@0: array('.\\css\\style.css', '\\webmozart\\puli', '/webmozart/puli/css/style.css'), Chris@0: Chris@0: // collapse dots on root Chris@0: array('./css/style.css', '/', '/css/style.css'), Chris@0: array('../css/style.css', '/', '/css/style.css'), Chris@0: array('../css/./style.css', '/', '/css/style.css'), Chris@0: array('../css/../style.css', '/', '/style.css'), Chris@0: array('../css/./../style.css', '/', '/style.css'), Chris@0: array('../css/.././style.css', '/', '/style.css'), Chris@0: Chris@0: array('.\\css\\style.css', '\\', '/css/style.css'), Chris@0: array('..\\css\\style.css', '\\', '/css/style.css'), Chris@0: array('..\\css\\.\\style.css', '\\', '/css/style.css'), Chris@0: array('..\\css\\..\\style.css', '\\', '/style.css'), Chris@0: array('..\\css\\.\\..\\style.css', '\\', '/style.css'), Chris@0: array('..\\css\\..\\.\\style.css', '\\', '/style.css'), Chris@0: Chris@0: array('./css/style.css', 'C:/', 'C:/css/style.css'), Chris@0: array('../css/style.css', 'C:/', 'C:/css/style.css'), Chris@0: array('../css/./style.css', 'C:/', 'C:/css/style.css'), Chris@0: array('../css/../style.css', 'C:/', 'C:/style.css'), Chris@0: array('../css/./../style.css', 'C:/', 'C:/style.css'), Chris@0: array('../css/.././style.css', 'C:/', 'C:/style.css'), Chris@0: Chris@0: array('.\\css\\style.css', 'C:\\', 'C:/css/style.css'), Chris@0: array('..\\css\\style.css', 'C:\\', 'C:/css/style.css'), Chris@0: array('..\\css\\.\\style.css', 'C:\\', 'C:/css/style.css'), Chris@0: array('..\\css\\..\\style.css', 'C:\\', 'C:/style.css'), Chris@0: array('..\\css\\.\\..\\style.css', 'C:\\', 'C:/style.css'), Chris@0: array('..\\css\\..\\.\\style.css', 'C:\\', 'C:/style.css'), Chris@0: Chris@0: array('./css/style.css', 'phar:///', 'phar:///css/style.css'), Chris@0: array('../css/style.css', 'phar:///', 'phar:///css/style.css'), Chris@0: array('../css/./style.css', 'phar:///', 'phar:///css/style.css'), Chris@0: array('../css/../style.css', 'phar:///', 'phar:///style.css'), Chris@0: array('../css/./../style.css', 'phar:///', 'phar:///style.css'), Chris@0: array('../css/.././style.css', 'phar:///', 'phar:///style.css'), Chris@0: Chris@0: array('./css/style.css', 'phar://C:/', 'phar://C:/css/style.css'), Chris@0: array('../css/style.css', 'phar://C:/', 'phar://C:/css/style.css'), Chris@0: array('../css/./style.css', 'phar://C:/', 'phar://C:/css/style.css'), Chris@0: array('../css/../style.css', 'phar://C:/', 'phar://C:/style.css'), Chris@0: array('../css/./../style.css', 'phar://C:/', 'phar://C:/style.css'), Chris@0: array('../css/.././style.css', 'phar://C:/', 'phar://C:/style.css'), Chris@0: Chris@0: // absolute paths Chris@0: array('/css/style.css', '/webmozart/puli', '/css/style.css'), Chris@0: array('\\css\\style.css', '/webmozart/puli', '/css/style.css'), Chris@0: array('C:/css/style.css', 'C:/webmozart/puli', 'C:/css/style.css'), Chris@0: array('D:\\css\\style.css', 'D:/webmozart/puli', 'D:/css/style.css'), Chris@0: )); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideMakeAbsoluteTests Chris@0: */ Chris@0: public function testMakeAbsolute($relativePath, $basePath, $absolutePath) Chris@0: { Chris@0: $this->assertSame($absolutePath, Path::makeAbsolute($relativePath, $basePath)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The path must be a string. Got: array Chris@0: */ Chris@0: public function testMakeAbsoluteFailsIfInvalidPath() Chris@0: { Chris@0: Path::makeAbsolute(array(), '/webmozart/puli'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The base path must be a non-empty string. Got: array Chris@0: */ Chris@0: public function testMakeAbsoluteFailsIfInvalidBasePath() Chris@0: { Chris@0: Path::makeAbsolute('css/style.css', array()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The base path "webmozart/puli" is not an absolute path. Chris@0: */ Chris@0: public function testMakeAbsoluteFailsIfBasePathNotAbsolute() Chris@0: { Chris@0: Path::makeAbsolute('css/style.css', 'webmozart/puli'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The base path must be a non-empty string. Got: "" Chris@0: */ Chris@0: public function testMakeAbsoluteFailsIfBasePathEmpty() Chris@0: { Chris@0: Path::makeAbsolute('css/style.css', ''); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The base path must be a non-empty string. Got: NULL Chris@0: */ Chris@0: public function testMakeAbsoluteFailsIfBasePathNull() Chris@0: { Chris@0: Path::makeAbsolute('css/style.css', null); Chris@0: } Chris@0: Chris@0: public function provideAbsolutePathsWithDifferentRoots() Chris@0: { Chris@0: return array( Chris@0: array('C:/css/style.css', '/webmozart/puli'), Chris@0: array('C:/css/style.css', '\\webmozart\\puli'), Chris@0: array('C:\\css\\style.css', '/webmozart/puli'), Chris@0: array('C:\\css\\style.css', '\\webmozart\\puli'), Chris@0: Chris@0: array('/css/style.css', 'C:/webmozart/puli'), Chris@0: array('/css/style.css', 'C:\\webmozart\\puli'), Chris@0: array('\\css\\style.css', 'C:/webmozart/puli'), Chris@0: array('\\css\\style.css', 'C:\\webmozart\\puli'), Chris@0: Chris@0: array('D:/css/style.css', 'C:/webmozart/puli'), Chris@0: array('D:/css/style.css', 'C:\\webmozart\\puli'), Chris@0: array('D:\\css\\style.css', 'C:/webmozart/puli'), Chris@0: array('D:\\css\\style.css', 'C:\\webmozart\\puli'), Chris@0: Chris@0: array('phar:///css/style.css', '/webmozart/puli'), Chris@0: array('/css/style.css', 'phar:///webmozart/puli'), Chris@0: Chris@0: array('phar://C:/css/style.css', 'C:/webmozart/puli'), Chris@0: array('phar://C:/css/style.css', 'C:\\webmozart\\puli'), Chris@0: array('phar://C:\\css\\style.css', 'C:/webmozart/puli'), Chris@0: array('phar://C:\\css\\style.css', 'C:\\webmozart\\puli'), Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideAbsolutePathsWithDifferentRoots Chris@0: */ Chris@0: public function testMakeAbsoluteDoesNotFailIfDifferentRoot($basePath, $absolutePath) Chris@0: { Chris@0: // If a path in partition D: is passed, but $basePath is in partition Chris@0: // C:, the path should be returned unchanged Chris@0: $this->assertSame(Path::canonicalize($absolutePath), Path::makeAbsolute($absolutePath, $basePath)); Chris@0: } Chris@0: Chris@0: public function provideMakeRelativeTests() Chris@0: { Chris@0: $paths = array_map(function (array $arguments) { Chris@0: return array($arguments[2], $arguments[1], $arguments[0]); Chris@0: }, $this->providePathTests()); Chris@0: Chris@0: return array_merge($paths, array( Chris@0: array('/webmozart/puli/./css/style.css', '/webmozart/puli', 'css/style.css'), Chris@0: array('/webmozart/puli/../css/style.css', '/webmozart/puli', '../css/style.css'), Chris@0: array('/webmozart/puli/.././css/style.css', '/webmozart/puli', '../css/style.css'), Chris@0: array('/webmozart/puli/./../css/style.css', '/webmozart/puli', '../css/style.css'), Chris@0: array('/webmozart/puli/../../css/style.css', '/webmozart/puli', '../../css/style.css'), Chris@0: array('/webmozart/puli/css/style.css', '/webmozart/./puli', 'css/style.css'), Chris@0: array('/webmozart/puli/css/style.css', '/webmozart/../puli', '../webmozart/puli/css/style.css'), Chris@0: array('/webmozart/puli/css/style.css', '/webmozart/./../puli', '../webmozart/puli/css/style.css'), Chris@0: array('/webmozart/puli/css/style.css', '/webmozart/.././puli', '../webmozart/puli/css/style.css'), Chris@0: array('/webmozart/puli/css/style.css', '/webmozart/../../puli', '../webmozart/puli/css/style.css'), Chris@0: Chris@0: // first argument shorter than second Chris@0: array('/css', '/webmozart/puli', '../../css'), Chris@0: Chris@0: // second argument shorter than first Chris@0: array('/webmozart/puli', '/css', '../webmozart/puli'), Chris@0: Chris@0: array('\\webmozart\\puli\\css\\style.css', '\\webmozart\\puli', 'css/style.css'), Chris@0: array('\\webmozart\\css\\style.css', '\\webmozart\\puli', '../css/style.css'), Chris@0: array('\\css\\style.css', '\\webmozart\\puli', '../../css/style.css'), Chris@0: Chris@0: array('C:/webmozart/puli/css/style.css', 'C:/webmozart/puli', 'css/style.css'), Chris@0: array('C:/webmozart/css/style.css', 'C:/webmozart/puli', '../css/style.css'), Chris@0: array('C:/css/style.css', 'C:/webmozart/puli', '../../css/style.css'), Chris@0: Chris@0: array('C:\\webmozart\\puli\\css\\style.css', 'C:\\webmozart\\puli', 'css/style.css'), Chris@0: array('C:\\webmozart\\css\\style.css', 'C:\\webmozart\\puli', '../css/style.css'), Chris@0: array('C:\\css\\style.css', 'C:\\webmozart\\puli', '../../css/style.css'), Chris@0: Chris@0: array('phar:///webmozart/puli/css/style.css', 'phar:///webmozart/puli', 'css/style.css'), Chris@0: array('phar:///webmozart/css/style.css', 'phar:///webmozart/puli', '../css/style.css'), Chris@0: array('phar:///css/style.css', 'phar:///webmozart/puli', '../../css/style.css'), Chris@0: Chris@0: array('phar://C:/webmozart/puli/css/style.css', 'phar://C:/webmozart/puli', 'css/style.css'), Chris@0: array('phar://C:/webmozart/css/style.css', 'phar://C:/webmozart/puli', '../css/style.css'), Chris@0: array('phar://C:/css/style.css', 'phar://C:/webmozart/puli', '../../css/style.css'), Chris@0: Chris@0: // already relative + already in root basepath Chris@0: array('../style.css', '/', 'style.css'), Chris@0: array('./style.css', '/', 'style.css'), Chris@0: array('../../style.css', '/', 'style.css'), Chris@0: array('..\\style.css', 'C:\\', 'style.css'), Chris@0: array('.\\style.css', 'C:\\', 'style.css'), Chris@0: array('..\\..\\style.css', 'C:\\', 'style.css'), Chris@0: array('../style.css', 'C:/', 'style.css'), Chris@0: array('./style.css', 'C:/', 'style.css'), Chris@0: array('../../style.css', 'C:/', 'style.css'), Chris@0: array('..\\style.css', '\\', 'style.css'), Chris@0: array('.\\style.css', '\\', 'style.css'), Chris@0: array('..\\..\\style.css', '\\', 'style.css'), Chris@0: array('../style.css', 'phar:///', 'style.css'), Chris@0: array('./style.css', 'phar:///', 'style.css'), Chris@0: array('../../style.css', 'phar:///', 'style.css'), Chris@0: array('..\\style.css', 'phar://C:\\', 'style.css'), Chris@0: array('.\\style.css', 'phar://C:\\', 'style.css'), Chris@0: array('..\\..\\style.css', 'phar://C:\\', 'style.css'), Chris@0: Chris@0: array('css/../style.css', '/', 'style.css'), Chris@0: array('css/./style.css', '/', 'css/style.css'), Chris@0: array('css\\..\\style.css', 'C:\\', 'style.css'), Chris@0: array('css\\.\\style.css', 'C:\\', 'css/style.css'), Chris@0: array('css/../style.css', 'C:/', 'style.css'), Chris@0: array('css/./style.css', 'C:/', 'css/style.css'), Chris@0: array('css\\..\\style.css', '\\', 'style.css'), Chris@0: array('css\\.\\style.css', '\\', 'css/style.css'), Chris@0: array('css/../style.css', 'phar:///', 'style.css'), Chris@0: array('css/./style.css', 'phar:///', 'css/style.css'), Chris@0: array('css\\..\\style.css', 'phar://C:\\', 'style.css'), Chris@0: array('css\\.\\style.css', 'phar://C:\\', 'css/style.css'), Chris@0: Chris@0: // already relative Chris@0: array('css/style.css', '/webmozart/puli', 'css/style.css'), Chris@0: array('css\\style.css', '\\webmozart\\puli', 'css/style.css'), Chris@0: Chris@0: // both relative Chris@0: array('css/style.css', 'webmozart/puli', '../../css/style.css'), Chris@0: array('css\\style.css', 'webmozart\\puli', '../../css/style.css'), Chris@0: Chris@0: // relative to empty Chris@0: array('css/style.css', '', 'css/style.css'), Chris@0: array('css\\style.css', '', 'css/style.css'), Chris@0: Chris@0: // different slashes in path and base path Chris@0: array('/webmozart/puli/css/style.css', '\\webmozart\\puli', 'css/style.css'), Chris@0: array('\\webmozart\\puli\\css\\style.css', '/webmozart/puli', 'css/style.css'), Chris@0: )); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideMakeRelativeTests Chris@0: */ Chris@0: public function testMakeRelative($absolutePath, $basePath, $relativePath) Chris@0: { Chris@0: $this->assertSame($relativePath, Path::makeRelative($absolutePath, $basePath)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The path must be a string. Got: array Chris@0: */ Chris@0: public function testMakeRelativeFailsIfInvalidPath() Chris@0: { Chris@0: Path::makeRelative(array(), '/webmozart/puli'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The base path must be a string. Got: array Chris@0: */ Chris@0: public function testMakeRelativeFailsIfInvalidBasePath() Chris@0: { Chris@0: Path::makeRelative('/webmozart/puli/css/style.css', array()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The absolute path "/webmozart/puli/css/style.css" cannot be made relative to the relative path "webmozart/puli". You should provide an absolute base path instead. Chris@0: */ Chris@0: public function testMakeRelativeFailsIfAbsolutePathAndBasePathNotAbsolute() Chris@0: { Chris@0: Path::makeRelative('/webmozart/puli/css/style.css', 'webmozart/puli'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The absolute path "/webmozart/puli/css/style.css" cannot be made relative to the relative path "". You should provide an absolute base path instead. Chris@0: */ Chris@0: public function testMakeRelativeFailsIfAbsolutePathAndBasePathEmpty() Chris@0: { Chris@0: Path::makeRelative('/webmozart/puli/css/style.css', ''); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The base path must be a string. Got: NULL Chris@0: */ Chris@0: public function testMakeRelativeFailsIfBasePathNull() Chris@0: { Chris@0: Path::makeRelative('/webmozart/puli/css/style.css', null); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideAbsolutePathsWithDifferentRoots Chris@0: * @expectedException \InvalidArgumentException Chris@0: */ Chris@0: public function testMakeRelativeFailsIfDifferentRoot($absolutePath, $basePath) Chris@0: { Chris@0: Path::makeRelative($absolutePath, $basePath); Chris@0: } Chris@0: Chris@0: public function provideIsLocalTests() Chris@0: { Chris@0: return array( Chris@0: array('/bg.png', true), Chris@0: array('bg.png', true), Chris@0: array('http://example.com/bg.png', false), Chris@0: array('http://example.com', false), Chris@0: array('', false), Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideIsLocalTests Chris@0: */ Chris@0: public function testIsLocal($path, $isLocal) Chris@0: { Chris@0: $this->assertSame($isLocal, Path::isLocal($path)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The path must be a string. Got: array Chris@0: */ Chris@0: public function testIsLocalFailsIfInvalidPath() Chris@0: { Chris@0: Path::isLocal(array()); Chris@0: } Chris@0: Chris@0: public function provideGetLongestCommonBasePathTests() Chris@0: { Chris@0: return array( Chris@0: // same paths Chris@0: array(array('/base/path', '/base/path'), '/base/path'), Chris@0: array(array('C:/base/path', 'C:/base/path'), 'C:/base/path'), Chris@0: array(array('C:\\base\\path', 'C:\\base\\path'), 'C:/base/path'), Chris@0: array(array('C:/base/path', 'C:\\base\\path'), 'C:/base/path'), Chris@0: array(array('phar:///base/path', 'phar:///base/path'), 'phar:///base/path'), Chris@0: array(array('phar://C:/base/path', 'phar://C:/base/path'), 'phar://C:/base/path'), Chris@0: Chris@0: // trailing slash Chris@0: array(array('/base/path/', '/base/path'), '/base/path'), Chris@0: array(array('C:/base/path/', 'C:/base/path'), 'C:/base/path'), Chris@0: array(array('C:\\base\\path\\', 'C:\\base\\path'), 'C:/base/path'), Chris@0: array(array('C:/base/path/', 'C:\\base\\path'), 'C:/base/path'), Chris@0: array(array('phar:///base/path/', 'phar:///base/path'), 'phar:///base/path'), Chris@0: array(array('phar://C:/base/path/', 'phar://C:/base/path'), 'phar://C:/base/path'), Chris@0: Chris@0: array(array('/base/path', '/base/path/'), '/base/path'), Chris@0: array(array('C:/base/path', 'C:/base/path/'), 'C:/base/path'), Chris@0: array(array('C:\\base\\path', 'C:\\base\\path\\'), 'C:/base/path'), Chris@0: array(array('C:/base/path', 'C:\\base\\path\\'), 'C:/base/path'), Chris@0: array(array('phar:///base/path', 'phar:///base/path/'), 'phar:///base/path'), Chris@0: array(array('phar://C:/base/path', 'phar://C:/base/path/'), 'phar://C:/base/path'), Chris@0: Chris@0: // first in second Chris@0: array(array('/base/path/sub', '/base/path'), '/base/path'), Chris@0: array(array('C:/base/path/sub', 'C:/base/path'), 'C:/base/path'), Chris@0: array(array('C:\\base\\path\\sub', 'C:\\base\\path'), 'C:/base/path'), Chris@0: array(array('C:/base/path/sub', 'C:\\base\\path'), 'C:/base/path'), Chris@0: array(array('phar:///base/path/sub', 'phar:///base/path'), 'phar:///base/path'), Chris@0: array(array('phar://C:/base/path/sub', 'phar://C:/base/path'), 'phar://C:/base/path'), Chris@0: Chris@0: // second in first Chris@0: array(array('/base/path', '/base/path/sub'), '/base/path'), Chris@0: array(array('C:/base/path', 'C:/base/path/sub'), 'C:/base/path'), Chris@0: array(array('C:\\base\\path', 'C:\\base\\path\\sub'), 'C:/base/path'), Chris@0: array(array('C:/base/path', 'C:\\base\\path\\sub'), 'C:/base/path'), Chris@0: array(array('phar:///base/path', 'phar:///base/path/sub'), 'phar:///base/path'), Chris@0: array(array('phar://C:/base/path', 'phar://C:/base/path/sub'), 'phar://C:/base/path'), Chris@0: Chris@0: // first is prefix Chris@0: array(array('/base/path/di', '/base/path/dir'), '/base/path'), Chris@0: array(array('C:/base/path/di', 'C:/base/path/dir'), 'C:/base/path'), Chris@0: array(array('C:\\base\\path\\di', 'C:\\base\\path\\dir'), 'C:/base/path'), Chris@0: array(array('C:/base/path/di', 'C:\\base\\path\\dir'), 'C:/base/path'), Chris@0: array(array('phar:///base/path/di', 'phar:///base/path/dir'), 'phar:///base/path'), Chris@0: array(array('phar://C:/base/path/di', 'phar://C:/base/path/dir'), 'phar://C:/base/path'), Chris@0: Chris@0: // second is prefix Chris@0: array(array('/base/path/dir', '/base/path/di'), '/base/path'), Chris@0: array(array('C:/base/path/dir', 'C:/base/path/di'), 'C:/base/path'), Chris@0: array(array('C:\\base\\path\\dir', 'C:\\base\\path\\di'), 'C:/base/path'), Chris@0: array(array('C:/base/path/dir', 'C:\\base\\path\\di'), 'C:/base/path'), Chris@0: array(array('phar:///base/path/dir', 'phar:///base/path/di'), 'phar:///base/path'), Chris@0: array(array('phar://C:/base/path/dir', 'phar://C:/base/path/di'), 'phar://C:/base/path'), Chris@0: Chris@0: // root is common base path Chris@0: array(array('/first', '/second'), '/'), Chris@0: array(array('C:/first', 'C:/second'), 'C:/'), Chris@0: array(array('C:\\first', 'C:\\second'), 'C:/'), Chris@0: array(array('C:/first', 'C:\\second'), 'C:/'), Chris@0: array(array('phar:///first', 'phar:///second'), 'phar:///'), Chris@0: array(array('phar://C:/first', 'phar://C:/second'), 'phar://C:/'), Chris@0: Chris@0: // windows vs unix Chris@0: array(array('/base/path', 'C:/base/path'), null), Chris@0: array(array('C:/base/path', '/base/path'), null), Chris@0: array(array('/base/path', 'C:\\base\\path'), null), Chris@0: array(array('phar:///base/path', 'phar://C:/base/path'), null), Chris@0: Chris@0: // different partitions Chris@0: array(array('C:/base/path', 'D:/base/path'), null), Chris@0: array(array('C:/base/path', 'D:\\base\\path'), null), Chris@0: array(array('C:\\base\\path', 'D:\\base\\path'), null), Chris@0: array(array('phar://C:/base/path', 'phar://D:/base/path'), null), Chris@0: Chris@0: // three paths Chris@0: array(array('/base/path/foo', '/base/path', '/base/path/bar'), '/base/path'), Chris@0: array(array('C:/base/path/foo', 'C:/base/path', 'C:/base/path/bar'), 'C:/base/path'), Chris@0: array(array('C:\\base\\path\\foo', 'C:\\base\\path', 'C:\\base\\path\\bar'), 'C:/base/path'), Chris@0: array(array('C:/base/path//foo', 'C:/base/path', 'C:\\base\\path\\bar'), 'C:/base/path'), Chris@0: array(array('phar:///base/path/foo', 'phar:///base/path', 'phar:///base/path/bar'), 'phar:///base/path'), Chris@0: array(array('phar://C:/base/path/foo', 'phar://C:/base/path', 'phar://C:/base/path/bar'), 'phar://C:/base/path'), Chris@0: Chris@0: // three paths with root Chris@0: array(array('/base/path/foo', '/', '/base/path/bar'), '/'), Chris@0: array(array('C:/base/path/foo', 'C:/', 'C:/base/path/bar'), 'C:/'), Chris@0: array(array('C:\\base\\path\\foo', 'C:\\', 'C:\\base\\path\\bar'), 'C:/'), Chris@0: array(array('C:/base/path//foo', 'C:/', 'C:\\base\\path\\bar'), 'C:/'), Chris@0: array(array('phar:///base/path/foo', 'phar:///', 'phar:///base/path/bar'), 'phar:///'), Chris@0: array(array('phar://C:/base/path/foo', 'phar://C:/', 'phar://C:/base/path/bar'), 'phar://C:/'), Chris@0: Chris@0: // three paths, different roots Chris@0: array(array('/base/path/foo', 'C:/base/path', '/base/path/bar'), null), Chris@0: array(array('/base/path/foo', 'C:\\base\\path', '/base/path/bar'), null), Chris@0: array(array('C:/base/path/foo', 'D:/base/path', 'C:/base/path/bar'), null), Chris@0: array(array('C:\\base\\path\\foo', 'D:\\base\\path', 'C:\\base\\path\\bar'), null), Chris@0: array(array('C:/base/path//foo', 'D:/base/path', 'C:\\base\\path\\bar'), null), Chris@0: array(array('phar:///base/path/foo', 'phar://C:/base/path', 'phar:///base/path/bar'), null), Chris@0: array(array('phar://C:/base/path/foo', 'phar://D:/base/path', 'phar://C:/base/path/bar'), null), Chris@0: Chris@0: // only one path Chris@0: array(array('/base/path'), '/base/path'), Chris@0: array(array('C:/base/path'), 'C:/base/path'), Chris@0: array(array('C:\\base\\path'), 'C:/base/path'), Chris@0: array(array('phar:///base/path'), 'phar:///base/path'), Chris@0: array(array('phar://C:/base/path'), 'phar://C:/base/path'), Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideGetLongestCommonBasePathTests Chris@0: */ Chris@0: public function testGetLongestCommonBasePath(array $paths, $basePath) Chris@0: { Chris@0: $this->assertSame($basePath, Path::getLongestCommonBasePath($paths)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The paths must be strings. Got: array Chris@0: */ Chris@0: public function testGetLongestCommonBasePathFailsIfInvalidPath() Chris@0: { Chris@0: Path::getLongestCommonBasePath(array(array())); Chris@0: } Chris@0: Chris@0: public function provideIsBasePathTests() Chris@0: { Chris@0: return array( Chris@0: // same paths Chris@0: array('/base/path', '/base/path', true), Chris@0: array('C:/base/path', 'C:/base/path', true), Chris@0: array('C:\\base\\path', 'C:\\base\\path', true), Chris@0: array('C:/base/path', 'C:\\base\\path', true), Chris@0: array('phar:///base/path', 'phar:///base/path', true), Chris@0: array('phar://C:/base/path', 'phar://C:/base/path', true), Chris@0: Chris@0: // trailing slash Chris@0: array('/base/path/', '/base/path', true), Chris@0: array('C:/base/path/', 'C:/base/path', true), Chris@0: array('C:\\base\\path\\', 'C:\\base\\path', true), Chris@0: array('C:/base/path/', 'C:\\base\\path', true), Chris@0: array('phar:///base/path/', 'phar:///base/path', true), Chris@0: array('phar://C:/base/path/', 'phar://C:/base/path', true), Chris@0: Chris@0: array('/base/path', '/base/path/', true), Chris@0: array('C:/base/path', 'C:/base/path/', true), Chris@0: array('C:\\base\\path', 'C:\\base\\path\\', true), Chris@0: array('C:/base/path', 'C:\\base\\path\\', true), Chris@0: array('phar:///base/path', 'phar:///base/path/', true), Chris@0: array('phar://C:/base/path', 'phar://C:/base/path/', true), Chris@0: Chris@0: // first in second Chris@0: array('/base/path/sub', '/base/path', false), Chris@0: array('C:/base/path/sub', 'C:/base/path', false), Chris@0: array('C:\\base\\path\\sub', 'C:\\base\\path', false), Chris@0: array('C:/base/path/sub', 'C:\\base\\path', false), Chris@0: array('phar:///base/path/sub', 'phar:///base/path', false), Chris@0: array('phar://C:/base/path/sub', 'phar://C:/base/path', false), Chris@0: Chris@0: // second in first Chris@0: array('/base/path', '/base/path/sub', true), Chris@0: array('C:/base/path', 'C:/base/path/sub', true), Chris@0: array('C:\\base\\path', 'C:\\base\\path\\sub', true), Chris@0: array('C:/base/path', 'C:\\base\\path\\sub', true), Chris@0: array('phar:///base/path', 'phar:///base/path/sub', true), Chris@0: array('phar://C:/base/path', 'phar://C:/base/path/sub', true), Chris@0: Chris@0: // first is prefix Chris@0: array('/base/path/di', '/base/path/dir', false), Chris@0: array('C:/base/path/di', 'C:/base/path/dir', false), Chris@0: array('C:\\base\\path\\di', 'C:\\base\\path\\dir', false), Chris@0: array('C:/base/path/di', 'C:\\base\\path\\dir', false), Chris@0: array('phar:///base/path/di', 'phar:///base/path/dir', false), Chris@0: array('phar://C:/base/path/di', 'phar://C:/base/path/dir', false), Chris@0: Chris@0: // second is prefix Chris@0: array('/base/path/dir', '/base/path/di', false), Chris@0: array('C:/base/path/dir', 'C:/base/path/di', false), Chris@0: array('C:\\base\\path\\dir', 'C:\\base\\path\\di', false), Chris@0: array('C:/base/path/dir', 'C:\\base\\path\\di', false), Chris@0: array('phar:///base/path/dir', 'phar:///base/path/di', false), Chris@0: array('phar://C:/base/path/dir', 'phar://C:/base/path/di', false), Chris@0: Chris@0: // root Chris@0: array('/', '/second', true), Chris@0: array('C:/', 'C:/second', true), Chris@0: array('C:', 'C:/second', true), Chris@0: array('C:\\', 'C:\\second', true), Chris@0: array('C:/', 'C:\\second', true), Chris@0: array('phar:///', 'phar:///second', true), Chris@0: array('phar://C:/', 'phar://C:/second', true), Chris@0: Chris@0: // windows vs unix Chris@0: array('/base/path', 'C:/base/path', false), Chris@0: array('C:/base/path', '/base/path', false), Chris@0: array('/base/path', 'C:\\base\\path', false), Chris@0: array('/base/path', 'phar:///base/path', false), Chris@0: array('phar:///base/path', 'phar://C:/base/path', false), Chris@0: Chris@0: // different partitions Chris@0: array('C:/base/path', 'D:/base/path', false), Chris@0: array('C:/base/path', 'D:\\base\\path', false), Chris@0: array('C:\\base\\path', 'D:\\base\\path', false), Chris@0: array('C:/base/path', 'phar://C:/base/path', false), Chris@0: array('phar://C:/base/path', 'phar://D:/base/path', false), Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideIsBasePathTests Chris@0: */ Chris@0: public function testIsBasePath($path, $ofPath, $result) Chris@0: { Chris@0: $this->assertSame($result, Path::isBasePath($path, $ofPath)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The base path must be a string. Got: array Chris@0: */ Chris@0: public function testIsBasePathFailsIfInvalidBasePath() Chris@0: { Chris@0: Path::isBasePath(array(), '/base/path'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The path must be a string. Got: array Chris@0: */ Chris@0: public function testIsBasePathFailsIfInvalidPath() Chris@0: { Chris@0: Path::isBasePath('/base/path', array()); Chris@0: } Chris@0: Chris@0: public function provideJoinTests() Chris@0: { Chris@0: return array( Chris@0: array('', '', ''), Chris@0: array('/path/to/test', '', '/path/to/test'), Chris@0: array('/path/to//test', '', '/path/to/test'), Chris@0: array('', '/path/to/test', '/path/to/test'), Chris@0: array('', '/path/to//test', '/path/to/test'), Chris@0: Chris@0: array('/path/to/test', 'subdir', '/path/to/test/subdir'), Chris@0: array('/path/to/test/', 'subdir', '/path/to/test/subdir'), Chris@0: array('/path/to/test', '/subdir', '/path/to/test/subdir'), Chris@0: array('/path/to/test/', '/subdir', '/path/to/test/subdir'), Chris@0: array('/path/to/test', './subdir', '/path/to/test/subdir'), Chris@0: array('/path/to/test/', './subdir', '/path/to/test/subdir'), Chris@0: array('/path/to/test/', '../parentdir', '/path/to/parentdir'), Chris@0: array('/path/to/test', '../parentdir', '/path/to/parentdir'), Chris@0: array('path/to/test/', '/subdir', 'path/to/test/subdir'), Chris@0: array('path/to/test', '/subdir', 'path/to/test/subdir'), Chris@0: array('../path/to/test', '/subdir', '../path/to/test/subdir'), Chris@0: array('path', '../../subdir', '../subdir'), Chris@0: array('/path', '../../subdir', '/subdir'), Chris@0: array('../path', '../../subdir', '../../subdir'), Chris@0: Chris@0: array(array('/path/to/test', 'subdir'), '', '/path/to/test/subdir'), Chris@0: array(array('/path/to/test', '/subdir'), '', '/path/to/test/subdir'), Chris@0: array(array('/path/to/test/', 'subdir'), '', '/path/to/test/subdir'), Chris@0: array(array('/path/to/test/', '/subdir'), '', '/path/to/test/subdir'), Chris@0: Chris@0: array(array('/path'), '', '/path'), Chris@0: array(array('/path', 'to', '/test'), '', '/path/to/test'), Chris@0: array(array('/path', '', '/test'), '', '/path/test'), Chris@0: array(array('path', 'to', 'test'), '', 'path/to/test'), Chris@0: array(array(), '', ''), Chris@0: Chris@0: array('base/path', 'to/test', 'base/path/to/test'), Chris@0: Chris@0: array('C:\\path\\to\\test', 'subdir', 'C:/path/to/test/subdir'), Chris@0: array('C:\\path\\to\\test\\', 'subdir', 'C:/path/to/test/subdir'), Chris@0: array('C:\\path\\to\\test', '/subdir', 'C:/path/to/test/subdir'), Chris@0: array('C:\\path\\to\\test\\', '/subdir', 'C:/path/to/test/subdir'), Chris@0: Chris@0: array('/', 'subdir', '/subdir'), Chris@0: array('/', '/subdir', '/subdir'), Chris@0: array('C:/', 'subdir', 'C:/subdir'), Chris@0: array('C:/', '/subdir', 'C:/subdir'), Chris@0: array('C:\\', 'subdir', 'C:/subdir'), Chris@0: array('C:\\', '/subdir', 'C:/subdir'), Chris@0: array('C:', 'subdir', 'C:/subdir'), Chris@0: array('C:', '/subdir', 'C:/subdir'), Chris@0: Chris@0: array('phar://', '/path/to/test', 'phar:///path/to/test'), Chris@0: array('phar:///', '/path/to/test', 'phar:///path/to/test'), Chris@0: array('phar:///path/to/test', 'subdir', 'phar:///path/to/test/subdir'), Chris@0: array('phar:///path/to/test', 'subdir/', 'phar:///path/to/test/subdir'), Chris@0: array('phar:///path/to/test', '/subdir', 'phar:///path/to/test/subdir'), Chris@0: array('phar:///path/to/test/', 'subdir', 'phar:///path/to/test/subdir'), Chris@0: array('phar:///path/to/test/', '/subdir', 'phar:///path/to/test/subdir'), Chris@0: Chris@0: array('phar://', 'C:/path/to/test', 'phar://C:/path/to/test'), Chris@0: array('phar://', 'C:\\path\\to\\test', 'phar://C:/path/to/test'), Chris@0: array('phar://C:/path/to/test', 'subdir', 'phar://C:/path/to/test/subdir'), Chris@0: array('phar://C:/path/to/test', 'subdir/', 'phar://C:/path/to/test/subdir'), Chris@0: array('phar://C:/path/to/test', '/subdir', 'phar://C:/path/to/test/subdir'), Chris@0: array('phar://C:/path/to/test/', 'subdir', 'phar://C:/path/to/test/subdir'), Chris@0: array('phar://C:/path/to/test/', '/subdir', 'phar://C:/path/to/test/subdir'), Chris@0: array('phar://C:', 'path/to/test', 'phar://C:/path/to/test'), Chris@0: array('phar://C:', '/path/to/test', 'phar://C:/path/to/test'), Chris@0: array('phar://C:/', 'path/to/test', 'phar://C:/path/to/test'), Chris@0: array('phar://C:/', '/path/to/test', 'phar://C:/path/to/test'), Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideJoinTests Chris@0: */ Chris@0: public function testJoin($path1, $path2, $result) Chris@0: { Chris@0: $this->assertSame($result, Path::join($path1, $path2)); Chris@0: } Chris@0: Chris@0: public function testJoinVarArgs() Chris@0: { Chris@0: $this->assertSame('/path', Path::join('/path')); Chris@0: $this->assertSame('/path/to', Path::join('/path', 'to')); Chris@0: $this->assertSame('/path/to/test', Path::join('/path', 'to', '/test')); Chris@0: $this->assertSame('/path/to/test/subdir', Path::join('/path', 'to', '/test', 'subdir/')); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: * @expectedExceptionMessage The paths must be strings. Got: array Chris@0: */ Chris@0: public function testJoinFailsIfInvalidPath() Chris@0: { Chris@0: Path::join('/path', array()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \RuntimeException Chris@0: * @expectedExceptionMessage Your environment or operation system isn't supported Chris@0: */ Chris@0: public function testGetHomeDirectoryFailsIfNotSupportedOperationSystem() Chris@0: { Chris@0: putenv('HOME='); Chris@0: Chris@0: Path::getHomeDirectory(); Chris@0: } Chris@0: Chris@0: public function testGetHomeDirectoryForUnix() Chris@0: { Chris@0: $this->assertEquals('/home/webmozart', Path::getHomeDirectory()); Chris@0: } Chris@0: Chris@0: public function testGetHomeDirectoryForWindows() Chris@0: { Chris@0: putenv('HOME='); Chris@0: putenv('HOMEDRIVE=C:'); Chris@0: putenv('HOMEPATH=/users/webmozart'); Chris@0: Chris@0: $this->assertEquals('C:/users/webmozart', Path::getHomeDirectory()); Chris@0: } Chris@0: Chris@0: public function testNormalize() Chris@0: { Chris@0: $this->assertSame('C:/Foo/Bar/test', Path::normalize('C:\\Foo\\Bar/test')); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException \InvalidArgumentException Chris@0: */ Chris@0: public function testNormalizeFailsIfNoString() Chris@0: { Chris@0: Path::normalize(true); Chris@0: } Chris@0: }