Correct version contraint matching and add tests for various cases
parent
1870291949
commit
d5dd86cd75
|
@ -36,9 +36,32 @@ class VersionConstraint extends SpecificConstraint
|
||||||
$this->version = $version;
|
$this->version = $version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param VersionConstraint $provider
|
||||||
|
*/
|
||||||
public function matchSpecific(VersionConstraint $provider)
|
public function matchSpecific(VersionConstraint $provider)
|
||||||
{
|
{
|
||||||
return version_compare($provider->version, $this->version, $this->operator);
|
$noEqualOp = str_replace('=', '', $this->operator);
|
||||||
|
$providerNoEqualOp = str_replace('=', '', $provider->operator);
|
||||||
|
|
||||||
|
// an example for the condition is <= 2.0 & < 1.0
|
||||||
|
// these kinds of comparisons always have a solution
|
||||||
|
if ($this->operator != '==' && $noEqualOp == $providerNoEqualOp) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (version_compare($provider->version, $this->version, $this->operator)) {
|
||||||
|
// special case, e.g. require >= 1.0 and provide < 1.0
|
||||||
|
// 1.0 >= 1.0 but 1.0 is outside of the provided interval
|
||||||
|
if ($provider->version == $this->version && $provider->operator == $providerNoEqualOp && $this->operator != $noEqualOp) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function __toString()
|
public function __toString()
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Composer.
|
||||||
|
*
|
||||||
|
* (c) Nils Adermann <naderman@naderman.de>
|
||||||
|
* Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Composer\Test\Package;
|
||||||
|
|
||||||
|
use Composer\Package\LinkConstraint\VersionConstraint;
|
||||||
|
|
||||||
|
class VersionConstraintTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
static public function successfulVersionMatches()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
// require provide
|
||||||
|
array('==', '1', '==', '1'),
|
||||||
|
array('>=', '1', '>=', '2'),
|
||||||
|
array('>=', '2', '>=', '1'),
|
||||||
|
array('>=', '2', '>', '1'),
|
||||||
|
array('<=', '2', '>=', '1'),
|
||||||
|
array('>=', '1', '<=', '2'),
|
||||||
|
array('==', '2', '>=', '2'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider successfulVersionMatches
|
||||||
|
*/
|
||||||
|
public function testVersionMatchSucceeds($requireOperator, $requireVersion, $provideOperator, $provideVersion)
|
||||||
|
{
|
||||||
|
$versionRequire = new VersionConstraint($requireOperator, $requireVersion);
|
||||||
|
$versionProvide = new VersionConstraint($provideOperator, $provideVersion);
|
||||||
|
|
||||||
|
$this->assertTrue($versionRequire->matches($versionProvide));
|
||||||
|
}
|
||||||
|
|
||||||
|
static public function failingVersionMatches()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
// require provide
|
||||||
|
array('==', '1', '==', '2'),
|
||||||
|
array('>=', '2', '<=', '1'),
|
||||||
|
array('>=', '2', '<', '2'),
|
||||||
|
array('<=', '2', '>', '2'),
|
||||||
|
array('>', '2', '<=', '2'),
|
||||||
|
array('<=', '1', '>=', '2'),
|
||||||
|
array('>=', '2', '<=', '1'),
|
||||||
|
array('==', '2', '<', '2'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider failingVersionMatches
|
||||||
|
*/
|
||||||
|
public function testVersionMatchFails($requireOperator, $requireVersion, $provideOperator, $provideVersion)
|
||||||
|
{
|
||||||
|
$versionRequire = new VersionConstraint($requireOperator, $requireVersion);
|
||||||
|
$versionProvide = new VersionConstraint($provideOperator, $provideVersion);
|
||||||
|
|
||||||
|
$this->assertFalse($versionRequire->matches($versionProvide));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue