Skip to content
This repository was archived by the owner on May 2, 2023. It is now read-only.

Commit 2bd0488

Browse files
Update simpletest, add tests. Add extra class, rename classes.
Added version constant, version 0.1.0
1 parent efe9a15 commit 2bd0488

File tree

3 files changed

+205
-6
lines changed

3 files changed

+205
-6
lines changed

simpletest

Submodule simpletest updated from dc5a799 to d0fc4a4

test.php

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
<?php
2+
require 'simpletest/simpletest.phar';
3+
require 'version.php';
4+
class versioningTest extends UnitTestCase {
5+
function testKeepSimpleversion() {
6+
$t=array(
7+
'1.0.0',
8+
'2.0.0',
9+
'1.0.1',
10+
'1.3.2',
11+
'1.02.0'=>'1.2.0',
12+
'0.2.5',
13+
'01.2.6'=>'1.2.6',
14+
'2.0.03'=>'2.0.3',
15+
'0.0.0'
16+
);
17+
foreach($t as $original=>$result) {
18+
if(!is_string($original)) $original=$result;
19+
$v=new versionExpression($original);
20+
$this->assertEqual($v->getString(),$result,'['.$original.'] %s');
21+
}
22+
}
23+
function testKeepSimpleversionComparator() {
24+
$t=array(
25+
'>1.0.0',
26+
'>1.1.0',
27+
'>1.2.3',
28+
'>0.5.6',
29+
'>0.025.6'=>'>0.25.6',
30+
'>=1.0.0',
31+
'>=1.2.0',
32+
'>=1.4.5',
33+
'>=0.9.3',
34+
'>=05.3.6'=>'>=5.3.6',
35+
'<2.0.0',
36+
'<5.6.0',
37+
'<2.3.5',
38+
'<0.2.3',
39+
'<0.2.05'=>'<0.2.5',
40+
'<=7.0.0',
41+
'<=1.3.0',
42+
'<=1.4.3',
43+
'<=0.2.6',
44+
'<=00.05.6'=>'<=0.5.6'
45+
);
46+
foreach($t as $original=>$result) {
47+
if(!is_string($original)) $original=$result;
48+
$v=new versionExpression($original);
49+
$this->assertEqual($v->getString(),$result,'['.$original.'] %s');
50+
}
51+
}
52+
function testShortSimpleversion() {
53+
$t=array(
54+
'1'=>'>=1.0.0 <2.0.0',
55+
'1.2'=>'>=1.2.0 <1.3.0',
56+
'1.0'=>'>=1.0.0 <1.1.0',
57+
'501'=>'>=501.0.0 <502.0.0'
58+
);
59+
foreach($t as $original=>$result) {
60+
$v=new versionExpression($original);
61+
$this->assertEqual($v->getString(),$result,'['.$original.'] %s');
62+
}
63+
}
64+
function testShortSimpleversionComparator() {
65+
$t=array(
66+
'>1'=>'>1.0.0',
67+
'<2.0'=>'<2.0.0',
68+
'<=5.2'=>'<=5.2.0',
69+
'>=3'=>'>=3.0.0'
70+
);
71+
foreach($t as $original=>$result) {
72+
$v=new versionExpression($original);
73+
$this->assertEqual($v->getString(),$result,'['.$original.'] %s');
74+
}
75+
}
76+
function testSimpleversionWildcard() {
77+
$t=array(
78+
'1.x.x'=>'>=1.0.0 <2.0.0',
79+
'1.x'=>'>=1.0.0 <2.0.0',
80+
'1.x.5'=>'>=1.0.0 <2.0.0',
81+
'3.x2'=>'>=3.0.0 <4.0.0',
82+
'1.X.X'=>'>=1.0.0 <2.0.0',
83+
'1.*.*'=>'>=1.0.0 <2.0.0',
84+
'2.X.x'=>'>=2.0.0 <3.0.0',
85+
'5.*.x'=>'>=5.0.0 <6.0.0',
86+
'x'=>'>=0.0.0'
87+
);
88+
foreach($t as $original=>$result) {
89+
$v=new versionExpression($original);
90+
$this->assertEqual($v->getString(),$result,'['.$original.'] %s');
91+
}
92+
}
93+
function testSimpleversionRange() {
94+
$t=array(
95+
'1.0.0 - 2.0.0'=>'>=1.0.0 <2.0.0',
96+
'1.2.3 - 1.3.0'=>'>=1.2.3 <1.3.0',
97+
'4.3.0 - 4.3.1'=> '>=4.3.0 <4.3.1'
98+
);
99+
foreach($t as $original=>$result) {
100+
$v=new versionExpression($original);
101+
$this->assertEqual($v->getString(),$result,'['.$original.'] %s');
102+
}
103+
}
104+
function testShortversionRange() {
105+
$t=array(
106+
'1 - 2'=>'>=1.0.0 <2.0.0',
107+
'1.2 - 2.1'=>'>=1.2.0 <2.1.0'
108+
);
109+
foreach($t as $original=>$result) {
110+
$v=new versionExpression($original);
111+
$this->assertEqual($v->getString(),$result,'['.$original.'] %s');
112+
}
113+
}
114+
function testAndOperator() {
115+
$t=array(
116+
'<1.2.0 >=1.3.2'=>array(array('<1.2.0','>=1.3.2')),
117+
'>2.3.4 <5.0'=>array(array('>2.3.4','<5.0.0')),
118+
'>1.0.0 <=1.2.0 '=>array(array('>1.0.0','<=1.2.0')),
119+
'>=1.2.4'=>array(array('>=1.2.4'))
120+
);
121+
foreach($t as $original=>$result) {
122+
$v=new versionExpression($original);
123+
$this->assertEqual($v->getChunks(),$result,'['.$original.'] %s');
124+
}
125+
}
126+
function testOrOperator() {
127+
$t=array(
128+
'<1.2.0 || >2.1'=>array(array('<1.2.0'),array('>2.1.0')),
129+
'<1.3 || >3.0 <3.5 || >4'=>array(array('<1.3.0'),array('>3.0.0','<3.5.0'),array('>4.0.0'))
130+
);
131+
foreach($t as $original=>$result) {
132+
$v=new versionExpression($original);
133+
$this->assertEqual($v->getChunks(),$result,'['.$original.'] %s');
134+
}
135+
}
136+
function testComplexExpessions() {
137+
$t=array(
138+
'1.x || 2.0 - 2.3 || >4.x.x'=>'>=1.0.0 <2.0.0||>=2.0.0 <2.3.0||>4.0.0',
139+
'2.0.x || 2.1 - 4 || 4 - 4.5' => '>=2.0.0 <2.1.0||>=2.1.0 <4.0.0||>=4.0.0 <4.5.0'
140+
);
141+
foreach($t as $original=>$result) {
142+
$v=new versionExpression($original);
143+
$this->assertEqual($v->getString(),$result,'['.$original.'] %s');
144+
}
145+
}
146+
function testSatisfiedBy() {
147+
$t=array(
148+
'1.0.0'=>'1.0.0',
149+
'1.2.3'=>'1.2.3'
150+
);
151+
foreach($t as $range=>$version) {
152+
$e=new versionExpression($range);
153+
$v=new version($version);
154+
$this->assertTrue($e->satisfiedBy($v), '['.$range.' :: '.$version.'] %s');
155+
}
156+
}
157+
}

version.php

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?php
2-
class version {
2+
class versionExpression {
3+
const version='0.1.0';
34
static protected $global_single_version='(([0-9]+)(\\.([0-9]+)(\\.([0-9]+))?)?)';
45
static protected $global_single_xrange='(([0-9xX*]+)(\\.([0-9xX*]+)(\\.([0-9xX*]+))?)?)';
56
static protected $global_single_comparator='([<>]=?)?\\s*';
@@ -27,6 +28,36 @@ function __construct($versions) {
2728
}
2829
$this->chunks=$or;
2930
}
31+
function satisfiedBy(version $version) {
32+
$version1=$version->getString();
33+
$expression=sprintf(self::$regexp_mask,self::$global_single_comparator.self::$global_single_version);
34+
$ok=false;
35+
foreach($this->chunks as $orblocks) { //Or loop
36+
foreach($orblocks as $ablocks) { //And loop
37+
$matches=array();
38+
preg_match($expression, $ablocks, $matches);
39+
$comparators=$matches[1];
40+
$version2=$matches[2];
41+
if($comparators=='') $comparators='=='; //Use equal if no comparator is set
42+
if(!version_compare($version, $version2, $comparators)) { //If one chunk of the and-loop does not match...
43+
$ok=false; //It is not okay
44+
break; //And this loop will surely fail: return to or-loop
45+
}
46+
else {
47+
$ok=true;
48+
}
49+
}
50+
if($ok) return true; //Only one or block has to match
51+
}
52+
return false; //No matches found :(
53+
}
54+
/**
55+
* Get the raw data blocks
56+
* @return array
57+
*/
58+
function getChunks() {
59+
return $this->chunks;
60+
}
3061
/**
3162
* Get the whole or object as a string
3263
* Enter description here ...
@@ -68,7 +99,7 @@ static function standarize($version,$hasComparator=false) {
6899
* @throws versionException
69100
* @return string
70101
*/
71-
static private function standarizeSingleComparator($version) {
102+
static protected function standarizeSingleComparator($version) {
72103
$expression=sprintf(self::$regexp_mask,self::$global_single_comparator.self::$global_single_version);
73104
$matches=array();
74105
if(!preg_match($expression,$version,$matches)) throw new versionException('Invalid version string given');
@@ -84,7 +115,7 @@ static private function standarizeSingleComparator($version) {
84115
* @param string $versions
85116
* @return string
86117
*/
87-
static private function standarizeMultipleComparators($versions) {
118+
static protected function standarizeMultipleComparators($versions) {
88119
$versions=preg_replace('/'.self::$global_single_comparator.self::$global_single_xrange.'/','$1$2',$versions); //Paste comparator and version together
89120
$versions=preg_replace('/\\s+/', ' ', $versions); //Condense multiple spaces to one
90121
$or=explode('||', $versions);
@@ -105,7 +136,7 @@ static private function standarizeMultipleComparators($versions) {
105136
* @throws versionException
106137
* @return string
107138
*/
108-
static private function rangesToComparators($range) {
139+
static protected function rangesToComparators($range) {
109140
$range_expression=sprintf(self::$range_mask,self::$global_single_version);
110141
$expression=sprintf(self::$regexp_mask,$range_expression);
111142
if(!preg_match($expression,$range)) throw new versionException('Invalid range given');
@@ -118,7 +149,7 @@ static private function rangesToComparators($range) {
118149
* @param string $ranges
119150
* @return string
120151
*/
121-
static private function xRangesToComparators($ranges) {
152+
static protected function xRangesToComparators($ranges) {
122153
$expression=sprintf(self::$regexp_mask,self::$global_single_xrange);
123154
return preg_replace_callback($expression, array('self','xRangesToComparatorsCallback'), $ranges);
124155
}
@@ -156,4 +187,15 @@ static private function matchesToVersionParts($matches, &$major, &$minor, &$patc
156187
if(is_numeric($major)) $major=intval($major);
157188
}
158189
}
190+
class version extends versionExpression {
191+
const version='0.1.0';
192+
function __construct($version) {
193+
$expression=sprintf(parent::$regexp_mask,parent::$global_single_version);
194+
if(!preg_match($expression, $version)) throw new versionException('This is not a simple, singular version! No comparators nor ranges allowed!');
195+
parent::__construct($version);
196+
}
197+
function satisfies(versionExpression $versions) {
198+
return $versions->satisfiedBy($this->getString());
199+
}
200+
}
159201
class versionException extends Exception {}

0 commit comments

Comments
 (0)