Actually commit api-client-php's vendor/ - it was silently gitignored
Docker-Images bauen und veröffentlichen / build (, omsorgCore/Dockerfile, omsorgcore) (push) Successful in 3s
Docker-Images bauen und veröffentlichen / build (, omsorgWeb/Dockerfile, omsorgweb) (push) Successful in 6s
Docker-Images bauen und veröffentlichen / build (, omsorgapp/Dockerfile, omsorgapp) (push) Successful in 4s
Docker-Images bauen und veröffentlichen / build (, omsorgCore/Dockerfile, omsorgcore) (push) Successful in 3s
Docker-Images bauen und veröffentlichen / build (, omsorgWeb/Dockerfile, omsorgweb) (push) Successful in 6s
Docker-Images bauen und veröffentlichen / build (, omsorgapp/Dockerfile, omsorgapp) (push) Successful in 4s
omsorgCore/CLAUDE.md documents vendor/ as committed so the app can run without a composer install step, but the generator's own .gitignore (api-client-php/.gitignore) excludes /vendor/ - it only ever existed untracked on disk locally, which is why the Docker build worked for me but mitarbeiter-app crashed at runtime on a real (fresh-checkout) deploy: "Failed opening required '.../api-client-php/vendor/autoload.php'". Verified by building from a git-archive-simulated fresh checkout with this fix applied - mitarbeiter-app's login page now renders without the fatal error. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
c8a514af9b
commit
dca0349e8c
+274
@@ -0,0 +1,274 @@
|
||||
# Changes in PHPUnit 9.6
|
||||
|
||||
All notable changes of the PHPUnit 9.6 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles.
|
||||
|
||||
## [9.6.35] - 2026-07-06
|
||||
|
||||
### Changed
|
||||
|
||||
* [#6797](https://github.com/sebastianbergmann/phpunit/issues/6797): Adapt code generated for test double of interface with constructor for PHP 8.6
|
||||
|
||||
## [9.6.34] - 2026-01-27
|
||||
|
||||
### Fixed
|
||||
|
||||
* Regression introduced in PHPUnit 9.6.33
|
||||
|
||||
## [9.6.33] - 2026-01-27
|
||||
|
||||
### Changed
|
||||
|
||||
* To prevent Poisoned Pipeline Execution (PPE) attacks using prepared `.coverage` files in pull requests, a PHPT test will no longer be run if the temporary file for writing code coverage information already exists before the test runs
|
||||
|
||||
## [9.6.32] - 2026-01-24
|
||||
|
||||
### Changed
|
||||
|
||||
* `PHPUnit\Framework\MockObject` exceptions are now subtypes of `PHPUnit\Exception`
|
||||
|
||||
## [9.6.31] - 2025-12-06
|
||||
|
||||
* No changes; `phpunit.phar` rebuilt with PHP 8.4 to work around PHP-Scoper issue [#1139](https://github.com/humbug/php-scoper/issues/1139)
|
||||
|
||||
## [9.6.30] - 2025-12-01
|
||||
|
||||
### Changed
|
||||
|
||||
* Updated list of deprecated PHP configuration settings for PHP 8.4, PHP 8.5, and PHP 8.6
|
||||
|
||||
## [9.6.29] - 2025-09-24
|
||||
|
||||
* No changes; `phpunit.phar` rebuilt with updated dependencies
|
||||
|
||||
## [9.6.28] - 2025-09-23
|
||||
|
||||
* No changes; `phpunit.phar` rebuilt with updated dependencies
|
||||
|
||||
## [9.6.27] - 2025-09-14
|
||||
|
||||
### Changed
|
||||
|
||||
* [#6366](https://github.com/sebastianbergmann/phpunit/issues/6366): Exclude `__sleep()` and `__wakeup()` from test double code generation on PHP >= 8.5
|
||||
|
||||
## [9.6.26] - 2025-09-11
|
||||
|
||||
### Changed
|
||||
|
||||
* Implement `__serialize()` in addition to `__sleep()` (which will be deprecated in PHP 8.5)
|
||||
|
||||
## [9.6.25] - 2025-08-20
|
||||
|
||||
### Changed
|
||||
|
||||
* Do not configure `report_memleaks` setting (which will be deprecated in PHP 8.5) for PHPT processes
|
||||
|
||||
## [9.6.24] - 2025-08-10
|
||||
|
||||
### Changed
|
||||
|
||||
* Do not use `ReflectionProperty::setAccessible()` with PHP >= 8.1
|
||||
* Do not use `SplObjectStorage` methods that will be deprecated in PHP 8.5
|
||||
|
||||
## [9.6.23] - 2025-05-02
|
||||
|
||||
### Changed
|
||||
|
||||
* [#5956](https://github.com/sebastianbergmann/phpunit/issues/5956): Improved handling of deprecated `E_STRICT` constant
|
||||
* Improved message when test is considered risky for printing unexpected output
|
||||
|
||||
## [9.6.22] - 2024-12-05
|
||||
|
||||
### Fixed
|
||||
|
||||
* [#6071](https://github.com/sebastianbergmann/phpunit/issues/6071): PHP Archives (PHARs) of PHPUnit 8.5 and PHPUnit 9.6 bundle outdated versions of Prophecy
|
||||
|
||||
## [9.6.21] - 2024-09-19
|
||||
|
||||
### Changed
|
||||
|
||||
* [#5956](https://github.com/sebastianbergmann/phpunit/issues/5956): Deprecation of the `E_STRICT` constant in PHP 8.4
|
||||
* Removed `.phpstorm.meta.php` file as methods such as `TestCase::createStub()` use generics / template types for their return types and PhpStorm, for example, uses that information
|
||||
|
||||
## [9.6.20] - 2024-07-10
|
||||
|
||||
### Changed
|
||||
|
||||
* Updated dependencies (so that users that install using Composer's `--prefer-lowest` CLI option also get recent versions)
|
||||
|
||||
## [9.6.19] - 2024-04-05
|
||||
|
||||
### Changed
|
||||
|
||||
* The namespaces of dependencies are now prefixed with `PHPUnitPHAR` instead of just `PHPUnit` for the PHAR distribution of PHPUnit
|
||||
|
||||
## [9.6.18] - 2024-03-21
|
||||
|
||||
### Changed
|
||||
|
||||
* [#5763](https://github.com/sebastianbergmann/phpunit/issues/5763): Release nullable type changes for PHPUnit 9.6
|
||||
|
||||
## [9.6.17] - 2024-02-23
|
||||
|
||||
### Changed
|
||||
|
||||
* Improve output of `--check-version` CLI option
|
||||
* Improve description of `--check-version` CLI option
|
||||
* Show help for `--manifest`, `--sbom`, and `--composer-lock` when the PHAR is used
|
||||
|
||||
### Fixed
|
||||
|
||||
* [#5712](https://github.com/sebastianbergmann/phpunit/issues/5712): Update dependencies for PHAR distribution of PHPUnit 9.6
|
||||
|
||||
## [9.6.16] - 2024-01-19
|
||||
|
||||
### Changed
|
||||
|
||||
* Make PHAR build reproducible (the only remaining differences were in the timestamps for the files in the PHAR)
|
||||
|
||||
### Fixed
|
||||
|
||||
* [#5516](https://github.com/sebastianbergmann/phpunit/issues/5516): Assertions that use the `LogicalNot` constraint (`assertNotEquals()`, `assertStringNotContainsString()`, ...) can generate confusing failure messages
|
||||
* [#5666](https://github.com/sebastianbergmann/phpunit/issues/5666): `--no-extensions` CLI option does not work
|
||||
* [#5673](https://github.com/sebastianbergmann/phpunit/issues/5673): Confusing error message when migration of a configuration is requested that does not need to be migrated
|
||||
|
||||
## [9.6.15] - 2023-12-01
|
||||
|
||||
### Fixed
|
||||
|
||||
* [#5596](https://github.com/sebastianbergmann/phpunit/issues/5596): `PHPUnit\Framework\TestCase` has `@internal` annotation in PHAR
|
||||
|
||||
## [9.6.14] - 2023-12-01
|
||||
|
||||
### Added
|
||||
|
||||
* [#5577](https://github.com/sebastianbergmann/phpunit/issues/5577): `--composer-lock` CLI option for PHAR binary that displays the `composer.lock` used to build the PHAR
|
||||
|
||||
## [9.6.13] - 2023-09-19
|
||||
|
||||
### Changed
|
||||
|
||||
* The child processes used for process isolation now use temporary files to communicate their result to the parent process
|
||||
|
||||
## [9.6.12] - 2023-09-12
|
||||
|
||||
### Changed
|
||||
|
||||
* [#5508](https://github.com/sebastianbergmann/phpunit/pull/5508): Generate code coverage report in PHP format as first in list to avoid serializing cache data
|
||||
|
||||
## [9.6.11] - 2023-08-19
|
||||
|
||||
### Added
|
||||
|
||||
* [#5478](https://github.com/sebastianbergmann/phpunit/pull/5478): `assertObjectHasProperty()` and `assertObjectNotHasProperty()`
|
||||
|
||||
## [9.6.10] - 2023-07-10
|
||||
|
||||
### Changed
|
||||
|
||||
* [#5419](https://github.com/sebastianbergmann/phpunit/pull/5419): Allow empty `<extensions>` element in XML configuration
|
||||
|
||||
## [9.6.9] - 2023-06-11
|
||||
|
||||
### Fixed
|
||||
|
||||
* [#5405](https://github.com/sebastianbergmann/phpunit/issues/5405): XML configuration migration does not migrate `whitelist/file` elements
|
||||
* Always use `X.Y.Z` version number (and not just `X.Y`) of PHPUnit's version when checking whether a PHAR-distributed extension is compatible
|
||||
|
||||
## [9.6.8] - 2023-05-11
|
||||
|
||||
### Fixed
|
||||
|
||||
* [#5345](https://github.com/sebastianbergmann/phpunit/issues/5345): No stack trace shown for previous exceptions during bootstrap
|
||||
|
||||
## [9.6.7] - 2023-04-14
|
||||
|
||||
### Fixed
|
||||
|
||||
* Tests that have `@doesNotPerformAssertions` do not contribute to code coverage
|
||||
|
||||
## [9.6.6] - 2023-03-27
|
||||
|
||||
### Fixed
|
||||
|
||||
* [#5270](https://github.com/sebastianbergmann/phpunit/issues/5270): `GlobalState::getIniSettingsAsString()` generates code that triggers warnings
|
||||
|
||||
## [9.6.5] - 2023-03-09
|
||||
|
||||
### Changed
|
||||
|
||||
* Backported the HTML and CSS improvements made to the `--testdox-html` from PHPUnit 10
|
||||
|
||||
### Fixed
|
||||
|
||||
* [#5205](https://github.com/sebastianbergmann/phpunit/issues/5205): Wrong default value for optional parameter of `PHPUnit\Util\Test::parseTestMethodAnnotations()` causes `ReflectionException`
|
||||
|
||||
## [9.6.4] - 2023-02-27
|
||||
|
||||
### Fixed
|
||||
|
||||
* [#5186](https://github.com/sebastianbergmann/phpunit/issues/5186): SBOM does not validate
|
||||
|
||||
## [9.6.3] - 2023-02-04
|
||||
|
||||
### Fixed
|
||||
|
||||
* [#5164](https://github.com/sebastianbergmann/phpunit/issues/5164): `markTestSkipped()` not handled correctly when called in "before first test" method
|
||||
|
||||
## [9.6.2] - 2023-02-04
|
||||
|
||||
### Fixed
|
||||
|
||||
* [#4618](https://github.com/sebastianbergmann/phpunit/issues/4618): Support for generators in `assertCount()` etc. is not marked as deprecated in PHPUnit 9.6
|
||||
|
||||
## [9.6.1] - 2023-02-03
|
||||
|
||||
### Fixed
|
||||
|
||||
* [#5073](https://github.com/sebastianbergmann/phpunit/issues/5073): `--no-extensions` CLI option only prevents extension PHARs from being loaded
|
||||
* [#5160](https://github.com/sebastianbergmann/phpunit/issues/5160): Deprecate `assertClassHasAttribute()`, `assertClassNotHasAttribute()`, `assertClassHasStaticAttribute()`, `assertClassNotHasStaticAttribute()`, `assertObjectHasAttribute()`, `assertObjectNotHasAttribute()`, `classHasAttribute()`, `classHasStaticAttribute()`, and `objectHasAttribute()`
|
||||
|
||||
## [9.6.0] - 2023-02-03
|
||||
|
||||
### Changed
|
||||
|
||||
* [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062): Deprecate `expectDeprecation()`, `expectDeprecationMessage()`, `expectDeprecationMessageMatches()`, `expectError()`, `expectErrorMessage()`, `expectErrorMessageMatches()`, `expectNotice()`, `expectNoticeMessage()`, `expectNoticeMessageMatches()`, `expectWarning()`, `expectWarningMessage()`, and `expectWarningMessageMatches()`
|
||||
* [#5063](https://github.com/sebastianbergmann/phpunit/issues/5063): Deprecate `withConsecutive()`
|
||||
* [#5064](https://github.com/sebastianbergmann/phpunit/issues/5064): Deprecate `PHPUnit\Framework\TestCase::getMockClass()`
|
||||
* [#5132](https://github.com/sebastianbergmann/phpunit/issues/5132): Deprecate `Test` suffix for abstract test case classes
|
||||
|
||||
[9.6.35]: https://github.com/sebastianbergmann/phpunit/compare/9.6.34...9.6.35
|
||||
[9.6.34]: https://github.com/sebastianbergmann/phpunit/compare/9.6.33...9.6.34
|
||||
[9.6.33]: https://github.com/sebastianbergmann/phpunit/compare/9.6.32...9.6.33
|
||||
[9.6.32]: https://github.com/sebastianbergmann/phpunit/compare/9.6.31...9.6.32
|
||||
[9.6.31]: https://github.com/sebastianbergmann/phpunit/compare/9.6.30...9.6.31
|
||||
[9.6.30]: https://github.com/sebastianbergmann/phpunit/compare/9.6.29...9.6.30
|
||||
[9.6.29]: https://github.com/sebastianbergmann/phpunit/compare/9.6.28...9.6.29
|
||||
[9.6.28]: https://github.com/sebastianbergmann/phpunit/compare/9.6.27...9.6.28
|
||||
[9.6.27]: https://github.com/sebastianbergmann/phpunit/compare/9.6.26...9.6.27
|
||||
[9.6.26]: https://github.com/sebastianbergmann/phpunit/compare/9.6.25...9.6.26
|
||||
[9.6.25]: https://github.com/sebastianbergmann/phpunit/compare/9.6.24...9.6.25
|
||||
[9.6.24]: https://github.com/sebastianbergmann/phpunit/compare/9.6.23...9.6.24
|
||||
[9.6.23]: https://github.com/sebastianbergmann/phpunit/compare/9.6.22...9.6.23
|
||||
[9.6.22]: https://github.com/sebastianbergmann/phpunit/compare/9.6.21...9.6.22
|
||||
[9.6.21]: https://github.com/sebastianbergmann/phpunit/compare/9.6.20...9.6.21
|
||||
[9.6.20]: https://github.com/sebastianbergmann/phpunit/compare/9.6.19...9.6.20
|
||||
[9.6.19]: https://github.com/sebastianbergmann/phpunit/compare/9.6.18...9.6.19
|
||||
[9.6.18]: https://github.com/sebastianbergmann/phpunit/compare/9.6.17...9.6.18
|
||||
[9.6.17]: https://github.com/sebastianbergmann/phpunit/compare/9.6.16...9.6.17
|
||||
[9.6.16]: https://github.com/sebastianbergmann/phpunit/compare/9.6.15...9.6.16
|
||||
[9.6.15]: https://github.com/sebastianbergmann/phpunit/compare/9.6.14...9.6.15
|
||||
[9.6.14]: https://github.com/sebastianbergmann/phpunit/compare/9.6.13...9.6.14
|
||||
[9.6.13]: https://github.com/sebastianbergmann/phpunit/compare/9.6.12...9.6.13
|
||||
[9.6.12]: https://github.com/sebastianbergmann/phpunit/compare/9.6.11...9.6.12
|
||||
[9.6.11]: https://github.com/sebastianbergmann/phpunit/compare/9.6.10...9.6.11
|
||||
[9.6.10]: https://github.com/sebastianbergmann/phpunit/compare/9.6.9...9.6.10
|
||||
[9.6.9]: https://github.com/sebastianbergmann/phpunit/compare/9.6.8...9.6.9
|
||||
[9.6.8]: https://github.com/sebastianbergmann/phpunit/compare/9.6.7...9.6.8
|
||||
[9.6.7]: https://github.com/sebastianbergmann/phpunit/compare/9.6.6...9.6.7
|
||||
[9.6.6]: https://github.com/sebastianbergmann/phpunit/compare/9.6.5...9.6.6
|
||||
[9.6.5]: https://github.com/sebastianbergmann/phpunit/compare/9.6.4...9.6.5
|
||||
[9.6.4]: https://github.com/sebastianbergmann/phpunit/compare/9.6.3...9.6.4
|
||||
[9.6.3]: https://github.com/sebastianbergmann/phpunit/compare/9.6.2...9.6.3
|
||||
[9.6.2]: https://github.com/sebastianbergmann/phpunit/compare/9.6.1...9.6.2
|
||||
[9.6.1]: https://github.com/sebastianbergmann/phpunit/compare/9.6.0...9.6.1
|
||||
[9.6.0]: https://github.com/sebastianbergmann/phpunit/compare/9.5.28...9.6.0
|
||||
+89
@@ -0,0 +1,89 @@
|
||||
# Deprecations
|
||||
|
||||
## Soft Deprecations
|
||||
|
||||
This functionality is currently [soft-deprecated](https://phpunit.de/backward-compatibility.html#soft-deprecation):
|
||||
|
||||
### Writing Tests
|
||||
|
||||
#### Test Double API
|
||||
|
||||
| Issue | Description | Since | Replacement |
|
||||
|-------------------------------------------------------------------|-----------------------------------|-------|-------------|
|
||||
| [#3687](https://github.com/sebastianbergmann/phpunit/issues/3687) | `MockBuilder::setMethods()` | 8.3.0 | |
|
||||
| [#3687](https://github.com/sebastianbergmann/phpunit/issues/3687) | `MockBuilder::setMethodsExcept()` | 9.6.0 | |
|
||||
|
||||
## Hard Deprecations
|
||||
|
||||
This functionality is currently [hard-deprecated](https://phpunit.de/backward-compatibility.html#hard-deprecation):
|
||||
|
||||
### Writing Tests
|
||||
|
||||
#### Assertions, Constraints, and Expectations
|
||||
|
||||
| Issue | Description | Since | Replacement |
|
||||
|-------------------------------------------------------------------|------------------------------------------------|-------|---------------------------------------------------|
|
||||
| [#4062](https://github.com/sebastianbergmann/phpunit/issues/4062) | `TestCase::assertNotIsReadable()` | 9.1.0 | `TestCase::assertIsNotReadable()` |
|
||||
| [#4065](https://github.com/sebastianbergmann/phpunit/issues/4065) | `TestCase::assertNotIsWritable()` | 9.1.0 | `TestCase::assertIsNotWritable()` |
|
||||
| [#4068](https://github.com/sebastianbergmann/phpunit/issues/4068) | `TestCase::assertDirectoryNotExists()` | 9.1.0 | `TestCase::assertDirectoryDoesNotExist()` |
|
||||
| [#4071](https://github.com/sebastianbergmann/phpunit/issues/4071) | `TestCase::assertDirectoryNotIsReadable()` | 9.1.0 | `TestCase::assertDirectoryIsNotReadable()` |
|
||||
| [#4074](https://github.com/sebastianbergmann/phpunit/issues/4074) | `TestCase::assertDirectoryNotIsWritable()` | 9.1.0 | `TestCase::assertDirectoryIsNotWritable()` |
|
||||
| [#4077](https://github.com/sebastianbergmann/phpunit/issues/4077) | `TestCase::assertFileNotExists()` | 9.1.0 | `TestCase::assertFileDoesNotExist()` |
|
||||
| [#4080](https://github.com/sebastianbergmann/phpunit/issues/4080) | `TestCase::assertFileNotIsReadable()` | 9.1.0 | `TestCase::assertFileIsNotReadable()` |
|
||||
| [#4083](https://github.com/sebastianbergmann/phpunit/issues/4083) | `TestCase::assertFileNotIsWritable()` | 9.1.0 | `TestCase::assertFileIsNotWritable()` |
|
||||
| [#4086](https://github.com/sebastianbergmann/phpunit/issues/4086) | `TestCase::assertRegExp()` | 9.1.0 | `TestCase::assertMatchesRegularExpression()` |
|
||||
| [#4089](https://github.com/sebastianbergmann/phpunit/issues/4089) | `TestCase::assertNotRegExp()` | 9.1.0 | `TestCase::assertDoesNotMatchRegularExpression()` |
|
||||
| [#4091](https://github.com/sebastianbergmann/phpunit/issues/4091) | `TestCase::assertEqualXMLStructure()` | 9.1.0 | |
|
||||
| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectDeprecation()` | 9.6.0 | |
|
||||
| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectDeprecationMessage()` | 9.6.0 | |
|
||||
| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectDeprecationMessageMatches()` | 9.6.0 | |
|
||||
| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectError()` | 9.6.0 | |
|
||||
| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectErrorMessage()` | 9.6.0 | |
|
||||
| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectErrorMessageMatches()` | 9.6.0 | |
|
||||
| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectNotice()` | 9.6.0 | |
|
||||
| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectNoticeMessage()` | 9.6.0 | |
|
||||
| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectNoticeMessageMatches()` | 9.6.0 | |
|
||||
| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectWarning()` | 9.6.0 | |
|
||||
| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectWarningMessage()` | 9.6.0 | |
|
||||
| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectWarningMessageMatches()` | 9.6.0 | |
|
||||
| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::assertClassHasAttribute()` | 9.6.1 | |
|
||||
| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::assertClassNotHasAttribute()` | 9.6.1 | |
|
||||
| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::assertClassHasStaticAttribute()` | 9.6.1 | |
|
||||
| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::assertClassNotHasStaticAttribute()` | 9.6.1 | |
|
||||
| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::assertObjectHasAttribute()` | 9.6.1 | `TestCase::assertObjectHasProperty()` |
|
||||
| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::assertObjectNotHasAttribute()` | 9.6.1 | `TestCase::assertObjectNotHasProperty()` |
|
||||
| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::classHasAttribute()` | 9.6.1 | |
|
||||
| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::classHasStaticAttribute()` | 9.6.1 | |
|
||||
| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::objectHasAttribute()` | 9.6.1 | |
|
||||
| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `ClassHasAttribute` | 9.6.1 | |
|
||||
| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `ClassHasStaticAttribute` | 9.6.1 | |
|
||||
| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `ObjectHasAttribute` | 9.6.1 | `ObjectHasProperty` |
|
||||
|
||||
#### Test Double API
|
||||
|
||||
| Issue | Description | Since | Replacement |
|
||||
|-------------------------------------------------------------------|---------------------------------------|-------|-------------------------------------------------------------------------|
|
||||
| [#4141](https://github.com/sebastianbergmann/phpunit/issues/4141) | `TestCase::prophesize()` | 9.1.0 | [phpspec/prophecy-phpunit](https://github.com/phpspec/prophecy-phpunit) |
|
||||
| [#4297](https://github.com/sebastianbergmann/phpunit/issues/4297) | `TestCase::at()` | 9.3.0 | |
|
||||
| [#4297](https://github.com/sebastianbergmann/phpunit/issues/4297) | `InvokedAtIndex` | 9.3.0 | |
|
||||
| [#5063](https://github.com/sebastianbergmann/phpunit/issues/5063) | `InvocationMocker::withConsecutive()` | 9.6.0 | |
|
||||
| [#5063](https://github.com/sebastianbergmann/phpunit/issues/5063) | `ConsecutiveParameters` | 9.6.0 | |
|
||||
| [#5064](https://github.com/sebastianbergmann/phpunit/issues/5064) | `TestCase::getMockClass()` | 9.6.0 | |
|
||||
|
||||
#### Miscellaneous
|
||||
|
||||
| Issue | Description | Since | Replacement |
|
||||
|-------------------------------------------------------------------|----------------------------------------------|-------|------------------------------------------------|
|
||||
| [#5132](https://github.com/sebastianbergmann/phpunit/issues/5132) | `Test` suffix for abstract test case classes | | |
|
||||
| | `TestCase::$backupGlobalsBlacklist` | 9.3.0 | `TestCase::$backupGlobalsExcludeList` |
|
||||
| | `TestCase::$backupStaticAttributesBlacklist` | 9.3.0 | `TestCase::$backupStaticAttributesExcludeList` |
|
||||
|
||||
### Extending PHPUnit
|
||||
|
||||
| Issue | Description | Since | Replacement |
|
||||
|-------------------------------------------------------------------|--------------------------------------|-------|-------------------------------------------------------------|
|
||||
| [#4676](https://github.com/sebastianbergmann/phpunit/issues/4676) | `TestListener` | 8.0.0 | [Event System](https://docs.phpunit.de/en/10.3/events.html) |
|
||||
| [#4039](https://github.com/sebastianbergmann/phpunit/issues/4039) | `Command::handleLoader()` | 9.1.0 | |
|
||||
| [#4039](https://github.com/sebastianbergmann/phpunit/issues/4039) | `TestSuiteLoader` | 9.1.0 | |
|
||||
| [#4039](https://github.com/sebastianbergmann/phpunit/issues/4039) | `StandardTestSuiteLoader` | 9.1.0 | |
|
||||
| [#4676](https://github.com/sebastianbergmann/phpunit/issues/4676) | `TestListenerDefaultImplementation` | 8.2.4 | [Event System](https://docs.phpunit.de/en/10.3/events.html) |
|
||||
@@ -0,0 +1,29 @@
|
||||
BSD 3-Clause License
|
||||
|
||||
Copyright (c) 2001-2026, Sebastian Bergmann
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
@@ -0,0 +1,35 @@
|
||||
# PHPUnit
|
||||
|
||||
[](https://packagist.org/packages/phpunit/phpunit)
|
||||
[](https://github.com/sebastianbergmann/phpunit/actions)
|
||||
[](https://codecov.io/gh/sebastianbergmann/phpunit)
|
||||
|
||||
PHPUnit is a programmer-oriented testing framework for PHP. It is an instance of the xUnit architecture for unit testing frameworks.
|
||||
|
||||
## Installation
|
||||
|
||||
We distribute a [PHP Archive (PHAR)](https://php.net/phar) that has all required (as well as some optional) dependencies of PHPUnit bundled in a single file:
|
||||
|
||||
```bash
|
||||
$ wget https://phar.phpunit.de/phpunit-X.Y.phar
|
||||
|
||||
$ php phpunit-X.Y.phar --version
|
||||
```
|
||||
|
||||
Please replace `X.Y` with the version of PHPUnit you are interested in.
|
||||
|
||||
Alternatively, you may use [Composer](https://getcomposer.org/) to download and install PHPUnit as well as its dependencies. Please refer to the [documentation](https://phpunit.de/documentation.html) for details on how to install PHPUnit.
|
||||
|
||||
## Contribute
|
||||
|
||||
Please refer to [CONTRIBUTING.md](https://github.com/sebastianbergmann/phpunit/blob/main/.github/CONTRIBUTING.md) for information on how to contribute to PHPUnit and its related projects.
|
||||
|
||||
## List of Contributors
|
||||
|
||||
Thanks to everyone who has contributed to PHPUnit! You can find a detailed list of contributors on every PHPUnit related package on GitHub. This list shows only the major components:
|
||||
|
||||
* [PHPUnit](https://github.com/sebastianbergmann/phpunit/graphs/contributors)
|
||||
* [php-code-coverage](https://github.com/sebastianbergmann/php-code-coverage/graphs/contributors)
|
||||
|
||||
A very special thanks to everyone who has contributed to the [documentation](https://github.com/sebastianbergmann/phpunit-documentation-english/graphs/contributors).
|
||||
|
||||
@@ -0,0 +1,107 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported versions
|
||||
|
||||
Security issues are fixed for versions of PHPUnit that are in the Bugfix Support phase.
|
||||
Versions in the Life Support phase only receive changes required for compatibility with new versions of PHP; they do not receive bug or security fixes.
|
||||
Versions that have reached End-of-Life do not receive any changes.
|
||||
|
||||
| Version | Phase | End of Bugfix Support |
|
||||
|------------|----------------|-----------------------|
|
||||
| PHPUnit 13 | Bugfix Support | February 4, 2028 |
|
||||
| PHPUnit 12 | Bugfix Support | February 5, 2027 |
|
||||
| PHPUnit 11 | Life Support | February 6, 2026 |
|
||||
| PHPUnit 10 | Life Support | February 7, 2025 |
|
||||
| PHPUnit 9 | Life Support | February 2, 2024 |
|
||||
| PHPUnit 8 | Life Support | February 3, 2023 |
|
||||
|
||||
PHPUnit 7 and earlier have reached End-of-Life.
|
||||
|
||||
See [Supported Versions of PHPUnit](https://phpunit.de/supported-versions.html) for the authoritative list and for the definitions of the support phases.
|
||||
|
||||
## Reporting a vulnerability
|
||||
|
||||
If you believe you have found a security vulnerability in PHPUnit, please report it to me through coordinated disclosure.
|
||||
Please report vulnerabilities in bundled libraries to their respective repositories.
|
||||
|
||||
**Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.**
|
||||
|
||||
Instead, please email `sebastian@phpunit.de`.
|
||||
|
||||
Use my [PGP key](https://sebastian-bergmann.de/gpg.asc) for encrypted email, for example when your report includes proof-of-concept exploits against third-party systems.
|
||||
|
||||
Please include as much of the information listed below as you can to help me better understand and resolve the issue:
|
||||
|
||||
* The type of issue
|
||||
* Full paths of source file(s) related to the manifestation of the issue
|
||||
* The location of the affected source code (tag/branch/commit or direct URL)
|
||||
* Any special configuration required to reproduce the issue
|
||||
* Step-by-step instructions to reproduce the issue
|
||||
* Proof-of-concept or exploit code (if possible)
|
||||
* Impact of the issue, including how an attacker might exploit the issue
|
||||
|
||||
This information will help me triage your report more quickly.
|
||||
|
||||
If you used an AI assistant (LLM, coding agent, or similar) to find, reproduce, or write up the issue, please say so and describe how it was used.
|
||||
This does not disqualify a report, but it changes how I triage it.
|
||||
|
||||
## How reports are handled
|
||||
|
||||
I do not operate a bug bounty program.
|
||||
There is no monetary reward for reporting a vulnerability.
|
||||
|
||||
I will acknowledge receipt of a vulnerability report within 7 days.
|
||||
|
||||
A confirmed security issue is handled like any other bug.
|
||||
It is not prioritized ahead of other work.
|
||||
It is fixed when I have the time to fix it.
|
||||
|
||||
I will fix and release before a public advisory is published, but I will not agree to fixed-date embargoes, multi-vendor coordination, or NDAs.
|
||||
I do not optimize for metrics such as the OpenSSF Scorecard.
|
||||
|
||||
Once a vulnerability has been fixed and a release with the fix is available, I publish a public advisory on GitHub.
|
||||
I give credit in the advisory when I know the reporter's GitHub user name.
|
||||
|
||||
## Scope
|
||||
|
||||
PHPUnit is a framework for writing as well as a command-line tool for running tests.
|
||||
Writing and running tests is a development-time activity.
|
||||
PHPUnit is developed with a focus on development environments and the command-line.
|
||||
|
||||
### In scope
|
||||
|
||||
I treat a bug as a security issue when a documented, intended use of PHPUnit, or a reasonable extrapolation of it, causes PHPUnit itself to compromise the confidentiality, integrity, or availability of the environment it runs in. Examples:
|
||||
|
||||
* PHPUnit's console output, logfiles, and reports in any format contain a vulnerability that allows an attacker to extract secrets from or otherwise compromise the environment in which the output is viewed or processed.
|
||||
* A regular test run, against trusted test code, trusted production code, and a trusted configuration, causes PHPUnit to transmit data from the environment to a third party.
|
||||
* A regular test run, against trusted test code, trusted production code, and a trusted configuration, causes PHPUnit to write secrets from the environment to its own output, log files, or reports.
|
||||
|
||||
### Not in scope
|
||||
|
||||
No specific testing or hardening with regard to using PHPUnit in an HTTP or web context, in a CI/CD context, or with untrusted input data is performed.
|
||||
The following classes of issue are explicitly not in scope.
|
||||
|
||||
#### CI/CD Pipelines
|
||||
|
||||
Running tests in a CI/CD pipeline is a legitimate and common use of PHPUnit.
|
||||
However, a CI/CD pipeline is not a sandbox, and PHPUnit is not designed to defend one.
|
||||
Executing test code, production code, or a configuration for PHPUnit or PHP that has not been reviewed is equivalent to executing arbitrary code on the infrastructure that hosts the pipeline.
|
||||
This class of risk is documented as [CICD-SEC-04: Poisoned Pipeline Execution](https://owasp.org/www-project-top-10-ci-cd-security-risks/CICD-SEC-04-Poisoned-Pipeline-Execution) in the OWASP Top 10 CI/CD Security Risks.
|
||||
|
||||
**If your CI/CD pipeline automatically runs PHPUnit against a configuration for PHPUnit or PHP, test code, and/or production code from third parties without those changes having been reviewed first, then your development process is broken.**
|
||||
|
||||
Running code from a pull request on your infrastructure is, by definition, remote code execution.
|
||||
|
||||
Protecting the pipeline is the responsibility of the operator of the pipeline:
|
||||
limit which events trigger workflows, require review before workflows run on contributions from outside collaborators, isolate jobs that run untrusted code, and do not expose secrets to such jobs.
|
||||
|
||||
#### Webserver
|
||||
|
||||
There is no reason why PHPUnit should be installed on a webserver and/or in a production environment.
|
||||
|
||||
**If you upload PHPUnit to a webserver then your deployment process is broken.**
|
||||
|
||||
On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.
|
||||
|
||||
PHPUnit might contain functionality that intentionally exposes internal application data for debugging purposes.
|
||||
If PHPUnit is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context.
|
||||
+108
@@ -0,0 +1,108 @@
|
||||
{
|
||||
"name": "phpunit/phpunit",
|
||||
"description": "The PHP Unit Testing framework.",
|
||||
"type": "library",
|
||||
"keywords": [
|
||||
"phpunit",
|
||||
"xunit",
|
||||
"testing"
|
||||
],
|
||||
"homepage": "https://phpunit.de/",
|
||||
"license": "BSD-3-Clause",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"funding": [
|
||||
{
|
||||
"type": "other",
|
||||
"url": "https://phpunit.de/sponsoring.html"
|
||||
}
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
||||
"security": "https://github.com/sebastianbergmann/phpunit/security/policy"
|
||||
},
|
||||
"prefer-stable": true,
|
||||
"require": {
|
||||
"php": ">=7.3",
|
||||
"ext-dom": "*",
|
||||
"ext-filter": "*",
|
||||
"ext-json": "*",
|
||||
"ext-libxml": "*",
|
||||
"ext-mbstring": "*",
|
||||
"ext-xmlwriter": "*",
|
||||
"doctrine/instantiator": "^1.5.0 || ^2",
|
||||
"myclabs/deep-copy": "^1.13.4",
|
||||
"phar-io/manifest": "^2.0.4",
|
||||
"phar-io/version": "^3.2.1",
|
||||
"phpunit/php-code-coverage": "^9.2.32",
|
||||
"phpunit/php-file-iterator": "^3.0.6",
|
||||
"phpunit/php-invoker": "^3.1.1",
|
||||
"phpunit/php-text-template": "^2.0.4",
|
||||
"phpunit/php-timer": "^5.0.3",
|
||||
"sebastian/cli-parser": "^1.0.2",
|
||||
"sebastian/code-unit": "^1.0.8",
|
||||
"sebastian/comparator": "^4.0.10",
|
||||
"sebastian/diff": "^4.0.6",
|
||||
"sebastian/environment": "^5.1.5",
|
||||
"sebastian/exporter": "^4.0.8",
|
||||
"sebastian/global-state": "^5.0.8",
|
||||
"sebastian/object-enumerator": "^4.0.4",
|
||||
"sebastian/resource-operations": "^3.0.4",
|
||||
"sebastian/type": "^3.2.1",
|
||||
"sebastian/version": "^3.0.2"
|
||||
},
|
||||
"config": {
|
||||
"platform": {
|
||||
"php": "7.3.0"
|
||||
},
|
||||
"policy": {
|
||||
"malware": {
|
||||
"audit": "fail"
|
||||
},
|
||||
"security-advisory": {
|
||||
"audit": "fail"
|
||||
},
|
||||
"abandoned": {
|
||||
"audit": "fail"
|
||||
}
|
||||
},
|
||||
"classmap-authoritative": true,
|
||||
"optimize-autoloader": true,
|
||||
"sort-packages": true
|
||||
},
|
||||
"suggest": {
|
||||
"ext-soap": "To be able to generate mocks based on WSDL files",
|
||||
"ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
|
||||
},
|
||||
"bin": [
|
||||
"phpunit"
|
||||
],
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
],
|
||||
"files": [
|
||||
"src/Framework/Assert/Functions.php"
|
||||
]
|
||||
},
|
||||
"autoload-dev": {
|
||||
"classmap": [
|
||||
"tests/"
|
||||
],
|
||||
"files": [
|
||||
"tests/_files/CoverageNamespacedFunctionTest.php",
|
||||
"tests/_files/CoveredFunction.php",
|
||||
"tests/_files/NamespaceCoveredFunction.php"
|
||||
]
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "9.6-dev"
|
||||
}
|
||||
}
|
||||
}
|
||||
+1709
File diff suppressed because it is too large
Load Diff
+107
@@ -0,0 +1,107 @@
|
||||
#!/usr/bin/env php
|
||||
<?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.
|
||||
*/
|
||||
|
||||
if (!version_compare(PHP_VERSION, PHP_VERSION, '=')) {
|
||||
fwrite(
|
||||
STDERR,
|
||||
sprintf(
|
||||
'%s declares an invalid value for PHP_VERSION.' . PHP_EOL .
|
||||
'This breaks fundamental functionality such as version_compare().' . PHP_EOL .
|
||||
'Please use a different PHP interpreter.' . PHP_EOL,
|
||||
|
||||
PHP_BINARY
|
||||
)
|
||||
);
|
||||
|
||||
die(1);
|
||||
}
|
||||
|
||||
if (version_compare('7.3.0', PHP_VERSION, '>')) {
|
||||
fwrite(
|
||||
STDERR,
|
||||
sprintf(
|
||||
'This version of PHPUnit requires PHP >= 7.3.' . PHP_EOL .
|
||||
'You are using PHP %s (%s).' . PHP_EOL,
|
||||
PHP_VERSION,
|
||||
PHP_BINARY
|
||||
)
|
||||
);
|
||||
|
||||
die(1);
|
||||
}
|
||||
|
||||
$requiredExtensions = ['dom', 'filter', 'json', 'libxml', 'mbstring', 'tokenizer', 'xmlwriter'];
|
||||
|
||||
$unavailableExtensions = array_filter(
|
||||
$requiredExtensions,
|
||||
static function ($extension) {
|
||||
return !extension_loaded($extension);
|
||||
}
|
||||
);
|
||||
|
||||
if ([] !== $unavailableExtensions) {
|
||||
fwrite(
|
||||
STDERR,
|
||||
sprintf(
|
||||
'PHPUnit requires the "%s" extensions, but the "%s" %s not available.' . PHP_EOL,
|
||||
implode('", "', $requiredExtensions),
|
||||
implode('", "', $unavailableExtensions),
|
||||
count($unavailableExtensions) === 1 ? 'extension is' : 'extensions are'
|
||||
)
|
||||
);
|
||||
|
||||
die(1);
|
||||
}
|
||||
|
||||
unset($requiredExtensions, $unavailableExtensions);
|
||||
|
||||
if (!ini_get('date.timezone')) {
|
||||
ini_set('date.timezone', 'UTC');
|
||||
}
|
||||
|
||||
if (isset($GLOBALS['_composer_autoload_path'])) {
|
||||
define('PHPUNIT_COMPOSER_INSTALL', $GLOBALS['_composer_autoload_path']);
|
||||
|
||||
unset($GLOBALS['_composer_autoload_path']);
|
||||
} else {
|
||||
foreach (array(__DIR__ . '/../../autoload.php', __DIR__ . '/../vendor/autoload.php', __DIR__ . '/vendor/autoload.php') as $file) {
|
||||
if (file_exists($file)) {
|
||||
define('PHPUNIT_COMPOSER_INSTALL', $file);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
unset($file);
|
||||
}
|
||||
|
||||
if (!defined('PHPUNIT_COMPOSER_INSTALL')) {
|
||||
fwrite(
|
||||
STDERR,
|
||||
'You need to set up the project dependencies using Composer:' . PHP_EOL . PHP_EOL .
|
||||
' composer install' . PHP_EOL . PHP_EOL .
|
||||
'You can learn all about Composer on https://getcomposer.org/.' . PHP_EOL
|
||||
);
|
||||
|
||||
die(1);
|
||||
}
|
||||
|
||||
$options = getopt('', array('prepend:'));
|
||||
|
||||
if (isset($options['prepend'])) {
|
||||
require $options['prepend'];
|
||||
}
|
||||
|
||||
unset($options);
|
||||
|
||||
require PHPUNIT_COMPOSER_INSTALL;
|
||||
|
||||
PHPUnit\TextUI\Command::main();
|
||||
@@ -0,0 +1,330 @@
|
||||
<?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.6 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="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="loggingType">
|
||||
<xs:group ref="loggingGroup"/>
|
||||
</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" minOccurs="0" 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: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:string">
|
||||
<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="colors" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="columns" type="columnsType" default="80"/>
|
||||
<xs:attribute name="convertDeprecationsToExceptions" type="xs:boolean" default="false"/>
|
||||
<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="forceCoversAnnotation" type="xs:boolean" default="false"/>
|
||||
<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"/>
|
||||
<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="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"/>
|
||||
<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="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:anyURI"/>
|
||||
<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="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"/>
|
||||
</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:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:group ref="pathGroup"/>
|
||||
<xs:element name="exclude" type="xs:string"/>
|
||||
</xs:choice>
|
||||
</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>
|
||||
+319
@@ -0,0 +1,319 @@
|
||||
<?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:string">
|
||||
<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="false"/>
|
||||
<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:anyURI"/>
|
||||
<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:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:group ref="pathGroup"/>
|
||||
<xs:element name="exclude" type="xs:string"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="name" type="xs:string" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:schema>
|
||||
+315
@@ -0,0 +1,315 @@
|
||||
<?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.0 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="35"/>
|
||||
<xs:attribute name="highLowerBound" type="xs:nonNegativeInteger" default="70"/>
|
||||
<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.0 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="35"/>
|
||||
<xs:attribute name="highLowerBound" type="xs:nonNegativeInteger" default="70"/>
|
||||
<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>
|
||||
+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\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"/>
|
||||
<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>
|
||||
+327
@@ -0,0 +1,327 @@
|
||||
<?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.3 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="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="loggingType">
|
||||
<xs:group ref="loggingGroup"/>
|
||||
</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: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="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="forceCoversAnnotation" type="xs:boolean" default="false"/>
|
||||
<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"/>
|
||||
<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="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"/>
|
||||
<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="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="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"/>
|
||||
</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:group name="coverageReportGroup">
|
||||
<xs:all>
|
||||
<xs:element name="clover" 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>
|
||||
+328
@@ -0,0 +1,328 @@
|
||||
<?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.4 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="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="loggingType">
|
||||
<xs:group ref="loggingGroup"/>
|
||||
</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: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="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="forceCoversAnnotation" type="xs:boolean" default="false"/>
|
||||
<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"/>
|
||||
<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="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"/>
|
||||
<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="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="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"/>
|
||||
</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: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>
|
||||
+330
@@ -0,0 +1,330 @@
|
||||
<?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.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="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="loggingType">
|
||||
<xs:group ref="loggingGroup"/>
|
||||
</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: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:string">
|
||||
<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="colors" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="columns" type="columnsType" default="80"/>
|
||||
<xs:attribute name="convertDeprecationsToExceptions" type="xs:boolean" default="false"/>
|
||||
<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="forceCoversAnnotation" type="xs:boolean" default="false"/>
|
||||
<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"/>
|
||||
<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="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"/>
|
||||
<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="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:anyURI"/>
|
||||
<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="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"/>
|
||||
</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:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:group ref="pathGroup"/>
|
||||
<xs:element name="exclude" type="xs:string"/>
|
||||
</xs:choice>
|
||||
</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>
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
<?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;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* @internal This interface is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
interface Exception extends Throwable
|
||||
{
|
||||
}
|
||||
+2963
File diff suppressed because it is too large
Load Diff
Vendored
+3079
File diff suppressed because it is too large
Load Diff
+35
@@ -0,0 +1,35 @@
|
||||
<?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 IsFalse extends Constraint
|
||||
{
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'is false';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 $other === false;
|
||||
}
|
||||
}
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
<?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 IsTrue extends Constraint
|
||||
{
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'is true';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 $other === true;
|
||||
}
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
<?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;
|
||||
|
||||
/**
|
||||
* @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
|
||||
{
|
||||
/**
|
||||
* @var callable
|
||||
*
|
||||
* @psalm-var callable(CallbackInput $input): bool
|
||||
*/
|
||||
private $callback;
|
||||
|
||||
/** @psalm-param callable(CallbackInput $input): bool $callback */
|
||||
public function __construct(callable $callback)
|
||||
{
|
||||
$this->callback = $callback;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'is accepted by specified callback';
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $value. Returns true if the
|
||||
* constraint is met, false otherwise.
|
||||
*
|
||||
* @param mixed $other value or object to evaluate
|
||||
*
|
||||
* @psalm-param CallbackInput $other
|
||||
*/
|
||||
protected function matches($other): bool
|
||||
{
|
||||
return ($this->callback)($other);
|
||||
}
|
||||
}
|
||||
+142
@@ -0,0 +1,142 @@
|
||||
<?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 is_array;
|
||||
use function iterator_count;
|
||||
use function sprintf;
|
||||
use Countable;
|
||||
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
|
||||
{
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $expectedCount;
|
||||
|
||||
public function __construct(int $expected)
|
||||
{
|
||||
$this->expectedCount = $expected;
|
||||
}
|
||||
|
||||
public function toString(): string
|
||||
{
|
||||
return sprintf(
|
||||
'count matches %d',
|
||||
$this->expectedCount,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other. Returns true if the
|
||||
* constraint is met, false otherwise.
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
protected function matches($other): bool
|
||||
{
|
||||
return $this->expectedCount === $this->getCountOf($other);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
protected function getCountOf($other): ?int
|
||||
{
|
||||
if ($other instanceof Countable || is_array($other)) {
|
||||
return count($other);
|
||||
}
|
||||
|
||||
if ($other instanceof EmptyIterator) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ($other instanceof Traversable) {
|
||||
while ($other instanceof IteratorAggregate) {
|
||||
try {
|
||||
$other = $other->getIterator();
|
||||
} catch (\Exception $e) {
|
||||
throw new Exception(
|
||||
$e->getMessage(),
|
||||
$e->getCode(),
|
||||
$e,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$iterator = $other;
|
||||
|
||||
if ($iterator instanceof Generator) {
|
||||
return $this->getCountOfGenerator($iterator);
|
||||
}
|
||||
|
||||
if (!$iterator instanceof Iterator) {
|
||||
return iterator_count($iterator);
|
||||
}
|
||||
|
||||
$key = $iterator->key();
|
||||
$count = iterator_count($iterator);
|
||||
|
||||
// Manually rewind $iterator to previous key, since iterator_count
|
||||
// moves pointer.
|
||||
if ($key !== null) {
|
||||
$iterator->rewind();
|
||||
|
||||
while ($iterator->valid() && $key !== $iterator->key()) {
|
||||
$iterator->next();
|
||||
}
|
||||
}
|
||||
|
||||
return $count;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the total number of iterations from a generator.
|
||||
* This will fully exhaust the generator.
|
||||
*/
|
||||
protected function getCountOfGenerator(Generator $generator): int
|
||||
{
|
||||
for ($count = 0; $generator->valid(); $generator->next()) {
|
||||
$count++;
|
||||
}
|
||||
|
||||
return $count;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 sprintf(
|
||||
'actual size %d matches expected size %d',
|
||||
(int) $this->getCountOf($other),
|
||||
$this->expectedCount,
|
||||
);
|
||||
}
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
<?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 SebastianBergmann\RecursionContext\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class GreaterThan extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var float|int
|
||||
*/
|
||||
private $value;
|
||||
|
||||
/**
|
||||
* @param float|int $value
|
||||
*/
|
||||
public function __construct($value)
|
||||
{
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'is greater than ' . $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
|
||||
{
|
||||
return $this->value < $other;
|
||||
}
|
||||
}
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
<?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 gettype;
|
||||
use function sprintf;
|
||||
use function strpos;
|
||||
use Countable;
|
||||
use EmptyIterator;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsEmpty extends Constraint
|
||||
{
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'is empty';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 EmptyIterator) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($other instanceof Countable) {
|
||||
return count($other) === 0;
|
||||
}
|
||||
|
||||
return empty($other);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
{
|
||||
$type = gettype($other);
|
||||
|
||||
return sprintf(
|
||||
'%s %s %s',
|
||||
strpos($type, 'a') === 0 || strpos($type, 'o') === 0 ? 'an' : 'a',
|
||||
$type,
|
||||
$this->toString(),
|
||||
);
|
||||
}
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
<?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 SebastianBergmann\RecursionContext\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class LessThan extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var float|int
|
||||
*/
|
||||
private $value;
|
||||
|
||||
/**
|
||||
* @param float|int $value
|
||||
*/
|
||||
public function __construct($value)
|
||||
{
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'is less than ' . $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
|
||||
{
|
||||
return $this->value > $other;
|
||||
}
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
<?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 SameSize extends Count
|
||||
{
|
||||
public function __construct(iterable $expected)
|
||||
{
|
||||
parent::__construct((int) $this->getCountOf($expected));
|
||||
}
|
||||
}
|
||||
+270
@@ -0,0 +1,270 @@
|
||||
<?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 Countable;
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
use PHPUnit\Framework\SelfDescribing;
|
||||
use SebastianBergmann\Comparator\ComparisonFailure;
|
||||
use SebastianBergmann\Exporter\Exporter;
|
||||
use SebastianBergmann\RecursionContext\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
abstract class Constraint implements Countable, SelfDescribing
|
||||
{
|
||||
/**
|
||||
* @var ?Exporter
|
||||
*/
|
||||
private $exporter;
|
||||
|
||||
/**
|
||||
* 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
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false): ?bool
|
||||
{
|
||||
$success = false;
|
||||
|
||||
if ($this->matches($other)) {
|
||||
$success = true;
|
||||
}
|
||||
|
||||
if ($returnResult) {
|
||||
return $success;
|
||||
}
|
||||
|
||||
if (!$success) {
|
||||
$this->fail($other, $description);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Counts the number of constraint elements.
|
||||
*/
|
||||
public function count(): int
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
protected function exporter(): Exporter
|
||||
{
|
||||
if ($this->exporter === null) {
|
||||
$this->exporter = new Exporter;
|
||||
}
|
||||
|
||||
return $this->exporter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other. Returns true if the
|
||||
* constraint is met, false otherwise.
|
||||
*
|
||||
* This method can be overridden to implement the evaluation algorithm.
|
||||
*
|
||||
* @param mixed $other value or object to evaluate
|
||||
*
|
||||
* @codeCoverageIgnore
|
||||
*/
|
||||
protected function matches($other): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws an exception for the given compared value and test description.
|
||||
*
|
||||
* @param mixed $other evaluated value or object
|
||||
* @param string $description Additional information about the test
|
||||
*
|
||||
* @throws ExpectationFailedException
|
||||
* @throws InvalidArgumentException
|
||||
*
|
||||
* @psalm-return never-return
|
||||
*/
|
||||
protected function fail($other, $description, ?ComparisonFailure $comparisonFailure = null): void
|
||||
{
|
||||
$failureDescription = sprintf(
|
||||
'Failed asserting that %s.',
|
||||
$this->failureDescription($other),
|
||||
);
|
||||
|
||||
$additionalFailureDescription = $this->additionalFailureDescription($other);
|
||||
|
||||
if ($additionalFailureDescription) {
|
||||
$failureDescription .= "\n" . $additionalFailureDescription;
|
||||
}
|
||||
|
||||
if (!empty($description)) {
|
||||
$failureDescription = $description . "\n" . $failureDescription;
|
||||
}
|
||||
|
||||
throw new ExpectationFailedException(
|
||||
$failureDescription,
|
||||
$comparisonFailure,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return additional failure description where needed.
|
||||
*
|
||||
* The function can be overridden to provide additional failure
|
||||
* information like a diff
|
||||
*
|
||||
* @param mixed $other evaluated value or object
|
||||
*/
|
||||
protected function additionalFailureDescription($other): string
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* To provide additional failure information additionalFailureDescription
|
||||
* can be used.
|
||||
*
|
||||
* @param mixed $other evaluated value or object
|
||||
*
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
protected function failureDescription($other): string
|
||||
{
|
||||
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 failure 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;
|
||||
}
|
||||
}
|
||||
+137
@@ -0,0 +1,137 @@
|
||||
<?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;
|
||||
use SebastianBergmann\RecursionContext\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsEqual extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var mixed
|
||||
*/
|
||||
private $value;
|
||||
|
||||
/**
|
||||
* @var float
|
||||
*/
|
||||
private $delta;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $canonicalize;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $ignoreCase;
|
||||
|
||||
public function __construct($value, float $delta = 0.0, bool $canonicalize = false, bool $ignoreCase = false)
|
||||
{
|
||||
$this->value = $value;
|
||||
$this->delta = $delta;
|
||||
$this->canonicalize = $canonicalize;
|
||||
$this->ignoreCase = $ignoreCase;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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,
|
||||
$this->canonicalize,
|
||||
$this->ignoreCase,
|
||||
);
|
||||
} 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 InvalidArgumentException
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
$delta = '';
|
||||
|
||||
if (is_string($this->value)) {
|
||||
if (strpos($this->value, "\n") !== false) {
|
||||
return 'is equal to <text>';
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
"is equal to '%s'",
|
||||
$this->value,
|
||||
);
|
||||
}
|
||||
|
||||
if ($this->delta != 0) {
|
||||
$delta = sprintf(
|
||||
' with delta <%F>',
|
||||
$this->delta,
|
||||
);
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
'is equal to %s%s',
|
||||
$this->exporter()->export($this->value),
|
||||
$delta,
|
||||
);
|
||||
}
|
||||
}
|
||||
+109
@@ -0,0 +1,109 @@
|
||||
<?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;
|
||||
use SebastianBergmann\RecursionContext\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @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 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),
|
||||
);
|
||||
}
|
||||
}
|
||||
+109
@@ -0,0 +1,109 @@
|
||||
<?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;
|
||||
use SebastianBergmann\RecursionContext\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @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 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),
|
||||
);
|
||||
}
|
||||
}
|
||||
+101
@@ -0,0 +1,101 @@
|
||||
<?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;
|
||||
use SebastianBergmann\RecursionContext\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @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 InvalidArgumentException
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return sprintf(
|
||||
'is equal to %s with delta <%F>',
|
||||
$this->exporter()->export($this->value),
|
||||
$this->delta,
|
||||
);
|
||||
}
|
||||
}
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
<?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 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
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $className;
|
||||
|
||||
public function __construct(string $className)
|
||||
{
|
||||
$this->className = $className;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return sprintf(
|
||||
'exception of type "%s"',
|
||||
$this->className,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 $other instanceof $this->className;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
{
|
||||
if ($other !== null) {
|
||||
$message = '';
|
||||
|
||||
if ($other instanceof Throwable) {
|
||||
$message = '. Message was: "' . $other->getMessage() . '" at'
|
||||
. "\n" . Filter::getFilteredStacktrace($other);
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
'exception of type "%s" matches expected exception "%s"%s',
|
||||
get_class($other),
|
||||
$this->className,
|
||||
$message,
|
||||
);
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
'exception of type "%s" is thrown',
|
||||
$this->className,
|
||||
);
|
||||
}
|
||||
}
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
<?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 SebastianBergmann\RecursionContext\InvalidArgumentException;
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ExceptionCode extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var int|string
|
||||
*/
|
||||
private $expectedCode;
|
||||
|
||||
/**
|
||||
* @param int|string $expected
|
||||
*/
|
||||
public function __construct($expected)
|
||||
{
|
||||
$this->expectedCode = $expected;
|
||||
}
|
||||
|
||||
public function toString(): string
|
||||
{
|
||||
return 'exception code is ';
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other. Returns true if the
|
||||
* constraint is met, false otherwise.
|
||||
*
|
||||
* @param Throwable $other
|
||||
*/
|
||||
protected function matches($other): bool
|
||||
{
|
||||
return (string) $other->getCode() === (string) $this->expectedCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 InvalidArgumentException
|
||||
*/
|
||||
protected function failureDescription($other): string
|
||||
{
|
||||
return sprintf(
|
||||
'%s is equal to expected exception code %s',
|
||||
$this->exporter()->export($other->getCode()),
|
||||
$this->exporter()->export($this->expectedCode),
|
||||
);
|
||||
}
|
||||
}
|
||||
+78
@@ -0,0 +1,78 @@
|
||||
<?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 strpos;
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ExceptionMessage extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $expectedMessage;
|
||||
|
||||
public function __construct(string $expected)
|
||||
{
|
||||
$this->expectedMessage = $expected;
|
||||
}
|
||||
|
||||
public function toString(): string
|
||||
{
|
||||
if ($this->expectedMessage === '') {
|
||||
return 'exception message is empty';
|
||||
}
|
||||
|
||||
return 'exception message contains ';
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other. Returns true if the
|
||||
* constraint is met, false otherwise.
|
||||
*
|
||||
* @param Throwable $other
|
||||
*/
|
||||
protected function matches($other): bool
|
||||
{
|
||||
if ($this->expectedMessage === '') {
|
||||
return $other->getMessage() === '';
|
||||
}
|
||||
|
||||
return strpos((string) $other->getMessage(), $this->expectedMessage) !== 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
|
||||
*/
|
||||
protected function failureDescription($other): string
|
||||
{
|
||||
if ($this->expectedMessage === '') {
|
||||
return sprintf(
|
||||
"exception message is empty but is '%s'",
|
||||
$other->getMessage(),
|
||||
);
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
"exception message '%s' contains '%s'",
|
||||
$other->getMessage(),
|
||||
$this->expectedMessage,
|
||||
);
|
||||
}
|
||||
}
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
<?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 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
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $expectedMessageRegExp;
|
||||
|
||||
public function __construct(string $expected)
|
||||
{
|
||||
$this->expectedMessageRegExp = $expected;
|
||||
}
|
||||
|
||||
public function toString(): string
|
||||
{
|
||||
return 'exception message matches ';
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other. Returns true if the
|
||||
* constraint is met, false otherwise.
|
||||
*
|
||||
* @param \PHPUnit\Framework\Exception $other
|
||||
*
|
||||
* @throws \PHPUnit\Framework\Exception
|
||||
* @throws Exception
|
||||
*/
|
||||
protected function matches($other): bool
|
||||
{
|
||||
$match = RegularExpressionUtil::safeMatch($this->expectedMessageRegExp, $other->getMessage());
|
||||
|
||||
if ($match === false) {
|
||||
throw new \PHPUnit\Framework\Exception(
|
||||
"Invalid expected exception message regex given: '{$this->expectedMessageRegExp}'",
|
||||
);
|
||||
}
|
||||
|
||||
return $match === 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 sprintf(
|
||||
"exception message '%s' matches '%s'",
|
||||
$other->getMessage(),
|
||||
$this->expectedMessageRegExp,
|
||||
);
|
||||
}
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
<?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_dir;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class DirectoryExists extends Constraint
|
||||
{
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'directory exists';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 is_dir($other);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 sprintf(
|
||||
'directory "%s" exists',
|
||||
$other,
|
||||
);
|
||||
}
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
<?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 file_exists;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class FileExists extends Constraint
|
||||
{
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'file exists';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 file_exists($other);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 sprintf(
|
||||
'file "%s" exists',
|
||||
$other,
|
||||
);
|
||||
}
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
<?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_readable;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsReadable extends Constraint
|
||||
{
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'is readable';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 is_readable($other);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 sprintf(
|
||||
'"%s" is readable',
|
||||
$other,
|
||||
);
|
||||
}
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
<?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_writable;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsWritable extends Constraint
|
||||
{
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'is writable';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 is_writable($other);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 sprintf(
|
||||
'"%s" is writable',
|
||||
$other,
|
||||
);
|
||||
}
|
||||
}
|
||||
+51
@@ -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;
|
||||
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsAnything extends 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 ExpectationFailedException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false): ?bool
|
||||
{
|
||||
return $returnResult ? true : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'is anything';
|
||||
}
|
||||
|
||||
/**
|
||||
* Counts the number of constraint elements.
|
||||
*/
|
||||
public function count(): int
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
+127
@@ -0,0 +1,127 @@
|
||||
<?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_array;
|
||||
use function is_object;
|
||||
use function is_string;
|
||||
use function sprintf;
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
use SebastianBergmann\Comparator\ComparisonFailure;
|
||||
use SebastianBergmann\RecursionContext\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsIdentical 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
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false): ?bool
|
||||
{
|
||||
$success = $this->value === $other;
|
||||
|
||||
if ($returnResult) {
|
||||
return $success;
|
||||
}
|
||||
|
||||
if (!$success) {
|
||||
$f = null;
|
||||
|
||||
// if both values are strings, make sure a diff is generated
|
||||
if (is_string($this->value) && is_string($other)) {
|
||||
$f = new ComparisonFailure(
|
||||
$this->value,
|
||||
$other,
|
||||
sprintf("'%s'", $this->value),
|
||||
sprintf("'%s'", $other),
|
||||
);
|
||||
}
|
||||
|
||||
// if both values are array, make sure a diff is generated
|
||||
if (is_array($this->value) && is_array($other)) {
|
||||
$f = new ComparisonFailure(
|
||||
$this->value,
|
||||
$other,
|
||||
$this->exporter()->export($this->value),
|
||||
$this->exporter()->export($other),
|
||||
);
|
||||
}
|
||||
|
||||
$this->fail($other, $description, $f);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
if (is_object($this->value)) {
|
||||
return 'is identical to an object of class "' .
|
||||
get_class($this->value) . '"';
|
||||
}
|
||||
|
||||
return 'is identical to ' . $this->exporter()->export($this->value);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 InvalidArgumentException
|
||||
*/
|
||||
protected function failureDescription($other): string
|
||||
{
|
||||
if (is_object($this->value) && is_object($other)) {
|
||||
return 'two variables reference the same object';
|
||||
}
|
||||
|
||||
if (is_string($this->value) && is_string($other)) {
|
||||
return 'two strings are identical';
|
||||
}
|
||||
|
||||
if (is_array($this->value) && is_array($other)) {
|
||||
return 'two arrays are identical';
|
||||
}
|
||||
|
||||
return parent::failureDescription($other);
|
||||
}
|
||||
}
|
||||
+110
@@ -0,0 +1,110 @@
|
||||
<?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 json_decode;
|
||||
use function sprintf;
|
||||
use PHPUnit\Framework\Exception;
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
use PHPUnit\Util\Json;
|
||||
use SebastianBergmann\Comparator\ComparisonFailure;
|
||||
use SebastianBergmann\RecursionContext\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class JsonMatches extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $value;
|
||||
|
||||
public function __construct(string $value)
|
||||
{
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the object.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return sprintf(
|
||||
'matches JSON string "%s"',
|
||||
$this->value,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates the constraint for parameter $other. Returns true if the
|
||||
* constraint is met, false otherwise.
|
||||
*
|
||||
* This method can be overridden to implement the evaluation algorithm.
|
||||
*
|
||||
* @param mixed $other value or object to evaluate
|
||||
*/
|
||||
protected function matches($other): bool
|
||||
{
|
||||
[$error, $recodedOther] = Json::canonicalize($other);
|
||||
|
||||
if ($error) {
|
||||
return false;
|
||||
}
|
||||
|
||||
[$error, $recodedValue] = Json::canonicalize($this->value);
|
||||
|
||||
if ($error) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $recodedOther == $recodedValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws an exception for the given compared value and test description.
|
||||
*
|
||||
* @param mixed $other evaluated value or object
|
||||
* @param string $description Additional information about the test
|
||||
*
|
||||
* @throws Exception
|
||||
* @throws ExpectationFailedException
|
||||
* @throws InvalidArgumentException
|
||||
*
|
||||
* @psalm-return never-return
|
||||
*/
|
||||
protected function fail($other, $description, ?ComparisonFailure $comparisonFailure = null): void
|
||||
{
|
||||
if ($comparisonFailure === null) {
|
||||
[$error, $recodedOther] = Json::canonicalize($other);
|
||||
|
||||
if ($error) {
|
||||
parent::fail($other, $description);
|
||||
}
|
||||
|
||||
[$error, $recodedValue] = Json::canonicalize($this->value);
|
||||
|
||||
if ($error) {
|
||||
parent::fail($other, $description);
|
||||
}
|
||||
|
||||
$comparisonFailure = new ComparisonFailure(
|
||||
json_decode($this->value),
|
||||
json_decode($other),
|
||||
Json::prettify($recodedValue),
|
||||
Json::prettify($recodedOther),
|
||||
false,
|
||||
'Failed asserting that two json values are equal.',
|
||||
);
|
||||
}
|
||||
|
||||
parent::fail($other, $description, $comparisonFailure);
|
||||
}
|
||||
}
|
||||
+78
@@ -0,0 +1,78 @@
|
||||
<?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 const JSON_ERROR_CTRL_CHAR;
|
||||
use const JSON_ERROR_DEPTH;
|
||||
use const JSON_ERROR_NONE;
|
||||
use const JSON_ERROR_STATE_MISMATCH;
|
||||
use const JSON_ERROR_SYNTAX;
|
||||
use const JSON_ERROR_UTF8;
|
||||
use function strtolower;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class JsonMatchesErrorMessageProvider
|
||||
{
|
||||
/**
|
||||
* Translates JSON error to a human readable string.
|
||||
*/
|
||||
public static function determineJsonError(string $error, string $prefix = ''): ?string
|
||||
{
|
||||
switch ($error) {
|
||||
case JSON_ERROR_NONE:
|
||||
return null;
|
||||
|
||||
case JSON_ERROR_DEPTH:
|
||||
return $prefix . 'Maximum stack depth exceeded';
|
||||
|
||||
case JSON_ERROR_STATE_MISMATCH:
|
||||
return $prefix . 'Underflow or the modes mismatch';
|
||||
|
||||
case JSON_ERROR_CTRL_CHAR:
|
||||
return $prefix . 'Unexpected control character found';
|
||||
|
||||
case JSON_ERROR_SYNTAX:
|
||||
return $prefix . 'Syntax error, malformed JSON';
|
||||
|
||||
case JSON_ERROR_UTF8:
|
||||
return $prefix . 'Malformed UTF-8 characters, possibly incorrectly encoded';
|
||||
|
||||
default:
|
||||
return $prefix . 'Unknown error';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a given type to a human readable message prefix.
|
||||
*/
|
||||
public static function translateTypeToPrefix(string $type): string
|
||||
{
|
||||
switch (strtolower($type)) {
|
||||
case 'expected':
|
||||
$prefix = 'Expected value JSON decode error - ';
|
||||
|
||||
break;
|
||||
|
||||
case 'actual':
|
||||
$prefix = 'Actual value JSON decode error - ';
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
$prefix = '';
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return $prefix;
|
||||
}
|
||||
}
|
||||
+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\Constraint;
|
||||
|
||||
use function is_finite;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsFinite extends Constraint
|
||||
{
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'is finite';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 is_finite($other);
|
||||
}
|
||||
}
|
||||
+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\Constraint;
|
||||
|
||||
use function is_infinite;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsInfinite extends Constraint
|
||||
{
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'is infinite';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 is_infinite($other);
|
||||
}
|
||||
}
|
||||
+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\Constraint;
|
||||
|
||||
use function is_nan;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsNan extends Constraint
|
||||
{
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'is nan';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 is_nan($other);
|
||||
}
|
||||
}
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
<?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 function sprintf;
|
||||
use PHPUnit\Framework\Exception;
|
||||
use ReflectionClass;
|
||||
use ReflectionException;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*
|
||||
* @deprecated https://github.com/sebastianbergmann/phpunit/issues/4601
|
||||
*/
|
||||
class ClassHasAttribute extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $attributeName;
|
||||
|
||||
public function __construct(string $attributeName)
|
||||
{
|
||||
$this->attributeName = $attributeName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return sprintf(
|
||||
'has attribute "%s"',
|
||||
$this->attributeName,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
{
|
||||
try {
|
||||
return (new ReflectionClass($other))->hasProperty($this->attributeName);
|
||||
// @codeCoverageIgnoreStart
|
||||
} catch (ReflectionException $e) {
|
||||
throw new Exception(
|
||||
$e->getMessage(),
|
||||
$e->getCode(),
|
||||
$e,
|
||||
);
|
||||
}
|
||||
// @codeCoverageIgnoreEnd
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 sprintf(
|
||||
'%sclass "%s" %s',
|
||||
is_object($other) ? 'object of ' : '',
|
||||
is_object($other) ? get_class($other) : $other,
|
||||
$this->toString(),
|
||||
);
|
||||
}
|
||||
|
||||
protected function attributeName(): string
|
||||
{
|
||||
return $this->attributeName;
|
||||
}
|
||||
}
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
<?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 PHPUnit\Framework\Exception;
|
||||
use ReflectionClass;
|
||||
use ReflectionException;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*
|
||||
* @deprecated https://github.com/sebastianbergmann/phpunit/issues/4601
|
||||
*/
|
||||
final class ClassHasStaticAttribute extends ClassHasAttribute
|
||||
{
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return sprintf(
|
||||
'has static attribute "%s"',
|
||||
$this->attributeName(),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
{
|
||||
try {
|
||||
$class = new ReflectionClass($other);
|
||||
|
||||
if ($class->hasProperty($this->attributeName())) {
|
||||
return $class->getProperty($this->attributeName())->isStatic();
|
||||
}
|
||||
// @codeCoverageIgnoreStart
|
||||
} catch (ReflectionException $e) {
|
||||
throw new Exception(
|
||||
$e->getMessage(),
|
||||
$e->getCode(),
|
||||
$e,
|
||||
);
|
||||
}
|
||||
// @codeCoverageIgnoreEnd
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+151
@@ -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();
|
||||
}
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
<?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 ReflectionObject;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*
|
||||
* @deprecated https://github.com/sebastianbergmann/phpunit/issues/4601
|
||||
*/
|
||||
final class ObjectHasAttribute extends ClassHasAttribute
|
||||
{
|
||||
/**
|
||||
* 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 (new ReflectionObject($other))->hasProperty($this->attributeName());
|
||||
}
|
||||
}
|
||||
+84
@@ -0,0 +1,84 @@
|
||||
<?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 gettype;
|
||||
use function is_object;
|
||||
use function sprintf;
|
||||
use ReflectionObject;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ObjectHasProperty extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $propertyName;
|
||||
|
||||
public function __construct(string $propertyName)
|
||||
{
|
||||
$this->propertyName = $propertyName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return sprintf(
|
||||
'has property "%s"',
|
||||
$this->propertyName,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 (!is_object($other)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return (new ReflectionObject($other))->hasProperty($this->propertyName);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
{
|
||||
if (is_object($other)) {
|
||||
return sprintf(
|
||||
'object of class "%s" %s',
|
||||
get_class($other),
|
||||
$this->toString(),
|
||||
);
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
'"%s" (%s) %s',
|
||||
$other,
|
||||
gettype($other),
|
||||
$this->toString(),
|
||||
);
|
||||
}
|
||||
}
|
||||
+148
@@ -0,0 +1,148 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
+51
@@ -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();
|
||||
}
|
||||
}
|
||||
+143
@@ -0,0 +1,143 @@
|
||||
<?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);
|
||||
|
||||
if (count($matches) === 0) {
|
||||
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();
|
||||
}
|
||||
}
|
||||
+51
@@ -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;
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
<?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),
|
||||
);
|
||||
}
|
||||
}
|
||||
+55
@@ -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();
|
||||
}
|
||||
}
|
||||
+141
@@ -0,0 +1,141 @@
|
||||
<?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 SebastianBergmann\RecursionContext\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @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 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 member 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);
|
||||
}
|
||||
}
|
||||
+78
@@ -0,0 +1,78 @@
|
||||
<?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 json_decode;
|
||||
use function json_last_error;
|
||||
use function sprintf;
|
||||
use SebastianBergmann\RecursionContext\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsJson extends Constraint
|
||||
{
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'is valid JSON';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 === '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
json_decode($other);
|
||||
|
||||
if (json_last_error()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 InvalidArgumentException
|
||||
*/
|
||||
protected function failureDescription($other): string
|
||||
{
|
||||
if ($other === '') {
|
||||
return 'an empty string is valid JSON';
|
||||
}
|
||||
|
||||
json_decode($other);
|
||||
$error = (string) JsonMatchesErrorMessageProvider::determineJsonError(
|
||||
(string) json_last_error(),
|
||||
);
|
||||
|
||||
return sprintf(
|
||||
'%s is valid JSON (%s)',
|
||||
$this->exporter()->shortenedExport($other),
|
||||
$error,
|
||||
);
|
||||
}
|
||||
}
|
||||
+51
@@ -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;
|
||||
|
||||
use function preg_match;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
class RegularExpression extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $pattern;
|
||||
|
||||
public function __construct(string $pattern)
|
||||
{
|
||||
$this->pattern = $pattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return sprintf(
|
||||
'matches PCRE pattern "%s"',
|
||||
$this->pattern,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 preg_match($this->pattern, $other) > 0;
|
||||
}
|
||||
}
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
<?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 mb_stripos;
|
||||
use function mb_strtolower;
|
||||
use function sprintf;
|
||||
use function strpos;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class StringContains extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $string;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $ignoreCase;
|
||||
|
||||
public function __construct(string $string, bool $ignoreCase = false)
|
||||
{
|
||||
$this->string = $string;
|
||||
$this->ignoreCase = $ignoreCase;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
if ($this->ignoreCase) {
|
||||
$string = mb_strtolower($this->string, 'UTF-8');
|
||||
} else {
|
||||
$string = $this->string;
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
'contains "%s"',
|
||||
$string,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 ('' === $this->string) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($this->ignoreCase) {
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
<?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 strlen;
|
||||
use function substr;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class StringEndsWith extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $suffix;
|
||||
|
||||
public function __construct(string $suffix)
|
||||
{
|
||||
$this->suffix = $suffix;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'ends with "' . $this->suffix . '"';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 substr($other, 0 - strlen($this->suffix)) === $this->suffix;
|
||||
}
|
||||
}
|
||||
+109
@@ -0,0 +1,109 @@
|
||||
<?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 const DIRECTORY_SEPARATOR;
|
||||
use function explode;
|
||||
use function implode;
|
||||
use function preg_match;
|
||||
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
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $string;
|
||||
|
||||
public function __construct(string $string)
|
||||
{
|
||||
parent::__construct(
|
||||
$this->createPatternFromFormat(
|
||||
$this->convertNewlines($string),
|
||||
),
|
||||
);
|
||||
|
||||
$this->string = $string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 parent::matches(
|
||||
$this->convertNewlines($other),
|
||||
);
|
||||
}
|
||||
|
||||
protected function failureDescription($other): string
|
||||
{
|
||||
return 'string matches format description';
|
||||
}
|
||||
|
||||
protected function additionalFailureDescription($other): string
|
||||
{
|
||||
$from = explode("\n", $this->string);
|
||||
$to = explode("\n", $this->convertNewlines($other));
|
||||
|
||||
foreach ($from as $index => $line) {
|
||||
if (isset($to[$index]) && $line !== $to[$index]) {
|
||||
$line = $this->createPatternFromFormat($line);
|
||||
|
||||
if (preg_match($line, $to[$index]) > 0) {
|
||||
$from[$index] = $to[$index];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->string = implode("\n", $from);
|
||||
$other = implode("\n", $to);
|
||||
|
||||
return (new Differ(new UnifiedDiffOutputBuilder("--- Expected\n+++ Actual\n")))->diff($this->string, $other);
|
||||
}
|
||||
|
||||
private function createPatternFromFormat(string $string): string
|
||||
{
|
||||
$string = strtr(
|
||||
preg_quote($string, '/'),
|
||||
[
|
||||
'%%' => '%',
|
||||
'%e' => '\\' . DIRECTORY_SEPARATOR,
|
||||
'%s' => '[^\r\n]+',
|
||||
'%S' => '[^\r\n]*',
|
||||
'%a' => '.+',
|
||||
'%A' => '.*',
|
||||
'%w' => '\s*',
|
||||
'%i' => '[+-]?\d+',
|
||||
'%d' => '\d+',
|
||||
'%x' => '[0-9a-fA-F]+',
|
||||
'%f' => '[+-]?\.?\d+\.?\d*(?:[Ee][+-]?\d+)?',
|
||||
'%c' => '.',
|
||||
],
|
||||
);
|
||||
|
||||
return '/^' . $string . '$/s';
|
||||
}
|
||||
|
||||
private function convertNewlines(string $text): string
|
||||
{
|
||||
return preg_replace('/\r\n/', "\n", $text);
|
||||
}
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
<?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 strpos;
|
||||
use PHPUnit\Framework\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class StringStartsWith extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $prefix;
|
||||
|
||||
public function __construct(string $prefix)
|
||||
{
|
||||
if ($prefix === '') {
|
||||
throw InvalidArgumentException::create(1, 'non-empty string');
|
||||
}
|
||||
|
||||
$this->prefix = $prefix;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'starts with "' . $this->prefix . '"';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 strpos((string) $other, $this->prefix) === 0;
|
||||
}
|
||||
}
|
||||
+78
@@ -0,0 +1,78 @@
|
||||
<?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_key_exists;
|
||||
use function is_array;
|
||||
use ArrayAccess;
|
||||
use SebastianBergmann\RecursionContext\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ArrayHasKey extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var int|string
|
||||
*/
|
||||
private $key;
|
||||
|
||||
/**
|
||||
* @param int|string $key
|
||||
*/
|
||||
public function __construct($key)
|
||||
{
|
||||
$this->key = $key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'has the key ' . $this->exporter()->export($this->key);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 (is_array($other)) {
|
||||
return array_key_exists($this->key, $other);
|
||||
}
|
||||
|
||||
if ($other instanceof ArrayAccess) {
|
||||
return $other->offsetExists($this->key);
|
||||
}
|
||||
|
||||
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 InvalidArgumentException
|
||||
*/
|
||||
protected function failureDescription($other): string
|
||||
{
|
||||
return 'an array ' . $this->toString();
|
||||
}
|
||||
}
|
||||
+64
@@ -0,0 +1,64 @@
|
||||
<?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 sprintf;
|
||||
use SebastianBergmann\RecursionContext\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
abstract class TraversableContains extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var mixed
|
||||
*/
|
||||
private $value;
|
||||
|
||||
public function __construct($value)
|
||||
{
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'contains ' . $this->exporter()->export($this->value);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 InvalidArgumentException
|
||||
*/
|
||||
protected function failureDescription($other): string
|
||||
{
|
||||
return sprintf(
|
||||
'%s %s',
|
||||
is_array($other) ? 'an array' : 'a traversable',
|
||||
$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->offsetExists($this->value());
|
||||
}
|
||||
|
||||
foreach ($other as $element) {
|
||||
/* @noinspection TypeUnsafeComparisonInspection */
|
||||
if ($this->value() == $element) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+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->offsetExists($this->value());
|
||||
}
|
||||
|
||||
foreach ($other as $element) {
|
||||
if ($this->value() === $element) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+93
@@ -0,0 +1,93 @@
|
||||
<?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\Exception;
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
use SebastianBergmann\RecursionContext\InvalidArgumentException;
|
||||
use Traversable;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class TraversableContainsOnly extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var Constraint
|
||||
*/
|
||||
private $constraint;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $type;
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public function __construct(string $type, bool $isNativeType = true)
|
||||
{
|
||||
if ($isNativeType) {
|
||||
$this->constraint = new IsType($type);
|
||||
} else {
|
||||
$this->constraint = new IsInstanceOf(
|
||||
$type,
|
||||
);
|
||||
}
|
||||
|
||||
$this->type = $type;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @param mixed|Traversable $other
|
||||
*
|
||||
* @throws ExpectationFailedException
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
public function evaluate($other, string $description = '', bool $returnResult = false): ?bool
|
||||
{
|
||||
$success = true;
|
||||
|
||||
foreach ($other as $item) {
|
||||
if (!$this->constraint->evaluate($item, '', true)) {
|
||||
$success = false;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($returnResult) {
|
||||
return $success;
|
||||
}
|
||||
|
||||
if (!$success) {
|
||||
$this->fail($other, $description);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'contains only values of type "' . $this->type . '"';
|
||||
}
|
||||
}
|
||||
+88
@@ -0,0 +1,88 @@
|
||||
<?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 ReflectionClass;
|
||||
use ReflectionException;
|
||||
use SebastianBergmann\RecursionContext\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsInstanceOf extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $className;
|
||||
|
||||
public function __construct(string $className)
|
||||
{
|
||||
$this->className = $className;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return sprintf(
|
||||
'is instance of %s "%s"',
|
||||
$this->getType(),
|
||||
$this->className,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 $other instanceof $this->className;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 InvalidArgumentException
|
||||
*/
|
||||
protected function failureDescription($other): string
|
||||
{
|
||||
return sprintf(
|
||||
'%s is an instance of %s "%s"',
|
||||
$this->exporter()->shortenedExport($other),
|
||||
$this->getType(),
|
||||
$this->className,
|
||||
);
|
||||
}
|
||||
|
||||
private function getType(): string
|
||||
{
|
||||
try {
|
||||
$reflection = new ReflectionClass($this->className);
|
||||
|
||||
if ($reflection->isInterface()) {
|
||||
return 'interface';
|
||||
}
|
||||
} catch (ReflectionException $e) {
|
||||
}
|
||||
|
||||
return 'class';
|
||||
}
|
||||
}
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
<?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 IsNull extends Constraint
|
||||
{
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return 'is null';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 $other === null;
|
||||
}
|
||||
}
|
||||
+211
@@ -0,0 +1,211 @@
|
||||
<?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 gettype;
|
||||
use function is_array;
|
||||
use function is_bool;
|
||||
use function is_callable;
|
||||
use function is_float;
|
||||
use function is_int;
|
||||
use function is_iterable;
|
||||
use function is_numeric;
|
||||
use function is_object;
|
||||
use function is_scalar;
|
||||
use function is_string;
|
||||
use function sprintf;
|
||||
use PHPUnit\Framework\Exception;
|
||||
|
||||
/**
|
||||
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class IsType extends Constraint
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const TYPE_ARRAY = 'array';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const TYPE_BOOL = 'bool';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const TYPE_FLOAT = 'float';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const TYPE_INT = 'int';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const TYPE_NULL = 'null';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const TYPE_NUMERIC = 'numeric';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const TYPE_OBJECT = 'object';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const TYPE_RESOURCE = 'resource';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const TYPE_CLOSED_RESOURCE = 'resource (closed)';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const TYPE_STRING = 'string';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const TYPE_SCALAR = 'scalar';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const TYPE_CALLABLE = 'callable';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const TYPE_ITERABLE = 'iterable';
|
||||
|
||||
/**
|
||||
* @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,
|
||||
'resource (closed)' => true,
|
||||
'string' => true,
|
||||
'scalar' => true,
|
||||
'callable' => true,
|
||||
'iterable' => true,
|
||||
];
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $type;
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public function __construct(string $type)
|
||||
{
|
||||
if (!isset(self::KNOWN_TYPES[$type])) {
|
||||
throw new Exception(
|
||||
sprintf(
|
||||
'Type specified for PHPUnit\Framework\Constraint\IsType <%s> ' .
|
||||
'is not a valid type.',
|
||||
$type,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
$this->type = $type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the constraint.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return sprintf(
|
||||
'is of type "%s"',
|
||||
$this->type,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
{
|
||||
switch ($this->type) {
|
||||
case 'numeric':
|
||||
return is_numeric($other);
|
||||
|
||||
case 'integer':
|
||||
case 'int':
|
||||
return is_int($other);
|
||||
|
||||
case 'double':
|
||||
case 'float':
|
||||
case 'real':
|
||||
return is_float($other);
|
||||
|
||||
case 'string':
|
||||
return is_string($other);
|
||||
|
||||
case 'boolean':
|
||||
case 'bool':
|
||||
return is_bool($other);
|
||||
|
||||
case 'null':
|
||||
return null === $other;
|
||||
|
||||
case 'array':
|
||||
return is_array($other);
|
||||
|
||||
case 'object':
|
||||
return is_object($other);
|
||||
|
||||
case 'resource':
|
||||
$type = gettype($other);
|
||||
|
||||
return $type === 'resource' || $type === 'resource (closed)';
|
||||
|
||||
case 'resource (closed)':
|
||||
return gettype($other) === 'resource (closed)';
|
||||
|
||||
case 'scalar':
|
||||
return is_scalar($other);
|
||||
|
||||
case 'callable':
|
||||
return is_callable($other);
|
||||
|
||||
case 'iterable':
|
||||
return is_iterable($other);
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
+76
@@ -0,0 +1,76 @@
|
||||
<?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 explode;
|
||||
use PHPUnit\Util\Test as TestUtil;
|
||||
use SebastianBergmann\RecursionContext\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class DataProviderTestSuite extends TestSuite
|
||||
{
|
||||
/**
|
||||
* @var list<ExecutionOrderDependency>
|
||||
*/
|
||||
private $dependencies = [];
|
||||
|
||||
/**
|
||||
* @param list<ExecutionOrderDependency> $dependencies
|
||||
*/
|
||||
public function setDependencies(array $dependencies): void
|
||||
{
|
||||
$this->dependencies = $dependencies;
|
||||
|
||||
foreach ($this->tests as $test) {
|
||||
if (!$test instanceof TestCase) {
|
||||
// @codeCoverageIgnoreStart
|
||||
continue;
|
||||
// @codeCoverageIgnoreStart
|
||||
}
|
||||
$test->setDependencies($dependencies);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return list<ExecutionOrderDependency>
|
||||
*/
|
||||
public function provides(): array
|
||||
{
|
||||
if ($this->providedTests === null) {
|
||||
$this->providedTests = [new ExecutionOrderDependency($this->getName())];
|
||||
}
|
||||
|
||||
return $this->providedTests;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return list<ExecutionOrderDependency>
|
||||
*/
|
||||
public function requires(): array
|
||||
{
|
||||
// A DataProviderTestSuite does not have to traverse its child tests
|
||||
// as these are inherited and cannot reference dataProvider rows directly
|
||||
return $this->dependencies;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the size of the each test created using the data provider(s).
|
||||
*
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
public function getSize(): int
|
||||
{
|
||||
[$className, $methodName] = explode('::', $this->getName());
|
||||
|
||||
return TestUtil::getSize($className, $methodName);
|
||||
}
|
||||
}
|
||||
Vendored
+17
@@ -0,0 +1,17 @@
|
||||
<?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\Error;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class Deprecated extends Error
|
||||
{
|
||||
}
|
||||
Vendored
+26
@@ -0,0 +1,26 @@
|
||||
<?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\Error;
|
||||
|
||||
use PHPUnit\Framework\Exception;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
class Error extends Exception
|
||||
{
|
||||
public function __construct(string $message, int $code, string $file, int $line, ?\Exception $previous = null)
|
||||
{
|
||||
parent::__construct($message, $code, $previous);
|
||||
|
||||
$this->file = $file;
|
||||
$this->line = $line;
|
||||
}
|
||||
}
|
||||
Vendored
+17
@@ -0,0 +1,17 @@
|
||||
<?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\Error;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class Notice extends Error
|
||||
{
|
||||
}
|
||||
Vendored
+17
@@ -0,0 +1,17 @@
|
||||
<?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\Error;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class Warning extends Error
|
||||
{
|
||||
}
|
||||
Vendored
+66
@@ -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;
|
||||
}
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
<?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
|
||||
*/
|
||||
class AssertionFailedError extends Exception implements SelfDescribing
|
||||
{
|
||||
/**
|
||||
* Wrapper for getMessage() which is declared as final.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return $this->getMessage();
|
||||
}
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
<?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
|
||||
*/
|
||||
class CodeCoverageException extends Exception
|
||||
{
|
||||
}
|
||||
+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;
|
||||
}
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
<?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 CoveredCodeNotExecutedException extends RiskyTestError
|
||||
{
|
||||
}
|
||||
Vendored
+24
@@ -0,0 +1,24 @@
|
||||
<?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 Error extends Exception implements SelfDescribing
|
||||
{
|
||||
/**
|
||||
* Wrapper for getMessage() which is declared as final.
|
||||
*/
|
||||
public function toString(): string
|
||||
{
|
||||
return $this->getMessage();
|
||||
}
|
||||
}
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
<?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_keys;
|
||||
use function get_object_vars;
|
||||
use PHPUnit\Util\Filter;
|
||||
use RuntimeException;
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Base class for all PHPUnit Framework exceptions.
|
||||
*
|
||||
* Ensures that exceptions thrown during a test run do not leave stray
|
||||
* references behind.
|
||||
*
|
||||
* Every Exception contains a stack trace. Each stack frame contains the 'args'
|
||||
* of the called function. The function arguments can contain references to
|
||||
* instantiated objects. The references prevent the objects from being
|
||||
* destructed (until test results are eventually printed), so memory cannot be
|
||||
* freed up.
|
||||
*
|
||||
* With enabled process isolation, test results are serialized in the child
|
||||
* process and unserialized in the parent process. The stack trace of Exceptions
|
||||
* may contain objects that cannot be serialized or unserialized (e.g., PDO
|
||||
* connections). Unserializing user-space objects from the child process into
|
||||
* the parent would break the intended encapsulation of process isolation.
|
||||
*
|
||||
* @see http://fabien.potencier.org/article/9/php-serialization-stack-traces-and-exceptions
|
||||
*
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
class Exception extends RuntimeException implements \PHPUnit\Exception
|
||||
{
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $serializableTrace;
|
||||
|
||||
public function __construct($message = '', $code = 0, ?Throwable $previous = null)
|
||||
{
|
||||
parent::__construct($message, $code, $previous);
|
||||
|
||||
$this->serializableTrace = $this->getTrace();
|
||||
|
||||
foreach (array_keys($this->serializableTrace) as $key) {
|
||||
unset($this->serializableTrace[$key]['args']);
|
||||
}
|
||||
}
|
||||
|
||||
public function __toString(): string
|
||||
{
|
||||
$string = TestFailure::exceptionToString($this);
|
||||
|
||||
if ($trace = Filter::getFilteredStacktrace($this)) {
|
||||
$string .= "\n" . $trace;
|
||||
}
|
||||
|
||||
return $string;
|
||||
}
|
||||
|
||||
public function __sleep(): array
|
||||
{
|
||||
return array_keys(get_object_vars($this));
|
||||
}
|
||||
|
||||
public function __serialize(): array
|
||||
{
|
||||
return get_object_vars($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the serializable trace (without 'args').
|
||||
*/
|
||||
public function getSerializableTrace(): array
|
||||
{
|
||||
return $this->serializableTrace;
|
||||
}
|
||||
}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
<?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 Exception;
|
||||
use SebastianBergmann\Comparator\ComparisonFailure;
|
||||
|
||||
/**
|
||||
* Exception for expectations which failed their check.
|
||||
*
|
||||
* The exception contains the error message and optionally a
|
||||
* SebastianBergmann\Comparator\ComparisonFailure which is used to
|
||||
* generate diff output of the failed expectations.
|
||||
*
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class ExpectationFailedException extends AssertionFailedError
|
||||
{
|
||||
/**
|
||||
* @var ComparisonFailure
|
||||
*/
|
||||
protected $comparisonFailure;
|
||||
|
||||
public function __construct(string $message, ?ComparisonFailure $comparisonFailure = null, ?Exception $previous = null)
|
||||
{
|
||||
$this->comparisonFailure = $comparisonFailure;
|
||||
|
||||
parent::__construct($message, 0, $previous);
|
||||
}
|
||||
|
||||
public function getComparisonFailure(): ?ComparisonFailure
|
||||
{
|
||||
return $this->comparisonFailure;
|
||||
}
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
<?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 IncompleteTestError extends AssertionFailedError implements IncompleteTest
|
||||
{
|
||||
}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
<?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 debug_backtrace;
|
||||
use function in_array;
|
||||
use function lcfirst;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class InvalidArgumentException extends Exception
|
||||
{
|
||||
public static function create(int $argument, string $type): self
|
||||
{
|
||||
$stack = debug_backtrace();
|
||||
$function = $stack[1]['function'];
|
||||
|
||||
if (isset($stack[1]['class'])) {
|
||||
$function = sprintf('%s::%s', $stack[1]['class'], $stack[1]['function']);
|
||||
}
|
||||
|
||||
return new self(
|
||||
sprintf(
|
||||
'Argument #%d of %s() must be %s %s',
|
||||
$argument,
|
||||
$function,
|
||||
in_array(lcfirst($type)[0], ['a', 'e', 'i', 'o', 'u'], true) ? 'an' : 'a',
|
||||
$type,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
private function __construct(string $message = '', int $code = 0, ?\Exception $previous = null)
|
||||
{
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
<?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 InvalidCoversTargetException extends CodeCoverageException
|
||||
{
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
<?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 InvalidDataProviderException extends Exception
|
||||
{
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
<?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 MissingCoversAnnotationException extends RiskyTestError
|
||||
{
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
<?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 NoChildTestSuiteException extends Exception
|
||||
{
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
<?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 OutputError extends AssertionFailedError
|
||||
{
|
||||
}
|
||||
+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;
|
||||
|
||||
/**
|
||||
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
||||
*/
|
||||
final class PHPTAssertionFailedError extends SyntheticError
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $diff;
|
||||
|
||||
public function __construct(string $message, int $code, string $file, int $line, array $trace, string $diff)
|
||||
{
|
||||
parent::__construct($message, $code, $file, $line, $trace);
|
||||
$this->diff = $diff;
|
||||
}
|
||||
|
||||
public function getDiff(): string
|
||||
{
|
||||
return $this->diff;
|
||||
}
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
<?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
|
||||
*/
|
||||
class RiskyTestError extends AssertionFailedError
|
||||
{
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user