4 * @covers VersionChecker
6 class VersionCheckerTest
extends PHPUnit\Framework\TestCase
{
8 use MediaWikiCoversValidator
;
9 use PHPUnit4And6Compat
;
12 * @dataProvider provideMediaWikiCheck
14 public function testMediaWikiCheck( $coreVersion, $constraint, $expected ) {
15 $checker = new VersionChecker( $coreVersion, '7.0.0', [] );
16 $this->assertEquals( $expected, !(bool)$checker->checkArray( [
18 'MediaWiki' => $constraint,
23 public static function provideMediaWikiCheck() {
25 // [ $wgVersion, constraint, expected ]
26 [ '1.25alpha', '>= 1.26', false ],
27 [ '1.25.0', '>= 1.26', false ],
28 [ '1.26alpha', '>= 1.26', true ],
29 [ '1.26alpha', '>= 1.26.0', true ],
30 [ '1.26alpha', '>= 1.26.0-stable', false ],
31 [ '1.26.0', '>= 1.26.0-stable', true ],
32 [ '1.26.1', '>= 1.26.0-stable', true ],
33 [ '1.27.1', '>= 1.26.0-stable', true ],
34 [ '1.26alpha', '>= 1.26.1', false ],
35 [ '1.26alpha', '>= 1.26alpha', true ],
36 [ '1.26alpha', '>= 1.25', true ],
37 [ '1.26.0-alpha.14', '>= 1.26.0-alpha.15', false ],
38 [ '1.26.0-alpha.14', '>= 1.26.0-alpha.10', true ],
39 [ '1.26.1', '>= 1.26.2, <=1.26.0', false ],
40 [ '1.26.1', '^1.26.2', false ],
41 // Accept anything for un-parsable version strings
42 [ '1.26mwf14', '== 1.25alpha', true ],
43 [ 'totallyinvalid', '== 1.0', true ],
48 * @dataProvider providePhpValidCheck
50 public function testPhpValidCheck( $phpVersion, $constraint, $expected ) {
51 $checker = new VersionChecker( '1.0.0', $phpVersion, [] );
52 $this->assertEquals( $expected, !(bool)$checker->checkArray( [
61 public static function providePhpValidCheck() {
63 // [ phpVersion, constraint, expected ]
64 [ '7.0.23', '>= 7.0.0', true ],
65 [ '7.0.23', '^7.1.0', false ],
66 [ '7.0.23', '7.0.23', true ],
71 * @expectedException UnexpectedValueException
73 public function testPhpInvalidConstraint() {
74 $checker = new VersionChecker( '1.0.0', '7.0.0', [] );
75 $checker->checkArray( [
78 'php' => 'totallyinvalid',
85 * @dataProvider providePhpInvalidVersion
86 * @expectedException UnexpectedValueException
88 public function testPhpInvalidVersion( $phpVersion ) {
89 $checker = new VersionChecker( '1.0.0', $phpVersion, [] );
92 public static function providePhpInvalidVersion() {
101 * @dataProvider provideType
103 public function testType( $given, $expected ) {
104 $checker = new VersionChecker(
107 [ 'phpLoadedExtension' ],
109 'presentAbility' => true,
110 'presentAbilityWithMessage' => true,
111 'missingAbility' => false,
112 'missingAbilityWithMessage' => false,
115 'presentAbilityWithMessage' => 'Present.',
116 'missingAbilityWithMessage' => 'Missing.',
119 $checker->setLoadedExtensionsAndSkins( [
120 'FakeDependency' => [
121 'version' => '1.0.0',
123 'NoVersionGiven' => [],
125 $this->assertEquals( $expected, $checker->checkArray( [
126 'FakeExtension' => $given,
130 public static function provideType() {
136 'FakeDependency' => '1.0.0',
143 'MediaWiki' => '1.0.0',
150 'NoVersionGiven' => '*',
158 'NoVersionGiven' => '1.0',
163 'incompatible' => 'FakeExtension',
164 'type' => 'incompatible-extensions',
165 'msg' => 'NoVersionGiven does not expose its version, but FakeExtension requires: 1.0.',
177 'missing' => 'Missing',
178 'type' => 'missing-extensions',
179 'msg' => 'FakeExtension requires Missing to be installed.',
186 'FakeDependency' => '2.0.0',
191 'incompatible' => 'FakeExtension',
192 'type' => 'incompatible-extensions',
193 // phpcs:ignore Generic.Files.LineLength.TooLong
194 'msg' => 'FakeExtension is not compatible with the current installed version of FakeDependency (1.0.0), it requires: 2.0.0.',
206 'missing' => 'FakeSkin',
207 'type' => 'missing-skins',
208 'msg' => 'FakeExtension requires FakeSkin to be installed.',
215 'ext-phpLoadedExtension' => '*',
223 'ext-phpMissingExtension' => '*',
228 'missing' => 'phpMissingExtension',
229 'type' => 'missing-phpExtension',
230 // phpcs:ignore Generic.Files.LineLength.TooLong
231 'msg' => 'FakeExtension requires phpMissingExtension PHP extension to be installed.',
238 'ability-presentAbility' => true,
246 'ability-presentAbilityWithMessage' => true,
254 'ability-presentAbility' => false,
262 'ability-presentAbilityWithMessage' => false,
270 'ability-missingAbility' => true,
275 'missing' => 'missingAbility',
276 'type' => 'missing-ability',
277 'msg' => 'FakeExtension requires "missingAbility" ability',
284 'ability-missingAbilityWithMessage' => true,
289 'missing' => 'missingAbilityWithMessage',
290 'type' => 'missing-ability',
291 // phpcs:ignore Generic.Files.LineLength.TooLong
292 'msg' => 'FakeExtension requires "missingAbilityWithMessage" ability: Missing.',
299 'ability-missingAbility' => false,
307 'ability-missingAbilityWithMessage' => false,
316 * Check, if a non-parsable version constraint does not throw an exception or
317 * returns any error message.
319 public function testInvalidConstraint() {
320 $checker = new VersionChecker( '1.0.0', '7.0.0', [] );
321 $checker->setLoadedExtensionsAndSkins( [
322 'FakeDependency' => [
323 'version' => 'not really valid',
326 $this->assertEquals( [
328 'type' => 'invalid-version',
329 'msg' => "FakeDependency does not have a valid version string.",
331 ], $checker->checkArray( [
334 'FakeDependency' => '1.24.3',
339 $checker = new VersionChecker( '1.0.0', '7.0.0', [] );
340 $checker->setLoadedExtensionsAndSkins( [
341 'FakeDependency' => [
342 'version' => '1.24.3',
346 $this->setExpectedException( UnexpectedValueException
::class );
347 $checker->checkArray( [
349 'FakeDependency' => 'not really valid',
354 public function provideInvalidDependency() {
360 'undefinedPlatformDependency' => '*',
364 'undefinedPlatformDependency',
370 'phpLoadedExtension' => '*',
374 'phpLoadedExtension',
380 'ability-invalidAbility' => true,
384 'ability-invalidAbility',
390 'presentAbility' => true,
399 'undefinedDependencyType' => '*',
402 'undefinedDependencyType',
419 * @dataProvider provideInvalidDependency
421 public function testInvalidDependency( $depencency, $type ) {
422 $checker = new VersionChecker(
425 [ 'phpLoadedExtension' ],
427 'presentAbility' => true,
428 'missingAbility' => false,
431 $this->setExpectedException(
432 UnexpectedValueException
::class,
433 "Dependency type $type unknown in FakeExtension"
435 $checker->checkArray( $depencency );
438 public function testInvalidPhpExtensionConstraint() {
439 $checker = new VersionChecker( '1.0.0', '7.0.0', [ 'phpLoadedExtension' ] );
440 $this->setExpectedException(
441 UnexpectedValueException
::class,
442 'Version constraints for PHP extensions are not supported in FakeExtension'
444 $checker->checkArray( [
447 'ext-phpLoadedExtension' => '1.0.0',
454 * @dataProvider provideInvalidAbilityType
456 public function testInvalidAbilityType( $value ) {
457 $checker = new VersionChecker( '1.0.0', '7.0.0', [], [ 'presentAbility' => true ] );
458 $this->setExpectedException(
459 UnexpectedValueException
::class,
460 'Only booleans are allowed to to indicate the presence of abilities in FakeExtension'
462 $checker->checkArray( [
465 'ability-presentAbility' => $value,
471 public function provideInvalidAbilityType() {