Skip to content

Commit d0ebb87

Browse files
committed
correct matches function algorithm
1 parent e643785 commit d0ebb87

File tree

5 files changed

+314
-50
lines changed

5 files changed

+314
-50
lines changed

src/Version/Constraint.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,17 @@
88

99
abstract class Constraint
1010
{
11+
/**
12+
* Indicate if this constraint matches another constraint
13+
*
14+
* @param Constraint $constraint
15+
* @return bool
16+
*/
1117
public abstract function matches(Constraint $constraint);
1218

1319
/**
20+
* Parse a string and return a Constraint.
21+
*
1422
* @param string $input
1523
* @return Constraint
1624
*/

src/Version/Constraint/SimpleConstraint.php

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,64 @@ public function matches(Constraint $constraint)
4141
{
4242
if ($constraint instanceof AnythingConstraint) {
4343
return true;
44-
} elseif ($constraint instanceof MultiConstraint) {
45-
return $constraint->matches($this);
46-
} elseif ($constraint instanceof SimpleConstraint) {
44+
}
45+
if ($constraint instanceof SimpleConstraint) {
46+
if((string) $this->operator == '=' &&
47+
(string) $constraint->operator == '=') {
48+
return $this->version->compare($constraint->version) == 0;
49+
}
50+
if((string) $this->operator == '!=' ||
51+
(string) $this->operator == '<>') {
52+
if((string) $constraint->operator == '=') {
53+
return $this->version->compare($constraint->version) != 0;
54+
}
55+
return true;
56+
}
57+
if((string) $constraint->operator == '!=' ||
58+
(string) $constraint->operator == '<>') {
59+
if((string) $this->operator == '=') {
60+
return $this->version->compare($constraint->version) != 0;
61+
}
62+
return true;
63+
}
64+
if((string) $this->operator == '>') {
65+
if((string) $constraint->operator == '<' ||
66+
(string) $constraint->operator == '<='
67+
) {
68+
return $this->version->compare($constraint->version) < 0;
69+
}
70+
}
71+
if((string) $this->operator == '>=') {
72+
if((string) $constraint->operator == '<') {
73+
return $this->version->compare($constraint->version) < 0;
74+
}
75+
}
76+
if((string) $this->operator == '<') {
77+
if((string) $constraint->operator == '>' ||
78+
(string) $constraint->operator == '>='
79+
) {
80+
return $this->version->compare($constraint->version) > 0;
81+
}
82+
}
83+
if((string) $this->operator == '<=') {
84+
if((string) $constraint->operator == '>') {
85+
return $this->version->compare($constraint->version) > 0;
86+
}
87+
}
88+
if((string) $this->operator == '>=' &&
89+
(string) $constraint->operator == '<=') {
90+
return $this->version->compare($constraint->version) <= 0;
91+
}
92+
if((string) $this->operator == '<=' &&
93+
(string) $constraint->operator == '>=') {
94+
return $this->version->compare($constraint->version) >= 0;
95+
}
4796
return
48-
version_compare(
49-
$constraint->getVersion(),
50-
Version::parse($this->version), $this->operator);
97+
$this->isSubsetOf($constraint) ||
98+
$constraint->isSubsetOf($this);
99+
}
100+
if ($constraint instanceof MultiConstraint) {
101+
return $constraint->matches($this);
51102
}
52103
return false;
53104
}

tests/Version/Constraint/AnythingConstraintTest.php

Lines changed: 0 additions & 14 deletions
This file was deleted.

tests/Version/Constraint/MultiConstraintTest.php

Lines changed: 0 additions & 30 deletions
This file was deleted.

tests/Version/ConstraintTest.php

Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ public function isSubsetOfProvider()
260260
array('2.3.0', '>1.0', true),
261261
array('2.3.0', '>2.3', false),
262262
array('2.3.0', '>2.5', false),
263+
array('=1.0.0.0', '>1.0.0.0', false),
263264

264265
array('1.0.0', '>=1.0', true),
265266
array('2.3.0', '>=1.0', true),
@@ -476,4 +477,252 @@ public function isSubsetOfProvider()
476477
);
477478
}
478479

480+
/**
481+
* @dataProvider matchesProvider
482+
* @param $constraint1
483+
* @param $constraint2
484+
* @param $expected
485+
*/
486+
public function testMatches($constraint1, $constraint2, $expected)
487+
{
488+
$constraint1 = Constraint::parse($constraint1);
489+
$constraint2 = Constraint::parse($constraint2);
490+
491+
$this->assertSame(
492+
$expected,
493+
$constraint1->matches($constraint2),
494+
(string) $constraint1 . ($expected ? '' : ' does\'nt') .
495+
' matches ' . (string) $constraint2
496+
);
497+
}
498+
499+
public function matchesProvider()
500+
{
501+
return array(
502+
array('1.0', '1.0', true),
503+
array('1.5.8', '1.5.8', true),
504+
array('1.0.0', '1.0', true),
505+
array('1.5.0', '2.5', false),
506+
array('2.3.0', '1.5.8', false),
507+
508+
array('2.3.0', '>1.0', true),
509+
array('2.3.0', '>2.3', false),
510+
array('2.3.0', '>2.5', false),
511+
array('=1.0.0.0', '>1.0.0.0', false),
512+
513+
array('1.0.0', '>=1.0', true),
514+
array('2.3.0', '>=1.0', true),
515+
array('2.3.0', '>=5.2.0', false),
516+
517+
array('2.3.0', '<3.5.8', true),
518+
array('2.3.0', '<2.3', false),
519+
array('2.3.0', '<1.5.8', false),
520+
521+
array('2.3.0', '<=2.3', true),
522+
array('2.3.0', '<=2.3.0.0', true),
523+
array('2.3.0', '<=0.3.0.0', false),
524+
525+
array('1.5.0', '!=2.5', true),
526+
array('3.5.0', '!=2.5', true),
527+
array('2.3.0', '!=2.3', false),
528+
529+
array('1.5.0', '<>2.5', true),
530+
array('3.5.0', '<>2.5', true),
531+
array('2.3.0', '<>2.3', false),
532+
533+
array('2.5.0', '~2.5', true),
534+
array('2.5.1', '~2.5', true),
535+
array('2.7.0', '~2.5', true),
536+
array('3.0.0', '~2.5', false),
537+
538+
array('2.5.0', '~2.5.3', false),
539+
array('2.5.1', '~2.5.3', false),
540+
array('2.5.3', '~2.5.3', true),
541+
array('2.5.4', '~2.5.3', true),
542+
array('2.5.4.5', '~2.5.3', true),
543+
array('2.7.0', '~2.5.3', false),
544+
array('3.0.0', '~2.5.3', false),
545+
546+
array('>2.3.0', '1.5.8', false),
547+
548+
array('>2.3.0', '>1.5.8', true),
549+
array('>2.3.0', '>2.3.0', true),
550+
array('>2.3.0', '>2.3.0.1', true),
551+
552+
array('>2.3.0', '>=1.5.8', true),
553+
array('>2.3.0', '>=2.3.0', true),
554+
array('>2.3.0', '>=2.3.0.1', true),
555+
556+
array('>2.3.0', '<1.5.8', false),
557+
array('>2.3.0', '<2.3.0', false),
558+
array('>2.3.0', '<2.3.2', true),
559+
560+
array('>2.3.0', '<=1.5.8', false),
561+
array('>2.3.0', '<=2.3.0', false),
562+
array('>2.3.0', '<=2.3.0.1', true),
563+
564+
array('>2.3.0', '!=1.5.8', true),
565+
array('>2.3.0', '!=2.3.0', true),
566+
array('>2.3.0', '!=2.3.0.1', true),
567+
568+
array('>2.3.0', '<>1.5.8', true),
569+
array('>2.3.0', '<>2.3.0', true),
570+
array('>2.3.0', '<>2.3.0.1', true),
571+
572+
array('>2.3.0', '~1.5.8', false),
573+
array('>2.3.0', '~2.3', true),
574+
array('>2.3.0', '~2.4', true),
575+
576+
array('>=2.3.0', '1.5.8', false),
577+
578+
array('>=2.3.0', '>1.5.8', true),
579+
array('>=2.3.0', '>2.3', true),
580+
array('>=2.3.0', '>2.3.0.1', true),
581+
582+
array('>=2.3.0', '>=1.5.8', true),
583+
array('>=2.3.0', '>=2.3', true),
584+
array('>=2.3.0', '>=2.3.0.1', true),
585+
586+
array('>=2.3.0', '<1.5.8', false),
587+
array('>=2.3.0', '<2.3', false),
588+
array('>=2.3.0', '<2.3.0.1', true),
589+
590+
array('>=2.3.0', '<=1.5.8', false),
591+
array('>=2.3.0', '<=2.3', true),
592+
array('>=2.3.0', '<=2.3.0.1', true),
593+
594+
array('>=2.3.0', '!=1.5.8', true),
595+
array('>=2.3.0', '!=2.3', true),
596+
array('>=2.3.0', '!=2.3.0.1', true),
597+
598+
array('>=2.3.0', '<>1.5.8', true),
599+
array('>=2.3.0', '<>2.3', true),
600+
array('>=2.3.0', '<>2.3.0.1', true),
601+
602+
array('>=2.3.0', '~1.5.8', false),
603+
array('>=2.3.0', '~2.3', true),
604+
array('>=2.3.0', '~2.4.', true),
605+
606+
array('<2.3.0', '1.5.8', true),
607+
608+
array('<2.3.0', '>1.5.8', true),
609+
array('<2.3.0', '>2.3.0', false),
610+
array('<2.3.0', '>2.3.0.1', false),
611+
612+
array('<2.3.0', '>=1.5.8', true),
613+
array('<2.3.0', '>=2.3.0', false),
614+
array('<2.3.0', '>=2.3.0.1', false),
615+
616+
array('<2.3.0', '<1.5.8', true),
617+
array('<2.3.0', '<2.3.0', true),
618+
array('<2.3.0', '<2.3.0.1', true),
619+
620+
array('<2.3.0', '<=1.5.8', true),
621+
array('<2.3.0', '<=2.3.0', true),
622+
array('<2.3.0', '<=2.3.0.1', true),
623+
624+
array('<2.3.0', '!=1.5.8', true),
625+
array('<2.3.0', '!=2.3.0', true),
626+
array('<2.3.0', '!=2.3.0.1', true),
627+
628+
array('<2.3.0', '<>1.5.8', true),
629+
array('<2.3.0', '<>2.3.0', true),
630+
array('<2.3.0', '<>2.3.0.1', true),
631+
632+
array('<2.3.0', '~1.5.8', true),
633+
array('<2.3.0', '~2.3', false),
634+
array('<2.3.0', '~2.4.', false),
635+
636+
array('<=2.3.0', '1.5.8', true),
637+
638+
array('<=2.3.0', '>1.5.8', true),
639+
array('<=2.3.0', '>2.3.0', false),
640+
array('<=2.3.0', '>2.3.0.1', false),
641+
642+
array('<=2.3.0', '>=1.5.8', true),
643+
array('<=2.3.0', '>=2.3.0', true),
644+
array('<=2.3.0', '>=2.3.0.1', false),
645+
646+
array('<=2.3.0', '<1.5.8', true),
647+
array('<=2.3.0', '<2.3.0', true),
648+
array('<=2.3.0', '<2.3.0.1', true),
649+
650+
array('<=2.3.0', '<=1.5.8', true),
651+
array('<=2.3.0', '<=2.3.0', true),
652+
array('<=2.3.0', '<=2.3.0.1', true),
653+
654+
array('<=2.3.0', '!=1.5.8', true),
655+
array('<=2.3.0', '!=2.3.0', true),
656+
array('<=2.3.0', '!=2.3.0.1', true),
657+
658+
array('<=2.3.0', '<>1.5.8', true),
659+
array('<=2.3.0', '<>2.3.0', true),
660+
array('<=2.3.0', '<>2.3.0.1', true),
661+
662+
array('<=2.3.0', '~1.5.8', true),
663+
array('<=2.3.0', '~2.3', true),
664+
array('<=2.3.0', '~2.4.', false),
665+
666+
array('!=2.3.0', '1.5.8', true),
667+
668+
array('<>2.3.0', '>1.5.8', true),
669+
array('!=2.3.0', '>2.3.0', true),
670+
array('<>2.3.0', '>2.3.0.1', true),
671+
672+
array('!=2.3.0', '>=1.5.8', true),
673+
array('<>2.3.0', '>=2.3.0', true),
674+
array('!=2.3.0', '>=2.3.0.1', true),
675+
676+
array('<>2.3.0', '<1.5.8', true),
677+
array('!=2.3.0', '<2.3.0', true),
678+
array('<>2.3.0', '<2.3.0.1', true),
679+
680+
array('!=2.3.0', '<=1.5.8', true),
681+
array('<>2.3.0', '<=2.3.0', true),
682+
array('!=2.3.0', '<=2.3.0.1', true),
683+
684+
array('<>2.3.0', '!=1.5.8', true),
685+
array('!=2.3.0', '!=2.3.0.0', true),
686+
array('<>2.3.0', '!=2.3.0.1', true),
687+
688+
array('!=2.3.0', '<>1.5.8', true),
689+
array('<>2.3.0', '<>2.3', true),
690+
array('!=2.3.0', '<>2.3.0.1', true),
691+
692+
array('!=2.3.0', '~1.5.8', true),
693+
array('!=2.3.0', '~2.3', true),
694+
array('!=2.3.0', '~2.4.', true),
695+
696+
array('~2.3.0', '1.5.8', false),
697+
698+
array('~2.3.5', '>2.3.0', true),
699+
array('~2.3.5', '>2.3.5', true),
700+
array('~2.3.5', '>2.3.6', true),
701+
702+
array('~2.3.5', '>=2.3.0', true),
703+
array('~2.3.5', '>=2.3.5', true),
704+
array('~2.3.5', '>=2.3.6', true),
705+
706+
array('~2.3.5', '<2.3.5', false),
707+
array('~2.3.5', '<2.3.6', true),
708+
array('~2.3.5', '<2.4.0', true),
709+
710+
array('~2.3.5', '<=2.3.5', true),
711+
array('~2.3.5', '<=2.3.6', true),
712+
array('~2.3.5', '<=2.4.0', true),
713+
714+
array('~2.3.5', '!=2.3.0', true),
715+
array('~2.3.5', '!=2.3.6', true),
716+
array('~2.3.5', '<>2.4.0', true),
717+
718+
array('~2.3.5', '~2.3', true),
719+
array('~2.3.5', '~2.4', false),
720+
array('~2.3.5', '~2.3', true),
721+
array('~2.4.5', '~2.3', true),
722+
array('~2.3', '~2.3.2', true),
723+
array('~2.4', '~2.3.4', false),
724+
array('~2.3.5', '~2.3.5', true),
725+
);
726+
}
727+
479728
}

0 commit comments

Comments
 (0)