diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 58703152ea5..70787d9f1c5 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -7,7 +7,7 @@ on:
name: CI
env:
- COMPOSER_ROOT_VERSION: "9.5-dev"
+ COMPOSER_ROOT_VERSION: "9.6-dev"
permissions:
contents: read
@@ -68,6 +68,8 @@ jobs:
PHP_EXTENSIONS: none, curl, dom, json, libxml, mbstring, openssl, phar, soap, tokenizer, xml, xmlwriter
PHP_INI_VALUES: assert.exception=1, zend.assertions=1, error_reporting=-1, log_errors_max_len=0, display_errors=On
+ continue-on-error: ${{ matrix.experimental }}
+
strategy:
fail-fast: false
matrix:
@@ -81,7 +83,18 @@ jobs:
- "8.0"
- "8.1"
- "8.2"
- - "8.3"
+
+ experimental:
+ - false
+
+ include:
+ - os: ubuntu-latest
+ php-version: "8.3"
+ experimental: true
+
+ - os: windows-latest
+ php-version: "8.3"
+ experimental: true
steps:
- name: Configure git to avoid issues with line endings
@@ -117,6 +130,8 @@ jobs:
PHP_EXTENSIONS: none, curl, dom, json, libxml, mbstring, openssl, phar, soap, tokenizer, xml, xmlwriter
PHP_INI_VALUES: assert.exception=1, zend.assertions=1, error_reporting=-1, log_errors_max_len=0, display_errors=On
+ continue-on-error: ${{ matrix.experimental }}
+
strategy:
fail-fast: false
matrix:
@@ -130,7 +145,18 @@ jobs:
- "8.0"
- "8.1"
- "8.2"
- - "8.3"
+
+ experimental:
+ - false
+
+ include:
+ - os: ubuntu-latest
+ php-version: "8.3"
+ experimental: true
+
+ - os: windows-latest
+ php-version: "8.3"
+ experimental: true
steps:
- name: Configure git to avoid issues with line endings
diff --git a/.phive/phars.xml b/.phive/phars.xml
index c37f74cbfb0..9e7784c0738 100644
--- a/.phive/phars.xml
+++ b/.phive/phars.xml
@@ -1,8 +1,8 @@
-
-
+
+
diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php
index 69d36a0ff1f..5c4b661c594 100644
--- a/.php-cs-fixer.dist.php
+++ b/.php-cs-fixer.dist.php
@@ -37,6 +37,7 @@
'blank_line_before_statement' => [
'statements' => [
'break',
+ 'case',
'continue',
'declare',
'default',
@@ -48,6 +49,7 @@
'if',
'include',
'include_once',
+ 'phpdoc',
'require',
'require_once',
'return',
@@ -56,6 +58,7 @@
'try',
'while',
'yield',
+ 'yield_from',
],
],
'braces' => [
diff --git a/.psalm/baseline.xml b/.psalm/baseline.xml
index ff8f8b73067..7bec3220b0d 100644
--- a/.psalm/baseline.xml
+++ b/.psalm/baseline.xml
@@ -1,17 +1,23 @@
-
+
-
+
$actualElement->childNodes->item($i)
$expectedElement->childNodes->item($i)
-
+
Xml::import($actualElement)
Xml::import($expectedElement)
Xml::removeCharacterDataNodes($actualElement)
Xml::removeCharacterDataNodes($expectedElement)
+ static::assertEqualXMLStructure(
+ $expectedElement->childNodes->item($i),
+ $actualElement->childNodes->item($i),
+ $checkAttributes,
+ $message
+ )
-
+
!$actual instanceof Countable && !is_iterable($actual)
!$actual instanceof Countable && !is_iterable($actual)
!$expected instanceof Countable && !is_iterable($expected)
@@ -25,7 +31,7 @@
is_string($key)
is_string($key)
-
+
$actual
$actual
$actual
@@ -109,7 +115,7 @@
$value
$value
-
+
loadFile
loadFile
loadFile
@@ -139,27 +145,44 @@
new IsType(IsType::TYPE_SCALAR)
new IsType(IsType::TYPE_STRING)
new IsType(IsType::TYPE_STRING)
+ new TraversableContainsOnly(
+ $type,
+ $isNativeType
+ )
+ new TraversableContainsOnly(
+ $className,
+ false
+ )
+ new TraversableContainsOnly(
+ $type,
+ $isNativeType
+ )
new TraversableContainsOnly($className, false)
new TraversableContainsOnly($type)
+ static::assertThat(
+ $actual,
+ static::objectEquals($expected, $method),
+ $message
+ )
static::assertThat($haystack, $constraint, $message)
static::assertThat($haystack, $constraint, $message)
static::assertThat($haystack, $constraint, $message)
static::assertThat($haystack, $constraint, $message)
-
+
$expected
$expected
-
+
assert($step['object'] instanceof TestCase)
-
+
InvokedAtIndexMatcher
new InvokedAtIndexMatcher($index)
-
+
Assert::assertDirectoryNotExists(...func_get_args())
Assert::assertDirectoryNotIsReadable(...func_get_args())
Assert::assertDirectoryNotIsWritable(...func_get_args())
@@ -172,7 +195,7 @@
Assert::assertNotRegExp(...func_get_args())
Assert::assertRegExp(...func_get_args())
-
+
$actual
$actual
$actual
@@ -259,10 +282,10 @@
$value
$value
-
+
Assert::logicalAnd(...func_get_args())
-
+
Assert::anything(...func_get_args())
Assert::directoryExists(...func_get_args())
Assert::fileExists(...func_get_args())
@@ -279,277 +302,296 @@
-
+
$other
-
+
getCountOf
-
+
getCountOf
-
+
$other
-
+
$other
$value
-
+
$other
$value
-
+
$other
$value
-
+
$other
$value
-
+
Filter::getFilteredStacktrace($other)
-
+
$other
-
+
$other
-
+
(string) $other->getMessage()
-
+
$other
-
+
$other
-
+
$other
$value
-
- $this->attributeName
-
-
+
+ throw new Exception(
+ $e->getMessage(),
+ $e->getCode(),
+ $e
+ );
+
-
- $this->attributeName()
- $this->attributeName()
-
-
+
+ throw new Exception(
+ $e->getMessage(),
+ $e->getCode(),
+ $e
+ );
+
-
- $this->method
-
-
+
getMethod
-
- $this->attributeName()
-
-
+
hasProperty
-
+
new static
-
+
evaluate
evaluate
-
+
$constraint
-
+
new Differ(new UnifiedDiffOutputBuilder("--- Expected\n+++ Actual\n"))
-
+
throw InvalidArgumentException::create(1, 'non-empty string');
-
+
$value
-
+
value
-
+
$this->className
-
+
$className
-
+
DataProviderTestSuite
DataProviderTestSuite
-
+
$backupGlobals
-
+
$code
$message
-
+
Filter::getFilteredStacktrace($this)
-
+
$comparisonFailure
-
+
Filter::getFilteredStacktrace($this)
-
+
$t->getPrevious()
+
+
+ $parts[1]
+
+
-
+
$backupGlobals
-
+
id
-
+
+ new Rule\ConsecutiveParameters($arguments)
+
+
$id
$id
-
+
$nextValues
$value
-
+
$arguments
-
+
$value
-
+
+ $arguments
+ $arguments
$className
$className
$interfaceName
- $methodName
$methods
-
+
!is_array($methods) && null !== $methods
-
-
+
+ $this->getMock(
+ $originalClassName,
+ $methods,
+ $arguments,
+ $mockClassName,
+ $callOriginalConstructor,
+ $callOriginalClone,
+ $callAutoload,
+ $cloneArguments
+ )
+
+
MockObject&RealInstanceType
-
+
$type
-
+
getObject
-
+
$client->__getFunctions()
-
+
$types
-
+
throw $t;
-
+
invoke
-
+
$deferredError
-
+
$this->deferredError
-
+
$this->methodNameRule === null
$this->methodNameRule === null
$this->methodNameRule === null
$this->parametersRule === null
-
+
invoked
-
+
$methodNameRule
$parametersRule
$stub
-
+
$this->invocationRule !== null
$this->methodNameRule !== null
$this->methodNameRule !== null
@@ -561,188 +603,204 @@
-
+
$this->type
$this->type
$this->type
$this->type
-
+
setMethods
-
+
$object
$object
$object
-
+
MockObject&MockedType
MockObject&MockedType
MockObject&MockedType
-
+
$type
-
+
strpos($parameterAsString, '<optional> ')
-
-
+
+ (string) explode(
+ ' = ',
+ substr(
+ substr(
+ $parameterAsString,
+ strpos($parameterAsString, '<optional> ') + strlen('<optional> ')
+ ),
+ 0,
+ -2
+ )
+ )[1]
(string) var_export($defaultValue, true)
-
+
$originalObject
-
+
invoked
invokedDo
-
+
$this->invocation === null
-
+
null
-
+
$invocation
$parameterVerificationResult
-
+
(bool) $this->parameterVerificationResult
-
+
isset($this->parameterVerificationResult)
-
+
invoke
-
+
$argumentIndex
-
+
invoke
-
+
$callback
-
+
$callback
-
+
invoke
-
+
$reference
-
+
invoke
-
+
invoke
-
+
$value
-
+
invoke
-
+
invoke
-
+
invoke
-
+
$backupGlobals
-
+
$data
-
+
buildTestWithoutData
-
+
Filter::getFilteredStacktrace($t)
Filter::getFilteredStacktrace($t)
+ new DataProviderTestSuite(
+ $className . '::' . $methodName
+ )
throw new Exception('No valid test provided.');
-
- $methodName
+
$this->expectedException
-
+
InvokedAtIndexMatcher
new InvokedAtIndexMatcher($index)
-
+
setMethods
-
+
$this->backupGlobalsBlacklist
$this->backupGlobalsBlacklist
$this->backupStaticAttributesBlacklist
$this->backupStaticAttributesBlacklist
-
+
$this->backupStaticAttributes === null
$this->mockObjectGenerator === null
$this->prophet === null
$this->runClassInSeparateProcess === null
$this->runTestInSeparateProcess === null
-
+
$header
-
+
$mockObject
get_class($mock)
-
+
MockObject&RealInstanceType
class-string<MockObject&RealInstanceType>
-
+
$args
$args
$callback
$result
$value
-
+
getResult
runTest
-
+
+ TestUtil::getMissingRequirements(
+ static::class,
+ $this->name
+ )
cacheDirectory
endTest
endTest
@@ -826,14 +884,30 @@
getObjectForTrait
getObjectForTrait
new Differ($header)
+ new Template(
+ __DIR__ . '/../Util/PHP/Template/TestCaseClass.tpl'
+ )
+ new Template(
+ __DIR__ . '/../Util/PHP/Template/TestCaseMethod.tpl'
+ )
+ throw new Exception(
+ $e->getMessage(),
+ $e->getCode(),
+ $e
+ );
+ throw new Exception(
+ $e->getMessage(),
+ $e->getCode(),
+ $e
+ );
throw new Exception('This test uses TestCase::prophesize(), but phpspec/prophecy is not installed. Please run "composer require --dev phpspec/prophecy".');
-
+
$beStrictAboutChangesToGlobalState
null
null
-
+
$backupStaticAttributes
$mockObjectGenerator
$outputBufferingLevel
@@ -842,16 +916,16 @@
$runClassInSeparateProcess
$runTestInSeparateProcess
-
+
(bool) $this->backupStaticAttributes
-
+
$this instanceof PhptTestCase
-
+
$this->prophet !== null
-
+
$e
ObjectProphecy
PredictionException
@@ -859,7 +933,7 @@
Prophet
Prophet
-
+
$this->prophet
$this->prophet
\Prophecy\Exception\Doubler\ClassNotFoundException
@@ -869,17 +943,16 @@
-
- $name
+
$test
-
+
TestListener
TestListener
TestListener[]
private $listeners = [];
-
+
$this->listeners
$this->listeners
$this->listeners
@@ -892,30 +965,40 @@
$this->listeners
$this->listeners
-
+
[$test, 'runBare']
-
+
$codeCoverage
-
+
stop
+ throw new Exception(
+ $e->getMessage(),
+ $e->getCode(),
+ $e
+ );
+ throw new Exception(
+ $e->getMessage(),
+ $e->getCode(),
+ $e
+ );
-
+
$linesToBeCovered
-
+
$_timeout
$e
$e
$e
$isAnyCoverageRequired
-
+
$this->codeCoverage !== null
$this->codeCoverage !== null
-
+
addToAssertionCount
addToAssertionCount
doesNotPerformAssertions
@@ -932,36 +1015,38 @@
-
+
$className
$className
TestUtil::getDependencies($class->getName(), $methodName)
TestUtil::getDependencies($class->getName(), $methodName)
-
+
!is_string($theClass) && !$theClass instanceof ReflectionClass
is_string($testClass)
null === $this->backupGlobals
null === $this->backupStaticAttributes
null === $this->beStrictAboutChangesToGlobalState
-
+
FileLoader::checkAndLoad($filename)
new PhptTestCase($filename)
+ throw new Exception(
+ $e->getMessage(),
+ $e->getCode(),
+ $e
+ );
-
- clone $test
-
-
+
$backupGlobals
$backupStaticAttributes
$beStrictAboutChangesToGlobalState
$iteratorFilter
-
+
(string) $key
-
+
$this->iteratorFilter !== null
is_bool($backupGlobals)
is_bool($backupStaticAttributes)
@@ -972,78 +1057,87 @@
-
+
$backupGlobals
-
+
new StandardTestSuiteLoader
-
+
TestSuiteLoader
-
+
+ $extensionConfiguration->arguments()
+
+
TestListener
-
+
doAccept
-
+
GroupFilterIterator
-
+
NameFilterIterator
-
+
$filterMax
$filterMin
-
+
$accepted && isset($this->filterMax)
-
+
TestListenerAdapter
-
+
$lastTestWasNotSuccessful
-
+
RawCodeCoverageData::fromXdebugWithoutPathCoverage([])
RawCodeCoverageData::fromXdebugWithoutPathCoverage([])
-
+
RawCodeCoverageData::fromXdebugWithoutPathCoverage([])
RawCodeCoverageData::fromXdebugWithoutPathCoverage([])
-
+
cacheDirectory
+ new Template(
+ __DIR__ . '/../Util/PHP/Template/PhptTestCase.tpl'
+ )
stop
-
+
$sections['FILEEOF']
+
+ $setting[1]
+
-
+
StandardTestSuiteLoader
-
+
FileLoader::checkAndLoad($suiteClassFile)
-
+
$left
$left
$left
@@ -1051,7 +1145,7 @@
$right
$right
-
+
$order === self::ORDER_DURATION && $this->cache !== null
$orderDefects === self::ORDER_DEFECTS_FIRST && $this->cache !== null
$this->cache !== null
@@ -1059,28 +1153,34 @@
-
+
$parameters
array_merge(self::LONG_OPTIONS, $additionalLongOptions)
-
+
+ throw new Exception(
+ $e->getMessage(),
+ $e->getCode(),
+ $e
+ );
+
-
+
columns
-
+
$printerClass
-
+
StandardTestSuiteLoader::class
-
+
?TestSuiteLoader
-
+
handleLoader
handleLoader
hasTestSuiteLoaderClass
@@ -1088,10 +1188,10 @@
testSuiteLoaderClass
testSuiteLoaderFile
-
+
$class->newInstance($outputStream)
-
+
argument
argument
atLeastVersion
@@ -1111,57 +1211,67 @@
printerClass
stop
testSuiteLoaderClass
+ throw new ReflectionException(
+ $e->getMessage(),
+ $e->getCode(),
+ $e
+ );
+ throw new ReflectionException(
+ $e->getMessage(),
+ $e->getCode(),
+ $e
+ );
unrecognizedOrderBy
-
+
null|Printer|string
-
+
$suite
$suite
$suite
$suite
-
+
$_SERVER['argv']
-
+
assert(isset($arguments) && $arguments instanceof Configuration)
-
+
new static
-
+
DefaultResultPrinter
-
+
parent::__construct($out)
stop
-
+
$maxColumn
$numTestsWidth
-
+
$option['desc']
$option['desc']
-
+
new StandardTestSuiteLoader
new XdebugFilterScriptGenerator
-
+
TestSuiteLoader
TestSuiteLoader
TestSuiteLoader
-
+
addListener
addListener
addListener
@@ -1173,11 +1283,11 @@
createTestListenerInstance
flushListeners
-
+
$this->loader === null
$this->printer === null
-
+
$e
$e
$e
@@ -1185,8 +1295,17 @@
$e
$e
-
-
+
+ new $class(
+ (isset($arguments['stderr']) && $arguments['stderr'] === true) ? 'php://stderr' : null,
+ $arguments['verbose'],
+ $arguments['colors'],
+ $arguments['debug'],
+ $arguments['columns'],
+ $arguments['reverseList']
+ )
+
+
addFilter
addFilter
addFilter
@@ -1201,63 +1320,48 @@
stop
stop
-
+
$loader
-
+
$_SERVER['PHP_SELF']
$arguments['enforceTimeLimit']
-
+
$printer
-
+
assert($this->printer instanceof CliTestDoxPrinter)
-
+
$this->printer !== null
-
+
$position
-
+
$position
-
+
$position
-
+
$position
-
+
legacyCodeCoverage
-
- $testSuiteNodes
- $xpath->query($query)
- $xpath->query($query)
- $xpath->query($root . '/exclude/group')
- $xpath->query($root . '/include/group')
- $xpath->query('extensions/extension')
- $xpath->query('listeners/listener')
- $xpath->query('logging/log')
- $xpath->query('logging/log')
- $xpath->query('php/' . $array)
- $xpath->query('php/const')
- $xpath->query('php/includePath')
- $xpath->query('php/ini')
-
-
+
(string) $argument->textContent
(string) $const->getAttribute('name')
(string) $const->getAttribute('value')
@@ -1280,9 +1384,13 @@
(string) $element->getAttribute('name')
(string) $element->getAttribute('processUncoveredFilesFromWhitelist')
(string) $excludeNode->textContent
+ (string) $file->textContent
(string) $fileNode->getAttribute('phpVersion')
(string) $fileNode->getAttribute('phpVersionOperator')
(string) $fileNode->textContent
+ (string) $group->textContent
+ (string) $group->textContent
+ (string) $includePath->textContent
(string) $ini->getAttribute('name')
(string) $ini->getAttribute('value')
(string) $log->getAttribute('target')
@@ -1292,36 +1400,13 @@
(string) $var->getAttribute('name')
(string) $var->getAttribute('value')
-
+
assert($directoryNode instanceof DOMElement)
assert($fileNode instanceof DOMElement)
-
- $nodes
- $testSuiteNodes
- $testSuiteNodes
- $xpath->query($query)
- $xpath->query($query)
- $xpath->query($root . '/exclude/group')
- $xpath->query($root . '/include/group')
- $xpath->query('extensions/extension')
- $xpath->query('listeners/listener')
- $xpath->query('logging/log')
- $xpath->query('logging/log')
- $xpath->query('php/' . $array)
- $xpath->query('php/const')
- $xpath->query('php/includePath')
- $xpath->query('php/ini')
-
-
- $nodes->length
- $testSuiteNodes->length
- $xpath->query('filter/whitelist')->length
- $xpath->query('logging/log')->length
-
-
+
throw new Exception('Logger "JUnit XML" is not configured');
throw new Exception('Logger "Team City" is not configured');
throw new Exception('Logger "TestDox HTML" is not configured');
@@ -1331,89 +1416,88 @@
-
+
createElement
-
+
createElement
-
+
createElement
-
+
createElement
-
+
createElement
-
+
createElement
-
+
removeChild
-
-
+
removeChild
removeChild
-
+
$value
-
+
value
-
+
$position
-
+
$position
-
+
$value
-
+
value
-
+
$position
-
+
$position
-
+
hasTestSuiteLoaderClass
hasTestSuiteLoaderFile
-
+
$this->testSuiteLoaderClass
$this->testSuiteLoaderClass
$this->testSuiteLoaderClass
@@ -1421,13 +1505,13 @@
$this->testSuiteLoaderFile
$this->testSuiteLoaderFile
-
+
$columns
-
+
columns
-
+
(string) $this->bootstrap
(string) $this->cacheResultFile
(string) $this->defaultTestSuite
@@ -1439,118 +1523,146 @@
-
+
$position
-
+
$position
-
+
$position
-
- $dataProviderMethodName
-
-
+
throw new SkippedTestError;
-
-
+
+ array{
+ * __OFFSET: array<string, int>&array{__FILE: string},
+ * setting?: array<string, string>,
+ * extension_versions?: array<string, array{version: string, operator: string}>
+ * }&array<
+ * string,
+ * string|array{version: string, operator: string}|array{constraint: string}|array<int|string, string>
+ * >
+
+
(string) $matches['value'][$i]
-
-
+
+ static function ($errorNumber, $errorString)
+ {
+ if ($errorNumber === E_WARNING) {
+ return;
+ }
+
+ return false;
+ }
+
+
invokeIgnoringWarnings
-
-
-
- Assert
- DocBlock
- Project
- Prophet
- Type
-
+
+ throw new Exception(
+ sprintf(
+ '"%s" is not a directory',
+ $directory
+ )
+ );
+
-
+
$prefix
-
+
$variable
-
+
$json
-
- $methodName
+
$suite->getName()
-
+
JUnit
-
+
$this->currentTestCase === null
$this->currentTestCase === null
-
+
$this->testSuiteTimes
-
+
Filter::getFilteredStacktrace($t)
parent::__construct($out)
+ throw new Exception(
+ $e->getMessage(),
+ $e->getCode(),
+ $e
+ );
+ throw new Exception(
+ $e->getMessage(),
+ $e->getCode(),
+ $e
+ );
-
+
null
-
+
$currentTestCase
-
+
getName
getName
-
+
$className
-
+
TeamCity
-
+
$actualString === null
$expectedString === null
-
+
$value
-
+
Filter::getFilteredStacktrace($t)
+ throw new Exception(
+ $e->getMessage(),
+ $e->getCode(),
+ $e
+ );
-
+
$flowId
$startedTestName
TeamCity
TeamCity
-
+
getName
getName
getName
@@ -1560,70 +1672,70 @@
-
+
$this->getException($failures[0])
$this->getException($warnings[0])
-
+
$exception
-
+
$errfile
$errline
$errno
$errstr
-
+
Exception
-
+
strrpos($key, "\0")
-
+
$childResult->getCodeCoverage()
-
+
merge
-
+
addToAssertionCount
setResult
-
+
is_array($envVar)
-
+
$tempFile
-
+
$_SERVER
-
+
[]
-
+
WindowsPhpProcess
-
+
$stream
-
+
$filter
-
+
sanitizeVersionNumber
-
+
forClassName
forMethod
forMethod
@@ -1633,18 +1745,18 @@
-
+
CliTestDoxPrinter
-
+
self::SPINNER_ICONS[$id]
self::SPINNER_ICONS[$id]
-
+
\PHPUnit\Util\Filter::getFilteredStacktrace($t)
stop
-
+
$prefix['default']
$prefix['diff']
$prefix['last']
@@ -1652,109 +1764,126 @@
$prefix['start']
$prefix['trace']
-
+
self::STATUS_STYLES[$result['status']]['message']
-
+
CliTestDoxPrinter
CliTestDoxPrinter
-
+
HtmlResultPrinter
-
+
$this->currentTestClassPrettified
-
+
HtmlResultPrinter
-
+
$value
-
-
+
+ throw new UtilException(
+ $e->getMessage(),
+ $e->getCode(),
+ $e
+ );
+
+
is_string($value)
-
+
ResultPrinter
-
+
parent::__construct($out)
-
+
$testStatus
-
+
TestDoxPrinter
-
+
\PHPUnit\Util\Filter::getFilteredStacktrace($t)
-
+
TestDoxPrinter
TestDoxPrinter
-
+
getName
-
+
TextResultPrinter
-
+
TextResultPrinter
-
+
XmlResultPrinter
-
+
parent::__construct($out)
+ throw new Exception(
+ $e->getMessage(),
+ $e->getCode(),
+ $e
+ );
-
+
$suite->getIterator()
-
+
ensureOperatorIsValid
-
+
$item
-
+
new $className
-
+
(new DOMDocument)->importNode($element, true)
-
+
xmlToVariable
-
-
+
+ throw new Exception(
+ $e->getMessage(),
+ $e->getCode(),
+ $e
+ );
+
+
DOMElement
-
+
(string) $entry->getAttribute('key')
-
+
$suite->getIterator()
diff --git a/.psalm/config.xml b/.psalm/config.xml
index 5092541680b..1afb8a9d293 100644
--- a/.psalm/config.xml
+++ b/.psalm/config.xml
@@ -9,6 +9,7 @@
findUnusedVariablesAndParams="false"
findUnusedCode="false"
errorBaseline=".psalm/baseline.xml"
+ findUnusedBaselineEntry="true"
>
diff --git a/ChangeLog-8.5.md b/ChangeLog-8.5.md
index 6f5d259795f..6485b8e5390 100644
--- a/ChangeLog-8.5.md
+++ b/ChangeLog-8.5.md
@@ -2,7 +2,7 @@
All notable changes of the PHPUnit 8.5 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles.
-## [8.5.32] - 2022-MM-DD
+## [8.5.32] - 2023-01-26
### Fixed
@@ -262,7 +262,7 @@ All notable changes of the PHPUnit 8.5 release series are documented in this fil
* [#3967](https://github.com/sebastianbergmann/phpunit/issues/3967): Cannot double interface that extends interface that extends `\Throwable`
* [#3968](https://github.com/sebastianbergmann/phpunit/pull/3968): Test class run in a separate PHP process are passing when `exit` called inside
-[8.5.32]: https://github.com/sebastianbergmann/phpunit/compare/8.5.31...8.5
+[8.5.32]: https://github.com/sebastianbergmann/phpunit/compare/8.5.31...8.5.32
[8.5.31]: https://github.com/sebastianbergmann/phpunit/compare/8.5.30...8.5.31
[8.5.30]: https://github.com/sebastianbergmann/phpunit/compare/8.5.29...8.5.30
[8.5.29]: https://github.com/sebastianbergmann/phpunit/compare/8.5.28...8.5.29
diff --git a/ChangeLog-9.5.md b/ChangeLog-9.5.md
deleted file mode 100644
index 7004751bd67..00000000000
--- a/ChangeLog-9.5.md
+++ /dev/null
@@ -1,249 +0,0 @@
-# Changes in PHPUnit 9.5
-
-All notable changes of the PHPUnit 9.5 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles.
-
-## [9.5.28] - 2023-01-14
-
-### Fixed
-
-* [#5120](https://github.com/sebastianbergmann/phpunit/issues/5120): Test Runner incorrectly treats `--testsuite` and `--list-tests` as not combinable options
-
-## [9.5.27] - 2022-12-09
-
-### Fixed
-
-* [#5113](https://github.com/sebastianbergmann/phpunit/pull/5113): PHP error instead of PHPUnit error when trying to create test double for `readonly` class
-
-## [9.5.26] - 2022-10-28
-
-### Fixed
-
-* [#5076](https://github.com/sebastianbergmann/phpunit/issues/5076): Test Runner does not warn about conflicting options
-
-## [9.5.25] - 2022-09-25
-
-### Added
-
-* [#5042](https://github.com/sebastianbergmann/phpunit/issues/5042): Support Disjunctive Normal Form types
-
-### Fixed
-
-* [#4966](https://github.com/sebastianbergmann/phpunit/issues/4966): `TestCase::assertSame()` (and related exact comparisons) must compare `float` exactly
-
-## [9.5.24] - 2022-08-30
-
-### Added
-
-* [#4931](https://github.com/sebastianbergmann/phpunit/issues/4931): Support `null` and `false` as stand-alone types
-* [#4955](https://github.com/sebastianbergmann/phpunit/issues/4955): Support `true` as stand-alone type
-
-### Fixed
-
-* [#4913](https://github.com/sebastianbergmann/phpunit/issues/4913): Failed `assert()` should show a backtrace
-* [#5012](https://github.com/sebastianbergmann/phpunit/pull/5012): Memory leak in `ExceptionWrapper`
-
-## [9.5.23] - 2022-08-22
-
-### Changed
-
-* [#5033](https://github.com/sebastianbergmann/phpunit/issues/5033): Do not depend on phpspec/prophecy
-
-## [9.5.22] - 2022-08-20
-
-### Fixed
-
-* [#5015](https://github.com/sebastianbergmann/phpunit/pull/5015): Ukraine banner unreadable on black background
-* [#5020](https://github.com/sebastianbergmann/phpunit/issues/5020): PHPUnit 9 breaks loading of PSR-0/PEAR style classes
-* [#5022](https://github.com/sebastianbergmann/phpunit/issues/5022): `ExcludeList::addDirectory()` does not work correctly
-
-## [9.5.21] - 2022-06-19
-
-### Fixed
-
-* [#4950](https://github.com/sebastianbergmann/phpunit/issues/4950): False error on `atMost()` invocation rule without call
-* [#4962](https://github.com/sebastianbergmann/phpunit/issues/4962): Ukraine banner unreadable on white background
-
-## [9.5.20] - 2022-04-01
-
-### Fixed
-
-* [#4938](https://github.com/sebastianbergmann/phpunit/issues/4938): Test Double code generator does not handle `void` return type declaration on `__clone()` methods
-* [#4947](https://github.com/sebastianbergmann/phpunit/issues/4947): Test annotated with `@coversNothing` may lead to files missing from code coverage report
-
-## [9.5.19] - 2022-03-15
-
-### Fixed
-
-* [#4929](https://github.com/sebastianbergmann/phpunit/issues/4929): Test Double code generator does not handle new expressions inside parameter default values
-* [#4932](https://github.com/sebastianbergmann/phpunit/issues/4932): Backport support for intersection types from PHPUnit 10 to PHPUnit 9.5
-* [#4933](https://github.com/sebastianbergmann/phpunit/issues/4933): Backport support for `never` type from PHPUnit 10 to PHPUnit 9.5
-
-## [9.5.18] - 2022-03-08
-
-### Fixed
-
-* [#4877](https://github.com/sebastianbergmann/phpunit/issues/4877): No stack trace shown when an error occurs during bootstrap
-
-## [9.5.17] - 2022-03-05 - #StandWithUkraine
-
-## [9.5.16] - 2022-02-23
-
-### Changed
-
-* Reverted sync with API change in (now yanked) phpunit/php-code-coverage 9.2.12
-
-## [9.5.15] - 2022-02-23 [YANKED]
-
-### Fixed
-
-* When the HTML code coverage report's configured low upper bound is larger than the high lower bound then the default values are used instead
-
-## [9.5.14] - 2022-02-18
-
-### Changed
-
-* [#4874](https://github.com/sebastianbergmann/phpunit/pull/4874): `PHP_FLOAT_EPSILON` is now used instead of hardcoded `0.0000000001` in `PHPUnit\Framework\Constraint\IsIdentical`
-
-## [9.5.13] - 2022-01-24
-
-### Fixed
-
-* [#4871](https://github.com/sebastianbergmann/phpunit/issues/4871): Class `SebastianBergmann\CodeCoverage\Filter` is not found during PHPT tests when PHPUnit is used from PHAR
-
-## [9.5.12] - 2022-01-21
-
-### Fixed
-
-* [#4799](https://github.com/sebastianbergmann/phpunit/pull/4799): Memory leaks in `PHPUnit\Framework\TestSuite` class
-* [#4857](https://github.com/sebastianbergmann/phpunit/pull/4857): Result of `debug_backtrace()` is not used correctly
-
-## [9.5.11] - 2021-12-25
-
-### Changed
-
-* [#4812](https://github.com/sebastianbergmann/phpunit/issues/4812): Do not enforce time limits when a debugging session through DBGp is active
-* [#4835](https://github.com/sebastianbergmann/phpunit/issues/4835): Support for `$GLOBALS['_composer_autoload_path']` introduced in Composer 2.2
-
-### Fixed
-
-* [#4840](https://github.com/sebastianbergmann/phpunit/pull/4840): TestDox prettifying for class names does not correctly handle diacritics
-* [#4846](https://github.com/sebastianbergmann/phpunit/pull/4846): Composer proxy script is not ignored
-
-## [9.5.10] - 2021-09-25
-
-### Changed
-
-* PHPUnit no longer converts PHP deprecations to exceptions by default (configure `convertDeprecationsToExceptions="true"` to enable this)
-* The PHPUnit XML configuration file generator now configures `convertDeprecationsToExceptions="true"`
-
-### Fixed
-
-* [#4772](https://github.com/sebastianbergmann/phpunit/pull/4772): TestDox HTML report not displayed correctly when browser has custom colour settings
-
-## [9.5.9] - 2021-08-31
-
-### Fixed
-
-* [#4750](https://github.com/sebastianbergmann/phpunit/issues/4750): Automatic return value generation leads to invalid (and superfluous) test double code generation when a stubbed method returns `*|false`
-* [#4751](https://github.com/sebastianbergmann/phpunit/issues/4751): Configuration validation fails when using brackets in glob pattern
-
-## [9.5.8] - 2021-07-31
-
-### Fixed
-
-* [#4740](https://github.com/sebastianbergmann/phpunit/issues/4740): `phpunit.phar` does not work with PHP 8.1
-
-## [9.5.7] - 2021-07-19
-
-### Fixed
-
-* [#4720](https://github.com/sebastianbergmann/phpunit/issues/4720): PHPUnit does not verify its own PHP extension requirements
-* [#4735](https://github.com/sebastianbergmann/phpunit/issues/4735): Automated return value generation does not work for stubbed methods that return `*|false`
-
-## [9.5.6] - 2021-06-23
-
-### Changed
-
-* PHPUnit now errors out on startup when `PHP_VERSION` contains a value that is not compatible with `version_compare()`, for instance `X.Y.Z-(to be removed in future macOS)`
-
-## [9.5.5] - 2021-06-05
-
-### Changed
-
-* The test result cache (the storage for which is implemented in `PHPUnit\Runner\DefaultTestResultCache`) no longer uses PHP's `serialize()` and `unserialize()` functions for persistence. It now uses a versioned JSON format instead that is independent of PHP implementation details (see [#3581](https://github.com/sebastianbergmann/phpunit/issues/3581) and [#4662](https://github.com/sebastianbergmann/phpunit/pull/4662) for examples why this is a problem). When PHPUnit tries to load the test result cache from a file that does not exist, or from a file that does not contain data in JSON format, or from a file that contains data in a JSON format version other than the one used by the currently running PHPUnit version, then this is considered to be a "cache miss". An empty `DefaultTestResultCache` object is created in this case. This should also prevent PHPUnit from crashing when trying to load a test result cache file created by a different version of PHPUnit (see [#4580](https://github.com/sebastianbergmann/phpunit/issues/4580) for example).
-
-### Fixed
-
-* [#4632](https://github.com/sebastianbergmann/phpunit/issues/4632): TestDox result printer does not handle repeated test execution correctly
-* [#4678](https://github.com/sebastianbergmann/phpunit/pull/4678): Stubbed methods with `iterable` return types should return empty array by default
-* [#4692](https://github.com/sebastianbergmann/phpunit/issues/4692): Annotations in single-line doc-comments are not handled correctly
-* [#4694](https://github.com/sebastianbergmann/phpunit/issues/4694): `TestCase::getMockFromWsdl()` does not work with PHP 8.1-dev
-
-## [9.5.4] - 2021-03-23
-
-### Fixed
-
-* [#4630](https://github.com/sebastianbergmann/phpunit/issues/4630): Empty test case class causes error in TestDox XML logger
-
-## [9.5.3] - 2021-03-17
-
-### Fixed
-
-* [#4591](https://github.com/sebastianbergmann/phpunit/issues/4591): TeamCity logger logs warnings as test failures
-* [#4620](https://github.com/sebastianbergmann/phpunit/issues/4620): No useful output when an error occurs in the bootstrap script
-
-## [9.5.2] - 2021-02-02
-
-### Fixed
-
-* [#4573](https://github.com/sebastianbergmann/phpunit/issues/4573): No stack trace printed when PHPUnit is used from PHAR
-* [#4590](https://github.com/sebastianbergmann/phpunit/issues/4590): `--coverage-text` CLI option is documented wrong
-
-## [9.5.1] - 2021-01-17
-
-### Fixed
-
-* [#4572](https://github.com/sebastianbergmann/phpunit/issues/4572): Schema validation does not work with `%xx` sequences in path to `phpunit.xsd`
-
-## [9.5.0] - 2020-12-04
-
-### Changed
-
-* [#4490](https://github.com/sebastianbergmann/phpunit/issues/4490): Emit Error instead of Warning when test case class cannot be instantiated
-* [#4491](https://github.com/sebastianbergmann/phpunit/issues/4491): Emit Error instead of Warning when data provider does not work correctly
-* [#4492](https://github.com/sebastianbergmann/phpunit/issues/4492): Emit Error instead of Warning when test double configuration is invalid
-* [#4493](https://github.com/sebastianbergmann/phpunit/issues/4493): Emit error when (configured) test directory does not exist
-
-### Fixed
-
-* [#4535](https://github.com/sebastianbergmann/phpunit/issues/4535): `getMockFromWsdl()` does not handle methods that do not have parameters correctly
-
-[9.5.28]: https://github.com/sebastianbergmann/phpunit/compare/9.5.27...9.5.28
-[9.5.27]: https://github.com/sebastianbergmann/phpunit/compare/9.5.26...9.5.27
-[9.5.26]: https://github.com/sebastianbergmann/phpunit/compare/9.5.25...9.5.26
-[9.5.25]: https://github.com/sebastianbergmann/phpunit/compare/9.5.24...9.5.25
-[9.5.24]: https://github.com/sebastianbergmann/phpunit/compare/9.5.23...9.5.24
-[9.5.23]: https://github.com/sebastianbergmann/phpunit/compare/9.5.22...9.5.23
-[9.5.22]: https://github.com/sebastianbergmann/phpunit/compare/9.5.21...9.5.22
-[9.5.21]: https://github.com/sebastianbergmann/phpunit/compare/9.5.20...9.5.21
-[9.5.20]: https://github.com/sebastianbergmann/phpunit/compare/9.5.19...9.5.20
-[9.5.19]: https://github.com/sebastianbergmann/phpunit/compare/9.5.18...9.5.19
-[9.5.18]: https://github.com/sebastianbergmann/phpunit/compare/9.5.17...9.5.18
-[9.5.17]: https://github.com/sebastianbergmann/phpunit/compare/9.5.16...9.5.17
-[9.5.16]: https://github.com/sebastianbergmann/phpunit/compare/dc738383c519243b0a967f63943a848d3fd861aa...9.5.16
-[9.5.15]: https://github.com/sebastianbergmann/phpunit/compare/9.5.14...dc738383c519243b0a967f63943a848d3fd861aa
-[9.5.14]: https://github.com/sebastianbergmann/phpunit/compare/9.5.13...9.5.14
-[9.5.13]: https://github.com/sebastianbergmann/phpunit/compare/9.5.12...9.5.13
-[9.5.12]: https://github.com/sebastianbergmann/phpunit/compare/9.5.11...9.5.12
-[9.5.11]: https://github.com/sebastianbergmann/phpunit/compare/9.5.10...9.5.11
-[9.5.10]: https://github.com/sebastianbergmann/phpunit/compare/9.5.9...9.5.10
-[9.5.9]: https://github.com/sebastianbergmann/phpunit/compare/9.5.8...9.5.9
-[9.5.8]: https://github.com/sebastianbergmann/phpunit/compare/9.5.7...9.5.8
-[9.5.7]: https://github.com/sebastianbergmann/phpunit/compare/9.5.6...9.5.7
-[9.5.6]: https://github.com/sebastianbergmann/phpunit/compare/9.5.5...9.5.6
-[9.5.5]: https://github.com/sebastianbergmann/phpunit/compare/9.5.4...9.5.5
-[9.5.4]: https://github.com/sebastianbergmann/phpunit/compare/9.5.3...9.5.4
-[9.5.3]: https://github.com/sebastianbergmann/phpunit/compare/9.5.2...9.5.3
-[9.5.2]: https://github.com/sebastianbergmann/phpunit/compare/9.5.1...9.5.2
-[9.5.1]: https://github.com/sebastianbergmann/phpunit/compare/9.5.0...9.5.1
-[9.5.0]: https://github.com/sebastianbergmann/phpunit/compare/9.4.4...9.5.0
diff --git a/ChangeLog-9.6.md b/ChangeLog-9.6.md
new file mode 100644
index 00000000000..88fb763bcc5
--- /dev/null
+++ b/ChangeLog-9.6.md
@@ -0,0 +1,14 @@
+# Changes in PHPUnit 9.6
+
+All notable changes of the PHPUnit 9.6 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles.
+
+## [9.6.0] - 2023-02-03
+
+### Changed
+
+* [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062): Deprecate `expectDeprecation()`, `expectDeprecationMessage()`, `expectDeprecationMessageMatches()`, `expectError()`, `expectErrorMessage()`, `expectErrorMessageMatches()`, `expectNotice()`, `expectNoticeMessage()`, `expectNoticeMessageMatches()`, `expectWarning()`, `expectWarningMessage()`, and `expectWarningMessageMatches()`
+* [#5063](https://github.com/sebastianbergmann/phpunit/issues/5063): Deprecate `withConsecutive()`
+* [#5064](https://github.com/sebastianbergmann/phpunit/issues/5064): Deprecate `PHPUnit\Framework\TestCase::getMockClass()`
+* [#5132](https://github.com/sebastianbergmann/phpunit/issues/5132): Deprecate `Test` suffix for abstract test case classes
+
+[9.6.0]: https://github.com/sebastianbergmann/phpunit/compare/9.5.28...9.6.0
diff --git a/README.md b/README.md
index d30106662e0..ffc8bf323a1 100644
--- a/README.md
+++ b/README.md
@@ -2,12 +2,12 @@
# PHPUnit
-PHPUnit is a programmer-oriented testing framework for PHP. It is an instance of the xUnit architecture for unit testing frameworks.
-
-[](https://packagist.org/packages/phpunit/phpunit)
-[](https://php.net/)
-[](https://phpunit.de/build-status.html)
+[](https://packagist.org/packages/phpunit/phpunit)
+[](https://github.com/sebastianbergmann/phpunit/actions)
[](https://shepherd.dev/github/sebastianbergmann/phpunit)
+[](https://codecov.io/gh/sebastianbergmann/phpunit)
+
+PHPUnit is a programmer-oriented testing framework for PHP. It is an instance of the xUnit architecture for unit testing frameworks.
## Installation
@@ -34,12 +34,5 @@ Thanks to everyone who has contributed to PHPUnit! You can find a detailed list
* [PHPUnit](https://github.com/sebastianbergmann/phpunit/graphs/contributors)
* [php-code-coverage](https://github.com/sebastianbergmann/php-code-coverage/graphs/contributors)
-A very special thanks to everyone who has contributed to the documentation and helps maintain the translations:
-
-* [English](https://github.com/sebastianbergmann/phpunit-documentation-english/graphs/contributors)
-* [Spanish](https://github.com/sebastianbergmann/phpunit-documentation-spanish/graphs/contributors)
-* [French](https://github.com/sebastianbergmann/phpunit-documentation-french/graphs/contributors)
-* [Japanese](https://github.com/sebastianbergmann/phpunit-documentation-japanese/graphs/contributors)
-* [Brazilian Portuguese](https://github.com/sebastianbergmann/phpunit-documentation-brazilian-portuguese/graphs/contributors)
-* [Simplified Chinese](https://github.com/sebastianbergmann/phpunit-documentation-chinese/graphs/contributors)
+A very special thanks to everyone who has contributed to the [documentation](https://github.com/sebastianbergmann/phpunit-documentation-english/graphs/contributors).
diff --git a/build.xml b/build.xml
index 514d9228871..69c8667b7d9 100644
--- a/build.xml
+++ b/build.xml
@@ -448,7 +448,12 @@
-
+
+
+
+
+
+
diff --git a/composer.json b/composer.json
index af0f0a3abb3..38117ea1eb4 100644
--- a/composer.json
+++ b/composer.json
@@ -83,7 +83,7 @@
},
"extra": {
"branch-alias": {
- "dev-master": "9.5-dev"
+ "dev-master": "9.6-dev"
}
}
}
diff --git a/phpunit.xsd b/phpunit.xsd
index eabefac30b0..7fa2f6b6781 100644
--- a/phpunit.xsd
+++ b/phpunit.xsd
@@ -2,7 +2,7 @@
- This Schema file defines the rules by which the XML configuration file of PHPUnit 9.5 may be structured.
+ This Schema file defines the rules by which the XML configuration file of PHPUnit 9.6 may be structured.
diff --git a/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php b/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php
index 8ded556ce1d..4bf19e27dfa 100644
--- a/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php
+++ b/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php
@@ -30,14 +30,19 @@ public static function determineJsonError(string $error, string $prefix = ''): ?
switch ($error) {
case JSON_ERROR_NONE:
return null;
+
case JSON_ERROR_DEPTH:
return $prefix . 'Maximum stack depth exceeded';
+
case JSON_ERROR_STATE_MISMATCH:
return $prefix . 'Underflow or the modes mismatch';
+
case JSON_ERROR_CTRL_CHAR:
return $prefix . 'Unexpected control character found';
+
case JSON_ERROR_SYNTAX:
return $prefix . 'Syntax error, malformed JSON';
+
case JSON_ERROR_UTF8:
return $prefix . 'Malformed UTF-8 characters, possibly incorrectly encoded';
@@ -56,6 +61,7 @@ public static function translateTypeToPrefix(string $type): string
$prefix = 'Expected value JSON decode error - ';
break;
+
case 'actual':
$prefix = 'Actual value JSON decode error - ';
diff --git a/src/Framework/MockObject/Builder/InvocationMocker.php b/src/Framework/MockObject/Builder/InvocationMocker.php
index 89b1e31ab10..bc3c9236f00 100644
--- a/src/Framework/MockObject/Builder/InvocationMocker.php
+++ b/src/Framework/MockObject/Builder/InvocationMocker.php
@@ -194,6 +194,8 @@ public function with(...$arguments): self
* @throws MethodParametersAlreadyConfiguredException
*
* @return $this
+ *
+ * @deprecated
*/
public function withConsecutive(...$arguments): self
{
diff --git a/src/Framework/MockObject/Generator.php b/src/Framework/MockObject/Generator.php
index 9651cb1cd90..17e3312c573 100644
--- a/src/Framework/MockObject/Generator.php
+++ b/src/Framework/MockObject/Generator.php
@@ -993,10 +993,10 @@ private function generateMock(string $type, ?array $explicitMethods, string $moc
$isInterface,
$additionalInterfaces
),
- 'clone' => $cloneTrait,
- 'mock_class_name' => $_mockClassName['className'],
- 'mocked_methods' => $mockedMethods,
- 'method' => $method,
+ 'clone' => $cloneTrait,
+ 'mock_class_name' => $_mockClassName['className'],
+ 'mocked_methods' => $mockedMethods,
+ 'method' => $method,
]
);
diff --git a/src/Framework/MockObject/Rule/ConsecutiveParameters.php b/src/Framework/MockObject/Rule/ConsecutiveParameters.php
index 6025c0a1604..2188ea0ffc0 100644
--- a/src/Framework/MockObject/Rule/ConsecutiveParameters.php
+++ b/src/Framework/MockObject/Rule/ConsecutiveParameters.php
@@ -21,6 +21,8 @@
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
+ *
+ * @deprecated
*/
final class ConsecutiveParameters implements ParametersRule
{
diff --git a/src/Framework/TestCase.php b/src/Framework/TestCase.php
index 530ab6c213d..2d83fe0182d 100644
--- a/src/Framework/TestCase.php
+++ b/src/Framework/TestCase.php
@@ -599,22 +599,22 @@ public function expectException(string $exception): void
// @codeCoverageIgnoreStart
switch ($exception) {
case Deprecated::class:
- $this->addWarning('Support for using expectException() with PHPUnit\Framework\Error\Deprecated is deprecated and will be removed in PHPUnit 10. Use expectDeprecation() instead.');
+ $this->addWarning('Expecting E_DEPRECATED and E_USER_DEPRECATED is deprecated and will no longer be possible in PHPUnit 10.');
break;
case Error::class:
- $this->addWarning('Support for using expectException() with PHPUnit\Framework\Error\Error is deprecated and will be removed in PHPUnit 10. Use expectError() instead.');
+ $this->addWarning('Expecting E_ERROR and E_USER_ERROR is deprecated and will no longer be possible in PHPUnit 10.');
break;
case Notice::class:
- $this->addWarning('Support for using expectException() with PHPUnit\Framework\Error\Notice is deprecated and will be removed in PHPUnit 10. Use expectNotice() instead.');
+ $this->addWarning('Expecting E_STRICT, E_NOTICE, and E_USER_NOTICE is deprecated and will no longer be possible in PHPUnit 10.');
break;
case WarningError::class:
- $this->addWarning('Support for using expectException() with PHPUnit\Framework\Error\Warning is deprecated and will be removed in PHPUnit 10. Use expectWarning() instead.');
+ $this->addWarning('Expecting E_WARNING and E_USER_WARNING is deprecated and will no longer be possible in PHPUnit 10.');
break;
}
@@ -658,63 +658,123 @@ public function expectNotToPerformAssertions(): void
$this->doesNotPerformAssertions = true;
}
+ /**
+ * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5062
+ */
public function expectDeprecation(): void
{
+ $this->addWarning('Expecting E_DEPRECATED and E_USER_DEPRECATED is deprecated and will no longer be possible in PHPUnit 10.');
+
$this->expectedException = Deprecated::class;
}
+ /**
+ * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5062
+ */
public function expectDeprecationMessage(string $message): void
{
+ $this->addWarning('Expecting E_DEPRECATED and E_USER_DEPRECATED is deprecated and will no longer be possible in PHPUnit 10.');
+
$this->expectExceptionMessage($message);
}
+ /**
+ * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5062
+ */
public function expectDeprecationMessageMatches(string $regularExpression): void
{
+ $this->addWarning('Expecting E_DEPRECATED and E_USER_DEPRECATED is deprecated and will no longer be possible in PHPUnit 10.');
+
$this->expectExceptionMessageMatches($regularExpression);
}
+ /**
+ * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5062
+ */
public function expectNotice(): void
{
+ $this->addWarning('Expecting E_STRICT, E_NOTICE, and E_USER_NOTICE is deprecated and will no longer be possible in PHPUnit 10.');
+
$this->expectedException = Notice::class;
}
+ /**
+ * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5062
+ */
public function expectNoticeMessage(string $message): void
{
+ $this->addWarning('Expecting E_STRICT, E_NOTICE, and E_USER_NOTICE is deprecated and will no longer be possible in PHPUnit 10.');
+
$this->expectExceptionMessage($message);
}
+ /**
+ * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5062
+ */
public function expectNoticeMessageMatches(string $regularExpression): void
{
+ $this->addWarning('Expecting E_STRICT, E_NOTICE, and E_USER_NOTICE is deprecated and will no longer be possible in PHPUnit 10.');
+
$this->expectExceptionMessageMatches($regularExpression);
}
+ /**
+ * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5062
+ */
public function expectWarning(): void
{
+ $this->addWarning('Expecting E_WARNING and E_USER_WARNING is deprecated and will no longer be possible in PHPUnit 10.');
+
$this->expectedException = WarningError::class;
}
+ /**
+ * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5062
+ */
public function expectWarningMessage(string $message): void
{
+ $this->addWarning('Expecting E_WARNING and E_USER_WARNING is deprecated and will no longer be possible in PHPUnit 10.');
+
$this->expectExceptionMessage($message);
}
+ /**
+ * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5062
+ */
public function expectWarningMessageMatches(string $regularExpression): void
{
+ $this->addWarning('Expecting E_WARNING and E_USER_WARNING is deprecated and will no longer be possible in PHPUnit 10.');
+
$this->expectExceptionMessageMatches($regularExpression);
}
+ /**
+ * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5062
+ */
public function expectError(): void
{
+ $this->addWarning('Expecting E_ERROR and E_USER_ERROR is deprecated and will no longer be possible in PHPUnit 10.');
+
$this->expectedException = Error::class;
}
+ /**
+ * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5062
+ */
public function expectErrorMessage(string $message): void
{
+ $this->addWarning('Expecting E_ERROR and E_USER_ERROR is deprecated and will no longer be possible in PHPUnit 10.');
+
$this->expectExceptionMessage($message);
}
+ /**
+ * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5062
+ */
public function expectErrorMessageMatches(string $regularExpression): void
{
+ $this->addWarning('Expecting E_ERROR and E_USER_ERROR is deprecated and will no longer be possible in PHPUnit 10.');
+
$this->expectExceptionMessageMatches($regularExpression);
}
@@ -1825,9 +1885,13 @@ protected function createTestProxy(string $originalClassName, array $constructor
* @psalm-param class-string|string $originalClassName
*
* @psalm-return class-string
+ *
+ * @deprecated
*/
protected function getMockClass(string $originalClassName, $methods = [], array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = false, bool $callOriginalClone = true, bool $callAutoload = true, bool $cloneArguments = false): string
{
+ $this->addWarning('PHPUnit\Framework\TestCase::getMockClass() is deprecated and will be removed in PHPUnit 10.');
+
$this->recordDoubledType($originalClassName);
$mock = $this->getMockObjectGenerator()->getMock(
diff --git a/src/Framework/TestSuite.php b/src/Framework/TestSuite.php
index ce738533f05..a51538b18d0 100644
--- a/src/Framework/TestSuite.php
+++ b/src/Framework/TestSuite.php
@@ -456,6 +456,15 @@ public function addTestFile(string $filename): void
continue;
}
+ if ($class->isAbstract() && $class->isSubclassOf(TestCase::class)) {
+ $this->addWarning(
+ sprintf(
+ 'Abstract test case classes with "Test" suffix are deprecated (%s)',
+ $class->getName()
+ )
+ );
+ }
+
if (!$class->isAbstract()) {
if ($class->hasMethod(BaseTestRunner::SUITE_METHODNAME)) {
try {
diff --git a/src/Runner/Version.php b/src/Runner/Version.php
index b45b2e3a9f0..ae223040404 100644
--- a/src/Runner/Version.php
+++ b/src/Runner/Version.php
@@ -41,7 +41,7 @@ public static function id(): string
}
if (self::$version === '') {
- self::$version = (new VersionId('9.5.28', dirname(__DIR__, 2)))->getVersion();
+ self::$version = (new VersionId('9.6.0', dirname(__DIR__, 2)))->getVersion();
}
return self::$version;
diff --git a/src/TextUI/Help.php b/src/TextUI/Help.php
index 289e5b3a324..084f2a2187a 100644
--- a/src/TextUI/Help.php
+++ b/src/TextUI/Help.php
@@ -29,12 +29,12 @@ final class Help
private const LEFT_MARGIN = ' ';
private const HELP_TEXT = [
- 'Usage' => [
+ 'Usage' => [
['text' => 'phpunit [options] UnitTest.php'],
['text' => 'phpunit [options] '],
],
- 'Code Coverage Options' => [
+ 'Code Coverage Options' => [
['arg' => '--coverage-clover ', 'desc' => 'Generate code coverage report in Clover XML format'],
['arg' => '--coverage-cobertura ', 'desc' => 'Generate code coverage report in Cobertura XML format'],
['arg' => '--coverage-crap4j ', 'desc' => 'Generate code coverage report in Crap4J XML format'],
@@ -50,7 +50,7 @@ final class Help
['arg' => '--no-coverage', 'desc' => 'Ignore code coverage configuration'],
],
- 'Logging Options' => [
+ 'Logging Options' => [
['arg' => '--log-junit ', 'desc' => 'Log test execution in JUnit XML format to file'],
['arg' => '--log-teamcity ', 'desc' => 'Log test execution in TeamCity format to file'],
['arg' => '--testdox-html ', 'desc' => 'Write agile documentation in HTML format to file'],
@@ -118,13 +118,13 @@ final class Help
['arg' => '--printer ', 'desc' => 'TestListener implementation to use'],
['spacer' => ''],
- ['arg' => '--order-by ', 'desc' => 'Run tests in order: default|defects|duration|no-depends|random|reverse|size'],
- ['arg' => '--random-order-seed ', 'desc' => 'Use a specific random seed for random order'],
- ['arg' => '--cache-result', 'desc' => 'Write test results to cache file'],
- ['arg' => '--do-not-cache-result', 'desc' => 'Do not write test results to cache file'],
+ ['arg' => '--order-by ', 'desc' => 'Run tests in order: default|defects|duration|no-depends|random|reverse|size'],
+ ['arg' => '--random-order-seed ', 'desc' => 'Use a specific random seed for random order'],
+ ['arg' => '--cache-result', 'desc' => 'Write test results to cache file'],
+ ['arg' => '--do-not-cache-result', 'desc' => 'Do not write test results to cache file'],
],
- 'Configuration Options' => [
+ 'Configuration Options' => [
['arg' => '--prepend ', 'desc' => 'A PHP script that is included as early as possible'],
['arg' => '--bootstrap ', 'desc' => 'A PHP script that is included before the tests run'],
['arg' => '-c|--configuration ', 'desc' => 'Read configuration from XML file'],
@@ -138,7 +138,7 @@ final class Help
['arg' => '--migrate-configuration', 'desc' => 'Migrate configuration file to current format'],
],
- 'Miscellaneous Options' => [
+ 'Miscellaneous Options' => [
['arg' => '-h|--help', 'desc' => 'Prints this usage information'],
['arg' => '--version', 'desc' => 'Prints the version and exits'],
['arg' => '--atleast-version ', 'desc' => 'Checks that version is greater than min and exits'],
diff --git a/src/Util/ExcludeList.php b/src/Util/ExcludeList.php
index c4ddc515726..778eb309120 100644
--- a/src/Util/ExcludeList.php
+++ b/src/Util/ExcludeList.php
@@ -23,12 +23,8 @@
use Doctrine\Instantiator\Instantiator;
use PharIo\Manifest\Manifest;
use PharIo\Version\Version as PharIoVersion;
-use phpDocumentor\Reflection\DocBlock;
-use phpDocumentor\Reflection\Project;
-use phpDocumentor\Reflection\Type;
use PhpParser\Parser;
use PHPUnit\Framework\TestCase;
-use Prophecy\Prophet;
use ReflectionClass;
use SebastianBergmann\CliParser\Parser as CliParser;
use SebastianBergmann\CodeCoverage\CodeCoverage;
@@ -51,7 +47,6 @@
use SebastianBergmann\Type\TypeName;
use SebastianBergmann\Version;
use TheSeer\Tokenizer\Tokenizer;
-use Webmozart\Assert\Assert;
/**
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
@@ -63,103 +58,91 @@ final class ExcludeList
*/
private const EXCLUDED_CLASS_NAMES = [
// composer
- ClassLoader::class => 1,
+ ClassLoader::class => 1,
// doctrine/instantiator
- Instantiator::class => 1,
+ Instantiator::class => 1,
// myclabs/deepcopy
- DeepCopy::class => 1,
+ DeepCopy::class => 1,
// nikic/php-parser
- Parser::class => 1,
+ Parser::class => 1,
// phar-io/manifest
- Manifest::class => 1,
+ Manifest::class => 1,
// phar-io/version
- PharIoVersion::class => 1,
-
- // phpdocumentor/reflection-common
- Project::class => 1,
-
- // phpdocumentor/reflection-docblock
- DocBlock::class => 1,
+ PharIoVersion::class => 1,
// phpdocumentor/type-resolver
- Type::class => 1,
-
- // phpspec/prophecy
- Prophet::class => 1,
+ Type::class => 1,
// phpunit/phpunit
- TestCase::class => 2,
+ TestCase::class => 2,
// phpunit/php-code-coverage
- CodeCoverage::class => 1,
+ CodeCoverage::class => 1,
// phpunit/php-file-iterator
FileIteratorFacade::class => 1,
// phpunit/php-invoker
- Invoker::class => 1,
+ Invoker::class => 1,
// phpunit/php-text-template
- Template::class => 1,
+ Template::class => 1,
// phpunit/php-timer
- Timer::class => 1,
+ Timer::class => 1,
// sebastian/cli-parser
- CliParser::class => 1,
+ CliParser::class => 1,
// sebastian/code-unit
- CodeUnit::class => 1,
+ CodeUnit::class => 1,
// sebastian/code-unit-reverse-lookup
- Wizard::class => 1,
+ Wizard::class => 1,
// sebastian/comparator
- Comparator::class => 1,
+ Comparator::class => 1,
// sebastian/complexity
- Calculator::class => 1,
+ Calculator::class => 1,
// sebastian/diff
- Diff::class => 1,
+ Diff::class => 1,
// sebastian/environment
- Runtime::class => 1,
+ Runtime::class => 1,
// sebastian/exporter
- Exporter::class => 1,
+ Exporter::class => 1,
// sebastian/global-state
- Snapshot::class => 1,
+ Snapshot::class => 1,
// sebastian/lines-of-code
- Counter::class => 1,
+ Counter::class => 1,
// sebastian/object-enumerator
- Enumerator::class => 1,
+ Enumerator::class => 1,
// sebastian/recursion-context
- Context::class => 1,
+ Context::class => 1,
// sebastian/resource-operations
ResourceOperations::class => 1,
// sebastian/type
- TypeName::class => 1,
+ TypeName::class => 1,
// sebastian/version
- Version::class => 1,
+ Version::class => 1,
// theseer/tokenizer
- Tokenizer::class => 1,
-
- // webmozart/assert
- Assert::class => 1,
+ Tokenizer::class => 1,
];
/**
diff --git a/src/Util/Test.php b/src/Util/Test.php
index 7ed68ff3753..f089f6d43a5 100644
--- a/src/Util/Test.php
+++ b/src/Util/Test.php
@@ -364,7 +364,7 @@ public static function getInlineAnnotations(string $className, string $methodNam
public static function getBackupSettings(string $className, string $methodName): array
{
return [
- 'backupGlobals' => self::getBooleanAnnotationSetting(
+ 'backupGlobals' => self::getBooleanAnnotationSetting(
$className,
$methodName,
'backupGlobals'
diff --git a/src/Util/TestDox/CliTestDoxPrinter.php b/src/Util/TestDox/CliTestDoxPrinter.php
index ada9c75d71e..def16c39827 100644
--- a/src/Util/TestDox/CliTestDoxPrinter.php
+++ b/src/Util/TestDox/CliTestDoxPrinter.php
@@ -68,26 +68,26 @@ class CliTestDoxPrinter extends TestDoxPrinter
];
private const STATUS_STYLES = [
- BaseTestRunner::STATUS_PASSED => [
+ BaseTestRunner::STATUS_PASSED => [
'symbol' => '✔',
'color' => 'fg-green',
],
- BaseTestRunner::STATUS_ERROR => [
+ BaseTestRunner::STATUS_ERROR => [
'symbol' => '✘',
'color' => 'fg-yellow',
'message' => 'bg-yellow,fg-black',
],
- BaseTestRunner::STATUS_FAILURE => [
+ BaseTestRunner::STATUS_FAILURE => [
'symbol' => '✘',
'color' => 'fg-red',
'message' => 'bg-red,fg-white',
],
- BaseTestRunner::STATUS_SKIPPED => [
+ BaseTestRunner::STATUS_SKIPPED => [
'symbol' => '↩',
'color' => 'fg-cyan',
'message' => 'fg-cyan',
],
- BaseTestRunner::STATUS_RISKY => [
+ BaseTestRunner::STATUS_RISKY => [
'symbol' => '☢',
'color' => 'fg-yellow',
'message' => 'fg-yellow',
@@ -97,12 +97,12 @@ class CliTestDoxPrinter extends TestDoxPrinter
'color' => 'fg-yellow',
'message' => 'fg-yellow',
],
- BaseTestRunner::STATUS_WARNING => [
+ BaseTestRunner::STATUS_WARNING => [
'symbol' => '⚠',
'color' => 'fg-yellow',
'message' => 'fg-yellow',
],
- BaseTestRunner::STATUS_UNKNOWN => [
+ BaseTestRunner::STATUS_UNKNOWN => [
'symbol' => '?',
'color' => 'fg-blue',
'message' => 'fg-white,bg-blue',
diff --git a/tests/_files/OneClassPerFile/phpunit.xml b/tests/_files/OneClassPerFile/phpunit.xml
new file mode 100644
index 00000000000..a9ed416d738
--- /dev/null
+++ b/tests/_files/OneClassPerFile/phpunit.xml
@@ -0,0 +1,9 @@
+
+
+
+
+ wrongClassName
+
+
+
diff --git a/tests/end-to-end/generic/abstract-test-class/directory-with-concrete-test-class-and-abstract-test-class-with-test-suffix.phpt b/tests/end-to-end/generic/abstract-test-class/directory-with-concrete-test-class-and-abstract-test-class-with-test-suffix.phpt
index 35bf84383fb..a97d201bc93 100644
--- a/tests/end-to-end/generic/abstract-test-class/directory-with-concrete-test-class-and-abstract-test-class-with-test-suffix.phpt
+++ b/tests/end-to-end/generic/abstract-test-class/directory-with-concrete-test-class-and-abstract-test-class-with-test-suffix.phpt
@@ -11,6 +11,8 @@ PHPUnit\TextUI\Command::main();
--EXPECTF--
PHPUnit %s by Sebastian Bergmann and contributors.
+Warning: Abstract test case classes with "Test" suffix are deprecated (PHPUnit\TestFixture\AbstractTest)
+
. 1 / 1 (100%)
Time: %s, Memory: %s
diff --git a/tests/end-to-end/generic/filename-matches-class-name.phpt b/tests/end-to-end/generic/class-name-does-not-match-filename-invocation-with-path.phpt
similarity index 100%
rename from tests/end-to-end/generic/filename-matches-class-name.phpt
rename to tests/end-to-end/generic/class-name-does-not-match-filename-invocation-with-path.phpt
diff --git a/tests/end-to-end/generic/class-name-does-not-match-filename-invocation-without-path.phpt b/tests/end-to-end/generic/class-name-does-not-match-filename-invocation-without-path.phpt
new file mode 100644
index 00000000000..a69ad82f895
--- /dev/null
+++ b/tests/end-to-end/generic/class-name-does-not-match-filename-invocation-without-path.phpt
@@ -0,0 +1,26 @@
+--TEST--
+phpunit --version
+--FILE--
+
+--XFAIL--
+https://github.com/sebastianbergmann/phpunit/issues/5074
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann and contributors.
+
+Warning: Test case class not matching filename is deprecated
+ in %sWrongClassNameTest.php
+ Class name was 'WrongClassNameBar', expected 'WrongClassNameTest'
+
+. 1 / 1 (100%)
+
+Time: %s, Memory: %s
+
+OK (1 test, 1 assertion)
diff --git a/tests/end-to-end/generic/test-suffix-multiple.phpt b/tests/end-to-end/generic/test-suffix-multiple.phpt
index 5302accc6cd..ba52c3a64d9 100644
--- a/tests/end-to-end/generic/test-suffix-multiple.phpt
+++ b/tests/end-to-end/generic/test-suffix-multiple.phpt
@@ -13,6 +13,7 @@ PHPUnit\TextUI\Command::main();
--EXPECTF--
PHPUnit %s by Sebastian Bergmann and contributors.
+Warning: Abstract test case classes with "Test" suffix are deprecated (PHPUnit\TestFixture\AbstractTest)
Warning: Test case class not matching filename is deprecated
in %sBankAccountTest.test.php
Class name was 'BankAccountWithCustomExtensionTest', expected 'BankAccountTest'
diff --git a/tests/end-to-end/regression/4663.phpt b/tests/end-to-end/regression/4663.phpt
deleted file mode 100644
index c3cf6ae5ce7..00000000000
--- a/tests/end-to-end/regression/4663.phpt
+++ /dev/null
@@ -1,19 +0,0 @@
---TEST--
-https://github.com/sebastianbergmann/phpunit/issues/4663
---FILE--
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-use PHPUnit\Framework\TestCase;
-
-final class Issue4663Test extends TestCase
-{
- public function testTestThatExpectsAnErrorPassesWhenTheErrorOccurs(): void
- {
- $this->expectError();
-
- \implode('', [new stdClass]);
- }
-}
diff --git a/tests/unit/Framework/Constraint/JsonMatchesErrorMessageProviderTest.php b/tests/unit/Framework/Constraint/JsonMatchesErrorMessageProviderTest.php
index 094b6d4e93a..39d3bac89c3 100644
--- a/tests/unit/Framework/Constraint/JsonMatchesErrorMessageProviderTest.php
+++ b/tests/unit/Framework/Constraint/JsonMatchesErrorMessageProviderTest.php
@@ -25,10 +25,10 @@ final class JsonMatchesErrorMessageProviderTest extends TestCase
public static function determineJsonErrorDataprovider(): array
{
return [
- 'JSON_ERROR_NONE' => [
+ 'JSON_ERROR_NONE' => [
null, JSON_ERROR_NONE, '',
],
- 'JSON_ERROR_DEPTH' => [
+ 'JSON_ERROR_DEPTH' => [
'Maximum stack depth exceeded', JSON_ERROR_DEPTH, '',
],
'prefixed JSON_ERROR_DEPTH' => [
@@ -37,18 +37,18 @@ public static function determineJsonErrorDataprovider(): array
'JSON_ERROR_STATE_MISMatch' => [
'Underflow or the modes mismatch', JSON_ERROR_STATE_MISMATCH, '',
],
- 'JSON_ERROR_CTRL_CHAR' => [
+ 'JSON_ERROR_CTRL_CHAR' => [
'Unexpected control character found', JSON_ERROR_CTRL_CHAR, '',
],
- 'JSON_ERROR_SYNTAX' => [
+ 'JSON_ERROR_SYNTAX' => [
'Syntax error, malformed JSON', JSON_ERROR_SYNTAX, '',
],
- 'JSON_ERROR_UTF8`' => [
+ 'JSON_ERROR_UTF8`' => [
'Malformed UTF-8 characters, possibly incorrectly encoded',
JSON_ERROR_UTF8,
'',
],
- 'Invalid error indicator' => [
+ 'Invalid error indicator' => [
'Unknown error', 55, '',
],
];
diff --git a/tests/unit/Framework/TestCaseTest.php b/tests/unit/Framework/TestCaseTest.php
index 9d2169f7813..0baed217be0 100644
--- a/tests/unit/Framework/TestCaseTest.php
+++ b/tests/unit/Framework/TestCaseTest.php
@@ -9,10 +9,6 @@
*/
namespace PHPUnit\Framework;
-use const E_USER_DEPRECATED;
-use const E_USER_ERROR;
-use const E_USER_NOTICE;
-use const E_USER_WARNING;
use const PHP_EOL;
use function array_map;
use function get_class;
@@ -20,7 +16,6 @@
use function ini_get;
use function ini_set;
use function sprintf;
-use function trigger_error;
use DependencyInputTest;
use InvalidArgumentException;
use PHPUnit\Framework\MockObject\MockObject;
@@ -1267,42 +1262,6 @@ public function testHasOutputReturnsTrueWhenTestGeneratesOutput(): void
$this->assertTrue($test->hasOutput());
}
- public function testDeprecationCanBeExpected(): void
- {
- $this->expectDeprecation();
- $this->expectDeprecationMessage('foo');
- $this->expectDeprecationMessageMatches('/foo/');
-
- trigger_error('foo', E_USER_DEPRECATED);
- }
-
- public function testNoticeCanBeExpected(): void
- {
- $this->expectNotice();
- $this->expectNoticeMessage('foo');
- $this->expectNoticeMessageMatches('/foo/');
-
- trigger_error('foo', E_USER_NOTICE);
- }
-
- public function testWarningCanBeExpected(): void
- {
- $this->expectWarning();
- $this->expectWarningMessage('foo');
- $this->expectWarningMessageMatches('/foo/');
-
- trigger_error('foo', E_USER_WARNING);
- }
-
- public function testErrorCanBeExpected(): void
- {
- $this->expectError();
- $this->expectErrorMessage('foo');
- $this->expectErrorMessageMatches('/foo/');
-
- trigger_error('foo', E_USER_ERROR);
- }
-
public function testSetDependencyInput(): void
{
$test = new DependencyInputTest('testDependencyInputAsParameter');
diff --git a/tests/unit/Runner/ResultCacheExtensionTest.php b/tests/unit/Runner/ResultCacheExtensionTest.php
index d9a2c4a1e5c..e321106508a 100644
--- a/tests/unit/Runner/ResultCacheExtensionTest.php
+++ b/tests/unit/Runner/ResultCacheExtensionTest.php
@@ -72,13 +72,13 @@ public function testStripsDataproviderParametersFromTestName(string $testName, s
public function longTestNamesDataprovider(): array
{
return [
- 'ClassName::testMethod' => [
+ 'ClassName::testMethod' => [
'testSomething',
TestCaseTest::class . '::testSomething', ],
'ClassName::testMethod and data set number and vardump' => [
'testMethod with data set #123 (\'a\', "A", 0, false)',
TestCaseTest::class . '::testMethod with data set #123', ],
- 'ClassName::testMethod and data set name and vardump' => [
+ 'ClassName::testMethod and data set name and vardump' => [
'testMethod with data set "data name" (\'a\', "A\", 0, false)',
TestCaseTest::class . '::testMethod with data set "data name"', ],
];
diff --git a/tests/unit/Runner/TestSuiteSorterTest.php b/tests/unit/Runner/TestSuiteSorterTest.php
index 709f403888e..f1c158eb0d1 100644
--- a/tests/unit/Runner/TestSuiteSorterTest.php
+++ b/tests/unit/Runner/TestSuiteSorterTest.php
@@ -162,7 +162,7 @@ public function testOrderDurationWithoutCache(bool $resolveDependencies, array $
public function orderDurationWithoutCacheProvider(): array
{
return [
- 'dependency-ignore' => [
+ 'dependency-ignore' => [
self::IGNORE_DEPENDENCIES,
[
MultiDependencyTest::class . '::testOne',
@@ -215,7 +215,7 @@ public function testOrderDurationWithCache(bool $resolveDependencies, array $tes
public function orderDurationWithCacheProvider(): array
{
return [
- 'duration-same-dependency-ignore' => [
+ 'duration-same-dependency-ignore' => [
self::IGNORE_DEPENDENCIES,
[
'testOne' => 1,
@@ -232,7 +232,7 @@ public function orderDurationWithCacheProvider(): array
MultiDependencyTest::class . '::testFive',
],
],
- 'duration-same-dependency-resolve' => [
+ 'duration-same-dependency-resolve' => [
self::RESOLVE_DEPENDENCIES,
[
'testOne' => 1,
@@ -249,7 +249,7 @@ public function orderDurationWithCacheProvider(): array
MultiDependencyTest::class . '::testFive',
],
],
- 'duration-different-dependency-ignore' => [
+ 'duration-different-dependency-ignore' => [
self::IGNORE_DEPENDENCIES,
[
'testOne' => 5,
@@ -320,7 +320,7 @@ public function testSuiteSorterDefectsOptions(int $order, bool $resolveDependenc
public function commonSorterOptionsProvider(): array
{
return [
- 'default' => [
+ 'default' => [
TestSuiteSorter::ORDER_DEFAULT,
self::IGNORE_DEPENDENCIES,
[
@@ -346,7 +346,7 @@ public function commonSorterOptionsProvider(): array
],
// Reversing without checks should give a simple reverse order
- 'reverse' => [
+ 'reverse' => [
TestSuiteSorter::ORDER_REVERSED,
self::IGNORE_DEPENDENCIES,
[
@@ -387,7 +387,7 @@ public function defectsSorterOptionsProvider(): array
{
return [
// The most simple situation should work as normal
- 'default, no defects' => [
+ 'default, no defects' => [
TestSuiteSorter::ORDER_DEFAULT,
self::IGNORE_DEPENDENCIES,
[
@@ -407,7 +407,7 @@ public function defectsSorterOptionsProvider(): array
],
// Running with an empty cache should not spook the TestSuiteSorter
- 'default, empty result cache' => [
+ 'default, empty result cache' => [
TestSuiteSorter::ORDER_DEFAULT,
self::IGNORE_DEPENDENCIES,
[
@@ -423,7 +423,7 @@ public function defectsSorterOptionsProvider(): array
],
// testFive is independent and can be moved to the front
- 'default, testFive skipped' => [
+ 'default, testFive skipped' => [
TestSuiteSorter::ORDER_DEFAULT,
self::IGNORE_DEPENDENCIES,
[
@@ -443,7 +443,7 @@ public function defectsSorterOptionsProvider(): array
],
// Defects in testFive and testTwo, but the faster testFive should be run first
- 'default, testTwo testFive skipped' => [
+ 'default, testTwo testFive skipped' => [
TestSuiteSorter::ORDER_DEFAULT,
self::IGNORE_DEPENDENCIES,
[
@@ -463,7 +463,7 @@ public function defectsSorterOptionsProvider(): array
],
// Skipping testThree will move it to the front when ignoring dependencies
- 'default, testThree skipped' => [
+ 'default, testThree skipped' => [
TestSuiteSorter::ORDER_DEFAULT,
self::IGNORE_DEPENDENCIES,
[
@@ -483,7 +483,7 @@ public function defectsSorterOptionsProvider(): array
],
// Skipping testThree will move it to the front but behind its dependencies
- 'default resolve, testThree skipped' => [
+ 'default resolve, testThree skipped' => [
TestSuiteSorter::ORDER_DEFAULT,
self::RESOLVE_DEPENDENCIES,
[
@@ -503,7 +503,7 @@ public function defectsSorterOptionsProvider(): array
],
// Skipping testThree will move it to the front and keep the others reversed
- 'reverse, testThree skipped' => [
+ 'reverse, testThree skipped' => [
TestSuiteSorter::ORDER_REVERSED,
self::IGNORE_DEPENDENCIES,
[
@@ -548,7 +548,7 @@ public function defectsSorterOptionsProvider(): array
// - skipped testThree: will move it to the front as far as possible
// - testOne and testTwo are required before testThree, but can be reversed locally
// - testFive is independent will remain reversed up front
- 'reverse resolve, testThree skipped' => [
+ 'reverse resolve, testThree skipped' => [
TestSuiteSorter::ORDER_REVERSED,
self::RESOLVE_DEPENDENCIES,
[
@@ -568,7 +568,7 @@ public function defectsSorterOptionsProvider(): array
// Make sure the dependency resolver is not confused by failing tests.
// Scenario: Four has a @depends on Three and fails. Result: Three is still run first
// testFive also fails but can be moved around freely and will be up front.
- 'depends first, then defects' => [
+ 'depends first, then defects' => [
TestSuiteSorter::ORDER_DEFAULT,
self::RESOLVE_DEPENDENCIES,
[
diff --git a/tests/unit/Util/ColorTest.php b/tests/unit/Util/ColorTest.php
index 1fef1d7e6c4..975dfef576a 100644
--- a/tests/unit/Util/ColorTest.php
+++ b/tests/unit/Util/ColorTest.php
@@ -112,7 +112,7 @@ public function colorizePathProvider(): array
$sepDim = Color::dim($sep);
return [
- 'null previous path' => [
+ 'null previous path' => [
null,
$sep . 'php' . $sep . 'unit' . $sep . 'test.phpt',
false,
@@ -124,19 +124,19 @@ public function colorizePathProvider(): array
false,
$sepDim . 'php' . $sepDim . 'unit' . $sepDim . 'test.phpt',
],
- 'from root' => [
+ 'from root' => [
$sep,
$sep . 'php' . $sep . 'unit' . $sep . 'test.phpt',
false,
$sepDim . 'php' . $sepDim . 'unit' . $sepDim . 'test.phpt',
],
- 'partial part' => [
+ 'partial part' => [
$sep . 'php' . $sep,
$sep . 'php' . $sep . 'unit' . $sep . 'test.phpt',
false,
Color::dim($sep . 'php' . $sep) . 'unit' . $sepDim . 'test.phpt',
],
- 'colorize filename' => [
+ 'colorize filename' => [
'',
$sep . '_d-i.r' . $sep . 't-e_s.t.phpt',
true,
diff --git a/tests/unit/Util/TestClassTest.php b/tests/unit/Util/TestClassTest.php
index 43e6d29e32b..abf830393ea 100644
--- a/tests/unit/Util/TestClassTest.php
+++ b/tests/unit/Util/TestClassTest.php
@@ -113,7 +113,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHPUnit' => 21,
],
- 'PHPUnit' => ['version' => '1.0', 'operator' => ''],
+ 'PHPUnit' => ['version' => '1.0', 'operator' => ''],
],
],
@@ -124,7 +124,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHP' => 28,
],
- 'PHP' => ['version' => '2.0', 'operator' => ''],
+ 'PHP' => ['version' => '2.0', 'operator' => ''],
],
],
@@ -136,8 +136,8 @@ public function requirementsProvider(): array
'PHPUnit' => 35,
'PHP' => 36,
],
- 'PHPUnit' => ['version' => '2.0', 'operator' => ''],
- 'PHP' => ['version' => '1.0', 'operator' => ''],
+ 'PHPUnit' => ['version' => '2.0', 'operator' => ''],
+ 'PHP' => ['version' => '1.0', 'operator' => ''],
],
],
@@ -148,7 +148,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHP' => 43,
],
- 'PHP' => ['version' => '5.4.0RC6', 'operator' => ''],
+ 'PHP' => ['version' => '5.4.0RC6', 'operator' => ''],
],
],
@@ -159,7 +159,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHP' => 50,
],
- 'PHP' => ['version' => '5.4.0-alpha1', 'operator' => ''],
+ 'PHP' => ['version' => '5.4.0-alpha1', 'operator' => ''],
],
],
@@ -170,7 +170,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHP' => 57,
],
- 'PHP' => ['version' => '5.4.0beta2', 'operator' => ''],
+ 'PHP' => ['version' => '5.4.0beta2', 'operator' => ''],
],
],
@@ -181,14 +181,14 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHP' => 64,
],
- 'PHP' => ['version' => '5.4-dev', 'operator' => ''],
+ 'PHP' => ['version' => '5.4-dev', 'operator' => ''],
],
],
[
'testNine',
[
- '__OFFSET' => [
+ '__OFFSET' => [
'__FILE' => $this->getRequirementsTestClassFile(),
'function_testFunc' => 71,
],
@@ -199,7 +199,7 @@ public function requirementsProvider(): array
[
'testTen',
[
- '__OFFSET' => [
+ '__OFFSET' => [
'__FILE' => $this->getRequirementsTestClassFile(),
'extension_testExt' => 87,
],
@@ -223,7 +223,7 @@ public function requirementsProvider(): array
[
'testSpace',
[
- '__OFFSET' => [
+ '__OFFSET' => [
'__FILE' => $this->getRequirementsTestClassFile(),
'extension_spl' => 173,
'OS' => 174,
@@ -236,7 +236,7 @@ public function requirementsProvider(): array
[
'testAllPossibleRequirements',
[
- '__OFFSET' => [
+ '__OFFSET' => [
'__FILE' => $this->getRequirementsTestClassFile(),
'PHP' => 102,
'PHPUnit' => 103,
@@ -248,17 +248,17 @@ public function requirementsProvider(): array
'extension_testExtThree' => 109,
'__SETTING_not_a_setting' => 110,
],
- 'PHP' => ['version' => '99-dev', 'operator' => ''],
- 'PHPUnit' => ['version' => '99-dev', 'operator' => ''],
- 'OS' => 'DOESNOTEXIST',
- 'functions' => [
+ 'PHP' => ['version' => '99-dev', 'operator' => ''],
+ 'PHPUnit' => ['version' => '99-dev', 'operator' => ''],
+ 'OS' => 'DOESNOTEXIST',
+ 'functions' => [
'testFuncOne',
'testFunc2',
],
- 'setting' => [
+ 'setting' => [
'not_a_setting' => 'Off',
],
- 'extensions' => [
+ 'extensions' => [
'testExtOne',
'testExt2',
'testExtThree',
@@ -271,7 +271,7 @@ public function requirementsProvider(): array
['testSpecificExtensionVersion',
[
- '__OFFSET' => [
+ '__OFFSET' => [
'__FILE' => $this->getRequirementsTestClassFile(),
'extension_testExt' => 181,
],
@@ -285,7 +285,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHP' => 190,
],
- 'PHP' => ['version' => '5.4', 'operator' => '<'],
+ 'PHP' => ['version' => '5.4', 'operator' => '<'],
],
],
['testPHPVersionOperatorLessThanEquals',
@@ -294,7 +294,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHP' => 199,
],
- 'PHP' => ['version' => '5.4', 'operator' => '<='],
+ 'PHP' => ['version' => '5.4', 'operator' => '<='],
],
],
['testPHPVersionOperatorGreaterThan',
@@ -303,7 +303,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHP' => 208,
],
- 'PHP' => ['version' => '99', 'operator' => '>'],
+ 'PHP' => ['version' => '99', 'operator' => '>'],
],
],
['testPHPVersionOperatorGreaterThanEquals',
@@ -312,7 +312,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHP' => 217,
],
- 'PHP' => ['version' => '99', 'operator' => '>='],
+ 'PHP' => ['version' => '99', 'operator' => '>='],
],
],
['testPHPVersionOperatorEquals',
@@ -321,7 +321,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHP' => 226,
],
- 'PHP' => ['version' => '5.4', 'operator' => '='],
+ 'PHP' => ['version' => '5.4', 'operator' => '='],
],
],
['testPHPVersionOperatorDoubleEquals',
@@ -330,7 +330,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHP' => 235,
],
- 'PHP' => ['version' => '5.4', 'operator' => '=='],
+ 'PHP' => ['version' => '5.4', 'operator' => '=='],
],
],
['testPHPVersionOperatorBangEquals',
@@ -339,7 +339,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHP' => 244,
],
- 'PHP' => ['version' => '99', 'operator' => '!='],
+ 'PHP' => ['version' => '99', 'operator' => '!='],
],
],
['testPHPVersionOperatorNotEquals',
@@ -348,7 +348,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHP' => 253,
],
- 'PHP' => ['version' => '99', 'operator' => '<>'],
+ 'PHP' => ['version' => '99', 'operator' => '<>'],
],
],
['testPHPVersionOperatorNoSpace',
@@ -357,7 +357,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHP' => 262,
],
- 'PHP' => ['version' => '99', 'operator' => '>='],
+ 'PHP' => ['version' => '99', 'operator' => '>='],
],
],
['testPHPUnitVersionOperatorLessThan',
@@ -366,7 +366,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHPUnit' => 271,
],
- 'PHPUnit' => ['version' => '1.0', 'operator' => '<'],
+ 'PHPUnit' => ['version' => '1.0', 'operator' => '<'],
],
],
['testPHPUnitVersionOperatorLessThanEquals',
@@ -375,7 +375,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHPUnit' => 280,
],
- 'PHPUnit' => ['version' => '1.0', 'operator' => '<='],
+ 'PHPUnit' => ['version' => '1.0', 'operator' => '<='],
],
],
['testPHPUnitVersionOperatorGreaterThan',
@@ -384,7 +384,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHPUnit' => 289,
],
- 'PHPUnit' => ['version' => '99', 'operator' => '>'],
+ 'PHPUnit' => ['version' => '99', 'operator' => '>'],
],
],
['testPHPUnitVersionOperatorGreaterThanEquals',
@@ -393,7 +393,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHPUnit' => 298,
],
- 'PHPUnit' => ['version' => '99', 'operator' => '>='],
+ 'PHPUnit' => ['version' => '99', 'operator' => '>='],
],
],
['testPHPUnitVersionOperatorEquals',
@@ -402,7 +402,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHPUnit' => 307,
],
- 'PHPUnit' => ['version' => '1.0', 'operator' => '='],
+ 'PHPUnit' => ['version' => '1.0', 'operator' => '='],
],
],
['testPHPUnitVersionOperatorDoubleEquals',
@@ -411,7 +411,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHPUnit' => 316,
],
- 'PHPUnit' => ['version' => '1.0', 'operator' => '=='],
+ 'PHPUnit' => ['version' => '1.0', 'operator' => '=='],
],
],
['testPHPUnitVersionOperatorBangEquals',
@@ -420,7 +420,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHPUnit' => 325,
],
- 'PHPUnit' => ['version' => '99', 'operator' => '!='],
+ 'PHPUnit' => ['version' => '99', 'operator' => '!='],
],
],
['testPHPUnitVersionOperatorNotEquals',
@@ -429,7 +429,7 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHPUnit' => 334,
],
- 'PHPUnit' => ['version' => '99', 'operator' => '<>'],
+ 'PHPUnit' => ['version' => '99', 'operator' => '<>'],
],
],
['testPHPUnitVersionOperatorNoSpace',
@@ -438,12 +438,12 @@ public function requirementsProvider(): array
'__FILE' => $this->getRequirementsTestClassFile(),
'PHPUnit' => 343,
],
- 'PHPUnit' => ['version' => '99', 'operator' => '>='],
+ 'PHPUnit' => ['version' => '99', 'operator' => '>='],
],
],
['testExtensionVersionOperatorLessThanEquals',
[
- '__OFFSET' => [
+ '__OFFSET' => [
'__FILE' => $this->getRequirementsTestClassFile(),
'extension_testExtOne' => 357,
],
@@ -453,7 +453,7 @@ public function requirementsProvider(): array
],
['testExtensionVersionOperatorGreaterThan',
[
- '__OFFSET' => [
+ '__OFFSET' => [
'__FILE' => $this->getRequirementsTestClassFile(),
'extension_testExtOne' => 364,
],
@@ -463,7 +463,7 @@ public function requirementsProvider(): array
],
['testExtensionVersionOperatorGreaterThanEquals',
[
- '__OFFSET' => [
+ '__OFFSET' => [
'__FILE' => $this->getRequirementsTestClassFile(),
'extension_testExtOne' => 371,
],
@@ -473,7 +473,7 @@ public function requirementsProvider(): array
],
['testExtensionVersionOperatorEquals',
[
- '__OFFSET' => [
+ '__OFFSET' => [
'__FILE' => $this->getRequirementsTestClassFile(),
'extension_testExtOne' => 378,
],
@@ -483,7 +483,7 @@ public function requirementsProvider(): array
],
['testExtensionVersionOperatorDoubleEquals',
[
- '__OFFSET' => [
+ '__OFFSET' => [
'__FILE' => $this->getRequirementsTestClassFile(),
'extension_testExtOne' => 385,
],
@@ -493,7 +493,7 @@ public function requirementsProvider(): array
],
['testExtensionVersionOperatorBangEquals',
[
- '__OFFSET' => [
+ '__OFFSET' => [
'__FILE' => $this->getRequirementsTestClassFile(),
'extension_testExtOne' => 392,
],
@@ -503,7 +503,7 @@ public function requirementsProvider(): array
],
['testExtensionVersionOperatorNotEquals',
[
- '__OFFSET' => [
+ '__OFFSET' => [
'__FILE' => $this->getRequirementsTestClassFile(),
'extension_testExtOne' => 399,
],
@@ -513,7 +513,7 @@ public function requirementsProvider(): array
],
['testExtensionVersionOperatorNoSpace',
[
- '__OFFSET' => [
+ '__OFFSET' => [
'__FILE' => $this->fileRequirementsTest,
'extension_testExtOne' => 406,
],
@@ -564,7 +564,7 @@ public function requirementsWithVersionConstraintsProvider(): array
[
'testVersionConstraintTildeMajor',
[
- 'PHP' => [
+ 'PHP' => [
'constraint' => '~1.0',
],
'PHPUnit' => [
@@ -575,7 +575,7 @@ public function requirementsWithVersionConstraintsProvider(): array
[
'testVersionConstraintCaretMajor',
[
- 'PHP' => [
+ 'PHP' => [
'constraint' => '^1.0',
],
'PHPUnit' => [
@@ -586,7 +586,7 @@ public function requirementsWithVersionConstraintsProvider(): array
[
'testVersionConstraintTildeMinor',
[
- 'PHP' => [
+ 'PHP' => [
'constraint' => '~3.4.7',
],
'PHPUnit' => [
@@ -597,7 +597,7 @@ public function requirementsWithVersionConstraintsProvider(): array
[
'testVersionConstraintCaretMinor',
[
- 'PHP' => [
+ 'PHP' => [
'constraint' => '^7.0.17',
],
'PHPUnit' => [
@@ -608,7 +608,7 @@ public function requirementsWithVersionConstraintsProvider(): array
[
'testVersionConstraintCaretOr',
[
- 'PHP' => [
+ 'PHP' => [
'constraint' => '^5.6 || ^7.0',
],
'PHPUnit' => [
@@ -619,7 +619,7 @@ public function requirementsWithVersionConstraintsProvider(): array
[
'testVersionConstraintTildeOr',
[
- 'PHP' => [
+ 'PHP' => [
'constraint' => '~5.6.22 || ~7.0.17',
],
'PHPUnit' => [
@@ -630,7 +630,7 @@ public function requirementsWithVersionConstraintsProvider(): array
[
'testVersionConstraintTildeOrCaret',
[
- 'PHP' => [
+ 'PHP' => [
'constraint' => '~5.6.22 || ^7.0',
],
'PHPUnit' => [
@@ -641,7 +641,7 @@ public function requirementsWithVersionConstraintsProvider(): array
[
'testVersionConstraintCaretOrTilde',
[
- 'PHP' => [
+ 'PHP' => [
'constraint' => '^5.6 || ~7.0.17',
],
'PHPUnit' => [
@@ -652,7 +652,7 @@ public function requirementsWithVersionConstraintsProvider(): array
[
'testVersionConstraintRegexpIgnoresWhitespace',
[
- 'PHP' => [
+ 'PHP' => [
'constraint' => '~5.6.22 || ~7.0.17',
],
'PHPUnit' => [
@@ -688,7 +688,7 @@ public function testGetRequirementsMergesClassAndMethodDocBlocks(): void
$file = (new ReflectionClass(RequirementsClassDocBlockTest::class))->getFileName();
$expectedAnnotations = [
- '__OFFSET' => [
+ '__OFFSET' => [
'__FILE' => $file,
'PHP' => 22,
'PHPUnit' => 23,
@@ -698,10 +698,10 @@ public function testGetRequirementsMergesClassAndMethodDocBlocks(): void
'function_testFuncMethod' => 25,
'extension_testExtMethod' => 26,
],
- 'PHP' => ['version' => '5.4', 'operator' => ''],
- 'PHPUnit' => ['version' => '3.7', 'operator' => ''],
- 'OS' => 'WINNT',
- 'functions' => [
+ 'PHP' => ['version' => '5.4', 'operator' => ''],
+ 'PHPUnit' => ['version' => '3.7', 'operator' => ''],
+ 'OS' => 'WINNT',
+ 'functions' => [
'testFuncClass',
'testFuncMethod',
],
diff --git a/tools/phive b/tools/phive
new file mode 100755
index 00000000000..b01fe088b27
--- /dev/null
+++ b/tools/phive
@@ -0,0 +1,1122 @@
+#!/usr/bin/env php
+ '/vendor/phar-io/executor/src/ExecutorException.php',
+ 'phario\\executor\\executor' => '/vendor/phar-io/executor/src/Executor.php',
+ 'phario\\executor\\executorresult' => '/vendor/phar-io/executor/src/ExecutorResult.php',
+ 'phario\\filesystem\\directory' => '/vendor/phar-io/filesystem/src/Directory.php',
+ 'phario\\filesystem\\directoryexception' => '/vendor/phar-io/filesystem/src/DirectoryException.php',
+ 'phario\\filesystem\\exception' => '/vendor/phar-io/filesystem/src/Exception.php',
+ 'phario\\filesystem\\file' => '/vendor/phar-io/filesystem/src/File.php',
+ 'phario\\filesystem\\filename' => '/vendor/phar-io/filesystem/src/Filename.php',
+ 'phario\\filesystem\\filenameexception' => '/vendor/phar-io/filesystem/src/FilenameException.php',
+ 'phario\\filesystem\\lastmodifieddate' => '/vendor/phar-io/filesystem/src/LastModifiedDate.php',
+ 'phario\\gnupg\\errorstrings' => '/vendor/phar-io/gnupg/src/ErrorStrings.php',
+ 'phario\\gnupg\\exception' => '/vendor/phar-io/gnupg/src/Exception.php',
+ 'phario\\gnupg\\factory' => '/vendor/phar-io/gnupg/src/Factory.php',
+ 'phario\\gnupg\\gnupg' => '/vendor/phar-io/gnupg/src/GnuPG.php',
+ 'phario\\manifest\\application' => '/vendor/phar-io/manifest/src/values/Application.php',
+ 'phario\\manifest\\applicationname' => '/vendor/phar-io/manifest/src/values/ApplicationName.php',
+ 'phario\\manifest\\author' => '/vendor/phar-io/manifest/src/values/Author.php',
+ 'phario\\manifest\\authorcollection' => '/vendor/phar-io/manifest/src/values/AuthorCollection.php',
+ 'phario\\manifest\\authorcollectioniterator' => '/vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php',
+ 'phario\\manifest\\authorelement' => '/vendor/phar-io/manifest/src/xml/AuthorElement.php',
+ 'phario\\manifest\\authorelementcollection' => '/vendor/phar-io/manifest/src/xml/AuthorElementCollection.php',
+ 'phario\\manifest\\bundledcomponent' => '/vendor/phar-io/manifest/src/values/BundledComponent.php',
+ 'phario\\manifest\\bundledcomponentcollection' => '/vendor/phar-io/manifest/src/values/BundledComponentCollection.php',
+ 'phario\\manifest\\bundledcomponentcollectioniterator' => '/vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php',
+ 'phario\\manifest\\bundleselement' => '/vendor/phar-io/manifest/src/xml/BundlesElement.php',
+ 'phario\\manifest\\componentelement' => '/vendor/phar-io/manifest/src/xml/ComponentElement.php',
+ 'phario\\manifest\\componentelementcollection' => '/vendor/phar-io/manifest/src/xml/ComponentElementCollection.php',
+ 'phario\\manifest\\containselement' => '/vendor/phar-io/manifest/src/xml/ContainsElement.php',
+ 'phario\\manifest\\copyrightelement' => '/vendor/phar-io/manifest/src/xml/CopyrightElement.php',
+ 'phario\\manifest\\copyrightinformation' => '/vendor/phar-io/manifest/src/values/CopyrightInformation.php',
+ 'phario\\manifest\\elementcollection' => '/vendor/phar-io/manifest/src/xml/ElementCollection.php',
+ 'phario\\manifest\\elementcollectionexception' => '/vendor/phar-io/manifest/src/exceptions/ElementCollectionException.php',
+ 'phario\\manifest\\email' => '/vendor/phar-io/manifest/src/values/Email.php',
+ 'phario\\manifest\\exception' => '/vendor/phar-io/manifest/src/exceptions/Exception.php',
+ 'phario\\manifest\\extelement' => '/vendor/phar-io/manifest/src/xml/ExtElement.php',
+ 'phario\\manifest\\extelementcollection' => '/vendor/phar-io/manifest/src/xml/ExtElementCollection.php',
+ 'phario\\manifest\\extension' => '/vendor/phar-io/manifest/src/values/Extension.php',
+ 'phario\\manifest\\extensionelement' => '/vendor/phar-io/manifest/src/xml/ExtensionElement.php',
+ 'phario\\manifest\\invalidapplicationnameexception' => '/vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php',
+ 'phario\\manifest\\invalidemailexception' => '/vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php',
+ 'phario\\manifest\\invalidurlexception' => '/vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php',
+ 'phario\\manifest\\library' => '/vendor/phar-io/manifest/src/values/Library.php',
+ 'phario\\manifest\\license' => '/vendor/phar-io/manifest/src/values/License.php',
+ 'phario\\manifest\\licenseelement' => '/vendor/phar-io/manifest/src/xml/LicenseElement.php',
+ 'phario\\manifest\\manifest' => '/vendor/phar-io/manifest/src/values/Manifest.php',
+ 'phario\\manifest\\manifestdocument' => '/vendor/phar-io/manifest/src/xml/ManifestDocument.php',
+ 'phario\\manifest\\manifestdocumentexception' => '/vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php',
+ 'phario\\manifest\\manifestdocumentloadingexception' => '/vendor/phar-io/manifest/src/exceptions/ManifestDocumentLoadingException.php',
+ 'phario\\manifest\\manifestdocumentmapper' => '/vendor/phar-io/manifest/src/ManifestDocumentMapper.php',
+ 'phario\\manifest\\manifestdocumentmapperexception' => '/vendor/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php',
+ 'phario\\manifest\\manifestelement' => '/vendor/phar-io/manifest/src/xml/ManifestElement.php',
+ 'phario\\manifest\\manifestelementexception' => '/vendor/phar-io/manifest/src/exceptions/ManifestElementException.php',
+ 'phario\\manifest\\manifestloader' => '/vendor/phar-io/manifest/src/ManifestLoader.php',
+ 'phario\\manifest\\manifestloaderexception' => '/vendor/phar-io/manifest/src/exceptions/ManifestLoaderException.php',
+ 'phario\\manifest\\manifestserializer' => '/vendor/phar-io/manifest/src/ManifestSerializer.php',
+ 'phario\\manifest\\phpelement' => '/vendor/phar-io/manifest/src/xml/PhpElement.php',
+ 'phario\\manifest\\phpextensionrequirement' => '/vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php',
+ 'phario\\manifest\\phpversionrequirement' => '/vendor/phar-io/manifest/src/values/PhpVersionRequirement.php',
+ 'phario\\manifest\\requirement' => '/vendor/phar-io/manifest/src/values/Requirement.php',
+ 'phario\\manifest\\requirementcollection' => '/vendor/phar-io/manifest/src/values/RequirementCollection.php',
+ 'phario\\manifest\\requirementcollectioniterator' => '/vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php',
+ 'phario\\manifest\\requireselement' => '/vendor/phar-io/manifest/src/xml/RequiresElement.php',
+ 'phario\\manifest\\type' => '/vendor/phar-io/manifest/src/values/Type.php',
+ 'phario\\manifest\\url' => '/vendor/phar-io/manifest/src/values/Url.php',
+ 'phario\\phive\\abstractrequestedpharresolver' => '/src/services/resolver/AbstractRequestedPharResolver.php',
+ 'phario\\phive\\abstractresolvingstrategy' => '/src/services/resolver/strategy/AbstractResolvingStrategy.php',
+ 'phario\\phive\\authconfig' => '/src/shared/config/AuthConfig.php',
+ 'phario\\phive\\authentication' => '/src/shared/http/Authentication.php',
+ 'phario\\phive\\authexception' => '/src/shared/exceptions/AuthException.php',
+ 'phario\\phive\\authxmlconfig' => '/src/shared/config/AuthXmlConfig.php',
+ 'phario\\phive\\authxmlconfigfilelocator' => '/src/shared/config/AuthXmlConfigFileLocator.php',
+ 'phario\\phive\\basehash' => '/src/shared/hash/BaseHash.php',
+ 'phario\\phive\\basicauthentication' => '/src/shared/http/authentication/BasicAuthentication.php',
+ 'phario\\phive\\bearerauthentication' => '/src/shared/http/authentication/BearerAuthentication.php',
+ 'phario\\phive\\cachebackend' => '/src/shared/http/CacheBackend.php',
+ 'phario\\phive\\checksumservice' => '/src/services/checksum/ChecksumService.php',
+ 'phario\\phive\\cli\\coloredconsoleoutput' => '/src/shared/cli/output/ColoredConsoleOutput.php',
+ 'phario\\phive\\cli\\command' => '/src/shared/cli/Command.php',
+ 'phario\\phive\\cli\\commandlocator' => '/src/shared/cli/CommandLocator.php',
+ 'phario\\phive\\cli\\commandlocatorexception' => '/src/shared/cli/CommandLocatorException.php',
+ 'phario\\phive\\cli\\commandoptionsexception' => '/src/shared/cli/CommandOptionsException.php',
+ 'phario\\phive\\cli\\consoleinput' => '/src/shared/cli/input/ConsoleInput.php',
+ 'phario\\phive\\cli\\consoleoutput' => '/src/shared/cli/output/ConsoleOutput.php',
+ 'phario\\phive\\cli\\consoletable' => '/src/shared/cli/output/ConsoleTable.php',
+ 'phario\\phive\\cli\\context' => '/src/shared/cli/Context.php',
+ 'phario\\phive\\cli\\contextexception' => '/src/shared/cli/ContextException.php',
+ 'phario\\phive\\cli\\generalcontext' => '/src/shared/cli/GeneralContext.php',
+ 'phario\\phive\\cli\\input' => '/src/shared/cli/input/Input.php',
+ 'phario\\phive\\cli\\options' => '/src/shared/cli/Options.php',
+ 'phario\\phive\\cli\\output' => '/src/shared/cli/output/Output.php',
+ 'phario\\phive\\cli\\outputfactory' => '/src/shared/cli/output/OutputFactory.php',
+ 'phario\\phive\\cli\\outputlocator' => '/src/shared/cli/output/OutputLocator.php',
+ 'phario\\phive\\cli\\request' => '/src/shared/cli/Request.php',
+ 'phario\\phive\\cli\\requestexception' => '/src/shared/cli/RequestException.php',
+ 'phario\\phive\\cli\\runner' => '/src/shared/cli/Runner.php',
+ 'phario\\phive\\cli\\runnerexception' => '/src/shared/cli/RunnerException.php',
+ 'phario\\phive\\commandlocator' => '/src/commands/CommandLocator.php',
+ 'phario\\phive\\compatibilityservice' => '/src/services/phar/CompatibilityService.php',
+ 'phario\\phive\\composeralias' => '/src/shared/ComposerAlias.php',
+ 'phario\\phive\\composercommand' => '/src/commands/composer/ComposerCommand.php',
+ 'phario\\phive\\composercommandconfig' => '/src/commands/composer/ComposerCommandConfig.php',
+ 'phario\\phive\\composercontext' => '/src/commands/composer/ComposerContext.php',
+ 'phario\\phive\\composerservice' => '/src/commands/composer/ComposerService.php',
+ 'phario\\phive\\compositeauthconfig' => '/src/shared/config/CompositeAuthConfig.php',
+ 'phario\\phive\\config' => '/src/shared/config/Config.php',
+ 'phario\\phive\\configexception' => '/src/shared/exceptions/ConfigException.php',
+ 'phario\\phive\\configuredphar' => '/src/shared/phar/ConfiguredPhar.php',
+ 'phario\\phive\\configuredpharexception' => '/src/shared/phar/ConfiguredPharException.php',
+ 'phario\\phive\\curl' => '/src/shared/http/Curl.php',
+ 'phario\\phive\\curlconfig' => '/src/shared/http/CurlConfig.php',
+ 'phario\\phive\\curlconfigbuilder' => '/src/shared/http/CurlConfigBuilder.php',
+ 'phario\\phive\\curlconfigexception' => '/src/shared/exceptions/CurlConfigException.php',
+ 'phario\\phive\\curlexception' => '/src/shared/exceptions/CurlException.php',
+ 'phario\\phive\\curlhttpclient' => '/src/shared/http/CurlHttpClient.php',
+ 'phario\\phive\\defaultcommand' => '/src/commands/default/DefaultCommand.php',
+ 'phario\\phive\\defaultcommandconfig' => '/src/commands/default/DefaultCommandConfig.php',
+ 'phario\\phive\\directurlresolver' => '/src/services/resolver/DirectUrlResolver.php',
+ 'phario\\phive\\downloadfailedexception' => '/src/shared/exceptions/DownloadFailedException.php',
+ 'phario\\phive\\environment' => '/src/shared/environment/Environment.php',
+ 'phario\\phive\\environmentauthconfig' => '/src/shared/config/EnvironmentAuthConfig.php',
+ 'phario\\phive\\environmentexception' => '/src/shared/exceptions/EnvironmentException.php',
+ 'phario\\phive\\environmentlocator' => '/src/shared/environment/EnvironmentLocator.php',
+ 'phario\\phive\\errorexception' => '/src/shared/exceptions/ErrorException.php',
+ 'phario\\phive\\etag' => '/src/shared/http/ETag.php',
+ 'phario\\phive\\exception' => '/src/shared/exceptions/Exception.php',
+ 'phario\\phive\\executor' => '/src/shared/executor/Executor.php',
+ 'phario\\phive\\executorexception' => '/src/shared/exceptions/ExecutorException.php',
+ 'phario\\phive\\executorresult' => '/src/shared/executor/ExecutorResult.php',
+ 'phario\\phive\\factory' => '/src/Factory.php',
+ 'phario\\phive\\featuremissingexception' => '/src/shared/exceptions/FeatureMissingException.php',
+ 'phario\\phive\\filedownloader' => '/src/shared/download/FileDownloader.php',
+ 'phario\\phive\\filedownloaderexception' => '/src/shared/FileDownloaderException.php',
+ 'phario\\phive\\filemigration' => '/src/services/migration/FileMigration.php',
+ 'phario\\phive\\filenotwritableexception' => '/src/shared/exceptions/FileNotWritableException.php',
+ 'phario\\phive\\filestoragecachebackend' => '/src/shared/http/FileStorageCacheBackend.php',
+ 'phario\\phive\\git' => '/src/shared/Git.php',
+ 'phario\\phive\\gitawarephiveversion' => '/src/shared/version/GitAwarePhiveVersion.php',
+ 'phario\\phive\\gitexception' => '/src/shared/exceptions/GitException.php',
+ 'phario\\phive\\githubaliasresolver' => '/src/services/resolver/GithubAliasResolver.php',
+ 'phario\\phive\\githubaliasresolverexception' => '/src/GithubAliasResolverException.php',
+ 'phario\\phive\\githubrepository' => '/src/shared/repository/GithubRepository.php',
+ 'phario\\phive\\gitlabaliasresolver' => '/src/services/resolver/GitlabAliasResolver.php',
+ 'phario\\phive\\gitlabrepository' => '/src/shared/repository/GitlabRepository.php',
+ 'phario\\phive\\globalphivexmlconfig' => '/src/shared/config/GlobalPhiveXmlConfig.php',
+ 'phario\\phive\\gnupg' => '/src/shared/GnuPG.php',
+ 'phario\\phive\\gnupgkeydownloader' => '/src/services/key/gpg/GnupgKeyDownloader.php',
+ 'phario\\phive\\gnupgkeydownloaderexception' => '/src/shared/exceptions/GnupgKeyDownloaderException.php',
+ 'phario\\phive\\gnupgkeyimporter' => '/src/services/key/gpg/GnupgKeyImporter.php',
+ 'phario\\phive\\gnupgsignatureverifier' => '/src/services/signature/gpg/GnupgSignatureVerifier.php',
+ 'phario\\phive\\gnupgverificationresult' => '/src/services/signature/gpg/GnupgVerificationResult.php',
+ 'phario\\phive\\hash' => '/src/shared/hash/Hash.php',
+ 'phario\\phive\\helpcommand' => '/src/commands/help/HelpCommand.php',
+ 'phario\\phive\\homepharsxmlmigration' => '/src/services/migration/HomePharsXmlMigration.php',
+ 'phario\\phive\\homephivexmlmigration' => '/src/services/migration/HomePhiveXmlMigration.php',
+ 'phario\\phive\\httpclient' => '/src/shared/http/HttpClient.php',
+ 'phario\\phive\\httpexception' => '/src/shared/http/HttpException.php',
+ 'phario\\phive\\httpprogresshandler' => '/src/shared/http/HttpProgressHandler.php',
+ 'phario\\phive\\httpprogressrenderer' => '/src/shared/http/HttpProgressRenderer.php',
+ 'phario\\phive\\httpprogressupdate' => '/src/shared/http/HttpProgressUpdate.php',
+ 'phario\\phive\\httpresponse' => '/src/shared/http/HttpResponse.php',
+ 'phario\\phive\\httpresponseexception' => '/src/shared/http/HttpResponseException.php',
+ 'phario\\phive\\installationfailedexception' => '/src/shared/exceptions/InstallationFailedException.php',
+ 'phario\\phive\\installcommand' => '/src/commands/install/InstallCommand.php',
+ 'phario\\phive\\installcommandconfig' => '/src/commands/install/InstallCommandConfig.php',
+ 'phario\\phive\\installcommandconfigexception' => '/src/commands/install/InstallCommandConfigException.php',
+ 'phario\\phive\\installcontext' => '/src/commands/install/InstallContext.php',
+ 'phario\\phive\\installedphar' => '/src/shared/phar/InstalledPhar.php',
+ 'phario\\phive\\installservice' => '/src/services/phar/InstallService.php',
+ 'phario\\phive\\internalfilemigration' => '/src/services/migration/InternalFileMigration.php',
+ 'phario\\phive\\invalidhashexception' => '/src/shared/exceptions/InvalidHashException.php',
+ 'phario\\phive\\invalidxmlexception' => '/src/shared/exceptions/InvalidXmlException.php',
+ 'phario\\phive\\ioexception' => '/src/shared/exceptions/IOException.php',
+ 'phario\\phive\\jsondata' => '/src/shared/JsonData.php',
+ 'phario\\phive\\keydownloader' => '/src/services/key/KeyDownloader.php',
+ 'phario\\phive\\keyimporter' => '/src/services/key/KeyImporter.php',
+ 'phario\\phive\\keyimportresult' => '/src/services/key/KeyImportResult.php',
+ 'phario\\phive\\keyservice' => '/src/services/key/KeyService.php',
+ 'phario\\phive\\linkcreationfailedexception' => '/src/shared/exceptions/LinkCreationFailedException.php',
+ 'phario\\phive\\listcommand' => '/src/commands/list/ListCommand.php',
+ 'phario\\phive\\localaliasresolver' => '/src/services/resolver/LocalAliasResolver.php',
+ 'phario\\phive\\localfirstresolvingstrategy' => '/src/services/resolver/strategy/LocalFirstResolvingStrategy.php',
+ 'phario\\phive\\localphivexmlconfig' => '/src/shared/config/LocalPhiveXmlConfig.php',
+ 'phario\\phive\\localrepository' => '/src/shared/repository/LocalRepository.php',
+ 'phario\\phive\\localsourceslistfileloader' => '/src/shared/sources/LocalSourcesListFileLoader.php',
+ 'phario\\phive\\localsslcertificate' => '/src/shared/http/LocalSslCertificate.php',
+ 'phario\\phive\\migratecommand' => '/src/commands/migrate/MigrateCommand.php',
+ 'phario\\phive\\migratecommandconfig' => '/src/commands/migrate/MigrateCommandConfig.php',
+ 'phario\\phive\\migratecontext' => '/src/commands/migrate/MigrateContext.php',
+ 'phario\\phive\\migration' => '/src/services/migration/Migration.php',
+ 'phario\\phive\\migrationexception' => '/src/shared/exceptions/MigrationException.php',
+ 'phario\\phive\\migrationfactory' => '/src/services/migration/MigrationFactory.php',
+ 'phario\\phive\\migrationservice' => '/src/services/migration/MigrationService.php',
+ 'phario\\phive\\migrationsfailedexception' => '/src/shared/exceptions/MigrationsFailedException.php',
+ 'phario\\phive\\nogpgbinaryfoundexception' => '/src/shared/exceptions/NoGPGBinaryFoundException.php',
+ 'phario\\phive\\notfoundexception' => '/src/shared/exceptions/NotFoundException.php',
+ 'phario\\phive\\outdatedcommand' => '/src/commands/outdated/OutdatedCommand.php',
+ 'phario\\phive\\outdatedconfig' => '/src/commands/outdated/OutdatedConfig.php',
+ 'phario\\phive\\outdatedconfigexception' => '/src/commands/outdated/OutdatedConfigException.php',
+ 'phario\\phive\\outdatedcontext' => '/src/commands/outdated/OutdatedContext.php',
+ 'phario\\phive\\phar' => '/src/shared/phar/Phar.php',
+ 'phario\\phive\\pharalias' => '/src/shared/phar/PharAlias.php',
+ 'phario\\phive\\phardownloader' => '/src/services/phar/PharDownloader.php',
+ 'phario\\phive\\pharexception' => '/src/shared/exceptions/PharException.php',
+ 'phario\\phive\\pharidentifier' => '/src/shared/phar/PharIdentifier.php',
+ 'phario\\phive\\pharinstaller' => '/src/services/phar/PharInstaller.php',
+ 'phario\\phive\\pharinstallerexception' => '/src/shared/exceptions/PharInstallerException.php',
+ 'phario\\phive\\pharinstallerfactory' => '/src/services/phar/PharInstallerFactory.php',
+ 'phario\\phive\\pharinstallerlocator' => '/src/services/phar/PharInstallerLocator.php',
+ 'phario\\phive\\pharioaliasresolver' => '/src/services/resolver/PharIoAliasResolver.php',
+ 'phario\\phive\\phariorepository' => '/src/shared/repository/PharIoRepository.php',
+ 'phario\\phive\\pharregistry' => '/src/shared/PharRegistry.php',
+ 'phario\\phive\\pharregistryexception' => '/src/shared/exceptions/PharRegistryException.php',
+ 'phario\\phive\\pharservice' => '/src/services/phar/PharService.php',
+ 'phario\\phive\\pharurl' => '/src/shared/phar/PharUrl.php',
+ 'phario\\phive\\phivecontext' => '/src/PhiveContext.php',
+ 'phario\\phive\\phiveversion' => '/src/shared/version/PhiveVersion.php',
+ 'phario\\phive\\phivexmlconfig' => '/src/shared/config/PhiveXmlConfig.php',
+ 'phario\\phive\\phivexmlconfigfilelocator' => '/src/shared/config/PhiveXmlConfigFileLocator.php',
+ 'phario\\phive\\projectphivexmlmigration' => '/src/services/migration/ProjectPhiveXmlMigration.php',
+ 'phario\\phive\\publickey' => '/src/services/key/PublicKey.php',
+ 'phario\\phive\\publickeyexception' => '/src/shared/exceptions/PublicKeyException.php',
+ 'phario\\phive\\publickeyreader' => '/src/services/key/gpg/PublicKeyReader.php',
+ 'phario\\phive\\purgecommand' => '/src/commands/purge/PurgeCommand.php',
+ 'phario\\phive\\purgecontext' => '/src/commands/purge/PurgeContext.php',
+ 'phario\\phive\\ratelimit' => '/src/shared/http/RateLimit.php',
+ 'phario\\phive\\release' => '/src/shared/phar/Release.php',
+ 'phario\\phive\\releasecollection' => '/src/shared/phar/ReleaseCollection.php',
+ 'phario\\phive\\releaseexception' => '/src/shared/exceptions/ReleaseException.php',
+ 'phario\\phive\\releaseselector' => '/src/services/phar/ReleaseSelector.php',
+ 'phario\\phive\\remotefirstresolvingstrategy' => '/src/services/resolver/strategy/RemoteFirstResolvingStrategy.php',
+ 'phario\\phive\\remotesourceslistfileloader' => '/src/shared/sources/RemoteSourcesListFileLoader.php',
+ 'phario\\phive\\removalservice' => '/src/services/phar/RemovalService.php',
+ 'phario\\phive\\removecommand' => '/src/commands/remove/RemoveCommand.php',
+ 'phario\\phive\\removecommandconfig' => '/src/commands/remove/RemoveCommandConfig.php',
+ 'phario\\phive\\removecontext' => '/src/commands/remove/RemoveContext.php',
+ 'phario\\phive\\requestedphar' => '/src/shared/phar/RequestedPhar.php',
+ 'phario\\phive\\requestedpharresolver' => '/src/services/resolver/RequestedPharResolver.php',
+ 'phario\\phive\\requestedpharresolverfactory' => '/src/services/resolver/RequestedPharResolverFactory.php',
+ 'phario\\phive\\requestedpharresolverservice' => '/src/services/resolver/RequestedPharResolverService.php',
+ 'phario\\phive\\requestedpharresolverservicebuilder' => '/src/services/resolver/RequestedPharResolverServiceBuilder.php',
+ 'phario\\phive\\resetcommand' => '/src/commands/reset/ResetCommand.php',
+ 'phario\\phive\\resetcommandconfig' => '/src/commands/reset/ResetCommandConfig.php',
+ 'phario\\phive\\resetcontext' => '/src/commands/reset/ResetContext.php',
+ 'phario\\phive\\resolveexception' => '/src/shared/exceptions/ResolveException.php',
+ 'phario\\phive\\resolvingstrategy' => '/src/services/resolver/strategy/ResolvingStrategy.php',
+ 'phario\\phive\\retryinghttpclient' => '/src/shared/http/RetryingHttpClient.php',
+ 'phario\\phive\\ringdowncurlhttpclient' => '/src/shared/http/RingdownCurlHttpClient.php',
+ 'phario\\phive\\selfupdatecommand' => '/src/commands/selfupdate/SelfupdateCommand.php',
+ 'phario\\phive\\sha1hash' => '/src/shared/hash/sha/Sha1Hash.php',
+ 'phario\\phive\\sha256hash' => '/src/shared/hash/sha/Sha256Hash.php',
+ 'phario\\phive\\sha384hash' => '/src/shared/hash/sha/Sha384Hash.php',
+ 'phario\\phive\\sha512hash' => '/src/shared/hash/sha/Sha512Hash.php',
+ 'phario\\phive\\signatureverifier' => '/src/services/signature/SignatureVerifier.php',
+ 'phario\\phive\\skelcommand' => '/src/commands/skel/SkelCommand.php',
+ 'phario\\phive\\skelcommandconfig' => '/src/commands/skel/SkelCommandConfig.php',
+ 'phario\\phive\\skelcontext' => '/src/commands/skel/SkelContext.php',
+ 'phario\\phive\\source' => '/src/shared/sources/Source.php',
+ 'phario\\phive\\sourcerepository' => '/src/shared/repository/SourceRepository.php',
+ 'phario\\phive\\sourceslist' => '/src/shared/sources/SourcesList.php',
+ 'phario\\phive\\sourceslistexception' => '/src/shared/exceptions/SourcesListException.php',
+ 'phario\\phive\\sourceslistfileloader' => '/src/shared/sources/SourcesListFileLoader.php',
+ 'phario\\phive\\staticphiveversion' => '/src/shared/version/StaticPhiveVersion.php',
+ 'phario\\phive\\statuscommand' => '/src/commands/status/StatusCommand.php',
+ 'phario\\phive\\statuscommandconfig' => '/src/commands/status/StatusCommandConfig.php',
+ 'phario\\phive\\statuscontext' => '/src/commands/status/StatusContext.php',
+ 'phario\\phive\\supportedrelease' => '/src/shared/phar/SupportedRelease.php',
+ 'phario\\phive\\targetdirectorylocator' => '/src/shared/TargetDirectoryLocator.php',
+ 'phario\\phive\\tokenauthentication' => '/src/shared/http/authentication/TokenAuthentication.php',
+ 'phario\\phive\\trustedcollection' => '/src/services/key/TrustedCollection.php',
+ 'phario\\phive\\unixoidenvironment' => '/src/shared/environment/UnixoidEnvironment.php',
+ 'phario\\phive\\unixoidpharinstaller' => '/src/services/phar/UnixoidPharInstaller.php',
+ 'phario\\phive\\unsupportedrelease' => '/src/shared/phar/UnsupportedRelease.php',
+ 'phario\\phive\\unsupportedversionconstraintexception' => '/src/shared/exceptions/UnsupportedVersionConstraintException.php',
+ 'phario\\phive\\updatecommand' => '/src/commands/update/UpdateCommand.php',
+ 'phario\\phive\\updatecommandconfig' => '/src/commands/update/UpdateCommandConfig.php',
+ 'phario\\phive\\updatecontext' => '/src/commands/update/UpdateContext.php',
+ 'phario\\phive\\updaterepositorylistcommand' => '/src/commands/update-repository-list/UpdateRepositoryListCommand.php',
+ 'phario\\phive\\url' => '/src/shared/Url.php',
+ 'phario\\phive\\urlrepository' => '/src/shared/repository/UrlRepository.php',
+ 'phario\\phive\\usedphar' => '/src/shared/phar/UsedPhar.php',
+ 'phario\\phive\\userfilemigration' => '/src/services/migration/UserFileMigration.php',
+ 'phario\\phive\\verificationfailedexception' => '/src/shared/exceptions/VerificationFailedException.php',
+ 'phario\\phive\\verificationresult' => '/src/services/signature/VerificationResult.php',
+ 'phario\\phive\\versioncommand' => '/src/commands/version/VersionCommand.php',
+ 'phario\\phive\\windowsenvironment' => '/src/shared/environment/WindowsEnvironment.php',
+ 'phario\\phive\\windowspharinstaller' => '/src/services/phar/WindowsPharInstaller.php',
+ 'phario\\phive\\xmlfile' => '/src/shared/XmlFile.php',
+ 'phario\\version\\abstractversionconstraint' => '/vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php',
+ 'phario\\version\\andversionconstraintgroup' => '/vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php',
+ 'phario\\version\\anyversionconstraint' => '/vendor/phar-io/version/src/constraints/AnyVersionConstraint.php',
+ 'phario\\version\\buildmetadata' => '/vendor/phar-io/version/src/BuildMetaData.php',
+ 'phario\\version\\exactversionconstraint' => '/vendor/phar-io/version/src/constraints/ExactVersionConstraint.php',
+ 'phario\\version\\exception' => '/vendor/phar-io/version/src/exceptions/Exception.php',
+ 'phario\\version\\greaterthanorequaltoversionconstraint' => '/vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php',
+ 'phario\\version\\invalidprereleasesuffixexception' => '/vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php',
+ 'phario\\version\\invalidversionexception' => '/vendor/phar-io/version/src/exceptions/InvalidVersionException.php',
+ 'phario\\version\\nobuildmetadataexception' => '/vendor/phar-io/version/src/exceptions/NoBuildMetaDataException.php',
+ 'phario\\version\\noprereleasesuffixexception' => '/vendor/phar-io/version/src/exceptions/NoPreReleaseSuffixException.php',
+ 'phario\\version\\orversionconstraintgroup' => '/vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php',
+ 'phario\\version\\prereleasesuffix' => '/vendor/phar-io/version/src/PreReleaseSuffix.php',
+ 'phario\\version\\specificmajorandminorversionconstraint' => '/vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php',
+ 'phario\\version\\specificmajorversionconstraint' => '/vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php',
+ 'phario\\version\\unsupportedversionconstraintexception' => '/vendor/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php',
+ 'phario\\version\\version' => '/vendor/phar-io/version/src/Version.php',
+ 'phario\\version\\versionconstraint' => '/vendor/phar-io/version/src/constraints/VersionConstraint.php',
+ 'phario\\version\\versionconstraintparser' => '/vendor/phar-io/version/src/VersionConstraintParser.php',
+ 'phario\\version\\versionconstraintvalue' => '/vendor/phar-io/version/src/VersionConstraintValue.php',
+ 'phario\\version\\versionnumber' => '/vendor/phar-io/version/src/VersionNumber.php'
+ );
+ }
+
+ $class = strtolower($class);
+
+ if (isset($classes[$class])) {
+ require 'phar://phive.phar/' . $classes[$class];
+ }
+ }
+);
+
+Phar::mapPhar('phive.phar');
+
+$rc = (new Factory(new Cli\Request($_SERVER['argv']), new StaticPhiveVersion('0.15.2')))->getRunner()->run();
+exit($rc);
+
+__HALT_COMPILER(); ?>
+X <
+ phive.phar , vendor/phar-io/version/src/BuildMetaData.php b H / vendor/phar-io/version/src/PreReleaseSuffix.php^ bw .o &