upgrade to laravel 8.x
This commit is contained in:
+48
@@ -0,0 +1,48 @@
|
||||
# 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.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.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
|
||||
Vendored
+5
-5
@@ -3,18 +3,18 @@
|
||||
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://php.net/)
|
||||
[](https://phpunit.de/build-status.html)
|
||||
[](https://shepherd.dev/github/sebastianbergmann/phpunit)
|
||||
|
||||
## Installation
|
||||
|
||||
We distribute a [PHP Archive (PHAR)](https://php.net/phar) that has all required (as well as some optional) dependencies of PHPUnit 8.5 bundled in a single file:
|
||||
We distribute a [PHP Archive (PHAR)](https://php.net/phar) that has all required (as well as some optional) dependencies of PHPUnit 9.5 bundled in a single file:
|
||||
|
||||
```bash
|
||||
$ wget https://phar.phpunit.de/phpunit-8.5.phar
|
||||
$ wget https://phar.phpunit.de/phpunit-9.5.phar
|
||||
|
||||
$ php phpunit-8.5.phar --version
|
||||
$ php phpunit-9.5.phar --version
|
||||
```
|
||||
|
||||
Alternatively, you may use [Composer](https://getcomposer.org/) to download and install PHPUnit as well as its dependencies. Please refer to the "[Getting Started](https://phpunit.de/getting-started-with-phpunit.html)" guide for details on how to install PHPUnit.
|
||||
|
||||
Vendored
+26
-21
@@ -21,7 +21,7 @@
|
||||
},
|
||||
"prefer-stable": true,
|
||||
"require": {
|
||||
"php": ">=7.2",
|
||||
"php": ">=7.3",
|
||||
"ext-dom": "*",
|
||||
"ext-json": "*",
|
||||
"ext-libxml": "*",
|
||||
@@ -29,36 +29,39 @@
|
||||
"ext-xml": "*",
|
||||
"ext-xmlwriter": "*",
|
||||
"doctrine/instantiator": "^1.3.1",
|
||||
"myclabs/deep-copy": "^1.10.0",
|
||||
"myclabs/deep-copy": "^1.10.1",
|
||||
"phar-io/manifest": "^2.0.1",
|
||||
"phar-io/version": "^3.0.2",
|
||||
"phpspec/prophecy": "^1.10.3",
|
||||
"phpunit/php-code-coverage": "^7.0.12",
|
||||
"phpunit/php-file-iterator": "^2.0.2",
|
||||
"phpunit/php-text-template": "^1.2.1",
|
||||
"phpunit/php-timer": "^2.1.2",
|
||||
"sebastian/comparator": "^3.0.2",
|
||||
"sebastian/diff": "^3.0.2",
|
||||
"sebastian/environment": "^4.2.3",
|
||||
"sebastian/exporter": "^3.1.2",
|
||||
"sebastian/global-state": "^3.0.0",
|
||||
"sebastian/object-enumerator": "^3.0.3",
|
||||
"sebastian/resource-operations": "^2.0.1",
|
||||
"sebastian/type": "^1.1.3",
|
||||
"sebastian/version": "^2.0.1"
|
||||
"phpspec/prophecy": "^1.12.1",
|
||||
"phpunit/php-code-coverage": "^9.2.3",
|
||||
"phpunit/php-file-iterator": "^3.0.5",
|
||||
"phpunit/php-invoker": "^3.1.1",
|
||||
"phpunit/php-text-template": "^2.0.3",
|
||||
"phpunit/php-timer": "^5.0.2",
|
||||
"sebastian/cli-parser": "^1.0.1",
|
||||
"sebastian/code-unit": "^1.0.6",
|
||||
"sebastian/comparator": "^4.0.5",
|
||||
"sebastian/diff": "^4.0.3",
|
||||
"sebastian/environment": "^5.1.3",
|
||||
"sebastian/exporter": "^4.0.3",
|
||||
"sebastian/global-state": "^5.0.1",
|
||||
"sebastian/object-enumerator": "^4.0.3",
|
||||
"sebastian/resource-operations": "^3.0.3",
|
||||
"sebastian/type": "^2.3",
|
||||
"sebastian/version": "^3.0.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-PDO": "*"
|
||||
"ext-PDO": "*",
|
||||
"phpspec/prophecy-phpunit": "^2.0.1"
|
||||
},
|
||||
"config": {
|
||||
"platform": {
|
||||
"php": "7.2.0"
|
||||
"php": "7.3.0"
|
||||
},
|
||||
"optimize-autoloader": true,
|
||||
"sort-packages": true
|
||||
},
|
||||
"suggest": {
|
||||
"phpunit/php-invoker": "^2.0.0",
|
||||
"ext-soap": "*",
|
||||
"ext-xdebug": "*"
|
||||
},
|
||||
@@ -68,6 +71,9 @@
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
],
|
||||
"files": [
|
||||
"src/Framework/Assert/Functions.php"
|
||||
]
|
||||
},
|
||||
"autoload-dev": {
|
||||
@@ -75,7 +81,6 @@
|
||||
"tests/"
|
||||
],
|
||||
"files": [
|
||||
"src/Framework/Assert/Functions.php",
|
||||
"tests/_files/CoverageNamespacedFunctionTest.php",
|
||||
"tests/_files/CoveredFunction.php",
|
||||
"tests/_files/NamespaceCoveredFunction.php"
|
||||
@@ -83,7 +88,7 @@
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "8.5-dev"
|
||||
"dev-master": "9.5-dev"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Vendored
+2
-2
@@ -9,11 +9,11 @@
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
if (version_compare('7.2.0', PHP_VERSION, '>')) {
|
||||
if (version_compare('7.3.0', PHP_VERSION, '>')) {
|
||||
fwrite(
|
||||
STDERR,
|
||||
sprintf(
|
||||
'This version of PHPUnit requires PHP >= 7.2.' . PHP_EOL .
|
||||
'This version of PHPUnit requires PHP >= 7.3.' . PHP_EOL .
|
||||
'You are using PHP %s (%s).' . PHP_EOL,
|
||||
PHP_VERSION,
|
||||
PHP_BINARY
|
||||
|
||||
Vendored
+74
-63
@@ -2,7 +2,7 @@
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
||||
<xs:annotation>
|
||||
<xs:documentation source="https://phpunit.de/documentation.html">
|
||||
This Schema file defines the rules by which the XML configuration file of PHPUnit 8.5 may be structured.
|
||||
This Schema file defines the rules by which the XML configuration file of PHPUnit 9.5 may be structured.
|
||||
</xs:documentation>
|
||||
<xs:appinfo source="https://phpunit.de/documentation.html"/>
|
||||
</xs:annotation>
|
||||
@@ -11,30 +11,33 @@
|
||||
<xs:documentation>Root Element</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:complexType name="filtersType">
|
||||
<xs:sequence>
|
||||
<xs:element name="whitelist" type="whiteListType" minOccurs="0"/>
|
||||
</xs:sequence>
|
||||
<xs:complexType name="coverageType">
|
||||
<xs:all>
|
||||
<xs:element name="include" minOccurs="0" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:group ref="pathGroup"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="exclude" minOccurs="0" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:group ref="pathGroup"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="report" minOccurs="0" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:group ref="coverageReportGroup"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
<xs:attribute name="cacheDirectory" type="xs:anyURI"/>
|
||||
<xs:attribute name="pathCoverage" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="includeUncoveredFiles" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="processUncoveredFiles" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="ignoreDeprecatedCodeUnits" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="disableCodeCoverageIgnore" type="xs:boolean" default="false"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="filterType">
|
||||
<xs:sequence>
|
||||
<xs:choice maxOccurs="unbounded" minOccurs="0">
|
||||
<xs:group ref="pathGroup"/>
|
||||
<xs:element name="exclude">
|
||||
<xs:complexType>
|
||||
<xs:group ref="pathGroup"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="whiteListType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="filterType">
|
||||
<xs:attribute name="addUncoveredFilesFromWhitelist" default="true" type="xs:boolean"/>
|
||||
<xs:attribute name="processUncoveredFilesFromWhitelist" default="false" type="xs:boolean"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
<xs:complexType name="loggingType">
|
||||
<xs:group ref="loggingGroup"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="groupsType">
|
||||
<xs:choice>
|
||||
@@ -122,39 +125,6 @@
|
||||
</xs:simpleType>
|
||||
</xs:union>
|
||||
</xs:simpleType>
|
||||
<xs:complexType name="loggersType">
|
||||
<xs:sequence>
|
||||
<xs:element name="log" type="loggerType" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="loggerType">
|
||||
<xs:attribute name="type">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="coverage-html"/>
|
||||
<xs:enumeration value="coverage-text"/>
|
||||
<xs:enumeration value="coverage-clover"/>
|
||||
<xs:enumeration value="coverage-crap4j"/>
|
||||
<xs:enumeration value="coverage-xml"/>
|
||||
<xs:enumeration value="coverage-php"/>
|
||||
<xs:enumeration value="json"/>
|
||||
<xs:enumeration value="plain"/>
|
||||
<xs:enumeration value="tap"/>
|
||||
<xs:enumeration value="teamcity"/>
|
||||
<xs:enumeration value="junit"/>
|
||||
<xs:enumeration value="testdox-html"/>
|
||||
<xs:enumeration value="testdox-text"/>
|
||||
<xs:enumeration value="testdox-xml"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:attribute>
|
||||
<xs:attribute name="target" type="xs:anyURI"/>
|
||||
<xs:attribute name="lowUpperBound" type="xs:nonNegativeInteger" default="50"/>
|
||||
<xs:attribute name="highLowerBound" type="xs:nonNegativeInteger" default="90"/>
|
||||
<xs:attribute name="showUncoveredFiles" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="showOnlySummary" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="threshold" type="xs:nonNegativeInteger" default="30"/>
|
||||
</xs:complexType>
|
||||
<xs:group name="pathGroup">
|
||||
<xs:sequence>
|
||||
<xs:choice minOccurs="0" maxOccurs="unbounded">
|
||||
@@ -241,16 +211,14 @@
|
||||
<xs:attribute name="bootstrap" type="xs:anyURI"/>
|
||||
<xs:attribute name="cacheResult" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="cacheResultFile" type="xs:anyURI"/>
|
||||
<xs:attribute name="cacheTokens" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="colors" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="columns" type="columnsType" default="80"/>
|
||||
<xs:attribute name="convertDeprecationsToExceptions" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="convertErrorsToExceptions" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="convertNoticesToExceptions" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="convertWarningsToExceptions" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="disableCodeCoverageIgnore" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="forceCoversAnnotation" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="printerClass" type="xs:string" default="PHPUnit\TextUI\ResultPrinter"/>
|
||||
<xs:attribute name="printerClass" type="xs:string" default="PHPUnit\TextUI\DefaultResultPrinter"/>
|
||||
<xs:attribute name="printerFile" type="xs:anyURI"/>
|
||||
<xs:attribute name="processIsolation" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stopOnDefect" type="xs:boolean" default="false"/>
|
||||
@@ -260,7 +228,10 @@
|
||||
<xs:attribute name="stopOnIncomplete" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stopOnRisky" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stopOnSkipped" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="failOnEmptyTestSuite" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="failOnIncomplete" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="failOnRisky" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="failOnSkipped" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="failOnWarning" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="beStrictAboutChangesToGlobalState" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="beStrictAboutOutputDuringTests" type="xs:boolean" default="false"/>
|
||||
@@ -270,7 +241,6 @@
|
||||
<xs:attribute name="beStrictAboutCoversAnnotation" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="defaultTimeLimit" type="xs:integer" default="0"/>
|
||||
<xs:attribute name="enforceTimeLimit" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="ignoreDeprecatedCodeUnitsFromCodeCoverage" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="timeoutForSmallTests" type="xs:integer" default="1"/>
|
||||
<xs:attribute name="timeoutForMediumTests" type="xs:integer" default="10"/>
|
||||
<xs:attribute name="timeoutForLargeTests" type="xs:integer" default="60"/>
|
||||
@@ -292,8 +262,8 @@
|
||||
<xs:element ref="testSuiteFacet" minOccurs="0"/>
|
||||
<xs:element name="groups" type="groupsType" minOccurs="0"/>
|
||||
<xs:element name="testdoxGroups" type="groupsType" minOccurs="0"/>
|
||||
<xs:element name="filter" type="filtersType" minOccurs="0"/>
|
||||
<xs:element name="logging" type="loggersType" minOccurs="0"/>
|
||||
<xs:element name="coverage" type="coverageType" minOccurs="0"/>
|
||||
<xs:element name="logging" type="loggingType" minOccurs="0"/>
|
||||
<xs:element name="extensions" type="extensionsType" minOccurs="0"/>
|
||||
<xs:element name="listeners" type="listenersType" minOccurs="0"/>
|
||||
<xs:element name="php" type="phpType" minOccurs="0"/>
|
||||
@@ -314,4 +284,45 @@
|
||||
</xs:sequence>
|
||||
<xs:attribute name="name" type="xs:string" use="required"/>
|
||||
</xs:complexType>
|
||||
<xs:group name="coverageReportGroup">
|
||||
<xs:all>
|
||||
<xs:element name="clover" type="logToFileType" minOccurs="0"/>
|
||||
<xs:element name="cobertura" type="logToFileType" minOccurs="0"/>
|
||||
<xs:element name="crap4j" type="coverageReportCrap4JType" minOccurs="0" />
|
||||
<xs:element name="html" type="coverageReportHtmlType" minOccurs="0" />
|
||||
<xs:element name="php" type="logToFileType" minOccurs="0" />
|
||||
<xs:element name="text" type="coverageReportTextType" minOccurs="0" />
|
||||
<xs:element name="xml" type="logToDirectoryType" minOccurs="0" />
|
||||
</xs:all>
|
||||
</xs:group>
|
||||
<xs:group name="loggingGroup">
|
||||
<xs:all>
|
||||
<xs:element name="junit" type="logToFileType" minOccurs="0" />
|
||||
<xs:element name="teamcity" type="logToFileType" minOccurs="0" />
|
||||
<xs:element name="testdoxHtml" type="logToFileType" minOccurs="0" />
|
||||
<xs:element name="testdoxText" type="logToFileType" minOccurs="0" />
|
||||
<xs:element name="testdoxXml" type="logToFileType" minOccurs="0" />
|
||||
<xs:element name="text" type="logToFileType" minOccurs="0"/>
|
||||
</xs:all>
|
||||
</xs:group>
|
||||
<xs:complexType name="logToFileType">
|
||||
<xs:attribute name="outputFile" type="xs:anyURI" use="required"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="logToDirectoryType">
|
||||
<xs:attribute name="outputDirectory" type="xs:anyURI" use="required"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="coverageReportCrap4JType">
|
||||
<xs:attribute name="outputFile" type="xs:anyURI" use="required"/>
|
||||
<xs:attribute name="threshold" type="xs:integer"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="coverageReportHtmlType">
|
||||
<xs:attribute name="outputDirectory" type="xs:anyURI" use="required"/>
|
||||
<xs:attribute name="lowUpperBound" type="xs:integer" default="50"/>
|
||||
<xs:attribute name="highLowerBound" type="xs:integer" default="90"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="coverageReportTextType">
|
||||
<xs:attribute name="outputFile" type="xs:anyURI" use="required"/>
|
||||
<xs:attribute name="showUncoveredFiles" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="showOnlySummary" type="xs:boolean" default="false"/>
|
||||
</xs:complexType>
|
||||
</xs:schema>
|
||||
|
||||
+317
@@ -0,0 +1,317 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
||||
<xs:annotation>
|
||||
<xs:documentation source="https://phpunit.de/documentation.html">
|
||||
This Schema file defines the rules by which the XML configuration file of PHPUnit 8.5 may be structured.
|
||||
</xs:documentation>
|
||||
<xs:appinfo source="https://phpunit.de/documentation.html"/>
|
||||
</xs:annotation>
|
||||
<xs:element name="phpunit" type="phpUnitType">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Root Element</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:complexType name="filtersType">
|
||||
<xs:sequence>
|
||||
<xs:element name="whitelist" type="whiteListType" minOccurs="0"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="filterType">
|
||||
<xs:sequence>
|
||||
<xs:choice maxOccurs="unbounded" minOccurs="0">
|
||||
<xs:group ref="pathGroup"/>
|
||||
<xs:element name="exclude">
|
||||
<xs:complexType>
|
||||
<xs:group ref="pathGroup"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="whiteListType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="filterType">
|
||||
<xs:attribute name="addUncoveredFilesFromWhitelist" default="true" type="xs:boolean"/>
|
||||
<xs:attribute name="processUncoveredFilesFromWhitelist" default="false" type="xs:boolean"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="groupsType">
|
||||
<xs:choice>
|
||||
<xs:sequence>
|
||||
<xs:element name="include" type="groupType"/>
|
||||
<xs:element name="exclude" type="groupType" minOccurs="0"/>
|
||||
</xs:sequence>
|
||||
<xs:sequence>
|
||||
<xs:element name="exclude" type="groupType"/>
|
||||
</xs:sequence>
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="groupType">
|
||||
<xs:sequence>
|
||||
<xs:element name="group" type="xs:string" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="extensionsType">
|
||||
<xs:sequence>
|
||||
<xs:element name="extension" type="objectType" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="listenersType">
|
||||
<xs:sequence>
|
||||
<xs:element name="listener" type="objectType" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="objectType">
|
||||
<xs:sequence>
|
||||
<xs:element name="arguments" minOccurs="0">
|
||||
<xs:complexType>
|
||||
<xs:group ref="argumentsGroup"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="class" type="xs:string" use="required"/>
|
||||
<xs:attribute name="file" type="xs:anyURI"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="arrayType">
|
||||
<xs:sequence>
|
||||
<xs:element name="element" type="argumentType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="argumentType">
|
||||
<xs:group ref="argumentChoice"/>
|
||||
<xs:attribute name="key" use="required"/>
|
||||
</xs:complexType>
|
||||
<xs:group name="argumentsGroup">
|
||||
<xs:sequence>
|
||||
<xs:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:element name="array" type="arrayType" />
|
||||
<xs:element name="integer" type="xs:integer" />
|
||||
<xs:element name="string" type="xs:string" />
|
||||
<xs:element name="double" type="xs:double" />
|
||||
<xs:element name="null" />
|
||||
<xs:element name="object" type="objectType" />
|
||||
<xs:element name="file" type="xs:anyURI" />
|
||||
<xs:element name="directory" type="xs:anyURI" />
|
||||
<xs:element name="boolean" type="xs:boolean" />
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:group>
|
||||
<xs:group name="argumentChoice">
|
||||
<xs:choice>
|
||||
<xs:element name="array" type="arrayType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="integer" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="string" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="double" type="xs:double" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="null" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="object" type="objectType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="file" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="directory" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="boolean" type="xs:boolean" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:choice>
|
||||
</xs:group>
|
||||
<xs:simpleType name="columnsType">
|
||||
<xs:union>
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:integer"/>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="max"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:union>
|
||||
</xs:simpleType>
|
||||
<xs:complexType name="loggersType">
|
||||
<xs:sequence>
|
||||
<xs:element name="log" type="loggerType" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="loggerType">
|
||||
<xs:attribute name="type">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="coverage-html"/>
|
||||
<xs:enumeration value="coverage-text"/>
|
||||
<xs:enumeration value="coverage-clover"/>
|
||||
<xs:enumeration value="coverage-crap4j"/>
|
||||
<xs:enumeration value="coverage-xml"/>
|
||||
<xs:enumeration value="coverage-php"/>
|
||||
<xs:enumeration value="json"/>
|
||||
<xs:enumeration value="plain"/>
|
||||
<xs:enumeration value="tap"/>
|
||||
<xs:enumeration value="teamcity"/>
|
||||
<xs:enumeration value="junit"/>
|
||||
<xs:enumeration value="testdox-html"/>
|
||||
<xs:enumeration value="testdox-text"/>
|
||||
<xs:enumeration value="testdox-xml"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:attribute>
|
||||
<xs:attribute name="target" type="xs:anyURI"/>
|
||||
<xs:attribute name="lowUpperBound" type="xs:nonNegativeInteger" default="50"/>
|
||||
<xs:attribute name="highLowerBound" type="xs:nonNegativeInteger" default="90"/>
|
||||
<xs:attribute name="showUncoveredFiles" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="showOnlySummary" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="threshold" type="xs:nonNegativeInteger" default="30"/>
|
||||
</xs:complexType>
|
||||
<xs:group name="pathGroup">
|
||||
<xs:sequence>
|
||||
<xs:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:element name="directory" type="directoryFilterType"/>
|
||||
<xs:element name="file" type="fileFilterType"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:group>
|
||||
<xs:complexType name="directoryFilterType">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:anyURI">
|
||||
<xs:attribute type="xs:string" name="prefix" default=""/>
|
||||
<xs:attribute type="xs:string" name="suffix" default="Test.php"/>
|
||||
<xs:attributeGroup ref="phpVersionGroup"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
<xs:simpleType name="executionOrderType">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="default"/>
|
||||
<xs:enumeration value="defects"/>
|
||||
<xs:enumeration value="depends"/>
|
||||
<xs:enumeration value="depends,defects"/>
|
||||
<xs:enumeration value="depends,duration"/>
|
||||
<xs:enumeration value="depends,random"/>
|
||||
<xs:enumeration value="depends,reverse"/>
|
||||
<xs:enumeration value="depends,size"/>
|
||||
<xs:enumeration value="duration"/>
|
||||
<xs:enumeration value="no-depends"/>
|
||||
<xs:enumeration value="no-depends,defects"/>
|
||||
<xs:enumeration value="no-depends,duration"/>
|
||||
<xs:enumeration value="no-depends,random"/>
|
||||
<xs:enumeration value="no-depends,reverse"/>
|
||||
<xs:enumeration value="no-depends,size"/>
|
||||
<xs:enumeration value="random"/>
|
||||
<xs:enumeration value="reverse"/>
|
||||
<xs:enumeration value="size"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:complexType name="fileFilterType">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:anyURI">
|
||||
<xs:attributeGroup ref="phpVersionGroup"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
<xs:attributeGroup name="phpVersionGroup">
|
||||
<xs:attribute name="phpVersion" type="xs:string" default="5.3.0"/>
|
||||
<xs:attribute name="phpVersionOperator" type="xs:string" default=">="/>
|
||||
</xs:attributeGroup>
|
||||
<xs:complexType name="phpType">
|
||||
<xs:sequence>
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="includePath" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="ini" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="const" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="var" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="env" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="post" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="get" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="cookie" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="server" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="files" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="request" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="namedValueType">
|
||||
<xs:attribute name="name" use="required" type="xs:string"/>
|
||||
<xs:attribute name="value" use="required" type="xs:anySimpleType"/>
|
||||
<xs:attribute name="verbatim" use="optional" type="xs:boolean"/>
|
||||
<xs:attribute name="force" use="optional" type="xs:boolean"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="phpUnitType">
|
||||
<xs:annotation>
|
||||
<xs:documentation>The main type specifying the document structure</xs:documentation>
|
||||
</xs:annotation>
|
||||
<xs:group ref="configGroup"/>
|
||||
<xs:attributeGroup ref="configAttributeGroup"/>
|
||||
</xs:complexType>
|
||||
<xs:attributeGroup name="configAttributeGroup">
|
||||
<xs:attribute name="backupGlobals" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="backupStaticAttributes" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="bootstrap" type="xs:anyURI"/>
|
||||
<xs:attribute name="cacheResult" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="cacheResultFile" type="xs:anyURI"/>
|
||||
<xs:attribute name="cacheTokens" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="colors" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="columns" type="columnsType" default="80"/>
|
||||
<xs:attribute name="convertDeprecationsToExceptions" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="convertErrorsToExceptions" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="convertNoticesToExceptions" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="convertWarningsToExceptions" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="disableCodeCoverageIgnore" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="forceCoversAnnotation" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="printerClass" type="xs:string" default="PHPUnit\TextUI\ResultPrinter"/>
|
||||
<xs:attribute name="printerFile" type="xs:anyURI"/>
|
||||
<xs:attribute name="processIsolation" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stopOnDefect" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stopOnError" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stopOnFailure" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stopOnWarning" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stopOnIncomplete" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stopOnRisky" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stopOnSkipped" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="failOnRisky" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="failOnWarning" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="beStrictAboutChangesToGlobalState" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="beStrictAboutOutputDuringTests" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="beStrictAboutResourceUsageDuringSmallTests" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="beStrictAboutTestsThatDoNotTestAnything" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="beStrictAboutTodoAnnotatedTests" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="beStrictAboutCoversAnnotation" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="defaultTimeLimit" type="xs:integer" default="0"/>
|
||||
<xs:attribute name="enforceTimeLimit" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="ignoreDeprecatedCodeUnitsFromCodeCoverage" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="timeoutForSmallTests" type="xs:integer" default="1"/>
|
||||
<xs:attribute name="timeoutForMediumTests" type="xs:integer" default="10"/>
|
||||
<xs:attribute name="timeoutForLargeTests" type="xs:integer" default="60"/>
|
||||
<xs:attribute name="testSuiteLoaderClass" type="xs:string" default="PHPUnit\Runner\StandardTestSuiteLoader"/>
|
||||
<xs:attribute name="testSuiteLoaderFile" type="xs:anyURI"/>
|
||||
<xs:attribute name="defaultTestSuite" type="xs:string" default=""/>
|
||||
<xs:attribute name="verbose" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="testdox" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stderr" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="reverseDefectList" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="registerMockObjectsFromTestArgumentsRecursively" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="extensionsDirectory" type="xs:string"/>
|
||||
<xs:attribute name="executionOrder" type="executionOrderType" default="default"/>
|
||||
<xs:attribute name="resolveDependencies" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="noInteraction" type="xs:boolean" default="false"/>
|
||||
</xs:attributeGroup>
|
||||
<xs:group name="configGroup">
|
||||
<xs:all>
|
||||
<xs:element ref="testSuiteFacet" minOccurs="0"/>
|
||||
<xs:element name="groups" type="groupsType" minOccurs="0"/>
|
||||
<xs:element name="testdoxGroups" type="groupsType" minOccurs="0"/>
|
||||
<xs:element name="filter" type="filtersType" minOccurs="0"/>
|
||||
<xs:element name="logging" type="loggersType" minOccurs="0"/>
|
||||
<xs:element name="extensions" type="extensionsType" minOccurs="0"/>
|
||||
<xs:element name="listeners" type="listenersType" minOccurs="0"/>
|
||||
<xs:element name="php" type="phpType" minOccurs="0"/>
|
||||
</xs:all>
|
||||
</xs:group>
|
||||
<xs:element name="testSuiteFacet" abstract="true"/>
|
||||
<xs:element name="testsuite" type="testSuiteType" substitutionGroup="testSuiteFacet"/>
|
||||
<xs:element name="testsuites" type="testSuitesType" substitutionGroup="testSuiteFacet"/>
|
||||
<xs:complexType name="testSuitesType">
|
||||
<xs:sequence>
|
||||
<xs:element name="testsuite" type="testSuiteType" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="testSuiteType">
|
||||
<xs:sequence>
|
||||
<xs:group ref="pathGroup"/>
|
||||
<xs:element name="exclude" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="name" type="xs:string" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:schema>
|
||||
+317
@@ -0,0 +1,317 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
||||
<xs:annotation>
|
||||
<xs:documentation source="https://phpunit.de/documentation.html">
|
||||
This Schema file defines the rules by which the XML configuration file of PHPUnit 9.2 may be structured.
|
||||
</xs:documentation>
|
||||
<xs:appinfo source="https://phpunit.de/documentation.html"/>
|
||||
</xs:annotation>
|
||||
<xs:element name="phpunit" type="phpUnitType">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Root Element</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:complexType name="filtersType">
|
||||
<xs:sequence>
|
||||
<xs:element name="whitelist" type="whiteListType" minOccurs="0"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="filterType">
|
||||
<xs:sequence>
|
||||
<xs:choice maxOccurs="unbounded" minOccurs="0">
|
||||
<xs:group ref="pathGroup"/>
|
||||
<xs:element name="exclude">
|
||||
<xs:complexType>
|
||||
<xs:group ref="pathGroup"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="whiteListType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="filterType">
|
||||
<xs:attribute name="addUncoveredFilesFromWhitelist" default="true" type="xs:boolean"/>
|
||||
<xs:attribute name="processUncoveredFilesFromWhitelist" default="false" type="xs:boolean"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="groupsType">
|
||||
<xs:choice>
|
||||
<xs:sequence>
|
||||
<xs:element name="include" type="groupType"/>
|
||||
<xs:element name="exclude" type="groupType" minOccurs="0"/>
|
||||
</xs:sequence>
|
||||
<xs:sequence>
|
||||
<xs:element name="exclude" type="groupType"/>
|
||||
</xs:sequence>
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="groupType">
|
||||
<xs:sequence>
|
||||
<xs:element name="group" type="xs:string" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="extensionsType">
|
||||
<xs:sequence>
|
||||
<xs:element name="extension" type="objectType" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="listenersType">
|
||||
<xs:sequence>
|
||||
<xs:element name="listener" type="objectType" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="objectType">
|
||||
<xs:sequence>
|
||||
<xs:element name="arguments" minOccurs="0">
|
||||
<xs:complexType>
|
||||
<xs:group ref="argumentsGroup"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="class" type="xs:string" use="required"/>
|
||||
<xs:attribute name="file" type="xs:anyURI"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="arrayType">
|
||||
<xs:sequence>
|
||||
<xs:element name="element" type="argumentType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="argumentType">
|
||||
<xs:group ref="argumentChoice"/>
|
||||
<xs:attribute name="key" use="required"/>
|
||||
</xs:complexType>
|
||||
<xs:group name="argumentsGroup">
|
||||
<xs:sequence>
|
||||
<xs:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:element name="array" type="arrayType" />
|
||||
<xs:element name="integer" type="xs:integer" />
|
||||
<xs:element name="string" type="xs:string" />
|
||||
<xs:element name="double" type="xs:double" />
|
||||
<xs:element name="null" />
|
||||
<xs:element name="object" type="objectType" />
|
||||
<xs:element name="file" type="xs:anyURI" />
|
||||
<xs:element name="directory" type="xs:anyURI" />
|
||||
<xs:element name="boolean" type="xs:boolean" />
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:group>
|
||||
<xs:group name="argumentChoice">
|
||||
<xs:choice>
|
||||
<xs:element name="array" type="arrayType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="integer" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="string" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="double" type="xs:double" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="null" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="object" type="objectType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="file" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="directory" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="boolean" type="xs:boolean" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:choice>
|
||||
</xs:group>
|
||||
<xs:simpleType name="columnsType">
|
||||
<xs:union>
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:integer"/>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="max"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:union>
|
||||
</xs:simpleType>
|
||||
<xs:complexType name="loggersType">
|
||||
<xs:sequence>
|
||||
<xs:element name="log" type="loggerType" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="loggerType">
|
||||
<xs:attribute name="type">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="coverage-html"/>
|
||||
<xs:enumeration value="coverage-text"/>
|
||||
<xs:enumeration value="coverage-clover"/>
|
||||
<xs:enumeration value="coverage-crap4j"/>
|
||||
<xs:enumeration value="coverage-xml"/>
|
||||
<xs:enumeration value="coverage-php"/>
|
||||
<xs:enumeration value="plain"/>
|
||||
<xs:enumeration value="teamcity"/>
|
||||
<xs:enumeration value="junit"/>
|
||||
<xs:enumeration value="testdox-html"/>
|
||||
<xs:enumeration value="testdox-text"/>
|
||||
<xs:enumeration value="testdox-xml"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:attribute>
|
||||
<xs:attribute name="target" type="xs:anyURI"/>
|
||||
<xs:attribute name="lowUpperBound" type="xs:nonNegativeInteger" default="50"/>
|
||||
<xs:attribute name="highLowerBound" type="xs:nonNegativeInteger" default="90"/>
|
||||
<xs:attribute name="showUncoveredFiles" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="showOnlySummary" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="threshold" type="xs:nonNegativeInteger" default="30"/>
|
||||
</xs:complexType>
|
||||
<xs:group name="pathGroup">
|
||||
<xs:sequence>
|
||||
<xs:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:element name="directory" type="directoryFilterType"/>
|
||||
<xs:element name="file" type="fileFilterType"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:group>
|
||||
<xs:complexType name="directoryFilterType">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:anyURI">
|
||||
<xs:attribute type="xs:string" name="prefix" default=""/>
|
||||
<xs:attribute type="xs:string" name="suffix" default="Test.php"/>
|
||||
<xs:attributeGroup ref="phpVersionGroup"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
<xs:simpleType name="executionOrderType">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="default"/>
|
||||
<xs:enumeration value="defects"/>
|
||||
<xs:enumeration value="depends"/>
|
||||
<xs:enumeration value="depends,defects"/>
|
||||
<xs:enumeration value="depends,duration"/>
|
||||
<xs:enumeration value="depends,random"/>
|
||||
<xs:enumeration value="depends,reverse"/>
|
||||
<xs:enumeration value="depends,size"/>
|
||||
<xs:enumeration value="duration"/>
|
||||
<xs:enumeration value="no-depends"/>
|
||||
<xs:enumeration value="no-depends,defects"/>
|
||||
<xs:enumeration value="no-depends,duration"/>
|
||||
<xs:enumeration value="no-depends,random"/>
|
||||
<xs:enumeration value="no-depends,reverse"/>
|
||||
<xs:enumeration value="no-depends,size"/>
|
||||
<xs:enumeration value="random"/>
|
||||
<xs:enumeration value="reverse"/>
|
||||
<xs:enumeration value="size"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:complexType name="fileFilterType">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:anyURI">
|
||||
<xs:attributeGroup ref="phpVersionGroup"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
<xs:attributeGroup name="phpVersionGroup">
|
||||
<xs:attribute name="phpVersion" type="xs:string" default="5.3.0"/>
|
||||
<xs:attribute name="phpVersionOperator" type="xs:string" default=">="/>
|
||||
</xs:attributeGroup>
|
||||
<xs:complexType name="phpType">
|
||||
<xs:sequence>
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="includePath" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="ini" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="const" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="var" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="env" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="post" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="get" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="cookie" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="server" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="files" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="request" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="namedValueType">
|
||||
<xs:attribute name="name" use="required" type="xs:string"/>
|
||||
<xs:attribute name="value" use="required" type="xs:anySimpleType"/>
|
||||
<xs:attribute name="verbatim" use="optional" type="xs:boolean"/>
|
||||
<xs:attribute name="force" use="optional" type="xs:boolean"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="phpUnitType">
|
||||
<xs:annotation>
|
||||
<xs:documentation>The main type specifying the document structure</xs:documentation>
|
||||
</xs:annotation>
|
||||
<xs:group ref="configGroup"/>
|
||||
<xs:attributeGroup ref="configAttributeGroup"/>
|
||||
</xs:complexType>
|
||||
<xs:attributeGroup name="configAttributeGroup">
|
||||
<xs:attribute name="backupGlobals" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="backupStaticAttributes" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="bootstrap" type="xs:anyURI"/>
|
||||
<xs:attribute name="cacheResult" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="cacheResultFile" type="xs:anyURI"/>
|
||||
<xs:attribute name="cacheTokens" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="colors" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="columns" type="columnsType" default="80"/>
|
||||
<xs:attribute name="convertDeprecationsToExceptions" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="convertErrorsToExceptions" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="convertNoticesToExceptions" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="convertWarningsToExceptions" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="disableCodeCoverageIgnore" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="forceCoversAnnotation" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="printerClass" type="xs:string" default="PHPUnit\TextUI\ResultPrinter"/>
|
||||
<xs:attribute name="printerFile" type="xs:anyURI"/>
|
||||
<xs:attribute name="processIsolation" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stopOnDefect" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stopOnError" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stopOnFailure" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stopOnWarning" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stopOnIncomplete" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stopOnRisky" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stopOnSkipped" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="failOnIncomplete" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="failOnRisky" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="failOnSkipped" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="failOnWarning" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="beStrictAboutChangesToGlobalState" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="beStrictAboutOutputDuringTests" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="beStrictAboutResourceUsageDuringSmallTests" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="beStrictAboutTestsThatDoNotTestAnything" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="beStrictAboutTodoAnnotatedTests" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="beStrictAboutCoversAnnotation" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="defaultTimeLimit" type="xs:integer" default="0"/>
|
||||
<xs:attribute name="enforceTimeLimit" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="ignoreDeprecatedCodeUnitsFromCodeCoverage" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="timeoutForSmallTests" type="xs:integer" default="1"/>
|
||||
<xs:attribute name="timeoutForMediumTests" type="xs:integer" default="10"/>
|
||||
<xs:attribute name="timeoutForLargeTests" type="xs:integer" default="60"/>
|
||||
<xs:attribute name="testSuiteLoaderClass" type="xs:string" default="PHPUnit\Runner\StandardTestSuiteLoader"/>
|
||||
<xs:attribute name="testSuiteLoaderFile" type="xs:anyURI"/>
|
||||
<xs:attribute name="defaultTestSuite" type="xs:string" default=""/>
|
||||
<xs:attribute name="verbose" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="testdox" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="stderr" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="reverseDefectList" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="registerMockObjectsFromTestArgumentsRecursively" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="extensionsDirectory" type="xs:string"/>
|
||||
<xs:attribute name="executionOrder" type="executionOrderType" default="default"/>
|
||||
<xs:attribute name="resolveDependencies" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="noInteraction" type="xs:boolean" default="false"/>
|
||||
</xs:attributeGroup>
|
||||
<xs:group name="configGroup">
|
||||
<xs:all>
|
||||
<xs:element ref="testSuiteFacet" minOccurs="0"/>
|
||||
<xs:element name="groups" type="groupsType" minOccurs="0"/>
|
||||
<xs:element name="testdoxGroups" type="groupsType" minOccurs="0"/>
|
||||
<xs:element name="filter" type="filtersType" minOccurs="0"/>
|
||||
<xs:element name="logging" type="loggersType" minOccurs="0"/>
|
||||
<xs:element name="extensions" type="extensionsType" minOccurs="0"/>
|
||||
<xs:element name="listeners" type="listenersType" minOccurs="0"/>
|
||||
<xs:element name="php" type="phpType" minOccurs="0"/>
|
||||
</xs:all>
|
||||
</xs:group>
|
||||
<xs:element name="testSuiteFacet" abstract="true"/>
|
||||
<xs:element name="testsuite" type="testSuiteType" substitutionGroup="testSuiteFacet"/>
|
||||
<xs:element name="testsuites" type="testSuitesType" substitutionGroup="testSuiteFacet"/>
|
||||
<xs:complexType name="testSuitesType">
|
||||
<xs:sequence>
|
||||
<xs:element name="testsuite" type="testSuiteType" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="testSuiteType">
|
||||
<xs:sequence>
|
||||
<xs:group ref="pathGroup"/>
|
||||
<xs:element name="exclude" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="name" type="xs:string" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:schema>
|
||||
+339
-1140
File diff suppressed because it is too large
Load Diff
+832
-806
File diff suppressed because it is too large
Load Diff
@@ -1,135 +0,0 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function array_replace_recursive;
|
||||
use function is_array;
|
||||
use function iterator_to_array;
|
||||
use function var_export;
|
||||
use ArrayObject;
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
use SebastianBergmann\Comparator\ComparisonFailure;
|
||||
use Traversable;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that the array it is evaluated for has a specified subset.
|
||||
*
|
||||
* Uses array_replace_recursive() to check if a key value subset is part of the
|
||||
* subject array.
|
||||
*
|
||||
* @codeCoverageIgnore
|
||||
*
|
||||
* @deprecated https://github.com/sebastianbergmann/phpunit/issues/3494
|
||||
*/
|
||||
final class ArraySubset extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var iterable
|
||||
*/
|
||||
private $subset;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $strict;
|
||||
|
||||
public function __construct(iterable $subset, bool $strict = false)
|
||||
{
|
||||
$this->strict = $strict;
|
||||
$this->subset = $subset;
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other.
|
||||
*
|
||||
* If $returnResult is set to false (the default), an exception is thrown
|
||||
* in case of a failure. null is returned otherwise.
|
||||
*
|
||||
* If $returnResult is true, the result of the evaluation is returned as
|
||||
* a boolean value instead: true in case of success, false in case of a
|
||||
* failure.
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
* @throws ExpectationFailedException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false)
|
||||
{
|
||||
//type cast $other & $this->subset as an array to allow
|
||||
//support in standard array functions.
|
||||
$other = $this->toArray($other);
|
||||
$this->subset = $this->toArray($this->subset);
|
||||
|
||||
$patched = array_replace_recursive($other, $this->subset);
|
||||
|
||||
if ($this->strict) {
|
||||
$result = $other === $patched;
|
||||
} else {
|
||||
$result = $other == $patched;
|
||||
}
|
||||
|
||||
if ($returnResult) {
|
||||
return $result;
|
||||
}
|
||||
|
||||
if (!$result) {
|
||||
$f = new ComparisonFailure(
|
||||
$patched,
|
||||
$other,
|
||||
var_export($patched, true),
|
||||
var_export($other, true)
|
||||
);
|
||||
|
||||
$this->fail($other, $description, $f);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'has the subset ' . $this->exporter()->export($this->subset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the description of the failure.
|
||||
*
|
||||
* The beginning of failure messages is "Failed asserting that" in most
|
||||
* cases. This method should return the second part of that sentence.
|
||||
*
|
||||
* @param mixed $other evaluated value or object
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
*/
|
||||
protected function failureDescription($other): string
|
||||
{
|
||||
return 'an array ' . $this->toString();
|
||||
}
|
||||
|
||||
private function toArray(iterable $other): array
|
||||
{
|
||||
if (is_array($other)) {
|
||||
return $other;
|
||||
}
|
||||
|
||||
if ($other instanceof ArrayObject) {
|
||||
return $other->getArrayCopy();
|
||||
}
|
||||
|
||||
if ($other instanceof Traversable) {
|
||||
return iterator_to_array($other);
|
||||
}
|
||||
|
||||
// Keep BC even if we know that array would not be the expected one
|
||||
return (array) $other;
|
||||
}
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use PHPUnit\Framework\Assert;
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
/**
|
||||
* @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
|
||||
* @codeCoverageIgnore
|
||||
*/
|
||||
final class Attribute extends Composite
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $attributeName;
|
||||
|
||||
public function __construct(Constraint $constraint, string $attributeName)
|
||||
{
|
||||
parent::__construct($constraint);
|
||||
|
||||
$this->attributeName = $attributeName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other.
|
||||
*
|
||||
* If $returnResult is set to false (the default), an exception is thrown
|
||||
* in case of a failure. null is returned otherwise.
|
||||
*
|
||||
* If $returnResult is true, the result of the evaluation is returned as
|
||||
* a boolean value instead: true in case of success, false in case of a
|
||||
* failure.
|
||||
*
|
||||
* @throws \PHPUnit\Framework\Exception
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
* @throws ExpectationFailedException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false)
|
||||
{
|
||||
return parent::evaluate(
|
||||
Assert::readAttribute(
|
||||
$other,
|
||||
$this->attributeName
|
||||
),
|
||||
$description,
|
||||
$returnResult
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'attribute "' . $this->attributeName . '" ' . $this->innerConstraint()->toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the description of the failure.
|
||||
*
|
||||
* The beginning of failure messages is "Failed asserting that" in most
|
||||
* cases. This method should return the second part of that sentence.
|
||||
*
|
||||
* @param mixed $other evaluated value or object
|
||||
*/
|
||||
protected function failureDescription($other): string
|
||||
{
|
||||
return $this->toString();
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -10,7 +10,7 @@
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
/**
|
||||
* Constraint that accepts false.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsFalse extends Constraint
|
||||
{
|
||||
+1
-1
@@ -10,7 +10,7 @@
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
/**
|
||||
* Constraint that accepts true.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsTrue extends Constraint
|
||||
{
|
||||
@@ -10,9 +10,9 @@
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
/**
|
||||
* Constraint that evaluates against a specified closure.
|
||||
*
|
||||
* @psalm-template CallbackInput of mixed
|
||||
*
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class Callback extends Constraint
|
||||
{
|
||||
|
||||
+17
-3
@@ -18,8 +18,12 @@ use EmptyIterator;
|
||||
use Generator;
|
||||
use Iterator;
|
||||
use IteratorAggregate;
|
||||
use PHPUnit\Framework\Exception;
|
||||
use Traversable;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
class Count extends Constraint
|
||||
{
|
||||
/**
|
||||
@@ -43,6 +47,8 @@ class Count extends Constraint
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other. Returns true if the
|
||||
* constraint is met, false otherwise.
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
protected function matches($other): bool
|
||||
{
|
||||
@@ -50,7 +56,7 @@ class Count extends Constraint
|
||||
}
|
||||
|
||||
/**
|
||||
* @param iterable $other
|
||||
* @throws Exception
|
||||
*/
|
||||
protected function getCountOf($other): ?int
|
||||
{
|
||||
@@ -64,7 +70,15 @@ class Count extends Constraint
|
||||
|
||||
if ($other instanceof Traversable) {
|
||||
while ($other instanceof IteratorAggregate) {
|
||||
$other = $other->getIterator();
|
||||
try {
|
||||
$other = $other->getIterator();
|
||||
} catch (\Exception $e) {
|
||||
throw new Exception(
|
||||
$e->getMessage(),
|
||||
$e->getCode(),
|
||||
$e
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$iterator = $other;
|
||||
@@ -121,7 +135,7 @@ class Count extends Constraint
|
||||
{
|
||||
return sprintf(
|
||||
'actual size %d matches expected size %d',
|
||||
$this->getCountOf($other),
|
||||
(int) $this->getCountOf($other),
|
||||
$this->expectedCount
|
||||
);
|
||||
}
|
||||
+1
-2
@@ -10,8 +10,7 @@
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that the value it is evaluated for is greater
|
||||
* than a given value.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class GreaterThan extends Constraint
|
||||
{
|
||||
+1
-1
@@ -17,7 +17,7 @@ use Countable;
|
||||
use EmptyIterator;
|
||||
|
||||
/**
|
||||
* Constraint that checks whether a variable is empty().
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsEmpty extends Constraint
|
||||
{
|
||||
+1
-2
@@ -10,8 +10,7 @@
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that the value it is evaluated for is less than
|
||||
* a given value.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class LessThan extends Constraint
|
||||
{
|
||||
+4
-1
@@ -9,10 +9,13 @@
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class SameSize extends Count
|
||||
{
|
||||
public function __construct(iterable $expected)
|
||||
{
|
||||
parent::__construct($this->getCountOf($expected));
|
||||
parent::__construct((int) $this->getCountOf($expected));
|
||||
}
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function count;
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
/**
|
||||
* @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
|
||||
* @codeCoverageIgnore
|
||||
*/
|
||||
abstract class Composite extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var Constraint
|
||||
*/
|
||||
private $innerConstraint;
|
||||
|
||||
public function __construct(Constraint $innerConstraint)
|
||||
{
|
||||
$this->innerConstraint = $innerConstraint;
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other.
|
||||
*
|
||||
* If $returnResult is set to false (the default), an exception is thrown
|
||||
* in case of a failure. null is returned otherwise.
|
||||
*
|
||||
* If $returnResult is true, the result of the evaluation is returned as
|
||||
* a boolean value instead: true in case of success, false in case of a
|
||||
* failure.
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
* @throws ExpectationFailedException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false)
|
||||
{
|
||||
try {
|
||||
return $this->innerConstraint->evaluate(
|
||||
$other,
|
||||
$description,
|
||||
$returnResult
|
||||
);
|
||||
} catch (ExpectationFailedException $e) {
|
||||
$this->fail($other, $description, $e->getComparisonFailure());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Counts the number of constraint elements.
|
||||
*/
|
||||
public function count(): int
|
||||
{
|
||||
return count($this->innerConstraint);
|
||||
}
|
||||
|
||||
protected function innerConstraint(): Constraint
|
||||
{
|
||||
return $this->innerConstraint;
|
||||
}
|
||||
}
|
||||
+117
-3
@@ -17,12 +17,12 @@ use SebastianBergmann\Comparator\ComparisonFailure;
|
||||
use SebastianBergmann\Exporter\Exporter;
|
||||
|
||||
/**
|
||||
* Abstract base class for constraints which can be applied to any value.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
abstract class Constraint implements Countable, SelfDescribing
|
||||
{
|
||||
/**
|
||||
* @var Exporter
|
||||
* @var ?Exporter
|
||||
*/
|
||||
private $exporter;
|
||||
|
||||
@@ -39,7 +39,7 @@ abstract class Constraint implements Countable, SelfDescribing
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
* @throws ExpectationFailedException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false)
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false): ?bool
|
||||
{
|
||||
$success = false;
|
||||
|
||||
@@ -54,6 +54,8 @@ abstract class Constraint implements Countable, SelfDescribing
|
||||
if (!$success) {
|
||||
$this->fail($other, $description);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -152,4 +154,116 @@ abstract class Constraint implements Countable, SelfDescribing
|
||||
{
|
||||
return $this->exporter()->export($other) . ' ' . $this->toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a custom string representation of the constraint object when it
|
||||
* appears in context of an $operator expression.
|
||||
*
|
||||
* The purpose of this method is to provide meaningful descriptive string
|
||||
* in context of operators such as LogicalNot. Native PHPUnit constraints
|
||||
* are supported out of the box by LogicalNot, but externally developed
|
||||
* ones had no way to provide correct strings in this context.
|
||||
*
|
||||
* The method shall return empty string, when it does not handle
|
||||
* customization by itself.
|
||||
*
|
||||
* @param Operator $operator the $operator of the expression
|
||||
* @param mixed $role role of $this constraint in the $operator expression
|
||||
*/
|
||||
protected function toStringInContext(Operator $operator, $role): string
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the description of the failure when this constraint appears in
|
||||
* context of an $operator expression.
|
||||
*
|
||||
* The purpose of this method is to provide meaningful failue description
|
||||
* in context of operators such as LogicalNot. Native PHPUnit constraints
|
||||
* are supported out of the box by LogicalNot, but externally developed
|
||||
* ones had no way to provide correct messages in this context.
|
||||
*
|
||||
* The method shall return empty string, when it does not handle
|
||||
* customization by itself.
|
||||
*
|
||||
* @param Operator $operator the $operator of the expression
|
||||
* @param mixed $role role of $this constraint in the $operator expression
|
||||
* @param mixed $other evaluated value or object
|
||||
*/
|
||||
protected function failureDescriptionInContext(Operator $operator, $role, $other): string
|
||||
{
|
||||
$string = $this->toStringInContext($operator, $role);
|
||||
|
||||
if ($string === '') {
|
||||
return '';
|
||||
}
|
||||
|
||||
return $this->exporter()->export($other) . ' ' . $string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reduces the sub-expression starting at $this by skipping degenerate
|
||||
* sub-expression and returns first descendant constraint that starts
|
||||
* a non-reducible sub-expression.
|
||||
*
|
||||
* Returns $this for terminal constraints and for operators that start
|
||||
* non-reducible sub-expression, or the nearest descendant of $this that
|
||||
* starts a non-reducible sub-expression.
|
||||
*
|
||||
* A constraint expression may be modelled as a tree with non-terminal
|
||||
* nodes (operators) and terminal nodes. For example:
|
||||
*
|
||||
* LogicalOr (operator, non-terminal)
|
||||
* + LogicalAnd (operator, non-terminal)
|
||||
* | + IsType('int') (terminal)
|
||||
* | + GreaterThan(10) (terminal)
|
||||
* + LogicalNot (operator, non-terminal)
|
||||
* + IsType('array') (terminal)
|
||||
*
|
||||
* A degenerate sub-expression is a part of the tree, that effectively does
|
||||
* not contribute to the evaluation of the expression it appears in. An example
|
||||
* of degenerate sub-expression is a BinaryOperator constructed with single
|
||||
* operand or nested BinaryOperators, each with single operand. An
|
||||
* expression involving a degenerate sub-expression is equivalent to a
|
||||
* reduced expression with the degenerate sub-expression removed, for example
|
||||
*
|
||||
* LogicalAnd (operator)
|
||||
* + LogicalOr (degenerate operator)
|
||||
* | + LogicalAnd (degenerate operator)
|
||||
* | + IsType('int') (terminal)
|
||||
* + GreaterThan(10) (terminal)
|
||||
*
|
||||
* is equivalent to
|
||||
*
|
||||
* LogicalAnd (operator)
|
||||
* + IsType('int') (terminal)
|
||||
* + GreaterThan(10) (terminal)
|
||||
*
|
||||
* because the subexpression
|
||||
*
|
||||
* + LogicalOr
|
||||
* + LogicalAnd
|
||||
* + -
|
||||
*
|
||||
* is degenerate. Calling reduce() on the LogicalOr object above, as well
|
||||
* as on LogicalAnd, shall return the IsType('int') instance.
|
||||
*
|
||||
* Other specific reductions can be implemented, for example cascade of
|
||||
* LogicalNot operators
|
||||
*
|
||||
* + LogicalNot
|
||||
* + LogicalNot
|
||||
* +LogicalNot
|
||||
* + IsTrue
|
||||
*
|
||||
* can be reduced to
|
||||
*
|
||||
* LogicalNot
|
||||
* + IsTrue
|
||||
*/
|
||||
protected function reduce(): self
|
||||
{
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
||||
+5
-9
@@ -18,13 +18,7 @@ use SebastianBergmann\Comparator\ComparisonFailure;
|
||||
use SebastianBergmann\Comparator\Factory as ComparatorFactory;
|
||||
|
||||
/**
|
||||
* Constraint that checks if one value is equal to another.
|
||||
*
|
||||
* Equality is checked with PHP's == operator, the operator is explained in
|
||||
* detail at {@url https://php.net/manual/en/types.comparisons.php}.
|
||||
* Two values are equal if they have the same value disregarding type.
|
||||
*
|
||||
* The expected value is passed in the constructor.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsEqual extends Constraint
|
||||
{
|
||||
@@ -48,7 +42,7 @@ final class IsEqual extends Constraint
|
||||
*/
|
||||
private $ignoreCase;
|
||||
|
||||
public function __construct($value, float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false)
|
||||
public function __construct($value, float $delta = 0.0, bool $canonicalize = false, bool $ignoreCase = false)
|
||||
{
|
||||
$this->value = $value;
|
||||
$this->delta = $delta;
|
||||
@@ -67,8 +61,10 @@ final class IsEqual extends Constraint
|
||||
* failure.
|
||||
*
|
||||
* @throws ExpectationFailedException
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false)
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false): ?bool
|
||||
{
|
||||
// If $this->value and $other are identical, they are also equal.
|
||||
// This is the most common path and will allow us to skip
|
||||
+108
@@ -0,0 +1,108 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function is_string;
|
||||
use function sprintf;
|
||||
use function strpos;
|
||||
use function trim;
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
use SebastianBergmann\Comparator\ComparisonFailure;
|
||||
use SebastianBergmann\Comparator\Factory as ComparatorFactory;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsEqualCanonicalizing extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var mixed
|
||||
*/
|
||||
private $value;
|
||||
|
||||
public function __construct($value)
|
||||
{
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other.
|
||||
*
|
||||
* If $returnResult is set to false (the default), an exception is thrown
|
||||
* in case of a failure. null is returned otherwise.
|
||||
*
|
||||
* If $returnResult is true, the result of the evaluation is returned as
|
||||
* a boolean value instead: true in case of success, false in case of a
|
||||
* failure.
|
||||
*
|
||||
* @throws ExpectationFailedException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false): ?bool
|
||||
{
|
||||
// If $this->value and $other are identical, they are also equal.
|
||||
// This is the most common path and will allow us to skip
|
||||
// initialization of all the comparators.
|
||||
if ($this->value === $other) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$comparatorFactory = ComparatorFactory::getInstance();
|
||||
|
||||
try {
|
||||
$comparator = $comparatorFactory->getComparatorFor(
|
||||
$this->value,
|
||||
$other
|
||||
);
|
||||
|
||||
$comparator->assertEquals(
|
||||
$this->value,
|
||||
$other,
|
||||
0.0,
|
||||
true,
|
||||
false
|
||||
);
|
||||
} catch (ComparisonFailure $f) {
|
||||
if ($returnResult) {
|
||||
return false;
|
||||
}
|
||||
|
||||
throw new ExpectationFailedException(
|
||||
trim($description . "\n" . $f->getMessage()),
|
||||
$f
|
||||
);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
if (is_string($this->value)) {
|
||||
if (strpos($this->value, "\n") !== false) {
|
||||
return 'is equal to <text>';
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
"is equal to '%s'",
|
||||
$this->value
|
||||
);
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
'is equal to %s',
|
||||
$this->exporter()->export($this->value)
|
||||
);
|
||||
}
|
||||
}
|
||||
+108
@@ -0,0 +1,108 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function is_string;
|
||||
use function sprintf;
|
||||
use function strpos;
|
||||
use function trim;
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
use SebastianBergmann\Comparator\ComparisonFailure;
|
||||
use SebastianBergmann\Comparator\Factory as ComparatorFactory;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsEqualIgnoringCase extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var mixed
|
||||
*/
|
||||
private $value;
|
||||
|
||||
public function __construct($value)
|
||||
{
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other.
|
||||
*
|
||||
* If $returnResult is set to false (the default), an exception is thrown
|
||||
* in case of a failure. null is returned otherwise.
|
||||
*
|
||||
* If $returnResult is true, the result of the evaluation is returned as
|
||||
* a boolean value instead: true in case of success, false in case of a
|
||||
* failure.
|
||||
*
|
||||
* @throws ExpectationFailedException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false): ?bool
|
||||
{
|
||||
// If $this->value and $other are identical, they are also equal.
|
||||
// This is the most common path and will allow us to skip
|
||||
// initialization of all the comparators.
|
||||
if ($this->value === $other) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$comparatorFactory = ComparatorFactory::getInstance();
|
||||
|
||||
try {
|
||||
$comparator = $comparatorFactory->getComparatorFor(
|
||||
$this->value,
|
||||
$other
|
||||
);
|
||||
|
||||
$comparator->assertEquals(
|
||||
$this->value,
|
||||
$other,
|
||||
0.0,
|
||||
false,
|
||||
true
|
||||
);
|
||||
} catch (ComparisonFailure $f) {
|
||||
if ($returnResult) {
|
||||
return false;
|
||||
}
|
||||
|
||||
throw new ExpectationFailedException(
|
||||
trim($description . "\n" . $f->getMessage()),
|
||||
$f
|
||||
);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
if (is_string($this->value)) {
|
||||
if (strpos($this->value, "\n") !== false) {
|
||||
return 'is equal to <text>';
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
"is equal to '%s'",
|
||||
$this->value
|
||||
);
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
'is equal to %s',
|
||||
$this->exporter()->export($this->value)
|
||||
);
|
||||
}
|
||||
}
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function sprintf;
|
||||
use function trim;
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
use SebastianBergmann\Comparator\ComparisonFailure;
|
||||
use SebastianBergmann\Comparator\Factory as ComparatorFactory;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsEqualWithDelta extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var mixed
|
||||
*/
|
||||
private $value;
|
||||
|
||||
/**
|
||||
* @var float
|
||||
*/
|
||||
private $delta;
|
||||
|
||||
public function __construct($value, float $delta)
|
||||
{
|
||||
$this->value = $value;
|
||||
$this->delta = $delta;
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other.
|
||||
*
|
||||
* If $returnResult is set to false (the default), an exception is thrown
|
||||
* in case of a failure. null is returned otherwise.
|
||||
*
|
||||
* If $returnResult is true, the result of the evaluation is returned as
|
||||
* a boolean value instead: true in case of success, false in case of a
|
||||
* failure.
|
||||
*
|
||||
* @throws ExpectationFailedException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false): ?bool
|
||||
{
|
||||
// If $this->value and $other are identical, they are also equal.
|
||||
// This is the most common path and will allow us to skip
|
||||
// initialization of all the comparators.
|
||||
if ($this->value === $other) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$comparatorFactory = ComparatorFactory::getInstance();
|
||||
|
||||
try {
|
||||
$comparator = $comparatorFactory->getComparatorFor(
|
||||
$this->value,
|
||||
$other
|
||||
);
|
||||
|
||||
$comparator->assertEquals(
|
||||
$this->value,
|
||||
$other,
|
||||
$this->delta
|
||||
);
|
||||
} catch (ComparisonFailure $f) {
|
||||
if ($returnResult) {
|
||||
return false;
|
||||
}
|
||||
|
||||
throw new ExpectationFailedException(
|
||||
trim($description . "\n" . $f->getMessage()),
|
||||
$f
|
||||
);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return sprintf(
|
||||
'is equal to %s with delta <%F>>',
|
||||
$this->exporter()->export($this->value),
|
||||
$this->delta
|
||||
);
|
||||
}
|
||||
}
|
||||
+3
@@ -14,6 +14,9 @@ use function sprintf;
|
||||
use PHPUnit\Util\Filter;
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class Exception extends Constraint
|
||||
{
|
||||
/**
|
||||
+3
@@ -12,6 +12,9 @@ namespace PHPUnit\Framework\Constraint;
|
||||
use function sprintf;
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ExceptionCode extends Constraint
|
||||
{
|
||||
/**
|
||||
+3
@@ -13,6 +13,9 @@ use function sprintf;
|
||||
use function strpos;
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ExceptionMessage extends Constraint
|
||||
{
|
||||
/**
|
||||
+3
@@ -13,6 +13,9 @@ use function sprintf;
|
||||
use Exception;
|
||||
use PHPUnit\Util\RegularExpression as RegularExpressionUtil;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ExceptionMessageRegularExpression extends Constraint
|
||||
{
|
||||
/**
|
||||
+1
-3
@@ -13,9 +13,7 @@ use function is_dir;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* Constraint that checks if the directory(name) that it is evaluated for exists.
|
||||
*
|
||||
* The file path to check is passed as $other in evaluate().
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class DirectoryExists extends Constraint
|
||||
{
|
||||
+1
-3
@@ -13,9 +13,7 @@ use function file_exists;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* Constraint that checks if the file(name) that it is evaluated for exists.
|
||||
*
|
||||
* The file path to check is passed as $other in evaluate().
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class FileExists extends Constraint
|
||||
{
|
||||
+1
-3
@@ -13,9 +13,7 @@ use function is_readable;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* Constraint that checks if the file/dir(name) that it is evaluated for is readable.
|
||||
*
|
||||
* The file path to check is passed as $other in evaluate().
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsReadable extends Constraint
|
||||
{
|
||||
+1
-3
@@ -13,9 +13,7 @@ use function is_writable;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* Constraint that checks if the file/dir(name) that it is evaluated for is writable.
|
||||
*
|
||||
* The file path to check is passed as $other in evaluate().
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsWritable extends Constraint
|
||||
{
|
||||
@@ -12,7 +12,7 @@ namespace PHPUnit\Framework\Constraint;
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
/**
|
||||
* Constraint that accepts any input value.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsAnything extends Constraint
|
||||
{
|
||||
@@ -28,7 +28,7 @@ final class IsAnything extends Constraint
|
||||
*
|
||||
* @throws ExpectationFailedException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false)
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false): ?bool
|
||||
{
|
||||
return $returnResult ? true : null;
|
||||
}
|
||||
|
||||
@@ -22,15 +22,7 @@ use PHPUnit\Framework\ExpectationFailedException;
|
||||
use SebastianBergmann\Comparator\ComparisonFailure;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that one value is identical to another.
|
||||
*
|
||||
* Identical check is performed with PHP's === operator, the operator is
|
||||
* explained in detail at
|
||||
* {@url https://php.net/manual/en/types.comparisons.php}.
|
||||
* Two values are identical if they have the same value and are of the same
|
||||
* type.
|
||||
*
|
||||
* The expected value is passed in the constructor.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsIdentical extends Constraint
|
||||
{
|
||||
@@ -62,7 +54,7 @@ final class IsIdentical extends Constraint
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
* @throws ExpectationFailedException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false)
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false): ?bool
|
||||
{
|
||||
if (is_float($this->value) && is_float($other) &&
|
||||
!is_infinite($this->value) && !is_infinite($other) &&
|
||||
@@ -101,6 +93,8 @@ final class IsIdentical extends Constraint
|
||||
|
||||
$this->fail($other, $description, $f);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -16,7 +16,7 @@ use PHPUnit\Util\Json;
|
||||
use SebastianBergmann\Comparator\ComparisonFailure;
|
||||
|
||||
/**
|
||||
* Asserts whether or not two JSON objects are equal.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class JsonMatches extends Constraint
|
||||
{
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ use const JSON_ERROR_UTF8;
|
||||
use function strtolower;
|
||||
|
||||
/**
|
||||
* Provides human readable messages for each JSON error.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class JsonMatchesErrorMessageProvider
|
||||
{
|
||||
|
||||
@@ -1,121 +0,0 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function array_values;
|
||||
use function count;
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
/**
|
||||
* Logical AND.
|
||||
*/
|
||||
final class LogicalAnd extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var Constraint[]
|
||||
*/
|
||||
private $constraints = [];
|
||||
|
||||
public static function fromConstraints(Constraint ...$constraints): self
|
||||
{
|
||||
$constraint = new self;
|
||||
|
||||
$constraint->constraints = array_values($constraints);
|
||||
|
||||
return $constraint;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Constraint[] $constraints
|
||||
*
|
||||
* @throws \PHPUnit\Framework\Exception
|
||||
*/
|
||||
public function setConstraints(array $constraints): void
|
||||
{
|
||||
$this->constraints = [];
|
||||
|
||||
foreach ($constraints as $constraint) {
|
||||
if (!($constraint instanceof Constraint)) {
|
||||
throw new \PHPUnit\Framework\Exception(
|
||||
'All parameters to ' . __CLASS__ .
|
||||
' must be a constraint object.'
|
||||
);
|
||||
}
|
||||
|
||||
$this->constraints[] = $constraint;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other.
|
||||
*
|
||||
* If $returnResult is set to false (the default), an exception is thrown
|
||||
* in case of a failure. null is returned otherwise.
|
||||
*
|
||||
* If $returnResult is true, the result of the evaluation is returned as
|
||||
* a boolean value instead: true in case of success, false in case of a
|
||||
* failure.
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
* @throws ExpectationFailedException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false)
|
||||
{
|
||||
$success = true;
|
||||
|
||||
foreach ($this->constraints as $constraint) {
|
||||
if (!$constraint->evaluate($other, $description, true)) {
|
||||
$success = false;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($returnResult) {
|
||||
return $success;
|
||||
}
|
||||
|
||||
if (!$success) {
|
||||
$this->fail($other, $description);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
$text = '';
|
||||
|
||||
foreach ($this->constraints as $key => $constraint) {
|
||||
if ($key > 0) {
|
||||
$text .= ' and ';
|
||||
}
|
||||
|
||||
$text .= $constraint->toString();
|
||||
}
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
/**
|
||||
* Counts the number of constraint elements.
|
||||
*/
|
||||
public function count(): int
|
||||
{
|
||||
$count = 0;
|
||||
|
||||
foreach ($this->constraints as $constraint) {
|
||||
$count += count($constraint);
|
||||
}
|
||||
|
||||
return $count;
|
||||
}
|
||||
}
|
||||
@@ -1,169 +0,0 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function count;
|
||||
use function get_class;
|
||||
use function preg_match;
|
||||
use function str_replace;
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
/**
|
||||
* Logical NOT.
|
||||
*/
|
||||
final class LogicalNot extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var Constraint
|
||||
*/
|
||||
private $constraint;
|
||||
|
||||
public static function negate(string $string): string
|
||||
{
|
||||
$positives = [
|
||||
'contains ',
|
||||
'exists',
|
||||
'has ',
|
||||
'is ',
|
||||
'are ',
|
||||
'matches ',
|
||||
'starts with ',
|
||||
'ends with ',
|
||||
'reference ',
|
||||
'not not ',
|
||||
];
|
||||
|
||||
$negatives = [
|
||||
'does not contain ',
|
||||
'does not exist',
|
||||
'does not have ',
|
||||
'is not ',
|
||||
'are not ',
|
||||
'does not match ',
|
||||
'starts not with ',
|
||||
'ends not with ',
|
||||
'don\'t reference ',
|
||||
'not ',
|
||||
];
|
||||
|
||||
preg_match('/(\'[\w\W]*\')([\w\W]*)("[\w\W]*")/i', $string, $matches);
|
||||
|
||||
if (count($matches) > 0) {
|
||||
$nonInput = $matches[2];
|
||||
|
||||
$negatedString = str_replace(
|
||||
$nonInput,
|
||||
str_replace(
|
||||
$positives,
|
||||
$negatives,
|
||||
$nonInput
|
||||
),
|
||||
$string
|
||||
);
|
||||
} else {
|
||||
$negatedString = str_replace(
|
||||
$positives,
|
||||
$negatives,
|
||||
$string
|
||||
);
|
||||
}
|
||||
|
||||
return $negatedString;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Constraint|mixed $constraint
|
||||
*/
|
||||
public function __construct($constraint)
|
||||
{
|
||||
if (!($constraint instanceof Constraint)) {
|
||||
$constraint = new IsEqual($constraint);
|
||||
}
|
||||
|
||||
$this->constraint = $constraint;
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other.
|
||||
*
|
||||
* If $returnResult is set to false (the default), an exception is thrown
|
||||
* in case of a failure. null is returned otherwise.
|
||||
*
|
||||
* If $returnResult is true, the result of the evaluation is returned as
|
||||
* a boolean value instead: true in case of success, false in case of a
|
||||
* failure.
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
* @throws ExpectationFailedException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false)
|
||||
{
|
||||
$success = !$this->constraint->evaluate($other, $description, true);
|
||||
|
||||
if ($returnResult) {
|
||||
return $success;
|
||||
}
|
||||
|
||||
if (!$success) {
|
||||
$this->fail($other, $description);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
switch (get_class($this->constraint)) {
|
||||
case LogicalAnd::class:
|
||||
case self::class:
|
||||
case LogicalOr::class:
|
||||
return 'not( ' . $this->constraint->toString() . ' )';
|
||||
|
||||
default:
|
||||
return self::negate(
|
||||
$this->constraint->toString()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Counts the number of constraint elements.
|
||||
*/
|
||||
public function count(): int
|
||||
{
|
||||
return count($this->constraint);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the description of the failure.
|
||||
*
|
||||
* The beginning of failure messages is "Failed asserting that" in most
|
||||
* cases. This method should return the second part of that sentence.
|
||||
*
|
||||
* @param mixed $other evaluated value or object
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
*/
|
||||
protected function failureDescription($other): string
|
||||
{
|
||||
switch (get_class($this->constraint)) {
|
||||
case LogicalAnd::class:
|
||||
case self::class:
|
||||
case LogicalOr::class:
|
||||
return 'not( ' . $this->constraint->failureDescription($other) . ' )';
|
||||
|
||||
default:
|
||||
return self::negate(
|
||||
$this->constraint->failureDescription($other)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,118 +0,0 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function array_values;
|
||||
use function count;
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
/**
|
||||
* Logical OR.
|
||||
*/
|
||||
final class LogicalOr extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var Constraint[]
|
||||
*/
|
||||
private $constraints = [];
|
||||
|
||||
public static function fromConstraints(Constraint ...$constraints): self
|
||||
{
|
||||
$constraint = new self;
|
||||
|
||||
$constraint->constraints = array_values($constraints);
|
||||
|
||||
return $constraint;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Constraint[] $constraints
|
||||
*/
|
||||
public function setConstraints(array $constraints): void
|
||||
{
|
||||
$this->constraints = [];
|
||||
|
||||
foreach ($constraints as $constraint) {
|
||||
if (!($constraint instanceof Constraint)) {
|
||||
$constraint = new IsEqual(
|
||||
$constraint
|
||||
);
|
||||
}
|
||||
|
||||
$this->constraints[] = $constraint;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other.
|
||||
*
|
||||
* If $returnResult is set to false (the default), an exception is thrown
|
||||
* in case of a failure. null is returned otherwise.
|
||||
*
|
||||
* If $returnResult is true, the result of the evaluation is returned as
|
||||
* a boolean value instead: true in case of success, false in case of a
|
||||
* failure.
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
* @throws ExpectationFailedException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false)
|
||||
{
|
||||
$success = false;
|
||||
|
||||
foreach ($this->constraints as $constraint) {
|
||||
if ($constraint->evaluate($other, $description, true)) {
|
||||
$success = true;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($returnResult) {
|
||||
return $success;
|
||||
}
|
||||
|
||||
if (!$success) {
|
||||
$this->fail($other, $description);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
$text = '';
|
||||
|
||||
foreach ($this->constraints as $key => $constraint) {
|
||||
if ($key > 0) {
|
||||
$text .= ' or ';
|
||||
}
|
||||
|
||||
$text .= $constraint->toString();
|
||||
}
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
/**
|
||||
* Counts the number of constraint elements.
|
||||
*/
|
||||
public function count(): int
|
||||
{
|
||||
$count = 0;
|
||||
|
||||
foreach ($this->constraints as $constraint) {
|
||||
$count += count($constraint);
|
||||
}
|
||||
|
||||
return $count;
|
||||
}
|
||||
}
|
||||
@@ -1,123 +0,0 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function array_values;
|
||||
use function count;
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
/**
|
||||
* Logical XOR.
|
||||
*/
|
||||
final class LogicalXor extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var Constraint[]
|
||||
*/
|
||||
private $constraints = [];
|
||||
|
||||
public static function fromConstraints(Constraint ...$constraints): self
|
||||
{
|
||||
$constraint = new self;
|
||||
|
||||
$constraint->constraints = array_values($constraints);
|
||||
|
||||
return $constraint;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Constraint[] $constraints
|
||||
*/
|
||||
public function setConstraints(array $constraints): void
|
||||
{
|
||||
$this->constraints = [];
|
||||
|
||||
foreach ($constraints as $constraint) {
|
||||
if (!($constraint instanceof Constraint)) {
|
||||
$constraint = new IsEqual(
|
||||
$constraint
|
||||
);
|
||||
}
|
||||
|
||||
$this->constraints[] = $constraint;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other.
|
||||
*
|
||||
* If $returnResult is set to false (the default), an exception is thrown
|
||||
* in case of a failure. null is returned otherwise.
|
||||
*
|
||||
* If $returnResult is true, the result of the evaluation is returned as
|
||||
* a boolean value instead: true in case of success, false in case of a
|
||||
* failure.
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
* @throws ExpectationFailedException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false)
|
||||
{
|
||||
$success = true;
|
||||
$lastResult = null;
|
||||
|
||||
foreach ($this->constraints as $constraint) {
|
||||
$result = $constraint->evaluate($other, $description, true);
|
||||
|
||||
if ($result === $lastResult) {
|
||||
$success = false;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
$lastResult = $result;
|
||||
}
|
||||
|
||||
if ($returnResult) {
|
||||
return $success;
|
||||
}
|
||||
|
||||
if (!$success) {
|
||||
$this->fail($other, $description);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
$text = '';
|
||||
|
||||
foreach ($this->constraints as $key => $constraint) {
|
||||
if ($key > 0) {
|
||||
$text .= ' xor ';
|
||||
}
|
||||
|
||||
$text .= $constraint->toString();
|
||||
}
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
/**
|
||||
* Counts the number of constraint elements.
|
||||
*/
|
||||
public function count(): int
|
||||
{
|
||||
$count = 0;
|
||||
|
||||
foreach ($this->constraints as $constraint) {
|
||||
$count += count($constraint);
|
||||
}
|
||||
|
||||
return $count;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -12,7 +12,7 @@ namespace PHPUnit\Framework\Constraint;
|
||||
use function is_finite;
|
||||
|
||||
/**
|
||||
* Constraint that accepts finite.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsFinite extends Constraint
|
||||
{
|
||||
+1
-1
@@ -12,7 +12,7 @@ namespace PHPUnit\Framework\Constraint;
|
||||
use function is_infinite;
|
||||
|
||||
/**
|
||||
* Constraint that accepts infinite.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsInfinite extends Constraint
|
||||
{
|
||||
+1
-1
@@ -12,7 +12,7 @@ namespace PHPUnit\Framework\Constraint;
|
||||
use function is_nan;
|
||||
|
||||
/**
|
||||
* Constraint that accepts nan.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsNan extends Constraint
|
||||
{
|
||||
+1
-4
@@ -17,10 +17,7 @@ use ReflectionClass;
|
||||
use ReflectionException;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that the class it is evaluated for has a given
|
||||
* attribute.
|
||||
*
|
||||
* The attribute name is passed in the constructor.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
class ClassHasAttribute extends Constraint
|
||||
{
|
||||
+1
-4
@@ -15,10 +15,7 @@ use ReflectionClass;
|
||||
use ReflectionException;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that the class it is evaluated for has a given
|
||||
* static attribute.
|
||||
*
|
||||
* The attribute name is passed in the constructor.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ClassHasStaticAttribute extends ClassHasAttribute
|
||||
{
|
||||
@@ -0,0 +1,151 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function get_class;
|
||||
use function is_object;
|
||||
use PHPUnit\Framework\ActualValueIsNotAnObjectException;
|
||||
use PHPUnit\Framework\ComparisonMethodDoesNotAcceptParameterTypeException;
|
||||
use PHPUnit\Framework\ComparisonMethodDoesNotDeclareBoolReturnTypeException;
|
||||
use PHPUnit\Framework\ComparisonMethodDoesNotDeclareExactlyOneParameterException;
|
||||
use PHPUnit\Framework\ComparisonMethodDoesNotDeclareParameterTypeException;
|
||||
use PHPUnit\Framework\ComparisonMethodDoesNotExistException;
|
||||
use ReflectionNamedType;
|
||||
use ReflectionObject;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ObjectEquals extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var object
|
||||
*/
|
||||
private $expected;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $method;
|
||||
|
||||
public function __construct(object $object, string $method = 'equals')
|
||||
{
|
||||
$this->expected = $object;
|
||||
$this->method = $method;
|
||||
}
|
||||
|
||||
public function toString(): string
|
||||
{
|
||||
return 'two objects are equal';
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws ActualValueIsNotAnObjectException
|
||||
* @throws ComparisonMethodDoesNotAcceptParameterTypeException
|
||||
* @throws ComparisonMethodDoesNotDeclareBoolReturnTypeException
|
||||
* @throws ComparisonMethodDoesNotDeclareExactlyOneParameterException
|
||||
* @throws ComparisonMethodDoesNotDeclareParameterTypeException
|
||||
* @throws ComparisonMethodDoesNotExistException
|
||||
*/
|
||||
protected function matches($other): bool
|
||||
{
|
||||
if (!is_object($other)) {
|
||||
throw new ActualValueIsNotAnObjectException;
|
||||
}
|
||||
|
||||
$object = new ReflectionObject($other);
|
||||
|
||||
if (!$object->hasMethod($this->method)) {
|
||||
throw new ComparisonMethodDoesNotExistException(
|
||||
get_class($other),
|
||||
$this->method
|
||||
);
|
||||
}
|
||||
|
||||
/** @noinspection PhpUnhandledExceptionInspection */
|
||||
$method = $object->getMethod($this->method);
|
||||
|
||||
if (!$method->hasReturnType()) {
|
||||
throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException(
|
||||
get_class($other),
|
||||
$this->method
|
||||
);
|
||||
}
|
||||
|
||||
$returnType = $method->getReturnType();
|
||||
|
||||
if (!$returnType instanceof ReflectionNamedType) {
|
||||
throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException(
|
||||
get_class($other),
|
||||
$this->method
|
||||
);
|
||||
}
|
||||
|
||||
if ($returnType->allowsNull()) {
|
||||
throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException(
|
||||
get_class($other),
|
||||
$this->method
|
||||
);
|
||||
}
|
||||
|
||||
if ($returnType->getName() !== 'bool') {
|
||||
throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException(
|
||||
get_class($other),
|
||||
$this->method
|
||||
);
|
||||
}
|
||||
|
||||
if ($method->getNumberOfParameters() !== 1 || $method->getNumberOfRequiredParameters() !== 1) {
|
||||
throw new ComparisonMethodDoesNotDeclareExactlyOneParameterException(
|
||||
get_class($other),
|
||||
$this->method
|
||||
);
|
||||
}
|
||||
|
||||
$parameter = $method->getParameters()[0];
|
||||
|
||||
if (!$parameter->hasType()) {
|
||||
throw new ComparisonMethodDoesNotDeclareParameterTypeException(
|
||||
get_class($other),
|
||||
$this->method
|
||||
);
|
||||
}
|
||||
|
||||
$type = $parameter->getType();
|
||||
|
||||
if (!$type instanceof ReflectionNamedType) {
|
||||
throw new ComparisonMethodDoesNotDeclareParameterTypeException(
|
||||
get_class($other),
|
||||
$this->method
|
||||
);
|
||||
}
|
||||
|
||||
$typeName = $type->getName();
|
||||
|
||||
if ($typeName === 'self') {
|
||||
$typeName = get_class($other);
|
||||
}
|
||||
|
||||
if (!$this->expected instanceof $typeName) {
|
||||
throw new ComparisonMethodDoesNotAcceptParameterTypeException(
|
||||
get_class($other),
|
||||
$this->method,
|
||||
get_class($this->expected)
|
||||
);
|
||||
}
|
||||
|
||||
return $other->{$this->method}($this->expected);
|
||||
}
|
||||
|
||||
protected function failureDescription($other): string
|
||||
{
|
||||
return $this->toString();
|
||||
}
|
||||
}
|
||||
+1
-4
@@ -12,10 +12,7 @@ namespace PHPUnit\Framework\Constraint;
|
||||
use ReflectionObject;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that the object it is evaluated for has a given
|
||||
* attribute.
|
||||
*
|
||||
* The attribute name is passed in the constructor.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ObjectHasAttribute extends ClassHasAttribute
|
||||
{
|
||||
@@ -0,0 +1,147 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function array_map;
|
||||
use function array_values;
|
||||
use function count;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
abstract class BinaryOperator extends Operator
|
||||
{
|
||||
/**
|
||||
* @var Constraint[]
|
||||
*/
|
||||
private $constraints = [];
|
||||
|
||||
public static function fromConstraints(Constraint ...$constraints): self
|
||||
{
|
||||
$constraint = new static;
|
||||
|
||||
$constraint->constraints = $constraints;
|
||||
|
||||
return $constraint;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed[] $constraints
|
||||
*/
|
||||
public function setConstraints(array $constraints): void
|
||||
{
|
||||
$this->constraints = array_map(function ($constraint): Constraint {
|
||||
return $this->checkConstraint($constraint);
|
||||
}, array_values($constraints));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of operands (constraints).
|
||||
*/
|
||||
final public function arity(): int
|
||||
{
|
||||
return count($this->constraints);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
$reduced = $this->reduce();
|
||||
|
||||
if ($reduced !== $this) {
|
||||
return $reduced->toString();
|
||||
}
|
||||
|
||||
$text = '';
|
||||
|
||||
foreach ($this->constraints as $key => $constraint) {
|
||||
$constraint = $constraint->reduce();
|
||||
|
||||
$text .= $this->constraintToString($constraint, $key);
|
||||
}
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
/**
|
||||
* Counts the number of constraint elements.
|
||||
*/
|
||||
public function count(): int
|
||||
{
|
||||
$count = 0;
|
||||
|
||||
foreach ($this->constraints as $constraint) {
|
||||
$count += count($constraint);
|
||||
}
|
||||
|
||||
return $count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the nested constraints.
|
||||
*/
|
||||
final protected function constraints(): array
|
||||
{
|
||||
return $this->constraints;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the $constraint needs to be wrapped with braces.
|
||||
*/
|
||||
final protected function constraintNeedsParentheses(Constraint $constraint): bool
|
||||
{
|
||||
return $this->arity() > 1 && parent::constraintNeedsParentheses($constraint);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reduces the sub-expression starting at $this by skipping degenerate
|
||||
* sub-expression and returns first descendant constraint that starts
|
||||
* a non-reducible sub-expression.
|
||||
*
|
||||
* See Constraint::reduce() for more.
|
||||
*/
|
||||
protected function reduce(): Constraint
|
||||
{
|
||||
if ($this->arity() === 1 && $this->constraints[0] instanceof Operator) {
|
||||
return $this->constraints[0]->reduce();
|
||||
}
|
||||
|
||||
return parent::reduce();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation of given operand in context of this operator.
|
||||
*
|
||||
* @param Constraint $constraint operand constraint
|
||||
* @param int $position position of $constraint in this expression
|
||||
*/
|
||||
private function constraintToString(Constraint $constraint, int $position): string
|
||||
{
|
||||
$prefix = '';
|
||||
|
||||
if ($position > 0) {
|
||||
$prefix = (' ' . $this->operator() . ' ');
|
||||
}
|
||||
|
||||
if ($this->constraintNeedsParentheses($constraint)) {
|
||||
return $prefix . '( ' . $constraint->toString() . ' )';
|
||||
}
|
||||
|
||||
$string = $constraint->toStringInContext($this, $position);
|
||||
|
||||
if ($string === '') {
|
||||
$string = $constraint->toString();
|
||||
}
|
||||
|
||||
return $prefix . $string;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class LogicalAnd extends BinaryOperator
|
||||
{
|
||||
/**
|
||||
* Returns the name of this operator.
|
||||
*/
|
||||
public function operator(): string
|
||||
{
|
||||
return 'and';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns this operator's precedence.
|
||||
*
|
||||
* @see https://www.php.net/manual/en/language.operators.precedence.php
|
||||
*/
|
||||
public function precedence(): int
|
||||
{
|
||||
return 22;
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other. Returns true if the
|
||||
* constraint is met, false otherwise.
|
||||
*
|
||||
* @param mixed $other value or object to evaluate
|
||||
*/
|
||||
protected function matches($other): bool
|
||||
{
|
||||
foreach ($this->constraints() as $constraint) {
|
||||
if (!$constraint->evaluate($other, '', true)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return [] !== $this->constraints();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function array_map;
|
||||
use function count;
|
||||
use function preg_match;
|
||||
use function preg_quote;
|
||||
use function preg_replace;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class LogicalNot extends UnaryOperator
|
||||
{
|
||||
public static function negate(string $string): string
|
||||
{
|
||||
$positives = [
|
||||
'contains ',
|
||||
'exists',
|
||||
'has ',
|
||||
'is ',
|
||||
'are ',
|
||||
'matches ',
|
||||
'starts with ',
|
||||
'ends with ',
|
||||
'reference ',
|
||||
'not not ',
|
||||
];
|
||||
|
||||
$negatives = [
|
||||
'does not contain ',
|
||||
'does not exist',
|
||||
'does not have ',
|
||||
'is not ',
|
||||
'are not ',
|
||||
'does not match ',
|
||||
'starts not with ',
|
||||
'ends not with ',
|
||||
'don\'t reference ',
|
||||
'not ',
|
||||
];
|
||||
|
||||
preg_match('/(\'[\w\W]*\')([\w\W]*)("[\w\W]*")/i', $string, $matches);
|
||||
|
||||
$positives = array_map(static function (string $s) {
|
||||
return '/\\b' . preg_quote($s, '/') . '/';
|
||||
}, $positives);
|
||||
|
||||
if (count($matches) > 0) {
|
||||
$nonInput = $matches[2];
|
||||
|
||||
$negatedString = preg_replace(
|
||||
'/' . preg_quote($nonInput, '/') . '/',
|
||||
preg_replace(
|
||||
$positives,
|
||||
$negatives,
|
||||
$nonInput
|
||||
),
|
||||
$string
|
||||
);
|
||||
} else {
|
||||
$negatedString = preg_replace(
|
||||
$positives,
|
||||
$negatives,
|
||||
$string
|
||||
);
|
||||
}
|
||||
|
||||
return $negatedString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of this operator.
|
||||
*/
|
||||
public function operator(): string
|
||||
{
|
||||
return 'not';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns this operator's precedence.
|
||||
*
|
||||
* @see https://www.php.net/manual/en/language.operators.precedence.php
|
||||
*/
|
||||
public function precedence(): int
|
||||
{
|
||||
return 5;
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other. Returns true if the
|
||||
* constraint is met, false otherwise.
|
||||
*
|
||||
* @param mixed $other value or object to evaluate
|
||||
*/
|
||||
protected function matches($other): bool
|
||||
{
|
||||
return !$this->constraint()->evaluate($other, '', true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies additional transformation to strings returned by toString() or
|
||||
* failureDescription().
|
||||
*/
|
||||
protected function transformString(string $string): string
|
||||
{
|
||||
return self::negate($string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reduces the sub-expression starting at $this by skipping degenerate
|
||||
* sub-expression and returns first descendant constraint that starts
|
||||
* a non-reducible sub-expression.
|
||||
*
|
||||
* See Constraint::reduce() for more.
|
||||
*/
|
||||
protected function reduce(): Constraint
|
||||
{
|
||||
$constraint = $this->constraint();
|
||||
|
||||
if ($constraint instanceof self) {
|
||||
return $constraint->constraint()->reduce();
|
||||
}
|
||||
|
||||
return parent::reduce();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class LogicalOr extends BinaryOperator
|
||||
{
|
||||
/**
|
||||
* Returns the name of this operator.
|
||||
*/
|
||||
public function operator(): string
|
||||
{
|
||||
return 'or';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns this operator's precedence.
|
||||
*
|
||||
* @see https://www.php.net/manual/en/language.operators.precedence.php
|
||||
*/
|
||||
public function precedence(): int
|
||||
{
|
||||
return 24;
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other. Returns true if the
|
||||
* constraint is met, false otherwise.
|
||||
*
|
||||
* @param mixed $other value or object to evaluate
|
||||
*/
|
||||
public function matches($other): bool
|
||||
{
|
||||
foreach ($this->constraints() as $constraint) {
|
||||
if ($constraint->evaluate($other, '', true)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function array_reduce;
|
||||
use function array_shift;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class LogicalXor extends BinaryOperator
|
||||
{
|
||||
/**
|
||||
* Returns the name of this operator.
|
||||
*/
|
||||
public function operator(): string
|
||||
{
|
||||
return 'xor';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns this operator's precedence.
|
||||
*
|
||||
* @see https://www.php.net/manual/en/language.operators.precedence.php.
|
||||
*/
|
||||
public function precedence(): int
|
||||
{
|
||||
return 23;
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other. Returns true if the
|
||||
* constraint is met, false otherwise.
|
||||
*
|
||||
* @param mixed $other value or object to evaluate
|
||||
*/
|
||||
public function matches($other): bool
|
||||
{
|
||||
$constraints = $this->constraints();
|
||||
|
||||
$initial = array_shift($constraints);
|
||||
|
||||
if ($initial === null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return array_reduce(
|
||||
$constraints,
|
||||
static function (bool $matches, Constraint $constraint) use ($other): bool {
|
||||
return $matches xor $constraint->evaluate($other, '', true);
|
||||
},
|
||||
$initial->evaluate($other, '', true)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
abstract class Operator extends Constraint
|
||||
{
|
||||
/**
|
||||
* Returns the name of this operator.
|
||||
*/
|
||||
abstract public function operator(): string;
|
||||
|
||||
/**
|
||||
* Returns this operator's precedence.
|
||||
*
|
||||
* @see https://www.php.net/manual/en/language.operators.precedence.php
|
||||
*/
|
||||
abstract public function precedence(): int;
|
||||
|
||||
/**
|
||||
* Returns the number of operands.
|
||||
*/
|
||||
abstract public function arity(): int;
|
||||
|
||||
/**
|
||||
* Validates $constraint argument.
|
||||
*/
|
||||
protected function checkConstraint($constraint): Constraint
|
||||
{
|
||||
if (!$constraint instanceof Constraint) {
|
||||
return new IsEqual($constraint);
|
||||
}
|
||||
|
||||
return $constraint;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the $constraint needs to be wrapped with braces.
|
||||
*/
|
||||
protected function constraintNeedsParentheses(Constraint $constraint): bool
|
||||
{
|
||||
return $constraint instanceof self &&
|
||||
$constraint->arity() > 1 &&
|
||||
$this->precedence() <= $constraint->precedence();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,140 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function count;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
abstract class UnaryOperator extends Operator
|
||||
{
|
||||
/**
|
||||
* @var Constraint
|
||||
*/
|
||||
private $constraint;
|
||||
|
||||
/**
|
||||
* @param Constraint|mixed $constraint
|
||||
*/
|
||||
public function __construct($constraint)
|
||||
{
|
||||
$this->constraint = $this->checkConstraint($constraint);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of operands (constraints).
|
||||
*/
|
||||
public function arity(): int
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
$reduced = $this->reduce();
|
||||
|
||||
if ($reduced !== $this) {
|
||||
return $reduced->toString();
|
||||
}
|
||||
|
||||
$constraint = $this->constraint->reduce();
|
||||
|
||||
if ($this->constraintNeedsParentheses($constraint)) {
|
||||
return $this->operator() . '( ' . $constraint->toString() . ' )';
|
||||
}
|
||||
|
||||
$string = $constraint->toStringInContext($this, 0);
|
||||
|
||||
if ($string === '') {
|
||||
return $this->transformString($constraint->toString());
|
||||
}
|
||||
|
||||
return $string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Counts the number of constraint elements.
|
||||
*/
|
||||
public function count(): int
|
||||
{
|
||||
return count($this->constraint);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the description of the failure.
|
||||
*
|
||||
* The beginning of failure messages is "Failed asserting that" in most
|
||||
* cases. This method should return the second part of that sentence.
|
||||
*
|
||||
* @param mixed $other evaluated value or object
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
*/
|
||||
protected function failureDescription($other): string
|
||||
{
|
||||
$reduced = $this->reduce();
|
||||
|
||||
if ($reduced !== $this) {
|
||||
return $reduced->failureDescription($other);
|
||||
}
|
||||
|
||||
$constraint = $this->constraint->reduce();
|
||||
|
||||
if ($this->constraintNeedsParentheses($constraint)) {
|
||||
return $this->operator() . '( ' . $constraint->failureDescription($other) . ' )';
|
||||
}
|
||||
|
||||
$string = $constraint->failureDescriptionInContext($this, 0, $other);
|
||||
|
||||
if ($string === '') {
|
||||
return $this->transformString($constraint->failureDescription($other));
|
||||
}
|
||||
|
||||
return $string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Transforms string returned by the memeber constraint's toString() or
|
||||
* failureDescription() such that it reflects constraint's participation in
|
||||
* this expression.
|
||||
*
|
||||
* The method may be overwritten in a subclass to apply default
|
||||
* transformation in case the operand constraint does not provide its own
|
||||
* custom strings via toStringInContext() or failureDescriptionInContext().
|
||||
*
|
||||
* @param string $string the string to be transformed
|
||||
*/
|
||||
protected function transformString(string $string): string
|
||||
{
|
||||
return $string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides access to $this->constraint for subclasses.
|
||||
*/
|
||||
final protected function constraint(): Constraint
|
||||
{
|
||||
return $this->constraint;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the $constraint needs to be wrapped with parentheses.
|
||||
*/
|
||||
protected function constraintNeedsParentheses(Constraint $constraint): bool
|
||||
{
|
||||
$constraint = $constraint->reduce();
|
||||
|
||||
return $constraint instanceof self || parent::constraintNeedsParentheses($constraint);
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -14,7 +14,7 @@ use function json_last_error;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that a string is valid JSON.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsJson extends Constraint
|
||||
{
|
||||
@@ -64,7 +64,7 @@ final class IsJson extends Constraint
|
||||
}
|
||||
|
||||
json_decode($other);
|
||||
$error = JsonMatchesErrorMessageProvider::determineJsonError(
|
||||
$error = (string) JsonMatchesErrorMessageProvider::determineJsonError(
|
||||
(string) json_last_error()
|
||||
);
|
||||
|
||||
+1
-7
@@ -13,13 +13,7 @@ use function preg_match;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that the string it is evaluated for matches
|
||||
* a regular expression.
|
||||
*
|
||||
* Checks a given value using the Perl Compatible Regular Expression extension
|
||||
* in PHP. The pattern is matched by executing preg_match().
|
||||
*
|
||||
* The pattern string passed in the constructor.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
class RegularExpression extends Constraint
|
||||
{
|
||||
+17
-11
@@ -10,18 +10,12 @@
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function mb_stripos;
|
||||
use function mb_strpos;
|
||||
use function mb_strtolower;
|
||||
use function sprintf;
|
||||
use function strpos;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that the string it is evaluated for contains
|
||||
* a given string.
|
||||
*
|
||||
* Uses mb_strpos() to find the position of the string in the input, if not
|
||||
* found the evaluation fails.
|
||||
*
|
||||
* The sub-string is passed in the constructor.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class StringContains extends Constraint
|
||||
{
|
||||
@@ -47,7 +41,7 @@ final class StringContains extends Constraint
|
||||
public function toString(): string
|
||||
{
|
||||
if ($this->ignoreCase) {
|
||||
$string = mb_strtolower($this->string);
|
||||
$string = mb_strtolower($this->string, 'UTF-8');
|
||||
} else {
|
||||
$string = $this->string;
|
||||
}
|
||||
@@ -71,9 +65,21 @@ final class StringContains extends Constraint
|
||||
}
|
||||
|
||||
if ($this->ignoreCase) {
|
||||
return mb_stripos($other, $this->string) !== false;
|
||||
/*
|
||||
* We must use the multi byte safe version so we can accurately compare non latin upper characters with
|
||||
* their lowercase equivalents.
|
||||
*/
|
||||
return mb_stripos($other, $this->string, 0, 'UTF-8') !== false;
|
||||
}
|
||||
|
||||
return mb_strpos($other, $this->string) !== false;
|
||||
/*
|
||||
* Use the non multi byte safe functions to see if the string is contained in $other.
|
||||
*
|
||||
* This function is very fast and we don't care about the character position in the string.
|
||||
*
|
||||
* Additionally, we want this method to be binary safe so we can check if some binary data is in other binary
|
||||
* data.
|
||||
*/
|
||||
return strpos($other, $this->string) !== false;
|
||||
}
|
||||
}
|
||||
+1
-2
@@ -13,8 +13,7 @@ use function strlen;
|
||||
use function substr;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that the string it is evaluated for ends with a given
|
||||
* suffix.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class StringEndsWith extends Constraint
|
||||
{
|
||||
+4
-3
@@ -17,9 +17,10 @@ use function preg_quote;
|
||||
use function preg_replace;
|
||||
use function strtr;
|
||||
use SebastianBergmann\Diff\Differ;
|
||||
use SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder;
|
||||
|
||||
/**
|
||||
* ...
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class StringMatchesFormatDescription extends RegularExpression
|
||||
{
|
||||
@@ -75,7 +76,7 @@ final class StringMatchesFormatDescription extends RegularExpression
|
||||
$this->string = implode("\n", $from);
|
||||
$other = implode("\n", $to);
|
||||
|
||||
return (new Differ("--- Expected\n+++ Actual\n"))->diff($this->string, $other);
|
||||
return (new Differ(new UnifiedDiffOutputBuilder("--- Expected\n+++ Actual\n")))->diff($this->string, $other);
|
||||
}
|
||||
|
||||
private function createPatternFromFormat(string $string): string
|
||||
@@ -101,7 +102,7 @@ final class StringMatchesFormatDescription extends RegularExpression
|
||||
return '/^' . $string . '$/s';
|
||||
}
|
||||
|
||||
private function convertNewlines($text): string
|
||||
private function convertNewlines(string $text): string
|
||||
{
|
||||
return preg_replace('/\r\n/', "\n", $text);
|
||||
}
|
||||
+1
-2
@@ -14,8 +14,7 @@ use function strpos;
|
||||
use PHPUnit\Framework\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that the string it is evaluated for begins with a
|
||||
* given prefix.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class StringStartsWith extends Constraint
|
||||
{
|
||||
+1
-6
@@ -14,12 +14,7 @@ use function is_array;
|
||||
use ArrayAccess;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that the array it is evaluated for has a given key.
|
||||
*
|
||||
* Uses array_key_exists() to check if the key is found in the input array, if
|
||||
* not found the evaluation fails.
|
||||
*
|
||||
* The array key is passed in the constructor.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ArrayHasKey extends Constraint
|
||||
{
|
||||
+7
-31
@@ -10,16 +10,12 @@
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function is_array;
|
||||
use function is_string;
|
||||
use function sprintf;
|
||||
use function strpos;
|
||||
use SplObjectStorage;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that the Traversable it is applied to contains
|
||||
* a given value (using strict comparison).
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class TraversableContainsIdentical extends Constraint
|
||||
abstract class TraversableContains extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var mixed
|
||||
@@ -38,34 +34,9 @@ final class TraversableContainsIdentical extends Constraint
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
if (is_string($this->value) && strpos($this->value, "\n") !== false) {
|
||||
return 'contains "' . $this->value . '"';
|
||||
}
|
||||
|
||||
return 'contains ' . $this->exporter()->export($this->value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other. Returns true if the
|
||||
* constraint is met, false otherwise.
|
||||
*
|
||||
* @param mixed $other value or object to evaluate
|
||||
*/
|
||||
protected function matches($other): bool
|
||||
{
|
||||
if ($other instanceof SplObjectStorage) {
|
||||
return $other->contains($this->value);
|
||||
}
|
||||
|
||||
foreach ($other as $element) {
|
||||
if ($this->value === $element) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the description of the failure.
|
||||
*
|
||||
@@ -84,4 +55,9 @@ final class TraversableContainsIdentical extends Constraint
|
||||
$this->toString()
|
||||
);
|
||||
}
|
||||
|
||||
protected function value()
|
||||
{
|
||||
return $this->value;
|
||||
}
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use SplObjectStorage;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class TraversableContainsEqual extends TraversableContains
|
||||
{
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other. Returns true if the
|
||||
* constraint is met, false otherwise.
|
||||
*
|
||||
* @param mixed $other value or object to evaluate
|
||||
*/
|
||||
protected function matches($other): bool
|
||||
{
|
||||
if ($other instanceof SplObjectStorage) {
|
||||
return $other->contains($this->value());
|
||||
}
|
||||
|
||||
foreach ($other as $element) {
|
||||
/* @noinspection TypeUnsafeComparisonInspection */
|
||||
if ($this->value() == $element) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Vendored
+39
@@ -0,0 +1,39 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use SplObjectStorage;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class TraversableContainsIdentical extends TraversableContains
|
||||
{
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other. Returns true if the
|
||||
* constraint is met, false otherwise.
|
||||
*
|
||||
* @param mixed $other value or object to evaluate
|
||||
*/
|
||||
protected function matches($other): bool
|
||||
{
|
||||
if ($other instanceof SplObjectStorage) {
|
||||
return $other->contains($this->value());
|
||||
}
|
||||
|
||||
foreach ($other as $element) {
|
||||
if ($this->value() === $element) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+7
-3
@@ -10,10 +10,10 @@
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
use Traversable;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that the Traversable it is applied to contains
|
||||
* only values of a given type.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class TraversableContainsOnly extends Constraint
|
||||
{
|
||||
@@ -53,10 +53,12 @@ final class TraversableContainsOnly extends Constraint
|
||||
* a boolean value instead: true in case of success, false in case of a
|
||||
* failure.
|
||||
*
|
||||
* @param mixed|Traversable $other
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
* @throws ExpectationFailedException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false)
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false): ?bool
|
||||
{
|
||||
$success = true;
|
||||
|
||||
@@ -75,6 +77,8 @@ final class TraversableContainsOnly extends Constraint
|
||||
if (!$success) {
|
||||
$this->fail($other, $description);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1,120 +0,0 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function is_array;
|
||||
use function is_object;
|
||||
use function is_string;
|
||||
use function sprintf;
|
||||
use function strpos;
|
||||
use SplObjectStorage;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that the Traversable it is applied to contains
|
||||
* a given value.
|
||||
*
|
||||
* @deprecated Use TraversableContainsEqual or TraversableContainsIdentical instead
|
||||
*/
|
||||
final class TraversableContains extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $checkForObjectIdentity;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $checkForNonObjectIdentity;
|
||||
|
||||
/**
|
||||
* @var mixed
|
||||
*/
|
||||
private $value;
|
||||
|
||||
public function __construct($value, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false)
|
||||
{
|
||||
$this->checkForObjectIdentity = $checkForObjectIdentity;
|
||||
$this->checkForNonObjectIdentity = $checkForNonObjectIdentity;
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
if (is_string($this->value) && strpos($this->value, "\n") !== false) {
|
||||
return 'contains "' . $this->value . '"';
|
||||
}
|
||||
|
||||
return 'contains ' . $this->exporter()->export($this->value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other. Returns true if the
|
||||
* constraint is met, false otherwise.
|
||||
*
|
||||
* @param mixed $other value or object to evaluate
|
||||
*/
|
||||
protected function matches($other): bool
|
||||
{
|
||||
if ($other instanceof SplObjectStorage) {
|
||||
return $other->contains($this->value);
|
||||
}
|
||||
|
||||
if (is_object($this->value)) {
|
||||
foreach ($other as $element) {
|
||||
if ($this->checkForObjectIdentity && $element === $this->value) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/* @noinspection TypeUnsafeComparisonInspection */
|
||||
if (!$this->checkForObjectIdentity && $element == $this->value) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
foreach ($other as $element) {
|
||||
if ($this->checkForNonObjectIdentity && $element === $this->value) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/* @noinspection TypeUnsafeComparisonInspection */
|
||||
if (!$this->checkForNonObjectIdentity && $element == $this->value) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the description of the failure.
|
||||
*
|
||||
* The beginning of failure messages is "Failed asserting that" in most
|
||||
* cases. This method should return the second part of that sentence.
|
||||
*
|
||||
* @param mixed $other evaluated value or object
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
*/
|
||||
protected function failureDescription($other): string
|
||||
{
|
||||
return sprintf(
|
||||
'%s %s',
|
||||
is_array($other) ? 'an array' : 'a traversable',
|
||||
$this->toString()
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function is_array;
|
||||
use function is_string;
|
||||
use function sprintf;
|
||||
use function strpos;
|
||||
use SplObjectStorage;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that the Traversable it is applied to contains
|
||||
* a given value (using non-strict comparison).
|
||||
*/
|
||||
final class TraversableContainsEqual extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var mixed
|
||||
*/
|
||||
private $value;
|
||||
|
||||
public function __construct($value)
|
||||
{
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
if (is_string($this->value) && strpos($this->value, "\n") !== false) {
|
||||
return 'contains "' . $this->value . '"';
|
||||
}
|
||||
|
||||
return 'contains ' . $this->exporter()->export($this->value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other. Returns true if the
|
||||
* constraint is met, false otherwise.
|
||||
*
|
||||
* @param mixed $other value or object to evaluate
|
||||
*/
|
||||
protected function matches($other): bool
|
||||
{
|
||||
if ($other instanceof SplObjectStorage) {
|
||||
return $other->contains($this->value);
|
||||
}
|
||||
|
||||
foreach ($other as $element) {
|
||||
/* @noinspection TypeUnsafeComparisonInspection */
|
||||
if ($this->value == $element) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the description of the failure.
|
||||
*
|
||||
* The beginning of failure messages is "Failed asserting that" in most
|
||||
* cases. This method should return the second part of that sentence.
|
||||
*
|
||||
* @param mixed $other evaluated value or object
|
||||
*
|
||||
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
|
||||
*/
|
||||
protected function failureDescription($other): string
|
||||
{
|
||||
return sprintf(
|
||||
'%s %s',
|
||||
is_array($other) ? 'an array' : 'a traversable',
|
||||
$this->toString()
|
||||
);
|
||||
}
|
||||
}
|
||||
+1
-4
@@ -14,10 +14,7 @@ use ReflectionClass;
|
||||
use ReflectionException;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that the object it is evaluated for is an instance
|
||||
* of a given class.
|
||||
*
|
||||
* The expected class name is passed in the constructor.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsInstanceOf extends Constraint
|
||||
{
|
||||
+1
-1
@@ -10,7 +10,7 @@
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
/**
|
||||
* Constraint that accepts null.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsNull extends Constraint
|
||||
{
|
||||
+31
-35
@@ -9,7 +9,7 @@
|
||||
*/
|
||||
namespace PHPUnit\Framework\Constraint;
|
||||
|
||||
use function get_resource_type;
|
||||
use function gettype;
|
||||
use function is_array;
|
||||
use function is_bool;
|
||||
use function is_callable;
|
||||
@@ -18,17 +18,12 @@ use function is_int;
|
||||
use function is_iterable;
|
||||
use function is_numeric;
|
||||
use function is_object;
|
||||
use function is_resource;
|
||||
use function is_scalar;
|
||||
use function is_string;
|
||||
use function sprintf;
|
||||
use TypeError;
|
||||
|
||||
/**
|
||||
* Constraint that asserts that the value it is evaluated for is of a
|
||||
* specified type.
|
||||
*
|
||||
* The expected value is passed in the constructor.
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsType extends Constraint
|
||||
{
|
||||
@@ -72,6 +67,11 @@ final class IsType extends Constraint
|
||||
*/
|
||||
public const TYPE_RESOURCE = 'resource';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const TYPE_CLOSED_RESOURCE = 'resource (closed)';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
@@ -96,22 +96,23 @@ final class IsType extends Constraint
|
||||
* @var array<string,bool>
|
||||
*/
|
||||
private const KNOWN_TYPES = [
|
||||
'array' => true,
|
||||
'boolean' => true,
|
||||
'bool' => true,
|
||||
'double' => true,
|
||||
'float' => true,
|
||||
'integer' => true,
|
||||
'int' => true,
|
||||
'null' => true,
|
||||
'numeric' => true,
|
||||
'object' => true,
|
||||
'real' => true,
|
||||
'resource' => true,
|
||||
'string' => true,
|
||||
'scalar' => true,
|
||||
'callable' => true,
|
||||
'iterable' => true,
|
||||
'array' => true,
|
||||
'boolean' => true,
|
||||
'bool' => true,
|
||||
'double' => true,
|
||||
'float' => true,
|
||||
'integer' => true,
|
||||
'int' => true,
|
||||
'null' => true,
|
||||
'numeric' => true,
|
||||
'object' => true,
|
||||
'real' => true,
|
||||
'resource' => true,
|
||||
'resource (closed)' => true,
|
||||
'string' => true,
|
||||
'scalar' => true,
|
||||
'callable' => true,
|
||||
'iterable' => true,
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -186,20 +187,12 @@ final class IsType extends Constraint
|
||||
return is_object($other);
|
||||
|
||||
case 'resource':
|
||||
if (is_resource($other)) {
|
||||
return true;
|
||||
}
|
||||
$type = gettype($other);
|
||||
|
||||
try {
|
||||
$resource = @get_resource_type($other);
|
||||
return $type === 'resource' || $type === 'resource (closed)';
|
||||
|
||||
if (is_string($resource)) {
|
||||
return true;
|
||||
}
|
||||
} catch (TypeError $e) {
|
||||
}
|
||||
|
||||
return false;
|
||||
case 'resource (closed)':
|
||||
return gettype($other) === 'resource (closed)';
|
||||
|
||||
case 'scalar':
|
||||
return is_scalar($other);
|
||||
@@ -209,6 +202,9 @@ final class IsType extends Constraint
|
||||
|
||||
case 'iterable':
|
||||
return is_iterable($other);
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,6 @@
|
||||
*/
|
||||
namespace PHPUnit\Framework;
|
||||
|
||||
use function count;
|
||||
use function explode;
|
||||
use PHPUnit\Util\Test as TestUtil;
|
||||
|
||||
@@ -19,12 +18,12 @@ use PHPUnit\Util\Test as TestUtil;
|
||||
final class DataProviderTestSuite extends TestSuite
|
||||
{
|
||||
/**
|
||||
* @var string[]
|
||||
* @var list<ExecutionOrderDependency>
|
||||
*/
|
||||
private $dependencies = [];
|
||||
|
||||
/**
|
||||
* @param string[] $dependencies
|
||||
* @param list<ExecutionOrderDependency> $dependencies
|
||||
*/
|
||||
public function setDependencies(array $dependencies): void
|
||||
{
|
||||
@@ -32,21 +31,34 @@ final class DataProviderTestSuite extends TestSuite
|
||||
|
||||
foreach ($this->tests as $test) {
|
||||
if (!$test instanceof TestCase) {
|
||||
// @codeCoverageIgnoreStart
|
||||
continue;
|
||||
// @codeCoverageIgnoreStart
|
||||
}
|
||||
|
||||
$test->setDependencies($dependencies);
|
||||
}
|
||||
}
|
||||
|
||||
public function getDependencies(): array
|
||||
/**
|
||||
* @return list<ExecutionOrderDependency>
|
||||
*/
|
||||
public function provides(): array
|
||||
{
|
||||
return $this->dependencies;
|
||||
if ($this->providedTests === null) {
|
||||
$this->providedTests = [new ExecutionOrderDependency($this->getName())];
|
||||
}
|
||||
|
||||
return $this->providedTests;
|
||||
}
|
||||
|
||||
public function hasDependencies(): bool
|
||||
/**
|
||||
* @return list<ExecutionOrderDependency>
|
||||
*/
|
||||
public function requires(): array
|
||||
{
|
||||
return count($this->dependencies) > 0;
|
||||
// A DataProviderTestSuite does not have to traverse its child tests
|
||||
// as these are inherited and cannot reference dataProvider rows directly
|
||||
return $this->dependencies;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
*/
|
||||
namespace PHPUnit\Framework\Error;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class Deprecated extends Error
|
||||
{
|
||||
}
|
||||
|
||||
@@ -11,6 +11,9 @@ namespace PHPUnit\Framework\Error;
|
||||
|
||||
use PHPUnit\Framework\Exception;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
class Error extends Exception
|
||||
{
|
||||
public function __construct(string $message, int $code, string $file, int $line, \Exception $previous = null)
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
*/
|
||||
namespace PHPUnit\Framework\Error;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class Notice extends Error
|
||||
{
|
||||
}
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
*/
|
||||
namespace PHPUnit\Framework\Error;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class Warning extends Error
|
||||
{
|
||||
}
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ErrorTestCase extends TestCase
|
||||
{
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
protected $backupGlobals = false;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
protected $backupStaticAttributes = false;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
protected $runTestInSeparateProcess = false;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $message;
|
||||
|
||||
public function __construct(string $message = '')
|
||||
{
|
||||
$this->message = $message;
|
||||
|
||||
parent::__construct('Error');
|
||||
}
|
||||
|
||||
public function getMessage(): string
|
||||
{
|
||||
return $this->message;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the test case.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'Error';
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*
|
||||
* @psalm-return never-return
|
||||
*/
|
||||
protected function runTest(): void
|
||||
{
|
||||
throw new Error($this->message);
|
||||
}
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework;
|
||||
|
||||
use const PHP_EOL;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ActualValueIsNotAnObjectException extends Exception
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(
|
||||
'Actual value is not an object',
|
||||
0,
|
||||
null
|
||||
);
|
||||
}
|
||||
|
||||
public function __toString(): string
|
||||
{
|
||||
return $this->getMessage() . PHP_EOL;
|
||||
}
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework;
|
||||
|
||||
use const PHP_EOL;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ComparisonMethodDoesNotAcceptParameterTypeException extends Exception
|
||||
{
|
||||
public function __construct(string $className, string $methodName, string $type)
|
||||
{
|
||||
parent::__construct(
|
||||
sprintf(
|
||||
'%s is not an accepted argument type for comparison method %s::%s().',
|
||||
$type,
|
||||
$className,
|
||||
$methodName
|
||||
),
|
||||
0,
|
||||
null
|
||||
);
|
||||
}
|
||||
|
||||
public function __toString(): string
|
||||
{
|
||||
return $this->getMessage() . PHP_EOL;
|
||||
}
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework;
|
||||
|
||||
use const PHP_EOL;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ComparisonMethodDoesNotDeclareBoolReturnTypeException extends Exception
|
||||
{
|
||||
public function __construct(string $className, string $methodName)
|
||||
{
|
||||
parent::__construct(
|
||||
sprintf(
|
||||
'Comparison method %s::%s() does not declare bool return type.',
|
||||
$className,
|
||||
$methodName
|
||||
),
|
||||
0,
|
||||
null
|
||||
);
|
||||
}
|
||||
|
||||
public function __toString(): string
|
||||
{
|
||||
return $this->getMessage() . PHP_EOL;
|
||||
}
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework;
|
||||
|
||||
use const PHP_EOL;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ComparisonMethodDoesNotDeclareExactlyOneParameterException extends Exception
|
||||
{
|
||||
public function __construct(string $className, string $methodName)
|
||||
{
|
||||
parent::__construct(
|
||||
sprintf(
|
||||
'Comparison method %s::%s() does not declare exactly one parameter.',
|
||||
$className,
|
||||
$methodName
|
||||
),
|
||||
0,
|
||||
null
|
||||
);
|
||||
}
|
||||
|
||||
public function __toString(): string
|
||||
{
|
||||
return $this->getMessage() . PHP_EOL;
|
||||
}
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework;
|
||||
|
||||
use const PHP_EOL;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ComparisonMethodDoesNotDeclareParameterTypeException extends Exception
|
||||
{
|
||||
public function __construct(string $className, string $methodName)
|
||||
{
|
||||
parent::__construct(
|
||||
sprintf(
|
||||
'Parameter of comparison method %s::%s() does not have a declared type.',
|
||||
$className,
|
||||
$methodName
|
||||
),
|
||||
0,
|
||||
null
|
||||
);
|
||||
}
|
||||
|
||||
public function __toString(): string
|
||||
{
|
||||
return $this->getMessage() . PHP_EOL;
|
||||
}
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework;
|
||||
|
||||
use const PHP_EOL;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ComparisonMethodDoesNotExistException extends Exception
|
||||
{
|
||||
public function __construct(string $className, string $methodName)
|
||||
{
|
||||
parent::__construct(
|
||||
sprintf(
|
||||
'Comparison method %s::%s() does not exist.',
|
||||
$className,
|
||||
$methodName
|
||||
),
|
||||
0,
|
||||
null
|
||||
);
|
||||
}
|
||||
|
||||
public function __toString(): string
|
||||
{
|
||||
return $this->getMessage() . PHP_EOL;
|
||||
}
|
||||
}
|
||||
+7
-9
@@ -7,20 +7,18 @@
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\MockObject\Builder;
|
||||
namespace PHPUnit\Framework;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
interface Match_ extends Stub
|
||||
final class Error extends Exception implements SelfDescribing
|
||||
{
|
||||
/**
|
||||
* Defines the expectation which must occur before the current is valid.
|
||||
*
|
||||
* @param string $id the identification of the expectation that should
|
||||
* occur before this one
|
||||
*
|
||||
* @return Stub
|
||||
* Wrapper for getMessage() which is declared as final.
|
||||
*/
|
||||
public function after($id);
|
||||
public function toString(): string
|
||||
{
|
||||
return $this->getMessage();
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,7 @@ use Throwable;
|
||||
* Re-instantiates Exceptions thrown by user-space code to retain their original
|
||||
* class names, properties, and stack traces (but without arguments).
|
||||
*
|
||||
* Unlike PHPUnit\Framework_\Exception, the complete stack of previous Exceptions
|
||||
* Unlike PHPUnit\Framework\Exception, the complete stack of previous Exceptions
|
||||
* is processed.
|
||||
*
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
@@ -43,6 +43,7 @@ final class ExceptionWrapper extends Exception
|
||||
// PDOException::getCode() is a string.
|
||||
// @see https://php.net/manual/en/class.pdoexception.php#95812
|
||||
parent::__construct($t->getMessage(), (int) $t->getCode());
|
||||
|
||||
$this->setOriginalException($t);
|
||||
}
|
||||
|
||||
@@ -103,6 +104,7 @@ final class ExceptionWrapper extends Exception
|
||||
/**
|
||||
* Method to contain static originalException to exclude it from stacktrace to prevent the stacktrace contents,
|
||||
* which can be quite big, from being garbage-collected, thus blocking memory until shutdown.
|
||||
*
|
||||
* Approach works both for var_dump() and var_export() and print_r().
|
||||
*/
|
||||
private function originalException(Throwable $exceptionToStore = null): ?Throwable
|
||||
|
||||
@@ -0,0 +1,203 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework;
|
||||
|
||||
use function array_filter;
|
||||
use function array_map;
|
||||
use function array_values;
|
||||
use function count;
|
||||
use function explode;
|
||||
use function in_array;
|
||||
use function strpos;
|
||||
use function trim;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ExecutionOrderDependency
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $className = '';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $methodName = '';
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $useShallowClone = false;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $useDeepClone = false;
|
||||
|
||||
public static function createFromDependsAnnotation(string $className, string $annotation): self
|
||||
{
|
||||
// Split clone option and target
|
||||
$parts = explode(' ', trim($annotation), 2);
|
||||
|
||||
if (count($parts) === 1) {
|
||||
$cloneOption = '';
|
||||
$target = $parts[0];
|
||||
} else {
|
||||
$cloneOption = $parts[0];
|
||||
$target = $parts[1];
|
||||
}
|
||||
|
||||
// Prefix provided class for targets assumed to be in scope
|
||||
if ($target !== '' && strpos($target, '::') === false) {
|
||||
$target = $className . '::' . $target;
|
||||
}
|
||||
|
||||
return new self($target, null, $cloneOption);
|
||||
}
|
||||
|
||||
/**
|
||||
* @psalm-param list<ExecutionOrderDependency> $dependencies
|
||||
*
|
||||
* @psalm-return list<ExecutionOrderDependency>
|
||||
*/
|
||||
public static function filterInvalid(array $dependencies): array
|
||||
{
|
||||
return array_values(
|
||||
array_filter(
|
||||
$dependencies,
|
||||
static function (self $d) {
|
||||
return $d->isValid();
|
||||
}
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @psalm-param list<ExecutionOrderDependency> $existing
|
||||
* @psalm-param list<ExecutionOrderDependency> $additional
|
||||
*
|
||||
* @psalm-return list<ExecutionOrderDependency>
|
||||
*/
|
||||
public static function mergeUnique(array $existing, array $additional): array
|
||||
{
|
||||
$existingTargets = array_map(
|
||||
static function ($dependency) {
|
||||
return $dependency->getTarget();
|
||||
},
|
||||
$existing
|
||||
);
|
||||
|
||||
foreach ($additional as $dependency) {
|
||||
if (in_array($dependency->getTarget(), $existingTargets, true)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$existingTargets[] = $dependency->getTarget();
|
||||
$existing[] = $dependency;
|
||||
}
|
||||
|
||||
return $existing;
|
||||
}
|
||||
|
||||
/**
|
||||
* @psalm-param list<ExecutionOrderDependency> $left
|
||||
* @psalm-param list<ExecutionOrderDependency> $right
|
||||
*
|
||||
* @psalm-return list<ExecutionOrderDependency>
|
||||
*/
|
||||
public static function diff(array $left, array $right): array
|
||||
{
|
||||
if ($right === []) {
|
||||
return $left;
|
||||
}
|
||||
|
||||
if ($left === []) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$diff = [];
|
||||
$rightTargets = array_map(
|
||||
static function ($dependency) {
|
||||
return $dependency->getTarget();
|
||||
},
|
||||
$right
|
||||
);
|
||||
|
||||
foreach ($left as $dependency) {
|
||||
if (in_array($dependency->getTarget(), $rightTargets, true)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$diff[] = $dependency;
|
||||
}
|
||||
|
||||
return $diff;
|
||||
}
|
||||
|
||||
public function __construct(string $classOrCallableName, ?string $methodName = null, ?string $option = null)
|
||||
{
|
||||
if ($classOrCallableName === '') {
|
||||
return;
|
||||
}
|
||||
|
||||
if (strpos($classOrCallableName, '::') !== false) {
|
||||
[$this->className, $this->methodName] = explode('::', $classOrCallableName);
|
||||
} else {
|
||||
$this->className = $classOrCallableName;
|
||||
$this->methodName = !empty($methodName) ? $methodName : 'class';
|
||||
}
|
||||
|
||||
if ($option === 'clone') {
|
||||
$this->useDeepClone = true;
|
||||
} elseif ($option === 'shallowClone') {
|
||||
$this->useShallowClone = true;
|
||||
}
|
||||
}
|
||||
|
||||
public function __toString(): string
|
||||
{
|
||||
return $this->getTarget();
|
||||
}
|
||||
|
||||
public function isValid(): bool
|
||||
{
|
||||
// Invalid dependencies can be declared and are skipped by the runner
|
||||
return $this->className !== '' && $this->methodName !== '';
|
||||
}
|
||||
|
||||
public function useShallowClone(): bool
|
||||
{
|
||||
return $this->useShallowClone;
|
||||
}
|
||||
|
||||
public function useDeepClone(): bool
|
||||
{
|
||||
return $this->useDeepClone;
|
||||
}
|
||||
|
||||
public function targetIsClass(): bool
|
||||
{
|
||||
return $this->methodName === 'class';
|
||||
}
|
||||
|
||||
public function getTarget(): string
|
||||
{
|
||||
return $this->isValid()
|
||||
? $this->className . '::' . $this->methodName
|
||||
: '';
|
||||
}
|
||||
|
||||
public function getTargetClassName(): string
|
||||
{
|
||||
return $this->className;
|
||||
}
|
||||
}
|
||||
+3
-1
@@ -9,9 +9,11 @@
|
||||
*/
|
||||
namespace PHPUnit\Framework;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
interface IncompleteTest
|
||||
interface IncompleteTest extends Throwable
|
||||
{
|
||||
}
|
||||
|
||||
+44
-38
@@ -12,20 +12,20 @@ namespace PHPUnit\Framework\MockObject\Builder;
|
||||
use function array_map;
|
||||
use function array_merge;
|
||||
use function count;
|
||||
use function get_class;
|
||||
use function gettype;
|
||||
use function in_array;
|
||||
use function is_object;
|
||||
use function is_string;
|
||||
use function sprintf;
|
||||
use function strtolower;
|
||||
use PHPUnit\Framework\Constraint\Constraint;
|
||||
use PHPUnit\Framework\MockObject\ConfigurableMethod;
|
||||
use PHPUnit\Framework\MockObject\IncompatibleReturnValueException;
|
||||
use PHPUnit\Framework\MockObject\InvocationHandler;
|
||||
use PHPUnit\Framework\MockObject\Matcher;
|
||||
use PHPUnit\Framework\MockObject\MatcherAlreadyRegisteredException;
|
||||
use PHPUnit\Framework\MockObject\MethodCannotBeConfiguredException;
|
||||
use PHPUnit\Framework\MockObject\MethodNameAlreadyConfiguredException;
|
||||
use PHPUnit\Framework\MockObject\MethodNameNotConfiguredException;
|
||||
use PHPUnit\Framework\MockObject\MethodParametersAlreadyConfiguredException;
|
||||
use PHPUnit\Framework\MockObject\Rule;
|
||||
use PHPUnit\Framework\MockObject\RuntimeException;
|
||||
use PHPUnit\Framework\MockObject\Stub\ConsecutiveCalls;
|
||||
use PHPUnit\Framework\MockObject\Stub\Exception;
|
||||
use PHPUnit\Framework\MockObject\Stub\ReturnArgument;
|
||||
@@ -37,6 +37,9 @@ use PHPUnit\Framework\MockObject\Stub\ReturnValueMap;
|
||||
use PHPUnit\Framework\MockObject\Stub\Stub;
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class InvocationMocker implements InvocationStubber, MethodNameMatch
|
||||
{
|
||||
/**
|
||||
@@ -62,6 +65,8 @@ final class InvocationMocker implements InvocationStubber, MethodNameMatch
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws MatcherAlreadyRegisteredException
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function id($id): self
|
||||
@@ -81,6 +86,12 @@ final class InvocationMocker implements InvocationStubber, MethodNameMatch
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $value
|
||||
* @param mixed[] $nextValues
|
||||
*
|
||||
* @throws IncompatibleReturnValueException
|
||||
*/
|
||||
public function willReturn($value, ...$nextValues): self
|
||||
{
|
||||
if (count($nextValues) === 0) {
|
||||
@@ -158,13 +169,17 @@ final class InvocationMocker implements InvocationStubber, MethodNameMatch
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws RuntimeException
|
||||
* @param mixed[] $arguments
|
||||
*
|
||||
* @throws \PHPUnit\Framework\Exception
|
||||
* @throws MethodNameNotConfiguredException
|
||||
* @throws MethodParametersAlreadyConfiguredException
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function with(...$arguments): self
|
||||
{
|
||||
$this->canDefineParameters();
|
||||
$this->ensureParametersCanBeConfigured();
|
||||
|
||||
$this->matcher->setParametersRule(new Rule\Parameters($arguments));
|
||||
|
||||
@@ -174,13 +189,15 @@ final class InvocationMocker implements InvocationStubber, MethodNameMatch
|
||||
/**
|
||||
* @param array ...$arguments
|
||||
*
|
||||
* @throws RuntimeException
|
||||
* @throws \PHPUnit\Framework\Exception
|
||||
* @throws MethodNameNotConfiguredException
|
||||
* @throws MethodParametersAlreadyConfiguredException
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function withConsecutive(...$arguments): self
|
||||
{
|
||||
$this->canDefineParameters();
|
||||
$this->ensureParametersCanBeConfigured();
|
||||
|
||||
$this->matcher->setParametersRule(new Rule\ConsecutiveParameters($arguments));
|
||||
|
||||
@@ -188,13 +205,14 @@ final class InvocationMocker implements InvocationStubber, MethodNameMatch
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws RuntimeException
|
||||
* @throws MethodNameNotConfiguredException
|
||||
* @throws MethodParametersAlreadyConfiguredException
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function withAnyParameters(): self
|
||||
{
|
||||
$this->canDefineParameters();
|
||||
$this->ensureParametersCanBeConfigured();
|
||||
|
||||
$this->matcher->setParametersRule(new Rule\AnyParameters);
|
||||
|
||||
@@ -204,16 +222,16 @@ final class InvocationMocker implements InvocationStubber, MethodNameMatch
|
||||
/**
|
||||
* @param Constraint|string $constraint
|
||||
*
|
||||
* @throws RuntimeException
|
||||
* @throws \PHPUnit\Framework\InvalidArgumentException
|
||||
* @throws MethodCannotBeConfiguredException
|
||||
* @throws MethodNameAlreadyConfiguredException
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function method($constraint): self
|
||||
{
|
||||
if ($this->matcher->hasMethodNameRule()) {
|
||||
throw new RuntimeException(
|
||||
'Rule for method name is already defined, cannot redefine'
|
||||
);
|
||||
throw new MethodNameAlreadyConfiguredException;
|
||||
}
|
||||
|
||||
$configurableMethodNames = array_map(
|
||||
@@ -224,12 +242,7 @@ final class InvocationMocker implements InvocationStubber, MethodNameMatch
|
||||
);
|
||||
|
||||
if (is_string($constraint) && !in_array(strtolower($constraint), $configurableMethodNames, true)) {
|
||||
throw new RuntimeException(
|
||||
sprintf(
|
||||
'Trying to configure method "%s" which cannot be configured because it does not exist, has not been specified, is final, or is static',
|
||||
$constraint
|
||||
)
|
||||
);
|
||||
throw new MethodCannotBeConfiguredException($constraint);
|
||||
}
|
||||
|
||||
$this->matcher->setMethodNameRule(new Rule\MethodName($constraint));
|
||||
@@ -238,23 +251,17 @@ final class InvocationMocker implements InvocationStubber, MethodNameMatch
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate that a parameters rule can be defined, throw exceptions otherwise.
|
||||
*
|
||||
* @throws RuntimeException
|
||||
* @throws MethodNameNotConfiguredException
|
||||
* @throws MethodParametersAlreadyConfiguredException
|
||||
*/
|
||||
private function canDefineParameters(): void
|
||||
private function ensureParametersCanBeConfigured(): void
|
||||
{
|
||||
if (!$this->matcher->hasMethodNameRule()) {
|
||||
throw new RuntimeException(
|
||||
'Rule for method name is not defined, cannot define rule for parameters ' .
|
||||
'without one'
|
||||
);
|
||||
throw new MethodNameNotConfiguredException;
|
||||
}
|
||||
|
||||
if ($this->matcher->hasParametersRule()) {
|
||||
throw new RuntimeException(
|
||||
'Rule for parameters is already defined, cannot redefine'
|
||||
);
|
||||
throw new MethodParametersAlreadyConfiguredException;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -275,6 +282,9 @@ final class InvocationMocker implements InvocationStubber, MethodNameMatch
|
||||
return $configuredMethod;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws IncompatibleReturnValueException
|
||||
*/
|
||||
private function ensureTypeOfReturnValues(array $values): void
|
||||
{
|
||||
$configuredMethod = $this->getConfiguredMethod();
|
||||
@@ -286,12 +296,8 @@ final class InvocationMocker implements InvocationStubber, MethodNameMatch
|
||||
foreach ($values as $value) {
|
||||
if (!$configuredMethod->mayReturn($value)) {
|
||||
throw new IncompatibleReturnValueException(
|
||||
sprintf(
|
||||
'Method %s may not return value of type %s, its return declaration is "%s"',
|
||||
$configuredMethod->getName(),
|
||||
is_object($value) ? get_class($value) : gettype($value),
|
||||
$configuredMethod->getReturnTypeDeclaration()
|
||||
)
|
||||
$configuredMethod,
|
||||
$value
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,9 @@ namespace PHPUnit\Framework\MockObject\Builder;
|
||||
use PHPUnit\Framework\MockObject\Stub\Stub;
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
interface InvocationStubber
|
||||
{
|
||||
public function will(Stub $stub): Identity;
|
||||
|
||||
+11
-1
@@ -12,8 +12,18 @@ namespace PHPUnit\Framework\MockObject\Builder;
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
interface ParametersMatch extends Match_
|
||||
interface ParametersMatch extends Stub
|
||||
{
|
||||
/**
|
||||
* Defines the expectation which must occur before the current is valid.
|
||||
*
|
||||
* @param string $id the identification of the expectation that should
|
||||
* occur before this one
|
||||
*
|
||||
* @return Stub
|
||||
*/
|
||||
public function after($id);
|
||||
|
||||
/**
|
||||
* Sets the parameters to match for, each parameter to this function will
|
||||
* be part of match. To perform specific matches or constraints create a
|
||||
|
||||
@@ -48,6 +48,6 @@ final class ConfigurableMethod
|
||||
|
||||
public function getReturnTypeDeclaration(): string
|
||||
{
|
||||
return $this->returnType->getReturnTypeDeclaration();
|
||||
return $this->returnType->asString();
|
||||
}
|
||||
}
|
||||
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\MockObject;
|
||||
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class CannotUseAddMethodsException extends \PHPUnit\Framework\Exception implements Exception
|
||||
{
|
||||
public function __construct(string $type, string $methodName)
|
||||
{
|
||||
parent::__construct(
|
||||
sprintf(
|
||||
'Trying to set mock method "%s" with addMethods(), but it exists in class "%s". Use onlyMethods() for methods that exist in the class',
|
||||
$methodName,
|
||||
$type
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
Vendored
+29
@@ -0,0 +1,29 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\MockObject;
|
||||
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class CannotUseOnlyMethodsException extends \PHPUnit\Framework\Exception implements Exception
|
||||
{
|
||||
public function __construct(string $type, string $methodName)
|
||||
{
|
||||
parent::__construct(
|
||||
sprintf(
|
||||
'Trying to set mock method "%s" with onlyMethods, but it does not exist in class "%s". Use addMethods() for methods that do not exist in the class',
|
||||
$methodName,
|
||||
$type
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\MockObject;
|
||||
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ClassAlreadyExistsException extends \PHPUnit\Framework\Exception implements Exception
|
||||
{
|
||||
public function __construct(string $className)
|
||||
{
|
||||
parent::__construct(
|
||||
sprintf(
|
||||
'Class "%s" already exists',
|
||||
$className
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\MockObject;
|
||||
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ClassIsFinalException extends \PHPUnit\Framework\Exception implements Exception
|
||||
{
|
||||
public function __construct(string $className)
|
||||
{
|
||||
parent::__construct(
|
||||
sprintf(
|
||||
'Class "%s" is declared "final" and cannot be mocked',
|
||||
$className
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\MockObject;
|
||||
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class DuplicateMethodException extends \PHPUnit\Framework\Exception implements Exception
|
||||
{
|
||||
/**
|
||||
* @psalm-param list<string> $methods
|
||||
*/
|
||||
public function __construct(array $methods)
|
||||
{
|
||||
parent::__construct(
|
||||
sprintf(
|
||||
'Cannot stub or mock using a method list that contains duplicates: "%s" (duplicate: "%s")',
|
||||
implode(', ', $methods),
|
||||
implode(', ', array_unique(array_diff_assoc($methods, array_unique($methods))))
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
Vendored
+16
@@ -9,9 +9,25 @@
|
||||
*/
|
||||
namespace PHPUnit\Framework\MockObject;
|
||||
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IncompatibleReturnValueException extends \PHPUnit\Framework\Exception implements Exception
|
||||
{
|
||||
/**
|
||||
* @param mixed $value
|
||||
*/
|
||||
public function __construct(ConfigurableMethod $method, $value)
|
||||
{
|
||||
parent::__construct(
|
||||
sprintf(
|
||||
'Method %s may not return value of type %s, its return declaration is "%s"',
|
||||
$method->getName(),
|
||||
is_object($value) ? get_class($value) : gettype($value),
|
||||
$method->getReturnTypeDeclaration()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\MockObject;
|
||||
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class InvalidMethodNameException extends \PHPUnit\Framework\Exception implements Exception
|
||||
{
|
||||
public function __construct(string $method)
|
||||
{
|
||||
parent::__construct(
|
||||
sprintf(
|
||||
'Cannot stub or mock method with invalid name "%s"',
|
||||
$method
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
Vendored
+28
@@ -0,0 +1,28 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\MockObject;
|
||||
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class MatchBuilderNotFoundException extends \PHPUnit\Framework\Exception implements Exception
|
||||
{
|
||||
public function __construct(string $id)
|
||||
{
|
||||
parent::__construct(
|
||||
sprintf(
|
||||
'No builder found for match builder identification <%s>',
|
||||
$id
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
Vendored
+28
@@ -0,0 +1,28 @@
|
||||
<?php declare(strict_types=1);
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace PHPUnit\Framework\MockObject;
|
||||
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class MatcherAlreadyRegisteredException extends \PHPUnit\Framework\Exception implements Exception
|
||||
{
|
||||
public function __construct(string $id)
|
||||
{
|
||||
parent::__construct(
|
||||
sprintf(
|
||||
'Matcher with id <%s> is already registered',
|
||||
$id
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user