* Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Test; use Composer\InstalledVersions; use Composer\Semver\VersionParser; class InstalledVersionsTest extends TestCase { public static function setUpBeforeClass() { // disable multiple-ClassLoader-based checks of InstalledVersions by making it seem like no // class loaders are registered $prop = new \ReflectionProperty('Composer\Autoload\ClassLoader', 'registeredLoaders'); $prop->setAccessible(true); $prop->setValue(array()); } public static function tearDownAfterClass() { self::setUpBeforeClass(); } public function setUp() { InstalledVersions::reload(require __DIR__.'/Repository/Fixtures/installed.php'); } public function testGetInstalledPackages() { $names = array( '__root__', 'a/provider', 'a/provider2', 'b/replacer', 'c/c', 'foo/impl', 'foo/impl2', 'foo/replaced', ); $this->assertSame($names, InstalledVersions::getInstalledPackages()); } /** * @dataProvider isInstalledProvider */ public function testIsInstalled($expected, $name, $includeDevRequirements = true) { $this->assertSame($expected, InstalledVersions::isInstalled($name, $includeDevRequirements)); } public static function isInstalledProvider() { return array( array(true, 'foo/impl'), array(true, 'foo/replaced'), array(true, 'c/c'), array(false, 'c/c', false), array(true, '__root__'), array(true, 'b/replacer'), array(false, 'not/there'), ); } /** * @dataProvider satisfiesProvider */ public function testSatisfies($expected, $name, $constraint) { $this->assertSame($expected, InstalledVersions::satisfies(new VersionParser, $name, $constraint)); } public static function satisfiesProvider() { return array( array(true, 'foo/impl', '1.5'), array(true, 'foo/impl', '1.2'), array(true, 'foo/impl', '^1.0'), array(true, 'foo/impl', '^3 || ^2'), array(false, 'foo/impl', '^3'), array(true, 'foo/replaced', '3.5'), array(true, 'foo/replaced', '^3.2'), array(false, 'foo/replaced', '4.0'), array(true, 'c/c', '3.0.0'), array(true, 'c/c', '^3'), array(false, 'c/c', '^3.1'), array(true, '__root__', 'dev-master'), array(true, '__root__', '^1.10'), array(false, '__root__', '^2'), array(true, 'b/replacer', '^2.1'), array(false, 'b/replacer', '^2.3'), array(true, 'a/provider2', '^1.2'), array(true, 'a/provider2', '^1.4'), array(false, 'a/provider2', '^1.5'), ); } /** * @dataProvider getVersionRangesProvider */ public function testGetVersionRanges($expected, $name) { $this->assertSame($expected, InstalledVersions::getVersionRanges($name)); } public static function getVersionRangesProvider() { return array( array('dev-master || 1.10.x-dev', '__root__'), array('^1.1 || 1.2 || 1.4 || 2.0', 'foo/impl'), array('2.2 || 2.0', 'foo/impl2'), array('^3.0', 'foo/replaced'), array('1.1', 'a/provider'), array('1.2 || 1.4', 'a/provider2'), array('2.2', 'b/replacer'), array('3.0', 'c/c'), ); } /** * @dataProvider getVersionProvider */ public function testGetVersion($expected, $name) { $this->assertSame($expected, InstalledVersions::getVersion($name)); } public static function getVersionProvider() { return array( array('dev-master', '__root__'), array(null, 'foo/impl'), array(null, 'foo/impl2'), array(null, 'foo/replaced'), array('1.1.0.0', 'a/provider'), array('1.2.0.0', 'a/provider2'), array('2.2.0.0', 'b/replacer'), array('3.0.0.0', 'c/c'), ); } /** * @dataProvider getPrettyVersionProvider */ public function testGetPrettyVersion($expected, $name) { $this->assertSame($expected, InstalledVersions::getPrettyVersion($name)); } public static function getPrettyVersionProvider() { return array( array('dev-master', '__root__'), array(null, 'foo/impl'), array(null, 'foo/impl2'), array(null, 'foo/replaced'), array('1.1', 'a/provider'), array('1.2', 'a/provider2'), array('2.2', 'b/replacer'), array('3.0', 'c/c'), ); } public function testGetVersionOutOfBounds() { $this->setExpectedException('OutOfBoundsException'); InstalledVersions::getVersion('not/installed'); } public function testGetRootPackage() { $this->assertSame(array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'aliases' => array( '1.10.x-dev', ), 'reference' => 'sourceref-by-default', 'dev-requirement' => true, 'name' => '__root__', ), InstalledVersions::getRootPackage()); } public function testGetRawData() { $this->assertSame(require __DIR__.'/Repository/Fixtures/installed.php', InstalledVersions::getRawData()); } /** * @dataProvider getReferenceProvider */ public function testGetReference($expected, $name) { $this->assertSame($expected, InstalledVersions::getReference($name)); } public static function getReferenceProvider() { return array( array('sourceref-by-default', '__root__'), array(null, 'foo/impl'), array(null, 'foo/impl2'), array(null, 'foo/replaced'), array('distref-as-no-source', 'a/provider'), array('distref-as-installed-from-dist', 'a/provider2'), array(null, 'b/replacer'), array(null, 'c/c'), ); } }