Skip to content

Commit

Permalink
correct matches function algorithm
Browse files Browse the repository at this point in the history
  • Loading branch information
amouhzi committed Oct 20, 2014
1 parent e643785 commit d0ebb87
Show file tree
Hide file tree
Showing 5 changed files with 314 additions and 50 deletions.
8 changes: 8 additions & 0 deletions src/Version/Constraint.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,17 @@

abstract class Constraint
{
/**
* Indicate if this constraint matches another constraint
*
* @param Constraint $constraint
* @return bool
*/
public abstract function matches(Constraint $constraint);

/**
* Parse a string and return a Constraint.
*
* @param string $input
* @return Constraint
*/
Expand Down
63 changes: 57 additions & 6 deletions src/Version/Constraint/SimpleConstraint.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,64 @@ public function matches(Constraint $constraint)
{
if ($constraint instanceof AnythingConstraint) {
return true;
} elseif ($constraint instanceof MultiConstraint) {
return $constraint->matches($this);
} elseif ($constraint instanceof SimpleConstraint) {
}
if ($constraint instanceof SimpleConstraint) {
if((string) $this->operator == '=' &&
(string) $constraint->operator == '=') {
return $this->version->compare($constraint->version) == 0;
}
if((string) $this->operator == '!=' ||
(string) $this->operator == '<>') {
if((string) $constraint->operator == '=') {
return $this->version->compare($constraint->version) != 0;
}
return true;
}
if((string) $constraint->operator == '!=' ||
(string) $constraint->operator == '<>') {
if((string) $this->operator == '=') {
return $this->version->compare($constraint->version) != 0;
}
return true;
}
if((string) $this->operator == '>') {
if((string) $constraint->operator == '<' ||
(string) $constraint->operator == '<='
) {
return $this->version->compare($constraint->version) < 0;
}
}
if((string) $this->operator == '>=') {
if((string) $constraint->operator == '<') {
return $this->version->compare($constraint->version) < 0;
}
}
if((string) $this->operator == '<') {
if((string) $constraint->operator == '>' ||
(string) $constraint->operator == '>='
) {
return $this->version->compare($constraint->version) > 0;
}
}
if((string) $this->operator == '<=') {
if((string) $constraint->operator == '>') {
return $this->version->compare($constraint->version) > 0;
}
}
if((string) $this->operator == '>=' &&
(string) $constraint->operator == '<=') {
return $this->version->compare($constraint->version) <= 0;
}
if((string) $this->operator == '<=' &&
(string) $constraint->operator == '>=') {
return $this->version->compare($constraint->version) >= 0;
}
return
version_compare(
$constraint->getVersion(),
Version::parse($this->version), $this->operator);
$this->isSubsetOf($constraint) ||
$constraint->isSubsetOf($this);
}
if ($constraint instanceof MultiConstraint) {
return $constraint->matches($this);
}
return false;
}
Expand Down
14 changes: 0 additions & 14 deletions tests/Version/Constraint/AnythingConstraintTest.php

This file was deleted.

30 changes: 0 additions & 30 deletions tests/Version/Constraint/MultiConstraintTest.php

This file was deleted.

249 changes: 249 additions & 0 deletions tests/Version/ConstraintTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@ public function isSubsetOfProvider()
array('2.3.0', '>1.0', true),
array('2.3.0', '>2.3', false),
array('2.3.0', '>2.5', false),
array('=1.0.0.0', '>1.0.0.0', false),

array('1.0.0', '>=1.0', true),
array('2.3.0', '>=1.0', true),
Expand Down Expand Up @@ -476,4 +477,252 @@ public function isSubsetOfProvider()
);
}

/**
* @dataProvider matchesProvider
* @param $constraint1
* @param $constraint2
* @param $expected
*/
public function testMatches($constraint1, $constraint2, $expected)
{
$constraint1 = Constraint::parse($constraint1);
$constraint2 = Constraint::parse($constraint2);

$this->assertSame(
$expected,
$constraint1->matches($constraint2),
(string) $constraint1 . ($expected ? '' : ' does\'nt') .
' matches ' . (string) $constraint2
);
}

public function matchesProvider()
{
return array(
array('1.0', '1.0', true),
array('1.5.8', '1.5.8', true),
array('1.0.0', '1.0', true),
array('1.5.0', '2.5', false),
array('2.3.0', '1.5.8', false),

array('2.3.0', '>1.0', true),
array('2.3.0', '>2.3', false),
array('2.3.0', '>2.5', false),
array('=1.0.0.0', '>1.0.0.0', false),

array('1.0.0', '>=1.0', true),
array('2.3.0', '>=1.0', true),
array('2.3.0', '>=5.2.0', false),

array('2.3.0', '<3.5.8', true),
array('2.3.0', '<2.3', false),
array('2.3.0', '<1.5.8', false),

array('2.3.0', '<=2.3', true),
array('2.3.0', '<=2.3.0.0', true),
array('2.3.0', '<=0.3.0.0', false),

array('1.5.0', '!=2.5', true),
array('3.5.0', '!=2.5', true),
array('2.3.0', '!=2.3', false),

array('1.5.0', '<>2.5', true),
array('3.5.0', '<>2.5', true),
array('2.3.0', '<>2.3', false),

array('2.5.0', '~2.5', true),
array('2.5.1', '~2.5', true),
array('2.7.0', '~2.5', true),
array('3.0.0', '~2.5', false),

array('2.5.0', '~2.5.3', false),
array('2.5.1', '~2.5.3', false),
array('2.5.3', '~2.5.3', true),
array('2.5.4', '~2.5.3', true),
array('2.5.4.5', '~2.5.3', true),
array('2.7.0', '~2.5.3', false),
array('3.0.0', '~2.5.3', false),

array('>2.3.0', '1.5.8', false),

array('>2.3.0', '>1.5.8', true),
array('>2.3.0', '>2.3.0', true),
array('>2.3.0', '>2.3.0.1', true),

array('>2.3.0', '>=1.5.8', true),
array('>2.3.0', '>=2.3.0', true),
array('>2.3.0', '>=2.3.0.1', true),

array('>2.3.0', '<1.5.8', false),
array('>2.3.0', '<2.3.0', false),
array('>2.3.0', '<2.3.2', true),

array('>2.3.0', '<=1.5.8', false),
array('>2.3.0', '<=2.3.0', false),
array('>2.3.0', '<=2.3.0.1', true),

array('>2.3.0', '!=1.5.8', true),
array('>2.3.0', '!=2.3.0', true),
array('>2.3.0', '!=2.3.0.1', true),

array('>2.3.0', '<>1.5.8', true),
array('>2.3.0', '<>2.3.0', true),
array('>2.3.0', '<>2.3.0.1', true),

array('>2.3.0', '~1.5.8', false),
array('>2.3.0', '~2.3', true),
array('>2.3.0', '~2.4', true),

array('>=2.3.0', '1.5.8', false),

array('>=2.3.0', '>1.5.8', true),
array('>=2.3.0', '>2.3', true),
array('>=2.3.0', '>2.3.0.1', true),

array('>=2.3.0', '>=1.5.8', true),
array('>=2.3.0', '>=2.3', true),
array('>=2.3.0', '>=2.3.0.1', true),

array('>=2.3.0', '<1.5.8', false),
array('>=2.3.0', '<2.3', false),
array('>=2.3.0', '<2.3.0.1', true),

array('>=2.3.0', '<=1.5.8', false),
array('>=2.3.0', '<=2.3', true),
array('>=2.3.0', '<=2.3.0.1', true),

array('>=2.3.0', '!=1.5.8', true),
array('>=2.3.0', '!=2.3', true),
array('>=2.3.0', '!=2.3.0.1', true),

array('>=2.3.0', '<>1.5.8', true),
array('>=2.3.0', '<>2.3', true),
array('>=2.3.0', '<>2.3.0.1', true),

array('>=2.3.0', '~1.5.8', false),
array('>=2.3.0', '~2.3', true),
array('>=2.3.0', '~2.4.', true),

array('<2.3.0', '1.5.8', true),

array('<2.3.0', '>1.5.8', true),
array('<2.3.0', '>2.3.0', false),
array('<2.3.0', '>2.3.0.1', false),

array('<2.3.0', '>=1.5.8', true),
array('<2.3.0', '>=2.3.0', false),
array('<2.3.0', '>=2.3.0.1', false),

array('<2.3.0', '<1.5.8', true),
array('<2.3.0', '<2.3.0', true),
array('<2.3.0', '<2.3.0.1', true),

array('<2.3.0', '<=1.5.8', true),
array('<2.3.0', '<=2.3.0', true),
array('<2.3.0', '<=2.3.0.1', true),

array('<2.3.0', '!=1.5.8', true),
array('<2.3.0', '!=2.3.0', true),
array('<2.3.0', '!=2.3.0.1', true),

array('<2.3.0', '<>1.5.8', true),
array('<2.3.0', '<>2.3.0', true),
array('<2.3.0', '<>2.3.0.1', true),

array('<2.3.0', '~1.5.8', true),
array('<2.3.0', '~2.3', false),
array('<2.3.0', '~2.4.', false),

array('<=2.3.0', '1.5.8', true),

array('<=2.3.0', '>1.5.8', true),
array('<=2.3.0', '>2.3.0', false),
array('<=2.3.0', '>2.3.0.1', false),

array('<=2.3.0', '>=1.5.8', true),
array('<=2.3.0', '>=2.3.0', true),
array('<=2.3.0', '>=2.3.0.1', false),

array('<=2.3.0', '<1.5.8', true),
array('<=2.3.0', '<2.3.0', true),
array('<=2.3.0', '<2.3.0.1', true),

array('<=2.3.0', '<=1.5.8', true),
array('<=2.3.0', '<=2.3.0', true),
array('<=2.3.0', '<=2.3.0.1', true),

array('<=2.3.0', '!=1.5.8', true),
array('<=2.3.0', '!=2.3.0', true),
array('<=2.3.0', '!=2.3.0.1', true),

array('<=2.3.0', '<>1.5.8', true),
array('<=2.3.0', '<>2.3.0', true),
array('<=2.3.0', '<>2.3.0.1', true),

array('<=2.3.0', '~1.5.8', true),
array('<=2.3.0', '~2.3', true),
array('<=2.3.0', '~2.4.', false),

array('!=2.3.0', '1.5.8', true),

array('<>2.3.0', '>1.5.8', true),
array('!=2.3.0', '>2.3.0', true),
array('<>2.3.0', '>2.3.0.1', true),

array('!=2.3.0', '>=1.5.8', true),
array('<>2.3.0', '>=2.3.0', true),
array('!=2.3.0', '>=2.3.0.1', true),

array('<>2.3.0', '<1.5.8', true),
array('!=2.3.0', '<2.3.0', true),
array('<>2.3.0', '<2.3.0.1', true),

array('!=2.3.0', '<=1.5.8', true),
array('<>2.3.0', '<=2.3.0', true),
array('!=2.3.0', '<=2.3.0.1', true),

array('<>2.3.0', '!=1.5.8', true),
array('!=2.3.0', '!=2.3.0.0', true),
array('<>2.3.0', '!=2.3.0.1', true),

array('!=2.3.0', '<>1.5.8', true),
array('<>2.3.0', '<>2.3', true),
array('!=2.3.0', '<>2.3.0.1', true),

array('!=2.3.0', '~1.5.8', true),
array('!=2.3.0', '~2.3', true),
array('!=2.3.0', '~2.4.', true),

array('~2.3.0', '1.5.8', false),

array('~2.3.5', '>2.3.0', true),
array('~2.3.5', '>2.3.5', true),
array('~2.3.5', '>2.3.6', true),

array('~2.3.5', '>=2.3.0', true),
array('~2.3.5', '>=2.3.5', true),
array('~2.3.5', '>=2.3.6', true),

array('~2.3.5', '<2.3.5', false),
array('~2.3.5', '<2.3.6', true),
array('~2.3.5', '<2.4.0', true),

array('~2.3.5', '<=2.3.5', true),
array('~2.3.5', '<=2.3.6', true),
array('~2.3.5', '<=2.4.0', true),

array('~2.3.5', '!=2.3.0', true),
array('~2.3.5', '!=2.3.6', true),
array('~2.3.5', '<>2.4.0', true),

array('~2.3.5', '~2.3', true),
array('~2.3.5', '~2.4', false),
array('~2.3.5', '~2.3', true),
array('~2.4.5', '~2.3', true),
array('~2.3', '~2.3.2', true),
array('~2.4', '~2.3.4', false),
array('~2.3.5', '~2.3.5', true),
);
}

}

0 comments on commit d0ebb87

Please sign in to comment.