pax_global_header00006660000000000000000000000064126322277160014522gustar00rootroot0000000000000052 comment=c047ff05d2279404af9a7e89e2a7151c32c88022 phpunit-5.1.3/000077500000000000000000000000001263222771600132175ustar00rootroot00000000000000phpunit-5.1.3/.gitattributes000066400000000000000000000001121263222771600161040ustar00rootroot00000000000000*.php diff=php composer.json merge=ours src/Runner/Version.php merge=ours phpunit-5.1.3/.gitignore000066400000000000000000000004661263222771600152150ustar00rootroot00000000000000build/api build/code-browser build/coverage build/logs build/pdepend build/phar build/phpdox build/*.phar build/*.phar.asc tests/TextUI/*.diff tests/TextUI/*.exp tests/TextUI/*.log tests/TextUI/*.out tests/TextUI/*.php /bin /vendor /composer.lock /composer.phar phpunit.xml cache.properties .idea .ant_targets phpunit-5.1.3/.php_cs000066400000000000000000000036701263222771600145020ustar00rootroot00000000000000files() ->in('build') ->in('src') ->in('tests') ->name('*.php') ->name('*.phpt'); return Symfony\CS\Config\Config::create() ->level(\Symfony\CS\FixerInterface::NONE_LEVEL) ->fixers( array( 'align_double_arrow', 'align_equals', 'braces', 'concat_with_spaces', 'duplicate_semicolon', 'elseif', 'empty_return', 'encoding', 'eof_ending', 'extra_empty_lines', 'function_call_space', 'function_declaration', 'indentation', 'join_function', 'line_after_namespace', 'linefeed', 'list_commas', 'lowercase_constants', 'lowercase_keywords', 'method_argument_space', 'multiple_use', 'namespace_no_leading_whitespace', 'no_blank_lines_after_class_opening', 'no_empty_lines_after_phpdocs', 'parenthesis', 'php_closing_tag', 'phpdoc_indent', 'phpdoc_no_access', 'phpdoc_no_empty_return', 'phpdoc_no_package', 'phpdoc_params', 'phpdoc_scalar', 'phpdoc_separation', 'phpdoc_to_comment', 'phpdoc_trim', 'phpdoc_types', 'phpdoc_var_without_name', 'remove_lines_between_uses', 'return', 'self_accessor', 'short_array_syntax', 'short_tag', 'single_line_after_imports', 'single_quote', 'spaces_before_semicolon', 'spaces_cast', 'ternary_spaces', 'trailing_spaces', 'trim_array_spaces', 'unused_use', 'visibility', 'whitespacy_lines' ) ) ->finder($finder); phpunit-5.1.3/.travis.yml000066400000000000000000000015451263222771600153350ustar00rootroot00000000000000language: php php: - 5.6 - 7.0 - hhvm matrix: allow_failures: - php: hhvm sudo: false before_install: - composer self-update install: - travis_retry composer install --no-interaction --prefer-source script: - ./phpunit - ./phpunit --configuration ./build/travis-ci-fail.xml > /dev/null; if [ $? -eq 0 ]; then echo "SHOULD FAIL"; false; else echo "fail checked"; fi; - xmllint --noout --schema phpunit.xsd phpunit.xml.dist - xmllint --noout --schema phpunit.xsd tests/_files/configuration.xml - xmllint --noout --schema phpunit.xsd tests/_files/configuration_empty.xml - xmllint --noout --schema phpunit.xsd tests/_files/configuration_xinclude.xml -xinclude notifications: email: false webhooks: urls: - https://webhooks.gitter.im/e/6668f52f3dd4e3f81960 on_success: always on_failure: always on_start: false phpunit-5.1.3/CODE_OF_CONDUCT.md000066400000000000000000000026341263222771600160230ustar00rootroot00000000000000# Contributor Code of Conduct As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities. We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion. Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers. This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org/), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/) phpunit-5.1.3/CONTRIBUTING.md000066400000000000000000000052471263222771600154600ustar00rootroot00000000000000# Contributing to PHPUnit ## Contributor Code of Conduct Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms. ## Workflow * Fork the project. * Make your bug fix or feature addition. * Add tests for it. This is important so we don't break it in a future version unintentionally. * Send a pull request. Bonus points for topic branches. Please make sure that you have [set up your user name and email address](http://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup) for use with Git. Strings such as `silly nick name ` look really stupid in the commit history of a project. Pull requests for bug fixes must be based on the current stable branch whereas pull requests for new features must be based on the current alpha branch (when `5.0` is the current stable branch, then `5.1` is the current beta branch and `master` is the current alpha branch). We are trying to keep backwards compatibility breaks in PHPUnit to an absolute minimum. Please take this into account when proposing changes. Due to time constraints, we are not always able to respond as quickly as we would like. Please do not take delays personal and feel free to remind us if you feel that we forgot to respond. ## Coding Guidelines This project comes with a configuration file for [php-cs-fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer) (`.php_cs`) that you can use to (re)format your sourcecode for compliance with this project's coding guidelines: ```bash $ wget http://get.sensiolabs.org/php-cs-fixer.phar $ php php-cs-fixer.phar fix ``` ## Using PHPUnit from a Git checkout The following commands can be used to perform the initial checkout of PHPUnit: ```bash $ git clone git://github.com/sebastianbergmann/phpunit.git $ cd phpunit ``` Retrieve PHPUnit's dependencies using [Composer](http://getcomposer.org/): ```bash $ wget http://getcomposer.org/composer.phar $ php composer.phar install ``` The `phpunit` script can be used to invoke the PHPUnit test runner: ```bash $ ./phpunit --version ``` ## Reporting issues Please use the most specific issue tracker to search for existing tickets and to open new tickets: * [General problems](https://github.com/sebastianbergmann/phpunit/issues) * [Code Coverage](https://github.com/sebastianbergmann/php-code-coverage/issues) * [Stub and Mock Objects](https://github.com/sebastianbergmann/phpunit-mock-objects/issues) * [DbUnit](https://github.com/sebastianbergmann/dbunit/issues) * [Documentation](https://github.com/sebastianbergmann/phpunit-documentation/issues) * [Website](https://github.com/sebastianbergmann/phpunit-website/issues) phpunit-5.1.3/ChangeLog-4.0.md000066400000000000000000000173061263222771600156760ustar00rootroot00000000000000# Changes in PHPUnit 4.0 All notable changes of the PHPUnit 4.0 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [4.0.20] - 2014-05-02 ### Fixed * Fixed [#1242](https://github.com/sebastianbergmann/phpunit/issues/1242): `--self-update` uses OpenSSL API that is deprecated in PHP 5.6 ## [4.0.19] - 2014-04-30 ### Fixed * Fixed [#1193](https://github.com/sebastianbergmann/phpunit/issues/1193): Process isolation does not work correctly when PHPUnit is used from PHAR * Fixed a BC break related to comparing `DOMNode` objects that was introduced in PHPUnit 4.0.18 ## [4.0.18] - 2014-04-29 ### Fixed * Fixed [#1218](https://github.com/sebastianbergmann/phpunit/issues/1218): `--self-update` destroys symlink ## [4.0.17] - 2014-04-21 ### Changed * [Display a message that the PEAR installation method is no longer supported when PHPUnit was installed using the PEAR Installer](https://github.com/sebastianbergmann/phpunit/commit/70b02c6be0176ab8ad3d3c9ec97480556c5dd63b) ## [4.0.16] - 2014-04-20 ### Fixed * [Fixed handling of the `--report-useless-tests`, `--strict-coverage`, `--disallow-test-output`, and `--enforce-time-limit` options](https://github.com/sebastianbergmann/phpunit/commit/38baa9670711adedfe44ef24a33b568f61f3f045) ## [4.0.15] - 2014-04-16 New release of PHPUnit as PHAR and PEAR package with updated dependencies ## [4.0.14] - 2014-03-28 New release of PHPUnit as PHAR and PEAR package with updated dependencies ## [4.0.13] - 2014-03-26 New release of PHPUnit as PHAR and PEAR package with updated dependencies ## [4.0.12] - 2014-03-20 ### Changed * [Use blacklist from PHP_CodeCoverage](https://github.com/sebastianbergmann/phpunit/commit/16152ba4b8d0104ce34f60cb71b2b982ba84c898) ## [4.0.11] - 2014-03-18 ### Fixed * [Fixed unintended autoloader invokation triggered by the `@beforeClass` and `@afterClass` annotations](https://github.com/sebastianbergmann/phpunit/commit/f12e10fddc3ccbddb652a04d9036aeb5a6d54bff) ## [4.0.10] - 2014-03-18 New release of PHPUnit as PHAR and PEAR package with updated dependencies (most notably a [fix](https://github.com/sebastianbergmann/phpunit-mock-objects/commit/c5e6274b8f2bf983cf883bb375cf44f99aff200e) in the mock object generator that caused a [performance regression](https://github.com/sebastianbergmann/phpunit/issues/1187)) ## [4.0.9] - 2014-03-17 ### Changed * Optimized the search for the `@before`, `@after`, `@beforeClass` and `@afterClass` annotations * Optimized the usage of `SebastianBergmann\Environment\Runtime::canCollectCodeCoverage()` ### Fixed * The "No code coverage will be generated." message was displayed even when code coverage reporting was not requested ## [4.0.8] - 2014-03-17 ### Fixed * Fixed [#1186](https://github.com/sebastianbergmann/phpunit/issues/1186): `@before` and `@after` methods are not called in `@dataProvider` methods ## [4.0.7] - 2014-03-12 ### Fixed * Removed dependency on `phpunit/dbunit` in `composer.json` that was unintentionally added in PHPUnit 4.0.6 ## [4.0.6] - 2014-03-11 New release of PHPUnit as PHAR and PEAR package with updated dependencies ## [4.0.5] - 2014-03-10 New release of PHPUnit as PHAR and PEAR package with updated dependencies ## [4.0.4] - 2014-03-08 ### Fixed * Fixed stacktrace filtering when PHPUnit is used from a PHAR ## [4.0.3] - 2014-03-07 New release of PHPUnit as PHAR and PEAR package with updated dependencies ## [4.0.2] - 2014-03-07 ### Fixed * Fixed an issue related to displaying PHPUnit's version number ## [4.0.1] - 2014-03-07 ### Fixed * Fixed collection of code coverage data for tests that use a data provider ## [4.0.0] - 2014-03-07 ### Added * Implemented #382: Added the `$options` parameter to `PHPUnit_Framework_TestCase::getMockFromWsdl()` for configuring the `SoapClient` * Implemented #628: Added `PHPUnit_Framework_Assert::countOf(), a shortcut to get a `PHPUnit_Framework_Constraint_Count` instance * Implemented #711: `coverage-text` now has an XML `showOnlySummary` option * Implemented #719: The `--stderr` switch now respects `--colors` and `--debug` * Implemented #746: Allow identity checking for non-object types in all asserts that depend on `TraversableContains` * Implemented #758: Show a proper stack trace when @expectedException fails due to a unexpected exception being thrown * Implemented #773: Recursive and repeated arrays are more gracefully when comparison differences are exported * Implemented #813: Added `@before`, `@after`, `@beforeClass` and `@afterClass` annotations * Implemented #834: Added the `@requires OS` annotation * Implemented #835: Printers that extend `PHPUnit_TextUI_ResultPrinter` should have similar construction * Implemented #838: Added a base test listener * Implemented #859: Added PHP label validation to attribute assertions * Implemented #869: Added support for the adjacent sibling selector (+) to `PHPUnit_Util_XML::findNodes()` * Implemented #871: Add Comparator for DateTime objects * Implemented #877: Added new HTML5 tags to `PHPUnit_Util_XML::findNodes()` * Added `--coverage-crap4j` switch to generate code coverage report in Crap4J XML format * `assertCount()`, `assertNotCount()`, `assertSameSize()`, and `assertNotSameSize()` now support all objects that implement the `Traversable` interface ### Changed * A test will now fail in strict mode when it uses the `@covers` annotation and code that is not expected to be covered is executed * All relative paths in a configuration file are now resolved relative to that configuration file ### Fixed * Fixed #240: XML strings are escaped by removing invalid characters * Fixed #261: `setUp()` and `setUpBeforeClass()` are run before filters are applied * Fixed #541: Excluded groups are counted towards total number of tests being executed * Fixed #789: PHP INI settings would not be passed to child processes * Fixed #806: Array references are now properly displayed in error output * Fixed #808: Resources are now reported as `resource(13) of type (stream)` instead of `NULL` * Fixed #873: PHPUnit suppresses exceptions thrown outside of test case function * Fixed: `phpt` test cases now use the correct php binary when executed through wrapper scripts [4.0.20]: https://github.com/sebastianbergmann/phpunit/compare/4.0.19...4.0.20 [4.0.19]: https://github.com/sebastianbergmann/phpunit/compare/4.0.18...4.0.19 [4.0.18]: https://github.com/sebastianbergmann/phpunit/compare/4.0.17...4.0.18 [4.0.17]: https://github.com/sebastianbergmann/phpunit/compare/4.0.16...4.0.17 [4.0.16]: https://github.com/sebastianbergmann/phpunit/compare/4.0.15...4.0.16 [4.0.15]: https://github.com/sebastianbergmann/phpunit/compare/4.0.14...4.0.15 [4.0.14]: https://github.com/sebastianbergmann/phpunit/compare/4.0.13...4.0.14 [4.0.13]: https://github.com/sebastianbergmann/phpunit/compare/4.0.12...4.0.13 [4.0.12]: https://github.com/sebastianbergmann/phpunit/compare/4.0.11...4.0.12 [4.0.11]: https://github.com/sebastianbergmann/phpunit/compare/4.0.10...4.0.11 [4.0.10]: https://github.com/sebastianbergmann/phpunit/compare/4.0.9...4.0.10 [4.0.9]: https://github.com/sebastianbergmann/phpunit/compare/4.0.8...4.0.9 [4.0.8]: https://github.com/sebastianbergmann/phpunit/compare/4.0.7...4.0.8 [4.0.7]: https://github.com/sebastianbergmann/phpunit/compare/4.0.6...4.0.7 [4.0.6]: https://github.com/sebastianbergmann/phpunit/compare/4.0.5...4.0.6 [4.0.5]: https://github.com/sebastianbergmann/phpunit/compare/4.0.4...4.0.5 [4.0.4]: https://github.com/sebastianbergmann/phpunit/compare/4.0.3...4.0.4 [4.0.3]: https://github.com/sebastianbergmann/phpunit/compare/4.0.2...4.0.3 [4.0.2]: https://github.com/sebastianbergmann/phpunit/compare/4.0.1...4.0.2 [4.0.1]: https://github.com/sebastianbergmann/phpunit/compare/4.0.0...4.0.1 [4.0.0]: https://github.com/sebastianbergmann/phpunit/compare/3.7...4.0.0 phpunit-5.1.3/ChangeLog-4.1.md000066400000000000000000000067441263222771600157030ustar00rootroot00000000000000# Changes in PHPUnit 4.1 All notable changes of the PHPUnit 4.1 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [4.1.6] - 2014-08-17 ### Fixed * Fixed [#1380](https://github.com/sebastianbergmann/phpunit/issues/1380): `assertMatch()` returns `Unexpected end tag : hr` * Fixed [#1390](https://github.com/sebastianbergmann/phpunit/issues/1390): Licensing issue with third-party components bundled in PHAR distribution ## [4.1.5] - 2014-08-07 ### Changed * Implemented [#1330](https://github.com/sebastianbergmann/phpunit/issues/1330): Allow non-ambiguous shortened long options ### Fixed * Fixed [#529](https://github.com/sebastianbergmann/phpunit/issues/529): Tests missed in execution when another test extends from it * Fixed [#1149](https://github.com/sebastianbergmann/phpunit/issues/1149): Test swallows output buffer when run in a separate process * Fixed [#1336](https://github.com/sebastianbergmann/phpunit/issues/1336): Problem in process isolation with global variables that contain an object which contains a string which contains multiple backslashes * Fixed [#1337](https://github.com/sebastianbergmann/phpunit/issues/1337): Data Provider with `\` at the end of the name breaks with process isolation * Fixed [#1345](https://github.com/sebastianbergmann/phpunit/issues/1345): Process isolation blocks infinitely upon fatal error in child process * Fixed [#1354](https://github.com/sebastianbergmann/phpunit/issues/1354): PHPUnit test suite fails on Windows * Fixed [#1369](https://github.com/sebastianbergmann/phpunit/issues/1369): Performance of `TestSuite::addTestFile()` and missing documentation * Fixed [#1374](https://github.com/sebastianbergmann/phpunit/issues/1374): `tearDown()` is called despite unmet requirements ## [4.1.4] - 2014-07-18 ### Fixed * Fixed [#1265](https://github.com/sebastianbergmann/phpunit/issues/1265): `PHPUnit_Runner_StandardTestSuiteLoader` could not be configured as loader * Fixed [#1311](https://github.com/sebastianbergmann/phpunit/issues/1311): Incomplete XML Schema for PHPUnit XML configuration file * Fixed [#1314](https://github.com/sebastianbergmann/phpunit/issues/1314): Bug in configuration parser ## [4.1.3] - 2014-06-11 New release of PHPUnit as PHP Archive (PHAR) with updated dependencies ## [4.1.2] - 2014-06-07 New release of PHPUnit as PHP Archive (PHAR) with updated dependencies ## [4.1.1] - 2014-05-24 ### Added * Added `--selfupdate` alias for `--self-update` ### Changed * Improved the fix for [#1133](https://github.com/sebastianbergmann/phpunit/issues/1133) ### Fixed * Fixed the constructor argument for `SebastianBergmann\Version` ## [4.1.0] - 2014-05-02 ### Changed * The code to compare PHP values for equality (in `assertEquals()`, for instance) has been factored out into a [separate component](https://github.com/sebastianbergmann/comparator) * [The mock object generator is now created lazily](https://github.com/sebastianbergmann/phpunit/pull/1165) [4.1.6]: https://github.com/sebastianbergmann/phpunit/compare/4.1.5...4.1.6 [4.1.5]: https://github.com/sebastianbergmann/phpunit/compare/4.1.4...4.1.5 [4.1.4]: https://github.com/sebastianbergmann/phpunit/compare/4.1.3...4.1.4 [4.1.3]: https://github.com/sebastianbergmann/phpunit/compare/4.1.2...4.1.3 [4.1.2]: https://github.com/sebastianbergmann/phpunit/compare/4.1.1...4.1.2 [4.1.1]: https://github.com/sebastianbergmann/phpunit/compare/4.1.0...4.1.1 [4.1.0]: https://github.com/sebastianbergmann/phpunit/compare/4.0...4.1.0 phpunit-5.1.3/ChangeLog-4.2.md000066400000000000000000000045531263222771600157000ustar00rootroot00000000000000# Changes in PHPUnit 4.2 All notable changes of the PHPUnit 4.2 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [4.2.5] - 2014-09-06 New release of PHPUnit as PHP Archive (PHAR) with updated dependencies ## [4.2.4] - 2014-08-31 ### Fixed * Fixed [#1413](https://github.com/sebastianbergmann/phpunit/issues/1413): `assertCount()` hangs in infinite loop on HHVM ## [4.2.3] - 2014-08-28 ### Fixed * Fixed [#1403](https://github.com/sebastianbergmann/phpunit/issues/1403): `phpunit --self-update` does not work ## [4.2.2] - 2014-08-18 ### Fixed * Fixed [#1399](https://github.com/sebastianbergmann/phpunit/issues/1399): `enforceTimeLimit` configuration option is not handled ## [4.2.1] - 2014-08-17 ### Fixed * Fixed [#1380](https://github.com/sebastianbergmann/phpunit/issues/1380): `assertMatch()` returns `Unexpected end tag : hr` * Fixed [#1390](https://github.com/sebastianbergmann/phpunit/issues/1390): Licensing issue with third-party components bundled in PHAR distribution ## [4.2.0] - 2014-08-08 ### Added * Tests annotated with `@todo` will now be reported as risky when the `--disallow-todo-tests` option is used or `beStrictAboutTodoAnnotatedTests=true` is set in the configuration file * The `atLeast()` and `atMost()` invocation count matchers were added ### Changed * `trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);` is used now to indicate that a PHPUnit API method is deprecated; the old "system" for deprecating methods has been removed * The PHP Archive (PHAR) distribution of PHPUnit can now be used as a library; `include()`ing or `require()`ing it will not execute the CLI test runner ### Deprecated * The `assertTag()` and `assertSelect*()` assertion methods have been deprecated in favor of the [phpunit-dom-assertions](https://github.com/phpunit/phpunit-dom-assertions) extension; these methods will be removed in PHPUnit 5.0 [4.2.5]: https://github.com/sebastianbergmann/phpunit/compare/4.2.4...4.2.5 [4.2.4]: https://github.com/sebastianbergmann/phpunit/compare/4.2.3...4.2.4 [4.2.3]: https://github.com/sebastianbergmann/phpunit/compare/4.2.2...4.2.3 [4.2.2]: https://github.com/sebastianbergmann/phpunit/compare/4.2.1...4.2.2 [4.2.1]: https://github.com/sebastianbergmann/phpunit/compare/4.2.0...4.2.1 [4.2.0]: https://github.com/sebastianbergmann/phpunit/compare/4.1...4.2.0 phpunit-5.1.3/ChangeLog-4.3.md000066400000000000000000000046431263222771600157010ustar00rootroot00000000000000# Changes in PHPUnit 4.3 All notable changes of the PHPUnit 4.3 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [4.3.5] - 2014-11-11 ### Changed * Merged [#1484](https://github.com/sebastianbergmann/phpunit/issues/1484): Removed `lazymap` from blacklist as it is not longer used * Merged [#1489](https://github.com/sebastianbergmann/phpunit/issues/1489): Do not send output from tests in process isolation when testing output ## [4.3.4] - 2014-10-22 ### Fixed * Fixed [#1428](https://github.com/sebastianbergmann/phpunit/issues/1428): Issue with Composer dependencies * Fixed [#1447](https://github.com/sebastianbergmann/phpunit/issues/1447): PHPT tests treat line endings inconsistently ## [4.3.3] - 2014-10-16 ### Fixed * Fixed [#1471](https://github.com/sebastianbergmann/phpunit/issues/1471): Output made while test is running is printed although `expectOutputString()` is used when an assertion fails ## [4.3.2] - 2014-10-16 ### Fixed * Fixed [#1468](https://github.com/sebastianbergmann/phpunit/issues/1468): Incomplete and `@todo` annotated tests are counted twice ## [4.3.1] - 2014-10-06 New release of PHPUnit as PHP Archive (PHAR) with updated dependencies ## [4.3.0] - 2014-10-03 ### Added * Merged [#1358](https://github.com/sebastianbergmann/phpunit/issues/1358): Implement `@expectedExceptionMessageRegExp` annotation * Merged [#1360](https://github.com/sebastianbergmann/phpunit/issues/1360): Allow a test to identify whether it runs in isolation ### Fixed * Fixed [#1216](https://github.com/sebastianbergmann/phpunit/issues/1216): Bootstrap does not have global variables set when `--bootstrap` is specified on commandline * Fixed [#1351](https://github.com/sebastianbergmann/phpunit/issues/1351): `TestResult` object contains serialized test class upon test failure/exception in process isolation * Fixed [#1437](https://github.com/sebastianbergmann/phpunit/issues/1437): Risky test messages mask failures [4.3.5]: https://github.com/sebastianbergmann/phpunit/compare/4.3.4...4.3.5 [4.3.4]: https://github.com/sebastianbergmann/phpunit/compare/4.3.3...4.3.4 [4.3.3]: https://github.com/sebastianbergmann/phpunit/compare/4.3.2...4.3.3 [4.3.2]: https://github.com/sebastianbergmann/phpunit/compare/4.3.1...4.3.2 [4.3.1]: https://github.com/sebastianbergmann/phpunit/compare/4.3.0...4.3.1 [4.3.0]: https://github.com/sebastianbergmann/phpunit/compare/4.2...4.3.0 phpunit-5.1.3/ChangeLog-4.4.md000066400000000000000000000044231263222771600156760ustar00rootroot00000000000000# Changes in PHPUnit 4.4 All notable changes of the PHPUnit 4.4 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [4.4.5] - 2015-01-27 ### Fixed * Fixed [#1592](https://github.com/sebastianbergmann/phpunit/issues/1592): Incorrect dependency information ## [4.4.4] - 2015-01-24 ### Fixed * Fixed [#1587](https://github.com/sebastianbergmann/phpunit/issues/1587): Class `SebastianBergmann\Exporter\Context` not found ## [4.4.3] - 2015-01-24 New PHAR release due to updated dependencies ## [4.4.2] - 2015-01-17 ### Changed * Merged [#1573](https://github.com/sebastianbergmann/phpunit/issues/1573): Updates for the XSD for PHPUnit XML configuration ### Fixed * Merged [#1567](https://github.com/sebastianbergmann/phpunit/issues/1567): `coverage-crap4j` missing in XSD for PHPUnit XML configuration * Fixed [#1570](https://github.com/sebastianbergmann/phpunit/issues/1570): Test that prints output is marked as failure and not as risky when `--disallow-test-output` is used * Fixed `--stderr` with `--tap` or `--testdox` options ## [4.4.1] - 2014-12-28 ### Changed * Merged [#1528](https://github.com/sebastianbergmann/phpunit/issues/1528): Add `expectedCount()` to `toString()` return value ## [4.4.0] - 2014-12-05 ### Added * Merged [#1371](https://github.com/sebastianbergmann/phpunit/issues/1371): Implement `assertArraySubset()` assertion * Merged [#1439](https://github.com/sebastianbergmann/phpunit/issues/1439): Add support for `double` to `assertInternalType()` ### Changed * Merged [#1427](https://github.com/sebastianbergmann/phpunit/issues/1427): Improve failure output for tests when provided data is binary * Merged [#1458](https://github.com/sebastianbergmann/phpunit/issues/1458): Only enable colors when PHPUnit is run on a console (and output is not sent to a file) [4.4.5]: https://github.com/sebastianbergmann/phpunit/compare/4.4.4...4.4.5 [4.4.4]: https://github.com/sebastianbergmann/phpunit/compare/4.4.3...4.4.4 [4.4.3]: https://github.com/sebastianbergmann/phpunit/compare/4.4.2...4.4.3 [4.4.2]: https://github.com/sebastianbergmann/phpunit/compare/4.4.1...4.4.2 [4.4.1]: https://github.com/sebastianbergmann/phpunit/compare/4.4.0...4.4.1 [4.4.0]: https://github.com/sebastianbergmann/phpunit/compare/4.3...4.4.0 phpunit-5.1.3/ChangeLog-4.5.md000066400000000000000000000023311263222771600156730ustar00rootroot00000000000000# Changes in PHPUnit 4.5 All notable changes of the PHPUnit 4.5 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [4.5.1] - 2015-03-29 ## [4.5.0] - 2015-02-05 ### Added * Added out-of-the-box support for [Prophecy](https://github.com/phpspec/prophecy) * Implemented [#137](https://github.com/sebastianbergmann/phpunit/issues/137): Add support for variable number of tests shown per line in default result printer ### Changed * Merged [#1478](https://github.com/sebastianbergmann/phpunit/issues/1478): Improve the performance of `PHPUnit_Framework_Constraint_IsEqual` (which is used by `assertEquals()`, for instance) for the most common case ### Deprecated * [Deprecated](https://github.com/sebastianbergmann/phpunit/commit/7abe7796f77b13fdf3cfc506fb987d6c2ab477f5) the `--strict` commandline option and the XML configuration's `strict` attribute ### Fixed * Fixed [#1474](https://github.com/sebastianbergmann/phpunit/issues/1474): Allow the registration of custom comparators for `assertEquals()` et al. (again) [4.5.1]: https://github.com/sebastianbergmann/phpunit/compare/4.5.0...4.5.1 [4.5.0]: https://github.com/sebastianbergmann/phpunit/compare/4.4...4.5.0 phpunit-5.1.3/ChangeLog-4.6.md000066400000000000000000000101051263222771600156720ustar00rootroot00000000000000# Changes in PHPUnit 4.6 All notable changes of the PHPUnit 4.6 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [4.6.10] - 2015-06-03 ### Changed * Merged [#1693](https://github.com/sebastianbergmann/phpunit/pull/1693): Improved API documentation * Merged [#1706](https://github.com/sebastianbergmann/phpunit/pull/1706): Avoid hard-coded URI to `phpunit.xsd` * Merged [#1725](https://github.com/sebastianbergmann/phpunit/pull/1725): Update phpDox XSD URI * Merged [#1735](https://github.com/sebastianbergmann/phpunit/pull/1735): Mute `chdir()` failures in XInclude handling of XML configuration file * Merged [#1736](https://github.com/sebastianbergmann/phpunit/pull/1736): Verify that phar file can be overwritten before attempting self update ### Fixed * Fixed [#1737](https://github.com/sebastianbergmann/phpunit/issues/1737): Confusing output from `--testdox` for empty test class ## [4.6.9] - 2015-05-29 ### Fixed * Fixed [#1731](https://github.com/sebastianbergmann/phpunit/issues/1731): `.` after failure count has no background color when `--colors` is used ## [4.6.8] - 2015-05-28 New PHAR release due to updated dependencies ## [4.6.7] - 2015-05-25 New PHAR release due to updated dependencies ## [4.6.6] - 2015-04-29 ### Fixed * Fixed [#1684](https://github.com/sebastianbergmann/phpunit/issues/1684): PHAR does not work on HHVM ## [4.6.5] - 2015-04-29 * Fixed [#1677](https://github.com/sebastianbergmann/phpunit/issues/1677): Number of risky tests not printed when there are failing tests * Fixed [#1688](https://github.com/sebastianbergmann/phpunit/issues/1688): Self-Update operation does not work due to outdated SSL certificate ## [4.6.4] - 2015-04-11 ### Changed * The default list of blacklisted classes is now always passed to PHP_CodeCoverage ## [4.6.3] - 2015-04-11 ### Changed * Updated the default list of blacklisted classes ## [4.6.2] - 2015-04-07 ### Fixed * Fixed [#1667](https://github.com/sebastianbergmann/phpunit/issues/1667): Loading `src/Framework/Assert/Functions.php` by default causes collisions ## [4.6.1] - 2015-04-03 ### Fixed * Fixed [#1665](https://github.com/sebastianbergmann/phpunit/issues/1665): PHPUnit 4.6.0 PHAR does not work when renamed to `phpunit` ## [4.6.0] - 2015-04-03 ### Added * Added the `--strict-global-state` command-line option and the `beStrictAboutChangesToGlobalState` configuration setting for enabling a check that global variabes, super-global variables, and static attributes in user-defined classes are not modified during a test * Merged [#1527](https://github.com/sebastianbergmann/phpunit/issues/1527) and [#1529](https://github.com/sebastianbergmann/phpunit/issues/1529): Allow to define options for displaying colors ### Changed * Merged [#1528](https://github.com/sebastianbergmann/phpunit/issues/1528): Improve message when `PHPUnit_Framework_Constraint_Count` is used with logical operators ### Fixed * Merged [#1537](https://github.com/sebastianbergmann/phpunit/issues/1537): Fix problem of `--stderr` with `--tap` and `--testdox` * Fixed [#1599](https://github.com/sebastianbergmann/phpunit/issues/1599): The PHAR build of PHPUnit no longer uses an autoloader to load PHPUnit's own classes and instead statically loads all classes on startup [4.6.10]: https://github.com/sebastianbergmann/phpunit/compare/4.6.9...4.6.10 [4.6.9]: https://github.com/sebastianbergmann/phpunit/compare/4.6.8...4.6.9 [4.6.8]: https://github.com/sebastianbergmann/phpunit/compare/4.6.7...4.6.8 [4.6.7]: https://github.com/sebastianbergmann/phpunit/compare/4.6.6...4.6.7 [4.6.6]: https://github.com/sebastianbergmann/phpunit/compare/4.6.5...4.6.6 [4.6.5]: https://github.com/sebastianbergmann/phpunit/compare/4.6.4...4.6.5 [4.6.4]: https://github.com/sebastianbergmann/phpunit/compare/4.6.3...4.6.4 [4.6.3]: https://github.com/sebastianbergmann/phpunit/compare/4.6.2...4.6.3 [4.6.2]: https://github.com/sebastianbergmann/phpunit/compare/4.6.1...4.6.2 [4.6.1]: https://github.com/sebastianbergmann/phpunit/compare/4.6.0...4.6.1 [4.6.0]: https://github.com/sebastianbergmann/phpunit/compare/4.5...4.6.0 phpunit-5.1.3/ChangeLog-4.7.md000066400000000000000000000056711263222771600157070ustar00rootroot00000000000000# Changes in PHPUnit 4.7 All notable changes of the PHPUnit 4.7 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [4.7.7] - 2015-07-13 New PHAR release due to updated dependencies ## [4.7.6] - 2015-06-30 ### Fixed * Fixed [#1681](https://github.com/sebastianbergmann/phpunit/issues/1681): Code Coverage filter configuration is not passed to child processes * Fixed [#1692](https://github.com/sebastianbergmann/phpunit/issues/1692): Clean up `PHPUnit_Extensions_RepeatedTest` after refactoring * Fixed [#1763](https://github.com/sebastianbergmann/phpunit/issues/1763): `@before` and `@after` annotations do not work when inherited ## [4.7.5] - 2015-06-21 ### Fixed * Fixed [#490](https://github.com/sebastianbergmann/phpunit/issues/490): Ensure that a test can only be one of `@small`, `@medium`, or `@large`. * Fixed [#1704](https://github.com/sebastianbergmann/phpunit/issues/1704): Output printed during test missing when using TAP ## [4.7.4] - 2015-06-18 ### Changed * The `PHPUnit_Framework_Constraint_IsType` constraint now knows about the `real` type (which is an alias for `float`) * Various work on compatibility with PHP 7 ### Fixed * Fixed [#1749](https://github.com/sebastianbergmann/phpunit/issues/1749): `stopOnError` configuration setting does not work ## [4.7.3] - 2015-06-11 ### Fixed * Fixed [#1317](https://github.com/sebastianbergmann/phpunit/issues/1317): JUnit XML logfiles does not contain warnings * Fixed an [issue](https://github.com/sebastianbergmann/php-code-coverage/issues/347) where the warning that no whitelist is used is displayed when it should not ## [4.7.2] - 2015-06-06 New PHAR release due to updated dependencies ## [4.7.1] - 2015-06-05 New PHAR release due to updated dependencies ## [4.7.0] - 2015-06-05 ### Added * Merged [#1718](https://github.com/sebastianbergmann/phpunit/issues/1718): Support for `--INI--` section in PHPT tests ### Changed * Tests not annotated with `@small`, `@medium`, or `@large` are no longer treated as being annotated with `@small` * In verbose mode, the test runner now prints information about the PHP runtime * To be consistent with the printing of PHP runtime information, the configuration file used is only printed in verbose mode * A warning is now printed when code coverage data is collected but no whitelist is configured [4.7.7]: https://github.com/sebastianbergmann/phpunit/compare/4.7.6...4.7.7 [4.7.6]: https://github.com/sebastianbergmann/phpunit/compare/4.7.5...4.7.6 [4.7.5]: https://github.com/sebastianbergmann/phpunit/compare/4.7.4...4.7.5 [4.7.4]: https://github.com/sebastianbergmann/phpunit/compare/4.7.3...4.7.4 [4.7.3]: https://github.com/sebastianbergmann/phpunit/compare/4.7.2...4.7.3 [4.7.2]: https://github.com/sebastianbergmann/phpunit/compare/4.7.1...4.7.2 [4.7.1]: https://github.com/sebastianbergmann/phpunit/compare/4.7.0...4.7.1 [4.7.0]: https://github.com/sebastianbergmann/phpunit/compare/4.6...4.7.0 phpunit-5.1.3/ChangeLog-4.8.md000066400000000000000000000151401263222771600157000ustar00rootroot00000000000000# Changes in PHPUnit 4.8 All notable changes of the PHPUnit 4.8 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [4.8.20] - 2015-12-10 ### Changed * Changed PHP version constraint in `composer.json` to prevent installing PHPUnit 4.8 on PHP 7 * `phpunit.phar` will now refuse to work on PHP 7 ## [4.8.19] - 2015-11-30 ### Fixed * Fixed [#1955](https://github.com/sebastianbergmann/phpunit/issues/1955): Process isolation fails when running tests with `phpdbg -qrr` ## [4.8.18] - 2015-11-11 ### Changed * DbUnit 1.4 is bundled again in the PHAR distribution ## [4.8.17] - 2015-11-10 ### Fixed * Fixed [#1935](https://github.com/sebastianbergmann/phpunit/issues/1935): `PHP_CodeCoverage_Exception` not handled properly * Fixed [#1948](https://github.com/sebastianbergmann/phpunit/issues/1948): Unable to use PHAR due to unsupported signature error ### Changed * DbUnit >= 2.0.2 is now bundled in the PHAR distribution ## [4.8.16] - 2015-10-23 ### Added * Implemented [#1925](https://github.com/sebastianbergmann/phpunit/issues/1925): Provide a library-only PHAR ## [4.8.15] - 2015-10-22 ### Fixed * The backup of global state is now properly restored when changes to global state are disallowed * The `__PHPUNIT_PHAR__` constant is now properly set when the PHPUnit PHAR is used as a library ## [4.8.14] - 2015-10-17 ### Fixed * Fixed [#1892](https://github.com/sebastianbergmann/phpunit/issues/1892): `--coverage-text` does not honor color settings ## [4.8.13] - 2015-10-14 ### Added * Added the `--self-upgrade` commandline switch for upgrading a PHPUnit PHAR to the latest version ### Changed * The `--self-update` commandline switch now updates a PHPUnit PHAR to the latest version within the same release series ## [4.8.12] - 2015-10-12 ### Changed * Merged [#1893](https://github.com/sebastianbergmann/phpunit/issues/1893): Removed workaround for phpab bug ## [4.8.11] - 2015-10-07 ### Fixed * Merged [#1885](https://github.com/sebastianbergmann/phpunit/issues/1885): Fixed handling of PHP configuration settings for process isolation * Fixed [#1857](https://github.com/sebastianbergmann/phpunit/issues/1857): `@covers` and `@uses` should only take a single word * Fixed [#1879](https://github.com/sebastianbergmann/phpunit/issues/1879): `assertEqualXMLStructure()` cannot compare nodes with an ID * Fixed [#1898](https://github.com/sebastianbergmann/phpunit/issues/1898): `@covers` and `@uses` cannot be used for namespaced functions * Fixed [#1901](https://github.com/sebastianbergmann/phpunit/issues/1901): `--self-update` updates to PHPUnit 5, even on PHP < 5.6 ## [4.8.10] - 2015-10-01 ### Fixed * Merged [#1884](https://github.com/sebastianbergmann/phpunit/issues/1884): Avoid passing `Error` to `onNotSuccessfulTest()` on PHP 7 ## [4.8.9] - 2015-09-20 ### Fixed * Fixed regression introduced in PHPUnit 4.8.8 ## [4.8.8] - 2015-09-19 ### Fixed * Fixed [#1860](https://github.com/sebastianbergmann/phpunit/issues/1860): Not well-formed XML strings are always considered equal by `PHPUnit_Framework_Assert::assertXmlStringEqualsXmlString()` ## [4.8.7] - 2015-09-14 New PHAR release due to updated dependencies ## [4.8.6] - 2015-08-24 ### Fixed * Fixed [#1835](https://github.com/sebastianbergmann/phpunit/issues/1835): Skipped test reported as errored since PHPUnit 4.7.4 ## [4.8.5] - 2015-08-19 ### Fixed * Fixed [#1831](https://github.com/sebastianbergmann/phpunit/issues/1831): PHAR manifest is missing ## [4.8.4] - 2015-08-15 ### Fixed * Fixed [#1823](https://github.com/sebastianbergmann/phpunit/issues/1823): Columns attribute in XML configuration file is ignored ## [4.8.3] - 2015-08-10 ### Changed * PHPUnit now exits early during bootstrap when an unsupported version of PHP is used ## [4.8.2] - 2015-08-07 ### Fixed * Fixed [#1816](https://github.com/sebastianbergmann/phpunit/issues/1816): PHPUnit 4.8.1 shows "4.8.0" as version number ## [4.8.1] - 2015-08-07 ### Fixed * Fixed [#1815](https://github.com/sebastianbergmann/phpunit/issues/1815): `phpunit --self-update` does not work in PHPUnit 4.8.0 ## [4.8.0] - 2015-08-07 ### Added * Added `--check-version` commandline switch to check whether the current version of PHPUnit is used (PHAR only) * Added `--no-coverage` commandline switch to ignore code coverage configuration from the configuration file * Implemented [#1663](https://github.com/sebastianbergmann/phpunit/issues/1663): The Crap4J report's threshold is now configurable * Merged [#1728](https://github.com/sebastianbergmann/phpunit/issues/1728): Implemented the `@testWith` annotation as "syntactic sugar" for data providers * Merged [#1739](https://github.com/sebastianbergmann/phpunit/issues/1739): Added support to the commandline test runner for using options after arguments ### Changed * Made the argument check of `assertContains()` and `assertNotContains()` more strict to prevent undefined behavior such as [#1808](https://github.com/sebastianbergmann/phpunit/issues/1808) * Changed the name of the default group from `__nogroup__` to `default` [4.8.20]: https://github.com/sebastianbergmann/phpunit/compare/4.8.19...4.8.20 [4.8.19]: https://github.com/sebastianbergmann/phpunit/compare/4.8.18...4.8.19 [4.8.18]: https://github.com/sebastianbergmann/phpunit/compare/4.8.17...4.8.18 [4.8.17]: https://github.com/sebastianbergmann/phpunit/compare/4.8.16...4.8.17 [4.8.16]: https://github.com/sebastianbergmann/phpunit/compare/4.8.15...4.8.16 [4.8.15]: https://github.com/sebastianbergmann/phpunit/compare/4.8.14...4.8.15 [4.8.14]: https://github.com/sebastianbergmann/phpunit/compare/4.8.13...4.8.14 [4.8.13]: https://github.com/sebastianbergmann/phpunit/compare/4.8.12...4.8.13 [4.8.12]: https://github.com/sebastianbergmann/phpunit/compare/4.8.11...4.8.12 [4.8.11]: https://github.com/sebastianbergmann/phpunit/compare/4.8.10...4.8.11 [4.8.10]: https://github.com/sebastianbergmann/phpunit/compare/4.8.9...4.8.10 [4.8.9]: https://github.com/sebastianbergmann/phpunit/compare/4.8.8...4.8.9 [4.8.8]: https://github.com/sebastianbergmann/phpunit/compare/4.8.7...4.8.8 [4.8.7]: https://github.com/sebastianbergmann/phpunit/compare/4.8.6...4.8.7 [4.8.6]: https://github.com/sebastianbergmann/phpunit/compare/4.8.5...4.8.6 [4.8.5]: https://github.com/sebastianbergmann/phpunit/compare/4.8.4...4.8.5 [4.8.4]: https://github.com/sebastianbergmann/phpunit/compare/4.8.3...4.8.4 [4.8.3]: https://github.com/sebastianbergmann/phpunit/compare/4.8.2...4.8.3 [4.8.2]: https://github.com/sebastianbergmann/phpunit/compare/4.8.1...4.8.2 [4.8.1]: https://github.com/sebastianbergmann/phpunit/compare/4.8.0...4.8.1 [4.8.0]: https://github.com/sebastianbergmann/phpunit/compare/4.7...4.8.0 phpunit-5.1.3/ChangeLog-5.0.md000066400000000000000000000141571263222771600157000ustar00rootroot00000000000000# Changes in PHPUnit 5.0 All notable changes of the PHPUnit 5.0 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [5.0.10] - 2015-11-30 ### Fixed * Fixed [#1953](https://github.com/sebastianbergmann/phpunit/issues/1953): `Error`s raised outside the scope of a test method are not handled properly * Fixed [#1955](https://github.com/sebastianbergmann/phpunit/issues/1955): Process isolation fails when running tests with `phpdbg -qrr` ## [5.0.9] - 2015-11-10 ### Added * Merged [#1909](https://github.com/sebastianbergmann/phpunit/issues/1909): Added `flowId` parameter to each TeamCity message (for parallel tests) ### Fixed * Fixed [#1935](https://github.com/sebastianbergmann/phpunit/issues/1935): `PHP_CodeCoverage_Exception` not handled properly * Fixed [#1944](https://github.com/sebastianbergmann/phpunit/issues/1944): Exceptions are not handled correctly on PHP 7 when an exception is expected * Fixed [#1948](https://github.com/sebastianbergmann/phpunit/issues/1948): Unable to use PHAR due to unsupported signature error ### Removed * Removed leftover references to PHPUnit_Selenium ## [5.0.8] - 2015-10-23 ### Added * Implemented [#1925](https://github.com/sebastianbergmann/phpunit/issues/1925): Provide a library-only PHAR ## [5.0.7] - 2015-10-22 ### Fixed * The backup of global state is now properly restored when changes to global state are disallowed * The `__PHPUNIT_PHAR__` constant is now properly set when the PHPUnit PHAR is used as a library ## [5.0.6] - 2015-10-14 ### Added * Added the `--self-upgrade` commandline switch for upgrading a PHPUnit PHAR to the latest version ### Changed * The `--self-update` commandline switch now updates a PHPUnit PHAR to the latest version within the same release series ### Fixed * Fixed [#1892](https://github.com/sebastianbergmann/phpunit/issues/1892): `--coverage-text` does not honor color settings ## [5.0.5] - 2015-10-12 ### Changed * Merged [#1893](https://github.com/sebastianbergmann/phpunit/issues/1893): Removed workaround for phpab bug ## [5.0.4] - 2015-10-07 ### Fixed * Fixed [#1857](https://github.com/sebastianbergmann/phpunit/issues/1857): `@covers` and `@uses` should only take a single word * Fixed [#1898](https://github.com/sebastianbergmann/phpunit/issues/1898): `@covers` and `@uses` cannot be used for namespaced functions ## [5.0.3] - 2015-10-02 * Fixed check for PHP version in PHAR distribution of PHPUnit ## [5.0.2] - 2015-10-02 ### Fixed * Fixed [#1879](https://github.com/sebastianbergmann/phpunit/issues/1879): `assertEqualXMLStructure()` cannot compare nodes with an ID * Fixed [#1887](https://github.com/sebastianbergmann/phpunit/issues/1887): PHAR distribution of PHPUnit 5.0.1 does not work ## [5.0.1] - 2015-10-02 ### Fixed * Merged [#1885](https://github.com/sebastianbergmann/phpunit/issues/1885): Fixed handling of PHP configuration settings for process isolation * An outdated version of DbUnit was bundled in the PHAR distribution of PHPUnit ## [5.0.0] - 2015-10-02 ### Added * Implemented [#1604](https://github.com/sebastianbergmann/phpunit/issues/1604): A `@small` test should be marked as risky when it executes code that performs I/O operations * Implemented [#1656](https://github.com/sebastianbergmann/phpunit/issues/1656): Allow sorting test failures in reverse * Merged [#1753](https://github.com/sebastianbergmann/phpunit/issues/1753): Added the `assertFinite()`, `assertInfinite()` and `assertNan()` assertions * Merged [#1876](https://github.com/sebastianbergmann/phpunit/issues/1876): Added the `--atleast-version` commandline option * Implemented [#1780](https://github.com/sebastianbergmann/phpunit/issues/1780): Support for deep-cloning of results passed between tests using `@depends` * Implemented [#1821](https://github.com/sebastianbergmann/phpunit/issues/1821): Expectations on mock objects passed via `@depends` are now also evaluated for the depending test * Added `--whitelist` commandline option to configure a whitelist for code coverage analysis * Added convenience wrapper `getMockWithoutInvokingTheOriginalConstructor()` to create a test double without invoking the original class' constructor * Added TeamCity test result logger for more seamless integration of PHPUnit with PhpStorm ### Changed * Merged [#1781](https://github.com/sebastianbergmann/phpunit/issues/1781): Empty string is not treated as a valid JSON string anymore * Merged [#1822](https://github.com/sebastianbergmann/phpunit/issues/1822): Always output progress totals on last line * It is now mandatory to configure a whitelist for code coverage analysis * Renamed the `beStrictAboutTestSize` configuration option to `enforceTimeLimit` * Printer-related CLI options now override printer-related configuration settings ### Removed * The `assertSelectCount()`, `assertSelectRegExp()`, `assertSelectEquals()`, `assertTag()`, `assertNotTag()` assertions have been removed * The `--strict` commandline option and the XML configuration's `strict` attribute have been removed * The code coverage blacklist functionality has been removed * The PHPUnit_Selenium component is no longer bundled in the PHAR distribution * The PHPUnit_Selenium component can no longer be configured using the `` element of PHPUnit's configuration file * PHPUnit is no longer supported on PHP 5.3, PHP 5.4, and PHP 5.5 [5.0.10]: https://github.com/sebastianbergmann/phpunit/compare/5.0.9...5.0.10 [5.0.9]: https://github.com/sebastianbergmann/phpunit/compare/5.0.8...5.0.9 [5.0.8]: https://github.com/sebastianbergmann/phpunit/compare/5.0.7...5.0.8 [5.0.7]: https://github.com/sebastianbergmann/phpunit/compare/5.0.6...5.0.7 [5.0.6]: https://github.com/sebastianbergmann/phpunit/compare/5.0.5...5.0.6 [5.0.5]: https://github.com/sebastianbergmann/phpunit/compare/5.0.4...5.0.5 [5.0.4]: https://github.com/sebastianbergmann/phpunit/compare/5.0.3...5.0.4 [5.0.3]: https://github.com/sebastianbergmann/phpunit/compare/5.0.2...5.0.3 [5.0.2]: https://github.com/sebastianbergmann/phpunit/compare/5.0.1...5.0.2 [5.0.1]: https://github.com/sebastianbergmann/phpunit/compare/5.0.0...5.0.1 [5.0.0]: https://github.com/sebastianbergmann/phpunit/compare/4.8...5.0.0 phpunit-5.1.3/ChangeLog-5.1.md000066400000000000000000000032051263222771600156710ustar00rootroot00000000000000# Changes in PHPUnit 5.1 All notable changes of the PHPUnit 5.1 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [5.1.3] - 2015-12-10 ### Added * Added support for `Throwable` to `PHPUnit_Framework_TestCase::throwsException()` ## [5.1.2] - 2015-12-07 ### Fixed * Fixed a backwards compatibility break related to the execution order of `@before` and `setUp()` introduced in PHPUnit 5.1.0 ## [5.1.1] - 2015-12-07 ### Fixed * Fixed a backwards compatibility break in the `PHPUnit_Framework_TestListener` interface introduced in PHPUnit 5.1.0 ## [5.1.0] - 2015-12-04 ### Added * Implemented [#1802](https://github.com/sebastianbergmann/phpunit/issues/1802): Refactor how PHPUnit emits warnings (such as `No tests found in class "Test"`) * Merged [#1824](https://github.com/sebastianbergmann/phpunit/issues/1824): Added support for the `--CLEAN--` and `--EXPECTREGEX--` sections for PHPT test cases * Merged [#1825](https://github.com/sebastianbergmann/phpunit/issues/1825): Redirect STDERR to STDOUT when running PHPT test cases * Merged [#1871](https://github.com/sebastianbergmann/phpunit/issues/1871): Added support for `@testdox` annotations on classes * Merged [#1917](https://github.com/sebastianbergmann/phpunit/issues/1917): Allow `@coversDefaultClass` annotation to work on traits [5.1.3]: https://github.com/sebastianbergmann/phpunit/compare/5.1.2...5.1.3 [5.1.2]: https://github.com/sebastianbergmann/phpunit/compare/5.1.1...5.1.2 [5.1.1]: https://github.com/sebastianbergmann/phpunit/compare/5.1.0...5.1.1 [5.1.0]: https://github.com/sebastianbergmann/phpunit/compare/5.0...5.1.0 phpunit-5.1.3/LICENSE000066400000000000000000000030061263222771600142230ustar00rootroot00000000000000PHPUnit Copyright (c) 2001-2015, 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: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of Sebastian Bergmann nor the names of his 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 OWNER 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. phpunit-5.1.3/README.md000066400000000000000000000041561263222771600145040ustar00rootroot00000000000000# PHPUnit PHPUnit is a programmer-oriented testing framework for PHP. It is an instance of the xUnit architecture for unit testing frameworks. [![Latest Stable Version](https://img.shields.io/packagist/v/phpunit/phpunit.svg?style=flat-square)](https://packagist.org/packages/phpunit/phpunit) [![Minimum PHP Version](https://img.shields.io/badge/php-%3E%3D%205.6-8892BF.svg?style=flat-square)](https://php.net/) [![Build Status](https://img.shields.io/travis/sebastianbergmann/phpunit/5.1.svg?style=flat-square)](https://travis-ci.org/sebastianbergmann/phpunit) ## Installation We distribute a [PHP Archive (PHAR)](https://php.net/phar) that has all required (as well as some optional) dependencies of PHPUnit bundled in a single file: ```bash $ wget https://phar.phpunit.de/phpunit.phar $ chmod +x phpunit.phar $ mv phpunit.phar /usr/local/bin/phpunit ``` You can also immediately use the PHAR after you have downloaded it, of course: ```bash $ wget https://phar.phpunit.de/phpunit.phar $ php phpunit.phar ``` 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 do this. ## Contribute Please refer to [CONTRIBUTING.md](https://github.com/sebastianbergmann/phpunit/blob/master/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_CodeCoverage](https://github.com/sebastianbergmann/php-code-coverage/graphs/contributors) * [PHPUnit_MockObject](https://github.com/sebastianbergmann/phpunit-mock-objects/graphs/contributors) A very special thanks to everyone who has contributed to the documentation and helps maintain the translations: * [PHPUnit Documentation](https://github.com/sebastianbergmann/phpunit-documentation/graphs/contributors) phpunit-5.1.3/build.xml000066400000000000000000000304411263222771600150420ustar00rootroot00000000000000 phpunit-5.1.3/build/000077500000000000000000000000001263222771600143165ustar00rootroot00000000000000phpunit-5.1.3/build/bin/000077500000000000000000000000001263222771600150665ustar00rootroot00000000000000phpunit-5.1.3/build/bin/phpab000077500000000000000000006407121263222771600161200ustar00rootroot00000000000000#!/usr/bin/env php '/vendor/zetacomponents/base/src/base.php', 'ezcbaseconfigurationinitializer' => '/vendor/zetacomponents/base/src/interfaces/configuration_initializer.php', 'ezcbasedoubleclassrepositoryprefixexception' => '/vendor/zetacomponents/base/src/exceptions/double_class_repository_prefix.php', 'ezcbaseexception' => '/vendor/zetacomponents/base/src/exceptions/exception.php', 'ezcbaseexportable' => '/vendor/zetacomponents/base/src/interfaces/exportable.php', 'ezcbaseextensionnotfoundexception' => '/vendor/zetacomponents/base/src/exceptions/extension_not_found.php', 'ezcbasefeatures' => '/vendor/zetacomponents/base/src/features.php', 'ezcbasefile' => '/vendor/zetacomponents/base/src/file.php', 'ezcbasefileexception' => '/vendor/zetacomponents/base/src/exceptions/file_exception.php', 'ezcbasefilefindcontext' => '/vendor/zetacomponents/base/src/structs/file_find_context.php', 'ezcbasefileioexception' => '/vendor/zetacomponents/base/src/exceptions/file_io.php', 'ezcbasefilenotfoundexception' => '/vendor/zetacomponents/base/src/exceptions/file_not_found.php', 'ezcbasefilepermissionexception' => '/vendor/zetacomponents/base/src/exceptions/file_permission.php', 'ezcbasefunctionalitynotsupportedexception' => '/vendor/zetacomponents/base/src/exceptions/functionality_not_supported.php', 'ezcbaseinit' => '/vendor/zetacomponents/base/src/init.php', 'ezcbaseinitcallbackconfiguredexception' => '/vendor/zetacomponents/base/src/exceptions/init_callback_configured.php', 'ezcbaseinitinvalidcallbackclassexception' => '/vendor/zetacomponents/base/src/exceptions/invalid_callback_class.php', 'ezcbaseinvalidparentclassexception' => '/vendor/zetacomponents/base/src/exceptions/invalid_parent_class.php', 'ezcbasemetadata' => '/vendor/zetacomponents/base/src/metadata.php', 'ezcbasemetadatapearreader' => '/vendor/zetacomponents/base/src/metadata/pear.php', 'ezcbasemetadatatarballreader' => '/vendor/zetacomponents/base/src/metadata/tarball.php', 'ezcbaseoptions' => '/vendor/zetacomponents/base/src/options.php', 'ezcbasepersistable' => '/vendor/zetacomponents/base/src/interfaces/persistable.php', 'ezcbasepropertynotfoundexception' => '/vendor/zetacomponents/base/src/exceptions/property_not_found.php', 'ezcbasepropertypermissionexception' => '/vendor/zetacomponents/base/src/exceptions/property_permission.php', 'ezcbaserepositorydirectory' => '/vendor/zetacomponents/base/src/structs/repository_directory.php', 'ezcbasesettingnotfoundexception' => '/vendor/zetacomponents/base/src/exceptions/setting_not_found.php', 'ezcbasesettingvalueexception' => '/vendor/zetacomponents/base/src/exceptions/setting_value.php', 'ezcbasestruct' => '/vendor/zetacomponents/base/src/struct.php', 'ezcbasevalueexception' => '/vendor/zetacomponents/base/src/exceptions/value.php', 'ezcbasewhateverexception' => '/vendor/zetacomponents/base/src/exceptions/whatever.php', 'ezcconsoleargument' => '/vendor/zetacomponents/console-tools/src/input/argument.php', 'ezcconsoleargumentalreadyregisteredexception' => '/vendor/zetacomponents/console-tools/src/exceptions/argument_already_registered.php', 'ezcconsoleargumentexception' => '/vendor/zetacomponents/console-tools/src/exceptions/argument.php', 'ezcconsoleargumentmandatoryviolationexception' => '/vendor/zetacomponents/console-tools/src/exceptions/argument_mandatory_violation.php', 'ezcconsolearguments' => '/vendor/zetacomponents/console-tools/src/input/arguments.php', 'ezcconsoleargumenttypeviolationexception' => '/vendor/zetacomponents/console-tools/src/exceptions/argument_type_violation.php', 'ezcconsoledialog' => '/vendor/zetacomponents/console-tools/src/interfaces/dialog.php', 'ezcconsoledialogabortexception' => '/vendor/zetacomponents/console-tools/src/exceptions/dialog_abort.php', 'ezcconsoledialogoptions' => '/vendor/zetacomponents/console-tools/src/options/dialog.php', 'ezcconsoledialogvalidator' => '/vendor/zetacomponents/console-tools/src/interfaces/dialog_validator.php', 'ezcconsoledialogviewer' => '/vendor/zetacomponents/console-tools/src/dialog_viewer.php', 'ezcconsoleexception' => '/vendor/zetacomponents/console-tools/src/exceptions/exception.php', 'ezcconsoleinput' => '/vendor/zetacomponents/console-tools/src/input.php', 'ezcconsoleinputhelpgenerator' => '/vendor/zetacomponents/console-tools/src/interfaces/input_help_generator.php', 'ezcconsoleinputstandardhelpgenerator' => '/vendor/zetacomponents/console-tools/src/input/help_generators/standard.php', 'ezcconsoleinputvalidator' => '/vendor/zetacomponents/console-tools/src/interfaces/input_validator.php', 'ezcconsoleinvalidoptionnameexception' => '/vendor/zetacomponents/console-tools/src/exceptions/invalid_option_name.php', 'ezcconsoleinvalidoutputtargetexception' => '/vendor/zetacomponents/console-tools/src/exceptions/invalid_output_target.php', 'ezcconsolemenudialog' => '/vendor/zetacomponents/console-tools/src/dialog/menu_dialog.php', 'ezcconsolemenudialogdefaultvalidator' => '/vendor/zetacomponents/console-tools/src/dialog/validators/menu_dialog_default.php', 'ezcconsolemenudialogoptions' => '/vendor/zetacomponents/console-tools/src/options/menu_dialog.php', 'ezcconsolemenudialogvalidator' => '/vendor/zetacomponents/console-tools/src/interfaces/menu_dialog_validator.php', 'ezcconsolenopositionstoredexception' => '/vendor/zetacomponents/console-tools/src/exceptions/no_position_stored.php', 'ezcconsolenovaliddialogresultexception' => '/vendor/zetacomponents/console-tools/src/exceptions/no_valid_dialog_result.php', 'ezcconsoleoption' => '/vendor/zetacomponents/console-tools/src/input/option.php', 'ezcconsoleoptionalreadyregisteredexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_already_registered.php', 'ezcconsoleoptionargumentsviolationexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_arguments_violation.php', 'ezcconsoleoptiondependencyviolationexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_dependency_violation.php', 'ezcconsoleoptionexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option.php', 'ezcconsoleoptionexclusionviolationexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_exclusion_violation.php', 'ezcconsoleoptionmandatoryviolationexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_mandatory_violation.php', 'ezcconsoleoptionmissingvalueexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_missing_value.php', 'ezcconsoleoptionnoaliasexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_no_alias.php', 'ezcconsoleoptionnotexistsexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_not_exists.php', 'ezcconsoleoptionrule' => '/vendor/zetacomponents/console-tools/src/structs/option_rule.php', 'ezcconsoleoptionstringnotwellformedexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_string_not_wellformed.php', 'ezcconsoleoptiontoomanyvaluesexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_too_many_values.php', 'ezcconsoleoptiontypeviolationexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_type_violation.php', 'ezcconsoleoutput' => '/vendor/zetacomponents/console-tools/src/output.php', 'ezcconsoleoutputformat' => '/vendor/zetacomponents/console-tools/src/structs/output_format.php', 'ezcconsoleoutputformats' => '/vendor/zetacomponents/console-tools/src/structs/output_formats.php', 'ezcconsoleoutputoptions' => '/vendor/zetacomponents/console-tools/src/options/output.php', 'ezcconsoleprogressbar' => '/vendor/zetacomponents/console-tools/src/progressbar.php', 'ezcconsoleprogressbaroptions' => '/vendor/zetacomponents/console-tools/src/options/progressbar.php', 'ezcconsoleprogressmonitor' => '/vendor/zetacomponents/console-tools/src/progressmonitor.php', 'ezcconsoleprogressmonitoroptions' => '/vendor/zetacomponents/console-tools/src/options/progressmonitor.php', 'ezcconsolequestiondialog' => '/vendor/zetacomponents/console-tools/src/dialog/question_dialog.php', 'ezcconsolequestiondialogcollectionvalidator' => '/vendor/zetacomponents/console-tools/src/dialog/validators/question_dialog_collection.php', 'ezcconsolequestiondialogmappingvalidator' => '/vendor/zetacomponents/console-tools/src/dialog/validators/question_dialog_mapping.php', 'ezcconsolequestiondialogoptions' => '/vendor/zetacomponents/console-tools/src/options/question_dialog.php', 'ezcconsolequestiondialogregexvalidator' => '/vendor/zetacomponents/console-tools/src/dialog/validators/question_dialog_regex.php', 'ezcconsolequestiondialogtypevalidator' => '/vendor/zetacomponents/console-tools/src/dialog/validators/question_dialog_type.php', 'ezcconsolequestiondialogvalidator' => '/vendor/zetacomponents/console-tools/src/interfaces/question_dialog_validator.php', 'ezcconsolestandardinputvalidator' => '/vendor/zetacomponents/console-tools/src/input/validators/standard.php', 'ezcconsolestatusbar' => '/vendor/zetacomponents/console-tools/src/statusbar.php', 'ezcconsolestatusbaroptions' => '/vendor/zetacomponents/console-tools/src/options/statusbar.php', 'ezcconsolestringtool' => '/vendor/zetacomponents/console-tools/src/tools/string.php', 'ezcconsoletable' => '/vendor/zetacomponents/console-tools/src/table.php', 'ezcconsoletablecell' => '/vendor/zetacomponents/console-tools/src/table/cell.php', 'ezcconsoletableoptions' => '/vendor/zetacomponents/console-tools/src/options/table.php', 'ezcconsoletablerow' => '/vendor/zetacomponents/console-tools/src/table/row.php', 'ezcconsoletoomanyargumentsexception' => '/vendor/zetacomponents/console-tools/src/exceptions/argument_too_many.php', 'theseer\\autoload\\application' => '/phpab/Application.php', 'theseer\\autoload\\applicationexception' => '/phpab/Application.php', 'theseer\\autoload\\autoloadbuilderexception' => '/phpab/AutoloadRenderer.php', 'theseer\\autoload\\autoloadrenderer' => '/phpab/AutoloadRenderer.php', 'theseer\\autoload\\cache' => '/phpab/Cache.php', 'theseer\\autoload\\cacheentry' => '/phpab/CacheEntry.php', 'theseer\\autoload\\cacheexception' => '/phpab/Cache.php', 'theseer\\autoload\\cachingparser' => '/phpab/CachingParser.php', 'theseer\\autoload\\classdependencysorter' => '/phpab/DependencySorter.php', 'theseer\\autoload\\classdependencysorterexception' => '/phpab/DependencySorter.php', 'theseer\\autoload\\cli' => '/phpab/CLI.php', 'theseer\\autoload\\clienvironmentexception' => '/phpab/CLI.php', 'theseer\\autoload\\collector' => '/phpab/Collector.php', 'theseer\\autoload\\collectorexception' => '/phpab/Collector.php', 'theseer\\autoload\\collectorresult' => '/phpab/CollectorResult.php', 'theseer\\autoload\\collectorresultexception' => '/phpab/CollectorResult.php', 'theseer\\autoload\\composeriterator' => '/phpab/ComposerIterator.php', 'theseer\\autoload\\composeriteratorexception' => '/phpab/ComposerIterator.php', 'theseer\\autoload\\config' => '/phpab/Config.php', 'theseer\\autoload\\factory' => '/phpab/Factory.php', 'theseer\\autoload\\logger' => '/phpab/Logger.php', 'theseer\\autoload\\parser' => '/phpab/Parser.php', 'theseer\\autoload\\parseresult' => '/phpab/ParseResult.php', 'theseer\\autoload\\parserexception' => '/phpab/Parser.php', 'theseer\\autoload\\parserinterface' => '/phpab/ParserInterface.php', 'theseer\\autoload\\pathcomparator' => '/phpab/PathComparator.php', 'theseer\\autoload\\pharbuilder' => '/phpab/PharBuilder.php', 'theseer\\autoload\\sourcefile' => '/phpab/SourceFile.php', 'theseer\\autoload\\staticrenderer' => '/phpab/StaticRenderer.php', 'theseer\\autoload\\version' => '/phpab/Version.php', 'theseer\\directoryscanner\\directoryscanner' => '/vendor/theseer/directoryscanner/src/directoryscanner.php', 'theseer\\directoryscanner\\exception' => '/vendor/theseer/directoryscanner/src/directoryscanner.php', 'theseer\\directoryscanner\\filesonlyfilteriterator' => '/vendor/theseer/directoryscanner/src/filesonlyfilter.php', 'theseer\\directoryscanner\\includeexcludefilteriterator' => '/vendor/theseer/directoryscanner/src/includeexcludefilter.php', 'theseer\\directoryscanner\\phpfilteriterator' => '/vendor/theseer/directoryscanner/src/phpfilter.php' ); } $class = strtolower($class); if (isset($classes[$class])) { require 'phar://phpab.phar' . $classes[$class]; } } ); Phar::mapPhar('phpab.phar'); define('PHPAB_VERSION', '1.21.0'); $factory = new \TheSeer\Autoload\Factory(); $factory->getCLI()->run(); exit(0); __HALT_COMPILER(); ?> Ó) phpab.phar8vendor/theseer/directoryscanner/src/directoryscanner.php«"\BVA éP…¶7vendor/theseer/directoryscanner/src/filesonlyfilter.php´ \BVªAúf¥¶<vendor/theseer/directoryscanner/src/includeexcludefilter.php^\BVT†BØl¶1vendor/theseer/directoryscanner/src/phpfilter.php× \BV¥šFA¶'vendor/zetacomponents/base/src/base.phpÛY\BVŽû\”¶0vendor/zetacomponents/base/src/base_autoload.phpN\BVHª´Â¬¶Lvendor/zetacomponents/base/src/exceptions/double_class_repository_prefix.phpV\BV6åŽw¶7vendor/zetacomponents/base/src/exceptions/exception.phpª\BV CTsï¶Avendor/zetacomponents/base/src/exceptions/extension_not_found.php6\BV~²9 ¶<vendor/zetacomponents/base/src/exceptions/file_exception.php-\BVŽ®¹¶5vendor/zetacomponents/base/src/exceptions/file_io.phpÕ\BV™O¶Í;¶<vendor/zetacomponents/base/src/exceptions/file_not_found.phpJ\BV,T]DX¶=vendor/zetacomponents/base/src/exceptions/file_permission.phpª \BVîDíg7¶Ivendor/zetacomponents/base/src/exceptions/functionality_not_supported.php>\BV× V&J¶Fvendor/zetacomponents/base/src/exceptions/init_callback_configured.php¯\BVó: äë¶Dvendor/zetacomponents/base/src/exceptions/invalid_callback_class.php_\BV Z»¶Bvendor/zetacomponents/base/src/exceptions/invalid_parent_class.phpE\BVßîå‡å¶@vendor/zetacomponents/base/src/exceptions/property_not_found.phpù\BVÑ"íyA¶Avendor/zetacomponents/base/src/exceptions/property_permission.phpf\BVW>ÂD¢¶?vendor/zetacomponents/base/src/exceptions/setting_not_found.phpT\BVñH[Yé¶;vendor/zetacomponents/base/src/exceptions/setting_value.php[\BVºÍá¶3vendor/zetacomponents/base/src/exceptions/value.phpÆ\BVÓú«.Ѷ6vendor/zetacomponents/base/src/exceptions/whatever.php \BVÎ8±K¶0vendor/zetacomponents/base/src/ezc_bootstrap.php|\BV¬M‡€É¶+vendor/zetacomponents/base/src/features.php¥.\BVÇ '傿¶'vendor/zetacomponents/base/src/file.php_H\BVÞùà ^¶'vendor/zetacomponents/base/src/init.phpV\BVukoä¶Gvendor/zetacomponents/base/src/interfaces/configuration_initializer.php‹\BVªE”¶8vendor/zetacomponents/base/src/interfaces/exportable.php§\BVBú©ô5¶9vendor/zetacomponents/base/src/interfaces/persistable.phpû\BV9­J ¶+vendor/zetacomponents/base/src/metadata.php¿\BV¼Ÿìb•¶0vendor/zetacomponents/base/src/metadata/pear.php\BV·ø<£·¶3vendor/zetacomponents/base/src/metadata/tarball.php\BVý” g^¶*vendor/zetacomponents/base/src/options.phpð\BV±y*Ll¶)vendor/zetacomponents/base/src/struct.php?\BV´t¢¿ª¶<vendor/zetacomponents/base/src/structs/file_find_context.phpµ \BVý-ÝÑš¶?vendor/zetacomponents/base/src/structs/repository_directory.php \BVL¡8'U¶<vendor/zetacomponents/console-tools/src/console_autoload.phpr\BV¯ã§i¶>vendor/zetacomponents/console-tools/src/dialog/menu_dialog.phpæ\BV1„wÇÔ¶Bvendor/zetacomponents/console-tools/src/dialog/question_dialog.phpû"\BVŸ †Ãt˜¶Qvendor/zetacomponents/console-tools/src/dialog/validators/menu_dialog_default.php…\BV+¸¶Xvendor/zetacomponents/console-tools/src/dialog/validators/question_dialog_collection.phpà\BV€O›žN¶Uvendor/zetacomponents/console-tools/src/dialog/validators/question_dialog_mapping.php\BVÅ­ÃF¶Svendor/zetacomponents/console-tools/src/dialog/validators/question_dialog_regex.phpÊ\BVÓ»ø{¶Rvendor/zetacomponents/console-tools/src/dialog/validators/question_dialog_type.phpC\BV(—¶9vendor/zetacomponents/console-tools/src/dialog_viewer.php" \BV?R28¾¶?vendor/zetacomponents/console-tools/src/exceptions/argument.phpŠ\BVºX’ ζRvendor/zetacomponents/console-tools/src/exceptions/argument_already_registered.phpE \BV¼/wm'¶Svendor/zetacomponents/console-tools/src/exceptions/argument_mandatory_violation.php…\BV ´ð±¶Hvendor/zetacomponents/console-tools/src/exceptions/argument_too_many.php¶\BV*YÇÛ¶Nvendor/zetacomponents/console-tools/src/exceptions/argument_type_violation.phps\BVu[Ó:M¶Cvendor/zetacomponents/console-tools/src/exceptions/dialog_abort.php·\BVÞ"¶¶@vendor/zetacomponents/console-tools/src/exceptions/exception.php¬\BVP[¥ ¶Jvendor/zetacomponents/console-tools/src/exceptions/invalid_option_name.php\BV÷dõ¶Lvendor/zetacomponents/console-tools/src/exceptions/invalid_output_target.phpï\BVå]vmw¶Ivendor/zetacomponents/console-tools/src/exceptions/no_position_stored.php¬\BV°½RGy¶Mvendor/zetacomponents/console-tools/src/exceptions/no_valid_dialog_result.phpÄ\BVÙXÐý¶=vendor/zetacomponents/console-tools/src/exceptions/option.php\BVµ}ŽžY¶Pvendor/zetacomponents/console-tools/src/exceptions/option_already_registered.phpé\BVÙ-/ß¶Qvendor/zetacomponents/console-tools/src/exceptions/option_arguments_violation.phpŸ\BV~xí¶Rvendor/zetacomponents/console-tools/src/exceptions/option_dependency_violation.php\BVr„º¶¶Qvendor/zetacomponents/console-tools/src/exceptions/option_exclusion_violation.php\BVhV‡m¶Qvendor/zetacomponents/console-tools/src/exceptions/option_mandatory_violation.phph\BVþYXpA¶Kvendor/zetacomponents/console-tools/src/exceptions/option_missing_value.php†\BVF¸^¶Fvendor/zetacomponents/console-tools/src/exceptions/option_no_alias.php \BVñŠ££¶Hvendor/zetacomponents/console-tools/src/exceptions/option_not_exists.php$\BVø6E´¶Svendor/zetacomponents/console-tools/src/exceptions/option_string_not_wellformed.php \BVäÙ0‘õ¶Mvendor/zetacomponents/console-tools/src/exceptions/option_too_many_values.phpw\BVþˆ•¶Lvendor/zetacomponents/console-tools/src/exceptions/option_type_violation.php\BV†àD/¶1vendor/zetacomponents/console-tools/src/input.phpK³\BVè&}hê¶:vendor/zetacomponents/console-tools/src/input/argument.phpì\BV©h"Á¶;vendor/zetacomponents/console-tools/src/input/arguments.phpb!\BVåJES¶Jvendor/zetacomponents/console-tools/src/input/help_generators/standard.php9\BVèBƒj¶8vendor/zetacomponents/console-tools/src/input/option.php¿O\BVS•Ç~°¶Evendor/zetacomponents/console-tools/src/input/validators/standard.phpß\BV xç¶=vendor/zetacomponents/console-tools/src/interfaces/dialog.phpT \BV*/Z;¶Gvendor/zetacomponents/console-tools/src/interfaces/dialog_validator.php­\BVÐ ˜‘5¶Kvendor/zetacomponents/console-tools/src/interfaces/input_help_generator.php\BVtžÚÓ¶Fvendor/zetacomponents/console-tools/src/interfaces/input_validator.phpy\BVeutov¶Lvendor/zetacomponents/console-tools/src/interfaces/menu_dialog_validator.phpŠ\BV±÷åT¶Pvendor/zetacomponents/console-tools/src/interfaces/question_dialog_validator.php\BVíª&cÖ¶:vendor/zetacomponents/console-tools/src/options/dialog.php2 \BV3óY¶?vendor/zetacomponents/console-tools/src/options/menu_dialog.php‰\BV1vžf¶:vendor/zetacomponents/console-tools/src/options/output.phpƒ\BV¦0ÙI¶?vendor/zetacomponents/console-tools/src/options/progressbar.phpç\BVt‚eÖ%¶Cvendor/zetacomponents/console-tools/src/options/progressmonitor.phpF \BVÏ ¶Cvendor/zetacomponents/console-tools/src/options/question_dialog.phpñ\BVW¬ia¶=vendor/zetacomponents/console-tools/src/options/statusbar.php¥ \BVpØ~[¶9vendor/zetacomponents/console-tools/src/options/table.phpL"\BVseKÕ¶2vendor/zetacomponents/console-tools/src/output.php½M\BVêW±?¶7vendor/zetacomponents/console-tools/src/progressbar.php®:\BVdm|Ãë¶;vendor/zetacomponents/console-tools/src/progressmonitor.phpZ\BV殦q¶5vendor/zetacomponents/console-tools/src/statusbar.php \BVj ñrM¶?vendor/zetacomponents/console-tools/src/structs/option_rule.phpÁ\BV ¸ë¶Avendor/zetacomponents/console-tools/src/structs/output_format.phpk\BVhñ+-î¶Bvendor/zetacomponents/console-tools/src/structs/output_formats.php+\BVùD§Œý¶1vendor/zetacomponents/console-tools/src/table.php)s\BVºsB…1¶6vendor/zetacomponents/console-tools/src/table/cell.php\BV+(Ô¿ò¶5vendor/zetacomponents/console-tools/src/table/row.phpw/\BV½ h%Ú¶8vendor/zetacomponents/console-tools/src/tools/string.phpì\BVÿŸ€F)¶phpab/Application.phpÞ \BVa Kä›¶phpab/AutoloadRenderer.phpb#\BV³ Bµé"¶ phpab/CLI.php’Y\BV'ÊÞ¶phpab/Cache.php@\BVä "9û¶phpab/CacheEntry.php‘\BVß»Áжphpab/CachingParser.php¯\BVPI!÷¶phpab/Collector.phpe \BV*gL®q¶phpab/CollectorResult.php \BVé8[ ¶phpab/ComposerIterator.phpy\BVéRÂÒã¶phpab/Config.php/0\BVk å ŸÃ¶phpab/DependencySorter.phpm\BVo0&_¶phpab/Factory.php;\BV+´Ô¶phpab/Logger.php·\BV!ò¶phpab/ParseResult.phpg\BVW–ߪ¶phpab/Parser.php C\BV ýlPÁ¶phpab/ParserInterface.php\BVéð¶phpab/PathComparator.phpf\BVùha¶phpab/PharBuilder.phpw\BVDðLB¶phpab/SourceFile.phpÖ\BVžâ»%—¶phpab/StaticRenderer.phpÚ\BV÷Àèð,¶phpab/Version.phpî \BV¯?¶"phpab/templates/ci/default.php.tpl\BV/]i¶phpab/templates/ci/phar.php.tpl¶\BVë~𦶠phpab/templates/ci/php52.php.tpl×\BV ^@ÞN¶"phpab/templates/cs/default.php.tplä\BVÿBw#«¶phpab/templates/cs/phar.php.tplš\BVÜÏ2q$¶ phpab/templates/cs/php52.php.tpl¿\BVÿ&äN˶phpab/templates/static.php.tpl˜\BVp휺›¶"phpab/templates/staticphar.php.tplW\BVTÒ.úÖ¶ÝYásÚÊÿî¿bëÉk CL^¦_j?¿[!QIØñ4F «£¶™6ýÛ»{:‹&¯)ì“nwo»{»{§_~[<,NÚïÞÀ;èÄ‹UÌRhLšðñÇ?¿ÿøáç?–D®B/zäI*àŸ?óç3ŸÿJÜZ‚äpÁ“'îŸá{š²¹ˆ4 ÆË4ˆ#ð"–‚Cˆ—É„Ë7ã ò’Lãd.Zð¤'ò¼LaûÁ4˜x$ E2½„Â'ó M¹‹$~ |¤^Š8Ê Ãø9ˆf0‰#? >!™æ<=WzÁŽnâi®Ô$ö‘z)RÄ“z¨,‰õÆñMå–Šâ4˜ðV& $¢@’S\8òKZ᪓Рæ<9;  ®Z°K® ¢õ—¨áï¤(¬~³;7ø¨]é†îÞËU{ºkÒŠ=\Rƒf»zghh6I íå0 ˆ]ÝéšÞgÝ3T×vËLœÍ0*#ˆ"\xÅPYíÊ`Ùr¸«Û¬ã²Í¨ƒvD%8ÖÑiÀ¾0D¤Ù÷!ò¢d‡ýeˆt8]­¯]#ÆFÉ@%ë“:C›õIq«G¢œá•ãêîÐepmY]iy‡Ù·z‡9`XŽ4ÜÐa-\ÄÕZ4RÐj8ã«¡£“ýH–nºÌ¶‡W·Ì&á-„šjÈÝ•¶¶L‰eÙ÷$—Œ!]Ñ‚»†ïÑí¦LÅd8Ìá ;n‘WE{º°`²kC¿ff‡Ñ¬E‚ît‡5ehÙºC4z¶ø†+ ¾tê– áÜ’®½Z÷V'å3bh]…¾u†eý|g|Zx“GoÆi[uƒ„OpÓ®œ‰E<‘óÞ÷Z"·]½Êòi“Ýjp´öU"øbfŒ„ÔìÊé‚‘=ª©è²ßCš.ÎÛí¦„åølÏÛ˜‹çI»NûäDf)ÍÁ}àÒ}-ÓÁ?NNH²¬³ ýd™ÌJ  &x˜!%¼f8e+‘ò9,>ì—Hô~5†åÓ L—Ñ$kr}_ÏôiÐ*M M(üÞPòþW¥ò_ÿ†‰ìbMôm/~ÁÓ-¸¹jÀ–¡’¡Î†{e1™iöFܱv@m•DÃÛ,¿ŽÃÆ9Â,34‹—ƒÂhM°s-ƒ{ Õ­T‚5+À*CP¶‘TB¨0í¾†Üe±ÁÈ…Š[/ üq™š~éC?ËÂ^&|AK4Nõè‰X¸ò~—û§­ Íù¹¢!ñÍ‹-±ßªœ•oÚ­Çf›y ÷^àËèÿ úá_»Øóa)lÕÎÇ1Ö; šì@æ¬æÔ‘ìWÏ€OØ2‡ØÐ(ãA{cȬYøÚ[·yÂ>?ïY†aÝœû¾¡›ŸïÝÞ½-%U®,‘Àå%`ùàU~TvÍ££ž’Ûè—¡ªáÎM¹Ò~¶-Ö³')`ÃBÇ×” ugÌpoúVn¡(©å–@”¼²'G5Jq[ 5ù«aëì-æyÃrD1G–߯˜³UÌq•=5K©œs|8¦˜—zó#Š9¡^ó²˜_Ì•ÖÅœ–­˜ošÏºf©,æÕç—½¨Ž*ækX‡‹¹R¡6„hƒB,BÚ3Öøïœî¤ä]TvÌ“g»¹—N(Œ1ŠbTûЮ ~kKÀ)[þ4Âmñ'°Õ§ïÔ d}8¥säáŠn×¢8­cød=šÆ p×õ‡L/ ©~«¨Pu¥@Q<ÚçðPŽÉCžé¨qS kW|<1¥Éª²á2jwÉ¡z’‡ rÔ –¾7CÑSüHתâòV“®Éci9º”UPÞcƒòÈ7§.AZ T«(ÖÇCôÌK)¤ÛQbS­´ÏŸ‚ó"}½,,#î¿l_+´ÛY£QfãÚ‘µ½ýOGKŒÙ¶÷ó£ôæê§¥Ö#C–òE1?|_RøQ⯺H6ábÓ]¿ÿ:` åáÌ;â/HUV©j–z+™Þ‚sú>AÅemŸÌ›áeä<8ȸq*Ò ùÓÀ¥Ôäëúî%G¾¶À'ý¶yvîkª™ä²Êž…ް’¶¹ó¶ŒxˆyëU`»ºež9ا««²L„:‚«âÝ“Ska’BÖ+ W¥I¥J³¬»’/Oùý fÚe”6¶ÏóMø­|Wq® ÐÛwo›Ä®;É­–¢Ä猯úò`}kVhûËgãêtD£LUIÔRzïø«²Éï m›™îHsFͽ1µ>kÍÙÓ ¦›=ëxN‡½#¹úV—úšó¹&ßgvÿ S\„ì®Ò‘鈵ŽEe²»ÑÚŽfw„2jr:ŸõÁ¨k¹uµšúi=g‹¾¹[ ¿í|Ù¹Ñ_§×ìÊ_ÑåäÿóoůUùKÊ#_À×Í«ý_&X’ ÙÍyxÊ¡fà4R•ätóÍ~_‘Uë|Æ«K¨ yiÂÄùóþ«õ.Ùšê3IáÖŒ¾ dÜÕEI{sãt¸™¬§gáú Uýx‘‡É·“µVaoÛ6ýî_q(VÔ.ܤ+öeiÑE–蘀,y¢”4@‘蘈,¤”,òßwGÉ‹æ¦KlK¼»wïGúe·ÙŽß¾Á[ðëݽÑ×›Æù>¼ÿó»ïü Ï2ÁI?ÂâQÊ’$[¥<Ž&(Â*„L=ŒœÖqäjF±âä’pI ·S¸X0\ÇmÜ(&á<’C €~:ôĬ¨g:("vò3ùŒ¬1]pÁ&®µ.ȇwÉ/<ÌœQùnÓ[÷8hç©ÛZàsð‚sNä;gרïÛWEæ/zõ÷'ãt'óy­èXÚ¨í½ÈeU)ãì²Å³fܱ{ÙÍrú8Ý^1ýÞM§%NÆÊ:f3@ؽ¢éx4r³©+H7J(e¾’‡?F# u·%¸Y6×%@޲¡™UƒÌsµÃa[ÁZ—8¼ÜÈ‘8 {,нs±Gú·ªôQÿ‰2=Ö­24áè-Q¥’VÀë~ñuïuì¾ñž°–ŠW6®ÊûÔï82 _Ö{ùþ&á“2.Já†zÓ/á»rWÚðz#ƒ®ò²-Ô„.Œ¼5/,y‹>èH«tý <‡A§xµ·/ٺƊ«éø¯ç]{…ë¶Ê»Ÿ/n‹Ç,‹wH¾ÿ@÷Ë»Ï=“ñäÝçkÕ¤÷;5žF8)QfxC½òæä 3}zŠiÕÇo¾ƒXêêæ9Dm£Äc£d¹“Íw¸¯ÐB‡ùO^’¿PkÙ–Í3¹×ø£áÙrߺÞÁ¯‡ÑŸµV]o›H}÷¯¸ªZÉ®hÒ­öe›¦ ãx$ ^ÀI#õe ãÕk€¤Ñªÿ}Ï PS'm“Uk)æ~{î™ûîïÝz78~ùr@/É)vw*»^W4LFôæõë¿^½yýÇŸd«\Òx#òORU%½ø>[vßG©|¯­í͆ŒuIJ–RÝÈôëZÊ4++•-ë*+ryJu))Ë©,j•H³²Ìr¡îhU¨miÑmV­©PæYÔm‹4[e‰Ð,íS(I;©¶YUÉ”vª¸ÉR¼TkQោŸÍ¦¸ÍòkJŠ<Í´]iŒ¶²zÛâ¢{ØJ*V¨¤H¡]—ò©Àj·bYÜhQÇT^TY"­ÆA%+i‡ÚO?pž BÔd#²­TG?@ƒ¨=^:4È6­ð7¢6×´Hê­Ì+Czç†Ç¨KE[QI•‰M¹/€)œ±î%ÒOÑ—™±Õ:¹ØJ ì Ãòb/.[à¯B•­¸£¥Ô„L ’y ¡Ô=,Û¢’ÔÐ)@¢iAÃHY¬ª[tCç¬k³r'Ýg°Ít÷)Ý^yÓheÙË$žòˆ¢`_Ú!#¼ÏÃà‚»Ì¥ñ„Œœ`~òóiLÓÀsY‘í»Xõãq€…gvËgfó@fûWÄ>ÌCE„ÄgsĶsYÄ}Ç[¸Ü?·> ›ALŸñšq`5ÐØÆLhÆBgŠO{Ì=_™¨û:â!mšÛaÌ…g‡ÚÓ|΃ˆ‘NÑå‘ãÙ|ÆÜ#À@\bÌ)šÚž÷`ÆH¢Ÿ®v8fk=Ö„CÂ.™ëÌöoxHÏ¢hή_؆ŒìðÊd[xŽØ? èAN®=³Ï‘ãð€ vt‘œEÈfx0Ñ®¢Å8Šy¼ˆk˜XxÁD†¸EÄ,‰mKËá¬AŒ÷ñ"âš?í‹û1 ÃÅ<æ? —`HmX»†ëÀ79ƒ¬ ¼Ò~5¦]NÖQvßÅš8[Ó@'îk"*øŒ{É’ÏÎ=~Î|‡ii ]òˆLk…<Ò:¼ ~i#òB§oŠlÍk¯-SZâ²Ý ®Á7ʦ%ÀoÛ«Ñ™¶ìw;ãl'’OâZêmåfJ&Ø´wQ"ò\*#5öš2Ûîq7ËÙþt{„…õ½›ˆÎ68óÒ G.yÍ'Dǃ9k]R¼–‘”êã!xúw0Цæ¶$s–M² @Ž?Qé3« ‘$rW–¶%-…>œpãey²©Sy,?›gï n=uŸJNkõKj}ÝH¥:ýÊD oéE»ø¢Õ:6O\eI¼É5©0"?ãøLKúx°ÞRù M|¯½«VÆ@_{{T®%€ïŽdÕ1×c¯Ã/HPâ®·züõwB…ª¢,Ï[·'OÒðCiÝ~J$«fHºk&ÜùJ_NÍ ÐÔ!¿Á´JlT†‚öiv^Ú¬H_ßùõw“ÃPTCë¦ÈÒ‡Ó«—Øo´ªóÄL}¥¬ÚVŠ}ôÓíp4BOPï÷\ßÓ¯Þw NúÉW•/ÿ“ª®€O¦ †{ª:/¿ªv;uTéè?£ªujÔCÕÁ¦œIœ=f˜J1ÁÓíZšQ 2Œ•ZЖ£ïD³šÔJaP$°¼…õª;Bɲ(pÄäb¥9Z‡÷²GÖf<í˜há G¯Þ_ËjÞʇ£ÞþÒ?lh)’õð€?QÒsÌ‚‡qô/[Ñp•cêÕVбöÑïU¥ûµ™®0%Ë“{_ß~ý`·4À,ÿ)¾,¼JÕOE÷pb­_ÿµVmoÛ6þî_q(ZÔ”—ý²¶É"K´M@–~wöÓ{²«RÒ´HÊ/²jjú”`¹>ìO2y¡­í¢ c]S%kYÝËìçZÊ,¯›*_·M®JJÊŒÚZR^R­Ú*•æd—IõHUíj‹òfKª2_Õ6´SY¾ÉÓDX3©$íeµË›Ff´¯Ô}žaÑl“$pŠB=ä奪ÌrmW£l>ôqÑ_b«ImA¥*ƒv[7ȧI¬†MÖê^‹L•ªÉSiuh•¼¦€gè¸ÌžE¯i‘ä;YüC4ð:àå ²ÍZDø?D}®™JÛ,Cú†§¸…ŠvI#«<)ê§ 0g¬‰ SôenlµN™ì¤ìY…•êI\÷wXªªì’GZK]HÈD‘,3¥®IJS¤Ž&àeåH:FjµiP °C™Õ{™ê:ƒm®«¯ÒåUv…V׃L¢$‚Ytm‡Œ°^…Áw™KÓ9Áê&äóED‹ÀsY(Èö]œúQȧqàà•-`ùÊ<Èlÿ†ØçUÈ„  $¾\yxpÚ~Ä™°ˆûŽ»ÜŸ[ Ãf‘Ç—<‚fX]hìc f´d¡³ÀÖžrG7ÆëŒG¾ö8ƒK›Vvq'öìP#­âpF:E— dzù’¹'~‰]1?"±°=ïÅŒ‘Ä0] 8eÖžz¬s‡„]2'Ò™=­ðˆ =‹ÄŠ9\/Øg†ŒìðÆd[ ök =Èɵ—ö9ŽŸôŒ}IN²¥<˜i(OEÄ£8b4×0/XxÅ&>’C\,˜'‘mi9PÀÄXOcÁ5‹û ÃxñÀŸ€„k0„HmX»†ëÀ79ƒ¬ ¼Ñ¸š s]/Îqí¾iÅš8[Ó!@  5á|FƒdÉgsÏ™ï0- 4Ð5lbJ+äBëðÎùµ ϱNß\bë–ƒr¶ÌÕŸ‘í^q|§lJŒð¾|p*bgѳx—û$ý’ÜIý¬l¼ØB%™9OZ¼±Ê<·›(—O]í,¬¿›@tY #–µ‰h*\òº-D§£‘é1YR´•BÊêÖÍ+™¢Ó<Š4)KtªßG#mj¦$™6Ë 4>Žß¤Ñ½JQ’¦r&[„‘z˜!›¼@['ºIaòé>††ÚÃÐþ-3½ÕÂNu/+ÝÝô.”…D¼èMø¦×:5_̈º¦ÕbõŒù™e5Ý>;ïÉûŽÀI\J`Zy†ŒÑû°•fP@†¡¦y™m&‡ zL¤mUUʹƒõ©zÍ¡Ñ%z[a´*…\ËèôÏõ¾]£lhÓ–i÷O‹¹àñ Ñàçõ&/7ŠÎ©”tk6ã÷÷gÁoK´ËÉÇïô{Ï{U;ëã ]&ã×z2_ôÙŒ'Çw²Y%ÍV—èx2±èm–O¿£ÀÞNèüüœÎžÐ¿uDãómôíþ5Èàç(Ȳ.ŒÂo±Œ39yBƒNÁþ¹N¦ù*H¥x,ãI‡I,Z'ׯÛ¾ÊT$±ÄÙI*æIÊ+¥áh™ÃCÁ,•r.ã<ë q-%¿¸¼9?í‹) ‡ó'aÆóU˜ß˜0«$ý"¦*˜LB\:ˆDÃsB'¦r¤¤lœ,Öi8»ÍE²ŠešÝ† XïI¹~­‘ɰ^h]'KEŠEµbFG¼@HòóîO¢pRC=m´_Ðìy°q’‹e& èB~ËEèbóEñ˜f+êÌ€ãG$¡”D@¤ˆdjA޳ñÿBÜæùâ°×[­VÝ€î&鬧Iì½Î^\÷i=ç]É,nýÏ2LÇ£µ€Õ8®Q°B ’ H‹U gœi%°ÅT0M£¤Û€mɨqr-ίâדëóëŽøp~ó×Ëw7âÃÉ`prqsÞ¿—qzyqv~s~yß^‹“‹8óoçg!e°”üºH‘À4DŽÊ‰¥OÔ%§l!Çá4yñl̤˜%w2¥m°é<ÌP´ 9õ˜‡9)U†S+´é]ò °û ‚ D?Ü) éõÐú¨y0ëõè‘Þ»‹k“þÈžÞÕÅö%Vðî"|ç2¿M&™ˆA’,KVKPÈßHaÃâN| =sÐNZ”Páå•-yòÇÐKAèá4m Jc"Ø×HA¥B¼è ïnqõ×+o4ÃÒ]¢Gÿ‚EÉrqÖ¿ aÿ¿n€W %âH4̌Ƌ'ß¼¼¢{Óâïû½´íYøL‚-,ŒEšL–c²™ód"= ß^žõ‡WƒË³w§7 ú§Í 'òNFɾæYÿ}ÿÍåÕÛþÅ }VzOÀŒóh-ÂÀæ¸#bxFj›ŽU5!JP+4wØ{ †÷Ë] ÜüñÌÁi‘†wA޳`{Å^ŽÒ ]¿Ü‘‘D‡§ì²ñ2M‘`ô¸{ó$]wÉp|‹–g‰”cÞþ ÅY e2GÙ7ÆK bÞx, ŸŒÎ™Æ艗QT%О0_•ƒÕL-¨ÙP‡1šXÚÅ€I-†¡Ì±²ivÅyÞÌ”\øy½ÅDNƒe”w4¸‘hYÀK`qð h_¡Q…ùœMBv7²2]ÆJ2MËÊ[%äÕ/£8€© 3¥¸†¿èŽÙʓɂ¿a×khzGË\#:p]ÑPµr9G*÷R¹H²ålÎD”$_à¿á£lAšë–ˆ‘Œì2’L»KŠ@ÃĹF–³•Óð+¬%ñ¬5)…0Ò¢f¹(ð"œ¢6Ü…­üã Š,À›S„10“Zíùú˜ƒž’÷~ær†úÚUH.¯ªL#ëäÑ1}koÑÍߎŒ¶o›G`•‚’Œå ô°ûÒ^nš&sw@.?  -–+WßøEN:8$¢4•e2Ñ¡o˜1Àèç·1@#qB‚ÿaôÛZž1Å a˜Jà9S(öeÆödWF].(RÓÁ^%¡©¢¥F¨‰> m˜öS]õ$Ë’qädLƒ˜ý@Œ•³(p~TAÌ52š\M^Ù‹Ýrñ"8‘˜Ã pdjZk8Áìç@’¡5,’ññ}U/Q{PöFié³ðí ÒyÌ!9ç„ÅüR²§Æ¬!—8LõÌ—):ùt Á®1=bDUDÛƒ£Î1FÉl=1¥‘ª?ŠaåL´0R]NtÆ›``³ºM4¨iúMêŒä´käÄÚ îÞPDWÐÙ¯Iv9»ÕäòVªebÅ(I"wC°l•¤ˆ5³[6eY*Ù‚B\™ ÀìdOœR¬ þò(ƒ7‚»9W=Y ò0’™;ŽÙêpàqZ¼3‡àÆò+d|™c§@ªdúÚ }—…ãy†q(¤óObŠd¢¹Œq6šÃæ+gaQ³Î§—Ïâ舕ÉZºº<~”thð çé½óÍ,ª}ünxر–CÅ/V»ÿÎR³¡¡­ô»…ljÖo´œˆ½ëý/Šº¯Ö/‹|;^ýE’+vDÆFÊuù&P‘מý6ÈyœBÌ•SðËF‰5=È$d‹Ñ„œjÒ,à+ îa0pAfÕòÉŽ˜ „ ç¸lK4zÿÝúüþÓÁ|Þo·>üö¹øþªòC¯ÑqTlo®Ðo‹§‘ºâܳ£mÌ'/ÊZw2z‚Ê~zކýDÑîÀ v©Œ…-‘…¿ËdÚ²Û¦acŒFþrXù]¡TÔ¾×CMB˶¾e"Á/á÷•LÛh´>=ÿ|?,¾ý ßlÈ Ñ~á‡nÄûé3öbþîÎT5EÞÎl¿\?=û\á`='õÇ»iìÏ}³G`&¿Pz› @µ¿xÖ}â—ÜÏ;Iî{Êíÿ%õ8I=ßAR–SÓžÑü7” ¢ìËvõm°Qy0åp$¦ðÝÊJýffTÀ©@Ô@8`þê³S”Wvæº{Tt;²àXÕ²n!ìž%é=`@tÅóðOÑRlwN2µƒî47E@§8âQ2Ž’–Ž)¤…SfÇm°XÈ8£D3Òq ïéT’h y«þÉ@¯¹÷¼©R³Elç÷%–öeà0„ÆÚ=ú]—ˆü§Ì-fóÁ…sЍ>{ºÈ}„úŽÖ¼%†Ã×çoúác1MT]`k«a–äìõ±MÕç{I?Ú¦À`ü{÷îñ~¼<ŸUzžäA:±îŽ™æWÒ¥nÿ×x" ¤žñ»­µ}¡ûšÍlê€Õ|”5 ͤŒŠ `…‚©§vî¦Ú¨¶Ú2ãà «àæÔ­»5“­‚3Ù[­Ó‹Š]œ: ¡ÏMq`ã-N96Õý`>„b.ñÖ‘¥)Ä®•êˆe¡ÁçÒ-˜Úpwµ+nª¹^ŠAÁe«c2Ö³š«a¬†[•ü ©K‰/ŸŽjLØØ*{Œ?ê²T[L™AÜbƒÄ¥°7hL¹§­|7ŒÃ¶PƆO 8Ð>åÐc¯#@WÏÐ`XYšÆ€\}©Œ¦yv„1!@hb@ãµÙ瀭/v¨ƒ%´ 0J%'B)̆ꈒµ¥Íå>µâö‚0íd¢lMѾ‹Xª?)P*Ú[ÛØúÔUUýi8—鬾ðZà]5u5Ѧq“þ°„IFž>µk]Íž‰,÷zÍŽS©÷$kþD Õ/ Ÿ¨Ð†0b—;5ÀŽŽyo>8d]t=U*‰D’Z>%¬ p†wtŽFbržNƒ±ÜiôFV¹HµÁÑü Tö{5lÛÌ:ü<¤Øï,þ¹®†ƒÒ]ýµú‹Œ2¹£V=þœb;µe…b¨FBär‚ªú!U´oÌ*FN ;ç|)ƒH›0b»Ë3µbp±} úJ=¸¡ŠŸ®”e>¦“ç4 ÞŒ“Kû²Ø|½-6xŽh3UÇà~s]h½ä°6Œ«l­"åøCȧ¦å°&ÑüÌa.ü·ˆ©¶Ûsãj*õ~3ùYˆe§ôPd^Tk{ ¿.ÈÎoÙSû† d¶Œr=ÆôË`¯øz o¦ªý9C>AÄV ÐŽžMx[ù:w9öÍÇøšê?¦ËŽºP†ê±™î¸£]à ­åJ\ñà`بöôa¼«b}P–‚ ž…5ù¶tÍ >sâwÊåðD<>>©§ã;Ç)øÙv$Z³x‡oŠ]œÕ¾ùLÒ}c½ø~'S‘`«ÚŒ{>ÄáA«àÚ.e´7ØfÚ1ƤݱzMh/ĺ×d%©1 6E¹—Ñ4)6zY:î5Ð÷„q&Óœ6‘9n¹’ÐjÏýº±åc[ÒU¸d;ª³êsßR$yL•"‚­EȤY¨Î†Û˜Ô}]D°&ÆoMU0íˆç>ýaRŽLü÷»`máá!¥žïªeŒc0ÍU…nˆwÏÀõ‡ãi¦?ÇÐÿü§ýÛ;0Ý7`5š;[¥ïAÓcEðMA¦qøL@º€Ÿw&@¹Å‡ Zczꕌêhž`2{ŒVoé²@ˆ ѺÛFUgô÷¬S âVœ€­¦V¢ÌÁ†b­Š±6Ï/—òðãHõÛ¦ €Wö° Ê ï¹ >J“/rcèR9·A㎄îœYg7>ª»54?Òµp' pÃôJ¹6ÿ®Âuó~—áÉ vÕ¥Ç)Í®2ÛY<Ôî–¹wv°Þ L°îçÐõ/sñ'+ …/ZèÊŒºáù¶JcϨ¦°þ*–¥1˜éipÅÝ!.CZw‰h—kç  ØÌ6Ãë|\²wDK®]jXZ£$UG…Ù8 ñŽàT]í1ÐU²ÌgÿÕNÒRµ[ÓRz‘ŽKŽú}~tEW ý§‹Ä¡3ƒ\ËZ±Ã t´ú@†Ùµ1páÚÊE¯ªyæžV!ï§–Aag¯[>ùrÔþ<À#úl)jbˆUb´$~>­f ð'“+¼Qóþ(x~o)oé S]Òq¯Ó‰æÌšû¦u] T–èï±·ãèŽÔº&WÜÞâv¡/4 ø¢ö´¯¼@BVχjµlZç:¢y|Ôü·»eaÔ¡»®Dè1 ~V°ò¾ù`pTù@%’°:ƈè'Eû»Du+½|€V´$;fÝ>r®²Z¥êŠ^á]•ÄOtwtJ¥" ¯¯ðý.u¯¦¨Îå8 dž9Ý9/ Hû¢ˆ@t;ıö„Õ–—u‰ }&èÞ–©Ÿ^ºAã·ÓõÍ6%«ly{zëoN…uûQû«ma»VžJø¨œvû ?9Ÿè° +TVhâáhkóÃÛWýáùÅMpqò¦S¢¶üÒƒ{ö¶cmZ×Òþ&×NYZõÔ×xMRqõ[éF×Ët[­oJNͯ½i\µÜ.ÛW|6/¨Îè!rS–­®ÈÉ?Ýá²Î¶â›ûä8ƇÜä”…Ïm{´[#†©î”š´([ƒÓ˜{/=™-ž_Ðz®س³%Ý<äþªæª ¥E“•y[Ý&Qµaªž{%I•¯»Mˆûêê$Ã]h©¹@«ív¦­kùNnjPK%¶^ÝIaªs\†)Œ;lõF+¢×¤–ÙÒç]ˆ¿ýåôUEè¦ùp m=ÆBcõNT0õÏnó“"âfjôÕžÍ}§[Åàê¹›kå‰*wÉ’¹dÐѨ׈ŠU].X ù&wi¹þ×_aØ è’òmQ”¬¨fŒA¡ô€—ËèØü…ÇE«oU…\ê ¡5º=ÕxÙ6´’*°&¹×›‹— ` ʘZPFçáÛm…e==·²Aºßø˜,½°xHwéh@_ËnÈôíšdøLA2?<¯ˆKm†#ÒLóSj¯‘þí\QJ9¾ž†ãÏX½Ùe ¶:¯ÈDå÷°º+®"‰ ñU,)Þ¦i®Ò¹Ä`AÓ…}q­¸–D³U©äåèØt‚¿ìŽ;LÓÑÝDZ¯@àí˜.R™‘̱|Ëg¬e½oÌÝ+6BÁq;Ì|eîìÛ…Á–ýDˆf!ù&ºìæ[Ù›¯‰€gtk S7þyyüóêxí!÷Å+KÖ6¶†8púCÈ+Ô†ï=\l#…¢z&}¡7ŽYˆy9ôeq¼rµQ¿_!®aHEÇ{sß],ß@ iãÈ’2Ô?~î{\åôÆŒæ%ÅË©,þ˜WQ[<—ãÛ ³9YŽÛ€ý±zƒñeÆnàZ»¨› ~=.O4U°6+¬nZ*²7_¿RášýÔÚ]‰~¡¢e¶±b‰•‡J0JV|6 ¨ÎZ×2ZŽKJKðkF±=Û%õóñÕàЩÒÃÍnEg§Ó#^dæU8µ‚J.0›AT©yfCØžÖª*Ï;—Ž (á( @³æ¢"Dãe„>Îh5a hb1& †M*ú»ȃV•Y›2+|-èÇ|U?o:Øzùk_¼ÙÂâÝÜ™Ó%âZÔNLýãòà7Áu‰°Ûb7^K(5 ‰"㤠ÙÒŒrŠIÏ+,*•-K8Ûu*Ó¯“93êxuý±|à JÝu{fQ§¾d°½}«"÷³ ‡,ÙîO³Õ@/½Év”Ò÷êÅÀíŒåFýb:¥øÚÁ Þüœrn‡ØWòñmÂP|þžŠã µ®ÖYN½w¸ßäKõË/F±aêkèÌ #ç‚™”Iô#ðKÝUß;ÅjkŠçÆÈ’J9‘+{õ/ Ñ0‹*‘ªZG×åû€ÙrHª+—qðL½ àì|Ð?½¹|^÷¯N'7x±Î„к]ï$ßVÕ¤…i[Ûp˯òþ4¥ìx.nÊ5wt0§^|¶‹€µÝ*^˜æ=~Ʀ‰N ìè`öLéƒÒûÍí‡ø–÷xî`Y“¦Âû> 2Í:4è\·‘:×£©x‰œþ³N~ö^ÕÇ"eQÖíšÐœ°n-Ã+i•e¤·ŸƒõVTñÆÝªïxûÖw …ñ™¼Ûelsª•Õ.¬÷\¶,Qp•dYˆ¯ASС¿«M_Te">વ­IŽ¥‰}=Í®¸Œ#c}#š9ðÁL\RzP¹£Y½«ö vô-Q»…ÏV·ŸfçýÈnþ•—ÛnÛ8†ïýDnr€×Zìå¶ÛÖõ+l×6,·A¯ ZÉDeRKRQܧß!%ÙJCQm€$>ÌÿÍÃ!õö}q,FÁÃÈ i°\Kv@ÿ’ä5‘ÐLœÐ•šXüj½ g ’²Üê¦jP1}D¦H%ä76M›Í ãøÁÉb„2*Æ3t]œ%ËŽšˆŠƒTGV ¿I%Z¶Á¨ܺÅ\Ï¢lRédÝcL¾ ȤüÇäwr‡FtÓ|{sÿƪOôL¸Ð¤Tp¥xŽ¡Ð®-uÎ(­ºÉîâcüÚ@ÄAS´§6"Ò®¡Ú¨Í/!G­‹?ƒ ªª µO„Ì‚6ÅàVv-~à[ÍgžƒRX­ÿJ&±Æ‡3¡FÓÆšÓʬ ](ÛE%±â<µj› »L×¢µ!bê],µkt3HÝÓ(ŒÆä1Üý½þ¼#ÓívºÚ…‹ˆ¬·d¶^ÍÃ]¸^á»%™®¾å?áj>&€%CWð\H“FÊLE!éôSCÓä6êb–²ÓãYI3 ™xÉM³ OL™¥Ud‚íqbÚ6•2ÒW¹µ»äCÛÔ?¿¾ž²È§æ}PÜ7nšýÊt’¥¬[炾™<ÌÆ‚ÑH‚.%ÖYJz¾ak[ø›ï¶ÿ{K©<~}WÒ]×&Þƒ¨µ¹«’Z–±à\AÊš;8C„8üã9°üéý˜–ï´jgŒ½ˆ˜¹Àpó}ÙÓ‡Œk)ñ¾w•{v•:*3ðÌÅÏW—¸(]C(ÞE``™/Ø´1ï9:†—èJbîxðã%ã Uã ;´3%fjaÏÈþ…Ír8(ÿ‚¦sªéOì„æøF=¤ P¹óÜçb¾"Ú{p;*x´ô_ãtmïàæŠ«†zÎÕrÅUéà^ïts|¬‰Í ÿÕw®sI«kè÷oFïßþ•TïoÚ0ýÎ_qB•Z*F¦}l§uôZSCWõSeœ#X vf;KÙÄÿ¾;'¦¬¨Ó ‘ؾw÷Þ½ódzrYv’ããÃHÒh/”V:¿DÀ_ò\8¼4Õ¼À‹B8wƒ¥qÊ»þfq¡ž®ž$–^ ’· ˆ±®•Dí0oΰ’þR³ðµ°#SéL„°£a:ê}¢£‘£…•±M1VÍ+ÊEƒ"·ˆ+ÔÞ RÄ?™ÎÆW° Ÿ)×ÄQµòK:£ÔÆ>‚ D–)N- PšV¡´˜ ›1yiʵUùÒƒ©5Z·T%å›1•t‹q pLK\צj©ì°nÅèÃwbÊïáˆpP·ÝíöNCôJ¬A•ÃgtÀ 2•K…­ÊB -CtËn›ƒj¼oAÌœ "P³Ø=Âs4ÿ–Þ—'IR×õ@„‚ÆæI¤˜\“²“ôêcnuΑZ?*eIãùDIUIA.BÔÜÁШ`ª¢¶¤¸Îûí¢ vÛô,Z,‘¨ï ÙDèQw˜Â8íÂù0§}¸ϾLogp7¼¹Nf㫦7p1\Žgã鄾F0œÜsä×ñä²H’Q*|*-“ J+ŠÙŽŸb ì–¶O®D©J=W"GÈÍO´aRJ´+å¸µŽŠÌÈ+僩xö¹ Ú)ùLr?2ÏXXøÙ:$I¹>G$a=ºÿÿ{õ/ód§þ-®Øð–ê%j¤bƒe½]S›Ûù¡–ѲhnZˆXU”“p„‡¥ ½ ‹"[ÃQódbÆ@s$é߬SÒi²¾…>yÔÙ6f»Ñùݡـ ?ÇpAíô¶’žŠõ›ÒlÔ`ìÊPE×OÊÁœð¾ ªQ‹¸Fd4%ÃnããÖ¥²|~ÐnÄ}RÌŠðø?Ûl¯lÆœ¯l¿ÈÔžJÂÿ¢Ò2Ð{xQ£˜®ÿ Ý߃^hD懒ҥ~ròR—/Ü='Ñ}rø{‹½9„£=µøÀ‹Œ›ÃH¡Ãå:ÇÆjô"ß´‚VùVØËíY5·=Fÿ~ó¶9t¡wxl:›Î٧ΕTaOÛ0ýž_qª(Ui¦}„+ÐjÕ¶V"eˆO•ã\‹ÄÎl‡ÐMü÷ݤªM#RÕÆ½w÷Þ»;º¨ò*ƒ0WÒ2!…ÌÀæø‹_2ƒ“'Ž•J/˜1# wˆo‚£4˜€U>z\1N_‘JmÃ4ÂTÕ2a×GÓ# WÔ $:´ÒP*½)©E\[:(6e±DiÍ Bôéç‹åìj)ñtøD˜ Ž4Âæ# 4J?@J©X’Wš $”žˆj̘NœD®ªµYnA5µÉEEõ–NJ4íȘMâ®,i]«º•²£º5c?(‘“üqôúà@½ößÞÑ©G—l RY¨ ¾dô6]"VV…`’{t«n[ƒ8Þ·ITìÚÌK•í>¹µÕI6M3bžðHé,ì$†ßÈÙy49&ÒæVh ¹õ³š<Ž×À*bÅYL\ Ö¸úFù &Çe6thÓ Án›^Lë(’ôݲùõÆÌ¢\Ž£Y4„»ÙòËâv wã››ñ|9›D°¸«Åüz¶œ-æô6…ñüÞ!¿Îæ×C@²ŒJáS¥b*œ£˜ìÌSÇÁMKÛ'S!©à$Of5Ë2õˆÚïC…ºƵÖɄƣÖ•qÐ=mÝ–|&»\*·Iþà±0d4õÊ0ôçÝôÿ¯þ5|”2ìv{oÉwÖ-;ÑNµ*¡ÉϨּ6ڸ涹ɤ¦Í$bÍô4TݾWo°˜:ϸÝÜ*û$ñÉ¢L lO‚ß2xQîÀ‚ÖW¸/©ÍTt1¦îV!N¬¢¶µ¡ÿ®ê˜\„Õ¢¾o@§ÁÛ´W$Úêš[g“ÄfŸ›ßɃ¶j ëÐä€f%¸±¦¹yôŠIZKîÓ­V¼+Ùß"àÈÇnD»çÀÝÇçoèÃÙÑ*qH¡t½¯ ù°’¬ÄþœÁ!/Äa›ùuvÏ‹VVÚ““¿ð9Ý?oaað=Ùr[~ÏXÁs¦Ínþý ÏÁspqü­TaoÚ0ýž_qB“ ˆ‘iÛumAE« jèª~ªLr«‰ÙNSVñßwg š¶vÓ"!çÞÝ{wÏþtR,‹ ìvèÂHf±VNH%U n‰€?âSaqøäPY©ÕD»‘.U2|бp´q&¬%8g¸”1…aN{ô 1ýEzá*a@„èÓO¦³ñÙÄ›ñ‰´¨¤[RŒ´Pió J%’Dri‘T´‘{" 4˜ “°äX+#Ó¥])4v) ª7c)Ѩ!c7‰›²¤u¥ËZÊžêº=øF‰XòÇþhSƒZõ×VçÈ£s±¥”wÙ}—‰.Ë‹L {t­n[ƒ8ÞÕIôœÇÂK½ØáÍ?€¥sÅaVUÕžp_›4l$†—ÔÙI4|O¤ÌÊÐZêÖ÷Rêñ|¢ V±˜×LT 4¹´«?™R†AsØ_?Ø’}nè@µDv-OåêâŠ:Y#¡Ö{wÁø¿þy_0Ù‹¬?ÏÙ¼.~ºpFp¦ŒÍV¯'ï×Ð&±7"ö! ú9ú[À/êCµmÀo@^Æ5ë7Bs²(÷n°»²aêèÐÿ/Jû¾ÜßÇÞö†joWüT™e½]ÊÍt|ŽMçø‘ h_„½ å‡èÒ]|xø¢vk¶/ ž=™õ]Ee–x‹Ì±v <7ŒÖ-èm“¯·+ÌØ7ÿ¡º¿,e´]/ÿ…×:X'ŸƒŸ•TQoÓ0~ϯ8õi›JÃ&„eŒ¬KY´‘JM¶±G7¹&Ö;Øî²‚øïœÝ¤ bBðPU>û»û¾ïîòá¬)Ï?:òàæ¼BȤ0Œ . 0%~ÏΙF{>eØ.dÓštÍ3s0Ò‚†eô—ȵi™B˜ËÈ™ƒÉüèˆ ¤@‹– j©vU_m ª]F`…B¬Q=H]úx‘F³ÖÄÇâs®w8"ÐrSÒ®¡•êÖ”Šå9·¥Y\P vD,PaÁTnUf²Ù*^”d+Pé’7T/µR’yOFï÷eIëVn:)Õc¸¥DVòÉä5Ð u·£Ã©C×l BØh|Îè\&ºD¬n*ÎDæÐº} âxß%‘+Û1`N Èõð0cÑöPÓ¼÷ý¶m'ÌžHUø½Dÿšœ“ð‘î17¢B­É­o®ÈãÕXC¬2¶"®km]£Ü‹V‘ã¢[´î‡`ئgÓzŠ$}ø€lc®G£ (ÁyDÉî¢ôrq“Â]°\q… ,–0[ÄQ-b:Í!ˆï-ò*Š/Æ€d•§FYÄ”[G1ÌSÏÁNK×'Ý`Æ×<#y¢Ø°¡¨ÜJ4¨j®mk5‘Ìiz¿UaÚ8ýž_1Š*-¬8RÝGöz½”†ktT„½½~ªLbk;ç8ÍÒjÿûÍ8ñ-œº„ ö¼ñ{3oÌo¯ë¢ö‚ëk®a!J©’† )d¦àÀ¿¤oXÃi+VÑCÊk#”„´dMƒ‚½)— ÏÀ( k–âW¢v¦cšÃBµ2c6 “Åð•kP’Zi¨”îÏÕbÛ\(ûŒÀrÍyÅ¥i¦ ç6ýrµ‰çìá3Ñô8$Ð S`Œh Súv˜Še™ £Y BâBe‰PóœéŒt¦ªÞk‘T'¹n Qãy’’,™¦OìŽE­{ÕRŽTŘÀߘˆ$ÿ:} # ?ìú㋮ؤ2Ð6ü¸­2ÒEbU] &S‹Ô=?IÔ–zÌJµ;fM€Â˜z]×M™%¼ “8™À]¼y·ºÝÀ]¸^‡ËM%°ZÃ|µ|oâÕß.?ò¯xùvK†Gñ‡Z“d*¨¢<;ò“ã@núÔÔ<;‘¢<™·,ç«Ï\Û¡¨¹®DC­md†ö¨„±¦¢yø^Ût˜’?°Ü÷”ŠÆÉ.| ]ŸsvݹÿÇ{õæÃ”ð Ã,ÈÛ½]ÁÉEµVØÜ T𶇩 [m¥<¤[sf‡Ç¨`§U…k jD“…Ÿ«9ðì}r‰0\f'ÛO›ÞWm V =×0ÇNݦû’w—²ýîgîEÍL1R¸LH_³ È—(Ô†Ø[A²Š»!äž„4ôþ¢R·ûc`mÑBf/ÌPéYYªŽg.Çé3:§y6[G!¹ûìÞÝ:ÞD“óéÎ#¢¢ùí&Âñxjþ.\þ¿ïªUáÀQëC·b¯/l¥fÇ7±ƒö{×ÊÔ6çÓ§ÔµqÔW~Ò×srÈü d[–0¶ÈÞô4xPZÀh¨ÿøiãBOŠŠ.(£êÎN‚m;©oýߨ+¼˜Ð–Z£…ìŒÐÅØO‰ ;W_-õÇ+ÿæ»t[Œ¼¿ùQJ¶©?Ëi˜\ºžŸÁèÑ{úéJþiƒ]]¢ÄÎVzhÉ¥b“À‡‘[ûgOD/áßþlvâÿ wzœÑ‡qŸäÑ{ô^ÿîý•UÛnÚ@}÷WŒ¬J\DqÕǤmJ.¨¨T1i”§h±³Š½ë®×14âß;³¶´ J‘°ž3sæÌ™åÃY¾Ê½ ß÷ c™"DZY!•T ØþŠÎEühªíX—*¾ZG˜[©D©( B2ø›ŒPƒÕ8ÊED¡^ÚJÖ…ãÐO4 2ZÈ´©«¹(-¤uF‰AÌPÙb"ºôÓÙ|rqKâÅøX5ŽTÒ®(FPióKJ%âXri‘‚Tt9" 4˜s·‘Î7F&+ ºRhŠ•Ì©Þœ[ Ç-™¢NÜ–¥^7ºlZ9èºc?(·ü~øºÀ ¿yê÷N:PÚBYà>; S™è±,O¥P‘C7ÝíjÇ»&‰^ðä@¸V@/Ã@XFó`em~UU …#<Ô& Úƒo¤ì4¼zK¤[ÌJ±(H­Ÿ¥4¤ñb"'V‘X×TT—¥Šœ2÷÷QÛm·f;h8|U¦é`_ >€žKP‹Æ/ý]KÎéî\.¡Û¤êí÷°?¡~êïl½}†Ã‹eZŽ/VzžÀ‡n{ÒûwEÒ˜þ?NNžéãó\žv¬·Îé''Û¶C—h™ÖN^ðµ@.Öõ¡W—Úz[ïì“÷­VaoÛ6ýî_qÄ–eƒCµ´)®‘%ÔÚ\ÃC±8–´5Ë@*È‘0“^®‹‘IjA×J˜2•î·$)ÑyG¦lwÛ¢Ö®Z){ªÛd á#"ÉŒ~‡>. ×ÎzƒS‡ÎÙ”¶P•b„Ë2ÒEby‘I¦¸C·ê¶{ ÇÏm½¢ÚsR@¯÷—³„¦?€ÔÚbìûu]˜#<Ò&ñ;‰þ{Ìì, CÒæRe¢,1[ÿVÒ`ŽW`²âl…\3VS]¡œEm0ã*ºìL°_¦]Ò:Š(}¦¹yAÓȃ·A4†p5]¾›_.á*X,‚ÙrF0_Àd>;›.§ó~C0ûLȦ³³!Ln%n C"©¤ŒŠxÏOrK[§²\®%Gy*©X" Ñ_…qÍQl»¡D’1Ú#—Ö™ŠúáGm£¶KÞ`º¯)µ•øÚ:Ä÷º>Ê÷ÝxçþÇ×ê!óaH¿kô_4µ$ì¨S¡òCGíôBa4Ö},)ç„cÕžúÏfÕºíy¼Äàt“<›MããÇÙ¿(yñ/” ÕtÊórdDŽ—ÚS¸ôp7|ÿþÍ`ðÒöw—ï£MwÛÛ¾vÝ~ÁŒÅw«äÚ5y{ü¬Ïïð ß ¼ƒ;â1†ÿÃŽÇwŽ o'´уAä¶wÛ{ýWï•T]oÚ@|÷¯X¡>Díª¤jJP¬F&¤Qž¢Ã^Ì)øÎ½;Ç¡ÿ½»‡M¨ªV‰%„?næfvgïËYµ®‚h0`S¹AÈ´rB*© pkü• ‹ÓZeNj%6ÒmíÒºª´q˜Ož3¬ø damHÐ#Ð ­ ”Úìµ¹¬½ØìA±Dål"zúd¶ˆ/&°"ŒÏ¥ÝãH@#ÝšÖH 6°"*‘çro¤¢¥Â@ƒ…09{Ïtµ5²X;ÐBcײ¢ýl%vb잸ۖ¼nuÝZ9rÝc?ˆˆ-?Á -`P¯ýÚëŸzt)¶ ´ƒÚâ+; /3É%aeµ‘Beݺ;ìAï[½ä>‚ðV@¯Ž—pŒæÀÚ¹jEMÓ„Â µ)¢ÎbtM•MÒÉGÝanÕ­¥jý¬¥¡/· *R•‰%i݈†;èå@*CWÅѶ Áq›^‹ÖI$ëÇ ¨lÂ÷¨7N!N{p>Nãtwñâjv»€»ñ|>Nñ$…Ù.fÉe¼ˆg =MaœÜ3ò{œ\©d´>W†MRÉÅü(ONKÛ'[a&W2#{ª¨EPè'4~P*4¥´ÜZK"sŠG)•eè_Þº)ùFå~d*1ÿâ©MH J}*Šüû.ýoïÕÿÂG”QÐMýâ]S.9ó†fš5rº8hi sÝ\ÝÀª%FXŸäÏú{-G?OÞ¡ Ÿªü€8|^ 9x·| à‚úâL9ê(lÞ¾IØRtLäÆˆ8¥ƒ%нqI»{RÁþ1(,‰gD{Ûf®y0ydäÿÕ}xÈ:'‡‡¾_½·ÎíJgæhô¬÷ÒwÜXn–í<‡0÷L#xi9waú§žq삳¯Áo•TÑnÚ@|ç+V¨R¢¸êcR5%T«•‘bÒ(OÑq^Ì)ö{>Ç¡ÿÞÝÃ&ŽªD !›¹™ÝÙûrQlŠ^0ö`s•!H£PZéÜÿÈKQb¨•›Š,[ ù05z­ÒÊb2{’X8e4ÈL”%q0ÍO%Q—˜€3žbRI?±Y»ZX„¹©t"<ìtÏ@hÁhd´±»×aÕªrô"Û3‚H-bŽÚ•c€ÑÓG‹e8ÁšÄ3>QåGjå6T£J¨}€5Q‰$Q|´È@iz‘{! ´˜ ›°oiŠ­U鯩5Úr£ :oÉVây+¦Ü·Ç’×­©+×M3Fð‹ˆØòçñ'8¥õ›ûƒsÎÅ´qP•øÂè»LrIX^dJhéѻäñ®!1+ž!o̺[Â1š¿犳 ¨ëz,¼à±±iÐZ ~Rg£xö‘D·˜aYR·~WŠ"«-ˆ‚TI±"­™¨y‚~P>¤¢¶ÔqŽ]¶!èŽé¥i­D²Þ- ¶ ?£þ$†0îÃå$ã܆Ëï‹›%ÜN®¯'Ñ2œÅ°¸†é"º —á"¢§9L¢;Fþ£« µŒŽÂ§Â² Rª¸£˜tòÔjà´4s* ”j­$ÙÓi%R„Ô<¢õKR ÍUÉ£-IdBñÈ•ó¡â}ø×Û¸Ù’oÔî¦âõò/›„ Ô§¨ƒÀ¿oÓü¬Þ Qí¹Üгni Þ öIuvËÓ¥¥W) ‡ÉdÃàï-rô„Nha©{hG„ç@ó üŒEfQ$[Îiì'BšIPý Õÿv1èyâcã“CÊôž{´4àÛÇŸ!šrZIGn@c}ä ãßÒ+ràÈS¦>¼}£ÀÐý¤è;Áî"jzSøßu¥¥÷s/[§]öÑ;L0ð{Çü!„;;{EÖçkñä¹Ã¹;鎶3F_½4#ß°;÷apîÏßõv½‹¯½¿•TakÛ0ýî_q„A›’ÅcÛ±.Mf6¨Ó•~*Š|v´:’'ÉuÒÒÿ¾;ÅNÓ Fg0Æ’îÝ{ïîôé¼ZUQ|rÁ LU‰ öBi¥ ð+|”Âa¢•Oôƒ(U6e¹ò~\ ç&‰•WFƒä_Ba ïJ¢v˜7dT IŸÔä¾ajj‰v»LÉ|FSÍn9ò[2»’e” 7•eÄT±£˜ôSÇ»¥­“«Pª\I’§‹Z…y@ƤB»VŽKëˆdFí±V>4ÏÃßÚ†í”|!»ïŠ,,<´Ç‚º¾@Ça½ëþ·×ê_ÍGqÔÍüËû•ðl»_YjzP9‰¡â…™ßM7ïVô¥z²½Ú=2+ –bË[þDéy†sUÔ6Øñ¿Âãhýæ;7u¶ØoDOu:ÉüœÀ˜Šãm-=• 46oÏÑ6¼“‡ûøÃ'‰V¬˜:äõÙý‹¾¶ŒÊÚµ8|óZËëîNv<ÿ~8ºÆ%¤kñôôULowöèéuðód†î/¾ipCc6àAØ/ñD„K6=j­–’}RäÒ#Ú#j6‡=èŸFÏÑstþ9ú •TaOÛ0ýÞ_qª€ªk¦}„i¬”V‹†Ú‰”!>!×q‹ÄÎl‡´Cü÷Ý9I ‚M¬RÅñ{~ïî?Ÿ•Y9F£Œ`!s\+Ǥ’*— ¿ù9³"T,—ñf„r³œY;ßrQ:©pzE¤ ºaž_—1GUw™Á̃LÐ öÎ|3ÜôµÄ'¶ƒYà•uºh¾ü¯£`оãZ['T¼ßºÿ0x`xÁÛ ßfXog*î¨ ï¡¦öö]ÀAó6kn2ÏÚ‘£3à  @bÇ0>‚c.{¼Ùùš2ðϤRÜ«¸»ãð£7‰Ç/HàØÃ÷ô+ýΓ“<Ãfïácút±Æ[‹î±ÅáSü÷KRá`H‰Á‚P\ý†diz>„ãS¯âið48û2ø•Tao›0ýί8E“ÚDY˜ö±ÖÑ6ÑÐ*2•tU?U޹€U°™mJ²ªÿ}gi¶Ië†ÌÝ»÷îÞñá¬.ê œL˜ÀB”\IË„2[ à~Î ~ÕªFmw‰² ÕÈl¾åX[¡$ð’CÙàJp”3°Ê'G5ãtKÕÆ¶L#øTæÓŽ£t1zD J¢ËV*¥;Z¬Ke‡,׈Jkf)¢‡O–«øb¢íò3aº<"Ð [PŒ0Ð*ý‚bY&\iV‚tPy".QcÎtæsUï´È ª•¨M!jª·rRÒÅ@ÆtÀCYÒºSM/å@uߌ)|# 'ùýìS€KõoGãSŸ]±He¡1ø‚è»Lt‰XU—‚Iî³{uûÄñ®Qk7=`^ ¨Ía0ë²Ý °¶> ömgÌž)‡ƒÄðŠ:›¤ó·Dzȹ‘%CÝúÞM=^ï€ÕÄŠ³5q-Yë&èå @,ZM—ùÔe›Á‡cziÚ@‘¤PÛ˜ŸÑ(J!NGp¥q:…Ûxõyy³‚Ûèú:JVñ<…å5\,“Ëx/zZ@”ܹÌ/qr9¤–Q)ÜÖÚ‰ ¦Âu³? œ[ú9™¹ØNòdÞ°!W¨ýzÐBT¸Ñ"™‘=*a½©Ü>ü©mÖoÉ'j÷ƒƒr‹å{‡„!#×ç(ÃПîÿ÷YýÍ|«þêZ çrM[m‰!yJÒ ÜÒxh¡îsE3Ω±42š»}AޥŦ¥Æ¬5Ó»ÿÕþÛò:WÜ¡l¸<dtð’Ý5!R’¼Õp"Ej°}»÷ÂÚéd•›¨I™f8û’?|ˆÿxø?ý.þúû¦‘Ü—»¿çÅã`ì#:)î¢ÔÕ““_BG‰ÓðbßÕGEþy7ýÏïÕ¿†RFÝšÓJsõn­?ï¥[òœÚ¨7¨8ÒTÚÿSMT-”³q¨‘MÛW´À2 ³»ÌXÂñ$àC Ô‚|KSj!ÙsNNÆþ¯OQàÏ çhÂ;‡*Û‡î_¿Z ðæðEÃΤ žŸñ`ÎS)oñrB)ßüòŠÌ6ud$(¬Oê§ä·ƒ}(þB‰»¢]Vò݈x iÊ}ˆ?ýöDé2 ¤r|ÿ¢ÔYò?èF8.ŠB×äJo4òƽÑÈëí?tb½U©Wp{›vš{ µA[¬ï›>òE|èïb4z€—Ç4^þöî_2—†{,_½6ïù9X,Ö-à ¹ÿ!Œ ôm ¡ÿ6¤gþù}p\¼ þ•T]kÛ@|ׯXL!¶q­ÒǤ4u›Š"§!Oá,­å#ÒzwŠâ†ü÷î­¤D¡Ð´cû´3;³÷é´ÚWA80…•,R­œJªÜ¥gÂb‚ÎÑQ¬ÝJ×*[>¤X9©¤…°vNhOð]¦¨,fà4ƒ•Hé+Ñ;׃ÀXÁ¸ñ"YM€þ¢­Ð£µR›V‘ÛÚÑAÑ2‚È b‰ÊÙ9@‚Èôñz/aG²=>“¶Å‘€Fº=ÅH 6w°#*‘eÒ§HE% ñ@ƒ¹0™wœêê`d¾w …ÆîeEù6ÞJ²êÅØ–¸OK^ºî¬ \wŘÁ"ò–?Î?À˜‚É 'y ž‚ÓÏÁo•UaoÛ6ýî_q0 Ø °‹³Q±+µ—Òzˆ\£=JbSy~—[?%ÂîOB%SºI…®ÏÙ$I\ï»ÿ¿×êgÍʤŸóggšû¡ÖÒâ#@Í– CêA6IaU;ô#áÁ¬nt^»v¨íÞÙÝõ_㬜%» ‚àíVÁ°n1²þ_g’ATð󓉛õ~ÓþÃàËíOѹÎé  ®Î‚È2Üô«˜ÜØnïQëTIҫȃ^øVÅB•O #Ý7±àmÉryW¾§;¹ZwdЧ'KýˆÁ@À¶ ª+ÍV…­+È âÚi\Ex²§|û0œaè¢4ë?`¹8ú5PEaáD5cÛ·Áæƒ{ê$Þ7µÉ¢ûû¬wxüO“.‰ÉiðK2uQÐYäië%׋ô’rPàiÜ{pör¿EohŒ£ç^9§vã1¡îmï£ ìê„“'¶vèLþöD‡¨t0û&:­ ýùÙàO¥¥Ï±{x¨ÎèK»ÿiÔJNýFº!¸]ôƒ…Ã$7òÔ÷ @GvŠÑÒ—¶‹#­t[Ú#-´Ú| ¥y.¹´(A*š¨<4X“3ÏL×{#‹­Ý*4v+kª·b*é,€±]âP–¸îuÓS9aÝ‹1…O”ˆ)ÿý cÚÀAÃ~u8yã£+±¥4ٽ̗€Uu)…Ê|tÏîPƒ0~î“è5÷ „§zsº „ãhþØ:W_ÅqÛ¶‘ð€#mŠ8PŒ?²‹ôöb>ª­%µþm¤!×{5¡ÊÄš°–¢åúFyŠÖ⪘r´ &8mÓQ´‘¨Ÿn Ù„ïÑ0Iažá]’ÎÓ)ÜÏW-?®à>¹»K«ùm Ë;¸Y.ÞÏWó傾f,>säßóÅû) IF¥ð±6L‚JVó? ì–¾O¶ÆLndFôTш¡Ð;4þPÔh*i¹µ–@ædJ:o*Ë¡?p §äO’û §âãä'v½CâXë Tqìçƒûÿ{¯~f>J‡þòa–lmCÖ‡v‹ w=~·¯‘Ûñîà©BîÐwf'Œô h¶°°¬2fÔ¾ÿË8øëätøèPå‡ÕÃÂàÛ€ü ž?—pC-p¦É5¶¯$¤_fr¡D…QŸ$ä"ìFTÀ–¤žÃ…EÇž^p _ >¸×¤_cõÈèVWHg™¿… éΞÖh^'sFg+ùHþ§‚ê\ª¹­p¾šîXPr pÝ¡[{4ÒçùBs¼„š.On{Q–ºåœÜ{vwWÜÐ1ÀWS W÷¨÷Îæè’—àŽ{ᦠLÑð5? 5bÿÞ4*ód²ÐÛñ³^L{¡¦ç¯A5e9=w £>x_¢3?®ÛQÐC &o[äÆtÁ=cÄ~ÜE0xÿ5òïÑFzý!á]:º1R5þ9$:V…c¯¯IÂZʯ/:"­lA»‡GsŒ¾uûŸFOøKËftfï[«é|ZY(=—„BOô¤tž¥¢l2†gÔÏ4~•ã‹ $½<8:•¯h6:OÁ(½Ä”ŒF®¸ºzÞNß ó4x¼ýcð•TÑnÛF|×Wl„>؆*}Œ‹ºŠm5B°”éKp>®È«É;öîhš)òï=’Žƒ@E+À&ÈÛÙ›ÙÝŸ.š²™egg3:£µ©˜´³QklA±dâOú |WªÈ쯟47Ñ8KºR!%ÀwF³ œSt ´j”Æcç±SžiíZ›«;YíÖ§„Wöä, Úyªnöæ¾øP Iž¹fÃ’hÇœÒooö›Ëk:€®àst&–ˆ1:çè€T*Ï\­*2êDD€ž åsQª]Ó{S”‘\gÙ‡Ò4¸o/Rvë‰LO×BkïÚQÊ Õc1ô;‰ä—?Ð 4Oç§ç ]«ž¬‹Ôþ’8UtA¬n*£¬NèQÝóàøaLâî¥k¤’r‡—a¤¢ å¨Œ±ye]×-U"¼t¾È&‰Ù;Tv»»þ¤'Ì{[q¨Ö_­ñ¨ñ}Oª+­îÁµRt05*,:ŠÛb!è0™àe›¾m¢é/P6•z4_íh³›Ó›Õn³[ÐÝfÿöæýžîV··«í~s½£›[º¼Ù^mö››-ÞÖ´Ú~äo›íÕ‚%ÃUüÔx¦F*Êù ?MÄ-cŸBÃÚŒ†<[´ª`*ìŸÆ¢a_› ­ ™Ãµ‰ÉT2ßj[ŽSò Êý ©d Ò‡ÇÑ!Y¦àú‚m–¥ï“ûÿ{¯þÍ|H™M#~tœ¸ÛÃýÔ•lå «ž„bG½qm¨zô×Ùb’µ9 Î-a ÜM&J¼˜ºq¨’x®ðÜ(›Ø~HYx¥ùÐVU¿¤Uê4?)tfêRh×VpÄDЕqAÿH#Í•«…¨ªjØ,¥š$H¶ƒòrm Çq’þ,énR'ÓçY³yÄ|Ø£…YPî$ŸèÁ¥è{I¬UÔ%´.†Îïþd‡ÑåȨ—¸ÄÔ5çFÉ{2Xt Bdû¼¢óÓÉ"Jk±iãÍ#Bÿk²YÚÈÇ;ÌO‘mþð|0û{†µ@É ò;£KT*úV£ÂŠ,wGs.GÄW¯j’1F‹¿ë¤m$¨Ñœ_ e¬ˆ»ô?7¹˜h€8’ÜN̆ц%’׎Ç÷)¾Ò‡oÒ?WÞEtóçϱõ–™¾eéyh­N…ýøQO;D/FAééÃí§ 5[~à¿~ý|¾/•}iÚ Ì¿rü’Þº†“w+ó€­_ѯX¼²mò®¦Uí‚®0«úaA×­±³å Ï>Ï.~žý½U]oÛF|®~ÅB0àÈbêG»n¢Ø2BÔ Qià…p:ž¨kÈ;æîhE)òß;{$mý@žú`È<îÎÎìÎ-x]oëArv6 3J,›\ÑF—ŠÂV’ÂÐZQãUNëHЧFËäUhj²D)R¿Ð­jk” ~ ƺ×RN 6Mj!ñ“ÙMØ §èÎ6&A[C'“ìî”𨄳Qª²ˆ’Ö§×MÀAÙ"’(œRU¬E”)ágóez3Ì9?×¾Í[ÄhO;ë>¶2ò\siQ’68¨"Ntª.צ@ézït± dwF9¿Õ5ê-YJvדñ-p_Z÷¶é¤¨îš1¢ŸÄ’/Ưèœ4ìÞO¯bv%ödlি “ú,U@ĪºÔÂȘݩ{®Žˆ]x¥ôúï»8›ÿˆ¶!Ô—I²ÛíÆ"[W$½ÄäeÓsîsÞ›RynÁ=^ïIÔ`%Å\K±ã ÆAE€ÅΡã¦q¶ïMp8¦—¦õ!ý0mqFÃIFi6¤·“,ÍFô!]¾›¿_Ò‡Éb1™-ÓiFóÝÌg·é2ÏðtG“Ù#gþ”ÎnG¤Ð2”RŸkÇ"ÀTsGU~à§ž»¥›“¯•Ô-!Ï(öI9Ãf©•«´çÑzÌaJ‡h*Ï©ÓÖß’7½©¿}ÿå©ùÔ='‰À½)pQD‘$ñ;ÉÛÆµÖy ¬ã­ðí’;R;ý$%ƒ£\;ºÆ œ•:¡Õê.½Ÿ®Vtzß=<ÐÍÒæ¸MÓ›å|ñ¸Ê¦“ÅÿŽ(¢ c 7tBÏy¿Jlpp@§tNßÿF×××tì<¦ÓÁX”ŽÖ y¹ünµù—:Â9±_yîÛêˆ^èüà À`o_@ÇtœpÔLøpŒµx|…’2#Zc‚¸â_ªdc~ƒˆ‹N„úò¿Š@¹VÈ_EÔJ¸Ž}G%×bUà"˜'í¬á•Š;gŽ `áèrÏ{þ¼ÁÞ{(ðPrÃ>¶ýÚ—ÏkŸr+FhW:>£_BÆêËØØ4²ˆ¯ƒçî_»Ò#òjÅÎ-­È©Rr+ŒöU¼‰ïÐÚÝVËmü4YŽø>娀‡ÖÖ`{£|x¾fµp¢"Þ%¸¬G²ÞÏ`çvŸ³±ûõ_µß>¿µM™3<3Ávˆ÷aÓ%¾<9DäQ‡)ð./ÿ9„¥¿þqð'íZmoÛ8þî_1kk§ðÚÝM›l“\ë&En±¸ Z¢m"2¥%¿´È¿¾H²%ù¥I?nu(òáÌð™á ©_ßDÓ¨Ñ{ñ¢/àZ¼P&LH!'L9ð/ÞoLñkÎ’4æ ¼€)ÕÅÞ4à½ð¸T܇$Ô/"æáƒpœ,XÌá:L¥ÏJh_ ®ÿä1„’Óè0†Y›c1Jl "°IÌùŒËDuœkø›Û»þÛ+£˜4ÞÊŒC"™b¡`Æ0F(æû‚¦f‰ 3- Œù„Å>iè…Ñ*“iáBòXME„óÝ‘*ƒk'Œ2ÀnZÔu¦V•‚ÖÖøHåWÝ—ÐÆ4¨iß6Oõè[ HÏÑ/=%(. 6‹Á¤§G[í²9PÆ?-H8¢Õ¦Up\ì,¡Ñô`š$ÑI¯·X,ºL Ü ãIÏ©Ø{–½\ý„B»1ŸdÀ•Bký•ŠmÆ>Í{Ù<­Q«Y äàÁjö{mEš¢›ïU‡3e Yƒ+‡ÿÚ'1^ÕÀa÷>õîÛnUD,™ÖMx²tµä^š×í#%†SäW²CÈ·¦W¥Œa-Ìn '_D„Þ˜ E‘›õÂ]¹.³8mh} Ĩ5¸‘g+õW?w_v_œmu ¥‡çÓÐ,o ×{Žö:s¯¡7ËMi_ŽA;¥~0ÒÚ=T%´R!Ó»h® ýûÚâBšˆ@$«®ƒÈ ú …TÜ¿Áñq1.Ê×sòزp0N¥Gñ¬ {>g1P˜–×ÖÓ?¢XÌYÂñFBŽDÎ@¦ApÚx‚™¿•ú!:‡¸£0Ú01ä©„Ï×-TϤC¨j—<¡OâÆ!ÆYHÅ-µ°wÕFqfœ8æHv £0 k§#ÜÄܼNrXźçW+1€År‡|‰ƒB&AÐeOuÏÇ’Ûmå; žmGûÊnÅÙ[ü(TbIìwRÀmÌûʯå¢sE jo5v4Cw”1ž®Zi¯«Öí¡†Dý6(Œ·ïmµZ~ÔX*e¶$Ú¼3ˆ[‰9œL—̼ŲÓívA$˜û“T…”ºQÀÄ?^ªâÞHÈžE. }ÒjÂÛ“{Ûó~ cÐ/¯î-X—/yÍ#Êö%ØbËÅ@n´KK±¾ ù³îùÀÂJV :Íú=n®{õ$g¶uŒfÉÅí˸¨H{kJ¾‘ñ›;Úw¡|žƒÆùÊ”óI¤¯ÙÀŸƒõúyhïО•÷UöÜŸøYRqóݨ½©_È]¶rßYè@òÛš“—,ÿ'Î!óË„ïáÈeÔØ)Û©…Òë<ÂŒŠ+:A` ›0ò,=ÔÚÓÌžÃlÊaë^uâ\ñkþª.(¨ÈÉvÂbé`þ,22‰SNZ¯‹êí²Ïô•õÌ!ÂäÅT…DúÌC`U]X–@ÀZXÏV ^‹ÙÌz e˜5ï-îB_Ù&ù¤œW&Ó…JGÌü0ë½Ó÷²)†ÆPÅY3ûWyáöðãÎÔC:Ĭ¯ Ñ4²mësí:Ð|}ÖÄáßâ ™1imçLäÿºFUñ}mq)ˆPĉÐU—Éì´™ª>¦º[E~ÆŸ YÖœ•®Â4†^f"Õyùú7lÆŸ@Ã\Û5ÄáêrëQ»v_4 ƒ‰˜s öÀAã8]á-î)s&¾ÖOn×ò˜¤ cL×ÙîÖ„›–Ò ¥*&…ƒÌ,.îÞ—s‡t£. ªŒ˜2Wž6Èà~E•—¹‹4@Gt/L!½ ׸[fwré鯛2žû޾OîuA—Pn½Çv§5èc ¹t)f$¡êø"èJ3U^±¢EЋIª©²â¸Á ýކW7üÛ¼ùC1O{”Rý……Â"”­Ä\Ï›«Ò~p¼#³Z|{0«®dsóTF:Çl5|à«ü´S«Ö1Šn {h"šBïçbÖ^·Lu1@þ`æmÇ—ì} ? cê-ò€ù]CåÔ.®{{Sñ­Ç$vÉDˆ—ûQÚгŸ Y«Óã°´éÔÒÆ-:jT¼pA§êäšöÛAå›K†é¬|eâlÕ›A*Kp™s˕ޗC=G¾ˆ)ôñe`Q„8!îU,eñÁŒ…3mR33múQ1kýÌôôz:å>ÿɤVôå„¢<ÚLR8̘ÁŠb›‡Â߃r¨ƒб`ú+ L¡1>­½iSa"W& Ú†ç‰ØKg”ôxü¢˜Ïé! }®ô7*ú3š1ZŒ×ù¥W%ó<®7áP#ͧ „á<ÿ˜5Qg–­q0PzÜ¡Åôç3„h¾òáX›£ž –]b–M˜¢ÐüJ«øØûš­Çf)©/>õ+K U¨Õ´¢ç±òM¹µÜr™ÖxQ…µ'‰Ö™R´y*R¶…4;˜Q…¶›,Y6w¾Î”în’T“ÃÊš .3¡¼²#Œ6§±Ðeßß/žþ ÿ¢áyU8¼¿/Pnlž/&–¡ÿŒÿãq/®l %ˆo‘¥ZÕ|oc^•ËTÅÍÅ•G_wúÅo˜»àzmFy Â6³JîSŸ¬YL$ÆÆ}Ч˜d(ÕÜæÊlvr7ëu°Ì/~?`ðSd,M®N3¶HaV&yMŠÄ "ã³Lˆ…Hr9dl,¿¾¹»º¸dÓ(¦õa$Õ:@`ås˜I¶J³G6P< #ÜšÇ,JàÁ‚Á…™˜ñ,Œ’l½\gÑlž³t•ˆLΣ%ìw‡¤Œßd¤l¶Z×i¡Iq¨ÖÌðØ_’üoÃ#Ö‡ ¸h_îŽiõ‚¯Y’欢„ÎÄS –9  ˆ-–qÄ“€Vkêì€ãOH:É9ÌçD K§î4Æs\ÿ36ÏóåÈ÷W«ÕÂÃ4›ù†Dÿàìõøò6kþ’ÄBJàÖQ<ž¬_VŸ®1_¡IP¤€Å*Ž'3WK£®˜J¦tw°“ŒöÏÇìj¼ÏÞž¯Æûxu÷ýÍ_îØÇóÛÛó뻫Ë1»¹e7×ï®î®n®á×{v~ý®üóÕõ; `l%ž–˜FÈQ:údp@mÑr’KDÓ(ò’YÁg‚ÍÒ/"KPY–"[DE+ÉÔcå¤T—6hj+93J½»6éü¢û>»™¡ð™ïÓj’L‹L©ÎzD:Þr‰ü=m¿ìC–~‰BÐnΤˆE@f $‘¦ÄŠ¥€?’œ-D>OC‰R^ªUlZ$²®(_#8d")1²†¾ÈµÌÅ‚ÍáA ü3ì¸CuOÄsæéJ2øa+cذ÷­ ñ‹Ð›pé› Å)}#O_|ä s "Žõb _ ÃyÀúQÄ™»,&!¨rž&róy΀F VÂ3šâ÷üòž`0ñK€ìߣQ»>ÛÇMö=ƳŒ¯û¬wvO0ÎzlÀÇšè š(²8塯 G“Ï.)ñ±L‹Ø ~( G$44˜iWZx}ë!£ %Èv;ÌD^d‰ͪ´Ôà¾ð,"³^Í£`ŽV¹äR*£ÏÄTd\Ñ3ÝÎåq𼿊/>L¶äí{fÜòLf?üæÁ2á›3}3ǯŒ—Ä´³|%eŽÄûðøZd±Ögè»”¯ål¶OÔ|«@«G~ÆVªûNi¯o¹ÍD7Z÷‚£:ƒlȖ雋ÜÞ¯{È2qühs‹¤R1`Å6CK#ÑV- L0Hct ÉjH„2K ·èf‚ü-qoÅãÇ’?Ra½T„ú „®É |œOõÅ(ŒV˜‹§—óro㥠,œ|ý1‘“Üž° 8ôârÎ)”‰|%„²ƒ0š’~çl#MJc÷4O!V'ÑŒ‚²ÉTÙŽ4ð´½M 4ý‰Lcˆt%¡8|  þ]”yÖ‡%|!h \ÃÎúW'«a}YÑô8úÂÅÔK¬õÝÇx¥´¾8Ö€|øþCl ZŒÀM®` 'ƒýs‘Õ5âŒF\ý{ u¡ef„W›Á쬤¹c¼N·VÆ…¨JõŸþÖ "U,­p*ê~¡%Û߆¿W‘ÅËs84 •í‘ýù,š%˜ÜFS¶‚ÈÏÁ¼x)t;†û%œO=\ï3{ÍŽžþptt¤WãG ïØ>{Þs÷.– þ*–JìC×á)„}ʱ?}WɆìÝÕíåÅÝÍíOãËç·çðžZÚ[€ìçß~Û6„Jɾ=q ÅG½Ïj²FÞqZÁ¼¤¨ïNÔÒµã5¥‹n²Ñ汌£"˜Ì¹‚ èÊàÿ2ÍÒ…ãœ\Ësì6'}‚sqt5˜¿¨l• FªÄ˜ž²ñÚ€²y&Ñèèæ¥ú DFi¾â¡7`%u[VÎÉêû*B—¯øZB ˆÈj„T&¨…”Y(` @Þ*-âjR^hï„ø5Ãã-ËÂx;d½‰¢ÚÙØÎ1Hø£Ç­Ë!ûZÀ¥g³;@"¥r¼µ–E^™P–q1YPá_å’Õ€€ÈZÝsƒ„Õ±!»ÊÁË®jÜÀƒÑ‘âStu 7ÊvXå¥!´'KÊ(¥sLšA¾;ªIäMŸÚïqtºÅϽR¤2¿á©;g¿Ð˜Ðê­«³üKó ´_Ϥ{ð¬*üÄÖP·ð–X]ƒk,K¥Ã³"æ¶B´U'•ئ4K¿ 3´k¿&]¤ô<¡ê"T¢i?ˆ,fö‚ž‹‚,å MƒÒ/7×Q±ågGÄÕ|·ž¶+–öãì«;§-“«î¨6ÙòÚøzý»6m=©%¢5 ¯S—Ï3¬E½Nsê"]R¾Ž¬QÎÊ WŽO–è± 8óqý=昩 iÀo0ùá†Í?ØŠ·íô™õÝq'ða)Ó˜‹™à¡*ˆõÎÊ}+´¦2Å$ÆXaýz%û¬¤'*Ë«G¡“ZqÒˆ5Î+#½nxäz¢CùË«H>\D°àéH]ˆÍ,«b®RÕ³<îQ!¥?Ïe®aR™’' áéYÃã0íE8·hGkg®1Ý^ž¿«a¿Bé~¢)¡ Â2…‡§¨/—Ø«“6… Ct"ªòI½ø„õ†=ö÷¿WÀ“AeI~0DIády5<‰©6ùÞRå°S©07±~UO§»t÷6Å6%”ì䔺PM?ê[Õ¨Ø=ÿnÇ’íC·@UΟ+篕C·(ÀPÂåäŽö9›ÐÀS$XÕÅ*/q]&0Ú™ð ˜] qwÌ+ …6xˆ‹¨;¯<]Ö½–Œº6lÊ’¥›øA‡ññ-{@oõ ¥ãø”ú“‹Ö"‹Ô¤RaÕi>Ðþ~TAŠx:u:Ç-JéÕ½¦W÷’ߨtøÕ=ÓÃBd3DÌ x% -0ž›æÉs¨õûÛÕ¨io»Ðž÷º‰XŠíðv ©Ï”qnŠ1ì8)VÚü_‡8ìÈ5Í9}æäYÝãhøWÀ{,g©v£Ø[‹n˜ƒAµ?&Qnû'T%µ[¦N¶û±šCÄóXpàš}†²(Ó„ò» ÓCNrh #Io±þØEøQ²¿ÙíÖ7¼—8Õ–íº·,O¥]yñ3:Û‡›ºÙ|Ò*ÀZöñõ”Ýò#F ¹Ipu4¾RpÿrkÜTuA¨LíQ'NK=róÕ—j§Ð©ç« ©º.¶.ÑÉx Ê@ã®R¨þ&7½5Îlñâ;·Êò6w^þ*¿É4Ëèàb¤¨ëjŸauoÚg/h—}´‡èº¥bÛ&ø‡µK}®güª 0ÛËÙÜÛ±f[R[ú`»5ÀÊ~ÉÆ>ØK`àßruÄ¢ÚµãgÃPÕù¡3» /@3×F>ÿŠÍ p¨AÈ9êÕ,–ùZןÚH÷ŒrV Vë#-B‹$ ’(vã&i¡bER,&x©dj´ëH%cîQ_ºW)®²HÀ'‡”›`¯Z'-º¨P(ë5CöVÜÜÛ0 ò'§1â µÿKÊSWDf” G•éëiPŸø }Ô³¯ ÝýÚ&‘F°Ä vñÿŸ6~j'Ï¿mãçµk'`W`qm[ $i»uc¸m™:Ï™9À^Ä+U=Šõ‰AšÚÝÛm®2çúä®~ˆ3Ëœ91 íè¸{–ÚàsuVõ|-Aêó5{F¨=I¢¼-E´>›óVÙd¶Oê]%§3_n¿¥²Ý¥t5}g+àb¯µÁŽ7+J!©¯¯t.¶pü¤vxÜ>»ä|íT±Š€6Šäë©|à9Йª¬__­©çTƒÏ¶äª1ÉfYõ4ëV,@¼»œSR¦²ëI¥»0Ó[穞Zb „/^”4°0“sÊ^Àý¼™œ5À½ñ'§\²êq³hØ—šséž}-Sa?*ePÆAÜ+KÕ£"3(2¼BÉBF T‡ mN%M»¸?Å ×J–Ô=•ã§OÐñÆ !óêŠFØi¿¤ÜÖ¼¶ÛìÒ¼þßìO;ˆíÚŸvll OwéRf)J"úMVRBuØÀü®ºI5¨ë¤C<Á»¥˜+õ]à/ˆq'ÎhT)1Z1È‚1¢áû~ƒèŠr\e‚w¢Bß^Ť\ï¤ÜdÉT~„ZkæìY·… óîK[ÜI4ë7ÉÆUÒ\õÝ H†|¨šüž¹ží5§¹ ³}.*Á!s€W AæÓPðæAÔƒ"†,DêKð=¢Ã•^™3%¿Œâ½ìaÃŒ ”&Ø}ÀÑzO–¨#$šSv?ð¥‹uùÖΣ|ã²ì*¨“d§ë‰ÜJ)ì:LÙ^ ¦6ŽÚУ]÷‡6'©!á\Ð¥V¾ÏSªçvwP±a¥ dS¦<ņ¿ƒ¹mê"mi®àvC^žÕ™ŒBé§›“ #×[-Ѫ¾Wô)ú[r„1O¢ÏW$ ÷µ¿ Í2z÷Èꂈ4¾¬_ÑdKØßzq; ”·îyf1èÝßû=¯£¬j{êÞ$ìKˆøóë 6@Чe VÔo[`ÙvÜ mË2šUkÒjT<Ö§„JWæ.NÕÿkÁixc;jk«Ï>Ȅċ@à {.æì‹›KPrMó~‰|…U­3ëÜ1žÞ}â,ï<Ø•—¡S¨å>¯*g)MŒÜ"qñðœõ­‰D)´¯ÚC)µÃ­-Òc€p)ðš'ŹV¥÷µë-w\° ”Ë OÙ±6Ì3á;Á­–ƒ¯¿s©¶±,£bš³a­€0{)¹1•·tI½¤¤˜H²kõÄÃû¢‡ð$I«U©xnðfxÂþ–FíkÛŒÓ3¨å]78nËÛMô^¥2f:WV #õNŸØ< —ª+_öÒÆ‹:Í¿&cλ2æ²G.èj!'-Å‚'Î ®z£|‰Ò4`ðmkuOï<à ìPz8ÓT؈«)Ñï}¦å}s¹Ð¾’y3.ÏdEK:uÏŠ$qÞˆjÞ§Ø=6¦å9¶–Ö$MãJ\ÔQ‡G˨Hžk:ª1íâíø]mL;­.õýv-–OGŸéXɯŸ*áçÄùò›^à\_}Þ{Þûîtï¿ÍXÛnÛF}÷WL – E,ú(ÇNÕF…&va9 ‚¢0VäŠÚ†Úew—’•ÂÿÞ™½P¤.vô¡SäÌì\Μæõ›r^%ggGp×¢à*i™Bæ`çø×ô3|,……´`ÆôQ’„ß‹”KÃ3°Ê K–⟉šÙÓ®U%3f…’ÐN®»€?¹%9i+ ¥ýiZL+‹ oX®9_piM`¹3s{?]Á ]$ýL¯‡¬„£Œ0°Rú ÌÐË2AG³„Ä ç)jž3Qt©*×Zäs j%¹6sQây÷Êä::c¼áx,ƺVU¥uHF~GCòOý¡ƒ¤tÞwÏö‚­A* •áëÀS^Zt[”…`2uÚ!ºú ôñs0¢¦T)`.P³¦0KÚô`nm9H’ÕjÕgÎá¾ÒyCLÞcfo&W¯Ðé¨óQÜÌÖߕИãéX‰^¥lоlEt…r@/V3.ói›‚f™6I‹.bèMLs5:N`<9†wÃÉxÒƒOãû_n?ÞçáÝÝðæ~|5Û;ÝÞü<¾ßÞà¯kÞ|&Í_Ç7?÷€cÊð(þXj =”Qž5ð} ´„:™’§b&R OæË9äjɵk…’ë…0TZƒNf…°T†Twb‹]òÓý…LQ¹Ë€$aˆúaÎò$q¯b|{¹žÃšLbgÿ¦ÕRdˆf nçÊ “âú 2^°5VÛÞ Vˆ¯¾oQjúOmÝôŸ"½C…wvÔàÐ2Ù°œ²¢˜b ˆÍ>y¥}¶1­·xŒÓåØìcx#§½]çj³OñFs[i¹-éäœÌŸ­$&Ž~}ŽufV]V©ñ«¹Hç5˜6¥'}älá±—©c¶¢4ÜŽ‚~•¾£ûÚtÞš²ö©’-jÒ¨ôí‚ &-פöl"É÷Ót–ï}ù ´FôRÝ*¸¯(”ŸéÃÚ¢1#Z”’n)#Ë`§ i¹ž±©Ë×8ã3!±JkZB¥®·Ž•:Ý> e,¹Zµ½0šd!ŠTUN²çZ7îvc×¼W«½Z¨ù`;šÖÇž ?áÞ‹ „¹W—DèÛžÞq–yd Œhp¼gZ³5ÊWÙÂEz —`uåx¨Ýì»ùvF¹ÖÆOÚ:kõPñ£ÝÌø¤*ã.V¸³e|É Uº ËÜÞdBû-J„Ö¹çP½n…ìñäOãÀ:òîwŒïä¨6[ô˃—›Át‘K´²÷cV¸­„\ÕB ¡'_x½Ù¹êôÜúack:: Dèl… .YQÑ⎧¿]2jL[—Ì/.ýßnHŽšxÕbÉ,GXÛX‰CÆë#¶cf™Ùr¬VÕX£ò‘FQŸlîw¼/™f ð7ìœÝ òÀnqjãŒÞ¾X|Ú|‘ë9îòó€e{à¸Üš-3a,6sÚ †ÚÆè²sŒÆzDUô/—gWîÓÝñ¬?ïÿtý®§úކp'I`4çX8áYÒÞ–5êÍR[áakð¡·”]r~q\s†K7ƒS¾Š™ÚÉq¯æž–±¶_S5–Ø"5­6“µ§¤ç-ËOGß™€Æ¨pc®¿''B>Dâ}a¬ E»³6æ÷GñIØK¼Øcr”O;Lóq3b lHeŠ£Bæî¿/T³Ú %iŸø›mž¹¯?oüJöYÒ·Ž\#+×{}nÒ"ÍÑ=ó£Yä?Ù k䛚Ã÷'ó° -ÆX¿ ,Ä#Ͼ…[ßm>Tõ.;$ˆŸÊÜv^& ƒÌ·i/™k#1DJ¸1芩Wœ}Lsºµ‘ánÜsW†3¨Üç«OG¸ý •T]oÛ8|÷¯X}HŸuèc[´ç¦1Nha‘{E×ÔZb+‘*IEqïúß»K‰¶‘úaÀ$î g‡³|ñª«»Yv}=ƒkXé†@YPm*5}U¯ÑÓ5{]õƒ¶&7:hlôWr ôžÁ‚§O%±Ë? »:‚•íMàrY¬®€_™Â´uÐZ7 pz×þÐŒŒ€•#jÉ¿(ˆ"ýz³ÍonaϪ_j?âXÀ CÍ5ÚÃ`ÝgØ3–¥–­±møC…ÐQ…®”†•íNWu;r¾Öï·•VŠUãGâ´-÷z°ýÔÊYדsø‡‰¤å§‹?á’ t1­^\=è`l€ÞÓ‰èAQX. k»F£Q=uw܃5~œHìN0¶v^-€:„îY– ðÀ(xa]•¥³wì캸ýƒE'Ì{Ó÷ìÖ—^;öxwìX•ÂkmpŒÀ*ÇŽ›j.hŸBp~L'Ó’Dný¼€mÃxFËòâ^/‹¼˜Ã‡|û÷æý>,ïî–ëm~[Àæn6ë7ù6߬ùmËõGA¾Í×oæ@loE“&X©G©<ËSÒ i™ÎÉw¤ô^+nÏT=V•½'§£#×j/GëYdÉñhuˆ¡’yøo‹iJþb»? •ÌUüp?%$ËS_‘ɲø=¥ÿ×ÏêGácÊ,MúV2G:gïuSÍö›@nJ Á0Vð’IgÊžÅ1”T0¶ŠPlš÷Å î)CxLmI ˜ðXzœÄ–TFûöw½Êf'å?¹±fÿÎ8þß5¤ÊɃJß“áAúD*Ì%)ŽBï̸ÈnureÅUî¤#oÑ?²(ØU8=äÓbªÉÅ0H¨3üT ú?À×¶oÊIBäfK­ÒÈÓ‘Ø’TX“úWD¶j[>¢4}Ó<–Ç®;l'mÿM\OÆç±f·úá¨$‹O/C  ëwœPØ÷FÅ_%—7‘ç2ÂÕóٷ٫—³ïTaoÓ0ýÞ_qšøÐN¥A|Ä(°Šˆ©•–ŽiŸ&×¹$f‰lgY‡øïÜ9qW˜„¨TE±}ÏïÝ{—wgmÕN’ÓÓ œÂJÕÒh/”Vº_!à£ü(ž?´Æz±£J{´…¸ .»PµÃ¼ %ËVHzd¦ð½°+Óé\xe4L—ÙjôŠŒF®6c‡{­ÚužêDiÔÞ-2Ä¿ÞlÓOçPY®Ï•êˆ@¯|Eg”ƒÞØ;(Jä¹â«EMÄi¡ D¸Ðb)lÎ:¥i÷V••Ók´®R-Ý·e)Ù*’qp¼–´îM7J9R=6c߈%¿^¼‚)࢓q÷dö6T7bÚxè>¡>Hl=Ñ%bM[+¡e¨Õî Ž7#ˆÙ±g ‚0Åñ1ž«ùPyß¾I’¾ï"^[&QbrA]gç/‰t¬¹Ò5:GÝúÑ)K=ÞíA´ÄJ†0Ô¢gƒQ!Ä¢·Ôq]ιÚÅÛôÔ´H‘¤ ¶‰àÑÉ2ƒ4;Ë,Íæpn¿l®¶p½¼¼\®·éy›Kø´YN·éfMo+X®o¸òkºþ<¤–ÑUøÐZALwó£ËÙÉm:† +:-¹ Ø 9eŸ„§nØàº– ´Öl*½2¢(iæÃ01Øác®2]3#Ž@øªP ¢9ÿdºöTüì+8ù9¡i‚ÐWþÂ%úΆL:1GFg`?§}Q«GZ+¬ià÷œ”·,¢A_™šÎyšA¾‚¦\cÿì’ÁMåy–ŽBDã¶ FW‚ÏÅæyEŽ;ôF*Õ=ê‘kÅþof”e+ša/<ì,±ãjžm·£ôŸ§GônoéúÛ€2ýsövòk29{?ù •UaÓ8ýÞ_1ZD»ZÄG¸ lEjO›rˆOÈM¦‰!±ƒíl¶œøï¼q“nD¥Õ]¥ª±33~ïÍ÷Ï—MÙL’ËË ]ÒRWL™5Ai£MA¡dâÙkåùov^û vˆÐ&°Û«Œ‘#itÆÆsNÁÆ”E£2ü¤v:嘖¶5¹ Úš.Ò匰dGÖH²ŽjëŽç:½k6ªcER…c®Ù?'J™cùõf»zsM{€•ü°bt:”ˆÑž:ë¾Ñ¥Tžk9ZUÀ:‘DÇ…r¹ðÌlspº(Ù΀h©œ·*érã…‡cÁõ`۞ʈu/Æý#ŠòÓùš"@’.ú·³ç1»V26Pëù¾:ñ]ÆM\«›J+¥ØÎÆÏ}»“ž‘ŠTÈîÇa¤‚dË—¨ ¡y–$]×ÍU<·®HŠÉ(»N¯ôóÑTì=ÔúÞjwR PeÑ •꤃±QÑ@Ñ9(nŠ+Éöƒ Æmºm€êãȦb.)­Ò z½HWé}Zmßm>néÓâæf±Þ®®SÚÜЛÍúíj»Ú¬±ZÒbýY2߯Öo¯ˆ!Žâ»Æ Õ¢(ç#? Ä-}Ÿ|ÙÞë ôLѪ‚©°·ìâP4ìjí¥µ sØ£Ö!šÊKê·y?%¯ ÷7)%ã7n{‡$‰‚ë 6I÷÷ÿ÷^=d>”L†ߊDzJAŠÆÙ[GW&+Žxe†žB³8†²ØÁP»Ó `Õú£+¤PM t³ûÊYˆ ¥¬\VF3cæe˜ÿ§$Éäàù}4ùwcS¤(ŸË8¹¸Nà§6“ë¤ï,¦$bZ~DEUgÎàÉmÝ£ŒåÆUq)1k¥€‡ï:wê¿™]Œ¡MÒ¢$<¯Ï<Ïìæ··i”¶‡‡-8„+#ZY!•TK°þ¼?¢ baLŸ¬ÙáZ¨ †`µ3¦" ·©^ØBdW:W¡°R+è §W] ˜VÈÞ:ƒDg>c&ç¹¥/bÄ2CLPYÓ˜"ºðã›ÙèüT&û‡Òx?* 6"i ÐÙ=,(”CÉ©E Rщ+„3\Š,ä®2¹Œ,èBaf"™R¾·2½ªŠ1>p•–z]é¼l¥Öu Fþ @ÜòQÿ tÈ€ÚåÓv÷Äy'bJ[È n¢>˜Z*— KÒX 8ï²»uªñsDÏyZ \+ u3–½ù ²6= Š¢è Wp_gËAÕâàšO/_SѕϊÑBëŸ\f„ñ|"¥ª1§ZcQðÝ ¨Š"#ÄÕ²ÇÞ¦"A}LЪ©õºÁ&ÜŒÚÃ)Œ¦mx?œŽ¦=ø4š}¸¹›Á§ád2ÏF—S¸™ÀùÍøb4ÝŒéÓ ÇŸÙó÷Ñø¢HQ*|L3n‚*•Œ(†5>U50[Ê9™¹µ§–¹X",õfN)f‰4®Ð«0ë|œËmyÚüÊkœ”»¥ÊåÏíR>äÁ ç¬Â’lKdh û»ÒWµLnàøH5èÌ1|äp½Lª`ÂOH÷„!c¾v¿5Õ¹Öñwg*Íš!£ ¶Nîçøy¡žšøž5QÞ®×Ý6c” V4Gµ‘n‘ÏÙúUæ'T°î³âñö¬HO¯Ž˜Ã©;&5"ù‹]:U³y’Ì®¾b\“Ô®zP#:‰ª–ÇßöïÙY´yF†ýÓÑ’¦Ÿ{\™Æ|e5=w½'ƒç~ãUÁ*F”TØ”ð­Aº„?ÎÓ3ÿ¾VÉÓƒ½p`¡ $š™Ðé"Í!Ó}r×ôtËxÛáyÌØ*¥Û˜ØšõáÑeÏÌJ(„Ë8|adA«?¾lÝ’8B¶Ž,b•ÅVršzfAÌâ#£»cDë~x5œ]ÀŒf{_êÌŽXIЩa«{˜‘+áû’C‹dD66T8ÊçZ½8Y+9 Ä«•dBñ&\ÊøÒ%£3Ç.,ÕºŽÓ¼”RÕ9ø‹qɇݗТ l´—¯îµ¬õB¬!Š ¤7Þ¿x˜J—[$¡‘g­óꊔã§ÜIÅ'…×cˆpU­çÈîþ¶•÷Mª¢,oÇâ7oõ’«bR‡Ü¹(ûu7:õVòÞáË—¿w»‡{<È”K#¦ÎD¶? ÉÍ›BÞÄà’Kp@Ä(5˜^œ”–[Ð$½Å5;¥aØææY¿v£¸ í£"Bžl9ÎM3¯¿y{ÓT"I¸yû=ø…m¾r&|ÔMüBZùSÞND9ö||aÏC|”'p$¿v9ƒ?%Öw÷¸¾Ã/äX“+‡¹©Râc‚täDžDݼ…6´ _›¼wZµ¾Ù„¡ï|.Ðe!#GrFô³n;Ù­:"ìi½_ 4 ûnP:W*ŸèÝo†ãfø8W¼RxcOö|Ù¥“i‡ªDêBs—R«žïω¦êìY½*õUN«Â‰Ûø¬™¿AŠ¥¡}Ï«ÕHós&B:5ùXßth l~µ-¨û¹æ,pw­ùëQßÏG ;â”,·Ma}|lÃÁëÒWÅÚ÷GkHÅ0Y›D³ÑZ'ëJzŠê, f´[ˆ3¸H̺Ä]iê–âð;Ú®£nlÖ²i“ôGCMׄQTݱ/´a)Â4;œ3'Í\“%Nv(*k‚LWÇ'ÙµÝ}²ÂÎK#lKfǵ©þ?ë®:?ŸtXÐo4­š+s<[xôpا¸š²Í +…ø07Mf´n;döæ>o·šmÇöÚ©•õQùCßÉŽ^>~SÁÓÀ%íºmµºö¾]ÿCE>XÉv5Õ;7bØû#'w…ìoo×'ÿÝWmOÛHþž_1E¨IP°+>š mZ@ކФ×öª mìõËÕo·»&äNü÷›Yï:Ž¡åøt“Ý™yæ™gf׿¾*¢¢ãtàÎ℃—gŠÅYœ… "üoï “ü=Wì„)6gbÁ’ä’3Ÿ ð&¥ƒ¦d}{<“Ü•kËqÁ<ü3˵d‚ÃY^f>SqžAo<;ëþ‹>òŒ“u. ÍE^Ä‹RáIåX(8Oy¦¤0ã\»Ÿ^Ì'oO!@ÌdïDz²CËXE¸'–°ÌÅwÐóý˜B³â ¿H52f —Ùú«Œr¼X+•Lj5aKª .”¢X d< d-­šeZ“f!bêÍ HÓ5ÚÏ`2Ûƒ7ãÙd6€O“ù»‹sø4¾¼Oç“Ó\\ÂÛ‹éÉd>¹˜âg0ž~!Ëß&Ó“p¤ Cñ›BPˆ4&F¹ßГÅ@j1u’÷â ö0½,,YÈ!̯¹Ð½Qp‘Æ’J+¤òHc¥E%Ét+7Û%¯‘îï䊺Jqm⺠U¢ÌYèºzÉ6À—k—þÐ¥k[¢Wí«©¨º –l%I6W^DY6zØ"/•N)ΤÂ!À}òÄÿ€·¨Olcí!âÙz¶K51•ŠjÖ 5ô î®Ôù§ƒâ#}šžfR㎰P •¥PŸßŸWÖy‚'œèi$ïX¯¯™€™¦ìsšœVÄ™EWÿ-D|͇ý›4v¶ðŽ‹ÒÄÑC4_üÉ=¥E”<“M ‡„Aƒt6ƒ” ¬>eæéÚ\]aØ8¥§z}½£b‚>ûdž±”ûKÐS Î&ç§WWк®ã˜Ÿf\3è×~h4ã—èHj ðù*É™E!zHýÊìv+ÿK®Jar´…§†GêMã5Ô³)­EIÕ³Îyžìd,–5ÿ‹»×Nj«qEŽ—‚Ñ]ÄU3týd }0eŽGôŒ=¶Â¾¹ýz×: }â·¯ e¶íR/w¿Áht7Ô»5jO5n,Þv¶ŸÌæ€%’?bn˜kN]¥6V”€v­Ï¦Fa’@9Ñý«–ÔëºÔ¶3þÿ…¾Ã¥©R÷ÛÓ €áMK**º·žhº¥[È‘@žùxÉÚÕœwŒ“„8ÒB­z¬‡g#Ý`ï;IæÑz 7 ¼ŽGXüùÎW²%8â[ô™®YRVƒÝ:³7Ú^Cp`¢LÔlYO­VFÖv@¯^÷‰Zc5›Bî¾n4E~¢yæ™s¹¥ôQ…qKð ¼cØ›é¨Yøk‡Æ^lév42¡_UÁK¤¶t]ýjE½–í³ÊtK|±ÉóùyFZ›åhy£EºU• â°DÁØ[sÆ— 3ÓjEßË*1û–ÂUÓŸM‘§Î}m_“òDýߥËu÷Á¾oUð'Ú¾†ñÌÔîùó'HµzŒ«J;Ãí}V9»©úqó}üš–"ù ïr‚eýD— ý¢Å|_ C¿‹­5@’’–\¬ºölÒ{Ûo”e‰ÙTÝÜn.|­ÊŠ|6¸n”pØÎ_m¹Ú’Xÿ¡Ä÷7¹¾}ÕV)Ü+’ͬv)qëÈià½íÜv^wþåXmoÛ6þî_q ‚ÂR{ØÇeIã¦Ig¬uŠ8mÑ C@K”ÌE&UJ²ãùï»#©˶l÷eÃ6ml‹w¼{î¹ò§gñ$nõŽŽZpW"âà)™2!… !pàzÏY¯ãT(™€±$éâbZÿJx\&܇T™µý˜yøg¤‚tÎ4‡+•IŸ‘ ´û£«àW®AINÒJÃTi»¡ã,Å"«X¨9Ÿr™&]€çFýðúvpq ZIò¾H¬0é׈æJßC€ª˜ï ÚšE $þ05† æ!Ó>9è©x¡E8IAÍ%×ÉDĸß-¹2ºÊI¬â|[ôu¡2çJÅkÆ1¼CEäòÝï¡ HèÀ½=èœé)[€T)d /µðxœ¢¹hØ4Ž“ž‘vÞ{ œ5¦`3®€ ªË€¥$Mÿ&iÿØëÍçó.3w•{¹‹½WˆìptùÎeÞʈ' ¢õ11/€Åh•ÇÆhkÄæA(C´b®q“t’“ ¦´ÜDt½ºac&Fý Fð¼?ŒŽáýàöçë··ð¾sÓÞ.Gp}×ÃÛÁõ¿]Aø$ _GÈp+þkr-„(÷+|Êm ¶¸8%1÷D /0Sã?Pº›/Ëc¶†YÔh5E‚81k%Ï–Ei×Ô—BwúS*RFd1ÂhJRP̸,¬pµöî.ái»SžN”I@üNo¦¹>LHZ˜Wìe¼Ò‰Vó"No,‹¡JM;4…È”K»>X`ôÂôÌD‘@B7ù¦1F8Ñ¢»a¯w,ÊxãhôŒYz ©V¨,¥"§1;y¹AÌ4›® ?æ°èØÕRý %‚Ö]æH6Æ,ƒ “ž ßÝ]ª¶‹e¡óÔíÙË3ËbzÐrŽY ír1KòÏpz‡ÖÃN!QÊÒsHMáé™ r.w\H‹[öÿ:‡_s™Ërú éhƒ)šU¨Qú–Z‘cÔ”4$¥ „½š »iüÿñ 1º®P®Y3Ï ÜÃ*Z¨UYEìºç‹ý©…Bûð*„Xml@ \FTæ80¤™&“– ×Wd«…¬Ò%?3`!}¦/MRÈZmìŠf°²)·Q£n˜r9‹ü ËZçÖK0a72n1«\&B‰ñúJ¾‹ Ò }Å­¯&%6¥A¾É›bŠÙ¶M±º>榽Š*Myü©’Ô¤j¹·©„††jK0×i›¶Kn¢…kDàôôëA¹]Tœž²Éÿ¶¤é÷:Ïé1p™|Ý–»N6$ˈ§I9 ¬­²ø‰ú=a&\VÆ|QéM»·¹I•¹V…%n¡ÁTɛ˹¨–sË[œ~Ðx{FY.îBâ:áûŒÁ‚í7%L1<¯fÎj׃ÖY`o\ T,]@ ª«ƒ`¡lo±”BðᙣõJ+Áû 7G® ó–·¬‘hS­XŸúµjá66Ýò[ØÝjªz!Øœ¬UÌäúQD±&vðôN UN4û »_ŸÙ âõ˜ª @{/×!´ Ø-…x†%€Ëeä%OëïèdÔ„àç Ë6çóДäŽF•S ¥R½H~ó¡)`/wNƒ"ZëúlCsZÓ›–[Ö ÿ‡âó7Íø{`Ÿ>»<¿.‡¡‰£:B&µ‘[7YÏ—·2YËóû‘3õcÆ7cM&·ÞBØÐ¨·Õ„Æ`Ë,ж•o{k”iM§knïíVBè*ÏL ¿Ñp§§½¡rå¯÷oÔÆJŠ»ƒókŒ*7K¯ö1ôµšæÌ™6Ó§ä_n)Ùd y·”s!íÕj~›ß/B'_n­6¬±×’swK/ÌðiçlÍíX] 9°}0Ç)sµ÷é<ò¾0áÊ«V÷ÊbùøÙÞ™ãÊsö¦-ÅJØ øϵ&5Ÿ<)X”ð-]: W³uF9¦­gg½TÁjÛ@½ë+“Cl\«ôØ”¦JbSÑ —ÈiÈ)¬¥±¼DÚUwWQœ’ïÌJJÜJ[JÆh5óæ½73ûî¸ÞÖA8™0…,2­œJªÜ²a1u¦ÉÜŒ¢8ð\f¨,æà´Šj‘Ñ_ª7®a¡• 'µ‚Ã(]Œ^Ñ€VÈÙÚ@¥MWÉÈuãè ìA±Båì EôðÉrŸÎaCô8?—¶Ë#­t[Š‘ZmnaCP"Ï%—%HE•'‰ arV–ézgd±u […ÆneMõV,%] dl<”%­;ÝôRöT÷fLá ±ä7³×pHœ4꿎ÆG>»;PÚAcñð>ÃÚ]"VÕ¥*óÙ½º§ÄñºÑkî/ôf? „ãlþl«ß†aÛ¶3á Ï´)ÂAbxNÎ&éü‘r.U‰Ö’[_iÈãõDM¬2±&®¥h¹ƒ¾Q~ˆEkÈqUL9ÛC°ß¦gÓŠ$}?€l¾G£(…8ÁI”Æé®âÕÇåå ®¢‹‹(YÅó–pºLÎâU¼LèmQrÍ™Ÿâäl H–Q)¼¯ ‹ ¦’Å|ož<-}Ÿl™ÜȌ䩢B¡ïÐø5¨ÑTÒrk-‘Ìi<*éüPYNýIÛ°%Èî[†âòwý„„¡ ©/hÌE†þÓ°¿ß®_ÍA†Á°Ö\²R~?ʬ_çîí_ƒð‡ë!øÐÀ/ËÏ„6Êè–\óˆŸ&+Ý.ÑÎ_ýØþ¬Òˆˆ³dÿ”¨ðŧJÞÓÔ܉²yþ$ E÷Jÿúÿä{ nÖä l•ùK鿯¢;쀧= Œ}B'ÇÜAa;ˆ|É>Ðï‘`|䓃ÿ`Ãh-ž´þKÁñûà;VaoÚHýίE‘€ˆâê>¶—´4 *º ª˜^U*´Øƒ½Š½ëÛ]ÇÐSÿûͬ½„Rõ ;;3oÞ¼óû›*¯zÑÅE.`* „D+'¤’*—#à÷ä°È¦©Té5Yqë )„µcrb¿2Ae1§½Ï¤ }Äzãa¦ºV©pR+Lâéè'Ð Ù[(µi¹®mD™A,Q9;ˆ}øùb9»¾ AbÿTÚÖ4ÒåtGZh´¹ƒ …i*9µ(@*:(=v4˜ “r¡‰®vFf¹Ý(46—å[r)ñ4€±mà–jÝéº+å êŽŒüI¸ä߯/a@Øé¬³ž _{ïRì@iµÅ‡è€Û+Gp XYR¨Ä{wÕísƯ]½æ¦ð¥€Þ^áØ›ß¹sÕ«(jšf,<à±6YJŒ>³óøæ>ŸUÖ[×ÒÇ눊P%bMX Ñp}£¼Ecˆq•ØÛ¶é´‘J?¼@´ ߣ³I ³ø ÞMâY<‚/³å‡Åç%|™ÜÞNæËÙM ‹[¸^ÌßÏ–³Åœ~Ma2ÿÊžÌæïG€D¥Âme¸B*™QLô0°Zº>Ù ¹‘ •§²Zd™¾Gã§¢BSJË­µ2%y”ÒyQYv}R[˜’·D÷‡âyò÷B¢Hê3’¹È¢È›Âüz»~¦? õ”ÇÎÔ‰ƒ&—I)n¤òÒÆÃñ &®m7½0QÜQqLT¡ÁMöû?jŒz~‡<·`è*Ý›[нz$að…ðëÂÏhAÂaÉ{$!ØßÞ §1b7`u©lØY"ÿYÕkâαh·ÌëÞ©ª.×¼¯~’B*w2pB«ÏŽê´£äyµò;rxQ´´xeþ—DâibÓzæHª °yŽm¿Yhé;IîEQû–>Î^ #ÊÇ\>wt‹PvµŸ20ÖSElj•xõ­VI>xÈ—]öᨠN'/Gm<þ ms[‘ðëœwê‹«ƒ>º†–™»Ïløñ„í[tµQjIðæn·1-¸Vïû%NODM;gç¾¼câÛÓð\¶^${ÿYšö(í`?³4ίB˜–º~ë°R¢Äþå•oõð8ãjeÑ­½Cz¸Ü…'_7¯ÛJçw¿/…D¹jÏB˜ƒ£ÁhäÑP$ò×)­%— úû@EtQKt¹¦'wŽ ä^.d ÁØðHÿôáÓ/èñòª”[L‡eû›Æ÷åí?"×LB|ªÇ=!ƒ6cèʱâºTÏÚ óü«”Øÿ6ÚŸyí°Üúß`$÷£÷æª÷/•VaoÚHýίE‘€ˆâÞ}l´4!*º"L¯MOZìŬbïúÖë8ôÔÿ~3»^0䤈`ïÌ{oæÍØ|È×y+8;kÁ\‰”C¤¤aB ™€Ysà?£O¬à3ž«B¥7—BóˆþécE]‹ˆË‚Ç`”æ,¯P­LÅ4‡+Uʘ¡$t†áUð'× $§h¥!SÚÁj±,13¤.#°DsžqiŠ>@ȹM?™ÎÇ#X!WŠEáâ@%Ìψ*¥ï`…©X ‚f)‰2K„5O˜ŽIf¤òÉÚ€ª$×ÅZäˆ7')á•'S¸ÄµnTYKi¨®‹Ñƒ¿0Iþ½ÿ:x€‚Nê»'Ý÷6:cÊ@Yð]vàÏ ÒEbYž &#]«Ûb ÇÛ:‰ZRË€Y) VÍcÀ EÓÀÚ˜ü]TUÕg–p_é$ðƒk¬ì$½AÒ>æ‹LyQ`µþ)±ñ1,7Àrd±%rMYE´²@•ƊˤGÑ…7A³M»¢yŠ(½yËÆlN†!ŒÃø4 Ça¾ŽçŸ§_æðu8› 'óñ(„é .¦“Ëñ|<à¯+Nn)òÏñä²K†Pü!×$™ ª(~òÈ-uŸŠœGb%"”'“’%uϵ‰œëLÔÚIÆhLkª‚B´ù)ùˆå¾£T4MöÂ}í `èúmÎ’ °·ü¼¼]ÏùS-?ã¡Ñed Z‹h 1_ ‰ÖfØ_?ߨ‰ƒõ ¥ +ýôÖÀf.ãíǧõo Ý –#}§ë;fÜ* ±!¯Ô­þ.pDp“àŠhHè×Iû›¥00¿½-Æ“ùh6^ÃÞ¾o½’IK^Ó2éàÌêº~q÷%Ø£o[ìߎ±iÛœšMngù!6•rág.#¥5, ›]¶æØgüxÏ4ÐLÉdR^.Ñ@ìq9£Eã–9‚®DRÒäk|)Ôû|ƒIÿŽì”*ÛMøjI>úq¬ ª™ü.yõœI©úÔ ×»yI„åêómeÙ=°enåìQ9’‘3ͲZˆƒxâ–Gxâv䱂¬JÙçîbyñØÛ%ïí'‚®Má’>§ä±7ç¶›ÛR šÝ>8´‡28lüuÔ´7¥–¾cÂN@TO‡wþîɈ¯Ìoo÷¬:eZ³#ú«þU³§é.>ãÙ÷Û†5û”ÈÞù46K§í’e¼=8¿giÉ»‡ˆ‹EÁÍÙŽOì;ÿ:Qoˇ\ic¨V Ú|á®ù4K.àÂå3a¼Š±•v]E(¢Îšq³Vø:´æ„ñ)ðÚ§ðïI7Ÿož0¦“åL68ÏÄm8W²íImûòÌíù‘t£m¹-JÇ¡úÎz°†{~j;uôßmòhûGoûÛ[²y­é¾öèzþj}8oýYÛrÛ6}×W`üb;ãš>6mÕ—FÓXJEÅžÙB͉lª#ƒ"•+•0¡ö öWLûF÷—ãsŠ•ýzáë†ôn ¯IM`k°¼·Ÿc‹-B#ÀWÞo‘tq„Á‰E=±¡^Ѭ±6}Ch´ZO‡»!ÂÇpG“¾A=5D˜ Ôëá‰bQP6 âIáÆJ`{ U¥ïËñûÌñHƒ`èÚ-Fˆ€@S«žð"(çZ [¬`|ÁEG±È\HÛQrô<~Y›.´ÐÂ4#Y7Gä‡2‚Kœ“íÂ|êúiþ…¤šI¢ ÑütYŸå Ý9£Â [5HÇ8ß»aø6>ìéϤªÿ&ðŒô$ä6ÕÙ ²²ƒP Ô=‚j w„5ƒ ±€„›ÈšïkìŠWÉõç=æ.‹l±¥–o‘Â7Ü Úzb„ô ¼>¶ÝÔãiÙ3Ë\Q(i‰¯øÞdÁìÒf] 4žÇç`ªôö…¯7íuýš,1\Yû:"Bž»QX¤!ÂÀ¨òŽ©ÁxfƒÏz]B¯b‹;o*rLàÎÐäj»b˜{àÍ[èX·í *„xk¾Œo¥­Ãömf¿X&ˆß7½¾›9óÖJÎWÁKýÍÙg4þ~Q;«µµŠ‚î÷ÞëôQØ?$ýÞƒÕ ¬?烞{á÷aìjw“æÕö‹a¸ÃumŸJ{óì «vm‘bH=‰ófí qÍIIž§ôâ)†Ò<.÷Â(õ#£Ÿ±Û¥Á gpï†w)¨&Ü7½3ËY €†&•WƒàúÕ©MŽÙ;ª›µ^Ù.ôs}!RÚ*xã£Rk“̨ÀŸÛ!wç¼=îzlݼu çïG?ŒþíXÛn#7}÷Wp?´²´È£'öŒâ "ì¬Xš ‚Í Z”Äu‹ìlÉÚÿ}«xé{KÎf§˜‘Üd«Nº°¿ÿnҳѻwgä¹ç #±†rÁÅš˜ #ì¿ñZ&ìŸLd·œ&rMâ„j=”úÄc&4[#­Ä8¥1|ÍäÊì©bä^fbI —‚DãÙ}ŸÀŸL)JKE¶R¹c_d$N#¡kÅØ– £‡„̳ê§óÉÍY­(¿äÚÉ{n6°‡k²—Ꙭ@].9MÂ<ØZCPP±5UKt3–éAñõƹLé Oá¼9º2»Æh§8 ¾dæ])yíÁ/ ]þnøwÁêùÕ^ÿ½•ÞÒÒL³B;a/1K ˜ †mÓ„S[iï]~Øø‹W"2B­+D®ÊÛ5(ÿÙ“^ŽFûý~H­ÁC©Ö£àâè ;Ý]€ÑAæ³H˜Ö€ÖoW€ñâ@h VÅt¶&t´²+ö ëJë@‚r˜ Ђ‰àzyÀFmŒzã™Ìzä‡ñl2Ÿ'ó>ÏÉÏãÇÇñt>¹›‘‡Gró0½Ì'SøëžŒ§¿ ä?&ÓÛaÅ^R…N€¥eËŸ‚ È'²˜¯x î‰uF׌¬åŽ)›)S[®1´Œ\=¶ÜXRimø²ä#ÀýŒª|6Í¥L¬ÄÇgÊhDýk ;]Fv)$ÂÛÃvŒ‡V%RLËLYNÎBê—㸥Ïà¦"ñFJ„HÉ- 22C· Elà¬$ksÕe:„3MèAûí‚›Å&&ø*aõ€.cÆw 7ïh—^„%,FeBÌÈÛÐûËKçÃ/¶âÂSTµÁÔ(üÀÏ­åì!µá{ÎÿŽXÙ@În­µ2¦¼îÖξžARüäqºf‰!áiøþ¸£P.ù [ú'#û*i*pýÜ ¾oèýII`®ár«Rª=t)M á+·3r[áÓ“½ü¾º&"K’Ai13ifp­ºØoZx£5–‚í\h‡í;~˘öT³¯,ð®èFȳ!'I‰:\•2f£d¶våõÜ{DRªè–”ŸÛçÖ™â1r.s/×玷z1…ýËóÏoˆú¯à¢ÙÈå°«¿Ä•wl8¾üñKrñˆÔ°SCƒê…è˜ÿ]È+™*ÈNòϲԲʄÍKòô]ÛevÔiðàm†\Yv¾=èkΠsÌñ‹ëàûUÐú¾±#×S¨¼òJ?XÂ1#ê“Ë\Ω~môÑ¢¢ _•à X)ÎvÀ‚P¼\ æhNVµ²¡Àáȼ<)™õo9p̓(àËA›Ä†¶çXŒib»K=>v (Y-Gï©., .XùE­dTŒ?' øûþ01ôB ‹Ðr!ÛM÷H˜©Â…)¼×vpp:ŠxO¥õÄ…Üùsg‡,l.ä³Î³³îók)µ)¦ƒ=±t[™mJå†ÖØKxkÁFg•7±f\Ø>|Uq~Å4Iüä ‰Q÷‚áÈ’Ã[W·p…Ê—S@”¨+b9šG)µf¦ƒMàXIyööó]Å~üXk™},ÒQ¿(¯uWÎî¢îmjJù3`ˆ¶`2?)åíçíòvi;iS¡÷Ðdªª 3‚6|V‹7/e÷€pôØÝýGo„pAzJQyuÎÓ«“ ^«ï}0²8ׯ5Œ¢;ʼ0t¦N©×”“£2.RÈ0¯&ol³ùídê}þþfþøéúâö8CóöÜÞ†À#f¢0¼¸ö\%½¯Õ>tq ¯¿Š^A:¸a0Î ¦ç{-^®¾×;?/BW‚šwþÌ8<Ã#uèÌgÈð ./Š ³Š*«%òCÝmxt±—µún8¶å©5¢ò¸5«rkz¿Š2n°Ÿ#>µ*ŽrÎD$^¯‚|i2ߨ4r§:&•ð…bs,$+þ’¥U<ëÔüÂäêå%6õOiQ¦>å*×vÿɢܮþ‘xWŠe1ùWƒÑÖÃ¥ 4¬,` K%ÜoÉ!ŸKB&c­‚~ ÷bȯ-]æ÷9§,Ÿƒ3UšÒÐ “øÊØ 2µí;/ƒ¾¤(vUÅìùÈc‘r…̃+ä3T€·T’ö÷IÜ™áOl=]}À_¦ ˆÄ1ÓúH‡ÿjD¦ÒØ÷ayË퟉«cåN†ó ”âû¢jèº8h›-ù¥í0…Ë ±ÿù÷Ba¡1ï»ñå‹m`µ½øê)døZ@9;q=€Žj–´v~{§|‚ŠóÄ^¸†ÊWÊS¹tíÎŒjG/DþUÑùï¶²U)ކ­áÖI®àk1V#Ë7ˆt¡Ëå\ ±•ûqĽÛjˆŸ ëOù»®Î®;©ñ_kb›ÂqѺêfº¼")™ý§eÇÛˆªDÔѬWÃÌíšy ¿›¬ŒÁÍâeÉe£³Ú<ˆê‡†—Xþc·è¾–í°d@»!\·'oÂO¦ÎmÄãÉ]-nõáJµáɾ6kY½ÄUsHYËZ¿ûÈ^éß1¼z­J:|^OÀåç÷m‘uoºþP`ý‹“¿¢i?Ñt }Û.ÙŠBÛoï7„ª §zÎq„Nv(Ï0Í}£®’_æ£AxTÙízµ ¤ù×Ú}j6ð‡ÿ?ÓA ûp}ö?íYëoÛ8ÿž¿‚'ˆ](öá>¦MÚl’âŒë9½ØMQ,-Ó6/²¨©8¾"ÿûÍ I=-;Ý-îÓiŽEÎp¿yÑïÞ§«ôhøæÍ{Ã>ÊX°H%†ËD&KfV‚‰ÿDW*Ñ*ÿÊ…6R%×’ÇjÉ¢˜k=2¤ü$#‘h1gFÕeÊ#ø˜¨…ÙðL°*Oæ©Yïrò±Ïà«È˜JR«Œ­UfÎä,7ð"¶_fB¬Ebô€±‰Ä~|;]ݰÈ‹ôs©-°‘f{¤f•=²°âó¹Ä£yÌd/Ö$fbɳ9ª©t›ÉåÊ0µID¦W2…ó¦¨Êä£F[ÆþXÐu«r§JEkgŒÝ#Tùoƒ¿²l@¢À­ý·D½æ[–(Ãr-JîL<9¤ ‡п¸óåpHK>^ï¶}8$–1­òŒ05<òá_ lô#×'æìwý¨ Äy‹¶«Ü¤¹Ñ<‘щ˜=l*`gd%„ðÀ±L@Yɨ–#ü p_«$Þ"ÙÜ áÏÖ@ø(XpmoÃ[ÒLE½÷ò³'â ` Ò‘9Âm@.Þ ÂAد‰òÂxŸ‰’`C¥¢ø—X€ä6] L§ÉwpUòØ™0oSRáeà£êÐ@P°4™ô™í¡cرJ @–_u@wª ºXß’o}6XÙ55û·ˆ 1„ðMc¾õ•£ä=<²˜ê¬%1Jò•=víèûÑGŧÀ)„sæßúÏOʉ|s÷fHŸ AÁyÇ–ðm‹ïgk èØÉ”gßv1MKâs»³wäM8_ð÷ùKò8+‹dH\«/öÛ^e‚”ˆM¥¥wí³æÂ,3áýTVk Ñ»Œã ø¥öì<èÍ*SùÒ–.–òŒ¯…Aú)½·¨(^cÔ¸P.øÙã+ÁŠß\¹ ½þ oVj>h¹ƒøw•5ŸV\öG’ž’òLž%ìIÉÖòäe¶È“ˆüóð dÅ<2½N¡Ã× rN(a}:ì{¤cÌV§ÞçžóÛÖŽ‚OÉòÜ1}O 9 J¯ÏÎ ZËþ¥Ö;²dõEÕÕ>7ÏžO<–sÇ…UG‹Æ [qÀr  žo "÷‘À"´ùÙ‚„eî<°³=7…Å#±¶ó˜*qI·3H¾;ŽÞp]J<ØëdòI×tŽ;ÇyÀ±ÿ‹³ú!¢ýIK”:Q»ÅvVÚ S7•^©<¶½¡6Ër*½>V¤‹uºÕè†ZRÛÔmø “õ;è"M4 þRÉ1c’Nìô8•JZ…  (NZÑJåDlç·ûG.j*csÃãØ(™M¬ÍVοMv3›1];dˆŠšŒDÓ‘»ñ¼¦Ê X¯ä"}ô‹]å~|,Ôê©eŸ§{ý2k½ì ¢®Ø¹¶UDW“oÑÛÚÚ?‡Ì©uY_OO BÓHäÚÌ:+ˆ Ï ß5ü-+©%dÒ<,ÏvÃI# ¬“=ŸŠW^lÉuðêÄ‚ãêûi ¢‚›l%<Š?qãd×:•‚W ŽZßv9SÙØp³A+­'ÓëÑØéüîjz÷éâôz?B‹>aw„éù.ª²`«¢ÿœŠgÓ«aµ^%O/ ì`ƒóŤÑ5´- Xy €ðÏ µ™ÌÌÊN/ 'NhR¢j¬T@îÆÞ_[*arìcqßÑ ùœ§½–·î¥øža‘ýà‘*œ«¿‹©ûSô ú‰ ‘7Ên¼í»j!¸³>XT0šS3ù fGßxPcØBêìÃ,P[ó¹ð½¯eVô¦yVÆ\¥…îxah¨çTÉŠŒà¢+§`ÔD­YÊæ/ì‚á5AµîÏ`·ö|M;Á™m¦Àxíãð x×8QR5v„l³’Ѫì)ÉQ"ÔŬ÷¦mÏÍÝA¢‚fºœôö* AØØ´+x{ñ²…ó ßEj..ü·á}¥Þ/hè¯\°Þv˜ô Ë;ž·Â¡G­sÈ‚n^A o~äì_“ß~Òù!™²‚½Ö ñšQéÀ`äîq޽Ûm¶b~"pë]T06r„¤{öÎ%Ä|âWm¦«*¤­áªóÎÁѤ;o ¶>/æ*QôMè±ò¬:¦±°©sXªÓ5{A´Ó`öšáémÌU˜óæ©­mµzCÕ¦µ¥ÈÊdù'OS8âÞo¯W@{>s(kÔ$gŒúÛ®£®t½düâ´³³«ÛñýÍÝôáÓí×›»pÇáµWøœ@"9Á’“íIØ^MÔ ÝŸœ$Õ²U[‡®}&òAh]ÛïJªŸýµæTÆ£Hh½g‚øR˜'+C?ŒmRµþÙ>©Úi×t4øÃÁ9tÝø`ôDc¾Œþç~ ð ­¸³ãÑ=…gc/Æ1AI#—‰ÊÄ;èzz IvNäÿ‡G±}ÏÊJƒ(ô%¯rãÖÝnÔ'†’ä×Ïßv µ‘e¯ÛZjÄ þ>"`ù ¾³„Öuõ!¦K7ß&ù°~.~ôèìêG œ`Ý2õVU;óðù)^ñþ÷Ññ: êPæ5›ÀÕ0ÓC'´ßmTbSÞ Ÿµ²ÅA¯y¨ÿ½Ü誰Oó]yU„Ø-L'ÞéÔä;‰ð©›ªs[|ò`;–j}› ?<Ðï;VÏpÕlS±c­ß}dPù‰æÍ‚\*µÚ?/­73ÀôãÛ]¶WûÊÁ®/ù¿Gééð¨5ÒÏu¡krÚÎûÓ…¡.¡ڄaÍB« ¤i•Ru).Z-‚¿3¯í¶5›Ze~0ñ’܇zwøé¼áÀtï/Žþ ½Y[o·~÷¯àŒÂ2T©8v•ÄudT8©XJ‚" j—Z^-÷p¹–Õ ÿ½3Crï’ì6­€DYíÜ/ß ™Ÿ_§ëôdt~~ÂÎÙŒ Tb¸Ld1³Lü\«$S±øM$ù[Éc½+žÇæ#eÈÒ,ˆy– AJy'‘d"dF‘„«”ð5W+³åZ°•'À&UÂήæ7}B3•äi¥­Z.s[‰ŒGZˆHL6dl.‰ŸÝ.¦×¶Û‘?”™å¶Ò¬Ffl«ô[(†Uó˜É~Ø!ȨEÄuˆn*Ýi­ SÛDèl-Sз@Wæ7Þ˜Ì öjÁ×Ê+¯]0ì#B—ÿ;ü‰2õÜÛ^ÿ’¸7|ÇeXž‰R:OH ˜ †mÒXò$ nç]¡lüÝ QKL!ãä S«*ã¹ñckcÒ‹Ñh»Ý9اéâ×Û öéêîîj¶˜NæìöŽ]ßÎÞNÓÛ<ݰ«ÙïÈù¿éìí€ ¨O©F'ÀR‰a¥ž¼ X-.OY*¹’¸—D9‹Ô£ÐÔ#©Ð™aj302„òØHCE•!kË7ß%o Ü(Êu×B©˜8Þ<ºJ8TåΣш^ùFx~ÚÕ!‰ÄËT®©¦F' \‹³Ç¢Ç1]`€AsPÊðÙ„ƒeÂ`õAËæL`?‹lÀB±’ dJãr*bÛÓ('Õ jvCj7HØ0À_eh‹ Y ?ô‹< àw¡BC/Ä2»¢¦D«¸Öä]¡]>´OØRø¼ÚJÕ"æO$Açò×yïâ,–L Åxx´&"¬¶é€céH™þN³TAq,ã]E=yš¹rƒjý8¹[ÜŸ#Af8ÂFÝCXeÓUá4 X†áBâú‚'ÙCÂKuú°LbNM2¡ïäT •Ÿåq ²a-“Gù*â`Þ‡u6ljÝ©7 Ùjf6èebØi:‹ZþS–£-Åb ]\ø°Îngvæ4ô¡ã_,áÝí§ÉÝ_aüðþýänH]eù¬QЀ䢨E_ž|=A;¨]ñsÎÞÛ˜A1ÿ“ÿ~óȵ͘ûeDße#DØÓ´d[ʳïkÏçµgŸÇ¯EPÒ¸;¤Iò8®”Iì9‚LÄ«z¦,yÿò¤é۵܄”Dl-ž„M„²6u _e¯;‰ä£HXÊ5߆YÈ© ‘•eëÜsgÄêšÌ8“Fl2Dð¢ÉVZm¬0|ãå@³&EhÿS¾MHEß÷'Jrf‹ ÄÄÂ(Ð!†ñdÜ´Lc¾C(ÌŠÖ#ýD2DI”G+YxW +Ž.E•Úå¤xÕ"Us* ZÔƒ¬÷)@âU¦µ¡X½,gâR¬p ô !ͰUÖ¤ì%PTãÛÈ',}ï_'Õ`D •Gp}Ú•lZ˜\'ìQɰÞxù†5[åI@{ðý=¿ÎsÖrg\t[iëØvWÍšqGC±>éûZ´á)–_©Ke—MÂ"8ŽÐ=·è*v]ùlI¿µZúŽbÃnUiÇ¢@mæ+-“~/±ktjªæZQî{ÊÇ•“f÷Ž@€†Ð·^3ŸK˜”~,7->˜gß×g…ºf~œØ(”B#[Ÿ×„ÈÃQå°„ [>)ªjíãèA¬ðîšRf²v„y({4rGºJ¶ëÛ\'"|÷ø[¤ÜðD¦yÌM‹¸;”<Ý}Kùr<³^ýðC³þ3¶íçØë"*I¬³¹¡fÓæÿ•Á!.X³³Ž6Ú'œ6Ìz§ÓŠrQ£ª˜¸bm§Ç/ɤíå°Ì…§3r<ýˆœN¦o„AÈ@û’*t,åQ¶,á)Ø€hñyÒ)‹ùŠÇàžXgtÍÈZÞ0eK%ejË5¦Vƒ‘K€Ç– *¬ ßB•¼‚p_£(_ds)ËñêÆ#e4¢€þ5À®G#û*Â×§í>Z‘1-3e15:¡VÛ˜Ê÷–!€K€—fÑeß$t–Û X …7UÒ[pB\wv—;ÀîßÐ^´…KP ¡%k~ÄWÒ4ºd+.-À"‡°´²ãQkÛJA==‰ó¦çê&|°)ïŠXP¡w }X¶å_À¾'`('ª’Þ¸/õ5>. š ¼ÁUÆ"’.‚y掎 .O/æWÓóé)éyµ}€ý£%¼=ÿpzñ-Œïß½;½Zh9 =f¬`qº~ßÉ–Ü M¿ø9$ï\ü¸ƒû*ü}uC•Ë­ÿfdÿBÄ IJsfBÆŽ´wŠœGø<~á)úƒ‚ÆÇ;òÏ@#²$”…„Œ!š%«jÚyÿyùÅ|a¶#ÿø @ÛĨ”1™Wá|;ï€ì6<Þ” Ò¶F'Îפï’n&`ǃ1¦ŠJ¾–êý"H镊¬?$“•…¶p@>nø².œ¤zï"Ùc’BÌ®#h£Ðê±hKåDRªè–ƒ•2uûA A\c±Ó4ç~¸`Øüq‡p# ­ò¡X°î0>Z8&¸É1h![’yÀè»—w/`à µ¡X\¸­ l[5H[7š «³Gýº" Ú¤ðÕ¹YÖzT…¯Ö¤àUÓ‡‚G1“)˜äËjf cd• gíÕ•åUYlzMß…cW]Æ-EúVÏm^†O0¦Ï^”"4.«x^',Ý ’Š %ƒá]£–/l0 ÁnQ«Lº0G‹ê­QtÜa°œ{±.¨øL{s++f <`£‘®ÌN¬Ìª^gß½i }£—««§ÁkàâÊuÒ@8hIPÿ¡@R؜ѷY6y€‘ó}£@ñ‰Í’ÑÍ Ð8–î`à4¥ô†ªu¡ÏP¹¹ø!þã’à8rKO³„šq{ (YÚKñr<“("OŸÖqÿËØ•šg¯Š(e²ÊVÔÈ]þŸ† Ì”^KÙtÉŽ)l¿Õ¢¶ÆQ…ªd´#³RPòûùC2íºs¿ÌDîî‘é½îáÙêQ¹Ñx *†g؉𡽑Īç2jàÀY[سWšÐ}q@fÅ`dÂÅu†U•„pãÎ;ÕÇ ‚è å -×ZÑÎÈ{¡»fæÂZ0³´½Žöõ"2´{£\B³‰FQkÿš¨”½Nt¿$ùt[}{÷9"GXyÂßkçl¢Kì¬{Zûô„ms?…E„Ø_¾e5ÚGµ \Ú §F‹çZô!ðä¬f£äÎîÒ¯óÁΩ4öJæÔÞ3Øó…£ßðñgÉ´=õGm×´ (läkûσRÚ«yÞÚ‘àtm)]*j _Ù…ŠmþSEÀç¶¾dÃdWã‡"Õ°¿k0å˜ÀËöãAQ™%áµ ·ûûÀµ‚ÛÕøZ¬PaWq¼Æ‡:”[Û£‘V0)3{+ ¨X³GÂR7`9¨‡´Óbµ ¹ M;pÊGÈæ˜ðÀÏw¡š~;W4Ñe%íÊ:A]ð.HdM‰êƒ?woÐú®[¦l~&îöXÇ4¡ê^—q'©¾mÙI~r4œ™ßŽÒ @GDZm9Ó´G¤eOú*JwÙó¿…ò7B…‡ßúÎÝì»û~Õ„‡Fž +±xpxØIøÓ6 {¸›+wcRiàð ŠDâíùŽãå8â#k˜ã÷N|o‹m6W×lžpmtEõà³øòÅÁXmo9þÞ_á‹*šT!¹»-)”Òê¢ãR® „rv¯{Y{›Ôÿ~3c{ß’¶”• é®çý™gfóâe¶Ìö†‡‡{ì]ÈT°H+Ë¥’*av)˜øiet*þ-„±R«7’§:ù‡gœùÀSs«s¥Ü˜¨AMoe$”1³š´œf<‚©^Ø5ϻЅ1ÐÆº§Ó‹ƒ?Eδ( ÚV:w®är^ úÔid<É…X eÍ€±©¤~r9Ÿ³øò±4NXK»„3Ò°µÎ¯ÙTñ8–hš§L*¸±"GP0 Ïc =ÒÙ&—ÉÒ2½V"7K™½†2½Î§8˜…X7ºð¡Ô¢öÉè³ Cþsð;ëÂêø§Þ1I¯ø†)mYaD¥‰ÛHdÜÇVY*¹ŠHÚGWÚ?y%zŽedœBazQ?ƸEiüÇØÒÚìh8\¯×Ntž CˆÃ·ÙÉôü98dÞ«TÙúVÈr<ß0@Hð9øšò5V E/Ö9d\%}”6õ2UI .Bèõ6N5êœNÙxÚa¯O§ãiŸ}Ïþº|?cO¯®N'³ñù”]^±³ËÉ›ñl|9¿.ØéäJþ=ž¼é3)Sâ6Ë1ðTbFE\ÃSðÑâëd2É…Œ <•<,Ñ7"§>ÉD¾’KkÀÉà±’–@ePt+¶Ð%¯ ÝרÊwØLë”$^Ýx¤ ‡ПÜy2Ò£Ð?_¶‡pH*bF9aj¸è ÕÛXÊÏX$rB¤¯H-ÝÖ˜Rj~h(ÜMS²O‰ü®«ë{ åûŸˆ¬!x Ðbœ%òFs+°mà“aÖPÆX,¤Œ€¨„ßòȦ¨Ã5ÕîËg:MÁ0ü]F|Çbš{Œ§©^@1ª ÜñX2ÂqÆ>Ír @±›À°Ti°ÎsN ºr”ЬÂÁ,àRDר`b|ÈAk$ qÈF•kÀ/ê/à”WŸ4@ˆ½¢àÍV4-ÏAá-ÏÞn˜Â§§î–‹/ÕúÚPΉ¸ŽðÀ‹HÇâÄñ \j·ü¯ƒ0lt_úÍ'J0z¢ÚOþ€»e~OÔAù Gž KW>.‘R1ÞHçL+ÏùX Wf ІáQ¤1…X¢êIAôtiìèÙYó9‘¦ª0,>/ûªÏ$U æÊRàs5ƒê Ìãƒb‰ñ˜Sl‹[†›&8¨…èŸ@PÄNN&àÜ%)\%=¶_¥·‘jR?h*]É[psZžŠ›šÞ¸›µ *9©,º ¼ãMÁŠ#”[˜IiA•³¦ËÐ ã݇ÚâÎrx@ÔѲ^BH]Ðø—éBE.‰œúS¨v¼iäЭ Aú)[ƒ›´µ÷ ×Nå’c.ýFgÈh­äûhzãŸ/·ÓPeL «BIJT¹'àšUýí¥ÁY«è%mƒŒÛ™|E1ÜOì÷ry؆ZŠšdŽ.=ÄXÜâò†\‹ÌáÑ6(Ú21¦?è¦"»Ñ2ö÷†ô™sØ«Kð°¯_ÉH^D¶ë[·–„~Ј©"Mû _GPótÑ,ý k?ò®öpK€Ë1±Û@ Rú½³0Ê“ûˆöç'þ¾æó¨>øÊÑÆñ^y’oGG˜vFÓ £wL*îöÚ¼{EIDú\Puƒ€uH€ýeªªî™ÛG]g4·þV5ZÒü¦Zó$Ðq@Ù" óé) 톡·5Û^–mˆ8‰­ÌJfEJMÔ<¼;”"ë–ÆÚ%†´TG£ëtسg¡žW¿²¼xS^ÞͦØqyä®üfÖèmº£õ ߣ;âF´0LÊQã¡0ÄÁXV°«æµÐ·æ@Æ×ÇY£EêQk@±O³V%Åg¯ L ³³Ì 4Îg¯î ë±—;ïµ-:µí.y9üeD ¾E5¸ÚøtdÅöŽ'0“ýç›j àM`‡ÇhèÏÜ‹DQþ¼±%^j±ËŒÀ×P†àóD[úýîœ~”¢eÚ½„Ú{Íø=ÂàøÂE6 Iœa@÷'ߟb‘WöÀŽ.èÇ‚œ«¤6Md¢`D>ÂõõÜ÷Û)mwqÕU’=ØQ€QgÕDÒ|u3aË0qÄ‚§¦®}·•pQ^i·Ý™ÚGbí³¹ÒÙÕQw?ÓÑž¶CõmWM¤ŸÉü®þÝž~ %4jB§Â4{y²÷?µXmoÚHþί˜CUE" wýØ”4i^tè*Ò ´UUUÑb/f¯Æëz×!\šÿ~3ã]Hš^‹ÔPðÌì3Ï<3»ËËWéŠJB<$ã°«-â/IÅØÅ3Dcôº„©î>¸*ë*kÖ´yoñ"i/Á˜m;Íê¹Hí7ÜÖçn¯ =èì,æ+hçÛúÓ»ÏmxÁ îkCw)V@ A Ù%örgq>#±Àë ýqéìý{î´†-] (‡æ®vdç™^ò9éµ0ÒãiË÷Ù3¾¤ñU²°÷/78‹7|e*—Â1J[òŒTU”àø ë×id¾½‹\]áe‹Ëw¶]u:ûT ðy[#2Q|bzˆ« 8»º¶TÝ%åÏ—EmxúÇ…R˜›*ë6)m ÕàØÄ³]Ï›Ò 0¿êNð¢ö¬Ô½2W…:«óf41FùöÔËd‹ÕKx¾a;”’¯óÿ!]hX»€P"ÜBárN®¿î6¾™âœür°…1º‡Ÿ@à‘ñ^~h¿®?ݲ_ÿjjæÓáˆØäáÏ©:„‡F%_Ös{pØñÈþe{ ë'YqŸ« üŒ wAÓeKE¿{9¶o8Û|á¿ú"WWòFk6UÑ$·Ú+ÀW‡­ÿ½XmsÛ6þî_±ÇñudW‘œÞ§ÚU'¶ï4—‘ZKM'“æ<I¨)‚%H)ºŒÿûí.¾êÅNšÓLb‰Ü}°Ø—gøée´ˆŽº§§Gp 7*àë0*Tá’…ù_ÿä/©4‰Òᕞ7‘|'5‰ŽÁ„1Ä ˜·Ê—¡‘SH4C\FÂÇ?#=KÖ"–p£ÓÕ Z—£›ÀŸ2JÒF´¥Ž­±š¤XDóXÊ¥ ÓIÉðƒá¸ÿæfh<éO•±zhÀZ% ”QÖ:¾‡B‰éTÑÒ"âƒ%Bбœ‹xJûöu´‰Õ|‘€^‡26 ázcÚÊèÆc,°[÷ºÑi¶•Ò®3g´áÑ–èœA HÉËÞz'¬½u©‘:ÈO¾Œ4 [F¡ÏÚÙîò5ÐÆ÷ˆžP AðV@ÏÊb Ò¦‹$‰Î»ÝõzÝlpGÇó®Ûb÷-zv0º~†F;_Ã@ƒÞú3U1úx²¡U¾˜ ­XS9PœhÅ:F‡ó6i—å0Ns&âÖËè6Á1ò.GÐyðúrÔµá·þø_Ã_ÇðÛåííå`Ü¿ÁðÞ Wýq8À_7p9xOšÿî®Ú Ñe¸”üÅ´ ´T‘Gå´”OÎÊ–,N&’¾š)·ÎS1—0×+s‘D2^*C¡5häÓc©N*Cª½¹*y…î¾'¨¬¼ÆZ¬ñj•eJ·+0ûç˜îbÞíò+WÛ¾4Šâ£Ál)Tá2ßî[Ã6Ý­«<H JL7,érªµ)%2ò*Û©’œe ÜFÂÜ•ï3bl?–¶íÌ\YØÁ©‡oœìí¬\Ís¹Œ’Í“+ ×–XÓFEY ’\ŠPEi Èl«µ¿xÐIiô´Êùî»]Õñ´¢ú¿ÖR [˜œßáØ_´ÀëþçÃÙ³öñûã®×.¶Ï[9ÿ/¡…Q?Éßœ»o_Sƒ[è\[3Ô.;¸lŸlÉöò-ü[ xùó¹ñ$‡÷ž{MÈâ-ÛJN ©‹=(g{×°cçÁEX¬¹ÊÃ^—} I5bq˜—,©!Ìñ`B?¸‡¹1|+!eZ|„ôE˜OçSe¢@lŠ Y ™t\³H*œ*ŸÎ³•…Ü­•椊‰ŽG¹lóeR+¡QfÍ:YC÷’Î\&·lÁÈò{c Šy¨÷Z?ýݼ8ñ SBƒr^‚>Wß>|ô°L¨É_|{f1î!™Ù’jƒ‡?¼¯kÕuD&€ƒ˜{ûu’š÷AÄ/©‡úB6¼m›þßq"Ü œ˜Ò.Í–³¡m“YE¸ƒàf –ø¿¬×»;Úå;nñ5Yêê”WN'WM±^óÂkt“³s ¾â½æ{K¾]µòîÓ·ðvP0|‹XÜѾ@a£š‡:–XA­Úη¶ne KÚœ¯)<²]í€Û8»‰º‡<Õ°×&Ï º\•}RT†.÷Ú&Ç8Ÿ³Ò†ú_¢4pÖ—ÍZÆå ¿â»OÚ±8Ûþ”E%'uš³bÎåÓÒ4Ò²]wi=M ^Þ’ÍÍÔÌ& ºÞirV«ëQ£hpϰ{åè2î ½m;(ÆW`´Tæ÷"ã>éΤÑèóÐx2A:¾ßÒ,òÛ³± #œ/7Âr§ Óv8°v øÆ^³f~¹;vöů&Ī ‡8™.ˆ*{;ȪÜ"¾Y«-Ýõ˜*³áo\¸ zû]Ï#Ç5¸½­0³…/‰ïîåæÎžË›YQwnÑ”Ð/_ý•VÛnã6}÷W ‚}°Ç*ú˜M²qã58€åd±´DËD$R%©(ÞEþ½3#Rv.ÛnÖ…gæÌœ3dξÔÛzànT)!3Ú ¥•.Ào%ÈïÙ•ÑΔr¦DiŠ%[i!+…sîVeR;™ƒ7Œ™Ö"ßÔl|+¬„Óè\xe4 §éÍðc- m,TÆv‰­Z7_”]D…•²’Ú» @*%‡_Ü­æW×°A¶„Ï•ëpH U~‹k”ƒÖØGØ`(‘çŠR‹”Æ! •…°9š™zgU±õ`Z-­Ûª󭨔ô&’q]à˜kÝ™&”rPuhÆ0•üûä7â…¯G£ÏŒ®Ä´ñÐ8¹ò9“µGºH¬ªK%tÆèP]Ÿ9~ AÌšDÁ¥€Ù.á M[ïëÓ$iÛv"˜ðÄØ"‰%&·ØÙEz}‚¤#æ^—Ò9ìÖß²ØãõD¬2±F®¥hIAŠ €,Z‹×ŘÐ.šàP¦}Ó"E,ýp¶M°FGÓæéü1Mçé¾ÎWÞݯàët¹œ.Vóëî–pu·˜ÍWó»>ÝÀtñͳ1Hl¦’ϵ¥"©¢ŽÊüÀO‘¹%èäj™©Ê°<]4¢P˜'iy*ji+åHZ‡$s´G¥<›Êô]mqJ.±Ý*ÌÓʘ’—OÁ)I"ÐýÚ]IŸâ üºlÿæCIs¦±ì©d‡ÿÞ«Rù]7ÙÜ‹·£Ï­ãi쪥ÂpHPºvMUI¿5yŒæ‘ºÇþuéG‚¿ÍñòQÎcÈ u‰^x×ñ!×ÆÔØtL‰O¢T9ZÕ5¥'OY™Iõ„†ÊÍ)E9ËL./è.I`®%^ün'“ÉGüºíïô4pé^{Ôè3gIbÞUƒé¸(ji㼩BÖ1›¥ëUè òù­Òr8z‰_2¡aÍælÂVK‹¨¸Ž&^éºñ°±˜â*;‰3ü?¼ÇÆK¤—?ø1ÀØ8tìk‡ÛkC“a¥o,MÉk]˜¢ò“f E¯äï"õ*ƒÌÊïu ¡c¨×^‘àíµûÞgŽ¿Ø+ª÷†²ÒIn}ïÃ>Êe—*õŒŒhí! ÎÛ#"áߺYãü{0ƒM£3>!ß8ë§œF¤S‚®Üô·û—tÀÉEˆ<$“†ë¥¿k·tò ÷«·Â=Pk—\Ëpççç°%nFBé=ª>ºE/ƒ·^Yö®`çr“ÒÕl¾80„ eÞ-¢“±)Ëà QU¸{¿S0¡#Dý[¿µ¦}oãéÚXͧ,ÿ/Ð­Ž—Úô„;›¡“Ÿùáß³«ÕòöâdöKjîù\ŸÐ#pÎõ aƒmsÃetØ_䂟¥Ù|ý‰Î\+hÙþG¹ë…DZQ8”îËÅàTÑn›0}ç+®òÔVY˜öØMkY›lh‘]ÕGcnÀ*ØÌ6¥YÕßµ†iR5í!ŠâøÜ{ιçúÓE[µAxvÀlDÀ•´LH!K°þâWJUc¤Ë®Ai×O[+”^3cV„tàÁQ,À*ŒZÆé+U{Û3°Q,˜ÇDéæè'jPZih”ºk‘w–ê¡"°R#ºÎf"úòÉ6‹¯Ö°'Ê_3àˆ@/lEw„^éØS)Vµf5I'â€K¦ §–«ö EYYP½Dm*ÑR¿ÌII73žÚ’ÖƒêF)3Õ£KøA…œä«÷pBh1þ»8ýèÑ ;€T:ƒÇê€Þf¢KÄš¶LrÕ½ö Ž÷c•»ÉóR@íç×€Y‡v€ÊÚö< û¾_1Ox¥tNÃr6I×ïˆô„¹•5Cnýì„&ó°–Xq–ךõn‚~P>Ä¢×ä¸,—m¦ÌÇt4m¢HÒçÈ6æg´ˆRˆÓ|‰Ò8]Â]œ}ÛÞfpívQ’Åë¶;¸Ú&×qoúµ(¹wÈïqr½$˨>µÚ‰ ¦Â9ŠÅ,O—–qN¦E.ö‚“DPÈGV‹ÂmŽÓå4˜øx&ûäÃì‹eÛÙós*Â) '§/ÿ;˜0`9E•q;<ƒo>”ødQó;¯ÿÏÁK\|~¥U_oÛ6×§8š®µõÑn×h‰kmÀr[ô© ¥“ÌY&5’Šâþî;R¤-¯Ù®Åïî÷çîòúm½©£øæ&‚˜ò !“Â0.¸(Álð¯ìN -+LTÙìP˜¤RÈòýK® *Ì'Ö†KYÅ´ÚTöçÏPhÌÁH—*©YFT¦e a*‘3x•¤Ók ¯¨@ ´ÑRÁNªâëÆÐAÕeV*D‹ERD—~¾XÍî&P Ÿ:GZn6t‡kh¥ÚBA©Xžs[šUÀ쨰d*·ü3Yï/7d+Pé ¯©ÞÊRI§Œî‡²Äu/O¥ÇÚ‹1€”ÈR~5ü ®è‚ ºðo/®Ç.zÇö ¤Fã); Ó™à°]]q&2íÙkÆÏ>‰\[/9* ‹þ5`&8°1¦ÅqÛ¶Cæ¥*ã@1~GÊÎÓÉKb>ˆ µ&µþl85¬÷ÀjB•±5a­XktF¹ ­"ÅE9°Ñ:4Aߦ“h"Qï_ Ù˜óè"Ia–^À¯I:Kði¶úmñaŸ’å2™¯f“K¸[Ìïg«ÙbNߦÌ?ÛÈßgóû IF¥ð±V–!åVQÌ{ý0Ønñ>é3^ðŒè‰²a%B)P¹a©Qí¸¶Öj™S{ì¸qM¥mè7Üì˜Ø·$÷Ö¦òc¶’²r·¾Sâ˜Q÷—(âØ‡)x¾gÿÕ„”2ŽÂ ÞVNuÖ 91æçÞ†ŸøSË•ü¶Cg·éÖËþ7Ë8r»äûÖ>y?èø.úQ—ƒ£i?ŽªÇÝMÅ‘f=5mãœr!±{Ò>ÒæÉûÉ=¼ŸÇîð©äµÔnÃ<£ “ÆN»cTÁÕ±d¾ ò?g±¼Ÿ, WãèŸ`¡=Å@`뷈õþ33ìc¾4ûš00EÂP)ÈÈ?+k ¿RŠíwY39ÁÔ$?”Åó< H¹œVÝ'!!ïdî{z"b'Üè®'Áîà€a[G ÂóÖER—²(¬9‹îÌôáôû8ÁàáSYœ°ôÏÃ>|Ž.ñé¶BÓ(’çg×Íš†ŠFdη/_œéªÉÌU€7ð®]D×ìö£iR³ \½>¿âºˆÑ>ÑXÞ¨ÑÙ[û¹ÜÑ¢´ü†–oèd·œà/<Ž=e‚0Ëñ7éÖti;þ7 Þæg¢ ­sœšÄq8þEÖQîÑè\ìPþº 9D‡èí/ÑßT]OÛ0}ϯ¸ª&ñ¡ÒL{„ È€jÕX+‘â ¹Îmê‘Ø™íºŠÿ¾{ݤtûDB©Ÿãsν×ïOªEÅûûìÃPÒh/”V:¿@ÀoòÌhg Ll^—¨ýg¡3á]Þ(S¯Œ¾x’Xñ³ðÿ¥’¨fàM`I*!鑚¹o„EššI»I:ÜZ¢£‘ÑÆBiìZŠU³šƒbÍ"·ˆ,à RÄ@?žLGg0'ýŒÏ”[ãH@£ü‚ö(±0'*‘eŠ(M/Ê „sa3¶.Mµ´*_x0F몢ó¦l%vbÜš¸;–¼.MÝZÙr݆ч"bËïoa—60¨×~íít)– ‡Úá ;`H˜ä’°²*”Ð2 [w›3Hã]Kbf\FÁ ˜ùö6¾«ÀÂûê0Ž›¦ˆ x`lwãKJvœ^ès­ tŽÒúZ+KÏ– *R%ÅŒ´¢á †B… ¥ÄuÞg´ëš`»L/¡uÉúöŠM„õ’Fi>$é(íÃíhúqr=…Ûäê*OG)L®àl2>MG“1­†Œïùi4>ïRdt>U–MRʼnb¶ÕOî–¶N®B©æJ’=×"GÈÍ#Ú0'ÚR9.­#‘µG©|h*ÇП¼ñ˜ð‡SŠû©Ú ›SÄécÛ)q,¨ûsÔqÞwSð÷5û]eußPÀí„C#õ}X×o†´hg¨á3÷¨«gd”ªæ~ÊÝŠÝURhFJQóÕŽƒZ‘ýðʲ¹Ažÿ7›8’… zþÓ}Er=êì5ÔfO´Š"š1ñß>œYž¦_€Æf˲™}AéÐíëžäÅŠò•Cà En•MôkŽ~h—ÇN0)kž4jÈÁ†Õ¢¯­†G£²ö]žU=£N€y­eßßÓEJ“TK¿ûK{ºZ1 M¨ö‡‡?€{L¸x´(vVŒ?8æÅóퟚ¥{Gáœçè9ŠNŽ£ïUQOÛ0~ϯ8U<´¨$Ûat@µh¬•Hâir’kê‘Ø™í:ÄßÓ”Ú„©Šbßwþî»ïÜÇõª¢ýýöa*K„L+'¤’ª·BÀßÙ©VV—¸Ðú›Pë‰)š •³ç÷ÖNj2–2Ce1§=vR‹Œ^‰^ºV„©nT.ÃI2}¢­ÑÚ@¥MGÀÈ´q´PvAÑŸ$ˆ>ýl¾ˆOÏaI¬ŸKÛáˆ@+ÝŠb¤…V›[XR*‘ç’%HE •'Â@ƒ…09œézmd±r […Æ®dMç-¸”dÚ“±]âþXªu­›M);UoÄÃwJÄ%ßÁ4ØìFG]‰5(í ±ø”Ð+Lt‰XU—R¨Ì£7ÕmÏ Ž7›$:åæð¥€^î†p}§VÎÕ‡QÔ¶m(<áP›"êKŒ.HÙYr~@¤{Ì•*ÑZRëW# iœ®AÔÄ*)q-EËôò ­!ÅU1f´íM°Û¦'ÑzŠTúnÉ&|“âdŸ'IœŒá:^|™_-àzry9™-âóæ—p:ŸÅ‹x>£¯)Lf7ŒüÏÎÆ€$…÷µá"ˆ©dE1ßñSÏݲ铭1“K™QyªhDPè;4~:j4•´ÜZK$s²G%7•eè«ÚxLxã„ä¾åTOsUzÄÉÝÆ)Q$Èýª(òëý¼½gÿ2!¥Œ‚~ä+CV¹$©Ë5ûwjª”gs ¢xhѰ)IêͨEÝÄúuÛ¤T?m„]^ê$ö7dBAJ£-®Æ²~T—ºÝ¹`æ>v{­<þ¯`Q•‚šü†«‹(:Tùnl´ šð‚ñ³§…£{@€Âv§Jþ$iBèãú7`DEB±²¹U1‚=ÒÕ–R·¾€Hå`OÂë'&wÝóŒ±ÁÄß’tQp§e¾Y‹ü»nRr ,•yâ?~Ð¥KÄšÌ ;bc>v䃻ò=ŒæW¹ÃÃgáƒ9g! sïaDƒg¬^Ú¦ Ïèÿ ?@OІÀèÈ“x ƒàøSðUÛnÛF}çW ² E,ú¨´IXGB‰Ta2 üd¬Èµ¹Ëî.E«†þ½3+R’·º€Aj9—sÎ\üÓûfÓáím·°B®•RIU‚Û à_ùVVW™²­Q¹lßà©+á¤Vó§~¼ÖN9 ÿ}’9*‹8íÃDÈé‘êµë„AXèV>\Géâè'Ð Ù[¨µ9b1rÕ:º¨ŽA”‘qØ)@ŠèÃ'Ë,¾›Ãš°!íÑtÒmÈFZè´ÙšB‰¢œZT ]Ô;,…)˜{®›½‘åÆî»‘ å˘JºÀØcà!-qÝë¶§rÁºc_(Sþqú\“;ú¯£›·Þ»{PÚAkñÐëLp XÝTR¨Ü{÷ìN9ãCD¯¸Ž <ÐëK3n¨Àƹf†]×M…<Õ¦ Šá'R6IçoôàóYUh-©õg+ i¼ÚƒhU.V„µWÐÊ7¡è )®Ê {Û¡ .Ëtm€HÔ/ H6ák4ŠRˆÓü¥q:¯qöëòs_£ûû(Éây Ë{¸[&ã,^&ôkQòÀž¿ÅÉÇ IF©ð©1L‚JV‹‹~0p·ôu² ær-s¢§ÊV”¥Þ¡ñƒÒ ©¥åÒZYP{ÔÒù¦²ìú 7þðäÞr¨~Ä2­+ïña×wJ êþUúûa ¾¿fÿÕ„2 †éHà~Ä¡l»"§ dUÉ’†ÆÑð“žqâyÍŠ¦V´<7­eiž ²Ú¾²FN›ãðÕ¿s¾Eá“CU¼æp² žšð’ð¹…;ƒÂѤ PØ]Õ«?0wSì†'±0¢~%\‘¼~ƒì<4vÐ{úçZ>Ñ׫¨Z„‹ÃÎRåÚJ þóÙÕ k‚–EúgÓ®¨/`ݪÜ|¤µJsÕæîúß`N†ä7>ÄQ>W\ûDÔ?øU[EÛqüöôÙR«ä¸öAÞ¼cã>ÄË0|ra/ÿ½ÄªiÝl–=ü>Œ“löÂö›ÔR¹‹´ÃYQ­¶çëÃéd%j³Ù î#–óÔòãç#fEc^¤1—ý(ïOfCfŽÃx´›h æ(w¼ê¸¶Þš¬üËa<ÁÍÑ!8ÁûwÁßT]kÛ@|ׯXLbãX¥IH¢úƒŠ,¥!Oá,­åk¤;õîdÅ-ùïÝ=K‰¡PJ ¶ðigwfg÷®nê]„£Q#XÈ!ÓÊ ©¤*Àíðg6ÕÊêgR”ºˆ6Ú¸ùK†µ“ZMÆß;™¡²˜ƒÓÕ"£G¢·®a¡• †ÀY”,†@Ñ€VÈhm ÒæXÛÈMãè vIô†}᥀ޞ†p½S;çê‹0lÛv"<á‰6EØK 勉Ëd~N¤{̽*ÑZêÖFêñæ¢&V™Ø×R´ì 7ʱh u\cFÛ~NmzoZO‘¤ŸPÛ„÷h%'ø%q2†‡8ý²ºOá!Z¯£eÏX­aºZÎâ4^-éߢå##¿ÆËÙZF¥ð¥6,‚˜Jî(æ'óÔsàié|²5fr+3’§ŠF…Þ£ñ‹Q£©¤ek-‘Ìi<*éüPY†þ¡×„_ÜR»Ÿ9U·R©Ö¥GÜî»I CAÓ_  CÞoÁ¿{ö·!¤”aÐoû*ËcA…ÆÏ€E•[¸š¦ë»ëó[)È^{òÔ:9Ï•€½(eNÊm‹æµ…AV òãï Ùæ<©÷°·wÁ¯€¦¼þŒ`jP8ÚR Ûn‡8‰Þ|ÇÌM ëŸÄÙˆ xèÈÕJTtµðO·=¢¤„ù2Ñ`rˆîo½oÐ5FÁ^˼; ý³n6ä l•yOOtµQ™&sgCqäîci5”»¸8Á}ïÌW‹É†—ð¼7×ÁoTÑnÓ0}ÏW\õi«JƒxÄ–u-DL©ÔdL{tÛÄZbÛYZ&þk7¡E „x¨ª8>÷žsî¹y¥kÅÓiSX‰+é˜BVàjüÆJZÕàrÏQ;¡$ð†Y;'„Ý ŽÒb N@¢§¿\í\Ï ÂJu²dw‘ä«K G4 $z´2Ð*sìjĶstÐ+« b‹ÒÙ9@ŽÊgë"],aGT=¾öˆ#½p5Ýzež`G¥XY ßš5 $´ˆ¬˜)½J®ôÁˆªv z‰ÆÖBS¿ÂKÉW#{,<¶%­Õ RÎTfÌà ò’ßÌ_Ã]ð Éðvrù. [v©tOÕƒÍD—ˆµºLò€ÔýìA‡"jë',Hµ;¿Ìy´ÿÔÎé·qÜ÷ýœÂseªx”ß‘³Y¾|E¤G̽lÐZrëk' y¼=ÓÄŠ³-qmXï'@,zCŽËjæÑv Áù˜N¦Iúù²…M’Ò|7Ižæ3xH‹Oëû’Í&ÉŠt™Ãz‹uv›é:£§$Ù£G~N³Û YF­p¯AL…w˳<|Z†9Y\ì'y²êX…P©g4a%4šVX?ZK$KŠG+\•õÐß´[rMv?ùRÃ2J5qý<$%Ž¥¿BÇá|Ü‚ŸÙßBH%ãhÜóH9§•ÀÓF—ž¸>üÂ3$‘Vºÿ•GlKfÜ?ü¬àÞ¡,ûfO/¢—è{tõ!úTmkÛ0þî_q„A“ÚcÛ±6KfV¨Ý•~*Š}¶µÚ’'Éq³’ÿ¾“b·.ƒQƲžÓór§ÏuQ{ÁtêÁV¼DH¤0Œ .r0þNRhYb(v¬äé¦6\Š5«pù” {ñ-Øþ¯y‚Bc F:ð¼f ="™™–)„•lDÊ,Æóh5zER EK•TGŠoC å±"°\!V(Œö"DW~½‰ÃÅ2¢mñ)×Gh¹)h×ÐJõ•biÊíѬ.h¡rD,PaÎTj'²Þ+žd+Pé‚×t^l¥D«žŒ>î%­{ÙtRª;3fðƒ YÉŸü0¦ 4꾎&ç]±=i ÑøZÐ9Lt‰XU—œ‰Ä¡;u/gÇû®ˆÜÚô€9) ³á6`¦O  0¦> ‚¶m}æûRåA/1¸&g×Ñò”H÷˜[Q¢ÖäÖ¯†+òx»V«„m‰kÉZ›  Ê5±h9.ò™Eë¾ †1½šÖS$éà dsæ„ѾΣ0šÁ]ÛÜÆp7¿¹™¯ãpÁæ›õU‡›5½­`¾¾·ÈïáújH–ÑQøT++‚˜rë(¦ƒ~ê9ØnérÒ5&<ã ÉyÃr„\îP¹ñ¨QU\Ûh5‘L©=*n\Si ýK›ûá’ì~´¥ºÁŠ¥,âr×uJ0êþE¸õ~ ÞŸÙ¿šJ^?óq¡¨Õg$"s#Ò5r.„¶à5UFç 6L·nûÑVc0:M e¶Mä»c›<“ñ8¸KŽ—ÈÙÙÃU§´›ÄþמÀKJF‘¾ç¦¢ü Št¸ùå›÷ìÑX€óÅþ¦°PÈH/©ØvÃh‹ÈíOLŒý¾þIÌ«Àv/™òÁÙgï–e´ßøê¿€šF ØIžvk{ÖÍ–’…¬‰C ¼wÅ'nã‘·ƒÐ| óÆÖ1Œ,…a¢'Ï}8±ÃÖEî`rî꼃ç]|ñþTakÛ0ýî_q„A›ÅcÛ±ÖKfV¨Ý•~*Š}v´Ú’&ÉqÓ’ÿ¾“b§£,+÷îÞ»{§Oj­‚p4 `s^!dRXÆ%Ø5>gS)Œ¬0Vñ|ÙXÕØ”éíì)Ce¹‚» ×`^ Èâ8 ˜uh÷X[«Î°mÛ ó„'R—a/1¼¦Î.’Ù{"ÝcnE…ÆP·~6\SW[`ŠXelE\+Öº úAy‹VSÇE9vhÓ›àxL¯Më)’ôãjó3D ÄɾDIœŒá.N¿.oS¸‹nn¢EÏXÞÀt¹¸ŠÓx¹ ·9D‹{‡ü/®Æ€Ô2*…OJ;Ä”»Žb~ä§žƒsK7'£0ãÏHž(V"”rƒÚï‡B]sãFkˆdNö¨¹õ¦2ú‡¶~K.©Ý.U·Y©”•G\n:§„!#÷—(ÂП÷[ðö™ýË„”2 ú¥Oך¬¼ Ë”|ƒ¬ßmx¡ªâñèØoþÜ/ÎŽìÕT¹·ì A*ÔÉÿÔYÅh&o»kh„E~~ø/x ÈÙà¼>÷ÁT#³´¶ ¶ÝR¹Lrõ3;éÃú'ñ׬gBšò»®QQP°³¶? .5ÚF ØHžwg¡ªfE“¢™¯öð@%m2{zÈ:ô¡{ÚD"ìÙÙoÁwu€“—º;ùÛ ¼w»µ› `xî3ï‚`\|~¥TQo›0~çWœòÒ&Ê`Úc;­ei¢¡U¤*tUŸ*x%6³Mi6õ¿ïì@‹4iª¶H²¹ïîû¾»ããY[·^°Xx°€ or) ã‚‹ L€?ó•Z6Ë+©¹áR$F*,ÖO9¶öè[¬ý_ò…ÆŒtذe9=Yšž)„ìDÁ,ŽÃd3:¢)Т¥‚åuÏ:*Í!#°J!îPí$ˆ.}¼M£ÕJbmñ×蹩)†kè¥z€’R±¢päY\ÐÅα@…S…œËv¯xU½@¥kÞR½ÔJI6#}H<–%­{Ù R&ª3–ðYÉü÷pL4ÞÎæ§½c{Ò@§ñ5; s˜è±]Ûp&r‡Ô½Ô ŽwC™ÙæsR@–Ó0`fì@mL{}ßûÌö¥ª‚QbpIÎÆÉú‘17¢A­É­§öC¶Ö«œeĵa½í k”bÑ+r\TK‹ÖãLÛôjÚH‘¤OÈ6æz4 ˆ’|“(YÂm”~ÙÞ¤p^_‡q­Ø^Ãj_Di´é´0¾³È¯Q|±$˨>µÊŠ ¦Ü:ŠÅdžFvZ†>és^òœä‰ªcB%Q¹íhQí¸¶­ÕD² ñØqã†J[èÚìšØçd÷ƒM5ìU*eãçä£é¯P»·àí=ûÛRÊÀWþhÅ„ˆhã ®ð-; 7˜è±CY(¡¥Gwê^Ï Ž]³ãòðRÀdÃ0ŽÑüì+çaØ4ÍLxÂ3có°—^“³›xõH÷˜[]`U‘[?keÉãÝ DI¬¤Ø×B4\A_(ßÄ¢±ä¸Î§Œ®ú&–éÍ´ž"ImÂ×h´ˆ!ŠGðuGñî£äÛö6ûÅÍÍb“D«¶7°Ün®¢$Únèm ‹Í#¿G›«) YFGá¯Ò²bªØQLýÔsànéêT•(U¦$ÉÓy-r„ÜÑúù(ÑTÅ¥­ˆdJíqPÎ7UÅп´õSrIv?qªn²c ¸ŸçèÚy?¿p}¤( .?f<­Ž|/´sÄQÐn‰êHîþ§æ0… :½ïþ¡²:Ôé0üõ[ðP·ƒÿóšù7¥Eáh”hlºAãLf÷¥›õaýziÑÕVÃѰT¿úµ¬wä?dµ–ÿøH×õo-É.Ñžïc©ýµ›Ï‡10âÛ%õªhIý-й×{Û;…ºÙÆç>ãK¼_‚?TÁn›@½ó#Ÿ’È5UiÕ„&v‹aÉF9.ËV]º»„¸Qþ½³ ÄT•¢ªËf½oæ½7oøtÑVmžpQ#p%-RÈl…€¿ø•’FÕ¸m­PrýÄÑÿ^3cV„sÐÁQ,À*‹ZÆé+U{Û3°Q,˜ÇDéæè5(‰­44J½µÈ;KõPX©”Ö¬RD_>ÙfñÕöDØá aè…­èŽ0Ð+ý{*ÅŠB¸Ö¬!é ñDPcÉtá´rÕ´(+ ª—¨M%Zê—9)éf"c†ÂS[ÒzPÝ(e¦z4c ?¨“üaõNè‚-Ƨ=ºaÊBgðXÐÛLt‰XÓÖ‚IîÑ£º×Äñ~,¢r77`^ ¨ýü0ëÐîPYÛž‡aß÷+æ ¯”.ÃIbxCÎ&éú‘ž0·²FcÈ­ŸÐäq~Ö+ÎrâZ³ÞMÐÊ€Xôš—åÒ¡Í‚ù˜Ž¦MIúüÙÆüŒQ qº€/Q§K¸‹³oÛÛ î¢Ý.J²xÂvWÛä:ÎâmBOˆ’{‡ü'×K@²ŒZáS«b*œ£XÌò4qpiçdZäb/8É“eÇJ„R=¢ö‹Ñ¢n„q£5D² x4ÂúPýKÛ´%—d÷ƒ+5®T¦Tí—cRÂQúK”aèϧ-ø÷™½B*Ó¶EÊ9­7zX}â>úðOŸDZXi){ÔÚ¿"¨\‘59­´74ÍœœÕdu­zã3O(Î,¯ÜÙ±?ml%Ü!EEcÍì&Wº)m Õªèø@!Y- ·7L—Ó|lÆRÏd|˜½¾bÙvöüœJpŠÁÉéËÿ% XN1eܯÀ7^‘ødQó¯ÿÏÁKpñ9ø TakÛ0ýî_q„A›ÅcÛ±ÖKfVˆÝ•~*Š}v´Ú’'Ëu³Òÿ¾;ÅN3£,˜HzOïÝ»ó§‹z[{þdâÁ–²DHµ²B*© °[ü•εjt‰«ÚJ­‚Ò Èvk,dcÑ`¶xJÑí̘‚¿×2EÕ`V;Š )=bÛN„¥nU&§A¼ýEZ!£µJ›½#7­¥…rÏ¢0ˆ*ÛÌbDG­’p¾€œÄ3>#]G:i·tF6Ðió9Q‰,“|µ(A*Z¨œ,„ÉØwªë‘ÅÖ‚îšf+kº/a+ñrÓ쉇kÉëN·½•#×}1¦ðˆØòÇÙ8¥ õ»£ñ¹CWbJ[h|et&¹$¬ªK)Têн»Ã¤ñ®'Ñ΄³:?>ÂIl­­Ï|¿ëº™p‚gÚþ`Ñ¿¦ÊFñâ=‰07ªÄ¦¡jýl%Å›ˆšT¥bCZKÑq‚.(פ¢3TqULÝ MpÓkщdýø•M¸ŒFA a<‚/AÆS¸ “¯«›nƒõ:ˆ’pÃj óUt&á*¢K¢;F~ £«) •Œ®Â§Ú° R*¹¢˜õÓ »¥Ï©©1•¹LÉž*ZQ ú’M%޶!‘µG%­kª†¡yã1áK*÷Sõã•h]:Äåcß)¾/¨û T¾ïÖ‡)x{fÿjB¢ô½aò¹·µ›bP¢B׌Tý}„¦ŸuNEìÇŸcmÿߋ便 ú¿ýåB‘YTÙ1ä°ç={ÔÉà¬ðgs¢±4¡výü0‰ÞüÀÔÎ`87&ÒæNh-¹õ£–†<ž­@TÄ*3âZˆ†;èå@,CŽ«|ÀhÛ…`¿M;Ó:Š$}Ù&|zQ ã¸_¢xàaœ|Þ%ðÝÞF“d|Ãô.§“«q2žNèߢÉ##¿'W@²ŒŽÂ—ʰb*ÙQÌöòÔqà´´}²¦r.S’§òZä¹^¢ñSR¡)¥åÖZ"™Qȸ1Ý"½r•0]ªÄûÂé8šœ=¢­½µ\›‰‘ËÒÑAVG‘Ä•³#€чŸÍÓ«X|öO¤­ý@%Ýšl¤…J›{XQ(‘$’S‹ ¤¢ƒÜaGƒ©0 3u±52];ЕBcײ | ¦MZ0¶ܦ%®[]6Tz¬1†ð™1åW£—pJì4hÞÎ^{ï\lAi¥Å}t@¯0Á%`y‘I¡bïݰërƯM½ä*‚ðT@¯úf \[)€µsÅEVU5ðH›4l)†·¤ì,ºyA [ŸO*CkI­¥4¤ñr ¢ T±XÖLT\A_(ß„¢2¤¸J‡ìmÛ&è—i/Z ‘¨÷ H6ák4G0ð~M£!|™.>Ì?-àËøîn<[Lo"˜ßÁÕ|v=]Lç3zšÀxö•=?Ng×C@’ŒRáCa˜!•¬(&½~j1p·4u²Ær%c¢§ÒR¤©Þ ñcR É¥åÒZ™P{äÒù¦²ìzÄÇ„_\’Ü÷ª°…Ö™÷¸Ü4†‚º?E†þ¼‚߯Ùÿ5!… ƒvöÇt“ ¦Ìjö aDŽŽTÂÂÆÏ<‰Å. îOl‡b¡`IS+Jž›Ò²4YÝ-‘ncìþV‹0ˆ3Aõû“õDX½Ð#Ð Ù[(µi9¯mD¹A,Q9;H}øÉt6>9ƒ¡gÿLÚÖ4Ò-ÉFZh´¹‚…Y&9µ(@*:(=v4˜ “1ñTW7FæKºQhìRV”oÆT’QcÛÀ!-q½ÑuGeƒu'F.)S~;x{dÀN½îmoÿ÷.Å (í ¶xÐ+Lp XYR¨Ô{wìîrÆï]=ç"‚ðT@/6Í@¸P)€¥sÕa7M3ð@›<ãsRv’œ½&ÐÁç«*ÐZRëW- i<¿QªTÌ k!® /”oBÑR\å}ö¶¡ 6Ët/Z€HÔ7 H6ákÔ&0Nzði˜Œ“>|Ï>O¿ÎàÛðâb8™Ï˜^ÀÉtr:ž§zÁpò=¿Œ'§}@’ŒRáue˜!•¬(fý0p·tu²¦r!S¢§òZä¹^¡ñSR¡)¥åÒZ™Q{”Òù¦²ìúˆ ¿8&¹¯8T7_3­ ïq¼ê:%ŽuŽ*Žýy˜‚—×ìoMH!ã(ŒþPq—µ“ ¦.Zö*aD‰Ž4ÂÂÊÏ<‰Å.3îO éP0§©5Ï "in ²ºzj‡´NëÿÕ"ŽÒBPýþa;T‡*{Ò§µˆn#ðŠðu'‰.•6\õü'¦nÁ.ܽ\2ÀŽ×–WKwÀ«äî tXŸ/Š‚Y÷¼…GäÉ ¥¼¦w;+QÔxA½‹ððÚ âíÀ°á}$ƒ®6 VZfÝYìïU=§žƒE­RçÇZÙ4³uêöž× ÿ,Áþî#PuQÀ¾OÝVН’æXø÷=¦ÒÊ»·ó½þPh•¯wYëgò¡yȬ{ïî2Éìm!zu´…i×¶ã]¸+Ú¾ÊÒ§½·•lý˜ Bë°ý0ÐÇÒ¤­ç´nx&7¼©öô<<ܪÈ] ýÖp­£¢?TÛnÚ@}÷WŒP¥DpÕǤJB ¨¨-H±“(OÑbf‹½ëî®ãЈïÌb'T¨W$dy½gæœ3—÷åª Â^/€LdŽhå„TReàVø=ieuŽóÒI­¾• §ÍæVê\ðÉø)AÿiÀ1øÿY&¨,¦à´1,EBH/]- ÂDW„ p<Œ&] W4 2Z(´Ù1rQQ2ÈwAd±@åì Bôágóx:Ã’Ø3>•v‡#µt+º#-ÔÚ¬aI¡DšJN-rŠ O„3aRžèrcd¶r k…Æ®dIùb–MZ2v¸MKZ7ºj¤ì©nÌèÃ-bÉïoá˜.0¨Ó|ítÏ<ºPÚAeñ5: w˜è±¢Ì¥P‰G7ê^rÇû&ˆ^pAx) —û×@¸¶R+çÊÓ0¬ëz <á6YØJ ?“³³h|B¤[ÌÊÑZrë[% y¼Ø€(‰U"Ä55WÐÊ7±¨ 9®²>£mÛûez5­¥HÒ÷/mÂר3Œ`uàÃ0šF}¸›Æç71Ü ¯¯‡³x:Ž`~ £ùìjOç3z›ÀpvÏÈOÓÙU,£TøTAL%;Šé^?µ¸[š:Ù¹” ÉSY%2„L?¢ñSR¢)¤åÒZ"™R{Òù¦² =ÐÆcÂ.Éî5‡jæ+Ö:÷ˆËǦSÂPP÷g¨ÂП·Sð÷5û]RÈ0hG¨@û!†ZXê ³ÞUoôÒL`N ÈÕî6`¦ï@aL}mÛúÌö¥Êƒ^bpIÎÎãé‘î1×¢D­É­Ÿ Wäñr ¬&V)[×’µ¶ƒ®QnˆE«Èq‘-Z÷C°Û¦WÓzŠ$}wÙÆ\a Q<€/aÅc¸’¯‹ënë«pžDÓW0YÌ/¢$ZÌéß ÂùE~‹æc@²ŒŽÂ§ZYÄ”[G1Û™§žƒ–®OºÆ”¯xJòDÞ°!—¨\>jT•åƒHf47n¨´…îi³1±/ÎÉî[ªKV"eéçݤ£éÏQ[ïSðþžýk©dàõ¡Hbh žÖ L ‚G›qh™Ý,IY+ÙøÄŽ)öw¤LÀ’ÂËŸÆÞðLÌÅÃÞ%òrqlþ×’ÀKKFm|×õD$ Šl÷ËïÙ£D€³Ä~F0QÈ Z¶;*åòÙãC¿¯’Ū½àCg®½BºŸv"¶Þ’Õ–°¹wìñ_O>Wh%àQò¬[ ܳn–4°jDêjÝßÓ…J‰jRsøw‚C‡ÝúàªPT…9>þ=Ø¡xðÜANK)òÍÁÛÑE˜.5ñfˆü OÜ9oãyg§ÞoTaoÓ0ýž_qª¶U¥A|Ü[èZRiɘöirkb–ØÁv–•iÿ³“t$@LšÒØ÷îÞ»w—wçMÙátÀV¢BàJZ&¤Ø¿ó…’FU¸n¬P2QQ%˜Y>rôïstÿŸGi0«<0j§Gª¶¶ca¥Z™3ã(]½¢%Ñ¡•†Z龺›ÖÒAÕgVhÄ¥5s€ѧOÖY¼X–(;|.L#°%ÅÒ÷°¥T,Ï…+Í*’jOÄ5LçN-WÍN‹¢´ :‰Ú”¢¡z™“’®F2¦O<–%­;ÕRT͘ÁJä$¿¿c p Ép;99óèší@* ­Á—쀾ÃD—ˆÕ õ\rÔíkÇÛ!‰Ú8ç€y) ¶‡aÀìè@ims†]×Í™'‰µf5¸é#{_IV£ß}ÿcX¥^'t¥àå¯ ™ïi´­–ð D>œ…þÙ´r ¶­ä>ÍÝ}ì¨^ËíñPðÄöZ<„vFÚÓÓŸB'Ù :zòèç#rcK-vÎ ÎxQHþÍV–IRÅŠbv0Ož–Ö'W¡Tk%‰žÎk‘#äæmØ m©[ëdFãQ*†Êqê+nc:å?ÎIî{.ÕnUjL2ÎÚI‰"AÓŸ£Ž¢pÞmÁ¿{ö§!¤’Q¯[ø¥”µu öƒÂÞ¢ ‡Åf;x,iCÈ$×™-c·ý …†í­¨ysjÇâ<h}ÿêîx¾2vÿ«FÔ“… ÿ~+B:{úro=õh HÁŸ!L- O.@cs@Ѭ¾¡ôcèâº'¡·¢X"ýF‹’®%þi7OT0ÛR%‚Æ!{]ÇÏù}m5<•µgQxVõŠ|…u­epwG×"µ©¥?nû BàžBH¡íÒþää—Ð~l]“wtydð"Y GO¡Ìîè7&÷apêîz»ÞÙÇÞOT]oÓ@|÷¯XE<´Uˆц4•#Õ)UŸª‹½qŽÚwÇÝ9n@ýïì^ìÔ ‘"ÜÎîÌήß_˜­‰â³³Î`!+„\+/¤’ª¿EÀïùL+§+\/µÊ¼¥£Tû;¬ª¶5ó§ÃÙ„“ðÿZæ¨àuH25"§K¦7¾a¡U†ÀÉ4[œ=¢­ÑÚB­í‰•ëÆÓ‹êDikTÞM2Ä>]®’Ù6DŸñ…th¥ßRŒtÐjûDDQH.-*Š" ´X [°ò\›½•åÖƒnZ·•†ê­XJ¶èɸCâ¾,iÝ릓2PÝ5c _(K~;y'À Qw::}е؃Ò‡/ÙC‡‰.«M%…ʺSw¬Aï»$zÍ.‚R@o†a |ïÀÖ{sÇmÛND <ѶŒ{‰ñ5u6Íæ¯‰t¹U:GÝúÖHK=^ïAb•‹5q­Dˣ‹ÖRÇU9f´ë‡`hÓKÓzŠ$}@mÁ£Ñ4ƒ$ÁÇi–dc¸KVŸ–·+¸›ÞÜLÓU2Ï`y³ez•¬’eJO ˜¦÷Œüœ¤Wc@j•Â'cY1•ÜQ,óÔsàié|rs¹‘9ÉSe#J„RïІ51hkéØZG$ Zú0TŽ¡¿iã5áƒKj÷#§êl¥u—»nRâXÐô—¨â8¼ï·àï=ûÓRÊ8êwŸg[‡-†7´ÿáÖ…mטÐ#v…§³=îþÿj‰£¼Ôÿù¼iU1Ï¢Í21ü;ƒ™EáiG(l» â$zýs?>®¿’+ê^ñ+B;Šæ¶t·‡i>XÙ…µÂÑ|ïD%¹]"‹¾± vZÝ»8\M³&‹`Ó¨<0yx /%jrr,xBjˆVEùóó_‚GLËX½“ïÆÀ¶¡kL®w :»`“—ZïB™çè9Š.>D?T]kÛ0}÷¯¸„A›Æcíhë¥ Û¨Ý–>Ù¾v´Ú’'Éq³’ÿ¾+ÅNRÂFY Ë:÷žsîÇç«jYyþ`àÁ¦¼@H¤0Œ .r0KüŒ¥Ð²ÀEe¸‘”?˜Xß³¢F=yIÐŽ,Üþ¿ó…ÆŒtð b =B™™†)„©¬EÊ,NƒpÚzER EK¥T[ŠÇµ¡ƒbX®KFBD~¾ˆfã dDÜâS®·8"Ðp³¤;\C#Õ3dŠ¥)·©Y\ÐAéˆX Âœ©ÔjNdµV<_@¥—¼¢|‘•N;2z¸KKZײn¥¨nÍÂ=²’?>Â)]° ^ûµ×¿pè’­AHµÆ}t@ç0Ñ%beUp&‡nÕírÇÇ6ˆŒmý€9) ³ÃkÀLW)€¥1Õ¹ï7M3bŽðHªÜï$úßÉÙy89#ÒæN¨5¹õ«æŠ<Ž×À*b•°˜¸¬±t…r @,EŽ‹|hѺk‚Ã2íMë(’ôà ds5ê!ÌÂ| ÂY8„‡YôuqÁCp{Ì£Ù$„Å-Œó›Y4[Ìém ÁüÑ"¿Íæ7C@²ŒRáK¥¬bÊ­£˜ôSÇÁvK[']aÂ3ž<‘×,GÈå • Uɵ-­&’)µGÉk*m¡GÚì˜Ø×d÷³ ÕŽ Uá׫¶S|ŸQ÷ç(|ßwSðþšý« )¤ïuSnˆ‰)3ÖL ù# ª.hÒIµ]Ùy‡†iÐuL"wVÖ…áUwC»EÙöÅn7@ÂÄ4Ô¬¶cUÛˆðJŠÄóÑvÙ-”ÍÿZå{IÁ¨¼ïÛ[ÄÒ H¯ïnx¯ 8¯ìoc…ÌÐ ` °9)ãŸdܺ{Ý“(Ve€­ëv·°,#¬íöí:݃šZ XIž¶g¾{VuLU‡¬‰‹òôDK“¦¦NÌéßsõv+ÉE¡qæüü ºgµ€“×zvYH‘oNvýñ¶5†@Óºo†iÌw2êAÿÂåÜxÏ»ºôþUÛnÛF}×W ² E,ú(·ITGB‰Ta2 üd¬Èµ¹Ëî.E+†þ½3+R¦£´1º€ ^æræÌ™á/ïªM5®¯p Y ¤Z9!•T9¸ ~Moµ²ºÀeå¤VɾÂÏR‚oæ)ú§vçßG™¢²˜ÓÞ}V‰”þb½v0 ]«ÌûÂå,^\Ý¢­½µR›##Wµ£Å1"ˆÜ –¨œÄˆ>|´LÂÛ9¬ 8ûgÒý@#݆l¤…F›-¬)”È2É©ERуÒaGƒ¹0לêjod¾q …ÆndEù.%^t`ì1p—–jÝëº-¥WuKÆ>S .ùçÉOpIì4l߯n¼w)ö ´ƒÚâst@Ï0Á%`eUH¡RïÝVwÊAïÛ zÅýáK½î›p]§6ÎUÓ hšf"<à‰6yЕ|$f£xþ†@w>ŸTÖ[×ÒÇ«=ˆŠP¥bEX Ñp}£¼Ecˆq•ÙÛv"è·é™´"•Þ7 Ú„ïÑpCá·YÆcø&¿/?%ðevw7‹’pÃòn—ч0 —Ý-`ݳçaôa H”Q*|¬ AH%3ŠYOOVKÛ'[a*×2¥òT^‹!×;4~@*4¥´ÜZK 3’G)•e׳ÚxLøÅ{¢{Ë¡ÚÑJ´.¼Çû]«” ¤þUøçݼ¾gÿ%B  º©Ÿ)Ð~ˆ¡l½¢N$È¢9Œ£É÷sž°:±}HÉfE3+jžšÚ21OXmÏ–Çi_þ/Á -uïuk‰P:TÙ¹ùÉbð4 IOŸk¸5(M¸…M¯L½ú S7ήû§ Œ(Ï2ÀEK*¯ŽöR¬×â87¬Š]xòM°R>’ÕÅN5Bÿ$Ï^ÄòÙû><Ç6èj£`§eÖ> üU¯H@°®Uêa><Ðþ¥¬Swù¯u;xW>Æ‘F>¬“H”¿Â¨V[E{ttszmIVé.»8oÞ²}åe$>©°ýoP¨ªÚM§ÉýŸó‡hͧ/ŒÏÒ+ú®ôrwgE-ÞÞ¼6O%?H#•ûq–ÃéŠzLŸ±éôÏÞNFO'r ­òÈ—)‡Ey$·:ÓF–Ãh ´1i9§(w¼€Y Þš¬üÅa4ÂÕÒap¼{;øí=ks7’ßó+`–*$-’²½wU{rdGëØ‰jÙe)qmÉZÕˆRs¦8¼™¡dm¬ÿ~ýÀ˜moîQ;[S3@£4ú…Fã»çë«õ7{~#ŠWÙ2Ó|U%Ù*[-Du•ŠôÓùªÌ—éÑj½©Ät™”åJc…Ÿ³iº*Ó™¨r*|¸N¦ðÏI>¯n“"¯òÍj–TY¾ƒÃ“WC¦…ÈW)ÖÎ qÜb‘]n*x±dˆ"Yiz®ªr"ÄIšøã×§G/^Š9 ‰õgYÉõÛ¬º‚2Y)nó⃘¨d6˰éd)²¼¸&D°b‘.’b†=œæë»"[\U"¿]¥Ey•­¡½SìÊÉ+…LÉ€U³Ð×»|#»bõZÆHü€°ËO&Ä `¥žüÚ>¥Ú×ÉX啨”©.ÒÓt]º€Øõz™%«)Õ–½ÓmŽ“@òKœ-‘PWD>·‹‰¤ÂÚø!®ªj½¿·w{{;IáI^,öT÷~†‘=>y9¤U_WË´,a´þk“0Æ—w"YVÓäp]&·8ƒ4QD€Åm#¾ZŒ°v©ˆÀž&3h Eèº]†-¡9ꞈ£“žøËáÉÑÉH¼;:ýéõ¯§âÝáÛ·‡Ç§G/OÄë·âÅëãŽN^Ã_¯Äáñß°æ_މ† šJ?® ì`šáˆ¦3‹žH-ržÊu:ÍæÙº·Zl’E*ùMZÐrX§ÅuVâÔ–€ä Èã:«ˆ¨J¬ôM­’ïa¸? (¹Nó|I5¾¿‘”²·—õ/€Ü“ÅÞ}R ¡û´5Ñ!D+óMA4µ÷Zõ§u«\\A/—Dþ0 ÙMºùºÒÝOŠÅ†V(N™2„‰¢ŸS¤k†”,—ùm)KÁ<¤UÊÐq\hãpËÍ%Œ0…\v‰jB\&Èu$5bU5ÖØ™Uú±‚‰O°1K¯¡NU$Øb~‹`¦ÉºÚ©³B`_(ä¿›æ³ôþÚáo?Ñ`âàßú6>U÷öÄÛt$ eËŒpX'Erâ‹ñÕÞx|•.×!àñ³BV{M¯^;êmÿª?‚ÿŒ¾Šx»<Æí†çаâ`;ÄlüŽÈˆ[ôçý‘üEåo¯Ïûû§{óòâäôíÑñ\bµY.ù×Å5˜“›ôÝ×)~(%þŽŸ¹_m#ÄqÆà—d•­7KœîHïE2Ç¿N¡Á?»Þ,«lMCS›4:´ pí«èWWIä¶NW3Zã9‘3ðôåf½_QS³,¤!gègj€ ägŒˆÇO¿©Y%PQXW¥ ˜’f˜GǧBÂ|ÒS íFCu Y×! A"Á;ÂÁr8ÏÒl¾®6×—i¡ðVµÉN¡5Èï*=LJD8¿üOPŽP¢£I h+XAš>ôWèÕÈó›5"˜(Jj¢š9DÙTL £TÒ..°ßÁ.\}õAÉhiÜw,ü3JU õ ØT {5@ùI!õ úïЙ¡u‘Ý ª½£ ¸YvN/`Ùû¬íRO·*òÅF‘ÎA]a‚Ôñ!½CÇBKWÊû&¼™Âžñ6b/EP}pÄâÿ;z@6t@s¢*WšŽhú‰öA-ÔÃ~ÈÔàaŒ÷4Þ¥dB!‰+•v(€×_娣nüzv'.Ótll¹¬£ËKàÏq<$\èÔB,ŽV3tÀ$eöºt$̈­:D ±ÍÊŸÀî–ü`¾L¢L«mQ»Ò NÒª=”=’ç¡B²x|y €´rr_–É·óZ¢Ò¿©ÂñÖ4¬°1mÂ{mµõ‹ZÃ:?ª*õ3 ‹„­¾Èâ¦ÌóçB ô,¶Ú#Kô:Yã/޼x@‹;XÓúxä_)‹Ãͦbá Üõær™MÅ|³b\/.H^›i5`XEÀgÍÜñ³ˆúq@®ƒ§~ICêCà´0T¤û@ýØߟ¾þá5º³ù© Å<™¦dô^ƒÔëåf>d¿QM 5퀤˜¹4EV© ƙ޸¿NÁrˆeÀ„„xÌ‹ò 03@°’gHöU,$_Kf³ºjrG¡P¯§šþ&âh®%´dЧR» f‹ÐWD“@S½D†nu†”j»ÿ6+î=¡E~ ÿ}™žáýýÍÊsµ ýj¤®‡ú“ì­_ºH«M± ‹£'·H§@­Ë;Û‹âu|)øÎ :\„¿N,Ó•iÉÖ ÐV-µ™ B^VwAàþYö@»;¤™.†Â)íÖŇæ#ê*;d*x«ÇC;qtƒÖ‚`2Õt“Ôì%‘O·NrQ»ôæŸÕEÞÞC§_åÙ¹ñ9ìÂôýÌéC´wÚÎÐû^¯vœBJ:sD2]‘ Ä)ÑÄ›÷¦æþâ¶ÊÓ,8UˆgdZÙò}‚Dš.rÉÒKF»Žwâf Áá^벦]\ÖÜVæ8G53+}3AÑ5ŠÚ¥c@KOgÚ˜X Xj¸ÜŸÖýR@šùwdp ÿ“j#_ó 1þ,¶©+Ñ2*ƒZÇyõ’ø¾^;ª†zŽx§X‘b¬8-è=0S3ik¬~ÁFUû'ÜÚÏé× ¬”Mp“Íq†“lp‘«â&ÏfDôÞótŒxèGÝ­ûXUL6+z(>}Š—1ša-ó¨g“á|ã&Ô‘†~Øø×£ÿùh7q÷.h=½1ÿÕûð{L¸ôâm€ÔMp?…_º‰ýê­ìé4ç Ú¹–K^Å$1~s8Å¡°œbP“\Y©¿wTîíùᵫ(Àcy7¬³[þ±‘–[¦Éìƒ9­4´eöUö=œÕ>9ÿuVî*³¤ûçg›ýO  ø•ì,÷Ïu•=»Ž£,Ë~›îýÉêœjZŒK±'ÆclH¿ÚÐ+lQ¿Jè4ÝÌ u—x‹±øjx ,¬Éwér‰ÁFaëÊê9š[ßÎöŸ?Ü=>œýýÓùÃáûOѯïÏûfÝ€Å÷â*~P}A%âVÃ*-K—û¬¡í‹kÜ”ˆÞÞߌËpwg¯7r‘ÅêÑgð˜¦É€&•£ÜÁ8ðã}ñ¾gÐxß«a.^_.€Ð°?Ü·+ð›ÊÀ×óLK)—…ÏŸ“:žÍH—ê}‹b­$˜oØG¾GãK´„THüÛù`pîkÝz¤×ëêÎÂú‰ª@2Ðÿúïúë0€ö½û×ÐÒóðå~¤Í(üx«øÐ†Zÿa¿¶>@ÿ‡ßôHÇ4æÓé¦Àð½²±ªØaèIã¶³±ÞíŒõã?k]«º[c2]ÎH–¯Ðéç-þBtu¹w‰ü³ÿEh›MÐσq¼ ßÄW韶^‡‘ÞûÐB$Ct¤šì(ͻٸ©^×ù {KÜp–¬ô‹ã:[` eÊ\L*-¸uT¨Ú»+R g¦ƒ§–wb^ä`ÀݤÅ`#Dzo]µ¬›¥ùeŽ6²„s{ïûe¬×‡/±%1H8eÛ:ñìG¯ËÝM·ÀÓØÝ\Û™cä¹Ù\Qïk_¥-fÉI@Ñ-®/« åkÐ ·8ËܬB#¨¬•À;Ÿ­|8Åe‡d ÿã)˜¹víÅ+þ`­”hUOERýµc·¢ƒóÕmÝ67'¹þˆ)Í)˜ˆB0±[¸lgú´3Ò¶îÔþogŸZÍ[st®êù}'¢íu³<‡[±d×õ×jçT!ÎAµ+ŽX¨ò{íi§—¸Lñ7 K,‹Œv¨’Ìì?Ó òfÓµ|–KCèÇOvÊ“'Q9ZKD›çîAGsÐuÝŸqøw@Æ1Úw=øDþÝÌ«&&åÎqû†LˆŽÙM±ºÿ•éºuÒÙCX7 BÕÝÊ3ÙÍåXÏceM¿Í˜&‰ÄÏÛ´–wÀ Â0q^†É0 ±½Ó›’û¿¸•™ÝÈÀ.Þ»(lþ䯆­´ã©°pª I PÜNðUø•åLW§Åd£v:ÆRãñ0ÐØüö?[ŒyÄš4HÍîšÝ`V9w:P YHò¿O;S¼kµ¤§vèêª~µN“VÍX‹[ªW<€uþnNQQ£bü´¡[»Ú$K°ÖA%;s_Žëœ‚1ÇÒ é¤ ÿ H eœVÖâÛàÞ%ƦMY`Á¯ZÏ£ 7ñDå41´‰çþŠl&ÏgÊ6yÙs´Æ­ Ï¡`ºUŠ€’ân­Éó ’埧%§›ˆÁaUa()zâçYQV& ƒR—·É]©6Ÿ.nšž¬BÆß0D{Vy”2ºã_í1‘ç|Ik2'euÈ©èñÜôÐÛ« ¯Ú-Hi5" >…GZØ™TÄB÷˜=9Ñ„4'%oÞ*:褔| Ë1 —¬}7¶\{äIMnÝÕVÑÝoY¾¤íÆmPãp¸Åf™Rë7TϨ¶5§­·°µšž¦ªF¤¹¶ÖNïÖi·†púÉ·†òÌMŽE’ –v¼4GœÚ7šetì´a(Ò*…ƒ&Kr‹+ÀÎPï,+é„jJ×-¦€žgv÷DT&¹g¶$™³o>¾É,Yº `m‰+ÁXôjдýiDzÏÁmQoSnõ2Gán¿a×;ýÚ×.N^¾ýíåÛ³>¾ïK÷¼ÿrßÄ?Ì-I~¬Ž0rŵÓþRãëwÇŠ”ÛA8>µ½ÚÛÇ9°o>Ä4Q,H>̆âè:j:•8ŽìîØøÊjS4ªðd9ˆ|-•VóK¶rP+•¡§¥€Ì£‡1ߤÄÒ(°ÚœròÈl<ÞYVÕU„A°j#«‚•†0I„ké«`ÉÓ xÆ’MŒX±D‰Ë "ÇJTЮ^P‘áØÆHÜÊ:ôO~úû&é¸ÕZJ“8Kvô½yt‘PCŠafÛhn‹èÇC5Ùæ­ïâ{OdX«aõj´ÉÎk”F(Œ@3– Ù§ƒ:t@Ÿœ ‹¦VÒ6J„§7”‚üÙzƒ/W2W®IrÚRY8Íó_’ÕŸ‚llÊÕPÒk:‚”¯–wæ„-O¯«½ø°HmÕÛu¼*?Sì7¢9Ÿ'O )kó¶@û…~kû¿d¤šÓ0u¥RSiæ¶°_ØØâ;4+7ׇ,§ùfUY¢Iɬv4!Wxz€¾3šÙ=ÛÉΉëôÇã~+ˉìZR `J/ÿ Œ«ì¶:¯ss È[@¤_õ`b–1qsC ÑÂs$Ä“‘èÿzújüç>ttÂ[ËÓTÎÚ¶Ú¶—25‹mˆ@~]Ïp*ù°)¢T~ Zð9À(Ü­v˜×øˆ¾Ð Ì:ý¾Í =v G­}ÐX™SêORªñ¢èñ2™¦ÑßûûøážÙÅC»š¤†[loéI0ml±=쬿†9¿÷Çþ—MYñ™†:=ŽÕ7ö2ºnÌ/ýÛËA%ZçtÌ…|Æ‚ÇSF7µ”l9âß~ë¬i^ÏÅî.tsúj± åïÉêKTþŒÒæøT<ޝ*ÙJÌÕCGížpÆdYSrÚÀr‘gõY½û+„º²‚g`T·Ù4Uq%#yôdÖ²Ìuä8HúëdÅ®!²blŸ‰TqõB—,_àïßûDwOàIU=<}}¯ð¶…Ò‘9õUÊ@ óö¤ýíÒÚ£Z°6‚¬HbBogê¤A> *k8~= ZG¿RÄ ®J¡휂Š_êP…YÜf˜Ã µÆ’içEèäNoó¦¾s<*Neç$*-½ˆ¨ÅØãNnJ#§Dîˆ6¨CyŒ*ëÒÇD|l;õ›ûrji_~71õ$‚KuàßcrYÖ™í51gqž£?HF³3Ô±Çn¼³Ì´áè¤pÒ¬‘Säq{‘'íE&Mejâê‚«ºgU}ðCñ¶v([v\B+<¶CQ¶®þ«Ôãü]Ùun%S_î%(0Ò׌52c3ZÉ"wiïÕ 8§—J‘‰ºèXóìãЂª š|Úá~gàŽ¤ÛœÙ+ Ò§Òƒë4Á¬ƒûÑ„0UͰŽmã¡=PJY Þ]¥ ¿Ï)û¤ù‚ú*õ?3Ñ5”;å\G2׃ äD¥¢ŸFñ»îê²æ&å&©í”""t梮“@¡SSÂ%!°¯ÿ4GLìvÛ¥¦Z2Ðh+Ô’UŸ$ô ãQó^´²\ÖJ‘­¬“ÃÙªÒ+„}:&¥瀎óI2õÍ* ï!•ð×£ÂWï¿¡3Œû@hv çžÖœþÚçD ´ß`-+˜w̳z›hߦ‘Žþб¤ ¹ý‘YDiÏ>)i“³R‚^j¼bÀREVA:¼XÑW.˜>&Á¢1ËxÔo²Dr“q_‘óÅ,•ëüúš|?¤?Ã"ûu•}Tm{j%yÎí†Ué]‡Á®GdåÍø´ ão z*êhþG° Лo§ñ%fešo4mŠˆˆh82D¯EÐÿ„S¼èêtvñ‰˜gérŽ"UàÔrp3ô¾#ñLì‰ïw<ëéH²Çª µP¡_tÀ[…t—ÖŽñÊàTûû¿§ºˆjw†Å®³';Q WÄ‚Í.ï¬%§(•ËppÄ%'†>À*cΘ‰F«8Åu|ïÏÌÑÜì‹2±¨eûˆPC°ólY¥v¼ `Úq·× R¾©0–`Nò©cžWî}Ç™-RÚéTÀ@P¿av§—I©²µJ¿‘ÃçbtÀÛžŸª)ç½ ‰tìÄ3 ‚­Í±jgüp*𳯈Ú3Áå©àD˜ÆV…0¢Ó¡ÝtÈ£ùØž\ãŽvÙEá%g¢è#YFJQIŠ‚èÂŒp?òá ž"«R¯ÖÐý³Âäщ›WõðõŠ‹k̇¥šž2Mñ˜d½Šw•ó²ÌHZ•t‚ ÿå•·²ì8a˜JJèóµLoÒ%Ε%“…dŸGšûJ•Ù>8BVÓ§ÞêS”¤RÓ^›Ì'bˆQÃ3SV˜¸5›w gÎÔ½^&w¸**ÔÚuN]ã")sðÌ©1ôR\TyUˆ Yë%¡ ‚%¨â1[?Ygì(GÀ…6TC&ÿ+G*2Ðìᑲ£ýã0|²v@‹'†Ü72dW†üѹ¥MýÊÀ9¯‰Åà]¥ ÃR£ð“h•Ñ/aaèVk•јÿF'ñI›ÕV‡ì”VÇÝš—ÕÄ2à¶zz«7ŒŠ¯ÁÌok·X­×û9ÿ³¯¿8»äÄã#Fƒ¥ùdÛ\h€öë"[d àn7ç»Pp$ßñÎ’jm ² Xh+0Féw¼Ñ¿oÕV]C#¿Ûñ‹/u7z”ZEºAzZåÛïáþ‚3OTCëz?9=s26aGé§vÝÚTê¹ÿõƘ v‹=ù ¸+Ò;Îíà¡›$["™ôš7:ì+8Äzq L|/G~/"µEÔiÏ*™˜éKHH×k¹¤ù ¸OnÙ;°ô21ÐÔÄÙê â2Ã{’> Ï&EcÊÕ¡mz™šŸÎp€›Ž:]· žl>Ñ`Ý^Tx¸ ÓßÞnµ7Z=5$ÿ«~ÓÎÀ]BÔˆûÊ£ðÔúØe{©kÀ"—ÃB~ñ¼•!“³=«hrÅGZ~òG:ü¨YT\”dzLÖÏGwŽèMÎN‘ÜvâI?¶LÓÌè3¦Îl1ɶà ¤‚Ðò’©Þ  s\.òâÎ:#9L _—ûÈÜÈg1Pfýv±í9¥ê£·cÀÀšåîr “Fì OÃ6EÈqõÖÁió“€Òv¹l<;"=s*pÞÀÓ–8°[U±.ѬáÃäÓ«kõ_¶jðá_¶êÿ9[5én«zî*`ÿô>ˆÿeÎÏÏ3 T¨qøÏI*O¢ ·· ,äYºˆ]WóhÇœ²G}4¢Æ5a`2£35ßåCìŽà?Ò&0Q †ã x2ÌsJ´È±%6çj4m È fŠGíÞnoh­YvK'ÛŒ‚Eú•’æyU"û…ÑDgÎÇÏpã<¨¼z/½»{~ö8,ÿ8zŠLk±X¹u— –)'Úu<µZ vØ«Zh5±\â˜>²ê["Vè¦cÜQð;_Õ¶Ò6Ò—-qaŸÜš%^v·Ê×eƾhãwÑ»cjÛäñ´ÈL¨óÁ%'z6|Ê–‰”Ú¼Ì ¬˜Ó<×™ —E½‚%£Qxà …a¨öÑôæš¹’Íà‰ùàÿÄüÿg1¯¢·äòýV¯š’SrêšÕœÏ£ÜIAÂMðÛlæ²ÿ $þ‚1ûO E­ ¯!ÖUå_S}pŒïöçÿ¹ú '§Á¸¢´Ôè¦2@ÁCÛâÏZ•ºˆïëh ¶ƒ\9•_Óò…Ç4 Ý9’{¿â:ù‹{µ@GÏ\.ùi¾Ü\¯ìñAÄ äÏ\ðËüXoF*¾*§ÒQìÀ÷¸ÛºôŽæú°Lçª y|ù"_¾““f!±‹÷ÅààÀºØÄd0v[°=6¾Ôÿ¯ËÛ}1±¦öDêfV‡ðýÍOo.^¾þù© c¢iÂÜÃ0~v›³Û"YÇÉs¤`9¥„¦>EÜzNá㛤 ˜^ÜGÃÀœøôÞ¯z£àmsŸXçùãî: ‚…úá‚ßo’™EXδ‰Ð7¤ ©>B½Ø˜Iò¡{.öÅ«ì£a# ŠÒ2Ï×Àz’™wôø@âÓ?˜Ç6Ÿ¬‘â—ÝÝvç›ÄºŠ<ÒXWŸ.csÖšé6¨éÓ¥Ùê³ ¶-,mA‰Q0ô#1õ­,næ?[„Å™’í«Àq£³Yâ ÷lnfEšh¥ÖŠÖÑÁl1PÚe›™ȥt#æX<$Aº/ „<9o HOä1BT°øÌìˆOÿA½2uöL–YY…èF.­‰ŠûH{®Tmž†¿I‘hA¬€¶D,Æiƒl=I@'5Ùì´Î&Z÷5ÅBÄš®‚b­_*R«ð0‹žj»1+ HxkT¨£Ú‡ŽZð®9àwoh]¶!à _dˆùÚ)а ‚쬃›IÊTU9ΫW˜ó¯=SkÞt»¼¾8QKRÖÀÚ<·ˆVʱeª¨A3o>ýfŸHÕ-›A25uÀ¨éØ8î‹T*Œ“.·x5jå->λƑ0iôᨓvòNª3§îy+ePÔ›Cæ©¥ ÏM|º'½¸(ƒyùøó¤3MǦ3œÊ9Ü C'za:_¢€ß¾PŽ|2ÈC+õžt+o  "÷`uË`D/‚cáRšz"ç)k3ebo£r Ó·;ªÈÿ[Kú´–?‡ø;1)簘â´?2Ö‘e)NÔÈ´ìø‹éÝW ÉÄàvÑ\§(ê”ÖÖŒRš˜”³½£úƳ«oáÀ£§Ô°‚6…. 'XkbìŸ2Iü6E Ú*¦_À ÝLd¶®PŠ f/ì蔵”]k*I¦VÑNM$´ã,E7¬‹nè´¢µYß”çÂL/Î5šäÑÍŒ$v¦`€î*d©” ŒUF<È+Ï5ý©°ñ3z·Ž-¯L®6è¯v«$VÆ+H¾ûN£D`ЩD}à rŸ˜²µ ­6-´|L>6‡6ofi‹û ÇKm3× ó± †dMAÔCÈ}^`^´UeØ€åÎÒS¥ƒ  …úJ™ aõÎwÏðæbºò,Œu§CÀ:™ÜŠðu5x𮨼Wñ¬#Š¡ÏÙ-[³µi.ƒDÄÀ8–ÌÉOÆ¡.Ì4f5EžI¥Uu?ßÚ8R³a®±œpzh9™¿íú Š-IˆxM§§äE äðÄUð¸0ÛŸÕ~ú„)Vú.vu\¥·µÐ;ëÓ˾L ©$w:ø®/ó6hNõÅBÓÏX‹öÅx·§55¸=¨`×À—±¶ô˜N‚ËåmyxÓïî§{y£ÓïøûžŸàKI/?ARCæ2Ÿüob'Xâ» ­`ξzü¹è÷ú€ F¡?Åoý AÖ…{É ðƒZÀt›{×Qpõ1£û:mµ¹ Hnêeüj —ï˜Ó=ë…º$>5÷_44}t|Ú©]àG[4Áµü§jàÀ"t’äÙ©Šikçf–BâÄð"•.Êø˜:ërÍì|ߦÝóç|‡á¿H mgü3àÁ@='/êį”Cw^FéÝc§j8­,­wìÐñÎRfí©Í6`3ù_’¬TÝ^¡pÕÛáÉòy NU€Òï® N–„éé¿Î{Ocôä³r]ã[œRê6§Ê—*E—±L{+ótÚZwWa˜°U8yÞm(áƒu§RZç%ûz¥ÊX sû\°Ý’­…é`ÿW&[;úŸM¶ŒÒ?!Ùš“k 5¹,ÔÙ$±L&a¶«]?ÛÕîî9ï.ÚlàÈ1_”j;bëxãß5ùê¸AÄ„rßÛ˜çú*ï5©Å5x´(ºAc3º©x«Î‰ÌÈDfPGïyÉœ³ÏxSlW<ò…:jæ˜<|•²—¸Ù…Ôa• ŒáP›­,’hL.p}kš½ G.reZH(ñÞºù£HcoÚ>¾ÞÚ&& Ä«­X>âþÇýôWêžÒÜ)íå+sÁ¨ßJY)?³*®í!Í5>Ò#™7^­Yù‚¯ãIJޒs³èÅÔø ü±D*O«þQª1lÁï5 WG´ÆhB¡yÔd8œ^Ï}÷àkLNTèpÂyÛ…Ùi(Q¨5.5b”Ïe²æeþ‘–+åJчÝÅ÷ nlã™u–dœ”À‹aÍ‹J§éB †v^w€ê§%ª¾4\OÖ JkÕ“3Äùyjþ íX9 9+2tW‰›Õ,+=y»¦Õžµå±>r$ãe|9ä¤ûƒ8Û Of/­Œ–êtöˆcªÙ5KÆLªƒb)%¦ÊùC~íhBж\¼!244^g¾*f{hMÓÑoËÀŒˆæ-2=vѦô­^¸‘ Sß%É¥Ú& èCØmvq=AŸ#Çþxðñ¯,“Ò¾HE&Ÿ—yHe+5ýp»€õ=¯SP¹u£Åã@ð‰ñ9µlQøEUšñ¸G«Ë]±€ªÇ/ŽÒ߇“󕈶/ÕÁÉ?wÐCHh¢ †Š™‘ŒVW⯴-…ç«'~§zb3иšZT±úñp‘NÛ‘êºËŸr2âmg¢Iu&ĺëÍÝħiÍÔjÔ€Aƒ:m?áÜ©'2Öú\±ù4Ò§“m¯o¨ù¯iº9=#ëª<¯Ç£I E®f®ï•ÓI}é-øÅ?(>~!1ć,ä £¾ÝÜn;¯!‚¸ˆÐóÜl¥þÄFXÚFZ,øYà›¸·]˘ùW:©;›tJg%ú•úGnHË)^pià2ÌÖ éP‡õ4ç¯~U©oÂÚæmóI|ã™cSb•nÊÏÌZÎîNÉHÌú~‰gÑÊ|š%ÆO]·_¡b.ìù­rha°(]þÅí¥ Ùãæ4<ÏDy=Õgç¦{ËDÁQWh±˜MÁ°r9ÔßY²âÍK˜Òl&SC€ýíçÔôí7ûž(ÚÐíÇ «X±òC¶æK߀Ѫö¬v?vx–ú%áÉÎa(·ü)MõÒK™â,÷ÔH`ß”´ÂìNµ!gV x“d™ìDiÝãÞˆ€ »IñäE¥PK³_™²¸Âcò~;d/nøŸï Óž ËTøÓ¾Þh"^¯h«oq”^ú‡¾ƒ@EVEcG`&â”n=¼`²w?Ð@‚ˆBø|³dm è}2ô…7Ëío ڌΓ1±^ŒA$¾v»ØÙ^h1ÓGÄð Ü!œõÞ÷χƒÉÃáûÇ;´[ôþ îQB8‘Ѐmc$ž„Ê5&Ø'DÎÿã|—0à¶Ås^„ûuö0/`ÖÙ2àAyéÏψàÝê|ÐÉz™Ùé‘ßH¯¤L¥jŸ/ ]lö&63_¿f9Ræ¿^äòÂG>‡q€gl8•ú˜x9N\ 5LŒ[âøN’‹:^£ Õùä¼5ÜÑ7ãM®A¯ºÞD÷Ï`ì¢%†ú­¥º…R‡½ËÄK½ýQ¶Çã÷·»ïÎþ.Î÷2ÿê¡ð-Ú±&ÇšB€e\ɲöÎ)ŠþÝòH<ñ—7[o8ïÓÔRZiSI‚‹¸’ï¿yþì›ÿåYmo"Gþί¨ +Â+rùè]6&»öJ¯ ÉjEV34ÐçazvºÇ˜ìò߯ª_˜žÞlKÑI‡dcfªª«žzêeðÛŸÒEÚè¾zÕ€Wp-b‘L4‰Hæ ø_Ñ{™(ó~6Ï—<ÑÅL©*ί"â‰âSÐÒÈ÷SáÛHÎôŠe®ežL™2Vt}ø‘g NÚ2ƒ¥Ìì¡™˜ä/ÄÖ"°yÆ9¨:#ÎùáÍxðþ fè)éO…²zèÀJèÊ+™Ýà M±éTÐÑ,‘à…¥q„3>gÙ”‚ŒdºÎÄ|¡A®ž©…Hñ¼1…2ºöÎ(kØ‹±®eîB ¢v`´áw4D!ÿØùZ(@JMw·yþÆh/Ù©!W¼°ü1â©Fwѱe –DFÛE·=}üìŒÈ % ˜ ä,¦I›~Z§Ýîjµê0ãpGfó®±û+";]½F§½ÎoIÌ•B´¾ä"CŒ'k`)z± ú³eÐ$ʽXeˆx2o“¶ò$ÓT€æ]ÄÐC„™5û#Œšðs4µáÓ`ü¯›ßÆð©{ÛŽW#¸¹…÷7ÃñàfˆŸ®¡?üLš¿ †ÚÀ2<Š?¦ž B”O>yˆ-.O*员‰ÃKæ9›s˜Ëž™ŠHy¶ŠR«ÐÉ)Òc)´!•"ÕZl¾J.î{2åji,el4.Sº]†ìŸ#ÝÙ¼Û5·|!œž¶C<4&‰bJæ™áT·á | Ð1ù„Õ!† ÌßD«hdu:Ö ¦Ò* åï7  JS©…l"s]²ªò "Š4peÆ@-x{Ö‘Všìç®ëLù O0Ç¡g• •A`—¬MøŒÎOBâšþÍ–\£{D?¼H9u>Û2qñ€=°87ô`3”GVO±-m‘’“ÿðˆÂL˜SªtíhïÙSÜÁJ¦¾bŠ“ûÈ« ¬"ZP˜[sF£$i®/.Î|ˆÓí6_¾—i&‘²zíã;K0^0/ʹù䨿ŪÿΕF¸ÎâKnS[Xî™^§ÎŒ³dàºÜÙs²ZÈ ‰SèƒùÌÍõ>•X&s#„*ôw¡ñº¬0Ár‚³%£I#³5úôiÁMñ‡š[™JTKñˆ Ÿ!—XkŠªþƒ‰­ bfÚõ> ÎTilÀÙ鋨¿£#^ÐXWec¯3ΦÞ' m2¯Ï2¹ÜIâ6V¾Ù–¿ÿU#Ÿ#úa»lo:Oì\¦mu¶ÔIÝøÚ sMË¡×+øhÃ8^ý%ÿ~ùÀp°d[»+]óŽÎi,4‚%-”{V²Õð±5‰ØMûwï$y·‹›ÄÒâf €ñçWw£ñí`øÏ@iKß&)5‡Ò’‘=0Ó0ì4aOܦ9¡‰¹Ë̘Kœ–-9¡Zì´³åš9TgHÃà¦c=dÆbÞuämîDÀ©Y‡çüM£š£÷HE3HøÊwû` ˜Æ×y’tÛ5·p°Q––+k§:eÌ(úm¥Ñ*œé|K“ºªf§Ú]’·zíº¤é|E§Â5b_!<ÚÐ`Ùë_(?Ž78àfðRÛ²3n טÔn´Þ\+è{=Kƒó60œ™3ÇreÆZ 7*ט-5ÎÓ8öõe’%p}¡ ÌÑÆñ*;µÒ4 ç…¥dꔑ²óì#3e§ÎÁ¡RÒxÞTÙeâùC¡díyCʙȸγ¤˜–[j>ÁÍ fy™ì€½&ÒEC ²Ü«4“ q½›i·Þ‘V¤«÷üFZ*‘r ’Ó«6Ñiµm’æ÷×­Bނ³ k9°ÎáÛ7"]Ì“âÒ[¬ëó­faƒ^z‘ɕ雈âÏLñß)¥WæyÓrS­mµq$¹q'̱‘½ƒšÔÁ½½M"„èõ»bbþaMý‰ac®í²¥jôÙ5©~S-’Šn¯Ö䋌†òþjM<¬¿B|{µ.[ ï®Öăb ÄÝU+½© ÅEÿ·Å«Ô±6éGÆÐ’ùí üjµW5 ÿUtغn½ÌáRÌœ”GªCi•ÝlWÏ®2_áÅqZQÛKð9íH|QºA¯û=Æ·ÜA)Tü<®rqq{Õÿ–‡Mpe¹³ÃQ³&Ö5å^æ»Þ¾Ö‡ó¾ÿþtyÛ*wC¹µjÏ8˜Ðã=Ä¿6§ÃV,Ê;în7ã=À†m´B>èõ\‡þ»áy)$Å¿ ’í¿Z#þ7!O^ ‡49@ÜLYv0b,*´Ï}Gäv ó¿4ãelTô=$ÿRí3Üÿ †n¾É…ÎI ̼¶Àì^Õq30’6A…½Ë‹sûXZwQáÅÌ:@ ÌsVГ’d_Çø¼ä¿ÏÉ·AÒÃìJÐP¨U<1e>“æ|1mêîž¯ïø£PZÕ[F55|àOïÿíYmoÛ6þî_Áýàt®½ícº´uó²ëœ!vVEQÐ-s‘I¤¢x[þûîø"Ë–åÚÉZlÀ´±-ÞÛswÏ‘Ò÷/³yÖê?}Ú"OÉO‰¤0” .b挰?¢S)´LÙ@%ù‚ £aIš²Èp)H”R­{ ŒòoxÄ„f11ÒÊ2ÁŸ±œ™‚*F.d.bjå:ƒñůL)JKER9Ÿæ~HFBŘ5Þ#d̘U?ºœ OÏÉ ¼Fù˜k'ÜÌa פê†Ì@cަiJ¸€ÖT,¡*Æ€#™-Oæ†ÈB0¥ç<{ e|œÑNq0 ±.eîC©DíÁè’_A†ü]ïÒ(ÔöwÛGÏ­ô‚.‰†äš­´v±Ì€»àØ"K9‘•öÑ•6ÀÇw^‰œbòµ¡9«.#Ô 4þ#dnLvÜïEÑ£ÖážTI?„ØÈŽÆçÏÀé s-R¦5 õ{Î`<]šW‚¯)-0ƒ6Q¶À‹Bâ"颴EPMÓ ´à"„^]°Q›£ö`L†ã6y=Ç]òv8ùñòzBÞ®®£Éð|L.¯Èéåèl8^ŽàیޡäOÃÑY—0€ L±»Laà)GDY\©§àV‹Ï“ÎXÄg<‚ðD’Ó„‘DÞ2e»#cjÁ5¦Vƒ“1”Ç‚Ek±….ypß *ßW)S+ñêÖWJ¿O¡ú(wšôûöVh„ýÓ¶«­J,1-sekªß $pºÑÜŽ: @¥ýË ¯±ã!Û‚“⦲t(²ÜÜ÷Bý· ºßrö·1&Ïñ(E—ƒ(‚´vÉÐ0E8º`$ø 2[¶ Ü‰¯§äRAf&LlÔöHXþ¾º¥PÓh¡SwãȯêÛ¿™’½O¤7pâEž·6}ÑÅÁ`[ˆääÅžkf‡WÌä ˜;¦Hø-àÑL3Íî!¹»¥ä¥3sc›fT™@0•@%@f4bH4MeA¨»ã¦BPƒ€:yP抉Pë7¤ ØSÎíù•¦<ö^Áï@"h$ªFú:€àp†¢~z ¤wQ«b3”ñÓ)“Ú¬]ü»€>ú ˜X^ï†l™0‚#âÀfÙ«eP¢ ²àw¶.®8OüGP=Ý”‚¯”M™Bs‰Ê)æÌù·–•.‘HhG¾¢©e— Óf®daÛç5Õ 0ÌÙ¹(vì¹EáºtÉ,¼g/\‡@gÔ•ûx£=0Á†þ˜Íhžšºb›3À¼Øž¶i;íîÊ”ÁÎ4aÚU[÷-÷S×Û ž#ÒÕ¦¢Ê+>ú¿ûÜýNÇ_Á§Ch Nõ~Å¿°Ë`æ‹¶8ÔJ|×Ö,ÖÑ{¯òÚÎíºÃåq®’A©æyMâ¾öËT1zsy|¿=Í<Öó/KK[ÿâ{i$=-Vl”ó¼ÕÆØIÿF wÈ¥ÚJ±Ó<¨Z3vºîdQZ°{ã®û샰ÎÁ ‘.C0£t=ÁÒÛõk¡ÀO„¥ÃðKoCÑ–C“[,«ˆ®P#¼al2U£½[É?”è(ð×j¬˜._×Ô…‡*]ñµ¹ƒPRc‚ç+YÜo3ºÙ …¾Œ—Wï R¬`ÝZíØ}vF‹Ôi.Q_a°‹ÕÇVï†|n²{¿OΘÁó°`XkXõˆzÐÉ5¢ñÒþþEz½ÞŠä,†â;99!"OÓÆP.„öÓ]§¶Ë²*¾!/áß1YлÎj‹¦·¬>"_“o«´T ÙÄ7ºí(Û]áÑR¨+ ‡^ç+®?raö™pâÕf6­O[£ÊlÕ­ÛAÕ 9åB|ÀU¼¥‘ö˜cõ9tÀ@[ƒb”æ!bÇÇ—WgçWçg›óu]bÕ0ÍŸ½‘2ÛR„Ÿz^°=ëÞÎf¢½¶p»áiÖîPqè‰àŸŠz[Ësûă‰¹rï-º¤˜sØþp]² ›ÁÎÔj´4ÑôÀ3wس !( +à½;A`šÇ[{ƒ=ˆoq¿æ|µüŠï63i?x»3+°ñ5• Oü+$þY‹ ]h ØÞ; ¼ .âÝϸÒÍ‘€•u³2°ç)Ð%fh7/Üh©Ѩ€¦Ø"jFíŸ,–ox|/Vžjäk?|Q± «¼)ÿfŽ!_­æÃ>|“ojOú•nåÅZ“ÿüSiOšM¹ýܽo½|Ñú½ZësÛ6ÿî¿§q+)Õ£É}¹qb9nb·žëÙ7–ÒNÇãÉ@$ñB‘:€”ê¶þßowñ Á‡$;É1“±HûÂb÷‡]¾9[/×GÃ/ŽØ vF‚Iœò0ãK—‚‰?‚wI¬’H\Åë,§<žq9ûIDëE,$OÉ‚ˆ+5Håç0±3–&Dá|Íø3Næé–KÁ.“ H¤a³Îùø²ËàVH–ÄgµU"µ2œfH>Ò_H!V"NÕ€±±Dþúfrõî‚ÍAvœ? •žlÃt cBŶ‰üÄæ@ŠÏf!²æ cx°"Ap¢ Ð Õ’õƒ Ë”%[ÐP-Ã5ð› *ãK+ŒÒ„-[Ðõ!ÉŒ*­1zì „*¿|Ï:0'µÌÛV÷5Í^ñ')˔ȩ3ñ{ Ö)ˆ ‚­ÖQÈã€fíñ7C$™â2Nª°d^Æxгñ?cË4]Ÿ ‡ÛívÀIàA"C«âðg°ìõø¢BÛ9âH(ÖúoJ°ñôñ5Hð)Èñ-® -9H±•`ñxÑÃÙÊ:Aq™r£YAõâ0§5jÙÕ¸Å~8_{ì׫ÉO7&ì×óÛÛóëÉÕŘÝܲw7×ï¯&W7×pwÉίÙÿ¼º~ßcL¬Äïk‰J€¤!ZTÌ þde@o1ë¤Ö"çaêÅ‹Œ/[$!i¬…\… —V3pU˜’S)œZÑÍî’·`îOHÊì®I’D4ãíÆxÊpÈÁûàî|1Ò+»_¶]~H$ÑÅT’Iò©¡v›³%ìs¶pò'ˆ*†G«XíTäÈUÓTXì›ËdE†R)—é3ÌD6¢W<py×2Üð”Vðíäæý êÎÀ'S!ç<´`+þ .eël DŸ•bá[fãÐ+pe½iðÚa„á…ÃÃ"'úŸiåñÞ¸£?+­^/þ¤fŸÚ¿o7\– šwCúklÃŽC|õú¨Lþð\šÅb[ò‚tÈX»Ø"܈ذTÄ]sÉWeÍh_n½Jó,hQ>~„D‘" ÒNÃ|Ö¥™Ú‚xclíôËSg|õX1„YP+$ thÎVY”†³–Pé´Â¥äeM0š¯DºLfÖ6d°”O³–j‚å€$ZªÂâ7w¦ZËd¶P>’"Íd ’˜²%WDažDQ²Åè¤-“IqRèMÌÄÈÝ 07D«cïØ÷ìtT~†=o¿IÖ$£Z&2F ðŒùJŒÚ=oðKo0jØc3±1%\£ø1M'W°CGmG¢›S{y¸8Z6döéÿA¼á ο»¯í¯³ÜÖâéíÓ ˆÒL&[›¬õ‚B$‚DEÑ¡Ö3Ñ0BBîÕÒr—G¥JY ¢H;20øNS4£MXÃThÓõ´­€¼%7MÒe·§´3MÖ£Fò¥â÷Ôjá‹T”¬ä¹°;2¥ÑDSŽ@]gá|.$Ø#ß™\'óœÚ— æwŽaUK t òYÊPl(ØKÀ)éR&Ùb©“¼ž\Ïûäd!(wºf÷@W"j73µo$4AxôèxîaD£‘[¾'+ì ‚ƒétåf/‘·³ÙÀàR·>ÎÍÛÏÄ<Œ!d…za­wè}VYwKI¯¿ÂaY«+ô*‡qÅÌDß-(ÈYZdžRP¬\@ë;”¹4©Î8ÆV‰ÀkÀÃB2¶DU6í+Aròv•¢W+ÀŸŠvMl|~kuñDb# ±Ôr—WûQ6MÙn PÆX·ôF‡7T%^tKŠ»¡ÚTf¬7£»3cZ³|ˆà,k1»!òäßFœS6ç‚E­xÉò§,Î`Å*Y•¬|j²‘.ظ£[ÇK¼ý8¡f­:]Ì¥Ç! ktÝüœ^à€ŠD§F¦¿þ£ÔBý‘ h¥9ÝúÁ¨ÍØ®'ƒ/‘SþîÑ„ÖÑ)‡v½M¶Æ´=§ÞkÆãQõ—Y`"ýeÑI™¥§C%L_$Õ.Ð2K¾6 Ž7XÀ½MÙåO[¨:÷¦3=‡Œd*OS}òïéó®a¦5WùÖ££îKGÇ)D¥£ ej³ù 2&EÅ(¤Ó0UˆŽž n)u; ¥´Ê t‚6/èmRJ™‡éi€8[MQ5WzN¸•.-A&ÑþÕœ¶kEvc>I OûÀó_ûÓSƒ¥]«æ¹{w(:Äë3!^ÝPw¸x‡£Å¯#®‹o]f ÏE¥“ª= ,à¶íþÂK±NR@hPH©:ŠÑÖ3`ÁÇ$†2®€÷Ÿ)é9x“?dÇsé-!]`‚cþn¤”ñ(‚H5/~a¦ˆ"°X°@‡É¦—£œ8zpúD€t`˜¹ !)iL½-ì! ÏhPLç§#?¹Û8ö\4aLX#|–>ãÃ`ÅUPaP„»÷µ1†‰ò(èç5žmWÐAð¢LÈŽGrZD¢·˜ÀpÚ„y:>¹× OÀ9zС@ÇŽ>éÔkç–â.7ñýNôSK‚ÈͯµxµïkŒöxT÷@U_ƒT•+]\.2,ì½GpÖŸƒw…jû9«œl¨É AŸ‹ öT¬L=ÄÉÎN 7ΟUåùÒìJùq_zdù VòcýIy^9)çGbKŒ²]i*Áý‹ÿÎijÎ}‡‡]¤¼WãŒ;õ¹O¯¦b -ŒÃðx†Acã yëÍ7êä5jUc†‚Ã…æ Sú£ôa]ïõ𠸪tHON&¿ýûâãÕõä¤9¬ *5"Ùk fùTÿzçñäöêúǘky:ÿÇ}ÖVT›šw¼ç=͸gì7ä½ü$í¼Ü'•YݪØë̸&kQ–²9娑:C’çœw¬°‡“"G©ônÙI©VØ6ëè¼Æ£v8D©%ß/O¥\Ï &šð)ÓìBåЀǸû%86ˆÑj·€7¶» và–µ[½ ÿûZRœuãWãÕ쪇_'¬Ýþ|ñЦínû©tùÓæìR¹ùÝ +xb!TÐ*QΤø…Êe¶SùRç`l‡è¶‹$¤âÚªvú­­KÙ–‹~¡dÿÜÁ¸]ï`oŽon‹jŠæ W†:œûÉßty Ù¿¡,ÙÀ£<Øá{g©âJa¬ÕÂÔǰã¿§dCø‚CÈGûÞ¨ê±À&uÏ|‚ä%'Þt*Ê8Ýýh?—Y­ôG±pØÒ­¬õ a¡É΢iÔ;jz™€ O©X *´-)‡)áñ†‡6{zígaÀSó}V(7ò…¨¯^XJ®ˆÑÓÅŠ"GLĦ%ÚÊJǯÊl¸ yœvd¶®a:yGÇ(ÙàâOékÔys”µa£ã×ö”nÛÓ½…¶¬MŠ lÝk£ ŠŠÑè˜ã KšF*S ïT‰ÚÇ.÷*‘êp·Çÿö[ˆ%ˆdž?Á)çLßÝ}Nýq|qûËÅí]Ÿµïñ)mÖ~F—ÅT&é¯<§ìP¬:ì-;Þ_q¦¸"C@Á\+—»€¡Üó¸ç­ÓÉä°ƒÍ龃 œ+oà·„]9o®S©Åîîúý{†'V5º/`ò\&a¯O‹(!Úò e|ÊÙª[ÇŦQK±)lÚ\XÜö6¶Õ|– «§ìt‘\ÄÁž†“ëateóõ‹ãØsßæÁúêÌ-5ÛëuaT·ý “*ܘÆg3U¨Þânæê!¦eõ Ô€‘é’EæÚÇ.ð ÓØ®´¨ ´TйÒT×|Ðífl†Û2æì»ÁSXÃÙÄ\»º#W\‚ö¹7I8£º8hÃc»é6 DW‹øw9«m„¹2=}„¤P_e#¼!åVñÁé'¹HD¡éÀçÈåU>VíÿÌâÃÑ\“\†š{}ž)FúsÛÊ'#Vú?ªL αìX/xíõ.“Ի˭@ƒs2^:ÓÞá㊰Б´ÓÐ[}Äk2Y}[ŠZSÈ/•lXLUmó9 íø!û«f ñ?EØC»?òU)h“テ4ö s@gWÊ(ˆwgRï½NŠÍ™Ã›C©§à¿úÐ…WmÖwuåÚ“íuà Í&gàÃ:^^ÎòÈçØ¸ÕÿÓõØBLÜ/glÒÞטlO–²¿Ì¦Ï{ ;…mèj„bÎFGÿíksÛ6ò»êÉÔvF–Ú~Tê$nâ\5ב3¶ÛN§ÓñP"$ñL‘:‚´¢Kýßow‚”üHÚÌ;m#»Ø7v`¾µZ¬öÏŸï±çì]’r6ͳ2J²$›³rÁÿÏôMž‰<åç«2É36M#!ú0!~J¦<†_ïØéø7„üçhü¶Ç8ˆ –âV2”&(Q[ö¤i@kQz+>MfÉØËæU4çlžßò‚üaÅ‹e"PµˆŒÁ<–IIF%´Á›ö’× îD¥<é*ÏS‚x}«,e0ˆÀúç`îÑ|0 !í»«­Ë %š˜È«‚lj°§Ýþ|ò/>-…´Py8%º&8oÄ¢I^•`a„ŠÏe @¡™è0ÊVU©¾2h ŽòG?6À¶—R~™ÆÖcëE2]°i”± 0 é´8ò8'ÑR*YK›æYºa«ªXåÒ°ù@Ùç3iÑ’— +ä®GïhAÔ1AR$UóŠ¢Ù)Ä-$I™Šdð#h*»ñÉ»ëk'z½*r0œrs\ð(fhé°Ì3±È‹R:¦ó\â{–Ú— ¹PÇìÏûì`vpÔïX$ͳy`ŸàõÖ%Ì`5þ2àë%{VnVÜEÿK”VàZ𾶦wÅ|Ui‰¢ôÄ5^ýöþìz|>>ë»ÑUÃ"¶`îz.P'Àh|u‡º½ÈåÕÅhü;OËä˜è3Å•‹î­bõ–’øb ˆjÑCo](sš Ñi4c‘‹ÍD¥ pQÈ]ä6yÄ€ÈgèÖÉå#EàzÁÑïÐhjºz,)i‡™xJnR®ÑÇ@ Ãv¥àŒs^ë±-Œ¸€Éód A„©d^lZèp½¤ždÁŽ"x)]K&[i4§ ¢¨x¯á$¦e%J76œð[µÑk^UQeAñ%âG¬Lžw¢<’J•»PÍAçö /{¨€z?[FÅ 0Ù ú÷M²ZPê2Ø“£_9ì}ÜCì”tàóbÌÙ"Oc-S”_Â…š§§¿¾ÐÜŠhs(=ãä%…à#5a@ÿðbFfƒéÅž¿ö[¾â¯eÓ h. E‰¾žZ¯/x³¡Ì0ȶÌ.ø¼ý‹HÜc6ÄÛz6ð½9¢ ¢CìÏ{’ÖÄuRlÕDl­ÀN¶£¦VÎ>LÓŠlêñJ©qí¨“ÝçƒJvŸ ©'ï¨Ðü§Ô¯ñwé‹`¹­{)"ðïdžÉ²/”;Ôjú‚‡œ~¥˜’g1ä%”X [¹ÇDj<ôØ^„@m0ÈFâ$&l‹è–ëÔ¤&h„õ%ÔÉy§–I²è‰Š„[ ÅzÔQEWÀÕª2öLÊìD²ÜëÈÐK¤+ãk‹Pf5-ûî,¡¦M"˜ýɦ+ãÜîq°}™µìkt‡ÄW{iqD©Û>eûr6þ‘©ÔÇvƒF&°–­ª…„…MCå-‚Ú T‹XTªËÜ ìßOó˜¿Ô¿ž2 rî{È!Ö<=U”0°Zb`ãÐo× làRTtdÎF[.¢RW›ÑÒDìbUX úêö¨cËM‰ûñ¬{í¼Øѱl,…±¾‡ä‚Ÿ’…ÄKªs§Êà¤<ì;R·,eyõµ´{-*UßEå ÔÅA8']'哬”æ!}HVU Ë×î¹È©Û¤Ð j‘TUq ^Y@øI7Mw’úvÒmzP-ÄI¶,ŸÖ¾Úºøeõã¾Þ>;Ïèm¸X{îcwËJs«I—jÌ›V˜Nõ‘ºu|þe.h…¿zz™€µ ·®š5Q‡:$€_Äxroòcím^Ná§s÷Âdí‡ÌOA‚4E3y¼¨0""‡N×HÕ@¡H¹]‹²ê$ÝZ#\Dé:ÚˆmÚ·+ØÍVÉ}žÜ…¡ZD£ktµ‚½ »~q 踦 >½A1"¬¬EØa­íÍ V×`;®ZˆG~$}].Š|ív¢À¿’X h B8£n°…²¯OgÃ!9Dã ‡Ú´Žý.øCyY[»O„†ð»Ýd" Øî,P"ð„H|;2PëŠÀä+˜ëkˆ˜‡lt¿§‡ìtã«é‹ì•=0ìðgfSé­£½×rS{30TÕ\J2ˆz'“qPš¡|׎°'€ÒÎ8\„f` : è DB°w30|T¬² ±­¯à9ñ^Õ”|ý5¬w-C•7çH Öz34%¾^ ϰð¡víþ¡dæv¼HÈ kNŒµµðdÍ Ž¬ßÝüX‘ø¹7¦›£ lfZÝFÇ~é£Ö^à¸MýV»M» Ú;Ú¹³ƒØHï]£ãpǪ`’(yA"ÐW£óÔ‚ÏoëDì¦×¦ó`U9#áņôT“® •wŠç’ƒ8–x’RÖ誰„TÒ!PfÜggf7}îµe ‡¹o›û'&yÅ&•Ev#û“‰q¨ `Ï?VÚôÉ…I© ^VEÆnó$Øÿ©4ÏK:–òËœ¥4œ”1^ئqÓV(ÑŸœ„š@øHö^8ïï¾ íwÚÜpMmŠø_ß/¨ÛêhG zVäË.›D0Ôª¬S‚ =䌊Ø}·K[Óç T)[–Ø4fy'þ¸Èc†™mVÚÒËØÑ¬‘äêÖÕ8GxZKbvòò“ÚY•QÐ ™¬þ‡&C&Øm[ ,ߺ >ãõС·ZYƒXÕ΄™° s}Hcu$¤Êèt"!ñÂò\𣯸tf©[­WÚö•QRN;„×¹Ÿqž¦©s²ÔºþƒÍ³ØÍ2_ªÂ-Ô^ò³['ŠšuNôS›—ŒkŠTÁ|P:ñáuA’xo˜u¢®MWèµ¶3÷lôK²/%Tçö­VMVJÛíK^¸ñ‚Ww¼i&mÔÉg6¨-)?§z‡?DŒøP¿sÏÉ “¥Ï½Q|\Ÿ´® \ÿx€©²=„J6ÍUœK?má㼤ï»í ¤nÿ(¸j'Á†¹ï%†>î4rç%8³,]}ãÛ€ªÍ}0›É÷õ7¿5›NA_f›ï2åEúb¸§¿ í¯=)»n¯ívÚ€â#³DާÙ·Uô|ýõ6àÑøêÁ°ê«É£|31§átØò…0ðHwŒ½öáƒ.ò{‚i~¯m‰ü ¼ WIàs×x3ã¾ ‡›P¼Å‡,áo|(£B™Åd§êªœ£1y;hgÝ lL—äéî­ÜµõWÌ硲@ ‚K3•QÕ\q<‘·ÿ¼‹*†jlRØNe‹èôÓ”3>[ÍÎxp6<é¶GV-'êŒÜbK"Ïë„úà‘zoÙKkÙ~Ä «–ß“9Ã=.ñXVÚv~‡)äOÌ\ä±ü´ä*_*;mÙ•ÃÏbj]©Þ—ÆKG^û%²ÓZj„ª“ ‰ù¤¦wûÌáðâìômˆ—åŸ$¡oY¯ëÞ3#xªê¨ çÖ‚€*Ï'+šÝ<áæêúó”¶Nãn©3ýÿb÷s»‡­fòÄ]†Ú“¾:àÔTßô ÕøvÑ™¬¹«E“ì+eµÁ¾Á¦³ƒÐƒû›óŒô7w8‹ôÙ¨”MkX¬þ ¼þX‹ ãœ«§Í·HÖ·¶ÔÊ™©sEýy¨FeiÄÀõyOcÇ¿>CßÔ Èî9~9 hf`þ¥PŸ>ÉÓp´Î'©ô¥Ô67&Vê–nÕw·äk­$¶Ý:òÿº.Ëuƒ‰^ßiÇÕˆVSzì›ûV%ÿ(õ?ÿD–V¹¨'À?Gd˜êŠv‹ó73h¼¦·ÖûêåÞÕWÛnÛF}÷WL ¡•Y*ú˜ÔNÔØF…¦2`) ò¬ÈµÅew—b”&ÿÞ™]Þ©k’(a[wngæÌ ùÛ‹x_ Ÿ>½€§p/BžŒ ‘ˆ0+ü“÷JFZ†|jXä3å£81s Ÿ©À ™ÖT' ¯…Ç#Í}0ÒjbæáÇT.Mʇ{™  #dÝÑô¾ø•+'m´¶–Ê… Ä"!ó¡³,Pœ¯ydô`ʹ5?y˜_ÝÁã&}_h§‡¤Â¬PFhH¥úK4Å|_k‚ˆðÆÚBŠŠŒ {2Þ*¬ È4âJ¯DŒþfezŸ£áÜ-bÝÊ$ƒRA%£s4Dü] ¥Ëìô²÷Üj¯Ù"i Ѽ´ü£Çcƒáb`ë8,ò¬v†®ð1¾ËŒÈ•˜…rYfH›~VÆÄφÃ4MÌ<*懯1³“éÝ뼉B®5fëïD(Ìñb ,ƨ<¶ÀXC–Rm¡,0ŠTaÆ£ OÚ:'AµLeÒòzUÓÆl.GSO/á÷Ñt<íÃÛñì‡73x;z|Mfã»)<<«‡Éíx6~˜à·{MÞ‘æŸãÉm8¦ ]ñ±"© Œr¿Â§<bKV'sO,…‡ð¢ a‡@n¸²ýsµšJ«1H鱯’J“j [Þ%/1ÝÈTÖY3)C«ñr“1e8dÈþé΂áÐåpzÙñК$Ši™(Ë©a>²ÖF–—½ÿ۞ŊĬ‰V>9Œ<^‘§abmS¨‰9iÎk‘Ú#æyT¤X‰ Fb£³sæø8¢¢º9Q‘­Ë\üsô —®*dªV 6<‚Ž´˜]e;L‰›>™Îiª¶¢6t$M$6§ÎQ f~€sEÉ”<@nÎ5<*÷A,ñ`KÃÐ-ê šknÐY1=ÊcºøØ„*妊aÅ6#ÓÉ)J}E#"›‡MHX1ÅÖ¨¯Ø¶Ûä@¯@×_`]ëa5͇¶iñ6'Òv.dhÛç.ÏB®›_cÌIɼ-¤LÃÆjQót—³´ívyŠ ä5U¬î"'z+ÊE32F²c•XhV2 VˆÚf™#}he`»$ü ï8®¹G9 iZÇ%‰i ÊÄÐóCÀÐ~ÆÉ'",“ȳ¶6Y—ºXtב» r¿ÑO=kÄ ºpp¥Ð­´¶†Žðáú&¿•)Õé–,ô®nÊ^__ƒQˆé§ŸÊc‡’Ž–,Äiß«™ª¦Ëf"žžSônóóšÅ/µ¯z±1ÙäÝV&þ^ ¢åêTöA™…v†žÔÎvïkRv c¤¬þ_–ÂËÅω]Ýœû×IUŠž´2ÿ{†ukU7ij¶pû´ÝõÒî3Öê º?宫l¨–-,VžýÞ-—¦R>ÞeÈI÷ð¼ÊVW^ÝÜÔ ôlŸb*t'J\݈¥Å‚þr\Ǩ´¯AJdýÌû×’†&ÍM\>åÚ;ü RYä»éJ`–ðéAsû*AB­<,îÉlrâGÄiG’Ï3I·ÝE9籿ßÉN6ÎÝüÌ*ZcR…9ÅÄ™7ÆmF¿òvÁ¼=ôÙ?L=ÖtÛLÊà¶*@j‡J}i"³:´®÷Ïfm¹Þó¬1_T¾=ƒ¦@¯µ’HqO‘øÄýÌ´Uzï‹å²ÐÔýz° +MËÔnHmXß³@‹Ô,Ôn z5‘>ïÂÏ}ú©oi|ûž)^l™Ræ?ß1ÕGÿõ†©qû…’xdÁÈwØ0…ëê‚qî¿Ã†)ÈpxÁ”/EÖõ_0äôLÊ¿`*5ݳa\IO\1OšÏ²óõèÀÙÌf·íŸ/»ç¬Ÿ*ÊöÏ7o¨­’vàBø8¥k;DDø¬ñ۶HjÉ«q¥¨[:e+þÐܶ›ë¢o-Ü_¬É‹›‹WMoã6½ûW ‚=$ ×*zÜm»qó]Ø@ì$ØÓ‚–Æ2k‰TIÊŠw‘ÿÞŠ”{5R8Ã7oÞÒ¿~ªÖÕ yÿ~ïáV©VNH%Un€ßÒ+­¬.ðZŠBç •C³)Ž(„£>˕ŠœöãJ¤ô5×+׃p«k• 'µ‚óñüöè h…­ ”Ú´Û¹¬½(ÚŒ rƒX¢rv0Gôé§³ÅäêV„•ã3iÛ8ÐH·¦5ÒB£ÍV”Jd™ä­EAÀéEép Á\˜ŒËLuµ32_;ÐBcײ¢ý\Êü6‚±mâ¸-ÕºÓu(¥Wu c”ˆKþeô3œÓ: ÿ=»øè£K±¥Ô÷ÙŸR¬Á%`eUH¡Rªëö Œ_B½ä–ð¥€^õ—pÍkçªIÒ4ÍHxÀ#mò$–˜|&f§ó›ŸtŒ¹WZKlýSKC/w *B•Š%a-DÃôò !ÆU>ähEÐoÓž´‘Jï/ Ú„ïÑÙx“ùü1žOæCxœ,þœÝ/àq|w7ž.&7s˜ÝÁÕlz=YLfSzº…ñô Gþ5™^‰2Ú Ÿ*ÃERÉŒbÖÓSÄÀj }²¦r%S*OåµÈr½Eã=Q¡)¥åÖZ™‘ݺ|T-è΢5]Õ~'LµÃ0V»ø*Ü´3Œ¿Oâäké&Ü´HOkþMB WÁt<Ÿ~ü ­UaoâFýίEýD¾ÞÇ^Û;š5‚H¢ûT-öØlcﺻë8´êï›Åv¸¦wŠª"ì¼yofÞì÷ê]=JÎÏGtNWºdJ­ Jm ;&þ#½°ÆÛ’/µ*mq§J©`iØå*å b%üZ§lFWjOÆj²‹æ¨ÙUÚKk=HfJ‡8T^B_hë]òå~¨ÎVkËññ±›”$Q˜þ‚M’Äß{¼¾g_B@&£ÞñóÞÃ`ª1(ìÅB ÃÓãàø´T(^ÕøËù_e%£a|yÇŒþaV)’•×9Ý æ…[„f·T½mÊ0¡îpŸ¢&ÈlÜÍV›_ËÅŒèzû~ôO苈:™áÒ¶ìÞ¤J,öÌëåýlÌo_ƒÙÔõk0oon"æ»—˜+ÃÐ郻 ýȦOÿÄv ØÃýqª¢J?ÁWßtÇ7±h)"ë«7¸˜‡¶h$Íó£?gùL@Ýl1‹”7&;¾›>Ò}YŒÂÊfCGŽEkma6¬šàFeÅag±pœ–ÅlP+}ðo¶pd”EÙË®ôÆ=Øž17Wú)^ ª1þ¸˜de:ÏÙaÔ©U{?†ÑpK)/»M.A+ëMÆâíÑ […} ãÉ.ñJ]7e\cJ«Dvû§È=í‹{(;g=ö,JÓÔß sƒŽy¯œ.÷Âó <:ËúmÊ $ËrhC§ò ‹Éíã oüØ<ÿÛÜ"ää þÅáœ(÷ó©ùk4úðãèo½YmoÛ6þž_q( 4.\{ÝÇ6ÉæµÍflH€Ú]ÑO-Ñ2Q™ÔHÊ®7ô¿ïîHJ²â¸FÚÍÀZâÝ=w÷Ü ½‹ŸªUu6~úô žÂµ*%dF{¡´Òø•ùwöÊhgJ9ÕUí“eõ«ÔÒ o,(í¥]ŠLŽPœ4ü¡2©ÌÁ–žT"Ã?3³ô[a%\›ZçÂ+£á|2»~•Œ–$ׯV-j2Q +åZjïF3)YýÍí|úê ,7ÉçÊ9°U~…g”ƒ­±Ÿ`‰ªDž+2-JŽÖ „­,„ÍÉåÌT;«Š•³E/ÝJUhoN®Ì®'³èëÎÔÑ•Ž×1Cø‘Ë?Ž~€s<@BâÛGƒ—,½;ÐÆCíd«äçLVá"°uU*¡3–ŽÞ56㇨Ä,(} Ø0Ëî1ž¤é?€•÷Õ‹ñx»ÝŽ[Œ“‹ã?0²7³7Ït’y§KéFë¯ZYŒñb¢BT™X ÖRl)ƒœ(&¢ØZŒ¸.†$í ºijƒ– ¢ëÝ6Á9z4™Átö~™Ì¦³!¼ŸÎ»}7‡÷“·o'7óé›ܾ…W·7¯§óéí ~»†ÉÍ’ü}zózC†¦äçÊ’Ä^ЍÌ;|Jˆ-1O®’™Zª ÝÓE- …ÙHËõQI»VŽRëdŽôX+Ϥr$zÇ·T%?c¸?‘ªXYscJ–øy™2 dtÅx̯R!œž¶c'¾­¥_™¼¡I{±¨Kaa£0¨ò«‰“¦Êš#0â‰`¥¯­Fâ²QX Ç–¦,Í–xü­­|Ñt‘™\^5ßxÇ/¬ë<}ƒàòªÿŒ>üüÉ…©£[ëÇ¥A›Z¬åÕ“áÞáç{‡ÉÃ!ä²’šG^tü1‹s‚%rñêI£bÐj{~:œ€ÆžþðÆcÖ"Ÿâ¿~jc=î†>=}ƒ}¬Ù¦qŠE£‚VŽÃÌà‚ÄéÐZÊ!”u2Y–Dd nWAcô˜bç8»2„nb…ꓺ…ñ«Á…œDyP»§ñyùÙ'/ö!u‘õ˜›0Îó{šûš«åRZŒG[µ­ NÆíkCVP³hQ¯…Lh2i•Üpß´¸)ø•5u± c6¶ýâE!¹ ž¾Ä"¢¯¬´™‚½¿WÑœ”/ͯâÓd­­É;æpP`èiíiÃÞSŸ¤ï5ƒ2håP~šGÚçr©4¶,›ØêìNÞ“¦GÇê³+›1ÛçQܧ7¹¤ëqT†W‚ÕLÜá!Hk[æÃ‰±Ê#>C«€´¼›&¥®^1Ø‘òǼC¦ãfÙ›ïxûc¼)–Âûp†ý0 v-øêó¼ÑÓ8ÄWÇè ÏH¬SÓuŒ ì1s7úb©yn1Iª»|ŽÂ¸ˆ/w|銘P¶Mc¡ÐC< ëõ‚\kX>lÀ­ÃU3ËjºLè°Ç2r|±¼‚<|ÿxrÑøF÷±àÀóæÝ©» }¾q! ÏàÀŠq:¼Ów—ÿîþÓ}{j>î×ðÐi~׉!5–öÖv¼ú;æéÞÜ™gAÕið¡‹qéÅѵ?‘†‹Ô§ñLõâi† 7öÈœhÑ'EἿí¨<ˆ²ÄNµì7^<†ó /ø4ÓèˆèjÇÃvæêr×øSâ —ž­Â¶6¼­NC˜}Œ6ïTÝáryµ?jR{èl‹!<<ÕöMî>mÈýzwÄÅ™`ÿ‰÷,Lˆvâõ¯ºÂ5ý2ñš:¿:¼2¿?¼´ÆÞµ”xÐÞ¿µaå˜ €ÛiSášuÏe¬9×l—º~os½æõ ½ëðN½¼³S·ËsRÆè«[åwÛ'14VÄã5A¿¯×áwIl~) 9S—¢)þG÷¾.õmÁTˆ]¬ä­½¯»¹,¦ÐããÀÍqA—D…SGZüß ÊbxE!û0Rƒµ“â6‹Ï÷»Ê¦òåì éó/•TMoÛ8½ûW ‚œÀµ=¶‹mµIŒ¶k‘Û¢GZID$’%)«n‘ÿÞJ´]-º‚Àæ|¼÷æÍüùÚ4f–ÜÜÌàV²E(´òB*©jð ~)nµrºÅL™Þ¿­,…פòh+Qà’R9û­,P9,Áë™Qп\W~a¥{E©R+˜§ùêè+ZÐ 9›*vÚŽí­ÜõÜ¢+‚¨-b‡Ê»%@Žʯ7Ûìö*ÂÌù¥tc¤o(F:´}„ŠJ‰²”ÜZ´œ~èN´X [2ÝB›ƒ•uãA ­k¤¡~[¦’¯"7Žm‰ëA÷•3Ö“ xO…˜ò‹å0§Nºš^¯®_…ìN@i½ÃSuÀÏOp XgZ)T²'vÇ„ñãTDïxt ÐÕyÏÙüÐxo^&É0 K/µ­“H1yKÊ®óûç:æ¼S-:Gj}ê¥%w†PbGX[1ðà‚Å`IqU/8ÛEœé$Z„HÔÏH6ft•æåWðwšgù>dÛ6ï¶ð!}xH×Ûì>‡ÍÜnÖwÙ6Û¬éÛ ÒõGÎü7[ß-I2j…Ÿeì^VË3?E ì–iNÎ`!+Y=U÷¢F¨õmØ ƒ¶“ŽGëdIö褦rœú·¸%oHîG.5mÕVë6d¼ÙONIAî¯Éî¢N’ðá÷Çö+†’l1§{<•Ä Å¥2HÞxØÇ•wlÐ’G{q"·TÑ£ólÔÑ|4Ïã™àáÆü¯ÄH=^–ybãLÝ0˜NXغo@´äÿ2èžDQ°Œ•{ê~Únî6¬¬gp¹g' ·ÓïHd†gÑ´üÊ“ r#â4.~Ân„>5øÙe}q•0þÜÀônyPîQEi–SL ý®€o¬ÿtAŸo„r$¥Òu±ºûä} ~¢¥ˆå°ÀÃ…µ"\•gq.%VRÑHÙ,gj°tÏáÒ8²c½pJ:LFV§¡B#ö;$f®ßÑ*ùÑ)ñn_ò¤Ù[Ñæ'›ìúˆð"|GùÙ„ÿÓ˜«^GôâXÕÍ'bñÅÉëW³qrÉè©—Çǘ9Å<Íf¯ÿš}TaoÓ0ýž_qê§¶* â#ƒmakE´¢É6í£›\Sk‰lgYAüw«¢Rd%õ;¿÷îß\Ôû:§Ó¦°”%B¦•RIU€Û#à×ìJ+«Kü„ª¹–¢ÔÅ­(e.œ6 •C³Î Ï%>Ê •Åœöð¨-‰Þ¹V„¥nA¥V0Ž’åè h…Œ¦Š•6#· QvA±Båì AôåWë4¾ZÀŽˆ3>—¶ÃVº=í‘Zm`G¥DžK>Z”Dœ>Tž Âä¬9ÓõÁÈbï@· ÝËšÎKYJ²ÈØ®ðp,i=覗r¢º7c·Tˆ%¿š¿„1m`Шÿw49óèJ@iÅçê€O֎豪.¥P™G÷êŽgÇû¾ˆÞrÿ@x) w§Û@8Fó°w®~†mÛÎ…'<צ‰áGrv•,^és£J´–ÜúÒHCo jb•‰-q-EËôò ­!ÇU1c´BpÚ¦gÓŠ$ýtÙ&|FQq2‚wQ'3¸‹Ó÷ë›î¢Í&Z¥ñ"õ®Ö«ë8×+z[B´ºgä‡xu=$Ëè(|ª ‹àô²£˜ŸäiàÀiéûdkÌäNf$O( ýˆÆH¦’–[k‰dNñ¨¤ó¡² ýEÛ0%—d÷—êG+ÕºôˆËÇ>)a((ýª0ô߇)ø÷žý)„T2 †©‡&¦Â…O ¸†ÚÁSDZÏJAVuÞC?–ÿ«- Ž—È_.|r¨r{²ësƒ–Ýþigð-(ßàòo tñ]aŒ8Îvä-Ç•RW—â0‡4¬—Æ£;䘣©Š·çÝ:ÅoJôÈЯu³¥Á®Q™¿ø tf<9 ‚ïApqüTQkÛ0~÷¯8ü”„.{\ÇÚ¬m˜YIXœ¶”±ž8¢¶äJr]oì¿ïN±š°Á( 8Âòݧï»ûNΚ]%“I˜Ë !×Ê ©¤*ÁíðG~¡•Õ~mÑ:©Õ¥•.oE% á´©š­ÈqJ s-sT pÚC̑Ӓé­ë„A˜ëVQ*AÁh–ÍÇ@¯h@+älB¬µÙó0rÓòÕDikTÎN2D¿X®Ó‹+ØyÎ/¤ÝçNºÅH 6°%(Q’§ÚáDƒ¥0ëÎuÓYîèN¡±;ÙÐyk–’ͻǒÖ^·ƒ”#ÕC1Nà–€Xò»é[Q'ÅÃ×x|ê³kуÒZ‹tÀçGt‰XÝTR¨Ügê^Î Ž÷ˆÞpAx) ·Ça gó°s®yŸ$]×M…'<Õ¦L‚Ääš*»È®Þés£*´–ªõØJC5Þô b•‹ q­DÇôò ¡Š«ò„³m0Áq›E Iúq•Møų Ò,†O³,ÍNà.]^Þ¬án¶ZÍëô*ƒå .–‹Ët.ô6‡Ùâž3¿¤‹Ë@*…Ïaì^®(G~ Ø-CŸlƒ¹Üʜ䩲%B©ŸÐø!iÐÔÒrk-‘,ȵtÞT–SÿÒ¦äœÊýÀPÃx­µ®|ÆùÓà”$äþU’øý0¯ïÙ¿LHI&? 3LL…$ =O ƒÇað©%<ùðô2úy%¨Šuk¯£ÍÿÕ—D/É+.|v¨ {ùGDô3ŠÈßàòo+t­á.;‹ZGsÑhj—üÐVβe7ÞM%úÃr¨ÂÞÜó,âQŸ¨1|ë¿Ç{×4ŽöûØ»"V´’í}íøŸÐö(@ÚÉ¶Ä s2ýtØ ŸÎ§¸óm´ç<ì„øÄ¯M»!CÀ¶U¹o]‰nå£3<ŸF¿¢èìcô½VÛnÛ8}×W „<$cu÷±©]»¹`-ì"r[‹" %Z&"“Z’Šâ¶ù÷¡Dù¢¸[ìÃHd‹œ™3gÎ ýæm±*‚èü<€s˜¯„¥È9$JZ&¤»âÀ¿%WJ•ókÁr•Í +ð;$93¦†dû^$\ž‚UÎh\°±ZÚŠi·ª”)#C8Ç·g€_¹%9Y+ k¥ë¸Z,J‹/òÚ#°Ls¾æÒš>@̹s?Í'W7,Ù§ÂÔv v…g0•JéX¢+–¦‚B³„Äk„ 5ϘN…Ì0t±Ñ"[YP•äÚ¬Dñæ”J|ëÁ˜Ú±‹¹nTÙ¤²“uCF>¡#Jù÷þ+8Åd6»áÙ¥³^³ He¡4|ëøS ‹pغÈ“‰³n²kc Æ/µ šs©€ZîfÉšþVÖ¯£¨ªª>s€ûJg‘O1zÌNã› ím>Êœƒlý] /6À D•°bÍYEt…r@•FÆeÖ#kãE°[¦-i"¦¾{ic®Fá8†I»q<‰{ðy2ÿcöqŸÇwwãé|rÃì®fÓëÉ|2›â·[O¿åŸ“éu8R†¡øS¡) D*ˆQžîèÉc µ4u2OÄR$˜žÌJ–qÈÔ#×’ÄRp½Ƹ6`2Ey¬…u¢2dÚÉÍwÉé~ WMCÍ•ÊÅè±QJ1T†rgY¹-ß¿^¶Ÿéй$‰UêZS#–$ÄLQ.о‰?Þ1ƒ ¨ÝŽwÎG©ëÒš…¾WΨРٲ›ŽÉ'– œèìäѬõé5_»Eº¢Ù¶wêÜô÷£~°@'u—wý©Ò¥…zÛ—{ßÕ/—ÈÕ' jVŽMIþd¹LÝ>’É›×Á÷€9–iÇ:Á‰»ú•Žv—ÖlsZ§7®ÅOÏš‘{"–'Ô9'Eë aàIëÔCú<B˜ò%+sö¶'ZÎC:!Ë.7®­Þ›–4Yz¡d¾ûå€SeÝ-؆ƒ#ñœ"¹q“¶‘è–X’‡m$‘I¼7÷uຖ¥L\û{Ãíé>í½C6k)}o5`°Í’˜5ÇöÒJ0ÍVY¯÷¶h‰%zæ¾VÀi'8 X²üøA:ɹ|áÔømÁËHür%É+_礥þ_øèAXcíBÉpâ áUHpç¹óf‚x¸|žm[a¨“2þ³tñcŸž»ìýoì…óßIjQ—›Ø£ Õ‘ë6 ]ÃíŒükÏè+ŽÌýtk'ÏÁs¼ÿíWmoÛ6þî_q0RÀR»Û¾%uZ·I0cÔn‹b+Z¢d®’¨‘T¯íß)Jrd;ÝŠ}(0‰"‘÷öÜswÌÓgù*ï ;p W"áÈÌ0‘‰,³âÀÿ ^ÊLË„ÿʳâB°DƳÜüA´ $ ¿Ï4ÁH+8ÎY€¹ŒÌš)W²ÈBF‚Ðϯú€¯\Ì8IK©TκËÂà‡Äi+ÎSž=˜snÕOg‹ÉËKˆÐe’…vrèÀZ˜žÖR}„U±0dš% 2üZGHPñ˜©¢ d¾Q"^ëŒ+½9Ú[P(ó+ïŒvнYŒu#‹2”FÔ%'ðQÈ?ž@P·ÜíöϬtÊ6I…æµvàwÏ º‹Ž¥y"XXé2ºÊúø¾T"—”9`6Qó0CÒô°2&?×ëõ€Y‡RÅCâð";_>F§½Ì›,áZ#ZB!ÆË °½ Ø}MØš2he €^¬"žÅ'$­= šiªAó.bèͳ9êŽç0™wáÅx>™ŸÀ»ÉâçÙ›¼¿~=ž.&—s˜½†—³éÅd1™Mñí ÆÓ÷$ùËdzq!CSü.Wz*Q6øä} ¶”yÒ9D$ /‹ sˆå-W¶4r®R¡µ-–…HTK*M¢­Ø|•í¢ŽxõÒ+Y$!8[H4†§÷ÚÕ¡ß²D`³ÅpŽnýŸm7«-òˆºOÝ9´­M&/ŒG´¬#„€üX–9>š(ˆ&ÏBÝâ[¹ßùÔé9ËVZÇ–gF„d|]qW.ÿ@Èþ˜7ÀÜŒq"Øc"%SÂÕ‰á¶"bm ä+3°‘U¢ÓG¦!°$Ù@ŽqÙÑ€-BÜò¬ò¢œ…77š›^Q5+i$¾ÓN ^!vL:éGªûèŸÏÍJɵ…+”_—)™Jc§ê¥v ¹ó~Mp¨åXP÷C˜0P~‡É >½ƒ=¶I?hÀ©p­“U ©›#%h )쟼63ÅRuÏ‘jtžŠ;öáÈG°ã%Ä`ö›`"l^ÏÐ>ób‰ý¢" lonªdõÊlV:G¥Í>ô­ì§Žãˆ8ÿø¼t]pý[—šM÷Cƒâ#è^'`%% Ô²»g‡ô4ÛÕ‡zý¤ûðHÿž­;LéŠÎí·S8,Y¶`dkcWå]8¢W £×¯5c¢"§§[ Vp–¿´JÒÓÓ^xÉ»6§ |Wñ´™²/wô«¼¿´ ê-cj9ËSßÕŠjŽ·Ä(©ëj®?ÄùŠçt…Ã*k”˜ ‹ Ë,Ù[W{köس͔k{ûjÖÝ#ÒP[q†ƒñ:¡Ž´ ûÉ}4ï—‰Æù€ÃñžXylû(­€ŠÅÒéÖ-¡¡o\þ{-Ó0 b ªøü™X’ðlÇ©§ðCÃþn?ü² ð…Ðîm½B´¶Qzø˜Õ»ÿ\×Å|RŒ÷žtwn”¢__Z_–Hµg;€o´o‚ÿ;…÷¿€t«™ÿª_ßj=¬ö ÚRà0¢‡qB¾ü~׈ í_&¢¼Ö¶®Gý×Ì…ÚL­¾} ÙRòï Ûjüõ/ÏÎ;µWmoÓHþž_1WU4©BRøØÒÒPZ]t(9‘BE{ãìÕÙõí®›æ ÿýfÆ^ç½Wg b{ç}žyÆ}õ:›fµöñq ŽáF¥"£½PZéüT‚ü'º2Ú™TösŸå¾Ÿy…ϥ¹j‘â;Iíd Þ°R'þ ÌÄÏ…•pcr R„zgpÓ|”Œ–¤m,ÌŒ-<[5Î=¾H ‹ +åLjïZ)Ù|¯?ì^]ÃÃ%ýX¹B˜+?Eå`nì-LДˆcE®E Jã‹BŠV&ÂÆ”id²…UÉÔƒ™kiÝTeèoH© nB0®0Üb® “—©¬d]£ Ñ¥ü²uu ¥ƒòô qÆÚ3±m<äN.­ƒ¼dæ1\ l–¥J舵Ëì*ãçÒˆS×@p*`&«b èT:‡Õú;Wk<^€È0ªHŒ1ÖTÌ©ƒÜ(F1·Xq4IÛ¬¶iY´"¦¾*€eÜ£ƒÎºƒxÓtMøÔþÞÿ0„O÷ï;½a÷zý÷pÕï½í»ý>Ý@§÷™4ÿèöÞ6AbÉЕ¼Ï,%‘*ª¨ŒWðb ´”}r™ŒÔDE˜žNr‘HHÌ´<™´3åÐ1Âc¦<ƒÊ‘êVnaJ.±Ü·dª¨¡1)k\Þ•Hi·¢?A¸‹¤Ýæ£0OoÛc8d“1gr˘j×Âô¼Í#_ 6õÑyJÊÔ3_¢j“Ö¹`H(.Œ°·f¢,1|ÃÄôí–©‡u[—™5Xm¿@Py8Ä2S~ñNÞÉ´€s¸ÞJOmÑ¥¿”$(àJ§µÃ U{l¥¸Ýg« ó©dyyï ¤¤B ‰4] Ðq®b‚ ÖÍT3ä?OÑDSaE„²xX±8ÄÝ 8驿'ë걜ˆ<õ&K"©©4e¾Ë¥ïÕˆ6²#ÄàÉå†yÏ­›ÿr3Ì?7ÒàÒ˜ —V`€@.ö]+°oy`-¥Žùüp²|]ûV£¨Žt³»•´œ/8þKF‹i\ ×§¸k,¼¹B¶ŽD|i 3LÕÄÔ…6‘P•ðÅŽ«àŠ7·H»Í`™ˆÕsG©—à§0BÒ¨0Å¥8:ÂB±8ákgÅ „µbQ'‚ÓÉùÅLÝ˸‡!!Ú4¸s½Â%ÞÑÊ*I¸´ÒçVÃQñFâ—~jͼ*çŸe÷{Æóâ½æmÂ;¯âNpRw"Í+úƒ =!Ì“0't¨UcódêG<Š¥?ôcrž‹¬+CêmþÍò1²Lrñ‡ÄhtÔ,QÀ‡®Cêêó‹Ò°’îËÑ:w}…sxqö˜BÅ ,{ò¨ìrÀXƒ’+òÂ&ßRä£Dú=×K5zqªóYy çç <{†EØ) }9ù hTÊˤ¹H¸hµ?=]-ΊÞÒçCu'S'÷XÃöH\%PšáàPÅp~TŒ@m¬ ¯«Òåðs¥ÐF¥ÆÖñ¶]bNNwžq5‹êF8u8XoëA³Œìl¯>·t÷1»~ñd×@~×—Oöº„ÚÏ»}¨í~*îj›4…¿ëðk2Š$ïèâô—°P,[V\€|Ь]®º híqôÆÙ²^ÐϾÙ`á0(÷Ä ÿ¡ÿÊ•ZŠLòE˜àw³ìRK%î?HQ°Ksu—Cµœ¾µÀ÷1Ãp“%Owˆ,yq³Ìd¿!cá×U½ ¾/î^ÁÉ“Y€;Ì»vg“wV  GôQwd}´k(¶Þì"Ç>$Iú¸ª²üŸ3#_?ŸUù¹ËV4{§v G»vÉöj\S¢ÝHùœ•<ƒLóú¢ö/µXmOÛHþž_1H\H Ru§¶P(%jtU¨Ú^UUÕÆ^'+l¯Ï»Æä(ÿýfv½Ž8\iKˆÄ;¯ÏÌ<³ðâe2OZƒÝÝìÂP„<k&bÏ@Ï9ð¼S+òw©œ¥\©)KÏ-ð%x!Sªª¤ýVx¥ëÉd‘ŠÙ\ƒÌcžª¹HÐߥ2º`”5ìÜb® ™©T².ÀèÁG4D)?éïÃ6 R»8mï<7Ú[@,5dŠ/­¿öx¢1\ ,JBÁbÏhÙ•>0ÆÏ…9¥Ò3©€ ªbÀ4iÓÀ\ëäÙ`çyŸ™€û2 \Šƒ·ˆìxr¶‡A;qˆµG´þÎDŠOÀŒÊcSŒ5d9UÐÊ4F‘§ˆx<ë‘¶rMP-Ó4"¦^@ؘ©Qûd£I^LF“|]¼9ÿpŸNÞ¿?_ŒÎ&pþNÏǯG£ó1~ÂÉø3iþ9¿îGÈпN¨)RAˆr¿ÒO.ê–¢N*áž„‡éųŒÍ8ÌäOÍl$<„Rf Xìc{DB›¦R¤º–››’c„û’LSu!eh4ޝŠN vÿ ÛÍsäáÇËvW“ÔbJf©é©AËQÀD§™§í`S•¦¡¤ÅײlŠ7T²ØÞ$¾}S\o› zÎöŽ‘¼)ëªpa 5Y©â´.A‡A»Îö³†³r,O«“Ò(PÙfÚH6Š”³ÐxZÁÊ)="@„úf«¶]b‡‡‡¶ÉáûwªiÈãÊé 8¨ ÖŒœ{Lûá^Ì›;°^¥1…Ò3Íl°íÒˆ­Z½]{3ÅëÝåó†ü •lÊý&±’æ[|~O,KÚÂG‡ðôW“[áÙÆ ®Ý”›—A(Yõuš‡k ìÿ"2uZÿ©êï?tõ=ÇêjºG…W²¤Šß•sÿйӿHŒ§ŸÁ·7¿õÄ×bÚ¸^ý/ /=oÑ?ÊöŽ–×¶/$û/o6«sÛºmµ^µþ•UmoÛ6þ®_q08 \kݧ¡­Ó¸iŒëì"r[ÃÐÒI&,‘IEñÒü÷IÑ/u»­DEâ½<ÏÝs—W¯ëUÅ\À„—©†qÁEf…€§×RhYâ{% …Zÿ.7RÍkÃéÒ’i=$wáOQhÌÀHç=®YJDæ¦e a"‘1ëgãdrôŠ ¤@ë-TRyŠ/Ê¥Œrc…Âè!@‚èÂÏæ‹éõ ä„Ûúg\{?Ðr³"®¡•j 9…bYÆmjVô¡r@¬£Â‚©ÌRNe½Q¼X­@¥W¼¦| K%™0Úi‰ëF6•=Ö]1ð‘YÊ?‚32°N½î¶wþÒyWlBh4î¢>¤X‚KÀªºäL¤Î»c·ÍA?wAäÒ¶˜£2ß7f¬·ýXS¿ˆã¶m‡ÌJUÄbüŽ*;KnžèàóA”ÔªÖ_ WTãåXM¨R¶$¬%km]£œE«¨â¢XoD°ß¦]ÑD¢¾o@ec®G½qÓ¤oÆÉ4À§éâ×ù‡|ßÞŽg‹éMó[¸žÏÞNÓùŒÞ&0ž}¶ž¿Mgo€T2J…µ±EÊmE1ÛÓSÀ`ÕÒõIטòœ§DO + yÊÍGªâZ»1`"#yTÜ8QiëzÄ-LÉ•{mCu“µ²tW÷R☑ú ’;+âØ]…Aøÿmû7ºVbZ6Êi*ŽÂHŒjRãÛöQ;”–‡ìf¾SÕn7ÌS7f· hbx·¼»>ðïê ÄJ¬â<.•«ZI*µÙ€•ÕýÄoâÞ¼˜Ã±“êoƒ1ÈP§¤'ÏÁ „ºÛg´sÜB™ÿ@{\oâÈýÏU‰Eæ ß0Ýçè1²È ŽÁÔJþ¤ãË©j#`J±ÍYö÷¹÷at ýÓ_†ÏóÓS8ÕôÓ8Óó—‘{º–Ús>IZiŠ®Âþ.<¯ÌJÉv‹ð}Wø™4ns߸uä–¦·gšÓ¡2»µ°mW*›2s[mi»B†ßIô‘• þ`ô{ëc×…$å‘" (†Û<5S¬Ú g˜± ƒ‚C°áWö°ð)œ¨üŸA¸Ç~¼$óî5öm–4–7"u•¿»ÓhΈAˆ}î,·íÕ´ÙÓx«îöО”J½}%ô^ØÃs Ãõç~¶Í£ÑrVRˆ/_leJ{·¯àù^ÞoçÇ5¶ßîã!×ô=”“VµÙô­P¿Žútôe©­ 3ÌYSšcÚG˜¾+âPä]à]æû?øÙånÿ°¶Òæje7B#\ª2Bo2¿ì}E *G¶V2¥}Z.KK/RïD¢3Ì­ÌûÙÕbúòV”6ÛÇÒx;J`#íšöH¥?ÁŠ\‰8–Z¤ sz‘¹DØPc"tÌGªØj™¬-¨MŽÚ¬eAñ\Êü2$c¼ã–jݪ²*¥QuÆÞ‘#.ùçácèÑ6êV«Ýþg‰-äÊBipçð6ÂÂRº”XV¤R䑳®ª«cPŽ*'jÉÝáJµjnaÙšÖÖg£Ñf³ —ðPédJ½&dgó‹G”t°y›§h ¡õ¹”š0^nA”U$–”k*6ÜA×(GÊb£ ñ<°µ $h¶iZH‘Jon Ø„ëQw2‡é¼ /&óé|ï§‹_®Þ.àýäúz2[L/æpu /¯f¯¦‹éÕŒ¾]Âdö-Î^ 2 …·…æ"(SɈbÜàSÈÙRõÉÉ•Œ¨¼<)E‚¨Ôn< Ô™4ÆÈc¢G&­#•aÓVmaJžÜŸØU5X ¥Rgñü¦bÊh$ˆý Ñ]$£‘[ ƒðãm{ˆ‡Î%S̨R;N:A^Cõªæ|;DvJàÀèfÒ×< <ùõ¹â¼V„§Ý÷žÀ=±xk=SÃÃcø¹!Ö`ºîÛ«w"•¤;TÄÉMø³í»^böò îD$vnîD[R]pbÖjs¦L­ÙwùãȺHi6™ …"Æð¼hoã˜Ã 1®½* #N}x?.^¹ÚÙ«Ò¥¿(ÜH|Ôñ­<&è;æ±iµ»Zï|ít8¤# ?§®ÍV—‘%ÕÉqSSG-ÿ¤J†a[ ¼Ä{ñ•V¡P™Ñ²&¨H[*@†®ºÚ€çý1…XÃ#‘¦[(¨6§Ì4¡òó:‹ê(úøÑ íõ!£®(§OôW2I°xg8ÑüËðùÜ®µÚ8Xh@ðMÕ–™²îP»pJíο?Š·¤s4=Z<<‹Ø[âƒúþ÷Z¡a<®øß¾1KRÌïÙõ~jÄ¿?ð¸„Ùi+Sï^#~öQ:¾Íù=¼¯ëk•”Ð}»÷nn ox¾·Þ,‰jŸžÜ|s¸ãÏ·€Ñÿ¯Ð}˜kèr&ÝYóN+TÜ*U’°ñÿ%¤6ǯ_ÿ .GÓúç Uw”6V;åÿ™hG×hKïÞï²iŸB{ÎùÚwN:gžwþ•UmoÛ6þ®_q0äe޵ícÛ¤qÓ3VØCä¶(†! ¥³LD"5’Šâ¥ùﻣD[ŽÓ¢%(ïå¹çž;¿y[­ª(>9‰à®ejå„TRåàVø_z©•Õ&N¸Ú.„™UNÒ'H aíˆÙ÷ƒLQYÌÀiï7®DJD/]# µ®U&ØŽÆÉõ1Ð+Ð Ù[(µi“¹¨}(Úˆ rƒX¢rv úðÓÙ|ryKBÌþ™´­h¤[‘´ÐhsK %²LrjQ€Tô¡ô@ØÑ`.LÆÅ¦ºZ™¯èF¡±+YQ¾9—’\0¶ ÒR­k]w¥ôªîÈÂ' Ä%ÿ>úŽÈ€Ýíàøµ÷.Å”vP[ÜF|H±r—€•U!…J½wWÝ&aüÒÑ n_ èeß „coþX9W½Šã¦iFÂi“Ç¡Äø1;M®N tðù¨ ´–Øú·–†8^¬AT„* ÂZˆ†;èå@(CŒ«|ÈÞ6ˆ ß¦-i"•Þ7 Ú„ïÑ`œÀ$À»q2I†ðy2ÿcöqŸÇ77ãé|r•Àì.gÓ÷“ùd6¥·kO¿°çŸ“éû! QF©ð¡2\!•Ì(f== ¬–®O¶ÂT.eJ婼9B®ïÑøÉ¨Ð”ÒZ?Be$R:/*Ë®{µ…)¹ ºï8T7Ss­ ïqqß)%Ž©?'¹‹<ŽýU„oÛ÷tèC²Ä¬®×T…8S§®lî£u<”\‡îf¾SÕv+ÌjWÕn» hbd·Zw»ãßñ T•ºÛ‹ó´»T.*£‰j·–ñ~`ë4¥&^®„iµjJ_Á®h~Û©o‰Éúå5z9èRÈ¢6øƒAÙz7âOvÖ·5ŽZ޾³_ñÁ¡Ê¼É;a±û=F Šp˜òœtõH¢ú „1b}… {„ÂÙ9 ~ ··½ÊÛÛÓîöøuäŸ^|N Íï›Ö‰: wáyáVF7ÈuLOµóûÿÊ/5¿z[ûp&K"6Cë—˦?©®‹ÌïÆO&}#Ñ'QÔø“ÑïÙ‡—Ž&ý’® 9†›<•0¢Ü(å×0%†9ÁFÏìKùÀiSxµÿùïûÉ\Ѱt¯qÛâzAà ËZ¥žùÛ[‹îȃ†ØÇÞòqÓQK¿é Z«îvׂOJ”Á 'Á«î{âxvÏG.)‹´·-5G@pvvF3RP„¯_™¸Uïö üÖƒõ2¼p|Aaór›w©’Ö=”¡W –•[²ŽŸG}Úû²0(îv 3\Šºpûeïaú¦ÆC¶·™ø‡þô|;¹³í?4¿m1­ÏSôEoÏ£ÿåY[sÚH~çWœ¸\d Ø3{uÆ&ÔzqÊàÉLMMQÔˆ^ ‰mµŒ™„ÿ¾ç´º‘%“—%e[¨ÏõësëÎ÷?̧óJëåË ¼„®ð98a ˜Dàšrà¿;×a…>²±ÏïæJàWp|EMd"¾[áð â.¨Pó´çÌÁ?ƒp¢Lrè†qà2b„Z{Э~å€w(aÊD±ãXá ?‘Ì“œÏx ¢&À€s-¾7ì]w`‚Ö¿+¢„ X5EÁ"”0AQÌu©f>ˆ_Ì´!Ä(¹Ç¤KŽ:á|)…7U..£©˜£¾!¹2èZc¢D°U‹¾.ÃØ¸’ñڀрŸP¹ümó jH@L'fõ¤þZsÏØ‚PAñT:ðg‡Ïš‹†Íæ¾`£¹wkhã/FH8¦M¦]p’%¦ˆ›~¦JÍ/Z­ÅbÑdÚàf(½–u±u‹ÈöWh´åy|EˆÖb!ãñØ­r(Àg ÚA½Q:Њ…DįAÜ‘ ‚ì6¥ YÑõ,ÂÆô´ÐœÀÛö 7hÀ‡ÞðÝÝÃ>´ïïÛýa¯3€»{¸¾ëßô†½»>~ëB»ÿ qþ³×¿iGÈPžKr-„(w3ñdm h1û͹#&ÂA÷/f/|âRgŜ˙ˆ",p1ÅS0eOœ^aRb µa¡e |¤TM¡Ù¶º}Ûû±?ºít‡«F^ÒnŽûÞï†k?y‚96ìܯ2 îÅvÓé¶n·`M6^GÍ{jR——f^‚3e’9 ³Xx$\s³6æjÁyØ]™)FŠöO‡óp9çy%ôÆ&¶'žP”ÒI­É¡6ÑÉGš=‹¶Ð'æÇ|3ø­'¤« &óój®­´ï±©µ®d â{2,ÆxèǾ¯+ö;gŠÖMvè{Jñ;åÓ!§k¦ƒu:¡Ä á]¤®Cô˜|ëêewÂQ9¡|I†›]Y——sbtœ`¦éÈ ÚmØÛPbŸÛiÞX“™%ÃE¶T̪1$//'¦i§’º©n¥­JÒ˜JæY,ËAÕ!œJTÿD¢ö×ÇRm¨%ĽÀxbàÖíVR?â1:0‰ƒdJµº¦ø¸ŽÏS&=ª-D<ò¸Ñ÷F£%¨%«A<3«pyy çðÍ7hÇÈ «ZЯg¿AÞ¿Àœj>ù5ü·Z¡­ÆS[ ..²Öf8S‹Vë'îG¼DâÅñ\FUúSáRâ" #¶YécúeM3Õ·–·èãà–ÂÙEášÆš2ë՛ѵ–)ß cÓëRÎ1:óX¼¬•ž¤”ZÁñ:¿Ý[g®ƒ¯ø»CœµÍçxµÞ[mÚÍŽ×ú—½µæÚàñŠÿzâLg=^õߨ`Ý®Wù÷CƒÙtòã5ÿãP͹IâÖ¿ªKžV[Èí’ú²s®oO’Õ/ÐZ¸<Ò~ë&‡CŽ)ÔMÇÔQ@³DÑgiô¤¯–4ÒqÄF,sŸÍ8è_f² Í Fs›D{¤§–âá!å ‰ë3Ý\‡CΖF¶«¥Í)íb9ÃË:°ŽÇ´-m¦ž2-_ëÔÃÀ„a+¦Æ¯×¸ÖøZ?½@BsuVß»©êÖ3fá^Ñ@5ÚDAêtpBZOªEy²ÚzS1)2Ô;K€YûX~¬ÊAQ~‰¶ÙõÃð†pÇép‡íekhð±øç戃7!w9¶áô$»]rM·¥¾üêÛ–s¼`{2çöÝ.–.k¿¾@vÙa­do_l—–?ËDÛ±ž¥óàá•ÃÞw|¦$h²nïçÎÍׯ ë+™v bn¼½(!ÈŒ¡E$f\,Ù…¢Ö•ö¶OŸh ðy°^{¡ÁùöÐ}ëW Ê -žšâÙý\ÿ©þBÖ —åÀ(}O}m@¾¹Qûÿ ƒÃ¶ë[¶•Žú[ÃgÑEŽ9餷ݿæ˜~C/È»×æp‚Ç“ÞTþ í\{s7’ÿ_Ÿæé–djLʱ³ÉJ‘bÅ‘²ªu$—Åĵå¤\à$g=œá fDs}úîÛÝx 0/ÒŠs[Ww¬Ä9@w£Ÿ?4@}ûÝz¹>ñÅû‚]F±`ašäYc¾A ’¡È@ŠMOÎ–Æ \3•J3"ÂÒÝ 6N6êß²«Ûûþüöê6`o®&½ùyÂÞœ¿~}~=¹º¸e7¯Ù‹›ë®&W7×ðî’_ÿgþíêú‡€ P°Ö.$P£bæø“‘½EÛI®EÍ£–—, ¾l‘Þ‰Œâa-²U$Ñ´„œ{¬¢œœJâÔÚÚL”<u¿GR:’&iÓŒçwÚSÆcÞ¿wç‹ñ˜™@Øßl]~H$ÑÅdZdäSãö/0¢IKXU¬Â‚e)żYǤ5°u–ÞE3z?ÈE6ç¡@§PX.>ä&Ihâ#v•³™à±Tî­#¸Sáð¨Y4Ÿ‹ Ã6|«Ôžâ'ük…´V0/'‡L×d dƒdmܘÅIE߆éLœáoã1{‘ ž+ÇÐR“>D†Ïá#vʱ©©`0<1TnEN$À´ÓTFùå‰ÅˆÙ“#Céñ™öñ™÷’Ɯ¨Mê"¡u¡k@dAè¡r ÂÁD¨é9¨™=;bá’g<„7²„¯ ôe†²}ä¹YF¹hà©Çx–n™Ákéœ0 š³*ÊÈ„ÂsÀDð @u}7¨ê*­ð¹y½P0©ò¨ª*°³Û¯úJ@_‡m}7OËVVWÓ ˆFÈRaªXP‚øDɳ… pA.Ž¿Èvg(Z ’£rZ ð# ž ŸF1ÄÊH“ÓO4nÎ&篼˜¼ƒíÂ+Ø1œ²ìqB+2½“O•bÄÚyÜN~¸qyÈ|–~2‘ei¶ƒËÅëטÓÀEÛVE×J6Y;J$¤g†?¿ã™®ð¸K§g«èƒ˜ =Q`z.BŒ‚Ã’R÷›¥ GóÐÆð³dS(%°Ô”6olzM{¼Jå`U3_¦³QUD)ꛎããrž·–)8j«ìZª[%Ë)¤ÂXŠú:蹊ŽU‰¹U½C #õ>&‚Í¥ ùZ˜‰&w`‚,„¬­¤®lp„6UKÜX†ìÐÔY5ñÀ1”h¾í—A}zÆžåãi ܯ—'+âïñ—Îã­ˆãtÓw?õdäàæ<^qÚ÷Ç_9Ã-O*³ÿìQbã.¯€5=«ÙœLMðmßhs×ufÀgm΀ÏÚ<Ÿµ¹>kó|Öæø¬Íúø¬Íôøì/Á§žüwØ]A-»'kõf½²þQ_-ÍÑ5íâ¼ t­P0ÉûÕ®-Ä q¿:ÂRŽrÀŠauìSZ^„Ôž6Q£n{|'tm›€«½qHí‰Ï°J‡+!ôÛ¾ªÿ[Kgو嬥“ž–‰èÕ„û²¸v$ÈWS·ö§>…ÂãŒcå–tff!8ÂÛšBÔò¤%vÛá Õ­01¤ne)åË %RÜ Íä¸û¾Ns:l¼ 4:çÓè×Õ\­!‹Ôiv\ üÓä±øÁÆrâ«jv™ušùý‚ƒº˜Ñ²Ý&j›è£&‰•ÎÔÏQ ³\pI²˜®"4¤:ñc¨¨IÒLÇàF3¤æp•B‹9º#4×à˜¬Ñœ `éï4XqËŠWß!ÏV²zs(Ü—EŒgŠÈÛ4 €õ·¹ßƒD ÓoQý£Ï[̃QUëÔÏaä_Õ±x&ŽU¶œ- gˆNå¿{· ZèIR5ƒÜDy¸dµamQbgØšè¸á™©lþ³N“{¼;ñ&ê S¨4Es-d[_[õNÃ[¢ârŸÁÔDå‡P}Ô½U“LªÎÚ«5¹7w ^•¸M ÚÕX”Ú*òïι‡ §ž#Ü^A$kA(ý‘¡„/*ŠÙ^•qX£ñ±ö ¾vµ†å¬ß¸ï2óº¯}²«>:•2NôÖžföÕÛ¥Ý#üëM3~¸Þ¼ÍÃÞzû·dÒÚFæUYL ×îTª‹ /°I¦0½—Dà=0XŠ|á2<]øÄÒj6š*®\m…M»h²¤~¬ÏQÔ³ºe¨‹Ópý«Rqôõ nÌS»,67[ZFfx§Ñ'ì}r1 Ôù®¢e)žš.S)’»¥BÈñz³4ÅÝùƒ°VÃÕ¡´!ÕÞð¹HXœ‚½àÝó´žïw•-[Ûé²w<õ#CIMWõ…µ¼®˜K—ÃN¢]šë7²Ýº•I#g†Fe±PØÞ:øW€×°Â¥¹,Í%"™M}jÈÛîÃ}–Nÿ!B,œ¸M0Jæ±>~w¬ û ÜÖ®×–©Ë27—lØ@Œ#u<7d\²ˆcüIx[º–´Ì¬HÚK`EC²; ^ÈUB{yµu°»«°ˆîDbät«f«)â¡‘*¹)îÆD¢Ûvúº-s~Å«¢~Šêg> GýBõ›ð$•T¤™¤mD/%©+…¦:njf£gVn¶Ü$Ú¡Ì­™Ø\x1·EUÿ‰LUKÂwid¼¶9ºah©þ´ ¼ &Ö){ÒÒÆènLTÈœÖ(·¢5Ó$-íâR^ä²?ýiïÁg쨂Dê(„”ô’òÆ)R,ÞÉuá5¢Á¯Ù¯ÉãÙ{ä( õ¹*J%-ÂÃh†çöýAQIæ-Ð@H²I³^‚uXûj!`¯þúêÝÅÍË€jÙ¾ {Jׯә”4œ5V(ùTÆcv…ù’Å?M2 ÐæÙKLh‰½Qw‹G ¨5êC·ú­½‘§]Û ø­†<ë ¹žS ´X«Ëñ˜¡6œ.¹Ø¡[9ê^ }E›'M´„ÝzáªQ3tþôuœ²çsÌuvfÛЀõ6=ê+žžê[ß{¤÷Âìö­š(ˆ¤îĘʋ4N·‹cvKWª)’cåÏ«ô4ŠU¤ÀßZ`MŒ%ú($:#G¤ö±Â“–ó|þ¨îŒÝVHa š@ÅØ'$²sj}|²o¾SýÿRðºÆr ¨ºj±m¹§­ïÛŠÅéÎ&fKüFÈ㘾è#è¶1ž“«Í\:§D嘌VQÌ»nv;Åy:²€i$ÐW¥SN”+ph¾"lCœÏÍ=iÌÁå °¦Hÿ¾´ZˆY½E€ ͈}/$~ƒ¥Ä< ¸]ˆ¿£bI‡%ꆈs"$“ÄætZãûnUþ?˜ÿCÁ|[àÿ&§´p¦ßÿ8\AÃ:ÙÕ69èÈž n똳&ãÛ`Çò¢µ²=Fh%föi´wJGµÞTÈ\õÔI-à`<ÎÔ^Ë‘ÞýZ©½a®³™ º€áŽÖdh[ûí×&Ú9ñK˜[½¤<Ý᥾ƒª{ô-Îr—hªéROÅ¥:*®ãMõ}”íZé¦ß¥àÀRH¨r0ìî^õôµÿ^ÇéO­¶6&ý£iÅ3sUià ‡‘õìæ‘ÎZwŸ¸:7 ÍQ'ü”˜-ô­äªÜB½éœ ¾2¦ús)N ÍüVŸ9ìÝéûû –­©)ÇeñKMæ¡êNø¿›A…d´Ó£Fçx¢úŽ‘´‘dEÄ®(¬£ÞŽØ79×Ûöå;ôPŸu™VÏ"EÓ¾îùžc°nõ¾xS´)™Iel¾ËÄv¤¶²g]Ô§Rž6ì®ö¢kÕ¬ëô•·ºÎÓ³$m·èþ¦týî³ÓÛ£TìÖ²¨ãÿ&ìߪ¨Açοt®oz»]æ'-× 0Å—_D4T¬l%4Ù±dÕÎHGî$ºšÈ±A¥ó Æ~ÒŠ Îh’/Ô`÷bµöjҾ¢–b{/îóÄüÛšÓý{È”¨Äßt7–¾Ëç]ë²Ê.¿ÍîßðjÚ<ͺ¬êÕ,®3(méà ‡ ô =ãwOõ×útÞ@h¡ß`Íæ«¨€´px­/ãë­ød»hÐÑ ¼mC%ïÅÖ‚f-2nmºŽÚ´§ºêh¼ ¤¯É[—Šä/8ÖY‡’4PR´ÜÒ]7)â9´4ãþ-Îøm7‚¥¿˜R¹kí[Îlßjµ $Pùök…^`‚–rªOÓr÷ŠFº×¸k¤çºÇŸ¾„p¨þ„/RÅö{ Ö- ËŒM±nžÖ‡Ö£ÛȩﳛzàßFØQ°áëp•ÎÀ@ø—%œ{ãöiyØ|#ÞÆ™ -7àœ‰NgÜàöžóã¦õp`oƒwïÆöX¦‚ÞYFïp¿4MõDåfUo«[u¦ôÁ­SÑ 1UõôEú&”Dvb]„œ–ARKÁô—cÒô}±y¢'ÅJdèfå}6[|l€<еʷ$«þ¾|Khõ‚:¬ÍlŸ  ðœfO°ð;‚.Èj-DUgï€*L{>×òu\¥ihyÄ:öýÁwgÿÕ[ëSGÿÎ_Ñá ’!‘¤R•ƒMlSç€Ë’ãJÙ.j´Iöu;»Åñÿ~Ý=3û^IØäé #vgúÝ¿îyøñ“hí =ÚGpîzœ0H„¸Á’…ù—ó, TèÉ×q8¥Rƒã ¥8‡¦½r(9…$ä)g‘pð×(œ%KK8Ó`*7  {6:ïþ)cI³Ãü0Ö|cw’&øÀÓA CéË Q€‘”Lþòj|ñìÌPXš?u•ž‡,Ýdc\Ë0¾’Ó©K¬…n€|„&Ær.â)éé„Ñ*vç‹Âe cµp#ä7&UFçV¥ [¶¨ë*L*­1úð;"•BФ]óv·w̳}±‚ L U2§òΑQ‚â¢`~ä¹"px¶Ñ.ã2þaˆ„òVÂYqˆ„fÓÀ"I¢£áp¹\ <ãùЪ8|…–½½8@¡íœ·‡NGký7uc´ñd"B©1AY=±$²£8PŠeŒæ}š­lݔ͊ˆª Ùûh÷l£]øålt1êû‹ñË«·cxwöæÍÙåøâÅ®ÞÀ³«Ëçã‹«KüëÎ.ÿ ™ÿ¹¸|Þ‰&CVò.¢È%I]²¨œâÉÊ@Ñbü¤"é¸3×Aõ‚y*ææá­Œ9)"û®"×*rŠáá» •¢©5Ýl–.Ñà.‚'cìS4„ám­aŠ™‹¿–h´ Ú¬Íd†ôˆ(sAkâo¡+Hý -%f, ;wfN{f]K%†Ç,}–VÉ„’JUãk“lÈnÄ|Z«v9Ø™ÿ‰“I°”{Á:¿ê”6æº(ÕÙ^˜Š­ÀÕá®°1fD!¿ékÙ3 ’20˜”Y û ˜Ê™H½DWZ‹OÉRK`Àɣ uÅ+«Œ¨%¦i÷a%[0k‚¤MK¦_N4ÿ+ãä‚U#Ó ù(º{0Y¡˜2ÀzKú+1“ž`_wé-!™»A÷kãºî-YaOeïëÒé>AŠûÔbVÔ|%üzÀŸ_b™ðÐ%öÅF0ögXŒKÊVzhþüfr†‹@»?—Û2Kn»÷¨)¶ÛûƒŠ$E)ëhàÊv6eƒ(Ù²Ýpt”7CE‡¤\Á, %áúš"Iœ:ض­³kŸÍd ¹X£{ ñüS†‘{”¶-ä''EzÇÕy„Ô,ypq×Yžw}ÈÔÕ¥S õAy ó¾cDï|\·02æî暢ŸùßZ9– Ó2ƒ3ßrñõ%VÉ)Ï —Š™Î—ɲԒ""B+£­Ñoämh€Wíwä¦rXɨ%‹˜äAr¿%GÞ/Ä·ž^ð~ ïú”üb¦5ˆ]½–EÊ”¸ap ï\,(˜Oš¯Î™Ázv¿Ó˜u¼È>ºÅFCÒ¶þáN3|žJÅ,še³\H#•N|—¼¨·?D`B=ùl<^˜¡—ªÖxd°6ûÐx •LÂÕEõ¯M7TØË[£|ø¦°?8õe<—õÐæðÎ)J*eÌ;h€6X»û"¹ôyJâ´PeoÛ\®;×£†..4-‹>ì]ºNÝ’ TàLÒØ¬1m§WEƒâkR3—É”IÙª´ ²èŽ™ÎzŒÛåhŽÅy‹U(7üÖ9ï¸Å,¯í’KB ¯ñë i`3]ÇÞ\Á¥ð¥]ŠØeù j^¶;»:–¶-ƒÔó6 žoØ#òEÌÉw 42͈@.£;GäŠïœJ+\µ¹Zº ®ÑJoë‘ï yá¨ôî^ž+äÀ:µáx‰Á / ±îÇ– ¾Œš˜S!¿‡&dŸŠ¦+¯™`Þ4K AZÃ:dcÀÓŽ¾|°ˆ×ãuÀÓ–„ÞÒ•ÑÃ꬈yQv‡×©ðYù{–ÝêY­§Mp´FL]Ò=“JÙ¤êkSý3©Å•ñ›®f±}aìÕ}ª=iŒÈjMËDëËЇζ­S,höó¹þ¨’.¹UšS”-‚6ÁV—UÆ2=øö[~4óB‘?ìÁßëïáðጒ{Ía6:NOà°YãínÄÿÛ }P¹Ì©C9êl5vo‰Ñ_ ÅÅO+ÎÓ©/¼T¶ŸEBÖt"Kxšïq@Û-Éúšµ²ñÒn,.S% ¡T­ÅÃU¼®zØv‰¶`k|-5K.›£!-}–.ì’>÷Ä]úkgÚgm‚ÍTº)Ìë‚óê}ÄwÕýÚÒ[U{Íg*q\4%Ù™¯éÇÍ©š¦pš©ìŒcJ}´H›±|zŠãoÚvyBs0üÙÒ£ý=:±û—­Ë‡ÛЮ_’nÝÚrÔÄvvð›Iކ½-å FÏë°iHžB¹“êNx‹eÍÈùN,é[v¼[³+'–2PÇaU¢íWÝÂÈ#ÈóPKmE™Pu¥Hª 8T=Rrˆañ¹Ö…mkvëÑŠÙõJÜØÕ–ûnð»Œ'´«¼‚ÓªÙ³a·vÌ+y+½r–`Uj +îrºßœ|ƒZ~Õºµ“‘Pø)UÈ6ÀЇòäIóå»3Èx€GLÈ‹^¸äË&´§“tT•\X<‚P¥M,ó©V3­UeY¯M‰â„n¯‘pņ¨bCF1wS4Ï¥H() p ±ûÎ ¦Øžï¶ "TÄ×±Œ$µ.»î~¦=“Šƒ—î4YÀZIç2 ³Ý®”¤d&f”>Í-©'Ó•ˆRþ› 0 EñS.ƒÁ —]¥±Ç/¶e×jØst$ XàœyŠB)•ï}+ÓÚYR£朋êRŸ$Ñg õHÜ6ìÍžÍ.?±íénKéoOê_ @ îse¤~Ùª]v@ZØã,£REQ„ÿ_lkGš »Ï]ê ø”•v¤ëeoïó[ aX5 ݪۯ˜´›Ð1¥Ùý˜QÏ8çÁñ\PÅ´øA¬‘¯úät­¬OÖ¾=ªR;.1ÎC ?¸ãï¯Å´ M9¹q\al ¯ö&—n±–<åßOøß£·­L•]ÚúxŸð.p©xËuÂàögy2èææ¼—µf}輟üÜÁ¯%èô#¤ª½²ãÏœíÇ­ȳìô{ø綸;£ÚàÂGÛ8¿WÀ0ôó“âG–þV¾¥[w÷r«¦ýÍíSÿ|Úª,m“|,fð†aq×$`[í¾à¶ÝVm¾‰Iá uyaPíGJå§-‹ ×ÈsCÑýP¡÷¡Ê&¡`/ ]´“Óâ©A™s»Y&Q§‚ë¤ýO<ùóþ®Ý‹åaµþ“>ö$‹á¸ÙÀÙ%!#2ùõèôqõìjop©©7l±Ì OyÉø“Ï“ ÕEÅ6I$Xìkjk]!uüÍ2‘KŠ0m ÈUu°Œ¨éÀ:Ë’7ž·ÝnGL+<’*ôœ‰Þ{ôìt~{J;šq„Goý‘ …>^î€%¨•Ï–¨kĶA( Ôb«Ðãq8$êÔ ¦ÒiNE4½ºÝÆtŒzã9Læ=øy<ŸÌ‡ðëdñËìã~ßß§‹Éíf÷p3›¾›,&³)þºƒñô7¢ü÷dún]†¢øSBè%My”<9-6NiÂ}±>š‡9 9„ò‘+ W‘RhST2@xlD¦A•iË6—%oÑÝÄʦÔBÊHS¼}´Hñ<†èî,ô<½äáåa;„CÍ’ –Ê\iLy'.ÿ?(SÔ£ûYN¡NÑ®<­æ E†ló #°ÆýèË€_Ó›çi5›h§–ÏÄ|Û]TúåYž%yÖ á‡×0¸´’ÿ}[Õ–LÑ7T£ÑЇSm°Ô¼Á€–¿èãsŠâP ½vq'‘dA_³6ëÈ|˜F†ý†BíÕK 9S2³›®±ÄÜÒÆ>œ}üð~6~w6t"†)[pÏÓ<Ê6zôíõè_ÿCÞ#SžÑËËxš’8ìõ³ö²W¸ ¤”D8f»n§ÎL8•IÑò¹1õ>Õ1µ;l`FE¾¿¼d­yh é·nEO0Jä B#=ç0sëŸîë[ôÐQsífOÿE'eܧ²âœpyÒ”µ¨u;ƒ<,ªÿC: ®Óø†¤S®^ýËEÄU[ú 6È «†­@ 2¾AGˆê`WÜöš ¸Ö%Õ·l¯àÕ~‹ã|³¤F¼º '©V"ý×KÛ°§=–¡ %¤ÎíÄ ¾ŽÖ¨ªLÝI0Å6œÔߊ(¢Ìíˆ"‰°ç‘§GÇÈ1ÖêPWÉjfÚeëàŠ±à³e9v…H¾±éK¾fë§ë²–§#ù‚5;~8ŠÐçž´Ám’[œOÜa2‘øÓ´-YEŸc…±2nØÿL ¯4¼Ñ`Ôb»>õæ8¼º6¥Ã¬=-sR~`~|ó¦¬GU4åKli°ÊcÝ;àógßµ’þAÏ µ¡C£k©Û•U~@}Sbè9¥wq]‡ÜU•åes/yòʼɦw°ÁYWõK†Õs+o>¸ÂN%˜ïó´p14dB§|SÌL× º·Šc_a#žÖŸX”·öÒ„çQÔ g¶Vr«Ë÷Ï,åN½©Ìôp«'VÝîÍ~÷L {úðTÏ…(ÌNš}WÄ`t!Gh ›‘Lq*6­¿\­ï ÇG¥á̺ýìMmë™z¦@Êúè€Eý€3ßZbË‹"ª2tI‚ƒ‰¿Æs8¯RÐÙX-:'ÊfÔ^|@ҥн£hôð‘ˆæÐÁù%½P›ƒƒv`9Ó\,ã þ$Ò Gp+×ËJ1Û+¯žÊ×”][]ñ‡Šìú±‘9êvT ™”æË ˜šÛŒ‹Äb©¾¹¤Ltáž¡   ­H?›a°º±³v×Ë\…¼=¸i|—[ë:èÓ·=ówœ.]ïÊXhf>zAÖúŠú)GþX{U˜Ó¥;ÝåófÎVs387§Âæ„éÄ¡žL‹Ó/µë4'£fl]©‚ƒr›:=¬ÄA«õË;©}-‡ˆbÈz>ùéúä/­YmOãHþί(!¤$lHF÷vnѭŠdv´š[¡ŽÝIzqܹv›á¿_Uu·íÄN£±„ˆíîz¯§ªËï^Ìýãã8†•Hˆtj…JU:;“ ÿ‰®tšéD­°y6¢DdYwЦßT$ÓLÆ`5o¸\ˆÿ õÄ.…‘p£ó4VéڗÛà­4 SI»µ¹6Ž«QãÜâƒÄQ15RÎej³ÀPJ&?¸Ý^]ÃE¥ý±ÊÜ>`©ì ר –Ú<ÂI‰8VÄZ$ R|0gAh£‘SabÒ2Ò‹•QÓ™½L¥ÉfjüF¤Êð&“9Â-êºÒ¹W¥¢µ7Fþ@B¤ò¿zï  hÓ¡{Ø9ãÝs±‚T[È3YRùÉ…EqQ°ù"Q"x·×®à2þé‰è1y «zR]ÂÒnú˜Y»8í÷—ËeO°À=m¦ý bÿ7´ì`x}‚B‡=ŸÒDfZë¹2hãñ Ä¥ŠÄeMÄ’<ÈŽâ@)–-žN»´; APuSi´ "ª^]€fì£ÃË!ÜáãåðvØ…Ï·£_ï>àóåýýå`t{=„»{¸ºür;º½àÝ \þ¤ÿ¹üÒ‰&CVòyaH ”T‘Ee\‰§ E‹÷S¶‘š¨ÕK§¹˜J˜ê'i8%ÒÌUF®ÍPÈÃc®,UF[kº…,ù€æ~$R>™FZ'¼ãÓ”~_`ôO1ÜÅ´ßçW!^ï¶]qÈ$)Ä2Ž©þAÈü+#y X©9FSÀ€Œ³þÓ>#%, ¾-ó=r õÀkú>Ò±¼ _ý>kkM…¬;räàR¹l–öÆ‹»Ü.rÛî@çÌÓGªC‰¹ºØ yráe_ZYEèð«™0­¿Wë¸UÙ}Ÿ§^+äGÏÐõ­m8bó€ÈÜ/èÐë¯.wð:Â0Brüîä"_$ZÄm̽Gâ—q쉃šå9åã½ hÙŸˆ„²]—ôJòAD­¶c†HDù'& Q (f"´í¥¢•´Fª'ÉÄlZ$ EÈW°Â4ÎòÄrÜͳ)éxN¥:³¡±{Ð6¢ŒeÜÅ›ÞÚ¡’ÜH¿p‚w˜Rlb8Ò¹EO°×FòÙ¶áð)›Qâ³Á(¨ØÌ§,ÃÓCç[xß/"\ÊéfWMqrç|üEò•ו«a¨_á3ÍX”/xcfú´¤ô`œBü«IÄ  Ê0ºŽƒX„f:‰Y>¯¦’™_–xB— cĪMà˜NÏ/æêYÆ¿ Ïÿq»•%äQIéì`“÷h­–»´ÂÂñ7n%ir†ª:ûÍ-ÛX;ÿŠÁ—HSç~…M€E½É>;9P'.’ÀmÏD܆P_ ölÕ?ò\ÎýO/Î8¿€wÝâ™KÅòY§Al‚EF%Ÿ×.g×MµFÌëö%³x›@øOƶ*Qÿ¸š£«f „ÖîþwŠX÷òß…È_%“MÛéi™*Uëåc¬#0ÉSÆhxxˆd·wêÓuB–B£wÀùçkaè#ʺ Á çUbg›kËHþÒò É·T oŠv)MÇ‘|©¹ô÷*èÚ‡b¯uÎ Îðpô(W0sZ«LžFÚܤÀé ˆ$¯­%ÜNó$©…޽dù(2ÄhËó5wƒ\éÜúpÝ:òôËŒ{³‚bõ•"Pʨ¦)º=ÞGto;…7½˜aêŠdùv}]ê…ËN×ÞÑå µËÍgµMcôÕcùø¥ø…%¶Úf,ô’'Nè­b¿B,G£I ö`ÍN ÆÛœÔØÏ´ð݈ÊÖ\Ú™ÆMŠ:@ ”D3ìQåZÃÀkí…œ×`̷͔߬³\GÂojc¤ÝѨu–¯ hÖÉ(×["eÂ]žÈg<`_ìùÂåWo7;ÎÁ}ÉÄB¶àŠÃ1 È)Çr³½\H£,ãýêN#"õÈ™j¾Á6ÅÒü¶Ia‹7‚8ÍIŒ†kÀCØHgŸ:¾RVv`K’ìÎŽ¹4SYG`ô’¢¤šË¼‹…Á¨ÿŽFﻤâ*ãnšWrÝHµ–Óë®Æ¶ÖÓ=ì,ºpXuæve׌³¯PÑZþ°JåÖ»Bu„1ï&.BðoîúµJÔ«vkØSêåf­zcš5P/r[SŸ;C8ùÆb˜…bØu¦ú¾’ˆ‡³ÑLÓ©o©†!ˆÎÖ¯¨ É´Ó¹ L ÄNÄÀM24(:*½8ðž\T¼œNÔÚ Îç™Ý¤QÝ_ÙÖk¨âÕcôiÃ{ß¼7¼÷¼TŸdôˆ+‰’0+V{DŽگS茌ŽSi…í9´¯I(Ä,µ."ãPÛùöµ(t~~îO½¯µ'tí…’2Âð¨½y«Šáz©=©ã!Ñg(Du ®õYˉÈ[·Ø÷¶:ë¢î‚ìiqãVpäæïG·ñ<®‡kM<Þ#¿.h*åKEsCŠ…7âJèX›Úl/Â+šZo©|û¶}¹_S fË{æèrcÊN«´huM¨Û~m²âV­˜® ó)[«½ç¦wdØh»Í朖íÎ[î?lÔ«/ÍñB&õó?-Û˜øµ4m[ÎV6‰›˜ª9"V&«žïA!T9£ùtÕ¬T…uääT¥<åî>Q©äj±TIsý$‹jqÌëSùlyÕ–IGxÆþNâAµ† YibÒ… ÄÓÃ`÷ö}Ò*Þé"7ÏôÜ6Q©²ªh7z4£¦Si¤1Ú´¡õ)}Lõ2 w¡Õ{øòy¡-wÝ(¨ÓkõZ]¸~ø4¼¾ø|y?¸ü{_Ëa5Ïž:áA¤•­Àššu¡¹&‘ upmš“¬ÏRwÂÁúØ»[ÔïÆºá«e]46ù—­Ú+lþ~—lu#{~Ì÷Å›ú¯Ÿ~Ú–Å÷’ )änüå7ÊTY:Š(«°ЩlE¾6Ü q­Qå+Úüµ!DÚ…bn Ÿ-&À}·ÿHP<Íçcú; I/3ˆs>ùš¡ %ÆMŒž»BЗ›¦$ÜÔ…Ù øþKO•÷ ~°¥ÜV´¯ÆÇçíÆÙ?Ö.A–½fñßeÞbN÷Â./?_üÅXmoÛ6þî_q Ø{ÛÇ4q›f f¬pŠØmQ C@Ë”MT–4‘Šâýï»;’’ü–&]Úm›¼·çž{QN_f‹¬Õ?:jÁ\©XB˜&F¨D%s0 òŸð"MtËę̈4¹)èN,´î¡I½Q¡L´œIYâ<!¾ÓÈ”"—p•ÉL,tÎÇW]À2‡4‘$æ°Lsk6WÓÂà±ÕbžK¹”‰Ñ=€±”¬~t=^\B„¾’üLi+‡”Ê,ðŽÒP¦ù'ˆP•˜Í™1¨¿X²#$˜Ë¹Ègf˜f«\ÍÒ2‘¹^¨ íM(”ñ•wF[ÅÞ,ƺJ J#jFïQ…ükïgèà:p§Ý,½+HR…–µv÷¡Ì º‹Ž-³X‰$di]e}ü蔤SJÒ¨y „!iú°0&;é÷˲ì v¸—æó¾±ÿ‘/Ñi/ó.‰¥ÖˆÖß…Êãé D†^…bŠ¾Æ¢¤ r¢˜èE™#âÉ< iíIÐLS šwCo^@Øçèà| Ãñ¼>Ç|N~¿~7ç77ç£Éðr ×7pq=úm8^ðÓœ>’äÃÑoH„ MÉû,§ ÐSEˆÊYƒOÞb‹Ë“Îd¨"bxɼs óôNæ\™Ì—JSj5:9Cz,•aRiÝŠÍWÉ+„û©rÕ4IÓ˜%^Ý9¦ôûÙ?Gº‹y¿ÏG¾Ÿ¶‡xÈ*‰b:-ræT¿åKlò"4¶°)ÚPQ ÈD.–Ò`L9¾fBdÕV„oAb[ãtOÃTšRʤ–Ç>¯/aµkL8¦$"}M;f! Xk”Ê“WxšÙzŽW|ëNÄ…ìè.°u·‰©µJ*‘…¸Ãx0qó„ÒÃ^ÒÁTRýÍ8ÿ3™IL`*i³K ±ãÂ&|GT"µJ´®ÙÁ(ã´då)RÉ ¡’?†ÓéÀ†vÚŸàT 6ÕöÕ ðíÙªÛB ÓBø×õ*å ”öÊEž‹U‡J.™w74 $µ6ÔF¬ŒUNU,BjMˆŸ'µ–ÛaûÎñÆ3Ýû-‹Õ.[Ÿ[ؽ€ÉJ¯#x[á×s_ù“Ww;Åç¾éó;ndHíå°ÆÎìÍØ»øjÛ,´álIÇA}báà+Õmªh,Mè CòA÷EkÓï‹\ Cì‚D–ŽÌ¾¶ÖÂØÞJ¢j$ŠØVÊ¡ËSE¯C‹A.3³²P.T¸@iC},ñÉ%-ÎÕ„Í3Êz-z0¡?Ãæo¤cES,MbWh!ÂKÉ:x-Y,BîºKT£ÕŒ•T=ܨc lÔÒNg#IÁ¬¶ª¬«> ¡-Ú´§m®ÞvئÚ>Ù@ö4Lgrà?rÁœ1Ê»¨×Ck6ðTñ66Ð¥,{Íý¦jÿí0âi_ŠÄp£`±ú¥5ì¿]Y|œ‹ÍRÚ¼®ÄÍÙ2™­w•pc¬ó‹ý)$îø ÎrfL“oEp<ÃWCGר%¤9p¬!l ›IÍ{…£ÃBYò@n0Œn µÞC®¾F?¬ €Š*¨"P‘Â}”öEÂJÑZãÍ6TF‹¨Œð½0=Ê¡³§TßÁC:í,²Ú\`Vi®i#)•–{ä³NªÄ¹A"ùãNíàÃLæ[­ØJœÏCå~EŒyHر&¾T÷Ô%]E5^$.¢ÈvQ{¼);Å&ïZï¾Å׈Š$dó··´ðÑÙ믫¸Ê•³ªíúdœq. Ë6>WÍø*ãxp{‹¸uªŽT8xÚn_u->¨lî¿j~劻ø…î™V+Ä\̘Üz{n™ENUh¼Zz‘Qjø ê’ È{/à_CK™f5eÞž²ü‰HC•«œÙ- ‹«Öð÷$áêdçÒyâ˜òž+sã.•ÏZ7/ܿŠ9A»îI6²«ñIgØÖ½êB}•^!‚Yqàdíˆ^.—Üz5øÓ‹üõb‡:Ç“§¨s";ÕY.=E›•h(ûRýÆ<òüA*mAø(ÓžÜ ñ3pj­ùøcË­‰ðþ)mKü+Eô¶zj«bßSEiöš¼F¸˜Òrå{L3ª÷ã«öq¤· (ØDó;N°üÔÙ´Š Ÿ¡?e`þ·ú}·ak·Í½Üfåû½:.-›¶ÛÍï__¶¾y =àZ·²­Ï–ñ“úˆEQé[·tnåð‡!Æ|;L¾íý'˜öõÇ %Ú;þOÈþ·cäšù7@ô¼]oËÇÞ‰+Î3µ|~*XÈðÓÖ>ÁÛãf#–÷ö/E9õÄ'vCö{w_ûíïš~Ôœ§evWnÝq$b-}²Zøïå õ/ÅXëoGÿÎ_1µ¢, U?ââ„8v‹aËDQ¡ån9¶>néîž1uü¿wfÇÓ¶"õ¢$÷˜÷üæ±üöv6™Uš''8+‘rˆdf˜ÈD–€™pàÿF2Ó2å×¹™åæJª)3¥Lë2ßGñLóŒ´<‹ð¿¾›9S®džÅÌ™AµÓ¿ª>r2ãÄ-L¥rŠ•å_¤N"°Dq>å™Ñ €>çV|ïzн¸„1ZKü±ÐŽ ˜ 3A¡a.ÕŒQ‹cAªY "[ëñ‰O˜ŠÉÑHÎJ$ržq¥'b†úäJÿ*£à }]ÈÜ»²âµF>£ rùׯ/PEb:ò_jg–{ÊI¹æKéÀ">3h.6¥‚e‘åöÞ:ÐÆ¯^ˆQÒ€YW@ŽWÉ€⦿cf­fs>Ÿ7˜5¸!UÒ .6?bd{ýËS4:ð|ÊR®5FëŸ\(Œñhl†VEl„¶¦lN´‰²@+æ #ž%uâÖ«iZ-˜ˆ®¯`ؘÍÑQ§Ýþ¼ïô»ý:|éþ¸þ4€/ÛÛNoнìÃõ-\\÷>tÝë>]A§÷•8ÿìö>ÔcÈP˜)r-Q¯à)Ø@hñyÒ3‰±ˆÐ½,ÉYÂ!‘÷\Ùª˜q5šR«ÑÈá1Æ‚Jë†o¡JÞa¸ïH”¯§”©åxwï‘Òl2D‚pgI³i?…Bx~ÚöáЊ$ˆi™+‹©f%ߨ<ò…MyÔ†ŠÒ ºVaV± rí@°Þ‚Ÿ?LÐÄ(ÆîYš#=¢ú’ÝíhJ­Ö›H¦R=â­EN!Qláîºáç™»]ð4•sw?BînÊl ÜC´`žx>ÆSÄ|ÌòÔ@UqÂyäÛeäÌÒ‰µ¨æ=B;º0J¼$n,É@îc@•„·"n«Tÿ«ƒ#4 QÔá˾R÷<ä«6‹”cºŒ/|0쎜ÄêWŠÙ>F¢ª3‡„E ¦¨RÌR¾äÁÉp1‘’êWÉ©µ1ÅN¢aÄÑõ–·¦ä’æø™¥éŠª§¨,#™úޱ¹w›‘ñiAƒ¥U>™âѽ±ÍcR˽þùJ¯B¾0v+·c¦ Â7ÿŒƒÌˆ{Ÿ; –ðO®í(‰-Ë,€Ú+fщ›áºpC_ûãwß i$Ùl5ʲl~ªNb \"÷ˆtÁtZBz‡;a{„Œ ³»,b·úàŠ/–=š×áyÀ¯ Ø0•p³G®´HGGèÉi߈èŽötµÌ»^­Ö sûûå`ˆÓìæÓ ¾› ?ø€4eièÂ>úËÛÛW ;qš×··—lå±BêíÄ ë$Ä„&ž„ Ö‹ Ž'6yOÈßÝ3UÂNû|*x\óMû?²&Þ,%AÛ3B%„áØfôØÞ·ÏáØðq}IañVPx!ÔVH=–Žw sÉ>öÂ¥ÔòÕÎ*!SñŽ«ZÆç»Ök9úÐ(³hÏã>º%qVqGZDzÆ›–kV¯›LíÊHßì€i¬±o+s˹,f?™Ö9×*t«âðm«êr%®Z>po|"gÓF@ØeqyçYdOÃ!-»—TC,Ú+)öãÆû׆,OÓúÒöi0¨}à@ýXàç ¥ëô|8ÄùS à­{);†ë¸#Ûgoe Þ†ÛÖ`ï‘€¾âánbù¥ßžôÉþ»Žíkì*©d1–îpˆÔUœØÜL¤=$tBÁdŧ2Kq„D÷¢œ–ú,‡fmдÒv$“ô,!¥¸ÉU¶×À®íAÆÂÄO4žê é¬0¸J–Ü"Á¡Ï ,±¹)Ù¶#.šÀv²2)]CK|ö[¥/ty—ª6õµ¶e¿ü«¤äÛÙÑ­-_D¶}óˆØiÑË,ñˆÝ”f&JÎC|šo‚iì —ö”ŒÁ߈çRÓÇê^œêçâtéR.®1©–t(¤}»ñ„Gwš°(ÖnÍUG*ëŸ>è\ W×A=§Œ²ˆ÷vÆ›3ý¦àP½CßgÂþ^%jaW~Iªh#™=wøª±¿¬+^]°¶æ3·ùvÍÔkÏN¿³ë…%ª7J´îä®*ö„*üúíUv?m¢Ê'çÆ™BXçzëPÐ.2¬ w6-àQ†Ã6@Ù6ß¿oûè§ÀÑz€þù• ópznµJŠ{yr–‘;XØ«‰@¶õ!ŠÙ-fëíëµËËÆÒ2Â# Tn$-­9øŒŠW÷–1#þ®ÚÜÞÕÅÛòì–XZqþ¾=¯üåXmoÛ6þî_q ÄkØÇ´Ië¥5f¬p†Ø]QE@K”ÌE5’ŠâuùﻣHEµ-ÇîúmAÇÖ½ßó~õ:_äàô´§0)‡Pf†‰Ld ˜þwx%3-S~]˜¼0#©–ÌhS¦õµHñ½y¦yFZ¥aÎB|™ÊØ”LqÉ"‹˜2ƒîp:ê¾å dÆI[*XJUyVb^ü ­,KçKž=˜rnÍO®gã«wc¸¤ ]éa¥0 ”J©î FS,йf)ˆ,¶áã;RTd)׫õW!Öx¾–cT!›c¬)+©ƒ¶QE©°âYÒ'míAÐlÓSÑ|ˆ˜zSËÆlކSOà—át<íÃÇñì×ë3ø8¼¹NfãwS¸¾«ëÉÛñl|=Áw#N>‘æoãÉÛ>p,ºâ¹¢$0RAåQO>B‹ë“Îy(bbzYR°„C"ï¹²´È¹Z M­Õd„ðX cA¥Iu#7Ï’7Xî;2å5“2µoîR‚€!ú„;K‚À>òDØ¿m»phMÄ´,”ÅTÐñì¿"FSµ!6R¡LSZÞRmyˆ/$ËkþϹö³Jë<ÿ5ñ+æÝµ ’Ç>” .*:RˆëãÊÈÜz×ÜØZl=ú@^…2â—ôWÀ„—’àžKûöìÒùÁøE¦ bn™z䯫Âd[t{/=oÐÍ[³"5>›3ª(¦qó´à c>}vU*g—^ô„dO^¶Y,¹[hR¦Ñ3&µY!c/€)ÅV]´Œ*'`#nÔÌ™>B¢H…%1GÀqlwRK7"Gá:ðÑ6«sdD¢èthT?{Öů±3ÞÇ ÔÝpS¨LW§I¡’§æÜ3œlë`{’UûâÓâÕÎÏ¡nïq“BÊ:l©ÊNàÕV×@ç,úÇkÅiO}ÝÓqRå^çì6äŒ?àU¢8¼¤xþÿÌqî,Bew{ì³½ÓßÙù;¾úž¬QmWÒ´>fÉÎü¬…íéÑ£²Ã•d{kc¡ôSoORñRdÑ·7º=uZ»híÕ‚‡wxÆÛ››Km/\´Ti#Ò”ˆ.¢ï(…ÕÛU‰gñì,lO»ÛNjxqq1e|?„gÅrN7Ú˜.•xátQŠë­q¿ÄëUGý¹+ó{)¢Ý㬲Ð2ÌìÃÐÎ"`ö̪Q¾=7¿HÐ…¯RÀ:Dxm MºÂ›Ò§µoPFp]/ní€q ìÛ]"‰rtCæXÖ>»«‡v#±×D Úîšn&n%¨ÎÝëoÔ/gŠ-ݨð‹Ó„-ù~$³ß ì·Æ$–RO`½ÈŸ.¼À›ä&÷>7ô¾ {µÒ“:ýìÒÚw=x\Ç£mùˆ~þ¿AH%Ðc´Û@ ¹Abp0…ooõ†ú;½>³.¯¡ƒT|?a½¡¿W-X…§kÔæ0j+Ø_î[(×ÎÕFhzÃLöÛŸ¦¤=98öRÒ—7¥ ïfh?G9Ï¥¤s®÷a] vü÷ú²ó/í=ksÛ8’ßó+—km%²ìdî®®ìÈYʼnë2vÊV&»•K¹( ’¸¦H IEqfó߯»ñ&@Jò$3;[ÇÚÈ"Ðè7ôâå|:´ÿäÉ#ö„Ç gÃ,-£8Ó +§œñ/Ó,-²„÷£¾N¢¢è@kìð&ò´à#VfÔ¸7†ðÏM6.—QÎÙy¶HGQg)ÛíÝœ·üÉs–¥{g9›e¹1‹¾HDMrÎg<-‹c7œøË«þÅɚآ °ŒË)´‰ ¶Ìò;6PÑhãÐQÂ⾘"Ø1ç“(!…Ãl~ŸÇ“iɲeÊóbÏa¼>’rs®)`5,ÐzŸ-$)Õ’mö3B’ŸwØ.4ÀN[òíVëˆzÏ¢{–f%[Ü@güóÏK@›Í“8J‡Ô[R§Çÿ.d”‹ˆ–íf,*±7þŸ±iYÎ÷÷—Ëe'"„;Y>ÙW$î¿Î^ÞœíҪϻ4áEÜúeçÀãÁ=‹æ€Õ!‰–(A)`±Ìã餽 ¥¶˜ ÓŠ@ºÝØ‘Œ¶z7ìâf‹½êÝ\Ü´Ùû‹þë«w}ö¾w}Ý»ì_œÝ°«kvruyzÑ¿¸º„¿ÎYïòïØó..OÛŒË`(þyž#€iŒå#KŸ¨-RNÅœãq<òÒÉ"šp6É>ñœÌaÎóY\ h @rê1‹KRª»z´)+ù+°ûA)Cʲ„züõ“Ô”ýý´êMö÷é•2„õÅÖ¤‡U¬È9éÔþ#eõ'9J2w”k¢p6Ïã´4–=¨w˜¤é P¿÷œC6ø–l¥"õ#*X~8øÈ&ñ' O ¦H ‚ ;/§ñpŠú)\†OÚû$”ÞU9p-¿J.tÈD‘r¸¸ æyšTÆ5?‡–É}üJ€w&ƒñÞ±ðZ‚Œ,z"Ò$@UHò$!¾@‹\Ñ•ÄwÜ ‚œ‘‚*4ûK°7ZµÇ$-H¤E pÓ9˜#Œ^fÒ#u!°qévI'ÅÂÁäa%X Ê„Óê¯p„)²s9å©#ê)Ÿ)3—´”ÀH´PCAê"€‰öBmJ¾ã^½LùR¨&㉚£Î€&‰ø(Û¢ºcsÄ_rRðMšÑ‹a6âÇøiŸ]¤à=£$þÂm“cÙ¢œ/J6úžÓ ðë`£WÔl·u$¡òqœr9¾à&ÛšòhzË·ÅèbïX½Û;f °ªËvÀëï56-Ê{@±+ø±ËvY2ÚaÍH‹Yh|øÚz,xpljV6…½{PCËáO„ÀÄðÄx##¤i»4\›ý×A’1œ@¢àÔŒJ¡jZJ 5ÃP$êµä{¶þƒ ‡Èh6Cž‹Äó#ü÷ûOü÷éSÖÂ÷¿Š3²3ð–x;Þ¢‘¿ªá·!>‹ 'ŸµÙó6û¡Íþ#H‘͸À’º9*ÝéH\9LCˆ/5#Úþ0«¨VŃÔRO4LboÁ!*w & Ñn-– ˆêl•ô*ÏÅà.Í0ô ÀŽ Ãaå8sKõDf£S:Žˆ9BÝ;ÎE{«jêGfL¨Xàa’3®Ûüˆ~ ÏX‡ï¹ö…8¼4ƒˆ{ÇÂAõB{±¯ýŠ@„Gö&ì«9E/ ósƘçD¬Ä´ [H' î[/,ð2°íe<*§.¤÷ø•3½êبàÜsbM2bš®„E7ôÉ PÐ — p©œ/JžG°úh³ZAæŒG ª¨¦$áó„õ`8\Dˆ e™GsVòÏ%JmcÔ0O³´£:U$4 éÕ>ý‹¿dï¯{oo{ïúW ïgGªHœf´nУw€æÓÔj€‹з‘ÝÆÒ?%Q>á8éaMO¿v‰Ñó¡˜áy\ÜÝ?þm¸_^]ž‘§òpï#·šÃÅwáÜ ,`ôŽè…'Â$ž¤BjÒwø8‚xTÆO¹Ã {o.~¼¼==;ï½{Óð{ÏŽšA ó–þŠV˜Z°oÎÎg€zÓ¿¾}Û;½½¾øñu“>n€Oàlø8à&à‡÷æõÀ¤vm ðêªÿ: ~EÎB×ãhpñ¸ô(`MÐ@+¸^àø6ÞBL"I‚>¨J1ƒÏ€KHHï/Nû¯oÏ/þvv*lgƒñcZ˜DŸãÙb&&–6bàŽÞ6þ‹M8ø…M-2?õþ6é[qÁ˜±)MÚDβ¶…OQ.§h\+§“îñ,†%R˺— ÄÀÁm),‡ªËUK7ÀfA+WxßK‡‡ÓÑk®†(–‘¥© oåf¸(×ù'>r£ %p`‰¿«å ŽàL.Š8ÁÑ uopÁ Oa*ŵY!þ!æ3ä­Xøw‚h„n¨¯`ÂÐg»Ðïœr–jÚt3òhæK… %À®œõI¸Œq•Qb&oæ?W0ëbزôfr¶;œFyÑêTÀ‰’r×UpŽßÈãëÆå”Ú¿Š þ3ÚìåÏPµ®0$)Ç#eæ®Îƒ$²ñ"Úx{K–›/†ån#GÛ’MmCŠŸ[¬%4Aølc´´wL¸êfGÕ׎Ñ`ØšY&TiktÆ[ÃuÃ1ªoo°Z"ìwÌÂ\Þ®¡ b¿S îšÀ±¥{‚­ú°#î|$êÄfà¯úO0+ˆxÄÅ­\•hŒZ1°Ô“4ØÐëð©“4Pö•p—mIÈ[FUÚl‹ˆÚòGûêy\C xÙW›…k3^N³‘š0M¦ ¶˜N¸±WÂn‚Pë?‚Ëš1Ôg´ÈäZã0¸Ë¬¤-ÍÕ\="¿Z+âU\ò»ËÒ=þ9.hÝ$Æsr§y8—ý±b1 üÃ0Z¸•ñ‚ÝbȺÁVŽB£Å`£ðDÓKäÓ,ŽIX § !,Œfß|óÕ¹Á)5Ø{€íÏ8,0jL‰9¶´¹yFk8™okÔ¶DĬeñ×¼\ärÉ=\ä¹±cývÅFÙ6¡Ö,Ò£71JNêÞ¯;¬}£}­Š¢É‘šDu´+D¤§ÚªþÇn xƒË>¸ã ŒDCÛbÿ bLLÜbÊIæq¡‚Gi&êdí4Dl>½/pýO½•gåÑ2UÙuÌA,(`ŒóÉ “Ø5*ÊÅxL[÷2ñ,³Ë„šE-m (*Q,þâÃiF¹ øòÓ-ÖÖé †Ì±Ö¡î¿ïÐ{ƒ¨Pù Àû‡‡NŠé+e¼ðf)jÁµ^Ze_d‡üŽ^Ö*•¯Q¥&<ÅXœ›ôWP™dçÍÞ"×¥½áž+/ÿ+;_5ä~ÊâQ#ëª~ØäÛ×ooϮ޴khcµÔ…ME®Vê0oW„Äe&BÊ:)|;Üåz_,ͳñýá°>AìR*…²w¸áù8’)VrŸçÙŒ6)Y–Ò&´Ò"¥q*w©L8ª–Ú'ÆÔF”ز¯8ËMÙEMx£Ñª HzØf`r˜°‹¦ªBMyz  pzu²Œî )œAEÄMÉ4 “à ãªSÚ‚µ÷tcTgÁ—¸„w8 ËÉx¾•VH:ázÿCmðG^Ö ú¾ËL›n½‹$;| sØ"uí¾>Tm6µäïcÊX£ƒט´Â­Á¢W%ÜæÁ¤Àu¶Ümò(!Hu3›Úü—7î5LÇ}\C›Ç­ƒHÚe™US>Õžp_¤ Ï­øê»àÆeÎþSŒßI, ãï缡Lh«¿±¬¾mí£3úÝU¯ëÔÈ÷zYm»Gá–ëÃ_Ëvµ[©5WíÏlÇÕ ú_(ø¨ñ6º…œÅ»´ø7r®ƒXhÚ„ŠBhô‡Úy“É‘þT±®Ìå=d^\¤+ãc3Vó²Ø>ÀÒ_’{{ë,ßt1FH_±…ÐV~–›T„î¡ed¨Â:6…~³(½WÙ84²~Õ&.Í—!*D×f员T³;~¯ó°·øG%3<–H(‡G[ìté%ˆ–æË§ì…oë¤ìÄ`"6A‘´u„¢ÊbVúí ¬¢&ÉïÁ=¹(0ÆJjt'Tó©³r»Týéd»dYËêë£t;mYGmìD§º‡z’\3ïA^Š—ÿžb@“éoDhXпŽûøjsΧXÆB•¢0¡ja ØH™µ²„kù'”DUT ´ ™V3 Ñ©¦ÜÍ1…%ƒýêDCïÖ“Í”ÅxrÀª0G ©ü@\þ¹åPç—ª4[˜4ó?çË|0³¾©cŠ;•Eþ…ÈËü?óæO6›ØãnWØUÞªbY f$9V—¼’åF8ñ³Ëh¦wœTÁ­E ?@Aeµ­J¯¬Ø¹Wè­³uOÛ Ö¾¹©‹à108Âò$ØÈñÛÛ —áz° …åæ­ÛÊRêÍÅÃÀ;Qýâ¾±äêoUâxœö²jÔ2©Þ…¢t/ò¯e´"p¥ái;þÍ4H´ „KU‘åÑ ¶`¯o C‘».¬¨¬*úäN<|™èŽ9z‹Gk€G9–Ñl¨º…R]‘"ù ŒîY«z¢åøÕû&¨¡Õµ©!ÍÏýÈáœ%ªz¾z߬ªÜ€!|0Â>6°hQi‚|zK¦ïÂZœWÖæ›NÎEÑÌÖ"ú÷t>^ý[c+T¬õmç/³C®+€¿)R·Cºž‰ª4Éï=¿ˆ7Ã, Y´¤½ÌUvО|ÝTü(wÛCu ͹;»jCÖ–·Èó‡J4dÕ²U£álòWº ôŠ“?]SPžÈ/ · VÉóêcõa̲ZV°ïËp~FKšœÇzË«Fvúpf·Z¥ðŠ tv}{U$´½WnÎ ÑâN›ú£rHìíH«Ý©ø!'ͦ?îï³kœÓD¡Ö¹Àƒ#&†¶úÌYÁ [`0<Úî#»ãtì°pÞ[GúTò3ˆ_%ul[BoÑÙ¿AŽ-Y÷˜>žÐRÀå€ï…ëå„Ûs5Z»ŠIÕ»¾x;Ãúã•{Ž/”C1Û†¢ýË_B/*b~ܵäür‡U´Ý÷. ²€M9,-Áá¬Ï¬Zæº:|6›ƒë–÷ ¤xOÄ0É褻 ò!Æ ‚ngÿfã·I¶¬5hŸz­€0å´Ý䕳ùþ +Ël¦K1ÆÄkwS„#„è¢e™TO•1Š£râ4F5„W“®<5j=Rxi4ãÞÌ+{¡çü¨T­˜Bj#ð¦yÞleçÈöeÊÉhrÑ ñ”ñ>ªP'\ ³Ó­Ñ£×YÁ“E–&½lŒCñqŽ´ÀwW¶z:ȤۜÏyTú“‡Ñ¼¦Ql-÷g CÐÿ”ÕƒÏsh<ÌÒO·€XÂÓÝ•$&oñžœt:ÿ®¾÷ßu¤âÓ0si<¿» ŽVH…ºõERR a)áÊÈ)¤ !ºÆ·nïJ鼈P¥áˆ•dD©n¯¨‹Ý¸k[¤ÊNì³ávç&ßp%ÃEB7a õ‰`Œ³Ö©ÆÀ峫1M~ÂÏŸÕy1mý9Góü|y*.%¨8&ˆxG|4 <仆g;¢Ó®z*A¸œÏ@=éì.áЖ#Tæºm}¿ÚW¸×æÎ•«ª ìIvW²Ç…à‚“—7¨È…8üþ‘á¨óÍ¡ÃP‡×nÈŒ}Íj·fl½½”Í–z÷³÷•^nê×!ÞÅ£Ï0м÷ÂRsÉ}p° ·õ…æµê]=ÿެøê›^X6“8«„»þ~·±Î=Ÿ*Ë'2wò¤^`ïÛ½’;á‘ãtÊóX¤ ç8„Å|å#Ú—5ÁS .;ÁB‚Bl´õ¶ õ cðb’l™Z0v#Ú'c±å¤pnhu0!™f(F“_L'©c‘GYi×l¡îlR—˜fñ8_s"ÐÓ]óÁ麆$ÃSò~iý`›‹‘£ x…—> #÷yÙ{È=ÉFQøDÇp#dh ÷ž´VÌ; îðìêoSG4ý [‚R kÅH¥Y’®{ã49”c­?„ç ^Ú¼·‡l•ÁJ­é=t|‰ÃÚcÖJ·bàyÄÚÐÍõ rZÖŽA_ô›<„ Õvúº~BB’NBÁ"g¡W›+ü‚aûÈó²íŸÇÈȲ§0·—©«ì<zëùØÏÞ4›s`v6ö¬¡Õ3 ƒ´µÌJM«±J›ˆÙù›[ˆ ;l²ïÁæQ£î›j8[SÇ¿Š†Bû°~§zezh^Q̵Té•—v¬/!‰*Ùb!&û˜-¹Hkñ,ïñѵòt…&æ²õE¸ö=P(…¡YÎÊÔ·v¿tñžH2‹ð®S}Uº{Ô»«kŽW¿ê [U±3Èváe XŒB׿Ìíu¼º‹QÞd-ßsX‚¥YºÁ¢ÞYÉWN#†÷nÞZé‹B¯ÀGjc»¦ò¥ª¶vŠ¿ºnÜqRw» ÞjYª©<[L¦îÅw9Þ­'ŸÚ ­øM °ö:¹vÖ¼ú*@wÁxÙ|bñ¨ Æž‡ªîh¾%ll ©”¨Â»™'J…}ý!þ€ë›E)Þ\HÜ-D)žOÃT2ƒ¶x·%}••_åºEѹ¦þ²ùåóLâ~šIoj#Œ&ùÒk-ªÍÝ£ËÊ!²c[Ž&%±î&¼ÙŒ]µœ}7á…s–aÐøÐ~¬xê«÷ü=ZûÙ.ƒªŒ;àC2\Ù*VX‚cFÿåðÙO.Á=ä†.>:û±J“‰ú„žï2#;¤»š©ç¼¦TìxÁŸ>ý¨ô£+€7cèWUØO¥¢ú4þä]…ÜÃ(KcX @jŽ‚I e!ÍD>œ ¼~±žŽÚÚ‘5Õ¤=u_tþ7ÎÕ,ê ëÓæxºÃÙۖ꓃«ƒj}ÙŒÌþË{,UxP®ý#ü´¹]%Q™k«W÷¬ôrÖ¬K…¯qC‹SW¬`8b±‹Q54:èãΟ^yM–èsLŒì£m›EŸwù_x6V‘uÛjÞÂ[ÎJ·Ûpnˉ´žÞíit™ÑVå/΄éÒ±INÕé)=‰þÎÞÃxd1(óhXªë1Y0©_F7ö‰¨}’dƒHÞëg°ßVŠwÜ6øì±ÀÆV0žÿ!mIJÔðx€©Rà‹õIÍVç÷Ûâ|êJÍkÓª~”>c=ó3#AšZÀ%n ´ àè’Õ5¸¨Ÿd¸ïÀÛÿ‘£cK—°XS"Ê1¿³ë n?løåOÑgÕ³¾âʱk:,ëb¼E˜Q! |×4gŒ†•" ×Ôìe5´«ÄžÚŠ€v[†üox:!ü‰ÀŒ¢£lsƒ ŽbîoI è¯kÇ%ÕãÄýTíÔé¶®+ºoðZ¥Þë¨ZÊñÿøho/zïp‘¼¯ÿ®]¥Ÿnœp¾ª/"²Ñ©UTý/''´.óÁº>ç ÆAXÍŠî¸Þ5 ŠÃÚ§faªMÇÖË™ú²¡ÆN/²ÔeÜæÈµÜdAhw ï\pšÙXÚSqa×’³)´Ã¼*œ:ò$Ö>¸pWqbâÓ¿èJÂŒ;yêp­µÖò=—È·A!î¸M0ŠHÆ)Çzá(¿jž«vG_qmüžúìÙiªô‚Íúå±LRQêQÜ žEŒé$n ÑDÙ‰ZN7“tc8Ï—øs ™2tËò§b`BDfÓåÅ%Ÿ×c§ìÇçh7vÍfMìEVÑÇ{Pº¡íEûÂö•¬'Xõ|_“ß5…æñRÅ[És7lGçqJ‰ì"Âßú"/Éžb?Tz˜§áKÚcñý,‰Kp¢‰‹t„Ñ#Mé󷳿œÌõ˹À =ûÈöº÷=¿†3È:gÆÅ5+Ûô bGÿ°à¶»»¤z«KѶaJ;'…<§B¿lAçÌå=î8É ßZ(ÌV!#~/iÓ蘸Ǜ,$NVMnÝq\óNî\U“¡Ë «i ·þ©¯ñuê¹í«Í­jP‹iëå&*€šÐ éDÿz€RíúõÑ×G/ýµXmSÛ8þž_±Ç0%0)éÝGh()%mæ¸Ð!i;›FqLJcå$™kóßow%Åq^xkÏÛzVûò쳂×o&£I¥~pPh%©„HeV$Y’Å`Gä¿Ñ™ÊŒJeOôSy&Ó¢Tsˆ]$‘ÌŒ€U hND„]5´S¡%´Tž „MTÕf·µx+5¨LZi+ívÕI?·ø uAÄZʱ̬9èJÉæ;—½öÙ9 ÑUÂãpèÀ4±#\“˜*}C4%ƒ„¶)$>³#Ô2z@QFj2ÓI<² ¦™Ôf”Lp¿…ÒmgŒ3¶ÅXg*÷¡,Eí“QƒÏhˆBþíðTqvüÛýcFÅ 2e!7²°ò.’‹î¢cãIšˆ,b´n±úøÕQ}ªÔpyKhúY;9ª×§Óé¡`‡•Žë!Äúf¶Ó=‰Ņ,•Æ`¶þÉ9îÏ@LЫˆÈ©˜R¹PLôbª1ãY\#´ $X.S‘´à"†¾¼Ó&¸F;Í.´»;ð¶Ùmwkð¥Ýûpù©_šWWÍN¯}Þ…Ë+8»ì¼k÷Ú—¼kA³ó•¿·;ïj 1e¸•¼›h =M(£r°Ä§à±Å×ÉLd” “ÃËâ\Äbu+5·ÄDêqb¨´ =ƉeR‚®ÅºäÓ}C¦B3)•2âôÖ3¥^Èþé.âz_…Fx|Ùîã!›$Š•kæT½:ÿJRŠhonT¤Ë%ްá)hâãþß2²Ž`X3–¤†‡š2šü #A/"©™£Ô縖ÙAÔ%2áOp½é4„è ¬¨H“8ãlÒ=‘‹~g«”{£*!Á½Â#ƒ" ëÖšP[ø†ÍnV%m^Ö³S#×TïJMCCœN´BØa‘»>$×aáêÉ;K¤ž¤b†”^rýp³—€²‘–K 7\!°…U‹›¬˜K2 »œ·²©&="- ò@X\m’,\ø#7ú’äW–m¬$åè¨yÑ~ß¹¦š+X¦±«Ê˜Í)ЋóVo^{ âªýþCoNå û£w~5F3r'Ö+ŽXfaå[…¶ç6¢ë€lÓIŒT:àôú%Òøuaùé­@ÕZÌªŽ “qr'û~A?n±õ°æ»…¥ãÊÚÞZ ‹’™œ.yûQ«˜°/ô—¹¼Þ<  I‰,(ªÉû({ ÞsÜ¥v¤U»QÅÌÐyDS¿ŒdÌPŠ0|‘’‰Ðb¼Ú_œØ%û^Úñj ᛦ§«pN¼oŸM\)·³·¡¥Íu·*”k—÷Qªa˜g‹ëõõ"-Õ"ºìíÕžãÝ@EžZzèjlc÷»óVóÓEe!éÚ%)}yr}y¯Âžß‰ †M÷·-v~,y´}){W¸éÎ×Èù1h’n"Фy°ö7r1–¡AçÖ²îJ÷Y¤ùÚZb^–•Z@‰©Sîê·ÂÈà^GY>²žó9ŒO‹n}¸Ú^@IŠ¥áSQ!¿†OtC2PøˆiÁ‰ô)bJ&¼ZÇdU´ÌÙö¹/ºçO‚üûUFÒå´XTu¾øóáÞÔ‡,9 åO«y©[oñlϧõ[.~˜õ«¨-UgÆÜWjÁÖœm'{¤ÂaGy_u¯ Onx–=n>ãÇÚQn„>ä5f¾šÍGQÛj×\¹V N×âÆ 2G#(õÂúòkWHÚQé]¾g®©ª~_h40)b÷× ßÖžÐµÖ eÆ,ÇUƒ·ÝβZ†k¾ö¤Bxs¼!,/¾Ïˆêûwj£Tf‹w¯á×ÿ5Öàn1þiz¯~4n7I¶„ÍñüÒØ:©`CX/^<u}ôL0·Ó3±ar¯¡rÅ|Éöîw£v_j·¾tÉÛúšÓ³÷lbøSÐ:'ž;¤Ê;o§ ÎXpC4Œ9Ø:çxJÿì³Mÿ<žÎù%¥“ Þã~5Pt*Ÿ&ôo ’'ž<ÂÑbÓÙãÇÕøI»¿ë}ôxP–äÄ æ+åsÉYœUðëÍIå?íZës9ÿî¿¢×åZ GÀÙIì„M섺N²[[©”K tfXIcÌíúßn=æÅ —÷’lÝT€Ô­~üú!i^¾ZΗÝ'Oà œ‹CGš‰HD3Ðsü¿Á›8RqÈGlòËxAÈ”ê Ñ|Ÿ€ŽÍüÞ’øß0žê“Îã$š0-âš½áy ð+—Gœ¨c ‹XÚE¥'-G`3Éù‚GZu†œöƒ‹QÿÍLQR¢ŸeéP€•Ðsœ#¬by SdÅ&AK³D„?,Œ D(ùŒÉ )Ä˵³¹†xq©æb‰ëH•á¹FYÆ~YÔu'N•œÖÎmø‘Ê?uŽ¡‰ˆèж^ê[CkHϸ¿ øR£¸(Øb †Úi—®2þæ˜Äcr0£ ÄÓü4`š¨é/À\ëåónwµZu˜¸ËY׫Øý€– Ïž¢ÐžæSr¥ÐZ¿'B¢Çk`K”* ,@ÈVäAã(”b%ÑâѬMÔʃ ï¦Ìh^DT=?ÍÆŒ{CèáçÞ°?lïýÑû‹O#øµwyÙŒúgC¸¸„7ƒ·ýQÿb€ßΡ7ø(ÿݼmG“áRüv)I ”TEù$‡'/¡ÅùI-y ¦"@õ¢YÂffñ —&"–\.„"×*r‚ðXm@¥ˆtC7%¯ÑÜ×ÄÊÇR‡†âõCJ·Ëý3„;›u»fÈÂînÛ†CÃ’ ¦âDLu|àµL §$'c¡¤-mü,1èѵ¥T@ºaœ ÷LBÈHÑ4žÄsˆÇÿáîÈ t‰ %w)c4¬f½D>AÄ:\·q,T±#33†fºgR$a „ee—†#“#¦)ÐQ·pÜé´¼‡^ñ„ŸÒ§nÞHÎ4‡ˆ¯2 ÐÐ-rb~ßÌ‹ÍÖ 6ÈbÈ5Lø”%¡›yrº5”•ßó|zꦜ@cÎÙ$oä¹]D†t®!°²y` cÏçóñ—§§”KÑ ÄkÀŽÏ½<ž¥<žy¼Á Ëyìòšcl`rŵ bÌp*ŠÂB1‹IÉXÏŸ÷>ôß ®·£³Ë¼ž}Í¥•LÆÉl^¶—šŠ#Ê¡iÝ~=2K·hð›én˜¼š$‹eÓšeî2ÈAÄÞ;ÉÊê ¸¶åé,ÎDäEÉ\¶Ÿr/»`¥°QXó¸òì•ÏDðÆt]æ~W¬¾¯Sy)¢ŽÆ±Ätnàäma¯°ƒšÉãYݶt.Q8”ŦÉ"“ ©.½Lô]µ0Ó 1Î7–7þqˆ3X›/˜¼ve½ÈÁ)pè>&£Óó„–§Æ€*R ó8œ”’­›ç§¿Æ±ù±iýwrjÌ×rºæ$טOɪ§åµGùí°Ý?Z±dIyÊ:µ [Æ'޲µ¹ºË߬”©?ÊxF­À˜É˼8vºÚu~¦#bnÁõ«5¾PYrÁOE©žlº/IfþöXw£ÛŒ¦Ñë =ÅäL5[p ÇÐJ§dªÑ“Õ/C5ãÚSQ)89ÅŒ%g9›LÒ•hÚÉ­I{ôL…7 UâVÍ‘›øhBã£GC£ƒâ¶ÍúmhT,Û0e·ôÜmüâaý™ŒO‹„‘ýt·ó—Ø(mûfâ†GˆÓ)v(¸Àý…êT.~Bt§ÍY.¡¢IQÇ) 8EöÔl¸4¶›Ë··,­›®Ý´ý§(ö›‘h‹‚#'*%N÷‘ Òœ×)ÙkitÄZ‡0’ ÇLÁmgRP´ 1í|V‚66Ø8óGH-œKŒbS°ûoÉv´3ä ³òöp·âéš©®åÀ·€ê ’›þ™~y¹%°îG®eÒh{vˆZ²ýé  š¡ÍY÷|œDÊÕñøâ ë!iÎQlÏöñy€f¥è«AúØÁ£ÍÜjžAÝñåèeክ•³•ÑÌ£ »hZš¦(Z;p%—ZÐæÁíLÚ$s¶Ç&1·%Ç@û±"¨"W•»¡¯!︾?ñ}‹Éÿ, ÷fí¶a7‚{«SU_={@_m-<Ìeˆ¶7[u:iúá=È}£×,Ðð‚ìÐ*Ö…ñ#ä¼o:iÕåk¸º¤ñ)Rÿ ´QÌIª›E)nž¶ûWnp'¾«þÖˆôÀ*™D÷7ÅÙjÛÛãìÔ¤|àºË®-=«Â,MHÇÅSÏëãût¦lrD+ó¢ïaŽt :Íq§-îtæ,ÝE–QH†Ti‘Ln“¤„—£k¾NϹ®èKÑÚy#;)|Ú3”öâz˜G“ìÇÁ3ü÷9ï²o )1¥„kP˜]Ìù­½‹Wü1em"ñ§XžWîÀÐÙ{¼¦þ¹˜;†:€ÒŠkž»ËáYŒ3<wÂÒÚÜ-Ô·ÿ¶«Ø®lï,ц÷¼GÜp¥ç¶Ûýåmùt…Ìh/=«=€ôuÖ§¡X>â·ÚVºåµ¢(RÍhNTüž÷ÂúûóDÙöš¤**ÜiZfô„I–ª=Ctu®1c;úfè<`.×0Rå<ä„þ®ýP——Ê*ç/é¶Ú_ò•ÀÔ_㺮ß;1‰B ZyPsäóãçoL²gY€NNl`Õù᣿ÛDm&®!¯;ó÷°”`é]ï?ºÑJÛD`úÊò\Šø(É]M§íÅÄÚ¼úuß>Ø^Á+óvQº”Û O‰A&#nôÑ…[M~E×)¶Ó©î¾‹­nîê‡H¶5»ÅÓœ2aUk½Ñ®×šÆ |¯Ëéå*þh>·óÝ9‚՞Ѥû¬Jª‡ï¯²=œJÆ ¡©´ûUì«Îë¾õ7o˜d-{ê–Ê+G?÷áì|t×ÞÆ¾©±/ÕeÿÝû½—rׇwekîmå¡mOR6NOúE­„¶/Éd±°9ÝœøûkÒçC…‹×âz\L]YÐ5\pâ“mmq,äQ:ö’vŒx™Y£ ‡Vˆ6àj3=§½Ïán÷cL¥×/*´·×Á5j}(]o"T¨õã÷’ZD>Øó´Ÿ›Ô‹ÇÊç€%)ÚÛ,[;hmW;l¬³ã½t.Ü[›xh¶/®\W—ì ¯P[ Ly{ì¦ »nªØàwsÊTwݼ[^ó5¹ªhÿýil{¤;hé_ï‚£Èõp™‹±´ãŸW§ÍXmOGþÿŠ)¢ƒ±I¤ªUˆÓŠj6"UBëóÚ>q¾»îîaÜ”ÿÞ™}¹÷3iE£^U™»Ý™yæ™—ÝÉëŸãEÜêííµ`Ný€ƒ…Šù¡ÎA-8ð?½÷Q(£€”Àã( À ˜”]!©sßã¡äSP‘–8Ž™‡?£h¦VLp8’pÊ”…°{<:m¾rQÈI:°Œ„1+üI¢ðC`4› Η Æg×cøt|uu<NFpqï/†ãÁÅßNáxø™$?†:À‘24ÅïcAN RŸåÓ\>9 ”-6N2æž?ó=t/œ'lÎaÝq¡k"æbéK ­DSL¥¯tRI­øæªä-Ò}Kªl5Qi‰·w6Sz=†Ù?Çtgó^O/¹Bøú°mÊC­’RLF‰Ð9Õs•ojX.î¬ÜAÀzÕ¥¯”ƒ–I üƒÉZa&‡^¤+L²;C¬1³äjMµ ø‡ÜXb˜çQ@cáß1e<1 ëÚUëK S´«ôìÁ;?db°fœZÅt%X¼ÛÆ$æéŽÓµ[ĘÊÓà¦le n¢¾œ’”²Ë³K§h–„žî…™Ý. ,1<ÄÏ<¬µÔ„/Ø*° ³ÝÀ"qÚjL>öλ›Lµ4­âz|zðS ®«ZÌC/UÄéqÿNW´Ó¦rNb½cÏTEò“2¼u‰‡G7äªçà9M܇. #Å_Á¯ì–ƒL°`›ˆBôqAõ“C‰Xè âôQâK§Î`r1÷ûVCsYµ¿å%um¯ü)ÒÑ 4œÝ–'”õÛ^¢²ÁU"B+ö׌’Ûµžþ“ Öc1¼Ÿˆ«ãPôáÇ:Îj¶~·:ÆR´Rhku&eé!ñ€‡øWßFÚ|pŠw4ƒ;Ð>ÊD´zªˆè•z¡¯¿Wdgg稕.ø3ØMQôû}8´‹8é±$‘¸ûô ÿ*)Ëð}:ÍK^cI›eV«zþܰù¯UncQR1¡‰0oØž8¾–6ÛRŽ“ ’”q|ئSij »„SJvÒœ½½v\gßö÷ýÙöLT!˜”³â8èéõàäÏ^*¬lì:½¾IèT¥`\e€Ibnn¹ÇDÁÁ ä¸)lÓ‰ñt?—©×µ"›½Kµä¼Ì!)kl>|©L ¡Û@kš!8È'Î~-¤£ª¥”‰~ŽŠxQ³5Ó^ÊÊ%¹‡J¤?rƒxÚR+×d‡â—EžN·ÓéŠ'd¦x¥+†‘S“*…|ÿ{ŒV+RÇ×›¾+âvE¬ªèIb”‹K­zº6(ÕhT#ÒzÂYŠàcÑѵeêo£ËrF&ŽxšJ¼1`þH^ª¢|Ä6ÒßÀ„ë©ô[”J½¨•üÏ í± 6ðñrª£kI$Š^U˜2%4Çi.ˆÂ¹žXH“÷p¤yòxd»_Ó0dT=M È ±È^jëª ¹¿Ÿm//û«õìš¼âR¹1ÙÜèJWŠLñwý\u7žÂO˜Éµ·{mqvÌ»Þ0נᛘM¿õX“šÅûñ±&Ýý¿œj,:§([?ÓèqF6O8ÓøaœŸBrS "9çá¼y²Á v¬o¯cÞ0àlmpË%Ò`ÁurP:y«úZÐÉ,õa4¾º¹<þps5øål\tŒ¯ôôa×àhÛ¯¹K+UÔ¹ž‡ªÓT7Ý\çu3Q ¹þ–œÎ?$L½9cþ‘)Ãa¯)h£4¥¦Ÿ‘óîb|ö¨bJ¤ƒ76Õ¾¸y9#»S¿f}ݬ¥`×µ.¤ËmèÁKh7èHI­,×Hä2¨v͆§²æ8;?9ë»èö, ÔuÅcΔ¤4ÃZhÃFs™SÌ' ù-_Ń¡üañu€ï R©|‚Ò†©©8jQB{WÌë²çm:’Srº$6Yo‘ÏͦTÔ7Ÿ|^UÂã²ÕáëV*¢¢H·†¢¦)Ÿ1<•šÕ›¾ÑMí”ÿñá¡…9ðó›ÖßµYmSâJþî¯8CYÞB±j>¬su'BÔÔE`“0^kçÕ’R†$›:Ô-ÿû>§“h ÑÙZ>(IŸ—§Ï{7¿ÿ3žÇ{Ç¿ý¶G¿Q'ŠW‰?›§ÔšÐÉÇÿ8<ùøé3I(é"áƒLRE¿ <½/ž<ŸÉT3µÏÑ”zì¦Ø‚äÒ@¶ÔþýÒ¼,ªŠl´T%iå¦Þµ¯ç£³!ð™fhM¡x ~]4Ox¦ŠÐ•‹8@ `s+†êùazuõFÂx¶LÂRä0yKãÛ¹ý Ÿ#y»Œ¥PÖƒrñAaÉ%¼Dª­ U"9®ä|9 J¾±­Z+\êYÍY-?|ØïkI®ÿ·š—/3žZ-î#NF-0É,úŽštDïá÷°±;b&äú˜Ùš³_%¢²²+ðtýD³ø{"¡hßËßTJXa_AÓ*ÖQn³‡3a˜¼9;ñö_¥e¶Ø´Ä‹HÅüÛ²ÆÉ9Añda>lŽÔ-R_,‹ÌÎÊOa˜U«P¹…÷ø8›j—èj){5”ÒËÆâÆÔÿÑ AJΦ‚+,"OÍ—©=…Ù øðzH߸š ×Ô*Ђw¡x& Áþ‚¸Z¼ÏüUCéRÇ5þ»ü`…Óh-:j¿¡0”4ézÈÉݪ¯ ué].'›ý‡xYêw¥|襬|×5¾Í²0œ‹d{qÔ•¤ÐvvFMÇíbþk¾#av8CNæQÖ ¶8«VÚvyEAíY§§vg<øãgŽã£¢‡hrROEâ)k†3¤Äc’VKdqª;£¯ºWÁ4¥^•ÙªMuýc§63ôê­_èûpFåæ1ñÜB§ R:˘g“¦Â²žÅùãm–Å l{`¿ÅÂõn|“5¢¿sDÏ4“!W=€ÚæêŸ¸¹::Ánq¤2»µ©9ãÔéŽ;ƒ›¡Õ3mä ♣ûÒèáØó¶¾Xk¦Æ-N0ô)#JvÀR#ÏøН6<¾gÑ×|1”Èÿ,Qk<ªà¢‰Ø€ŽjµiOsc,ÝKD‰ð¸tã°-0m2ÿêˆO&•.ïó›)±Ò ž¢ä»¦ÏìFß ÙàvTWz08É 4ê ?ª5óÎá€-t±k¤¾ÔÕ¶ý¹Ò±T‡yÿ«-cOIõá9š•ãÏB “Ìòâ|á±”õµ\çîIY£/TŸ¯¬¶á3 Š7¢|¥þÞc‡U_ 57‚ƨt¾x¯‘ÜU,k&³:¹o €Ãs}.Ø]OëëŠN4‘Læþ# ÝK]iþ¤°ì(*»õ™Ë?ÈÈ4–ÆÌ‹£[3ŠñBÍ_:‚š…8’iQŽÓÓ©‰Çy”‡%<+@¤5ëÔUk+Mýñ5Wf&I´9ÕmxöðD*ù5Ç»ÂXÕŒ.êvÎŽÒmö;öÝÐ5»¨ØÞY±C¡T£<Ç1¬¡½“/•L_¼éëmÓû{ü´n}(¤ýJ’p¤òüSZw}>Õ¤CÞ ÿÇð/¹öµÂ²írÀ„—@*ø°Ya.'|úz)bº—8Önb‘ˆ‹¼é’Ct嶺5<²Žm²rô÷QHn¹ˆRœtø7’Ò¦t²y~ñTŒ I"VÕAê#çkØ%ÐHÕÊô©†ð©Žð¤žpî tª1濜Õ7ë¸U¡/bçLGј#¾UÁ4D‡A³­wιjS‚Žr_™ý„Ø*D¾õªæ5Ìçqé‡?í]}XÎfýÝó]îîO›½~ÇÈûø÷Ç¿êûótDªDµsùÓ_‹ª“Ï‚d)m#c;Ù-õ¤*5™.*(s+׸CŸÑÉçÏou³ÂPÿƒ$EÞRg ;àtûíÁé8.ÀçM9ÑÁ#0ü¼žó¥ÅÜB[ä6ÞäébâéY}·îL·áúºM÷J%jªá–Ð>ˆÕ¯Í[Ï[~>y)Á¤G)OÑ÷×W¯^Ò?}PùŠ~/…u¶^.âX?ùR¨~Þû/µYmsÚHþî_ÑçJ-"Ëâlªòáâ8‰ÙVNI\É%`° I5’ìø®ò߯»GB L.Y>y4ýöôë oÞ%·ÉÑÉóçGðºqò(ƒ›Û ŒY^¾xñÏ?^¾øó˜2Ð ýèNÈ,…7>þÿ~ªÿoÏÅ[¢6Ø:)R!ïżëôÊó Íd0ͳ ŽÀæ§‚Ò8—3Á+Ó òå#,b¹L[ðd·KþŽó –ñËuaè€}5êÛÈ8æÀ³-·ö Û÷ìÁE £9ô o_Ùîô†-¥šµƒ†çpe9ÝKü×ìØ}Û»f©ç¶7 ‰ç(Ò„‘éxvwÜ7â4;£¡k™Ø³Ýnß´¯¬^Õ@¹`}°¸—f¿¿Ób4¢l.1ìX¨¬Ùé[Jܳ«ë‘eë§.âˆJö[àŽ¬®MÖ' -2k¶i‘³ký{Œûð=ôÌ+óm4*UÐ!'uÇŽuEŠω•;í= .†Ã#ïZλk¹§Ðº ÜØµZ(Ä3[ô¹ jøŸ;c×&üˆ—=ð,Ç<{8h"!ÔÔDêc=°ÍÖй&¾»¢/-\G·¸p&Áá"€]¯¼¥"ž^ÉXX}ûÂt-z;$Fm×jrh9¶K{l%ü£‰’Çd>; uS¥pn±kÁ>³÷Á&åÕf DÄ.ÂWÝq÷²@_gÆûÄŸÝù7‚ÒÊÄŒ cÎë~Ž9&9Ýë(ï×UíŠV]‚÷!VÄ(e:núê_|urtÄ5UàÝ WùE+ ÿ=:"îŽÀµ«“á«GÂÔ§Âãë½Ü,°Fc휅9U |²„5è«ÀTpÐŒ~Œ‚ê—¼Nø ~š®¼ä` Ksaø†ñJ3MãY€ {Ž/%–`ªÎÄ µq'›ë΄´vhÒÊ#·ß *ñ+³~ïKų´z²zF 31VÈ;­×2‚8¡¾ã+?a/’Ô#¨!%ì%RP ?L|3+…)öéG¢›§$™=yF½–6¢e<¡ÜúÒH›?/8`–$*Ÿ=zt•tÕI}š"1Epî~^Ÿ+TéøKt\¯„‡ƒGšùË„¼Q4nJ"\“Ù>E0ËÄOi’iþõ*œã„…ã² Ò¤è2Á¼ê0йśvšVeŒÍËÃ:^ŒÖÛa…Þ9LD‘:°„¬“±‘µì+ÎqEF‰¦û‡&¸ 6‡”cŠnðŒ&ˆ ë1‚“SLÉ(¢Áz€¨M)²\FpóC]ÙQ£„A Ô`±ž6hÓ!@ ï…¤£-Fbáça¦NÍâ>ˆó‹]°šNTU: ¦bÑ#‚E SÍÅ¿_Žš ŒBj <«™¨Øö«ZÏ64¾=Qö4>á4Å*ºNí'g­ÿ•>òìOƒÄÕ RžÌhÛ!¨˜³™Àù_eÐ,—’p]3BÑøwß8T±å¦lKÕŽ‚]Õœ¨Epút†Otdå$þ†³c'43²­ÍzÊÑÅ8ªNÈ£à¬FÏ:J.˜ëc2…\UÐCý¾¡ ^,X€ñ ”1jÃo¿­DyKU"ú¨Q$µÇ &o@@—wøË[µ´¯_ÛžƒùJýæf/þ¾³Ç¬Ž g êó»?ÿJ7©|MYö4ßqž%9_—þ€Ûu~/ä2ƒ±ôJ, æÑDNÔê7P¹F›iÚüü¡È´0Öáèˆ4ïé"!T7"a¬~ ÐÃ$ÅÄ0U£å` Ê*þtS‚å<ñ`kôËã:Le|'"tJ4§â@œÔuøÃ-.Ë<¢Añ¶}`pî»Ý8 <ç†òRÙOc‘¡˜ïª9èùìÑØœUvÖ™µx(Âh™ £ñåK£üSØ[4ÌgxpJB `C]*ë‰kLÇÄÇVenª°|FŽ;€ n!… }‹¤hVù%1À/*«Kÿ®Î✪q¡w…òá–BÈððAU@©õ™øýÅ¥{s ÎÎVèMÛÓ‹ß?ÝZ'G)MÏX·]´ô©ôØÝ~ø¾šõ‹¿Çæ×8ˆ ¦ásà$¥kßp-¶½ênŠE„"—qÉìÛg¤Î>-´o*N­ey¦MXåí6i^¡ýƒu†6ì^`ˆ*›ñ‹˜pˆnAXßÔQ¾r­ÍÙþviØSjt½ÿuàdÍŒç­ê.è'ÂÍÛ«ò{ìrŸÝVõÔ¨Ô%œ½UµÓ_Œ ÏL½Yùˆh;'´BŸ©«7ŽÛ8uÌSu+RCÉl¶ñ n(㪷ëÛú^¹üŠƒo³¬í2£tTܸx ]Ï&“s»oM&u x رþaoÃVøW³“W;`²òFÕ®[d§±¥\ccÜ¢ l†o^·§Ööøn{é5 F³ÙÚ-¬oºnßv=‡Â¸€@£Å9T=&µ7Ï“­•k¸wL×bà´)üÝÛͱ7ìÍÂt ƒ¤ÍrþÊHù—öà?©–\#ÚúÔµøGHmXÍÅ z®NØË|óרÍoäX#kPòÊö%Ì6« NÕ²»£ä«˜Á‰15t$5u%ç‘lc}]¶ªšØ6Ûª;°¹ãÐ5OáËz©ô³ß)‚WÄÙ9fºkúó´²§zzÁ=/OWš|?úÍ<ûsâÈÑ¿û¯˜sm ¸{½É¥v½9Œå5 „Çn6ç+—,  ³Xðã¾Ûÿýë„ ÛuTrk4Óïžžî™þµœ/÷öüqýÈÚþò!pfóU­{÷öí?ïÞýÄZÇÙ‰kz7<û`Â÷Ÿ¯õ÷›Dè–ë2‚,à‚·Ü>€ç84ä¶#ÂÀ¹^…Žï1Ó³ÙJpæxLø«ÀâôäÚñÌàMý`!êìÎ çÌè_²…o;SÇ2AqšgK,œ0ä6[þ­cÃáÜ á?ð¸®çx3fùží œ  ›Š/–áM0ª™²|f¯Dò„&0‹hÍkÿ‡´¦°kŽŽ’øŒ{6 rôàeᇜI5>˜wdSþ4¼oÐÈ´›‰%·ÐÏÖAï н<éhB$$ŸwFlÔ?i †ýÏSã”|…Aƒµûƒ¯ÃΧó1;ïwOስz§ð´7vN&ã><ØorŸŒµz_™ñßÁÐXÈ:ƒnða«7î£:ëôÚÝÉi§÷©Îi³?fÝÎEg 3ÇýºdÍÈfý3va ÛçðµuÒévÆ_‰êYgÜCŠg@²Å­á¸Óžt[CÄ4˜ ý‘ÁPÄÓΨÝmu.ŒÓ`è2ã³Ñ³Ñy«ÛÍ•„HŠ‹O `¶uÒ5$9ø´34Úc”,þ« z&»u6íþaü׉Zï$!Àæ‘ñŸ ̃qvÚºh}«)¥´ƒFjO†Æ2Þ?CT£ÉÉhÜOÆûÔæGÆðs§mŒÞ³nDŠ›ŒŒ:·ê8X@k0 ŸLFÔâêôÆÆp8Œ;ý^ ”ð4œ¶ú”tÝï‘Ì ¬þð+âEe)êì˹ÏÁì= Ũ¸ªc l“3*èsœ–õŒOÝÎ'£×6p´ˆ¾tFF\kØᜎ$þ¥”'(> x“&ܹN¦e3Ö:ýÜAæådr ÐHG¹<MÚçJûzeü¼4­sÆqYµ`ź¾iÓssk, åVnGù9Žj% êE;ûÙ…ˆè âèdtʺò+ îíQŒ–9ÏùˆóàR3ÍþooAp«Òc§NÀ-ˆB#Ëô¼œï% í¨Œâ]»Û€ qrŠD RiüCY<€HxÈFc-ý@AjUœ‚zå®Cú6!H¥z{IȆí«þ¿Ù1{û>;+þ3‚_³£œ rZÑŒ¿æÌèŠ&üí}L‚ô-ì@ìÍrný%î4ﳃsî. oy€a]G"*mÞš;3ÉÒ‰ç‡Y„S9)ÉåêMWžEéÏÕIÀÖTU(#°(—%>op·j|T£ ~Œ_Où^Èô&-üž[¸obÞ3÷íÄøš|â¬ÝúŽ/_Jˆ`åUkIOÀO,¦%„XüÄ÷CÜ\Vkïsæ9Þöàc €§eŸáôüÙˆÖ·¸¹)«êy3J+W+è•Zãã­é®8;>>fãáÄHë>ž˜ûwŸ¥·ä±“š9‹æñ{'¬ÂJj6iåäÌú^ZåÀYqØîò<‰Ï7àÝSg›Q~_\±ŸgË57'Ë· ªª°åÀ >~PÃŽøÏÊááäìÕÚn’ϲX±8“`„Ör骢¤  E‘EHjiýÎÔš3T±áÝ:ïaºmÜ[œŒËÞðÍÎ&‹F~Ð,¾VÁåŸ2S~ÈÄÏuÀÍ›üállÁͧæÊ 70’àcâñ{(Sñ؃#ÿX®[ZD¦¶Ã&Û´ÌÔ øÒBY›ð?ˆ³ƒ×Ëç>'V>%:Eâm]«/F;ƒt~77ÖÊÆðo+.Bˆp¬‘«ûƒý䊷Žâ„J¯À\°D˜¢ìI¥J[R¿Ëtýs)·àén”Æ›|õLf¥ ¿cz·ó›V0£Ã'HìRª(H„¾áþ¥A¹×ɤq¶@©_ZÙ%èYþbi–'ئé;Q³ðÀôÊÓ+€GPõW¡ÊÁ³ôåXiê}šŽá^£}ŠÐXÚm#¹€Ò‚Nç€ïË4›½~ÏÈÏsh\ÿî,ß=¢ È¥xò¿w9¹$ã.žtçÓÝ]É~ú_© VÛ…{˜×!(9ÅVBõüYYL×D) tÃdºŽ)"° T^y‘ðÊÏfà  ª•ÁykXy"Uö¯sšìvY<`Š@nÉY榘·Ü™»Ï|‘¿qÊÆ•‘­~žÄ›"³µJU{EÑ´æ¼|\ÄÙ2HlEU¸%FÜ Âm'ÈW˜,ÍÚ ÌÎ÷"Ü›¹²–»²y>j0â »±ýàˆ+3̇ªÆ”›c'Ȥfo ±Iá:r~0«N~¿A5¸Q)‘HqLA<*Èxƽ/AÚjÎ…œ®ÉrE†ËY.šžo»$± DYû}ÑëÀ9KÂ5­›bÑ¢áÇØ1*¶d’lê±Ö<ÑÅHÊÅ&Aí¥#€<—ß)ió=«|0ìÃä¨É#—ÒôÎhúèaá:ÞȧZ*IƒJ’{v9º*‘ éš«=Ïop]Þ•#j;©FE¡ØBˆÚx,VÆqlC,ÐÐ?@JwÖêŽrsºõhŒó5Üvˇ|±t±ËåO–/@Œx; à2œN:òyˆ†K3ÑÕ ÜOYT¯w¼ü6ßÅÙxPD+Ošk+Ù[•FŠ|éo·-S¤Ãô)~+ ¨HU„ÁÒTg•ãJ J†B÷ÒŸpøwTd_W^è,âEPÝ×Ù0A9UòD_Áó`Çþ›ÎRñvÓ±áBypû ï4#«.ý‘á³á: JŠ9fü~é¢ÚAz ‚½+º]ÉËâ×>O‹§(žïÄáŒýñû!o+:Þ¬ü:S^¶öUË(ð2÷}çÜ]bcÏT¯î†ÀØ=¤Úx¢ùÉÓ?”ŠÑyÎÚ±XJ*¹‰²78+Ñ© 5nNB$'äêDƒ‚yÖht,®¨7›3 S¨¹¢ãñïOQЊŸ¨uŸo \†ìÇFÿl¦4ÕõÉ/ò‹_Ù[—GL¡ö9úãpi†óÃÐ?ÄÚÛ<8øMøÞGöËÁÁA<»G³{EN5ºŸ3:•4Ã뀜z´1ÿxÜ`Úà®î|p5ªÚhÄY~¢´L6Èn®€Å-Õ;ǵ-3°«%6s»!‹ó`üD íã¡$×(‰.ýäçD}Ë2ÔªWàÜçFÛ'}&¶¬ù²á/‚+A¢7|„Q.£>òp‹P÷x`¢–Xߣñi2&…/ žgÅÞÒ†mh™Œ›5wn“ÁæH³X_X¬Ç g>6)Î`¾ÇhÄŒŽ ª£óV㨎½Yw?ýÕˆþtô®–Ä ü`pqì‘£¾½Fã†?Äé\,æU ­óº¢Óo93‰(ɇêYÂî³ß“ fZ< Kc¥gY¤ÀxirËѨËð)ÙHZ“L%œ™‡È‹TŽD|€ÂMÐAZh@yî« }Rv§+ÈŸÞ19ìàžŠž€`ÁTÐLƒ™:š*JÄ-;"o‘Y²‚ò¬ˆ`+L–Š©ÎêáYUÏQ§uSï•Ì%ŽÚˆ6™?3vêÓ…¯LâçØåAÕ•*„Aj‘ðí„T’' P¦øV\hÅ+\Eè™ã й:·Nø@˜¾!&:ÖìJÇöØ ÁË–XÕº4½‡äu ÝŒ F·cqt¼…–ØTöGÆ ªH>DXÌw`³&SPJ8Œ!²ÇødÝ¥¹”øDâ\<,®}l ¡B‹U‘ñ„§Ðâ#DÑj ´È¹F{ £žÚ ‰#ÌèÀÞ‹egæø‰ÒjzZÕö°ÎÚÃî*§{–ð’îYLY0ê#÷^Ùk;%â(>½Z\ƒ©±qã´H8ÈÑßYU­Œ=r¼«MßhÈï™i1kS£ÙÚ ¯Ð-ÉÍAKD£Àú:^÷ºÕ¤•tE#àU!7mäN¯°»9DL /»hJô¦ë&Š:4cøç_2G{t?Ú5ÏÅé•Ú( v,'”‚žéªàD“#7ŒõêÇ»Ž$5ª2̵….kݰ8Jø°¤†kɼlr—V¦ûÎ…#|eqÅ,aëry<õ}ÆZã/“yuUH—A¬‚3é‘îí W-Ê_Ô¢ÍYì%= *FO ^¥¶d\Õx׺ ÛñR~Çø­ZíËç$Ód‡+ÂÄC„Āм„¿ðÿü^Z¢1ÇÀ…Mf1cL …¼jÏË:·£ö 2y-(òË2EAt½›º–-é&šðÒW¸º_ŠËþL?žºo_k¸LÏÚÛTm•Æ©Wn¡NŒšÞX-}’G….ùƒPä˜U6i¶R¡#Σ®R&¯íòÅ'§=VÖ9ÊJÍŠ…‚Æø ˜ÚS¨™¶è('sÜ<ý /Qbº³/”¯æ·ôdµ^º,‚½&Þeñ• lɹÁ%Ô™§ò"_áÊåÕœs<´ .=VÛ¢ÉgXx¾“ÎZ¶HLè]'X¨2Ú–É&/ª«å+ê /Úw ùÊZNò•Ê»p©ýyÔ'«êÝW*êQ6¾ìäuQù®Ò@\°TÎ(ܕёÁóhŒZv^Faõ«èëIø¤ãåi{MÙ4­ñÑ´mºƒ§äb´d›‰Ø[´c„ø7(sxôçpòI`(Å>£5ù ‡•µ?óÚÈÁ‡þ÷û¡ƒ6ÒEÛ“L:ÿ‡yXäªä¶Ôò96§¨3¥¤óˆÔÃ=<{©ñ ÄmC%ìRl“´96yi{ gE _»™£àŽé…¸&R €;³Ü»¥æ](îëØ5óÝpáõ ËB5)í”Em;bäfñ”¨Ÿ)Ÿ_¥ô‘‡1»zÀ–«„Wp‚¸?hGQ î7õÇklUª!lGIŠoYâHÿW}‰RîlϯŸ5D„»­Üâ#ú×ñ::óß9‚Æ·ýËßÐeAt[ðÂ)-«Tª.év÷‹Îtå«Q;¹Iîźëàea_Q/÷ÑÕÞ³-º6zòÇî9¿S ®`²€-"éŸzC?˜I)r…õñè ˜?¾r‘ù¥üÐûü>Ä í{W9쪜^ø ¢âà´­ ¾ü)¾µþEн¦ërûP¾’†kV¢ÜþIš9Ë_áû[Šd.Oñ‹8¿÷”ÿ6þo¾ãUñ·Cê‘D9¡?h›MC+îBÂg ·¿„—Ñ}åÞæ×«Y%WTp×+ÁC=é@`;äÔû6ï}÷Ôä…yåqJï®\~˱-âGÿÌ{-(Cgîß]E1ò šr°<ªâJ½¸ám@õ§ú'úÄÜì"-Ù‚%~|&VýêKÛ"þUÄï{@ãÿ­T]OÛ0}ϯ¸“"áTEü€®04mo“Ðà Peœ›Åšk[þ€²©ÿ}¶›¦iêB'á‡$²Ï½çøÄŸ¯t« I—h5ew-Þ"š‡kï”P´†¿Ea0A­…¯”µ¸Šãb2é¿a_ž©Ù€¾Ig^ï‹ý·6ü™:„2À:B9Z˜5†¾’jöQüÞæÙwHÿ$8ƒÆK渒°X0%­3ž9’àPrɧ¢£©‚xŒÒµÜž_Ž…ŒvÍú=ëãÒ45t ·Ê†ß¹í7á9€ì¡ :o$<)%òŒ”µÔþDë…#ã ’4um DÔç—¿ÐÝt“Ñ¿!š7@>qkÑ‘œ÷=Ûc5.G'£¡Ââ>ñºÈàÞ)‘:½ã!ËŽ.5©`>jø—†ÖÇ“à'ú•èÛ¹¼æ$»Ö¨øÒyÅPÇ’ä,e¤rÐ(/ë³ê-Gþï˜JLÜó÷œåÒ=øÐH–XgÙ“JK©§Î‘Ó|§u}Ä÷)ÜPcq³ ¥Iï#ÿã^Çsb󻈒ƒ˜Lû'5®ÑXnãÁÇ¹Ä \Ý¢rùðRpù{‹x+‰P{/-üÞÒNÁ¢ ·ÿƒäÐjOO§j|Ç÷©\êÚÂÃnª»ÿöuñ•ÁnÂ0 †ïy 8°jˆ€Mˆ;ŽH•—™5RI#ÇAB¨ïN¤k;X5_b%¿ÿ|¿§3—9eqOÞ¡&Ød´&âí{"/ðNJAU:GïaŽ:£…>ÆûK“¤î!·2,‘=­È‡\oãºwl(þÖLþv3¶ÇEL@pïF.|äFÃ.X-¦°¦º°^8hþ <7Q#ÎS5ÌøÑk=/­/ïH¯>] åã¨LØöï®ì‹äªv¹o†-¦ÿ<Üûo‚M\GĵUêv–ê …RËNÃ0¼ç+öÐC¨Zõ€B…„Ä QŽHÕâ¬K‰mùÑ ê¿ãGR%i {±ÏÌÎîäáI7ºØ‘ÕÈ>Ú™¯wªUXÁOQ@(Ö¢µð‚¬²~GcÉ€ètKIg!y“Ž 2=+Öf¹<ßa ÏG4søè}s¾k#Žè:ïÿVŒÎþÑa2’Ñþ» ¸—Ì %áp`JZgâê™ ¨Œ 6Æ 7èõ seaî÷ñ^¸4-5šæA [!uS-Àšæ|ÜÐkºòl¨Ý ÜÃéª~±‚2ía%Ç~‰¸é4–âêW”:’êLò†HÂN¥©REÇ Û]%2‰ÆúWB>æÄ{(;-öÁØ2±Óû‚Øå3’’plñ‰‚nœ0Z?¿*÷8ï>äY>dƒ:'á{†7ˆjõÉÉ%IàÏ`nPN´†Ï’s¤Fª%jËÍ~ÓËѨžÃ>ÞD)ò¬^Öó\±{b†ÛŒäL›Ù³C­9¡¿ÿO(+˜Ñð¾4âçL0G‘   ÛãævÍ…Ô j˜p{K¥ÐFYj¢Â:(Õª•úı» ÆÐdLO浇KVºÅ´åMƒJîÍvÝPI’\¥±äD´ºÉù‚qü*R ÃÔÍÆìÃPÿMÈ,…èUµ7™gDÿðwÅM;?«Äñ9vǧòy=«ýqü|2¿C³D¯‰É|åCëT*$4‹êôζJD—thÃQb. H(ÅÜD¥m›±îN g'»»ÖàLkt1Ë ) ~uf0™’[¸möê—ÏÝWÔêç‡vt&í6ðãb‰ :5P¤¸|™‚Q„9N:WT©×©*¹H¥Ét%ܯ¨'ø™ÂkíL9¶IJ­"‚ÖËGáýâŸOQ3&§õ;ã°gO§UÜ «îÓé•Í]ã8=ðµøÖ>~ 9ZŽ´gºÇ}¢ru(ð xX,¤òP+Rwõ[4Ú¸Aײƒ]?XqÌïæð¦UvšÊ[…èߘÆáº0µTêÅðô',Ë“ä®k6à &îʾ¶Û°®¥ä½ïÖAãCukÀ­Õ³ù’xéDaÔc—v¦bCŒ÷,¬ÆÐ/žè”p}V@w}ÏâË t¯ö?l?ZuÕ»ž/°Z]Œã«†Õaé²ø–€ýq­ÿv¶Ï±üÝXÛrÛ6}÷W¬3jI9²äÎ4/¾µ©Ý6θ‰ÇI:¶G‘ …˜X”ìiôï]€Q$H)©óR·ÖrÇ„ÿ—Ž7°Y%6£û•¾"ÃÜÞšÉIªSÉ;ß8\­çä]Wë4©ëÐ%†%(}dÊP³h–âa44«òœ d –)] ,Øz‹É*äŠõï—ï¿wù×ùÅu¦Ø*œ»õ!Qi¬»š5ŸÜ,BÎq;ÙûîÏËË6ëÌÌ·&ug½¶ŽÂdZ²™5Éu¼øí2>Ξx™UŽEe+ÒÅèŠÙÍA/lñºQÛùWo®à|¯NàÕð`xÐ?žÈÑiÕæ:CQO)©”(„@³=XÅjmÓ3þS­“ÃÑ%hÈ©ÍOI<¢|Äò×ýaîmh6„ÕéyÙf쑆pFxQGŸ@?%tèÞËÕöa¹w¿ŽaAŠ&Œ…VuçlÔ¯Àî1§¦iD† nÈŸ =㪠º¹`!¼F¸²s„·S)¦€Ýsìáp; MŒ€+˜^¾|.œ*{ O ¢o@7tÜM5˜HÀu«40‹Ýç¦ql®E„ũܒ|kñ¾çïlJƒe4¥ 3›Ün¤ÿ#tÖGx!bŠ]ú+VðϲmÁ¹ –‘(M-ý SÂCS`ÔX¢¾®ñ1ÿÏ8¡ì‹V¥(¦&‰ýâ¢ØUl. ã[OŠÊáäçãû‚e@ù ñ1ç“ê¹(/m˜o­Y”Ⱦ˜Õ[v}ç+?*¾ý+¸]]Z…±_Ú åcFýᨵÜùµZÿo›Jÿ=ŶÊÕ¸rí6RŸtís[b“=Çöܼ¨}Š0¬c.8ÀI£Sÿ÷›Y¾-°`ÜÓYj»³3Ÿ™Ý™Ýá÷ÏÁ68½~}B^“‰<‡Îý6&’Õ'goßþóÍÙÛwï‰z”œ»¦÷@Ã8"¿›ðþe½mú GË®KØèˆ„4¢á#µ‡ÐŽ]µ(õ>v|˜žMö%ŽG"Z”µ¬Ï ŸÉÆwÑ€<9ñ–ø!ûëïc²ómgãX&2 O3¤$ áΉcj“ ôâ­Ãø¸®ÿäx÷Äò=ÛÁq´£ñ‡©a‹ˆ¿É@Y¾ Ôû(}bÀ"[sí?bWf)Ï‹nHœˆ¸Àùð‚=»‚ ¤Z®éìh8lAR9»dh@[{ÿO€Hª«í[ûõbfôŒ! Á¼ø@’ÓÐ1ݨ˜6ql4§¯âœ:l,ÒxæŽ"°Ê óü¢;J'¼ü0Ê€ìÌg²¦¸@ŸPφNŠk°ìü˜’ÄLÀϰÉ:‹Dþ&~‚Õ1Ë–YP ׌upõ…¸¼¼d¡E§‰q¥êD_\7²¦x^j‹¯êT™’ó[èTÈd±¼ÕÔË+ƒ\-fSEÓ‰<ŸBëÜÐÔó•±€†—²#_²Í}òü–(-5E×ÉB#êõr¦? ÉsCUôQç“ÙjªÎ/x0k. 2S¯U(Å ¦“ŹV´É¼ÊçêL5n™Ô Õ˜£Ä )“¥¬êd5“5ä´\iË…®Tqªê“™¬^+Ó!À¹DùªÌ ¢_ɳ™PcP‚Wž+V>Ÿ)‰8PxªjÊÄ@ÍŠ§ Ø@ÎD_*”¿ÐHÖn™†08ëÊŸ+ ƒ~2•¯åKÐQª¨bœ¤ÉJS®øâYé«sÝP•¡ËÅbÊ,¯+ÚWu¢èÉl¡3íteB y€ýÀ¬Ýð|¾ÒU´òR熢i«¥¡.æ}0 XÊ0zÊl½˜3ÁX íù¢1ØT ÈÍ•í0ísæŠÑp2šCN ž¤‚= NY2W.gê¥2Ÿ(Ø»@F7ª®ôÙÒÒTiÔDø ’W¨>›4À–‹·;M’ðèÏ;XQ‹DË´¶·!ú‘0Èà éhá{ŠIº5&0›@Sí×à•ÈfïY,'¾»ƒ&ÈW$]r}ð:„ûbóæSÙ¥ð>ŠÈaM™´¼ZÞ-t2ƒoÔy|&½É‡ïЋÿ†ô푤7ÚGá’ÏQÅeülV"¢ñ9¿©¥òoТêʃ: ¾¯ ®Šr6DŠ{1NOuþ í߇ü1]Øõ[!ƒ~ÙÒ?›¤:Ñ2õ×R_$+q-¡ <Á}"K9É¥ú”WDsˆyno>q€ÏÎ÷ÐDRWÀ\zQÄ¡.fˆ¸eêŒúä3¬«a¯Âi¼ÃUšìÓBã*øªd'ºá²øööoGÒGXϬ¬7ÓyiOrç/q aQ—"GÞI˜q²ªR¥rÆ™—é¦Ï4÷ýš\MNÀ< l´oONX»BG²=”$uÉÜfšÉ4èQä9aW 21íða ØU¯„=Mذé\FØ{&¦{SvE”ý ¥NG²¼€ëµºè,-<€#O;!A?·K€p™g'L©Û§¸¬öô8Œ¿b­›,Û>`­<+?ÞZùЮÖ*0c¬ÅNÛ1 ÷¦íRš¾7îìL¶C9Ë?´ó–!åÜ– 5Äo¿£¡c•öÉ«WÐ ¤cR¡«óå&ÒÁ;L2ÁgöHo à(H~ÖZª›¼lªú˜RÖ¢ç‡qÞ’2çÓñ:Ç}r!¥h÷™¼;ƒxýî·Îy–¥âDX[2î:,Ž­³‹bgÆ$¿Zú&oyoý¤bãdÞAª„,¿ÿçu‰ŽüIµ:®b9Bá4Ñ•SöÒdýöP®ÝÅÄœ‘4QÂcvÃöMOàÒÚ‡³°éõmÇü(pxg—3ËNË)ðìµ =w¸æTÈZ»êQz@™£xƒF ÏJ•Á‹‚=Ò;„Blèˆ>м3GÄœŸ¤Sþä ÆÎ_•qä]'ì€DZ¦^›ä>–þWïGÀý™ìÆSvxy Ùëq̈ˆƒO~˜Ï¯ÿÊI…¦|7ÃCi’ÜÄ+p6ÒþÁ`#úvŵM¢YÇåUœ˜[''³Ä\AÃŽŒe^÷öÕ´,[»ó‰h2 ›w`^ºi;Ì4Ÿ¥NFIi; ØšÌæ¥‹¹BJô,óö “ÑncýÑ»ïšoÿÏÈ¿d‚ Ë®‰xl—(¿}áxwIT§dÙ‘~%¿yÿî¬7`OgïKŸÞõúÂ'Þ†þ»³ú®z°Ãm9¼g•c%»•„yn€âÔ+æùXýI´?Œ©~²®YÛ+¥†E5n½2nTËm€6 Ýs°ºoÂààŠëÆ Ðý™¤¤¢6Õ€”¯]>?oí*‘;(p™¥I!´hîèËùÓI«éŽä úiÙIÊ P ºdÝìÒ²V«jŸó\HwàÏ-nBë¹âgÒ³vUoE•ã×i T fý4S:ï¾Ø@tGÀA>âìÒtŒ…`ÓÐË?"»»©ªÝÝ {£ld4ê U¡£7˜°Š¢‚ш£fnXLýÝr¬ææ£±iŒ_‘x”˜ûØ'9xÞc1º6p³°M7æÞ±p;„æžhþÇhñY´` ìÞŸ50­`?¢ŠqÔÕAR²GÑ!7àbØšŽÇuÛùÝG¡¯#o‘ÆmçÞ°ÝÚé²o–ŒOºU\Uñ€KKkΉ“Î*ÐMn­(P:kìèžKÛôQœQ—´8.åeò&=Š*:§GÚØUÚE©h,UŠÈ ’k•æB~¹«£5+ ÚíùK2£v™¯#-ø5ý–@:Å"Ü?.p÷M!5ûðà#þ]6#ïV3a‡Œ”Ééhž"©jg{\îT-qÖ..¾£Á߯©imÅabF샀–«ë »da4¯^¬j'õQÖ‚à]Ñpø¯È÷„¥_æÿ“t„ ¡ŽU­Ù¡@Oü”êmü„{?AׯQíolêíÎ1º-6d0ï]êˆ vflm;a´¿–0ïÃO©ˆL²ÏQÀû¤¥4•žùW÷¦öK{íÇ+ì Ë>T}.‰ÊÒǮ˾Pé)Ç\À%_è’ëä8•ÀÓ¹j‰ZÓÊQ-¡êÄÔv"D›Ÿ•> ¯-ßU>:jÝ»V¾N k¬žü<ù/µVmo›Hþî_1U:»%/­Ô×4½`ØÄ+aðNµU…a]£bÖeqÒè”ÿ~3 8ø-éIwùàÀîÌ3Ï<3;Ëû?³Eçøå˼K.î‹ôÛ¬„n܃7''¾9yýÌ"ÐÏ¢ü»(Jï#|?Ÿ4ïG‰ø@Þf–öVP%Š[‘á:mù"IUY¤“e™Ê¢<¥æ ä²ˆ…^™¤yTÜÃTseÀ]ZÎ@ú¿\–0—I:M㈠Œ  QÌÓ² , y›&øP΢âd™¼KóoË¢ j¸ÏýqÀI?ÂânÈ|< ¹çöP„kT™šèmk­=WçŒbyþ á’º\®cÙ]=ŠI8“äP@+l[bTÔ3l% .»tø%s-F»]ó€õtkù< ^¿61ò˜Ò×ECnÕc« ]Zà`ÚWœÈWƺ%P^·®ckP«ßœŒóE¾ :V&žØLF‰^–xÆ }Ü~íF9œj¿àaì»à<ɘ+ͨØàT¯¸uÜé胔„3Q|nHÃß¹èÛôì dQê+%‹”ÂÑ4¹ÇÙ²Hpöˆ<Ö3Ë üX¦È¢ölþ­µ×"„Æ:Öÿ5°è׋š>%‡s¹ÎšþpÞℇÚÞÁ~º½—4©P§;|3q+²]Šâ%p†·rÝw{m›åkÓeë/†¯_ñÀë§y×$ëš’À/…ú½M£‡I@ëïÍüë,hílqºË¶ G¶ëY6Æû)ãå ¥º{¸hUød=:vˆâYw‹q¤j¾pö^LÓLlÓ_:…îoiþµR´r0š•Þ½]~-bØ02»µsïtËö¡³þ¶ž]¡åZUô‰Üêò¯ÛŸ©ÜRäSåõeo>ôÍæKñ\ íª½'Öig? ~#.‹\#íîºíW ²!ômòêÕz`Re½ÎàíÉ.ÊY!ï w»Ï:û‹‘éXQþ{Ùp¯킾.£qAÇПaíCp`<ƒùî](å0Êï-Ô{JFÊm­àí˜OÖ|£½vùéfýýÖ0h¡ÆüWQ«x« ¯Bn÷â¶Û+»:£¢ñéËjícºv‡‡íެ~Ÿ»Veñ¿€Ÿ—ZW„žË°§ÒÈíu=Õ:µX[o£È~ϯ¨EZ<ò\v¤ó°“ì`'èãœl¤H£6´“V0xiH6»“ÿ~ªÚÁ€æáø!ÁtÕW_U×¥Û¿ý¾¹Û}xûöÞÂ8ݘ³ ¾ž=Z.¾xcú¨ùF®™³k°þœ{–ïƒë}1wlÄCž9 lË‚=;‹‰=;b¨hº8ö… dàKjV‡2¸S¸°¼ñ9~5G¶c×ÊêÔfdqŠ&M˜›^`ŽéÒ|áÍ]ßrqbûcÇ´/¬É{¤vÁº´føç¦ãtzŒNÔÝ%À‘…dÍ‘c•æÐá‰íYã€<{yc‘¤3nmz°þ´Ð#Ó»V¢."ûÖ ”Ãu˜˜æúh4ÔˆmÒxáYDÜ”¿ù, Î\w¢"ï[Þ¥=¶üp\_ná[C4˜CZGŒ.ãóháÛ?²gåy‹y`»³á #„LMÔž¨X»3å3Ëõ® —‚¡¶bWç¾ÇmŸ©VL3)>pÔ%Ñ*Æ3¨9 3ëÌ±Ï¬ÙØ¢U—€®lߨÔòlŸdìÒø•‰–ä¾Ú4äV>ÖÒy¨¶ì)˜“K›È—Â*%0"v•>øÖ_ŒÏ«èëÊøºaá=»åTV&Vlœ²H½gÖX¦Ê­ßDùúÒÕzh ÷M øcGL¤b4ò'à”_K¾ŽT—AÒ‚;îsžÝhÚðïÑ)ѰÒk‘ñûГ²$éxqRê`/•¦L-i ú¨a«?Hîe8y“•¸­½þ°}ÆFô€]ŽC%sò  ïø+8$rfÃ2¶†›f,nJŽšG·b‰¡†U‘„jÐKž—ZÆ®òãµÏ1õäw§å"|yñU <ï§‹³¹È;v/J·Hɱ&ƒ %á„d(Bƒ±on6qu<éË£¦rˆO]¬ *;éí-ÏŒÁp7xÕ×nê4Ì~ó•ÄŽ•w§BþQž_àÉüP æ §tÖ7F¥t‹ßñF½ÇT!Š•ÐŽ„’jrvÒGž…Lò’÷ŽBÍ úˆ?µTyY [ÆïM9„Å#Ø+~Pê’}Üô¶È¦Ö]zÔÏþÆÑQA%†û;!# ïÍM§/Û,à†ÂôHœ:Bßrãi_ «ƒ p+t uav¤b³h‚4æKªfÑG!ÃkÖCOdsu'rN·œ~âxŽïKñ¯˜3žo›î&Íù_Þ€0·ðj馺nQçQ §cæ.Ó4ÆzPš]5Ú´Ô·\+q£‚Æt ¼…Õꩲâ_fcûXS¦ê«à:‹ºÂzwŠG; ã"â²9Cn·KFWÅí`XïŨ–ZÏmÂÍD›ªË¯ÿ´ŽEr/»úiÌnjIòIæ|m£ÿ ƒôùóÔu÷ê›}áØ³ÿú½ X6#‹IwpÞ±lTˆ8ꚈËrAÄšè*֙ўt€çéjÀ÷**œ«Û¤9<\5YÓqºÞàq.×ÊZ™¸Ô¤Z;½J3Ž]°CSó˜9`;µfع×[^,Š^|©)5·µs_+”>ÍäœÇú-$¥ýÝi+úÜíñ±t[ cñc=eÛÌ=.‹8‡ãLýß§”ße飄¯Hr±æX[|Ó8ÓnÛQûŠÐäü½-âÓ¯I¡èÛÁ´¼±ÇV5YjŸ+ôJ™Ù'M5Ê5|êP£•=J”œ,ïR*Wö¨¹´Õ¶hE+µÛØ‹s_º[¹ÂÏtâ”a7ðF8U%‹Dä²»kU©¾¡¯IHåTØYxgÉ*Þ¯*xü¯K¢bTqkVâ¾ãY3 Í툎ñQH>Ï”ã݃£áƦ”Õö©…÷9'vÞÖ垡հÍÕ¥®ôšéFgÛÝŽ2©mâ7“ôx‰£{f硾1&ºn]ZýûwøIÈoøhèwÞª¦¥v·Õ·Œ7gâ' !þW#=ÿ QÊé·æÔ‚~9åwÛŽÿæà$ßKåÚ Ùf\è7ü®>A%Är>UË]1©4ÖyY¢`*(­wplí"ØTÈyçYM-4«cWÛ á4¾ï µ¥Z4#³‚_2¼­aòêù]^OáøÅE÷…r‡Ö7”æPëõšã¨5ÈñßóÑÿµUQoÛ6~÷¯8yp5É ìaK×…–h›€,y"×À€B–hG¨,z¤” òßw¤¬YuÛ¡/Óƒ-ñî¾ûîãñøþ÷Ããatsu5‚+ðÕáE—»ÇÆù%¼»½ýåí»ÛŸ~¢k “*«?KÝxŸá÷ý¦ÿ¾.äMª \´-ÔO²¸ÆukJdQšF—›¶)U Y]@k$”5Õê\º•MYgú¶JïÏeóJ»Õ6°WE¹-óÌx3ÓRï˦‘´z* |i³$âT•z.ëäª.Jg\Ð^6¿yÁWÜ ¨mO*Wz·¦Ázš ÉZØl£ž¬©WªVM™K¯Ct) Thq†‰ëâŒfÍ«¬ÜK}ýl0ë@—ž V[´Èð"ÇZ •·{Y7Nôop_:hØgÔeV™Ó¸sуB†%F²t±Ö§ÎöÒ;ë°ZÌæH¼ÃRÚôDöÙ l¤m$¬D¬ 4JÛ3Èe¯ LˆW IlGØ¢¡SĨmóŒÝЃõmf2·}†±¥í>mÛ«î͘A%bÎ8ðx*V$¡€ïË$~` `²F#?^®6› ˜Ça@$ p5 ›¤"Æ…7„cäwxÐF¢5ÐË„rql± âa‚„D‚Qî‹ü0 X4ó1œš±€-˜@O{5ú`ˆ§° ‰?ÇO2a!k—uÊDd3N1%%IóÓ$i™&˘S°%Œû!a \# Ì ôFøœ„á7+Æ"†åZÀ E²dÒ.°„úÂVvzóQG$zÀ—Ôgö…~¤XIÖ®BŒEdNÿHÑí™aã3ÎÔ±›ä§ ]XâñÔBñt© 0‹ãÀ)ÏiòÀ|Êï Œ¹.åÔÃ$‚xÖŽ(¨šñ}’rfõ³X,4IÒ¥`qt‰"¬P!dJ0:pZÇ‘«ÅŠ“µÅµb¸­ð`5§¸ŽÛ¹Ql…#VŽúbè‰YQO1(": ÙŒF>µÖØ­§—®µÆ­ë’¯fNmùnÓ[÷:hgÏm-°)àYò³k T„ÛWyêÏê÷'ãþ埳´ÇŠà‰­TV¸õ¬Å3¦Ýqû±åþ4Õ~ ÂûÞ ÷NÄÚ8F@Ø}v|oFnÊ i âQr)õŸ=mø{4²A8Pív8·ŽköÁ!ñ„.þjKÙÀo0%!§w'w±ö“Fg{Ø(UcxÇ Ô>9KÞ—Y°ª7ÓÍ‹³˜×œJùª‰?ØAx#´Æf6w§«ªfùUŽ.eÝ»S—‚ýø#´kdXÿZ×RŒ[oçbÿ•× ¥]3_±(§àÕ[YsÛ8~÷¯@RÞ‘”Ð×dó°¶• -Ñ1«dI+Rɸœ”Š–`›eŠT‘”™ñßn€D‚0}efù‹D£/4¾nÙÿmq¹XÛz÷n¼#`qº—1iN[ä×ííÿlüº½ó‘è¡OÉçøW4Œ#²ïÀûç³ô}sF?aoÝóë‘F4¼¦³MøŽM#:s£8tÏ–±øÄñgdQâú$ –ᔲ/g®ï„wä<ç‘FnÜø’!û,c2fî¹;u†<’ çnÓY„Áµ;ƒñ¥Ã?øx^pãúdø3ûE¬ÓœÆ»‰^¤¤[D‚óT©i0êeƒ=±Ê"[ç,¸Æ¦ÔS~»SªqnH܈xÀùˆ‚ýYA+:õwNÃM…6 UðKª X;[‚†¯¤IlÓåœú1szÊ:nÁ¸@’¹ÓÐu¼(6p¬·`ˆhbŸº¬/ÒøÎœ¢b…óƒ¼9J缂0J™;wäŒb %¡þ )Æ è2bJ¸›€ß ”„p$çÐÀ=çñ DCÊ, ³hA§gÐ×Åè 1¼|hQ$Xb™±‡ö7}dø= ¾š]£KN Ñ Áðdd~9²ÉÑ ×5FÑû]øÚ·GæÁØÀ‡·º=ß²Émzÿ„¿G†e‘Áˆ˜ÇÞ ü@ÀHïÛ¦aiÄìwzã®Ùÿ¢àÁ¼9°IÏ<6m ´WÍt&ƒCrlŒ:Gðª˜=Ó>aRM»A¤N†úÈ6;ãž>BNÃñh8° ‚&vM«ÓÓÍc£» j€\b|5ú6±Žô^Oj1!š‹  PV?è\Ü5GFÇFËò_ð#(ÙÓˆ54:&þ0~7À"}tÂ,„¾ÀÙ2þ;:h']ýXÿ66 *x©3ǨøàYYãË6í±m/ƒA—yÞ2F_ÍŽaí‘ÞÀbŽ[†Bl]Ãvà^ƒfø}0¶Lôò2û¶1‡¶9è·À ßÀC ©½»Ì׃>³œ5 _t |;2à; {ŸA1:NGwXàÀŽ-R‚Tð§-KúÆ—žùÅèw l £o¦e´XhL iL.ü›’Çh>4ÐÿÂYcCKÌC¢w¿š¨<'f!1“ð¯Ö¸s”x?ŸÎôʹ 8­t˜±^àÌØwg s,dÓ­^Fùœ£ZZU"Ÿ=@D?bX]Òã¯Ð´µ¶Æ0T¦Ä¾¤¥á÷TiòçÚvÙÚ"ã!ù¸ùph¾pböuFÏ]Ÿ6öÊ´'?44²³ýáãÇÖ#pÏIó §šedV Ø’ä)ð;IïûD6ffÂq3SÔ¹aÉϸ ú€ÉŒ:½Cg'|gð<ŠAÝÓ!Õ§¹íÜõh”pNëXsn|*—Ç8írŸ+å|Þq$¹zŸ9® 8ægK˜ù5—ûYhG;‘3dîЙ‹¥ˆCd¼.¤ Ì4ÉÜ«êë¤eès G4Zz±Ð¼UéQ–Éše±n¬~¦z\%ÄÕ³C ’D¦„ª:ÄWä SMÒ^1׊òl“­€CâÒO4¶±!*[€Ÿ;à\d9Å¿Í'IŸ..¯L®è]”öÊ’q¡D+´·÷ û¾ ßß¿/:3]†!ez5™œVI±ÓõøÇ^©#Ö`içÓíí¶=Ázªá_~ɸžî@C‚Èø=êvŠ1‰2ø$%á>…ÿNŠB˜#·RZA>èŸç²¶Ò±CÃRp.å^÷R«ß¸þ„ª _ˬUe®´]IëÈÉ ãäÒ‰8æ`9½»Ë~jPà-#ÜZH’§|x$oìü`Þj³b` ëÅIgÐÃEÕó•^gÑíxÞd åäA¨™8 5ÑH1zOþha{!žWe$èÓ›"ve2Ä4¥É¡«%M iþÊ!´T5×AT "J½¿'Ó{“÷dç)âYåXWþÆÆª|!&r|Ǧ¬e÷K°)…:P/*0X z )ÜWY¶j@[ë #Ôè¿bmE¢‘†ì“†œ-qäcí ‰¡ +‡bîˆb°€dÆg‰Év=qÔ8i?ËýƒæiŠ}*Òex”ˇÿ º…ü&kÚ$ïßd·œ a… 36’åî¤é0©NÎ/*Òz¾š­G%¦ÖRº–Æmæ¸yÝNÖ*è„$aêL/9ôM"Ü!Iܨ‘¶AÒ1]È1ºqãé%†sp°X‰Ë09üǸ㶫¢é:µè¾™6_ ïVeÄ• ŸrRðú@Å|;w³ÍÜÕƒ\Ê3õè[Ëê#ÝŒêiƒ1û*ª¿ÛF¿k)µ(D?®‚ªuÉ¢3éõ:jã8ÛêUk^ž”5•Ï;¾†þ ­¡R›%®Éª*UsQb/ÂËéCÞ5í¦UÉ"bSèЪ¶³Àº"¹ªíf¶?Á_°ôu ÆR¹+¾ ƒ›¼( Û)]`kFÙüø¼©´ì-_tÓ0ÄC¡K¶ï°´ÍÅÉÆ%[‡³C6Ò\úôvA§1;¡‚Ô†kˆÅ­Í·JqPeÔÜÝe T ²kÅð”¶úER¥ÉÒ¤´y¹@RjÀg%I®_Ûj··eÚ=qÀŸ8ÐiYˆ;Ö²Q~äÈ*ý$+pBzN¡!Ö}Íœ@Kª&ÈÕ˜®¥Ûâbä4ïʆuÕç’‚]„EåZ%£Fð$Ô)”½¹„:»(²Ú|¥ÆgµVjÑGÎÙ~ÿ?³xþéu³²ÖMSîß\È®ÔdÿEdÊí'ÔbªeR=,d„Ày2~T1}Rýò¸D»®BnÚÂáT«t)ú%\$…ØU Ïò„ O½ó½^åç#k…Y¬â*x‡ù@•óþ¡>/YEdžHv\Á¥±”„k´<‹â0Ð"oB½ˆÊº/œ-  "ö`ª7QŽF6¿J¦åzD°9ß+ŸýF@¼ªqCAÆŸAø.É^$\¯hvV:ᚉ$­°«'щí¬#‹*pJ½Ô|râlmÊ&‡Ò·¢`TNŽ[¨»E4N}µó£ò ç˜ì+€†Y¯[eH‡U{Âx³Y]gWsÕ™jü(C0»=ðz¿þ*L ¬:sé5¡å_"®l¾ÕäÑ’ºð›§ÌÈ?j^wÐYg'_éæG/Òˆ—¼ð|Yž‰Õ'ˆ©ìüÌ-Þý©³vؘý;ô3y;Mè Z9ß}òLÂÓE:_Äw$¿¡—ÝqÀÉAœ·U GퟎrVÆ‹›¶Q\ë;Èéìä­¼‹¸Éá8‹T m±.ü•~Š ŽÄ'®ï¹>»ö ¸~–m_U´ÖŠYå¥ç-±dé®bÕ#ÕMu%H4öÙ+òqÕ¡ei>5š?}:ñ‘–ßaÃTÒ0<¦^-Yx”Hð ¦oÙŒ Ç]c‚Á ¾Ÿ9a9ÚíÉá¸ßÁ»Ìi‡ÌaÒ>’I#q:ø%nŒ‹ë&>÷ke‘ìë|"ÒýÁ„”]=‚œÛxÿC€¡tˬnáÊQÌù"…ñ¬‘ žÃ…€aœ†\E<§Wi¼òj-fùnLtåVܦÄG<£+WÙi ¬I8T…h*XøI#$ÛqÌÇD¹ë¥›jï  ™]ÿGÜÇ•@²{+6M1°p+¡’·ù–¥.¶ÝMà¥`ø­Üð'ÀÌÈ‹õ[Å~&>­Ùž+[(Ý?¸ÝÇ… ˆ[5k|*¢X|ª _öp’â^C±_üÀö¨tËMÜO«s|¯Øú¬˜/bûËn›£¢›mñîæË©\r5‘ìq`U¬ê!¿ ¯ºðýŠMa°\ÈúdE¥äRRô§+3e…Ÿ ’<ó’JU+iqª¾Û‘¨¾Òñôy­çÌó8š¯!þ9°Â÷2“Rüðep„^Õ~yñY÷£ˆoß„PÖ2ÒøŽØÃøÍ7Ø"<Úh“C½gu$2©éI7ä˜XÆë}i·Zö(wY+¥©8ãýÄŒ„Ïã6Ï*wÓØ·\¢Vju‰~Š^`©ˆ}xìñÙŠžªT”`#Ÿ] ²jH\!S¡ øüC2`~pü9PÐE¯wnÌFì ‡²pòGü_¢ÙÖ4IOѾ矄ÿ&Ê7<òÝkÐ~g/åz¿ö?QANÃ0¼û{àQÕ< ¤= qAˆrä²M6…k[k»!þÎÚi"¤^°dYkïÌÎŒ×~ðÊâ‘‚Ç–àm ¿oRtÆa·Rª®*<Ï=xF&ðÈ¢ƒ^ÛP6}FÆ6BGrE´C gmA&Ap‰…¢×†‚°fâSC^¶[ƒöƒ8X£ÔÍ~ª—ÝDëüëÃÿƒXÀÆ(í˜Dô‰º¥ðÔJÛHÜgO/ÅÍÓ\+•õïyUc ô‰l1½¨.^£v6€ë'Ç ´ŒË©ÌCÂ…jbl$B<®Dò˜ oþÄ““õìv…cЉí¨è•B2ñòT—Ó§½Ñ-ôɶYØøS·×cîVêGýRÉnÂ0½ç+æ”%Ç¥Ë µ7!c ±dìÈvh«Š¯&i6Pç4Ê̼ÍY¬’8ñ>Q`Bá-¦¯”ª÷§ÔH.ñ¾=l޵†56ñ‹<%Xa#U1s5 ÊðxÆ ´QL7Qe0)ûD±36ü=S”X4F5,+…¿P0¿ŠÜ@¤°4©WÖjZÜîé¹F×­+ÝqFà b˜°Ý–¨ Ø  R©(&1ª¹Â:»iîºòMÌôÝCe{Ù,O¬Ñ '÷'ýyíôâýuW•©±A¤xÆš¢&;;"2µ5°\´K¯¢&UnÊ\)ªSn¬‘ÓhÞYkõfp%…Nwöy²¤F0”$³¾VôÀ>Q¾=ú… niÏ'°ºwn+'6ñÖO\f^c_Ï,¥¡éÀç3§Ü(N²[ E>«ã°9fËiýËGÌ8E>ƒEÝëAÞ‡Y¯gŸEîQ-˜k;eÃá?‚±ªT"5*bw]ê,µ‚Êãºx?µXmo›ÈþÞ_qZåʸ¢IZ)WÚdÓÛ$Aë€/àd£¶²°Ç(,'k]õ¿ïsÆÆÆ@¼½.l˜9ç™óòÌ™¿YÌo×Éû÷êŸÞS7]¬²èq–“6iÓ§ÓÓß>|:ýxFF–êÄAò$²\Òïž¿Ž‹çãP|.Œ8&… )RdÏ"<ÞÌ"®#™gÑx™GiBAÒR Š’é2›52Ž’ [Ñ4ÍæR§—(ŸQš©ÿt™Ó< £i4 @/pƒLÐBdó(ÏEH‹,}ŽBÜä³ ÇV§/QòH“4 #Ö•Ji.òóŠu;%¥ÓÂÀIBk)sø˜0œáƒqúÌSE“4&Bß!Ä"I1@«lDV,ÄÊ“8ˆæ"«F¯É2XPŠWa".aíÿÑ8Úø¦“å\$¹JHÊ'È[ ¡ŒæA.²(ˆå.9*± ¡äP“˶ˆË&Á\°‘V&énZnœXc¦™,5V4L:x–’HBæìš§¹ uè€Â`P˜¦˜XGH¦Óü¬)´” 1a^B?b¶fLÅdMJ)<óo,<çÊ¿7\“p?p;«gö¨ó€I“ºÎàÁµ®o|ºqú=ÓõȰ{µ}×ê }ï šï¶ó†ý@æŸ×ôõ­[ˇ¤ïè;Ír®èÖt»7x4:VßòÔÊW–oóªWXÖ áúVwØ7Üm0tŽg»Û³¼nß°nÍÞ1ÌÁúdÞ™¶OÞÑï7zgÊ® †¾¹^Î÷,×ìúìå¸ÂؾNÞÀìZ|cþiÂ3Ã}Øz }¬à™ÿB2Ô3nkø«UV‰'®;tÍ[vÀ¹*à¼aÇó-è›tí8=• Ïtאַé]PßñT ‡ž©c!ßÐyHˆ"¦qßzdzÀ³lßtÝáÀ·» Ü#b°ØBOÅß±•ÿžã>06F¥G§ûã ƒ½-÷LƒÃã!¨]¿,Õc¿ä8Ùæuߺ6í®É³ƒÝ[žÙÞRϵ<–³ÖFܰ`ÈáPÉ„ëÛåu•r²®ÈèÝYìÄZxKDÈÚÐ 3Þ°{³ÉHu'}]“§àQð“§A¸ –ØŸ™zúõ“ìë®Zþ‚–~è䣯1ªm"•u¯Gýõã¾'oTå‚#‚ü™ð„Ⱦ®Ðß()>(‹¹^”‰ jÛÊ›IÒ0p±ÖA­–’³ ë,£­ã •êe™Žd¡S›™¤ó<âúÕ0û$V £ãÅ5jB â(6m˜“ÑcäËLø«…¸h02Üx¡À_âì΂•Ön”ËÅ"ÍÐxeÈÒVƒ¯*·³ŸZtù™¾s ÎÏ1„½.÷éìß9Œ4È}¬H}܊켃4]&Õ F8´pâðѪéÜæH߯·T–W>â#êÃç¼­§µ$¶a±Z¾~¾n£ywG‰[ôBÚ2ñŠ1%úðJ,ù«Ëì%O;Êñ[]$š’ö6JFë´*}ã˜)µ""Í|h·«x|å³,}¡D¼Ðw+yaC#{Týù×D,Ø:­¦Ä—ÿ’|ªµ¶«Dïþ%ßqËEOIú’p£Á[›h¼Z÷ƒ›:*™q¬:©ãR­¼®-×ÞÏèÏF”}åØçj[ý±ÿC ®ˆå+éÅ Cï•ÈAny­m÷ókà¥ýþí/³UøU7Œ¢ÜhG\]_Yg[”xd¯8€s9ÕŽ¦Q,X¹’ùrÜÄP‰¿ÐãÊ|#÷–I%O%¡ƒy^ ºÀdEU®4ecNõºwo/©Õ¢/õ‰sâ ¨8í컨¯VåA–w–Ó)ZãäQ{EB,´uD.j)‘çíå%ÙÃ~¿)G›‚þ‡"Y«uQ“H8He<^fE0™iuQ $½^ù’¡o#ÍÆÇð…gÅr&oa,lņ+JnÈYéŠÁŸJI 2§CÅC¤ÆZù~là:$Y-Äù¼ÜTŽFœÒZ¯~UÓg»ž©yµWmo£Hþî_QEkÓ:•›L§§( Tªß´Èi“†Ñ:Zl@g›´rå¹i+ÓÇ(ÄCþäø°ÇéS”ÜÓ*Mˆõ2¥´ù»*.:ˆ-£t]µJCHYÙÖåCÒwô24óˆ29Wtcº£ ^¡e[þòzeùSöx—Í ×·FsÛpÙÒlîÎÏ$†8¶¼‘mX7æø aÀ/™Í©OÞÄ°í£ˆ¢ — Mk m³tÀcË5G>#kžFàAÚ:y3sdñƒùÉ"ýS¡ ËžùŸ9ä°OcãÆ¸F­CP‡NÒhîš7¸sŦ¼ùÐó-î›tí8cżgº­‘é]íxЏ¹gêpâ:ïà XÃ6ž‡sÏbþØ–5õM×Ï|Ë™@Â-B¤´ÇŠkgª0ƒ,ǽc»L†J…N·ëHûTµb&Î`:<8òÛ’ð >ýXšš×¶umNG&ï:lèÖòÌ*-×òXÆ*ßðXõæ£IÅ~}2>lƒÕçà^ð±2pbã4ÕzPàŒIuÜ^7Q>4]íúKˆ>ÄèˆI¦"zc²ËWl÷zªÇ dAþƒð„ÿ­ƒ¦?{=VQÓ‘TïQ¢{pK\ÁÉ—"ÂDQíý}sÜ%ð„–„þó»@ÿ©´k#ÿ/•Ö_B†²u®~Ñ쳌<ÅE÷MYüv„5»Š þVXè§§¡Ø²@²ŠDvqL`ûÈ£5w—Ô¯û‹å%vO  KEñ¸öø dðÜCåÉ`ƒ!uÛt9òuÄÈZêçM˜ÅCë"Y©ûJ&òq ¨fì À µ>§<\~|ߦY²!áë‹0ýôþ>ÆØg„aTÞzDKâØešÆ"HJ¦_‹fÙ˜Ö”Ö T—¤U\~Æ“Pc9Õ„'4_ùª\/ÒY¯¼e‡o¢tKË\iJñ M)6XYœ~ÙզзOïÚÅú}"ªàù„ûÕi.6Û¦— â–YȤH©N§¶³|pdbqû­ˆù­Ik%º«ÙÑ>é³Ð»ó󓳚µÇ¿e,²_û‹Åb61\üô;;éÓì;ûJ"æû~ã³2ý·•ð*Ýlq«G:ÂHr¿Ö‹+Ë6‹|©´,¸>,üÚqÝÛgDðE²<•¥ñ,•ùð¹iÚࢣ‚ûvÌóá²ì, Üï…Ö¥A/wµ=]¦fäšîÌV.ßSˆLi»V¾Ú¹^/布cÂl¶@|°ôŽøY ôGL‰my¾ò?¿§Q²óG‰XJ|¦]¹&ì¶âäˆÉ¡éo¹MìurE \òlǨpB´H¢/Q¨õƒj”ô{:ƒ.ÏMù/*Ƶ’ïÏâ9Óê, *žA\ˆ½õæ¼æpND¼å!)q”3AdçÜB®a°ú‹$ƒ”Q‡”ª¿E¨Lôó°ž+Q²N¿s¢ƒÎ jèÝ@l×A=v5K rÔc"žhÄ7âžÚ¬«³B¥Lƒýƒrªn1œåÚ:ƒLAD¦uE›CTÖ|gõ,‚ÕC•>®ƒç…í(ÈètÅ­JÙ]«ÿƒ—(… ƉÐJÑ‹Iî$ÿ@¶ó烆òÃ\BÛ¥¡Ìí°×———oyß‹ ]…ûú:Z©^ ‰ìë!ªŠ­_kšN=rÐ)iÿ˜•†ûÝzì¨Ô–Ûå^~÷¾öþµV]Oã8}çW\!F-(|,Ò>,ÌÌ’&†Z I7N`*­„ÒÄ…hÒ¸JRX´â¿ï±ÛÐPʈ—ÍCëësÏ9¾±óõÏùÃ|‡ð˜: GÍŸ«üþ¡¡~ºO§''žžüö;ÙU)iP$åOY55}Mп˜´ý£L~oì¢ ƒPS%kY=Êìh5׆„2Ëë¦Ê'‹&W%%eF‹ZR^R­U*ÍÈ$/“ꙦªšÕ=åÍ©Êü«EC3•åÓ-?±ÊúÕÍGNÛ²6ìÂ%oÙ}«áxÇœ\")zBÊêïV ý»c¢pîÖ5ÝÈJŸ&í ~pâ<âx¥ZŸÁ)í=®B¾‘{Þy'p1™6nº(Ss ßËf…Úß.už|JýZÓ³³5ê·%îf¨~6Ci4Ùƒ;ª@Õž¿‹×ðoB€N½/™|”…šë[åKo[ýì¥O2€<ýý÷àÆ³‡,¯úww8 îî>ˆÙ»ÏÉdÚï¥j6Ó·Þáœôp&ë׈¤ÃäxJžk4€Ø<Óé÷cÐ<.Eѳhoª~«ô—<4å´XnÜ=ùHòV‹5ýí˜/ïFߎ¼íásfQ•økà—Ï”/§JàÞ-ïßUÒ ¾‡/ÏdB=:ZezS|G´K‡Ý/Qgù%ŠÁ]Lf¨ò~oÜ[Nž7ÞÍÝwlñ÷²óm‘ÏJÃ@ÆïyŠ9ô€ÒТ5]!PjhzDÂ’¤ a7îN‘¾»³¦¦Mé°‡ùÍŸoØû‡nßEó90ÚÖŠ2q8çY‘VU‘W5ò‰ŸÜÓ.›5-^sÞ†‡ÎøÈ­ú´™ÂT?ô{ǥ䱜•ß½²bsv¹X`<Û¦%Žæ0Ù},ryŠnåé[FYïwÈ‘•”ÑÝ&üƒ½X8¿ü&bÐä|›5Ïö¯,/hIPúm‘ÝJÄ0…ïós!l Ê>€.Z» ÅŠ­ ˆ”ÐL»Ôdªˆì»;µtÀ!C¾9sÉÍí°Äz w­SÚöI«¤W!ï­óø  .S÷‰^ö8#žô41Úé|¤9’ëÑò¡‚ŽÅpÊu¨4‰n´-ig¡išä¥.‹2Ùr]´F†î@’t ó%Ø€¹þcºƒè63Z„S¨¤÷ò;:©Ø,-’ª*òªæþÀâyû^Ì+,«yrÆ}¡_âhv CŽ7¼Ç§!<~ŒÚãdwŸTÙ6æîl|ñÛ‹0˜fz8ã¤j<ö:[®Î_hu9íÊ^Óì©ÎËGî9Íÿ“Y%~m‘ÁjÃ0 †ïy vH`£°•­K=”6Ô= Æ&VRƒ±S[ŒÑwŸ½liöãÃ>I¿ÀݱK xª­T¦å$ŒNú¢5Öá‹ÒøG1·èD‹ Ž"££òž0 z²-šÐE(¡ ÃpÒ‚±(%¾ÓUlÒVÈÊa«<¡KjzS“²&½©µð>ƒ¯Ÿr”'Aª† ‡%˜^ëû‘«Ò \øzAÔÕ´pN|¦UUU¾Yq¾)ø!ø Ï.içI® ;iLÌ{6Owxê•Øñ¼âl]샛OÍ3ηÉï]ì5g塨mƒ‹åž•l»Ž§†óþÿ%fdò ]ŽMk„0†ïþŠ9ŒPº÷ý ˆ ¬`wƒz(”‚Ív©f“xXÊþ÷NjqÕ÷’—yÈ<³}6g9£¹è}§;ñÉ­üRÎKK"Àœú¶ñªkÉC£…s üüCœ^50é`m¯õfäêäwž.™üÖŠ+™ÑÎyV¤UUäU}Æ“»í6ó*ÜéGûûP>’¥ÝÊK¯¬„Øœ…]¯V¸ŸíÓŸž`ù})»=FÿÒ·Œ²:?°CVRF/áf¼“Ãú[˜PH<1!ä|Ÿ5ÏŽ¯,/hIpô m‘ÑJÄ0Eßûó l Ê~€.Z» ÅŠ­ ˆ”ÐL»Ôd*ˆì¿;±´®â‡KÎ̽aru=Æh»…›ÎJe†š„‘ÂI_ Æ:¼SŠ™}G'œw: ŒÊa@Ld4ÜE(¡ça¸iÁX”Š¢~2)k mÛô©©Ê*ݳŒÏ:-¼Oà3.O‚Tó%zØ™´¾üfª‡øìf´ †:™Ήx%¡8,+Óº.‹ºa½²dv?®Š=hMz™ÅkršäðmRƒçmZçûâ‘Õ߉Å÷ùQ·aAÚ Ù:”'tñæ÷&6çÁ.Îò‡¦¨îYóËþÿ€ÜÈè uŒA ƒ@ E÷sŠ\@¼@¡BQpg÷Châ8PSÏoЏþâÃ{ÿ?žë²†¶…î£T$O†BXi‹Y´òP¾|Q~éÎ3ŸÈÍjfKÙÀƒø3Í,nÌ>†HAÔ€©XH) qìÇ8½½Þ<÷Bá³±/È(PÐ×W(ÉÈ,V¢Ä<…ÄÒ’üôԼԢĒÔ…´ÌœT]…”|…¼ü…Ԕ̮øøx7OWÏà Èõpô ‰wö÷ ŠihZs1ée¹ˆÀ¾‰$=œ“\; øD6¬U£¬ªüX눎›“kl=Sqy•ç¸Í yÛ}Ìb(ç¶Ñ³}ȯGBMBphpunit-5.1.3/build/binary-phar-autoload.php.in000066400000000000000000000014221263222771600214550ustar00rootroot00000000000000#!/usr/bin/env php ')) { fwrite( STDERR, 'This version of PHPUnit requires PHP 5.6; using the latest version of PHP is highly recommended.' . PHP_EOL ); die(1); } if (__FILE__ == realpath($GLOBALS['_SERVER']['SCRIPT_NAME'])) { $execute = true; } else { $execute = false; } define('__PHPUNIT_PHAR__', str_replace(DIRECTORY_SEPARATOR, '/', __FILE__)); define('__PHPUNIT_PHAR_ROOT__', 'phar://___PHAR___'); Phar::mapPhar('___PHAR___'); ___FILELIST___ if ($execute) { if (isset($_SERVER['argv'][1]) && $_SERVER['argv'][1] == '--manifest') { print file_get_contents(__PHPUNIT_PHAR_ROOT__ . '/manifest.txt'); exit; } PHPUnit_TextUI_Command::main(); } __HALT_COMPILER(); phpunit-5.1.3/build/ca.pem000066400000000000000000000027611263222771600154120ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- phpunit-5.1.3/build/library-phar-autoload.php.in000066400000000000000000000003131263222771600216330ustar00rootroot00000000000000&1'); if (strpos($tag, '-') === false && strpos($tag, 'No names found') === false) { print $tag; } else { $branch = @exec('git rev-parse --abbrev-ref HEAD'); $hash = @exec('git log -1 --format="%H"'); print $branch . '@' . $hash; } print "\n"; $lock = json_decode(file_get_contents(__DIR__ . '/../composer.lock')); foreach ($lock->packages as $package) { print $package->name . ': ' . $package->version; if (!preg_match('/^[v= ]*(([0-9]+)(\\.([0-9]+)(\\.([0-9]+)(-([0-9]+))?(-?([a-zA-Z-+][a-zA-Z0-9\\.\\-:]*)?)?)?)?)$/', $package->version)) { print '@' . $package->source->reference; } print "\n"; } phpunit-5.1.3/build/phar-version.php000077500000000000000000000007561263222771600174570ustar00rootroot00000000000000#!/usr/bin/env php ../tests/Fail phpunit-5.1.3/composer.json000066400000000000000000000036741263222771600157530ustar00rootroot00000000000000{ "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" } ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "irc": "irc://irc.freenode.net/phpunit" }, "minimum-stability": "dev", "prefer-stable": true, "require": { "php": ">=5.6", "phpunit/php-file-iterator": "~1.4", "phpunit/php-text-template": "~1.2", "phpunit/php-code-coverage": "~3.0", "phpunit/php-timer": ">=1.0.6", "phpunit/phpunit-mock-objects": ">=3.0.5", "phpspec/prophecy": "^1.3.1", "symfony/yaml": "~2.1|~3.0", "sebastian/comparator": "~1.1", "sebastian/diff": "~1.2", "sebastian/environment": "~1.3", "sebastian/exporter": "~1.2", "sebastian/global-state": "~1.0", "sebastian/resource-operations": "~1.0", "sebastian/version": "~1.0", "myclabs/deep-copy": "~1.3", "ext-dom": "*", "ext-json": "*", "ext-pcre": "*", "ext-reflection": "*", "ext-spl": "*" }, "config": { "platform": { "php": "5.6.0" } }, "suggest": { "phpunit/php-invoker": "~1.1" }, "bin": [ "phpunit" ], "autoload": { "classmap": [ "src/" ] }, "autoload-dev": { "classmap": [ "tests/" ], "files": [ "src/Framework/Assert/Functions.php", "tests/_files/CoveredFunction.php" ] }, "extra": { "branch-alias": { "dev-master": "5.1.x-dev" } } } phpunit-5.1.3/phpdox.xml.dist000066400000000000000000000011101263222771600161760ustar00rootroot00000000000000 phpunit-5.1.3/phpunit000077500000000000000000000021761263222771600146420ustar00rootroot00000000000000#!/usr/bin/env php * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (version_compare('5.6.0', PHP_VERSION, '>')) { fwrite( STDERR, 'This version of PHPUnit requires PHP 5.6; using the latest version of PHP is highly recommended.' . PHP_EOL ); die(1); } if (!ini_get('date.timezone')) { ini_set('date.timezone', 'UTC'); } 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 the following commands:' . PHP_EOL . 'wget http://getcomposer.org/composer.phar' . PHP_EOL . 'php composer.phar install' . PHP_EOL ); die(1); } require PHPUNIT_COMPOSER_INSTALL; PHPUnit_TextUI_Command::main(); phpunit-5.1.3/phpunit.xml.dist000066400000000000000000000020361263222771600163730ustar00rootroot00000000000000 tests/Framework tests/Extensions tests/Runner tests/Util tests/TextUI tests/Regression src src/Framework/Assert/Functions.php phpunit-5.1.3/phpunit.xsd000066400000000000000000000304011263222771600154240ustar00rootroot00000000000000 This Schema file defines the rules by which the XML configuration file of PHPUnit 5.1 may be structured. Root Element The main type specifying the document structure phpunit-5.1.3/src/000077500000000000000000000000001263222771600140065ustar00rootroot00000000000000phpunit-5.1.3/src/Exception.php000066400000000000000000000005631263222771600164610ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Marker interface for PHPUnit exceptions. * * @since Interface available since Release 4.0.0 */ interface PHPUnit_Exception { } phpunit-5.1.3/src/Extensions/000077500000000000000000000000001263222771600161455ustar00rootroot00000000000000phpunit-5.1.3/src/Extensions/GroupTestSuite.php000066400000000000000000000036021263222771600216250ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * We have a TestSuite object A. * In TestSuite object A we have Tests tagged with @group. * We want a TestSuite object B that contains TestSuite objects C, D, ... * for the Tests tagged with @group C, @group D, ... * Running the Tests from TestSuite object B results in Tests tagged with both * * @group C and @group D in TestSuite object A to be run twice . * * * $suite = new PHPUnit_Extensions_GroupTestSuite($A, array('C', 'D')); * * * @since Class available since Release 3.3.0 */ class PHPUnit_Extensions_GroupTestSuite extends PHPUnit_Framework_TestSuite { public function __construct(PHPUnit_Framework_TestSuite $suite, array $groups) { $groupSuites = []; $name = $suite->getName(); foreach ($groups as $group) { $groupSuites[$group] = new PHPUnit_Framework_TestSuite($name . ' - ' . $group); $this->addTest($groupSuites[$group]); } $tests = new RecursiveIteratorIterator( new PHPUnit_Util_TestSuiteIterator($suite), RecursiveIteratorIterator::LEAVES_ONLY ); foreach ($tests as $test) { if ($test instanceof PHPUnit_Framework_TestCase) { $testGroups = PHPUnit_Util_Test::getGroups( get_class($test), $test->getName(false) ); foreach ($groups as $group) { foreach ($testGroups as $testGroup) { if ($group == $testGroup) { $groupSuites[$group]->addTest($test); } } } } } } } phpunit-5.1.3/src/Extensions/PhptTestCase.php000066400000000000000000000157551263222771600212420ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Runner for PHPT test cases. * * @since Class available since Release 3.1.4 */ class PHPUnit_Extensions_PhptTestCase implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing { /** * @var string */ private $filename; /** * @var PHPUnit_Util_PHP */ private $phpUtil; /** * @var array */ private $settings = [ 'allow_url_fopen=1', 'auto_append_file=', 'auto_prepend_file=', 'disable_functions=', 'display_errors=1', 'docref_root=', 'docref_ext=.html', 'error_append_string=', 'error_prepend_string=', 'error_reporting=-1', 'html_errors=0', 'log_errors=0', 'magic_quotes_runtime=0', 'output_handler=', 'open_basedir=', 'output_buffering=Off', 'report_memleaks=0', 'report_zend_debug=0', 'safe_mode=0', 'track_errors=1', 'xdebug.default_enable=0' ]; /** * Constructs a test case with the given filename. * * @param string $filename * @param PHPUnit_Util_PHP $phpUtil * * @throws PHPUnit_Framework_Exception */ public function __construct($filename, $phpUtil = null) { if (!is_string($filename)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (!is_file($filename)) { throw new PHPUnit_Framework_Exception( sprintf( 'File "%s" does not exist.', $filename ) ); } $this->filename = $filename; $this->phpUtil = $phpUtil ?: PHPUnit_Util_PHP::factory(); } /** * Counts the number of test cases executed by run(TestResult result). * * @return int */ public function count() { return 1; } /** * @param array $sections * @param string $output */ private function assertPhptExpectation(array $sections, $output) { $assertions = [ 'EXPECT' => 'assertEquals', 'EXPECTF' => 'assertStringMatchesFormat', 'EXPECTREGEX' => 'assertRegExp', ]; $actual = preg_replace('/\r\n/', "\n", trim($output)); foreach ($assertions as $sectionName => $sectionAssertion) { if (isset($sections[$sectionName])) { $sectionContent = preg_replace('/\r\n/', "\n", trim($sections[$sectionName])); $assertion = $sectionAssertion; $expected = $sectionName == 'EXPECTREGEX' ? "/{$sectionContent}/" : $sectionContent; break; } } PHPUnit_Framework_Assert::$assertion($expected, $actual); } /** * Runs a test and collects its result in a TestResult instance. * * @param PHPUnit_Framework_TestResult $result * * @return PHPUnit_Framework_TestResult */ public function run(PHPUnit_Framework_TestResult $result = null) { $sections = $this->parse(); $code = $this->render($sections['FILE']); if ($result === null) { $result = new PHPUnit_Framework_TestResult; } $skip = false; $time = 0; $settings = $this->settings; $result->startTest($this); if (isset($sections['INI'])) { $settings = array_merge($settings, $this->parseIniSection($sections['INI'])); } // Redirects STDERR to STDOUT $this->phpUtil->setUseStderrRedirection(true); if (isset($sections['SKIPIF'])) { $jobResult = $this->phpUtil->runJob($sections['SKIPIF'], $settings); if (!strncasecmp('skip', ltrim($jobResult['stdout']), 4)) { if (preg_match('/^\s*skip\s*(.+)\s*/i', $jobResult['stdout'], $message)) { $message = substr($message[1], 2); } else { $message = ''; } $result->addFailure($this, new PHPUnit_Framework_SkippedTestError($message), 0); $skip = true; } } if (!$skip) { PHP_Timer::start(); $jobResult = $this->phpUtil->runJob($code, $settings); $time = PHP_Timer::stop(); try { $this->assertPhptExpectation($sections, $jobResult['stdout']); } catch (PHPUnit_Framework_AssertionFailedError $e) { $result->addFailure($this, $e, $time); } catch (Throwable $t) { $result->addError($this, $t, $time); } catch (Exception $e) { $result->addError($this, $e, $time); } if (isset($sections['CLEAN'])) { $cleanCode = $this->render($sections['CLEAN']); $this->phpUtil->runJob($cleanCode, $this->settings); } } $result->endTest($this, $time); return $result; } /** * Returns the name of the test case. * * @return string */ public function getName() { return $this->toString(); } /** * Returns a string representation of the test case. * * @return string */ public function toString() { return $this->filename; } /** * @return array * * @throws PHPUnit_Framework_Exception */ private function parse() { $sections = []; $section = ''; foreach (file($this->filename) as $line) { if (preg_match('/^--([_A-Z]+)--/', $line, $result)) { $section = $result[1]; $sections[$section] = ''; continue; } elseif (empty($section)) { throw new PHPUnit_Framework_Exception('Invalid PHPT file'); } $sections[$section] .= $line; } if (!isset($sections['FILE']) || (!isset($sections['EXPECT']) && !isset($sections['EXPECTF']) && !isset($sections['EXPECTREGEX']))) { throw new PHPUnit_Framework_Exception('Invalid PHPT file'); } return $sections; } /** * @param string $code * * @return string */ private function render($code) { return str_replace( [ '__DIR__', '__FILE__' ], [ "'" . dirname($this->filename) . "'", "'" . $this->filename . "'" ], $code ); } /** * Parse --INI-- section key value pairs and return as array. * * @param string * * @return array */ protected function parseIniSection($content) { return preg_split('/\n|\r/', $content, -1, PREG_SPLIT_NO_EMPTY); } } phpunit-5.1.3/src/Extensions/PhptTestSuite.php000066400000000000000000000020171263222771600214430ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Suite for .phpt test cases. * * @since Class available since Release 3.1.4 */ class PHPUnit_Extensions_PhptTestSuite extends PHPUnit_Framework_TestSuite { /** * Constructs a new TestSuite for .phpt test cases. * * @param string $directory * * @throws PHPUnit_Framework_Exception */ public function __construct($directory) { if (is_string($directory) && is_dir($directory)) { $this->setName($directory); $facade = new File_Iterator_Facade; $files = $facade->getFilesAsArray($directory, '.phpt'); foreach ($files as $file) { $this->addTestFile($file); } } else { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'directory name'); } } } phpunit-5.1.3/src/Extensions/RepeatedTest.php000066400000000000000000000043671263222771600212610ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A Decorator that runs a test repeatedly. * * @since Class available since Release 2.0.0 */ class PHPUnit_Extensions_RepeatedTest extends PHPUnit_Extensions_TestDecorator { /** * @var bool */ protected $processIsolation = false; /** * @var int */ protected $timesRepeat = 1; /** * @param PHPUnit_Framework_Test $test * @param int $timesRepeat * @param bool $processIsolation * * @throws PHPUnit_Framework_Exception */ public function __construct(PHPUnit_Framework_Test $test, $timesRepeat = 1, $processIsolation = false) { parent::__construct($test); if (is_integer($timesRepeat) && $timesRepeat >= 0) { $this->timesRepeat = $timesRepeat; } else { throw PHPUnit_Util_InvalidArgumentHelper::factory( 2, 'positive integer' ); } $this->processIsolation = $processIsolation; } /** * Counts the number of test cases that * will be run by this test. * * @return int */ public function count() { return $this->timesRepeat * count($this->test); } /** * Runs the decorated test and collects the * result in a TestResult. * * @param PHPUnit_Framework_TestResult $result * * @return PHPUnit_Framework_TestResult * * @throws PHPUnit_Framework_Exception */ public function run(PHPUnit_Framework_TestResult $result = null) { if ($result === null) { $result = $this->createResult(); } //@codingStandardsIgnoreStart for ($i = 0; $i < $this->timesRepeat && !$result->shouldStop(); $i++) { //@codingStandardsIgnoreEnd if ($this->test instanceof PHPUnit_Framework_TestSuite) { $this->test->setRunTestInSeparateProcess($this->processIsolation); } $this->test->run($result); } return $result; } } phpunit-5.1.3/src/Extensions/TestDecorator.php000066400000000000000000000045001263222771600214370ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A Decorator for Tests. * * Use TestDecorator as the base class for defining new * test decorators. Test decorator subclasses can be introduced * to add behaviour before or after a test is run. * * @since Class available since Release 2.0.0 */ class PHPUnit_Extensions_TestDecorator extends PHPUnit_Framework_Assert implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing { /** * The Test to be decorated. * * @var object */ protected $test = null; /** * Constructor. * * @param PHPUnit_Framework_Test $test */ public function __construct(PHPUnit_Framework_Test $test) { $this->test = $test; } /** * Returns a string representation of the test. * * @return string */ public function toString() { return $this->test->toString(); } /** * Runs the test and collects the * result in a TestResult. * * @param PHPUnit_Framework_TestResult $result */ public function basicRun(PHPUnit_Framework_TestResult $result) { $this->test->run($result); } /** * Counts the number of test cases that * will be run by this test. * * @return int */ public function count() { return count($this->test); } /** * Creates a default TestResult object. * * @return PHPUnit_Framework_TestResult */ protected function createResult() { return new PHPUnit_Framework_TestResult; } /** * Returns the test to be run. * * @return PHPUnit_Framework_Test */ public function getTest() { return $this->test; } /** * Runs the decorated test and collects the * result in a TestResult. * * @param PHPUnit_Framework_TestResult $result * * @return PHPUnit_Framework_TestResult */ public function run(PHPUnit_Framework_TestResult $result = null) { if ($result === null) { $result = $this->createResult(); } $this->basicRun($result); return $result; } } phpunit-5.1.3/src/Extensions/TicketListener.php000066400000000000000000000134461263222771600216170ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Base class for test listeners that interact with an issue tracker. * * @since Class available since Release 3.4.0 */ abstract class PHPUnit_Extensions_TicketListener implements PHPUnit_Framework_TestListener { /** * @var array */ protected $ticketCounts = []; /** * @var bool */ protected $ran = false; /** * An error occurred. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) { } /** * A failure occurred. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_AssertionFailedError $e * @param float $time */ public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) { } /** * Incomplete test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) { } /** * Risky test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time * * @since Method available since Release 4.0.0 */ public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) { } /** * Skipped test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time * * @since Method available since Release 3.0.0 */ public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) { } /** * A test suite started. * * @param PHPUnit_Framework_TestSuite $suite * * @since Method available since Release 2.2.0 */ public function startTestSuite(PHPUnit_Framework_TestSuite $suite) { } /** * A test suite ended. * * @param PHPUnit_Framework_TestSuite $suite * * @since Method available since Release 2.2.0 */ public function endTestSuite(PHPUnit_Framework_TestSuite $suite) { } /** * A test started. * * @param PHPUnit_Framework_Test $test */ public function startTest(PHPUnit_Framework_Test $test) { if (!$test instanceof PHPUnit_Framework_WarningTestCase) { if ($this->ran) { return; } $name = $test->getName(false); $tickets = PHPUnit_Util_Test::getTickets(get_class($test), $name); foreach ($tickets as $ticket) { $this->ticketCounts[$ticket][$name] = 1; } $this->ran = true; } } /** * A test ended. * * @param PHPUnit_Framework_Test $test * @param float $time */ public function endTest(PHPUnit_Framework_Test $test, $time) { if (!$test instanceof PHPUnit_Framework_WarningTestCase) { if ($test->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) { $ifStatus = ['assigned', 'new', 'reopened']; $newStatus = 'closed'; $message = 'Automatically closed by PHPUnit (test passed).'; $resolution = 'fixed'; $cumulative = true; } elseif ($test->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE) { $ifStatus = ['closed']; $newStatus = 'reopened'; $message = 'Automatically reopened by PHPUnit (test failed).'; $resolution = ''; $cumulative = false; } else { return; } $name = $test->getName(false); $tickets = PHPUnit_Util_Test::getTickets(get_class($test), $name); foreach ($tickets as $ticket) { // Remove this test from the totals (if it passed). if ($test->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) { unset($this->ticketCounts[$ticket][$name]); } // Only close tickets if ALL referenced cases pass // but reopen tickets if a single test fails. if ($cumulative) { // Determine number of to-pass tests: if (count($this->ticketCounts[$ticket]) > 0) { // There exist remaining test cases with this reference. $adjustTicket = false; } else { // No remaining tickets, go ahead and adjust. $adjustTicket = true; } } else { $adjustTicket = true; } $ticketInfo = $this->getTicketInfo($ticket); if ($adjustTicket && in_array($ticketInfo['status'], $ifStatus)) { $this->updateTicket($ticket, $newStatus, $message, $resolution); } } } } /** * @param mixed $ticketId * * @return mixed */ abstract protected function getTicketInfo($ticketId = null); /** * @param string $ticketId * @param string $newStatus * @param string $message * @param string $resolution */ abstract protected function updateTicket($ticketId, $newStatus, $message, $resolution); } phpunit-5.1.3/src/Framework/000077500000000000000000000000001263222771600157435ustar00rootroot00000000000000phpunit-5.1.3/src/Framework/Assert.php000066400000000000000000002541271263222771600177300ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A set of assert methods. * * @since Class available since Release 2.0.0 */ abstract class PHPUnit_Framework_Assert { /** * @var int */ private static $count = 0; /** * Asserts that an array has a specified key. * * @param mixed $key * @param array|ArrayAccess $array * @param string $message * * @since Method available since Release 3.0.0 */ public static function assertArrayHasKey($key, $array, $message = '') { if (!(is_integer($key) || is_string($key))) { throw PHPUnit_Util_InvalidArgumentHelper::factory( 1, 'integer or string' ); } if (!(is_array($array) || $array instanceof ArrayAccess)) { throw PHPUnit_Util_InvalidArgumentHelper::factory( 2, 'array or ArrayAccess' ); } $constraint = new PHPUnit_Framework_Constraint_ArrayHasKey($key); self::assertThat($array, $constraint, $message); } /** * Asserts that an array has a specified subset. * * @param array|ArrayAccess $subset * @param array|ArrayAccess $array * @param bool $strict Check for object identity * @param string $message * * @since Method available since Release 4.4.0 */ public static function assertArraySubset($subset, $array, $strict = false, $message = '') { if (!is_array($subset)) { throw PHPUnit_Util_InvalidArgumentHelper::factory( 1, 'array or ArrayAccess' ); } if (!is_array($array)) { throw PHPUnit_Util_InvalidArgumentHelper::factory( 2, 'array or ArrayAccess' ); } $constraint = new PHPUnit_Framework_Constraint_ArraySubset($subset, $strict); self::assertThat($array, $constraint, $message); } /** * Asserts that an array does not have a specified key. * * @param mixed $key * @param array|ArrayAccess $array * @param string $message * * @since Method available since Release 3.0.0 */ public static function assertArrayNotHasKey($key, $array, $message = '') { if (!(is_integer($key) || is_string($key))) { throw PHPUnit_Util_InvalidArgumentHelper::factory( 1, 'integer or string' ); } if (!(is_array($array) || $array instanceof ArrayAccess)) { throw PHPUnit_Util_InvalidArgumentHelper::factory( 2, 'array or ArrayAccess' ); } $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_ArrayHasKey($key) ); self::assertThat($array, $constraint, $message); } /** * Asserts that a haystack contains a needle. * * @param mixed $needle * @param mixed $haystack * @param string $message * @param bool $ignoreCase * @param bool $checkForObjectIdentity * @param bool $checkForNonObjectIdentity * * @since Method available since Release 2.1.0 */ public static function assertContains($needle, $haystack, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) { if (is_array($haystack) || is_object($haystack) && $haystack instanceof Traversable) { $constraint = new PHPUnit_Framework_Constraint_TraversableContains( $needle, $checkForObjectIdentity, $checkForNonObjectIdentity ); } elseif (is_string($haystack)) { if (!is_string($needle)) { throw PHPUnit_Util_InvalidArgumentHelper::factory( 1, 'string' ); } $constraint = new PHPUnit_Framework_Constraint_StringContains( $needle, $ignoreCase ); } else { throw PHPUnit_Util_InvalidArgumentHelper::factory( 2, 'array, traversable or string' ); } self::assertThat($haystack, $constraint, $message); } /** * Asserts that a haystack that is stored in a static attribute of a class * or an attribute of an object contains a needle. * * @param mixed $needle * @param string $haystackAttributeName * @param mixed $haystackClassOrObject * @param string $message * @param bool $ignoreCase * @param bool $checkForObjectIdentity * @param bool $checkForNonObjectIdentity * * @since Method available since Release 3.0.0 */ public static function assertAttributeContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) { self::assertContains( $needle, self::readAttribute($haystackClassOrObject, $haystackAttributeName), $message, $ignoreCase, $checkForObjectIdentity, $checkForNonObjectIdentity ); } /** * Asserts that a haystack does not contain a needle. * * @param mixed $needle * @param mixed $haystack * @param string $message * @param bool $ignoreCase * @param bool $checkForObjectIdentity * @param bool $checkForNonObjectIdentity * * @since Method available since Release 2.1.0 */ public static function assertNotContains($needle, $haystack, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) { if (is_array($haystack) || is_object($haystack) && $haystack instanceof Traversable) { $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_TraversableContains( $needle, $checkForObjectIdentity, $checkForNonObjectIdentity ) ); } elseif (is_string($haystack)) { if (!is_string($needle)) { throw PHPUnit_Util_InvalidArgumentHelper::factory( 1, 'string' ); } $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_StringContains( $needle, $ignoreCase ) ); } else { throw PHPUnit_Util_InvalidArgumentHelper::factory( 2, 'array, traversable or string' ); } self::assertThat($haystack, $constraint, $message); } /** * Asserts that a haystack that is stored in a static attribute of a class * or an attribute of an object does not contain a needle. * * @param mixed $needle * @param string $haystackAttributeName * @param mixed $haystackClassOrObject * @param string $message * @param bool $ignoreCase * @param bool $checkForObjectIdentity * @param bool $checkForNonObjectIdentity * * @since Method available since Release 3.0.0 */ public static function assertAttributeNotContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) { self::assertNotContains( $needle, self::readAttribute($haystackClassOrObject, $haystackAttributeName), $message, $ignoreCase, $checkForObjectIdentity, $checkForNonObjectIdentity ); } /** * Asserts that a haystack contains only values of a given type. * * @param string $type * @param mixed $haystack * @param bool $isNativeType * @param string $message * * @since Method available since Release 3.1.4 */ public static function assertContainsOnly($type, $haystack, $isNativeType = null, $message = '') { if (!(is_array($haystack) || is_object($haystack) && $haystack instanceof Traversable)) { throw PHPUnit_Util_InvalidArgumentHelper::factory( 2, 'array or traversable' ); } if ($isNativeType == null) { $isNativeType = PHPUnit_Util_Type::isType($type); } self::assertThat( $haystack, new PHPUnit_Framework_Constraint_TraversableContainsOnly( $type, $isNativeType ), $message ); } /** * Asserts that a haystack contains only instances of a given classname * * @param string $classname * @param array|Traversable $haystack * @param string $message */ public static function assertContainsOnlyInstancesOf($classname, $haystack, $message = '') { if (!(is_array($haystack) || is_object($haystack) && $haystack instanceof Traversable)) { throw PHPUnit_Util_InvalidArgumentHelper::factory( 2, 'array or traversable' ); } self::assertThat( $haystack, new PHPUnit_Framework_Constraint_TraversableContainsOnly( $classname, false ), $message ); } /** * Asserts that a haystack that is stored in a static attribute of a class * or an attribute of an object contains only values of a given type. * * @param string $type * @param string $haystackAttributeName * @param mixed $haystackClassOrObject * @param bool $isNativeType * @param string $message * * @since Method available since Release 3.1.4 */ public static function assertAttributeContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '') { self::assertContainsOnly( $type, self::readAttribute($haystackClassOrObject, $haystackAttributeName), $isNativeType, $message ); } /** * Asserts that a haystack does not contain only values of a given type. * * @param string $type * @param mixed $haystack * @param bool $isNativeType * @param string $message * * @since Method available since Release 3.1.4 */ public static function assertNotContainsOnly($type, $haystack, $isNativeType = null, $message = '') { if (!(is_array($haystack) || is_object($haystack) && $haystack instanceof Traversable)) { throw PHPUnit_Util_InvalidArgumentHelper::factory( 2, 'array or traversable' ); } if ($isNativeType == null) { $isNativeType = PHPUnit_Util_Type::isType($type); } self::assertThat( $haystack, new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_TraversableContainsOnly( $type, $isNativeType ) ), $message ); } /** * Asserts that a haystack that is stored in a static attribute of a class * or an attribute of an object does not contain only values of a given * type. * * @param string $type * @param string $haystackAttributeName * @param mixed $haystackClassOrObject * @param bool $isNativeType * @param string $message * * @since Method available since Release 3.1.4 */ public static function assertAttributeNotContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '') { self::assertNotContainsOnly( $type, self::readAttribute($haystackClassOrObject, $haystackAttributeName), $isNativeType, $message ); } /** * Asserts the number of elements of an array, Countable or Traversable. * * @param int $expectedCount * @param mixed $haystack * @param string $message */ public static function assertCount($expectedCount, $haystack, $message = '') { if (!is_int($expectedCount)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer'); } if (!$haystack instanceof Countable && !$haystack instanceof Traversable && !is_array($haystack)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable or traversable'); } self::assertThat( $haystack, new PHPUnit_Framework_Constraint_Count($expectedCount), $message ); } /** * Asserts the number of elements of an array, Countable or Traversable * that is stored in an attribute. * * @param int $expectedCount * @param string $haystackAttributeName * @param mixed $haystackClassOrObject * @param string $message * * @since Method available since Release 3.6.0 */ public static function assertAttributeCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '') { self::assertCount( $expectedCount, self::readAttribute($haystackClassOrObject, $haystackAttributeName), $message ); } /** * Asserts the number of elements of an array, Countable or Traversable. * * @param int $expectedCount * @param mixed $haystack * @param string $message */ public static function assertNotCount($expectedCount, $haystack, $message = '') { if (!is_int($expectedCount)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer'); } if (!$haystack instanceof Countable && !$haystack instanceof Traversable && !is_array($haystack)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable or traversable'); } $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_Count($expectedCount) ); self::assertThat($haystack, $constraint, $message); } /** * Asserts the number of elements of an array, Countable or Traversable * that is stored in an attribute. * * @param int $expectedCount * @param string $haystackAttributeName * @param mixed $haystackClassOrObject * @param string $message * * @since Method available since Release 3.6.0 */ public static function assertAttributeNotCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '') { self::assertNotCount( $expectedCount, self::readAttribute($haystackClassOrObject, $haystackAttributeName), $message ); } /** * Asserts that two variables are equal. * * @param mixed $expected * @param mixed $actual * @param string $message * @param float $delta * @param int $maxDepth * @param bool $canonicalize * @param bool $ignoreCase */ public static function assertEquals($expected, $actual, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) { $constraint = new PHPUnit_Framework_Constraint_IsEqual( $expected, $delta, $maxDepth, $canonicalize, $ignoreCase ); self::assertThat($actual, $constraint, $message); } /** * Asserts that a variable is equal to an attribute of an object. * * @param mixed $expected * @param string $actualAttributeName * @param string $actualClassOrObject * @param string $message * @param float $delta * @param int $maxDepth * @param bool $canonicalize * @param bool $ignoreCase */ public static function assertAttributeEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) { self::assertEquals( $expected, self::readAttribute($actualClassOrObject, $actualAttributeName), $message, $delta, $maxDepth, $canonicalize, $ignoreCase ); } /** * Asserts that two variables are not equal. * * @param mixed $expected * @param mixed $actual * @param string $message * @param float $delta * @param int $maxDepth * @param bool $canonicalize * @param bool $ignoreCase * * @since Method available since Release 2.3.0 */ public static function assertNotEquals($expected, $actual, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) { $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_IsEqual( $expected, $delta, $maxDepth, $canonicalize, $ignoreCase ) ); self::assertThat($actual, $constraint, $message); } /** * Asserts that a variable is not equal to an attribute of an object. * * @param mixed $expected * @param string $actualAttributeName * @param string $actualClassOrObject * @param string $message * @param float $delta * @param int $maxDepth * @param bool $canonicalize * @param bool $ignoreCase */ public static function assertAttributeNotEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) { self::assertNotEquals( $expected, self::readAttribute($actualClassOrObject, $actualAttributeName), $message, $delta, $maxDepth, $canonicalize, $ignoreCase ); } /** * Asserts that a variable is empty. * * @param mixed $actual * @param string $message * * @throws PHPUnit_Framework_AssertionFailedError */ public static function assertEmpty($actual, $message = '') { self::assertThat($actual, self::isEmpty(), $message); } /** * Asserts that a static attribute of a class or an attribute of an object * is empty. * * @param string $haystackAttributeName * @param mixed $haystackClassOrObject * @param string $message * * @since Method available since Release 3.5.0 */ public static function assertAttributeEmpty($haystackAttributeName, $haystackClassOrObject, $message = '') { self::assertEmpty( self::readAttribute($haystackClassOrObject, $haystackAttributeName), $message ); } /** * Asserts that a variable is not empty. * * @param mixed $actual * @param string $message * * @throws PHPUnit_Framework_AssertionFailedError */ public static function assertNotEmpty($actual, $message = '') { self::assertThat($actual, self::logicalNot(self::isEmpty()), $message); } /** * Asserts that a static attribute of a class or an attribute of an object * is not empty. * * @param string $haystackAttributeName * @param mixed $haystackClassOrObject * @param string $message * * @since Method available since Release 3.5.0 */ public static function assertAttributeNotEmpty($haystackAttributeName, $haystackClassOrObject, $message = '') { self::assertNotEmpty( self::readAttribute($haystackClassOrObject, $haystackAttributeName), $message ); } /** * Asserts that a value is greater than another value. * * @param mixed $expected * @param mixed $actual * @param string $message * * @since Method available since Release 3.1.0 */ public static function assertGreaterThan($expected, $actual, $message = '') { self::assertThat($actual, self::greaterThan($expected), $message); } /** * Asserts that an attribute is greater than another value. * * @param mixed $expected * @param string $actualAttributeName * @param string $actualClassOrObject * @param string $message * * @since Method available since Release 3.1.0 */ public static function assertAttributeGreaterThan($expected, $actualAttributeName, $actualClassOrObject, $message = '') { self::assertGreaterThan( $expected, self::readAttribute($actualClassOrObject, $actualAttributeName), $message ); } /** * Asserts that a value is greater than or equal to another value. * * @param mixed $expected * @param mixed $actual * @param string $message * * @since Method available since Release 3.1.0 */ public static function assertGreaterThanOrEqual($expected, $actual, $message = '') { self::assertThat( $actual, self::greaterThanOrEqual($expected), $message ); } /** * Asserts that an attribute is greater than or equal to another value. * * @param mixed $expected * @param string $actualAttributeName * @param string $actualClassOrObject * @param string $message * * @since Method available since Release 3.1.0 */ public static function assertAttributeGreaterThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '') { self::assertGreaterThanOrEqual( $expected, self::readAttribute($actualClassOrObject, $actualAttributeName), $message ); } /** * Asserts that a value is smaller than another value. * * @param mixed $expected * @param mixed $actual * @param string $message * * @since Method available since Release 3.1.0 */ public static function assertLessThan($expected, $actual, $message = '') { self::assertThat($actual, self::lessThan($expected), $message); } /** * Asserts that an attribute is smaller than another value. * * @param mixed $expected * @param string $actualAttributeName * @param string $actualClassOrObject * @param string $message * * @since Method available since Release 3.1.0 */ public static function assertAttributeLessThan($expected, $actualAttributeName, $actualClassOrObject, $message = '') { self::assertLessThan( $expected, self::readAttribute($actualClassOrObject, $actualAttributeName), $message ); } /** * Asserts that a value is smaller than or equal to another value. * * @param mixed $expected * @param mixed $actual * @param string $message * * @since Method available since Release 3.1.0 */ public static function assertLessThanOrEqual($expected, $actual, $message = '') { self::assertThat($actual, self::lessThanOrEqual($expected), $message); } /** * Asserts that an attribute is smaller than or equal to another value. * * @param mixed $expected * @param string $actualAttributeName * @param string $actualClassOrObject * @param string $message * * @since Method available since Release 3.1.0 */ public static function assertAttributeLessThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '') { self::assertLessThanOrEqual( $expected, self::readAttribute($actualClassOrObject, $actualAttributeName), $message ); } /** * Asserts that the contents of one file is equal to the contents of another * file. * * @param string $expected * @param string $actual * @param string $message * @param bool $canonicalize * @param bool $ignoreCase * * @since Method available since Release 3.2.14 */ public static function assertFileEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false) { self::assertFileExists($expected, $message); self::assertFileExists($actual, $message); self::assertEquals( file_get_contents($expected), file_get_contents($actual), $message, 0, 10, $canonicalize, $ignoreCase ); } /** * Asserts that the contents of one file is not equal to the contents of * another file. * * @param string $expected * @param string $actual * @param string $message * @param bool $canonicalize * @param bool $ignoreCase * * @since Method available since Release 3.2.14 */ public static function assertFileNotEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false) { self::assertFileExists($expected, $message); self::assertFileExists($actual, $message); self::assertNotEquals( file_get_contents($expected), file_get_contents($actual), $message, 0, 10, $canonicalize, $ignoreCase ); } /** * Asserts that the contents of a string is equal * to the contents of a file. * * @param string $expectedFile * @param string $actualString * @param string $message * @param bool $canonicalize * @param bool $ignoreCase * * @since Method available since Release 3.3.0 */ public static function assertStringEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false) { self::assertFileExists($expectedFile, $message); self::assertEquals( file_get_contents($expectedFile), $actualString, $message, 0, 10, $canonicalize, $ignoreCase ); } /** * Asserts that the contents of a string is not equal * to the contents of a file. * * @param string $expectedFile * @param string $actualString * @param string $message * @param bool $canonicalize * @param bool $ignoreCase * * @since Method available since Release 3.3.0 */ public static function assertStringNotEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false) { self::assertFileExists($expectedFile, $message); self::assertNotEquals( file_get_contents($expectedFile), $actualString, $message, 0, 10, $canonicalize, $ignoreCase ); } /** * Asserts that a file exists. * * @param string $filename * @param string $message * * @since Method available since Release 3.0.0 */ public static function assertFileExists($filename, $message = '') { if (!is_string($filename)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } $constraint = new PHPUnit_Framework_Constraint_FileExists; self::assertThat($filename, $constraint, $message); } /** * Asserts that a file does not exist. * * @param string $filename * @param string $message * * @since Method available since Release 3.0.0 */ public static function assertFileNotExists($filename, $message = '') { if (!is_string($filename)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_FileExists ); self::assertThat($filename, $constraint, $message); } /** * Asserts that a condition is true. * * @param bool $condition * @param string $message * * @throws PHPUnit_Framework_AssertionFailedError */ public static function assertTrue($condition, $message = '') { self::assertThat($condition, self::isTrue(), $message); } /** * Asserts that a condition is not true. * * @param bool $condition * @param string $message * * @throws PHPUnit_Framework_AssertionFailedError */ public static function assertNotTrue($condition, $message = '') { self::assertThat($condition, self::logicalNot(self::isTrue()), $message); } /** * Asserts that a condition is false. * * @param bool $condition * @param string $message * * @throws PHPUnit_Framework_AssertionFailedError */ public static function assertFalse($condition, $message = '') { self::assertThat($condition, self::isFalse(), $message); } /** * Asserts that a condition is not false. * * @param bool $condition * @param string $message * * @throws PHPUnit_Framework_AssertionFailedError */ public static function assertNotFalse($condition, $message = '') { self::assertThat($condition, self::logicalNot(self::isFalse()), $message); } /** * Asserts that a variable is not null. * * @param mixed $actual * @param string $message */ public static function assertNotNull($actual, $message = '') { self::assertThat($actual, self::logicalNot(self::isNull()), $message); } /** * Asserts that a variable is null. * * @param mixed $actual * @param string $message */ public static function assertNull($actual, $message = '') { self::assertThat($actual, self::isNull(), $message); } /** * Asserts that a variable is finite. * * @param mixed $actual * @param string $message */ public static function assertFinite($actual, $message = '') { self::assertThat($actual, self::isFinite(), $message); } /** * Asserts that a variable is infinite. * * @param mixed $actual * @param string $message */ public static function assertInfinite($actual, $message = '') { self::assertThat($actual, self::isInfinite(), $message); } /** * Asserts that a variable is nan. * * @param mixed $actual * @param string $message */ public static function assertNan($actual, $message = '') { self::assertThat($actual, self::isNan(), $message); } /** * Asserts that a class has a specified attribute. * * @param string $attributeName * @param string $className * @param string $message * * @since Method available since Release 3.1.0 */ public static function assertClassHasAttribute($attributeName, $className, $message = '') { if (!is_string($attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name'); } if (!is_string($className) || !class_exists($className)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name', $className); } $constraint = new PHPUnit_Framework_Constraint_ClassHasAttribute( $attributeName ); self::assertThat($className, $constraint, $message); } /** * Asserts that a class does not have a specified attribute. * * @param string $attributeName * @param string $className * @param string $message * * @since Method available since Release 3.1.0 */ public static function assertClassNotHasAttribute($attributeName, $className, $message = '') { if (!is_string($attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name'); } if (!is_string($className) || !class_exists($className)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name', $className); } $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_ClassHasAttribute($attributeName) ); self::assertThat($className, $constraint, $message); } /** * Asserts that a class has a specified static attribute. * * @param string $attributeName * @param string $className * @param string $message * * @since Method available since Release 3.1.0 */ public static function assertClassHasStaticAttribute($attributeName, $className, $message = '') { if (!is_string($attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name'); } if (!is_string($className) || !class_exists($className)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name', $className); } $constraint = new PHPUnit_Framework_Constraint_ClassHasStaticAttribute( $attributeName ); self::assertThat($className, $constraint, $message); } /** * Asserts that a class does not have a specified static attribute. * * @param string $attributeName * @param string $className * @param string $message * * @since Method available since Release 3.1.0 */ public static function assertClassNotHasStaticAttribute($attributeName, $className, $message = '') { if (!is_string($attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name'); } if (!is_string($className) || !class_exists($className)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name', $className); } $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_ClassHasStaticAttribute( $attributeName ) ); self::assertThat($className, $constraint, $message); } /** * Asserts that an object has a specified attribute. * * @param string $attributeName * @param object $object * @param string $message * * @since Method available since Release 3.0.0 */ public static function assertObjectHasAttribute($attributeName, $object, $message = '') { if (!is_string($attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name'); } if (!is_object($object)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'object'); } $constraint = new PHPUnit_Framework_Constraint_ObjectHasAttribute( $attributeName ); self::assertThat($object, $constraint, $message); } /** * Asserts that an object does not have a specified attribute. * * @param string $attributeName * @param object $object * @param string $message * * @since Method available since Release 3.0.0 */ public static function assertObjectNotHasAttribute($attributeName, $object, $message = '') { if (!is_string($attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name'); } if (!is_object($object)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'object'); } $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_ObjectHasAttribute($attributeName) ); self::assertThat($object, $constraint, $message); } /** * Asserts that two variables have the same type and value. * Used on objects, it asserts that two variables reference * the same object. * * @param mixed $expected * @param mixed $actual * @param string $message */ public static function assertSame($expected, $actual, $message = '') { if (is_bool($expected) && is_bool($actual)) { self::assertEquals($expected, $actual, $message); } else { $constraint = new PHPUnit_Framework_Constraint_IsIdentical( $expected ); self::assertThat($actual, $constraint, $message); } } /** * Asserts that a variable and an attribute of an object have the same type * and value. * * @param mixed $expected * @param string $actualAttributeName * @param object $actualClassOrObject * @param string $message */ public static function assertAttributeSame($expected, $actualAttributeName, $actualClassOrObject, $message = '') { self::assertSame( $expected, self::readAttribute($actualClassOrObject, $actualAttributeName), $message ); } /** * Asserts that two variables do not have the same type and value. * Used on objects, it asserts that two variables do not reference * the same object. * * @param mixed $expected * @param mixed $actual * @param string $message */ public static function assertNotSame($expected, $actual, $message = '') { if (is_bool($expected) && is_bool($actual)) { self::assertNotEquals($expected, $actual, $message); } else { $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_IsIdentical($expected) ); self::assertThat($actual, $constraint, $message); } } /** * Asserts that a variable and an attribute of an object do not have the * same type and value. * * @param mixed $expected * @param string $actualAttributeName * @param object $actualClassOrObject * @param string $message */ public static function assertAttributeNotSame($expected, $actualAttributeName, $actualClassOrObject, $message = '') { self::assertNotSame( $expected, self::readAttribute($actualClassOrObject, $actualAttributeName), $message ); } /** * Asserts that a variable is of a given type. * * @param string $expected * @param mixed $actual * @param string $message * * @since Method available since Release 3.5.0 */ public static function assertInstanceOf($expected, $actual, $message = '') { if (!(is_string($expected) && (class_exists($expected) || interface_exists($expected)))) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'class or interface name'); } $constraint = new PHPUnit_Framework_Constraint_IsInstanceOf( $expected ); self::assertThat($actual, $constraint, $message); } /** * Asserts that an attribute is of a given type. * * @param string $expected * @param string $attributeName * @param mixed $classOrObject * @param string $message * * @since Method available since Release 3.5.0 */ public static function assertAttributeInstanceOf($expected, $attributeName, $classOrObject, $message = '') { self::assertInstanceOf( $expected, self::readAttribute($classOrObject, $attributeName), $message ); } /** * Asserts that a variable is not of a given type. * * @param string $expected * @param mixed $actual * @param string $message * * @since Method available since Release 3.5.0 */ public static function assertNotInstanceOf($expected, $actual, $message = '') { if (!(is_string($expected) && (class_exists($expected) || interface_exists($expected)))) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'class or interface name'); } $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_IsInstanceOf($expected) ); self::assertThat($actual, $constraint, $message); } /** * Asserts that an attribute is of a given type. * * @param string $expected * @param string $attributeName * @param mixed $classOrObject * @param string $message * * @since Method available since Release 3.5.0 */ public static function assertAttributeNotInstanceOf($expected, $attributeName, $classOrObject, $message = '') { self::assertNotInstanceOf( $expected, self::readAttribute($classOrObject, $attributeName), $message ); } /** * Asserts that a variable is of a given type. * * @param string $expected * @param mixed $actual * @param string $message * * @since Method available since Release 3.5.0 */ public static function assertInternalType($expected, $actual, $message = '') { if (!is_string($expected)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } $constraint = new PHPUnit_Framework_Constraint_IsType( $expected ); self::assertThat($actual, $constraint, $message); } /** * Asserts that an attribute is of a given type. * * @param string $expected * @param string $attributeName * @param mixed $classOrObject * @param string $message * * @since Method available since Release 3.5.0 */ public static function assertAttributeInternalType($expected, $attributeName, $classOrObject, $message = '') { self::assertInternalType( $expected, self::readAttribute($classOrObject, $attributeName), $message ); } /** * Asserts that a variable is not of a given type. * * @param string $expected * @param mixed $actual * @param string $message * * @since Method available since Release 3.5.0 */ public static function assertNotInternalType($expected, $actual, $message = '') { if (!is_string($expected)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_IsType($expected) ); self::assertThat($actual, $constraint, $message); } /** * Asserts that an attribute is of a given type. * * @param string $expected * @param string $attributeName * @param mixed $classOrObject * @param string $message * * @since Method available since Release 3.5.0 */ public static function assertAttributeNotInternalType($expected, $attributeName, $classOrObject, $message = '') { self::assertNotInternalType( $expected, self::readAttribute($classOrObject, $attributeName), $message ); } /** * Asserts that a string matches a given regular expression. * * @param string $pattern * @param string $string * @param string $message */ public static function assertRegExp($pattern, $string, $message = '') { if (!is_string($pattern)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (!is_string($string)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); } $constraint = new PHPUnit_Framework_Constraint_PCREMatch($pattern); self::assertThat($string, $constraint, $message); } /** * Asserts that a string does not match a given regular expression. * * @param string $pattern * @param string $string * @param string $message * * @since Method available since Release 2.1.0 */ public static function assertNotRegExp($pattern, $string, $message = '') { if (!is_string($pattern)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (!is_string($string)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); } $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_PCREMatch($pattern) ); self::assertThat($string, $constraint, $message); } /** * Assert that the size of two arrays (or `Countable` or `Traversable` objects) * is the same. * * @param array|Countable|Traversable $expected * @param array|Countable|Traversable $actual * @param string $message */ public static function assertSameSize($expected, $actual, $message = '') { if (!$expected instanceof Countable && !$expected instanceof Traversable && !is_array($expected)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'countable or traversable'); } if (!$actual instanceof Countable && !$actual instanceof Traversable && !is_array($actual)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable or traversable'); } self::assertThat( $actual, new PHPUnit_Framework_Constraint_SameSize($expected), $message ); } /** * Assert that the size of two arrays (or `Countable` or `Traversable` objects) * is not the same. * * @param array|Countable|Traversable $expected * @param array|Countable|Traversable $actual * @param string $message */ public static function assertNotSameSize($expected, $actual, $message = '') { if (!$expected instanceof Countable && !$expected instanceof Traversable && !is_array($expected)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'countable or traversable'); } if (!$actual instanceof Countable && !$actual instanceof Traversable && !is_array($actual)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable or traversable'); } $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_SameSize($expected) ); self::assertThat($actual, $constraint, $message); } /** * Asserts that a string matches a given format string. * * @param string $format * @param string $string * @param string $message * * @since Method available since Release 3.5.0 */ public static function assertStringMatchesFormat($format, $string, $message = '') { if (!is_string($format)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (!is_string($string)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); } $constraint = new PHPUnit_Framework_Constraint_StringMatches($format); self::assertThat($string, $constraint, $message); } /** * Asserts that a string does not match a given format string. * * @param string $format * @param string $string * @param string $message * * @since Method available since Release 3.5.0 */ public static function assertStringNotMatchesFormat($format, $string, $message = '') { if (!is_string($format)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (!is_string($string)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); } $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_StringMatches($format) ); self::assertThat($string, $constraint, $message); } /** * Asserts that a string matches a given format file. * * @param string $formatFile * @param string $string * @param string $message * * @since Method available since Release 3.5.0 */ public static function assertStringMatchesFormatFile($formatFile, $string, $message = '') { self::assertFileExists($formatFile, $message); if (!is_string($string)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); } $constraint = new PHPUnit_Framework_Constraint_StringMatches( file_get_contents($formatFile) ); self::assertThat($string, $constraint, $message); } /** * Asserts that a string does not match a given format string. * * @param string $formatFile * @param string $string * @param string $message * * @since Method available since Release 3.5.0 */ public static function assertStringNotMatchesFormatFile($formatFile, $string, $message = '') { self::assertFileExists($formatFile, $message); if (!is_string($string)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); } $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_StringMatches( file_get_contents($formatFile) ) ); self::assertThat($string, $constraint, $message); } /** * Asserts that a string starts with a given prefix. * * @param string $prefix * @param string $string * @param string $message * * @since Method available since Release 3.4.0 */ public static function assertStringStartsWith($prefix, $string, $message = '') { if (!is_string($prefix)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (!is_string($string)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); } $constraint = new PHPUnit_Framework_Constraint_StringStartsWith( $prefix ); self::assertThat($string, $constraint, $message); } /** * Asserts that a string starts not with a given prefix. * * @param string $prefix * @param string $string * @param string $message * * @since Method available since Release 3.4.0 */ public static function assertStringStartsNotWith($prefix, $string, $message = '') { if (!is_string($prefix)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (!is_string($string)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); } $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_StringStartsWith($prefix) ); self::assertThat($string, $constraint, $message); } /** * Asserts that a string ends with a given suffix. * * @param string $suffix * @param string $string * @param string $message * * @since Method available since Release 3.4.0 */ public static function assertStringEndsWith($suffix, $string, $message = '') { if (!is_string($suffix)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (!is_string($string)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); } $constraint = new PHPUnit_Framework_Constraint_StringEndsWith($suffix); self::assertThat($string, $constraint, $message); } /** * Asserts that a string ends not with a given suffix. * * @param string $suffix * @param string $string * @param string $message * * @since Method available since Release 3.4.0 */ public static function assertStringEndsNotWith($suffix, $string, $message = '') { if (!is_string($suffix)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (!is_string($string)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); } $constraint = new PHPUnit_Framework_Constraint_Not( new PHPUnit_Framework_Constraint_StringEndsWith($suffix) ); self::assertThat($string, $constraint, $message); } /** * Asserts that two XML files are equal. * * @param string $expectedFile * @param string $actualFile * @param string $message * * @since Method available since Release 3.1.0 */ public static function assertXmlFileEqualsXmlFile($expectedFile, $actualFile, $message = '') { $expected = PHPUnit_Util_XML::loadFile($expectedFile); $actual = PHPUnit_Util_XML::loadFile($actualFile); self::assertEquals($expected, $actual, $message); } /** * Asserts that two XML files are not equal. * * @param string $expectedFile * @param string $actualFile * @param string $message * * @since Method available since Release 3.1.0 */ public static function assertXmlFileNotEqualsXmlFile($expectedFile, $actualFile, $message = '') { $expected = PHPUnit_Util_XML::loadFile($expectedFile); $actual = PHPUnit_Util_XML::loadFile($actualFile); self::assertNotEquals($expected, $actual, $message); } /** * Asserts that two XML documents are equal. * * @param string $expectedFile * @param string $actualXml * @param string $message * * @since Method available since Release 3.3.0 */ public static function assertXmlStringEqualsXmlFile($expectedFile, $actualXml, $message = '') { $expected = PHPUnit_Util_XML::loadFile($expectedFile); $actual = PHPUnit_Util_XML::load($actualXml); self::assertEquals($expected, $actual, $message); } /** * Asserts that two XML documents are not equal. * * @param string $expectedFile * @param string $actualXml * @param string $message * * @since Method available since Release 3.3.0 */ public static function assertXmlStringNotEqualsXmlFile($expectedFile, $actualXml, $message = '') { $expected = PHPUnit_Util_XML::loadFile($expectedFile); $actual = PHPUnit_Util_XML::load($actualXml); self::assertNotEquals($expected, $actual, $message); } /** * Asserts that two XML documents are equal. * * @param string $expectedXml * @param string $actualXml * @param string $message * * @since Method available since Release 3.1.0 */ public static function assertXmlStringEqualsXmlString($expectedXml, $actualXml, $message = '') { $expected = PHPUnit_Util_XML::load($expectedXml); $actual = PHPUnit_Util_XML::load($actualXml); self::assertEquals($expected, $actual, $message); } /** * Asserts that two XML documents are not equal. * * @param string $expectedXml * @param string $actualXml * @param string $message * * @since Method available since Release 3.1.0 */ public static function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, $message = '') { $expected = PHPUnit_Util_XML::load($expectedXml); $actual = PHPUnit_Util_XML::load($actualXml); self::assertNotEquals($expected, $actual, $message); } /** * Asserts that a hierarchy of DOMElements matches. * * @param DOMElement $expectedElement * @param DOMElement $actualElement * @param bool $checkAttributes * @param string $message * * @since Method available since Release 3.3.0 */ public static function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, $checkAttributes = false, $message = '') { $tmp = new DOMDocument; $expectedElement = $tmp->importNode($expectedElement, true); $tmp = new DOMDocument; $actualElement = $tmp->importNode($actualElement, true); unset($tmp); self::assertEquals( $expectedElement->tagName, $actualElement->tagName, $message ); if ($checkAttributes) { self::assertEquals( $expectedElement->attributes->length, $actualElement->attributes->length, sprintf( '%s%sNumber of attributes on node "%s" does not match', $message, !empty($message) ? "\n" : '', $expectedElement->tagName ) ); for ($i = 0; $i < $expectedElement->attributes->length; $i++) { $expectedAttribute = $expectedElement->attributes->item($i); $actualAttribute = $actualElement->attributes->getNamedItem( $expectedAttribute->name ); if (!$actualAttribute) { self::fail( sprintf( '%s%sCould not find attribute "%s" on node "%s"', $message, !empty($message) ? "\n" : '', $expectedAttribute->name, $expectedElement->tagName ) ); } } } PHPUnit_Util_XML::removeCharacterDataNodes($expectedElement); PHPUnit_Util_XML::removeCharacterDataNodes($actualElement); self::assertEquals( $expectedElement->childNodes->length, $actualElement->childNodes->length, sprintf( '%s%sNumber of child nodes of "%s" differs', $message, !empty($message) ? "\n" : '', $expectedElement->tagName ) ); for ($i = 0; $i < $expectedElement->childNodes->length; $i++) { self::assertEqualXMLStructure( $expectedElement->childNodes->item($i), $actualElement->childNodes->item($i), $checkAttributes, $message ); } } /** * Evaluates a PHPUnit_Framework_Constraint matcher object. * * @param mixed $value * @param PHPUnit_Framework_Constraint $constraint * @param string $message * * @since Method available since Release 3.0.0 */ public static function assertThat($value, PHPUnit_Framework_Constraint $constraint, $message = '') { self::$count += count($constraint); $constraint->evaluate($value, $message); } /** * Asserts that a string is a valid JSON string. * * @param string $actualJson * @param string $message * * @since Method available since Release 3.7.20 */ public static function assertJson($actualJson, $message = '') { if (!is_string($actualJson)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } self::assertThat($actualJson, self::isJson(), $message); } /** * Asserts that two given JSON encoded objects or arrays are equal. * * @param string $expectedJson * @param string $actualJson * @param string $message */ public static function assertJsonStringEqualsJsonString($expectedJson, $actualJson, $message = '') { self::assertJson($expectedJson, $message); self::assertJson($actualJson, $message); $expected = json_decode($expectedJson); $actual = json_decode($actualJson); self::assertEquals($expected, $actual, $message); } /** * Asserts that two given JSON encoded objects or arrays are not equal. * * @param string $expectedJson * @param string $actualJson * @param string $message */ public static function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, $message = '') { self::assertJson($expectedJson, $message); self::assertJson($actualJson, $message); $expected = json_decode($expectedJson); $actual = json_decode($actualJson); self::assertNotEquals($expected, $actual, $message); } /** * Asserts that the generated JSON encoded object and the content of the given file are equal. * * @param string $expectedFile * @param string $actualJson * @param string $message */ public static function assertJsonStringEqualsJsonFile($expectedFile, $actualJson, $message = '') { self::assertFileExists($expectedFile, $message); $expectedJson = file_get_contents($expectedFile); self::assertJson($expectedJson, $message); self::assertJson($actualJson, $message); // call constraint $constraint = new PHPUnit_Framework_Constraint_JsonMatches( $expectedJson ); self::assertThat($actualJson, $constraint, $message); } /** * Asserts that the generated JSON encoded object and the content of the given file are not equal. * * @param string $expectedFile * @param string $actualJson * @param string $message */ public static function assertJsonStringNotEqualsJsonFile($expectedFile, $actualJson, $message = '') { self::assertFileExists($expectedFile, $message); $expectedJson = file_get_contents($expectedFile); self::assertJson($expectedJson, $message); self::assertJson($actualJson, $message); // call constraint $constraint = new PHPUnit_Framework_Constraint_JsonMatches( $expectedJson ); self::assertThat($actualJson, new PHPUnit_Framework_Constraint_Not($constraint), $message); } /** * Asserts that two JSON files are not equal. * * @param string $expectedFile * @param string $actualFile * @param string $message */ public static function assertJsonFileNotEqualsJsonFile($expectedFile, $actualFile, $message = '') { self::assertFileExists($expectedFile, $message); self::assertFileExists($actualFile, $message); $actualJson = file_get_contents($actualFile); $expectedJson = file_get_contents($expectedFile); self::assertJson($expectedJson, $message); self::assertJson($actualJson, $message); // call constraint $constraintExpected = new PHPUnit_Framework_Constraint_JsonMatches( $expectedJson ); $constraintActual = new PHPUnit_Framework_Constraint_JsonMatches($actualJson); self::assertThat($expectedJson, new PHPUnit_Framework_Constraint_Not($constraintActual), $message); self::assertThat($actualJson, new PHPUnit_Framework_Constraint_Not($constraintExpected), $message); } /** * Asserts that two JSON files are equal. * * @param string $expectedFile * @param string $actualFile * @param string $message */ public static function assertJsonFileEqualsJsonFile($expectedFile, $actualFile, $message = '') { self::assertFileExists($expectedFile, $message); self::assertFileExists($actualFile, $message); $actualJson = file_get_contents($actualFile); $expectedJson = file_get_contents($expectedFile); self::assertJson($expectedJson, $message); self::assertJson($actualJson, $message); // call constraint $constraintExpected = new PHPUnit_Framework_Constraint_JsonMatches( $expectedJson ); $constraintActual = new PHPUnit_Framework_Constraint_JsonMatches($actualJson); self::assertThat($expectedJson, $constraintActual, $message); self::assertThat($actualJson, $constraintExpected, $message); } /** * Returns a PHPUnit_Framework_Constraint_And matcher object. * * @return PHPUnit_Framework_Constraint_And * * @since Method available since Release 3.0.0 */ public static function logicalAnd() { $constraints = func_get_args(); $constraint = new PHPUnit_Framework_Constraint_And; $constraint->setConstraints($constraints); return $constraint; } /** * Returns a PHPUnit_Framework_Constraint_Or matcher object. * * @return PHPUnit_Framework_Constraint_Or * * @since Method available since Release 3.0.0 */ public static function logicalOr() { $constraints = func_get_args(); $constraint = new PHPUnit_Framework_Constraint_Or; $constraint->setConstraints($constraints); return $constraint; } /** * Returns a PHPUnit_Framework_Constraint_Not matcher object. * * @param PHPUnit_Framework_Constraint $constraint * * @return PHPUnit_Framework_Constraint_Not * * @since Method available since Release 3.0.0 */ public static function logicalNot(PHPUnit_Framework_Constraint $constraint) { return new PHPUnit_Framework_Constraint_Not($constraint); } /** * Returns a PHPUnit_Framework_Constraint_Xor matcher object. * * @return PHPUnit_Framework_Constraint_Xor * * @since Method available since Release 3.0.0 */ public static function logicalXor() { $constraints = func_get_args(); $constraint = new PHPUnit_Framework_Constraint_Xor; $constraint->setConstraints($constraints); return $constraint; } /** * Returns a PHPUnit_Framework_Constraint_IsAnything matcher object. * * @return PHPUnit_Framework_Constraint_IsAnything * * @since Method available since Release 3.0.0 */ public static function anything() { return new PHPUnit_Framework_Constraint_IsAnything; } /** * Returns a PHPUnit_Framework_Constraint_IsTrue matcher object. * * @return PHPUnit_Framework_Constraint_IsTrue * * @since Method available since Release 3.3.0 */ public static function isTrue() { return new PHPUnit_Framework_Constraint_IsTrue; } /** * Returns a PHPUnit_Framework_Constraint_Callback matcher object. * * @param callable $callback * * @return PHPUnit_Framework_Constraint_Callback */ public static function callback($callback) { return new PHPUnit_Framework_Constraint_Callback($callback); } /** * Returns a PHPUnit_Framework_Constraint_IsFalse matcher object. * * @return PHPUnit_Framework_Constraint_IsFalse * * @since Method available since Release 3.3.0 */ public static function isFalse() { return new PHPUnit_Framework_Constraint_IsFalse; } /** * Returns a PHPUnit_Framework_Constraint_IsJson matcher object. * * @return PHPUnit_Framework_Constraint_IsJson * * @since Method available since Release 3.7.20 */ public static function isJson() { return new PHPUnit_Framework_Constraint_IsJson; } /** * Returns a PHPUnit_Framework_Constraint_IsNull matcher object. * * @return PHPUnit_Framework_Constraint_IsNull * * @since Method available since Release 3.3.0 */ public static function isNull() { return new PHPUnit_Framework_Constraint_IsNull; } /** * Returns a PHPUnit_Framework_Constraint_IsFinite matcher object. * * @return PHPUnit_Framework_Constraint_IsFinite * * @since Method available since Release 5.0.0 */ public static function isFinite() { return new PHPUnit_Framework_Constraint_IsFinite; } /** * Returns a PHPUnit_Framework_Constraint_IsInfinite matcher object. * * @return PHPUnit_Framework_Constraint_IsInfinite * * @since Method available since Release 5.0.0 */ public static function isInfinite() { return new PHPUnit_Framework_Constraint_IsInfinite; } /** * Returns a PHPUnit_Framework_Constraint_IsNan matcher object. * * @return PHPUnit_Framework_Constraint_IsNan * * @since Method available since Release 5.0.0 */ public static function isNan() { return new PHPUnit_Framework_Constraint_IsNan; } /** * Returns a PHPUnit_Framework_Constraint_Attribute matcher object. * * @param PHPUnit_Framework_Constraint $constraint * @param string $attributeName * * @return PHPUnit_Framework_Constraint_Attribute * * @since Method available since Release 3.1.0 */ public static function attribute(PHPUnit_Framework_Constraint $constraint, $attributeName) { return new PHPUnit_Framework_Constraint_Attribute( $constraint, $attributeName ); } /** * Returns a PHPUnit_Framework_Constraint_TraversableContains matcher * object. * * @param mixed $value * @param bool $checkForObjectIdentity * @param bool $checkForNonObjectIdentity * * @return PHPUnit_Framework_Constraint_TraversableContains * * @since Method available since Release 3.0.0 */ public static function contains($value, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) { return new PHPUnit_Framework_Constraint_TraversableContains($value, $checkForObjectIdentity, $checkForNonObjectIdentity); } /** * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher * object. * * @param string $type * * @return PHPUnit_Framework_Constraint_TraversableContainsOnly * * @since Method available since Release 3.1.4 */ public static function containsOnly($type) { return new PHPUnit_Framework_Constraint_TraversableContainsOnly($type); } /** * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher * object. * * @param string $classname * * @return PHPUnit_Framework_Constraint_TraversableContainsOnly */ public static function containsOnlyInstancesOf($classname) { return new PHPUnit_Framework_Constraint_TraversableContainsOnly($classname, false); } /** * Returns a PHPUnit_Framework_Constraint_ArrayHasKey matcher object. * * @param mixed $key * * @return PHPUnit_Framework_Constraint_ArrayHasKey * * @since Method available since Release 3.0.0 */ public static function arrayHasKey($key) { return new PHPUnit_Framework_Constraint_ArrayHasKey($key); } /** * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object. * * @param mixed $value * @param float $delta * @param int $maxDepth * @param bool $canonicalize * @param bool $ignoreCase * * @return PHPUnit_Framework_Constraint_IsEqual * * @since Method available since Release 3.0.0 */ public static function equalTo($value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) { return new PHPUnit_Framework_Constraint_IsEqual( $value, $delta, $maxDepth, $canonicalize, $ignoreCase ); } /** * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object * that is wrapped in a PHPUnit_Framework_Constraint_Attribute matcher * object. * * @param string $attributeName * @param mixed $value * @param float $delta * @param int $maxDepth * @param bool $canonicalize * @param bool $ignoreCase * * @return PHPUnit_Framework_Constraint_Attribute * * @since Method available since Release 3.1.0 */ public static function attributeEqualTo($attributeName, $value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) { return self::attribute( self::equalTo( $value, $delta, $maxDepth, $canonicalize, $ignoreCase ), $attributeName ); } /** * Returns a PHPUnit_Framework_Constraint_IsEmpty matcher object. * * @return PHPUnit_Framework_Constraint_IsEmpty * * @since Method available since Release 3.5.0 */ public static function isEmpty() { return new PHPUnit_Framework_Constraint_IsEmpty; } /** * Returns a PHPUnit_Framework_Constraint_FileExists matcher object. * * @return PHPUnit_Framework_Constraint_FileExists * * @since Method available since Release 3.0.0 */ public static function fileExists() { return new PHPUnit_Framework_Constraint_FileExists; } /** * Returns a PHPUnit_Framework_Constraint_GreaterThan matcher object. * * @param mixed $value * * @return PHPUnit_Framework_Constraint_GreaterThan * * @since Method available since Release 3.0.0 */ public static function greaterThan($value) { return new PHPUnit_Framework_Constraint_GreaterThan($value); } /** * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps * a PHPUnit_Framework_Constraint_IsEqual and a * PHPUnit_Framework_Constraint_GreaterThan matcher object. * * @param mixed $value * * @return PHPUnit_Framework_Constraint_Or * * @since Method available since Release 3.1.0 */ public static function greaterThanOrEqual($value) { return self::logicalOr( new PHPUnit_Framework_Constraint_IsEqual($value), new PHPUnit_Framework_Constraint_GreaterThan($value) ); } /** * Returns a PHPUnit_Framework_Constraint_ClassHasAttribute matcher object. * * @param string $attributeName * * @return PHPUnit_Framework_Constraint_ClassHasAttribute * * @since Method available since Release 3.1.0 */ public static function classHasAttribute($attributeName) { return new PHPUnit_Framework_Constraint_ClassHasAttribute( $attributeName ); } /** * Returns a PHPUnit_Framework_Constraint_ClassHasStaticAttribute matcher * object. * * @param string $attributeName * * @return PHPUnit_Framework_Constraint_ClassHasStaticAttribute * * @since Method available since Release 3.1.0 */ public static function classHasStaticAttribute($attributeName) { return new PHPUnit_Framework_Constraint_ClassHasStaticAttribute( $attributeName ); } /** * Returns a PHPUnit_Framework_Constraint_ObjectHasAttribute matcher object. * * @param string $attributeName * * @return PHPUnit_Framework_Constraint_ObjectHasAttribute * * @since Method available since Release 3.0.0 */ public static function objectHasAttribute($attributeName) { return new PHPUnit_Framework_Constraint_ObjectHasAttribute( $attributeName ); } /** * Returns a PHPUnit_Framework_Constraint_IsIdentical matcher object. * * @param mixed $value * * @return PHPUnit_Framework_Constraint_IsIdentical * * @since Method available since Release 3.0.0 */ public static function identicalTo($value) { return new PHPUnit_Framework_Constraint_IsIdentical($value); } /** * Returns a PHPUnit_Framework_Constraint_IsInstanceOf matcher object. * * @param string $className * * @return PHPUnit_Framework_Constraint_IsInstanceOf * * @since Method available since Release 3.0.0 */ public static function isInstanceOf($className) { return new PHPUnit_Framework_Constraint_IsInstanceOf($className); } /** * Returns a PHPUnit_Framework_Constraint_IsType matcher object. * * @param string $type * * @return PHPUnit_Framework_Constraint_IsType * * @since Method available since Release 3.0.0 */ public static function isType($type) { return new PHPUnit_Framework_Constraint_IsType($type); } /** * Returns a PHPUnit_Framework_Constraint_LessThan matcher object. * * @param mixed $value * * @return PHPUnit_Framework_Constraint_LessThan * * @since Method available since Release 3.0.0 */ public static function lessThan($value) { return new PHPUnit_Framework_Constraint_LessThan($value); } /** * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps * a PHPUnit_Framework_Constraint_IsEqual and a * PHPUnit_Framework_Constraint_LessThan matcher object. * * @param mixed $value * * @return PHPUnit_Framework_Constraint_Or * * @since Method available since Release 3.1.0 */ public static function lessThanOrEqual($value) { return self::logicalOr( new PHPUnit_Framework_Constraint_IsEqual($value), new PHPUnit_Framework_Constraint_LessThan($value) ); } /** * Returns a PHPUnit_Framework_Constraint_PCREMatch matcher object. * * @param string $pattern * * @return PHPUnit_Framework_Constraint_PCREMatch * * @since Method available since Release 3.0.0 */ public static function matchesRegularExpression($pattern) { return new PHPUnit_Framework_Constraint_PCREMatch($pattern); } /** * Returns a PHPUnit_Framework_Constraint_StringMatches matcher object. * * @param string $string * * @return PHPUnit_Framework_Constraint_StringMatches * * @since Method available since Release 3.5.0 */ public static function matches($string) { return new PHPUnit_Framework_Constraint_StringMatches($string); } /** * Returns a PHPUnit_Framework_Constraint_StringStartsWith matcher object. * * @param mixed $prefix * * @return PHPUnit_Framework_Constraint_StringStartsWith * * @since Method available since Release 3.4.0 */ public static function stringStartsWith($prefix) { return new PHPUnit_Framework_Constraint_StringStartsWith($prefix); } /** * Returns a PHPUnit_Framework_Constraint_StringContains matcher object. * * @param string $string * @param bool $case * * @return PHPUnit_Framework_Constraint_StringContains * * @since Method available since Release 3.0.0 */ public static function stringContains($string, $case = true) { return new PHPUnit_Framework_Constraint_StringContains($string, $case); } /** * Returns a PHPUnit_Framework_Constraint_StringEndsWith matcher object. * * @param mixed $suffix * * @return PHPUnit_Framework_Constraint_StringEndsWith * * @since Method available since Release 3.4.0 */ public static function stringEndsWith($suffix) { return new PHPUnit_Framework_Constraint_StringEndsWith($suffix); } /** * Returns a PHPUnit_Framework_Constraint_Count matcher object. * * @param int $count * * @return PHPUnit_Framework_Constraint_Count */ public static function countOf($count) { return new PHPUnit_Framework_Constraint_Count($count); } /** * Fails a test with the given message. * * @param string $message * * @throws PHPUnit_Framework_AssertionFailedError */ public static function fail($message = '') { throw new PHPUnit_Framework_AssertionFailedError($message); } /** * Returns the value of an attribute of a class or an object. * This also works for attributes that are declared protected or private. * * @param mixed $classOrObject * @param string $attributeName * * @return mixed * * @throws PHPUnit_Framework_Exception */ public static function readAttribute($classOrObject, $attributeName) { if (!is_string($attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); } if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'valid attribute name'); } if (is_string($classOrObject)) { if (!class_exists($classOrObject)) { throw PHPUnit_Util_InvalidArgumentHelper::factory( 1, 'class name' ); } return self::getStaticAttribute( $classOrObject, $attributeName ); } elseif (is_object($classOrObject)) { return self::getObjectAttribute( $classOrObject, $attributeName ); } else { throw PHPUnit_Util_InvalidArgumentHelper::factory( 1, 'class name or object' ); } } /** * Returns the value of a static attribute. * This also works for attributes that are declared protected or private. * * @param string $className * @param string $attributeName * * @return mixed * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 4.0.0 */ public static function getStaticAttribute($className, $attributeName) { if (!is_string($className)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (!class_exists($className)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'class name'); } if (!is_string($attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); } if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'valid attribute name'); } $class = new ReflectionClass($className); while ($class) { $attributes = $class->getStaticProperties(); if (array_key_exists($attributeName, $attributes)) { return $attributes[$attributeName]; } $class = $class->getParentClass(); } throw new PHPUnit_Framework_Exception( sprintf( 'Attribute "%s" not found in class.', $attributeName ) ); } /** * Returns the value of an object's attribute. * This also works for attributes that are declared protected or private. * * @param object $object * @param string $attributeName * * @return mixed * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 4.0.0 */ public static function getObjectAttribute($object, $attributeName) { if (!is_object($object)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'object'); } if (!is_string($attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); } if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'valid attribute name'); } try { $attribute = new ReflectionProperty($object, $attributeName); } catch (ReflectionException $e) { $reflector = new ReflectionObject($object); while ($reflector = $reflector->getParentClass()) { try { $attribute = $reflector->getProperty($attributeName); break; } catch (ReflectionException $e) { } } } if (isset($attribute)) { if (!$attribute || $attribute->isPublic()) { return $object->$attributeName; } $attribute->setAccessible(true); $value = $attribute->getValue($object); $attribute->setAccessible(false); return $value; } throw new PHPUnit_Framework_Exception( sprintf( 'Attribute "%s" not found in object.', $attributeName ) ); } /** * Mark the test as incomplete. * * @param string $message * * @throws PHPUnit_Framework_IncompleteTestError * * @since Method available since Release 3.0.0 */ public static function markTestIncomplete($message = '') { throw new PHPUnit_Framework_IncompleteTestError($message); } /** * Mark the test as skipped. * * @param string $message * * @throws PHPUnit_Framework_SkippedTestError * * @since Method available since Release 3.0.0 */ public static function markTestSkipped($message = '') { throw new PHPUnit_Framework_SkippedTestError($message); } /** * Return the current assertion count. * * @return int * * @since Method available since Release 3.3.3 */ public static function getCount() { return self::$count; } /** * Reset the assertion counter. * * @since Method available since Release 3.3.3 */ public static function resetCount() { self::$count = 0; } } phpunit-5.1.3/src/Framework/Assert/000077500000000000000000000000001263222771600172045ustar00rootroot00000000000000phpunit-5.1.3/src/Framework/Assert/Functions.php000066400000000000000000001573701263222771600217020ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Returns a matcher that matches when the method is executed * zero or more times. * * @return PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount * * @since Method available since Release 3.0.0 */ function any() { return call_user_func_array( 'PHPUnit_Framework_TestCase::any', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_IsAnything matcher object. * * @return PHPUnit_Framework_Constraint_IsAnything * * @since Method available since Release 3.0.0 */ function anything() { return call_user_func_array( 'PHPUnit_Framework_Assert::anything', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_ArrayHasKey matcher object. * * @param mixed $key * * @return PHPUnit_Framework_Constraint_ArrayHasKey * * @since Method available since Release 3.0.0 */ function arrayHasKey($key) { return call_user_func_array( 'PHPUnit_Framework_Assert::arrayHasKey', func_get_args() ); } /** * Asserts that an array has a specified key. * * @param mixed $key * @param array|ArrayAccess $array * @param string $message * * @since Method available since Release 3.0.0 */ function assertArrayHasKey($key, $array, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertArrayHasKey', func_get_args() ); } /** * Asserts that an array has a specified subset. * * @param array|ArrayAccess $subset * @param array|ArrayAccess $array * @param bool $strict Check for object identity * @param string $message * * @since Method available since Release 4.4.0 */ function assertArraySubset($subset, $array, $strict = false, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertArraySubset', func_get_args() ); } /** * Asserts that an array does not have a specified key. * * @param mixed $key * @param array|ArrayAccess $array * @param string $message * * @since Method available since Release 3.0.0 */ function assertArrayNotHasKey($key, $array, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertArrayNotHasKey', func_get_args() ); } /** * Asserts that a haystack that is stored in a static attribute of a class * or an attribute of an object contains a needle. * * @param mixed $needle * @param string $haystackAttributeName * @param mixed $haystackClassOrObject * @param string $message * @param bool $ignoreCase * @param bool $checkForObjectIdentity * @param bool $checkForNonObjectIdentity * * @since Method available since Release 3.0.0 */ function assertAttributeContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeContains', func_get_args() ); } /** * Asserts that a haystack that is stored in a static attribute of a class * or an attribute of an object contains only values of a given type. * * @param string $type * @param string $haystackAttributeName * @param mixed $haystackClassOrObject * @param bool $isNativeType * @param string $message * * @since Method available since Release 3.1.4 */ function assertAttributeContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeContainsOnly', func_get_args() ); } /** * Asserts the number of elements of an array, Countable or Traversable * that is stored in an attribute. * * @param int $expectedCount * @param string $haystackAttributeName * @param mixed $haystackClassOrObject * @param string $message * * @since Method available since Release 3.6.0 */ function assertAttributeCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeCount', func_get_args() ); } /** * Asserts that a static attribute of a class or an attribute of an object * is empty. * * @param string $haystackAttributeName * @param mixed $haystackClassOrObject * @param string $message * * @since Method available since Release 3.5.0 */ function assertAttributeEmpty($haystackAttributeName, $haystackClassOrObject, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeEmpty', func_get_args() ); } /** * Asserts that a variable is equal to an attribute of an object. * * @param mixed $expected * @param string $actualAttributeName * @param string $actualClassOrObject * @param string $message * @param float $delta * @param int $maxDepth * @param bool $canonicalize * @param bool $ignoreCase */ function assertAttributeEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeEquals', func_get_args() ); } /** * Asserts that an attribute is greater than another value. * * @param mixed $expected * @param string $actualAttributeName * @param string $actualClassOrObject * @param string $message * * @since Method available since Release 3.1.0 */ function assertAttributeGreaterThan($expected, $actualAttributeName, $actualClassOrObject, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeGreaterThan', func_get_args() ); } /** * Asserts that an attribute is greater than or equal to another value. * * @param mixed $expected * @param string $actualAttributeName * @param string $actualClassOrObject * @param string $message * * @since Method available since Release 3.1.0 */ function assertAttributeGreaterThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeGreaterThanOrEqual', func_get_args() ); } /** * Asserts that an attribute is of a given type. * * @param string $expected * @param string $attributeName * @param mixed $classOrObject * @param string $message * * @since Method available since Release 3.5.0 */ function assertAttributeInstanceOf($expected, $attributeName, $classOrObject, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeInstanceOf', func_get_args() ); } /** * Asserts that an attribute is of a given type. * * @param string $expected * @param string $attributeName * @param mixed $classOrObject * @param string $message * * @since Method available since Release 3.5.0 */ function assertAttributeInternalType($expected, $attributeName, $classOrObject, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeInternalType', func_get_args() ); } /** * Asserts that an attribute is smaller than another value. * * @param mixed $expected * @param string $actualAttributeName * @param string $actualClassOrObject * @param string $message * * @since Method available since Release 3.1.0 */ function assertAttributeLessThan($expected, $actualAttributeName, $actualClassOrObject, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeLessThan', func_get_args() ); } /** * Asserts that an attribute is smaller than or equal to another value. * * @param mixed $expected * @param string $actualAttributeName * @param string $actualClassOrObject * @param string $message * * @since Method available since Release 3.1.0 */ function assertAttributeLessThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeLessThanOrEqual', func_get_args() ); } /** * Asserts that a haystack that is stored in a static attribute of a class * or an attribute of an object does not contain a needle. * * @param mixed $needle * @param string $haystackAttributeName * @param mixed $haystackClassOrObject * @param string $message * @param bool $ignoreCase * @param bool $checkForObjectIdentity * @param bool $checkForNonObjectIdentity * * @since Method available since Release 3.0.0 */ function assertAttributeNotContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeNotContains', func_get_args() ); } /** * Asserts that a haystack that is stored in a static attribute of a class * or an attribute of an object does not contain only values of a given * type. * * @param string $type * @param string $haystackAttributeName * @param mixed $haystackClassOrObject * @param bool $isNativeType * @param string $message * * @since Method available since Release 3.1.4 */ function assertAttributeNotContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeNotContainsOnly', func_get_args() ); } /** * Asserts the number of elements of an array, Countable or Traversable * that is stored in an attribute. * * @param int $expectedCount * @param string $haystackAttributeName * @param mixed $haystackClassOrObject * @param string $message * * @since Method available since Release 3.6.0 */ function assertAttributeNotCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeNotCount', func_get_args() ); } /** * Asserts that a static attribute of a class or an attribute of an object * is not empty. * * @param string $haystackAttributeName * @param mixed $haystackClassOrObject * @param string $message * * @since Method available since Release 3.5.0 */ function assertAttributeNotEmpty($haystackAttributeName, $haystackClassOrObject, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeNotEmpty', func_get_args() ); } /** * Asserts that a variable is not equal to an attribute of an object. * * @param mixed $expected * @param string $actualAttributeName * @param string $actualClassOrObject * @param string $message * @param float $delta * @param int $maxDepth * @param bool $canonicalize * @param bool $ignoreCase */ function assertAttributeNotEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeNotEquals', func_get_args() ); } /** * Asserts that an attribute is of a given type. * * @param string $expected * @param string $attributeName * @param mixed $classOrObject * @param string $message * * @since Method available since Release 3.5.0 */ function assertAttributeNotInstanceOf($expected, $attributeName, $classOrObject, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeNotInstanceOf', func_get_args() ); } /** * Asserts that an attribute is of a given type. * * @param string $expected * @param string $attributeName * @param mixed $classOrObject * @param string $message * * @since Method available since Release 3.5.0 */ function assertAttributeNotInternalType($expected, $attributeName, $classOrObject, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeNotInternalType', func_get_args() ); } /** * Asserts that a variable and an attribute of an object do not have the * same type and value. * * @param mixed $expected * @param string $actualAttributeName * @param object $actualClassOrObject * @param string $message */ function assertAttributeNotSame($expected, $actualAttributeName, $actualClassOrObject, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeNotSame', func_get_args() ); } /** * Asserts that a variable and an attribute of an object have the same type * and value. * * @param mixed $expected * @param string $actualAttributeName * @param object $actualClassOrObject * @param string $message */ function assertAttributeSame($expected, $actualAttributeName, $actualClassOrObject, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertAttributeSame', func_get_args() ); } /** * Asserts that a class has a specified attribute. * * @param string $attributeName * @param string $className * @param string $message * * @since Method available since Release 3.1.0 */ function assertClassHasAttribute($attributeName, $className, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertClassHasAttribute', func_get_args() ); } /** * Asserts that a class has a specified static attribute. * * @param string $attributeName * @param string $className * @param string $message * * @since Method available since Release 3.1.0 */ function assertClassHasStaticAttribute($attributeName, $className, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertClassHasStaticAttribute', func_get_args() ); } /** * Asserts that a class does not have a specified attribute. * * @param string $attributeName * @param string $className * @param string $message * * @since Method available since Release 3.1.0 */ function assertClassNotHasAttribute($attributeName, $className, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertClassNotHasAttribute', func_get_args() ); } /** * Asserts that a class does not have a specified static attribute. * * @param string $attributeName * @param string $className * @param string $message * * @since Method available since Release 3.1.0 */ function assertClassNotHasStaticAttribute($attributeName, $className, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertClassNotHasStaticAttribute', func_get_args() ); } /** * Asserts that a haystack contains a needle. * * @param mixed $needle * @param mixed $haystack * @param string $message * @param bool $ignoreCase * @param bool $checkForObjectIdentity * @param bool $checkForNonObjectIdentity * * @since Method available since Release 2.1.0 */ function assertContains($needle, $haystack, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) { return call_user_func_array( 'PHPUnit_Framework_Assert::assertContains', func_get_args() ); } /** * Asserts that a haystack contains only values of a given type. * * @param string $type * @param mixed $haystack * @param bool $isNativeType * @param string $message * * @since Method available since Release 3.1.4 */ function assertContainsOnly($type, $haystack, $isNativeType = null, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertContainsOnly', func_get_args() ); } /** * Asserts that a haystack contains only instances of a given classname * * @param string $classname * @param array|Traversable $haystack * @param string $message */ function assertContainsOnlyInstancesOf($classname, $haystack, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertContainsOnlyInstancesOf', func_get_args() ); } /** * Asserts the number of elements of an array, Countable or Traversable. * * @param int $expectedCount * @param mixed $haystack * @param string $message */ function assertCount($expectedCount, $haystack, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertCount', func_get_args() ); } /** * Asserts that a variable is empty. * * @param mixed $actual * @param string $message * * @throws PHPUnit_Framework_AssertionFailedError */ function assertEmpty($actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertEmpty', func_get_args() ); } /** * Asserts that a hierarchy of DOMElements matches. * * @param DOMElement $expectedElement * @param DOMElement $actualElement * @param bool $checkAttributes * @param string $message * * @since Method available since Release 3.3.0 */ function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, $checkAttributes = false, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertEqualXMLStructure', func_get_args() ); } /** * Asserts that two variables are equal. * * @param mixed $expected * @param mixed $actual * @param string $message * @param float $delta * @param int $maxDepth * @param bool $canonicalize * @param bool $ignoreCase */ function assertEquals($expected, $actual, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) { return call_user_func_array( 'PHPUnit_Framework_Assert::assertEquals', func_get_args() ); } /** * Asserts that a condition is not true. * * @param bool $condition * @param string $message * * @throws PHPUnit_Framework_AssertionFailedError */ function assertNotTrue($condition, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertNotTrue', func_get_args() ); } /** * Asserts that a condition is false. * * @param bool $condition * @param string $message * * @throws PHPUnit_Framework_AssertionFailedError */ function assertFalse($condition, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertFalse', func_get_args() ); } /** * Asserts that the contents of one file is equal to the contents of another * file. * * @param string $expected * @param string $actual * @param string $message * @param bool $canonicalize * @param bool $ignoreCase * * @since Method available since Release 3.2.14 */ function assertFileEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false) { return call_user_func_array( 'PHPUnit_Framework_Assert::assertFileEquals', func_get_args() ); } /** * Asserts that a file exists. * * @param string $filename * @param string $message * * @since Method available since Release 3.0.0 */ function assertFileExists($filename, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertFileExists', func_get_args() ); } /** * Asserts that the contents of one file is not equal to the contents of * another file. * * @param string $expected * @param string $actual * @param string $message * @param bool $canonicalize * @param bool $ignoreCase * * @since Method available since Release 3.2.14 */ function assertFileNotEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false) { return call_user_func_array( 'PHPUnit_Framework_Assert::assertFileNotEquals', func_get_args() ); } /** * Asserts that a file does not exist. * * @param string $filename * @param string $message * * @since Method available since Release 3.0.0 */ function assertFileNotExists($filename, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertFileNotExists', func_get_args() ); } /** * Asserts that a value is greater than another value. * * @param mixed $expected * @param mixed $actual * @param string $message * * @since Method available since Release 3.1.0 */ function assertGreaterThan($expected, $actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertGreaterThan', func_get_args() ); } /** * Asserts that a value is greater than or equal to another value. * * @param mixed $expected * @param mixed $actual * @param string $message * * @since Method available since Release 3.1.0 */ function assertGreaterThanOrEqual($expected, $actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertGreaterThanOrEqual', func_get_args() ); } /** * Asserts that a variable is of a given type. * * @param string $expected * @param mixed $actual * @param string $message * * @since Method available since Release 3.5.0 */ function assertInstanceOf($expected, $actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertInstanceOf', func_get_args() ); } /** * Asserts that a variable is of a given type. * * @param string $expected * @param mixed $actual * @param string $message * * @since Method available since Release 3.5.0 */ function assertInternalType($expected, $actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertInternalType', func_get_args() ); } /** * Asserts that a string is a valid JSON string. * * @param string $actualJson * @param string $message * * @since Method available since Release 3.7.20 */ function assertJson($actualJson, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertJson', func_get_args() ); } /** * Asserts that two JSON files are equal. * * @param string $expectedFile * @param string $actualFile * @param string $message */ function assertJsonFileEqualsJsonFile($expectedFile, $actualFile, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertJsonFileEqualsJsonFile', func_get_args() ); } /** * Asserts that two JSON files are not equal. * * @param string $expectedFile * @param string $actualFile * @param string $message */ function assertJsonFileNotEqualsJsonFile($expectedFile, $actualFile, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertJsonFileNotEqualsJsonFile', func_get_args() ); } /** * Asserts that the generated JSON encoded object and the content of the given file are equal. * * @param string $expectedFile * @param string $actualJson * @param string $message */ function assertJsonStringEqualsJsonFile($expectedFile, $actualJson, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertJsonStringEqualsJsonFile', func_get_args() ); } /** * Asserts that two given JSON encoded objects or arrays are equal. * * @param string $expectedJson * @param string $actualJson * @param string $message */ function assertJsonStringEqualsJsonString($expectedJson, $actualJson, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertJsonStringEqualsJsonString', func_get_args() ); } /** * Asserts that the generated JSON encoded object and the content of the given file are not equal. * * @param string $expectedFile * @param string $actualJson * @param string $message */ function assertJsonStringNotEqualsJsonFile($expectedFile, $actualJson, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonFile', func_get_args() ); } /** * Asserts that two given JSON encoded objects or arrays are not equal. * * @param string $expectedJson * @param string $actualJson * @param string $message */ function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonString', func_get_args() ); } /** * Asserts that a value is smaller than another value. * * @param mixed $expected * @param mixed $actual * @param string $message * * @since Method available since Release 3.1.0 */ function assertLessThan($expected, $actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertLessThan', func_get_args() ); } /** * Asserts that a value is smaller than or equal to another value. * * @param mixed $expected * @param mixed $actual * @param string $message * * @since Method available since Release 3.1.0 */ function assertLessThanOrEqual($expected, $actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertLessThanOrEqual', func_get_args() ); } /** * Asserts that a variable is finite. * * @param mixed $actual * @param string $message */ function assertFinite($actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertFinite', func_get_args() ); } /** * Asserts that a variable is infinite. * * @param mixed $actual * @param string $message */ function assertInfinite($actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertInfinite', func_get_args() ); } /** * Asserts that a variable is nan. * * @param mixed $actual * @param string $message */ function assertNan($actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertNan', func_get_args() ); } /** * Asserts that a haystack does not contain a needle. * * @param mixed $needle * @param mixed $haystack * @param string $message * @param bool $ignoreCase * @param bool $checkForObjectIdentity * @param bool $checkForNonObjectIdentity * * @since Method available since Release 2.1.0 */ function assertNotContains($needle, $haystack, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) { return call_user_func_array( 'PHPUnit_Framework_Assert::assertNotContains', func_get_args() ); } /** * Asserts that a haystack does not contain only values of a given type. * * @param string $type * @param mixed $haystack * @param bool $isNativeType * @param string $message * * @since Method available since Release 3.1.4 */ function assertNotContainsOnly($type, $haystack, $isNativeType = null, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertNotContainsOnly', func_get_args() ); } /** * Asserts the number of elements of an array, Countable or Traversable. * * @param int $expectedCount * @param mixed $haystack * @param string $message */ function assertNotCount($expectedCount, $haystack, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertNotCount', func_get_args() ); } /** * Asserts that a variable is not empty. * * @param mixed $actual * @param string $message * * @throws PHPUnit_Framework_AssertionFailedError */ function assertNotEmpty($actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertNotEmpty', func_get_args() ); } /** * Asserts that two variables are not equal. * * @param mixed $expected * @param mixed $actual * @param string $message * @param float $delta * @param int $maxDepth * @param bool $canonicalize * @param bool $ignoreCase * * @since Method available since Release 2.3.0 */ function assertNotEquals($expected, $actual, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) { return call_user_func_array( 'PHPUnit_Framework_Assert::assertNotEquals', func_get_args() ); } /** * Asserts that a variable is not of a given type. * * @param string $expected * @param mixed $actual * @param string $message * * @since Method available since Release 3.5.0 */ function assertNotInstanceOf($expected, $actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertNotInstanceOf', func_get_args() ); } /** * Asserts that a variable is not of a given type. * * @param string $expected * @param mixed $actual * @param string $message * * @since Method available since Release 3.5.0 */ function assertNotInternalType($expected, $actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertNotInternalType', func_get_args() ); } /** * Asserts that a condition is not false. * * @param bool $condition * @param string $message * * @throws PHPUnit_Framework_AssertionFailedError */ function assertNotFalse($condition, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertNotFalse', func_get_args() ); } /** * Asserts that a variable is not null. * * @param mixed $actual * @param string $message */ function assertNotNull($actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertNotNull', func_get_args() ); } /** * Asserts that a string does not match a given regular expression. * * @param string $pattern * @param string $string * @param string $message * * @since Method available since Release 2.1.0 */ function assertNotRegExp($pattern, $string, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertNotRegExp', func_get_args() ); } /** * Asserts that two variables do not have the same type and value. * Used on objects, it asserts that two variables do not reference * the same object. * * @param mixed $expected * @param mixed $actual * @param string $message */ function assertNotSame($expected, $actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertNotSame', func_get_args() ); } /** * Assert that the size of two arrays (or `Countable` or `Traversable` objects) * is not the same. * * @param array|Countable|Traversable $expected * @param array|Countable|Traversable $actual * @param string $message */ function assertNotSameSize($expected, $actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertNotSameSize', func_get_args() ); } /** * Asserts that a variable is null. * * @param mixed $actual * @param string $message */ function assertNull($actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertNull', func_get_args() ); } /** * Asserts that an object has a specified attribute. * * @param string $attributeName * @param object $object * @param string $message * * @since Method available since Release 3.0.0 */ function assertObjectHasAttribute($attributeName, $object, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertObjectHasAttribute', func_get_args() ); } /** * Asserts that an object does not have a specified attribute. * * @param string $attributeName * @param object $object * @param string $message * * @since Method available since Release 3.0.0 */ function assertObjectNotHasAttribute($attributeName, $object, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertObjectNotHasAttribute', func_get_args() ); } /** * Asserts that a string matches a given regular expression. * * @param string $pattern * @param string $string * @param string $message */ function assertRegExp($pattern, $string, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertRegExp', func_get_args() ); } /** * Asserts that two variables have the same type and value. * Used on objects, it asserts that two variables reference * the same object. * * @param mixed $expected * @param mixed $actual * @param string $message */ function assertSame($expected, $actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertSame', func_get_args() ); } /** * Assert that the size of two arrays (or `Countable` or `Traversable` objects) * is the same. * * @param array|Countable|Traversable $expected * @param array|Countable|Traversable $actual * @param string $message */ function assertSameSize($expected, $actual, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertSameSize', func_get_args() ); } /** * Asserts that a string ends not with a given prefix. * * @param string $suffix * @param string $string * @param string $message * * @since Method available since Release 3.4.0 */ function assertStringEndsNotWith($suffix, $string, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertStringEndsNotWith', func_get_args() ); } /** * Asserts that a string ends with a given prefix. * * @param string $suffix * @param string $string * @param string $message * * @since Method available since Release 3.4.0 */ function assertStringEndsWith($suffix, $string, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertStringEndsWith', func_get_args() ); } /** * Asserts that the contents of a string is equal * to the contents of a file. * * @param string $expectedFile * @param string $actualString * @param string $message * @param bool $canonicalize * @param bool $ignoreCase * * @since Method available since Release 3.3.0 */ function assertStringEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false) { return call_user_func_array( 'PHPUnit_Framework_Assert::assertStringEqualsFile', func_get_args() ); } /** * Asserts that a string matches a given format string. * * @param string $format * @param string $string * @param string $message * * @since Method available since Release 3.5.0 */ function assertStringMatchesFormat($format, $string, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertStringMatchesFormat', func_get_args() ); } /** * Asserts that a string matches a given format file. * * @param string $formatFile * @param string $string * @param string $message * * @since Method available since Release 3.5.0 */ function assertStringMatchesFormatFile($formatFile, $string, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertStringMatchesFormatFile', func_get_args() ); } /** * Asserts that the contents of a string is not equal * to the contents of a file. * * @param string $expectedFile * @param string $actualString * @param string $message * @param bool $canonicalize * @param bool $ignoreCase * * @since Method available since Release 3.3.0 */ function assertStringNotEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false) { return call_user_func_array( 'PHPUnit_Framework_Assert::assertStringNotEqualsFile', func_get_args() ); } /** * Asserts that a string does not match a given format string. * * @param string $format * @param string $string * @param string $message * * @since Method available since Release 3.5.0 */ function assertStringNotMatchesFormat($format, $string, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertStringNotMatchesFormat', func_get_args() ); } /** * Asserts that a string does not match a given format string. * * @param string $formatFile * @param string $string * @param string $message * * @since Method available since Release 3.5.0 */ function assertStringNotMatchesFormatFile($formatFile, $string, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertStringNotMatchesFormatFile', func_get_args() ); } /** * Asserts that a string starts not with a given prefix. * * @param string $prefix * @param string $string * @param string $message * * @since Method available since Release 3.4.0 */ function assertStringStartsNotWith($prefix, $string, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertStringStartsNotWith', func_get_args() ); } /** * Asserts that a string starts with a given prefix. * * @param string $prefix * @param string $string * @param string $message * * @since Method available since Release 3.4.0 */ function assertStringStartsWith($prefix, $string, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertStringStartsWith', func_get_args() ); } /** * Evaluates a PHPUnit_Framework_Constraint matcher object. * * @param mixed$value * @param PHPUnit_Framework_Constraint $constraint * @param string $message * * @since Method available since Release 3.0.0 */ function assertThat($value, PHPUnit_Framework_Constraint $constraint, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertThat', func_get_args() ); } /** * Asserts that a condition is true. * * @param bool $condition * @param string $message * * @throws PHPUnit_Framework_AssertionFailedError */ function assertTrue($condition, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertTrue', func_get_args() ); } /** * Asserts that two XML files are equal. * * @param string $expectedFile * @param string $actualFile * @param string $message * * @since Method available since Release 3.1.0 */ function assertXmlFileEqualsXmlFile($expectedFile, $actualFile, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertXmlFileEqualsXmlFile', func_get_args() ); } /** * Asserts that two XML files are not equal. * * @param string $expectedFile * @param string $actualFile * @param string $message * * @since Method available since Release 3.1.0 */ function assertXmlFileNotEqualsXmlFile($expectedFile, $actualFile, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertXmlFileNotEqualsXmlFile', func_get_args() ); } /** * Asserts that two XML documents are equal. * * @param string $expectedFile * @param string $actualXml * @param string $message * * @since Method available since Release 3.3.0 */ function assertXmlStringEqualsXmlFile($expectedFile, $actualXml, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertXmlStringEqualsXmlFile', func_get_args() ); } /** * Asserts that two XML documents are equal. * * @param string $expectedXml * @param string $actualXml * @param string $message * * @since Method available since Release 3.1.0 */ function assertXmlStringEqualsXmlString($expectedXml, $actualXml, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertXmlStringEqualsXmlString', func_get_args() ); } /** * Asserts that two XML documents are not equal. * * @param string $expectedFile * @param string $actualXml * @param string $message * * @since Method available since Release 3.3.0 */ function assertXmlStringNotEqualsXmlFile($expectedFile, $actualXml, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertXmlStringNotEqualsXmlFile', func_get_args() ); } /** * Asserts that two XML documents are not equal. * * @param string $expectedXml * @param string $actualXml * @param string $message * * @since Method available since Release 3.1.0 */ function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, $message = '') { return call_user_func_array( 'PHPUnit_Framework_Assert::assertXmlStringNotEqualsXmlString', func_get_args() ); } /** * Returns a matcher that matches when the method is executed * at the given $index. * * @param int $index * * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex * * @since Method available since Release 3.0.0 */ function at($index) { return call_user_func_array( 'PHPUnit_Framework_TestCase::at', func_get_args() ); } /** * Returns a matcher that matches when the method is executed at least once. * * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce * * @since Method available since Release 3.0.0 */ function atLeastOnce() { return call_user_func_array( 'PHPUnit_Framework_TestCase::atLeastOnce', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_Attribute matcher object. * * @param PHPUnit_Framework_Constraint $constraint * @param string $attributeName * * @return PHPUnit_Framework_Constraint_Attribute * * @since Method available since Release 3.1.0 */ function attribute(PHPUnit_Framework_Constraint $constraint, $attributeName) { return call_user_func_array( 'PHPUnit_Framework_Assert::attribute', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object * that is wrapped in a PHPUnit_Framework_Constraint_Attribute matcher * object. * * @param string $attributeName * @param mixed $value * @param float $delta * @param int $maxDepth * @param bool $canonicalize * @param bool $ignoreCase * * @return PHPUnit_Framework_Constraint_Attribute * * @since Method available since Release 3.1.0 */ function attributeEqualTo($attributeName, $value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) { return call_user_func_array( 'PHPUnit_Framework_Assert::attributeEqualTo', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_Callback matcher object. * * @param callable $callback * * @return PHPUnit_Framework_Constraint_Callback */ function callback($callback) { return call_user_func_array( 'PHPUnit_Framework_Assert::callback', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_ClassHasAttribute matcher object. * * @param string $attributeName * * @return PHPUnit_Framework_Constraint_ClassHasAttribute * * @since Method available since Release 3.1.0 */ function classHasAttribute($attributeName) { return call_user_func_array( 'PHPUnit_Framework_Assert::classHasAttribute', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_ClassHasStaticAttribute matcher * object. * * @param string $attributeName * * @return PHPUnit_Framework_Constraint_ClassHasStaticAttribute * * @since Method available since Release 3.1.0 */ function classHasStaticAttribute($attributeName) { return call_user_func_array( 'PHPUnit_Framework_Assert::classHasStaticAttribute', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_TraversableContains matcher * object. * * @param mixed $value * @param bool $checkForObjectIdentity * @param bool $checkForNonObjectIdentity * * @return PHPUnit_Framework_Constraint_TraversableContains * * @since Method available since Release 3.0.0 */ function contains($value, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) { return call_user_func_array( 'PHPUnit_Framework_Assert::contains', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher * object. * * @param string $type * * @return PHPUnit_Framework_Constraint_TraversableContainsOnly * * @since Method available since Release 3.1.4 */ function containsOnly($type) { return call_user_func_array( 'PHPUnit_Framework_Assert::containsOnly', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher * object. * * @param string $classname * * @return PHPUnit_Framework_Constraint_TraversableContainsOnly */ function containsOnlyInstancesOf($classname) { return call_user_func_array( 'PHPUnit_Framework_Assert::containsOnlyInstancesOf', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object. * * @param mixed $value * @param float $delta * @param int $maxDepth * @param bool $canonicalize * @param bool $ignoreCase * * @return PHPUnit_Framework_Constraint_IsEqual * * @since Method available since Release 3.0.0 */ function equalTo($value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) { return call_user_func_array( 'PHPUnit_Framework_Assert::equalTo', func_get_args() ); } /** * Returns a matcher that matches when the method is executed * exactly $count times. * * @param int $count * * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount * * @since Method available since Release 3.0.0 */ function exactly($count) { return call_user_func_array( 'PHPUnit_Framework_TestCase::exactly', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_FileExists matcher object. * * @return PHPUnit_Framework_Constraint_FileExists * * @since Method available since Release 3.0.0 */ function fileExists() { return call_user_func_array( 'PHPUnit_Framework_Assert::fileExists', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_GreaterThan matcher object. * * @param mixed $value * * @return PHPUnit_Framework_Constraint_GreaterThan * * @since Method available since Release 3.0.0 */ function greaterThan($value) { return call_user_func_array( 'PHPUnit_Framework_Assert::greaterThan', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps * a PHPUnit_Framework_Constraint_IsEqual and a * PHPUnit_Framework_Constraint_GreaterThan matcher object. * * @param mixed $value * * @return PHPUnit_Framework_Constraint_Or * * @since Method available since Release 3.1.0 */ function greaterThanOrEqual($value) { return call_user_func_array( 'PHPUnit_Framework_Assert::greaterThanOrEqual', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_IsIdentical matcher object. * * @param mixed $value * * @return PHPUnit_Framework_Constraint_IsIdentical * * @since Method available since Release 3.0.0 */ function identicalTo($value) { return call_user_func_array( 'PHPUnit_Framework_Assert::identicalTo', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_IsEmpty matcher object. * * @return PHPUnit_Framework_Constraint_IsEmpty * * @since Method available since Release 3.5.0 */ function isEmpty() { return call_user_func_array( 'PHPUnit_Framework_Assert::isEmpty', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_IsFalse matcher object. * * @return PHPUnit_Framework_Constraint_IsFalse * * @since Method available since Release 3.3.0 */ function isFalse() { return call_user_func_array( 'PHPUnit_Framework_Assert::isFalse', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_IsInstanceOf matcher object. * * @param string $className * * @return PHPUnit_Framework_Constraint_IsInstanceOf * * @since Method available since Release 3.0.0 */ function isInstanceOf($className) { return call_user_func_array( 'PHPUnit_Framework_Assert::isInstanceOf', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_IsJson matcher object. * * @return PHPUnit_Framework_Constraint_IsJson * * @since Method available since Release 3.7.20 */ function isJson() { return call_user_func_array( 'PHPUnit_Framework_Assert::isJson', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_IsNull matcher object. * * @return PHPUnit_Framework_Constraint_IsNull * * @since Method available since Release 3.3.0 */ function isNull() { return call_user_func_array( 'PHPUnit_Framework_Assert::isNull', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_IsTrue matcher object. * * @return PHPUnit_Framework_Constraint_IsTrue * * @since Method available since Release 3.3.0 */ function isTrue() { return call_user_func_array( 'PHPUnit_Framework_Assert::isTrue', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_IsType matcher object. * * @param string $type * * @return PHPUnit_Framework_Constraint_IsType * * @since Method available since Release 3.0.0 */ function isType($type) { return call_user_func_array( 'PHPUnit_Framework_Assert::isType', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_LessThan matcher object. * * @param mixed $value * * @return PHPUnit_Framework_Constraint_LessThan * * @since Method available since Release 3.0.0 */ function lessThan($value) { return call_user_func_array( 'PHPUnit_Framework_Assert::lessThan', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps * a PHPUnit_Framework_Constraint_IsEqual and a * PHPUnit_Framework_Constraint_LessThan matcher object. * * @param mixed $value * * @return PHPUnit_Framework_Constraint_Or * * @since Method available since Release 3.1.0 */ function lessThanOrEqual($value) { return call_user_func_array( 'PHPUnit_Framework_Assert::lessThanOrEqual', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_And matcher object. * * @return PHPUnit_Framework_Constraint_And * * @since Method available since Release 3.0.0 */ function logicalAnd() { return call_user_func_array( 'PHPUnit_Framework_Assert::logicalAnd', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_Not matcher object. * * @param PHPUnit_Framework_Constraint $constraint * * @return PHPUnit_Framework_Constraint_Not * * @since Method available since Release 3.0.0 */ function logicalNot(PHPUnit_Framework_Constraint $constraint) { return call_user_func_array( 'PHPUnit_Framework_Assert::logicalNot', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_Or matcher object. * * @return PHPUnit_Framework_Constraint_Or * * @since Method available since Release 3.0.0 */ function logicalOr() { return call_user_func_array( 'PHPUnit_Framework_Assert::logicalOr', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_Xor matcher object. * * @return PHPUnit_Framework_Constraint_Xor * * @since Method available since Release 3.0.0 */ function logicalXor() { return call_user_func_array( 'PHPUnit_Framework_Assert::logicalXor', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_StringMatches matcher object. * * @param string $string * * @return PHPUnit_Framework_Constraint_StringMatches * * @since Method available since Release 3.5.0 */ function matches($string) { return call_user_func_array( 'PHPUnit_Framework_Assert::matches', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_PCREMatch matcher object. * * @param string $pattern * * @return PHPUnit_Framework_Constraint_PCREMatch * * @since Method available since Release 3.0.0 */ function matchesRegularExpression($pattern) { return call_user_func_array( 'PHPUnit_Framework_Assert::matchesRegularExpression', func_get_args() ); } /** * Returns a matcher that matches when the method is never executed. * * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount * * @since Method available since Release 3.0.0 */ function never() { return call_user_func_array( 'PHPUnit_Framework_TestCase::never', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_ObjectHasAttribute matcher object. * * @param string $attributeName * * @return PHPUnit_Framework_Constraint_ObjectHasAttribute * * @since Method available since Release 3.0.0 */ function objectHasAttribute($attributeName) { return call_user_func_array( 'PHPUnit_Framework_Assert::objectHasAttribute', func_get_args() ); } /** * @param mixed $value, ... * * @return PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls * * @since Method available since Release 3.0.0 */ function onConsecutiveCalls() { return call_user_func_array( 'PHPUnit_Framework_TestCase::onConsecutiveCalls', func_get_args() ); } /** * Returns a matcher that matches when the method is executed exactly once. * * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount * * @since Method available since Release 3.0.0 */ function once() { return call_user_func_array( 'PHPUnit_Framework_TestCase::once', func_get_args() ); } /** * @param int $argumentIndex * * @return PHPUnit_Framework_MockObject_Stub_ReturnArgument * * @since Method available since Release 3.3.0 */ function returnArgument($argumentIndex) { return call_user_func_array( 'PHPUnit_Framework_TestCase::returnArgument', func_get_args() ); } /** * @param mixed $callback * * @return PHPUnit_Framework_MockObject_Stub_ReturnCallback * * @since Method available since Release 3.3.0 */ function returnCallback($callback) { return call_user_func_array( 'PHPUnit_Framework_TestCase::returnCallback', func_get_args() ); } /** * Returns the current object. * * This method is useful when mocking a fluent interface. * * @return PHPUnit_Framework_MockObject_Stub_ReturnSelf * * @since Method available since Release 3.6.0 */ function returnSelf() { return call_user_func_array( 'PHPUnit_Framework_TestCase::returnSelf', func_get_args() ); } /** * @param mixed $value * * @return PHPUnit_Framework_MockObject_Stub_Return * * @since Method available since Release 3.0.0 */ function returnValue($value) { return call_user_func_array( 'PHPUnit_Framework_TestCase::returnValue', func_get_args() ); } /** * @param array $valueMap * * @return PHPUnit_Framework_MockObject_Stub_ReturnValueMap * * @since Method available since Release 3.6.0 */ function returnValueMap(array $valueMap) { return call_user_func_array( 'PHPUnit_Framework_TestCase::returnValueMap', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_StringContains matcher object. * * @param string $string * @param bool $case * * @return PHPUnit_Framework_Constraint_StringContains * * @since Method available since Release 3.0.0 */ function stringContains($string, $case = true) { return call_user_func_array( 'PHPUnit_Framework_Assert::stringContains', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_StringEndsWith matcher object. * * @param mixed $suffix * * @return PHPUnit_Framework_Constraint_StringEndsWith * * @since Method available since Release 3.4.0 */ function stringEndsWith($suffix) { return call_user_func_array( 'PHPUnit_Framework_Assert::stringEndsWith', func_get_args() ); } /** * Returns a PHPUnit_Framework_Constraint_StringStartsWith matcher object. * * @param mixed $prefix * * @return PHPUnit_Framework_Constraint_StringStartsWith * * @since Method available since Release 3.4.0 */ function stringStartsWith($prefix) { return call_user_func_array( 'PHPUnit_Framework_Assert::stringStartsWith', func_get_args() ); } /** * @param Exception $exception * * @return PHPUnit_Framework_MockObject_Stub_Exception * * @since Method available since Release 3.1.0 */ function throwException(Exception $exception) { return call_user_func_array( 'PHPUnit_Framework_TestCase::throwException', func_get_args() ); } phpunit-5.1.3/src/Framework/AssertionFailedError.php000066400000000000000000000011731263222771600225440ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Thrown when an assertion failed. * * @since Class available since Release 2.0.0 */ class PHPUnit_Framework_AssertionFailedError extends PHPUnit_Framework_Exception implements PHPUnit_Framework_SelfDescribing { /** * Wrapper for getMessage() which is declared as final. * * @return string */ public function toString() { return $this->getMessage(); } } phpunit-5.1.3/src/Framework/BaseTestListener.php000066400000000000000000000027371263222771600217050ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * An empty Listener that can be extended to implement TestListener * with just a few lines of code. * * @see PHPUnit_Framework_TestListener for documentation on the API methods. * @since Class available since Release 4.0.0 */ abstract class PHPUnit_Framework_BaseTestListener implements PHPUnit_Framework_TestListener { public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) { } public function addWarning(PHPUnit_Framework_Test $test, PHPUnit_Framework_Warning $e, $time) { } public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) { } public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) { } public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) { } public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) { } public function startTestSuite(PHPUnit_Framework_TestSuite $suite) { } public function endTestSuite(PHPUnit_Framework_TestSuite $suite) { } public function startTest(PHPUnit_Framework_Test $test) { } public function endTest(PHPUnit_Framework_Test $test, $time) { } } phpunit-5.1.3/src/Framework/CodeCoverageException.php000066400000000000000000000005611263222771600226630ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 4.0.0 */ class PHPUnit_Framework_CodeCoverageException extends PHPUnit_Framework_Exception { } phpunit-5.1.3/src/Framework/Constraint.php000066400000000000000000000104721263222771600206040ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use SebastianBergmann\Exporter\Exporter; /** * Abstract base class for constraints. which are placed upon any value. * * @since Interface available since Release 3.0.0 */ abstract class PHPUnit_Framework_Constraint implements Countable, PHPUnit_Framework_SelfDescribing { protected $exporter; public function __construct() { $this->exporter = new 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. * * @param mixed $other Value or object to evaluate. * @param string $description Additional information about the test * @param bool $returnResult Whether to return a result or throw an exception * * @return mixed * * @throws PHPUnit_Framework_ExpectationFailedException */ public function evaluate($other, $description = '', $returnResult = false) { $success = false; if ($this->matches($other)) { $success = true; } if ($returnResult) { return $success; } if (!$success) { $this->fail($other, $description); } } /** * 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. * * @return bool */ protected function matches($other) { return false; } /** * Counts the number of constraint elements. * * @return int * * @since Method available since Release 3.4.0 */ public function count() { return 1; } /** * 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 * @param SebastianBergmann\Comparator\ComparisonFailure $comparisonFailure * * @throws PHPUnit_Framework_ExpectationFailedException */ protected function fail($other, $description, SebastianBergmann\Comparator\ComparisonFailure $comparisonFailure = null) { $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 PHPUnit_Framework_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. * * @return string */ protected function additionalFailureDescription($other) { 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. * * @return string */ protected function failureDescription($other) { return $this->exporter->export($other) . ' ' . $this->toString(); } } phpunit-5.1.3/src/Framework/Constraint/000077500000000000000000000000001263222771600200675ustar00rootroot00000000000000phpunit-5.1.3/src/Framework/Constraint/And.php000066400000000000000000000060541263222771600213070ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Logical AND. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_Constraint_And extends PHPUnit_Framework_Constraint { /** * @var PHPUnit_Framework_Constraint[] */ protected $constraints = []; /** * @var PHPUnit_Framework_Constraint */ protected $lastConstraint = null; /** * @param PHPUnit_Framework_Constraint[] $constraints * * @throws PHPUnit_Framework_Exception */ public function setConstraints(array $constraints) { $this->constraints = []; foreach ($constraints as $constraint) { if (!($constraint instanceof PHPUnit_Framework_Constraint)) { throw new PHPUnit_Framework_Exception( 'All parameters to ' . __CLASS__ . ' must be a constraint object.' ); } $this->constraints[] = $constraint; } } /** * Evaluates the constraint for parameter $other * * If $returnResult is set to false (the default), an exception is thrown * in case of a failure. null is returned otherwise. * * If $returnResult is true, the result of the evaluation is returned as * a boolean value instead: true in case of success, false in case of a * failure. * * @param mixed $other Value or object to evaluate. * @param string $description Additional information about the test * @param bool $returnResult Whether to return a result or throw an exception * * @return mixed * * @throws PHPUnit_Framework_ExpectationFailedException */ public function evaluate($other, $description = '', $returnResult = false) { $success = true; $constraint = null; foreach ($this->constraints as $constraint) { if (!$constraint->evaluate($other, $description, true)) { $success = false; break; } } if ($returnResult) { return $success; } if (!$success) { $this->fail($other, $description); } } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { $text = ''; foreach ($this->constraints as $key => $constraint) { if ($key > 0) { $text .= ' and '; } $text .= $constraint->toString(); } return $text; } /** * Counts the number of constraint elements. * * @return int * * @since Method available since Release 3.4.0 */ public function count() { $count = 0; foreach ($this->constraints as $constraint) { $count += count($constraint); } return $count; } } phpunit-5.1.3/src/Framework/Constraint/ArrayHasKey.php000066400000000000000000000036701263222771600227710ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that asserts that the array it is evaluated for has a given key. * * Uses array_key_exists() to check if the key is found in the input array, if * not found the evaluation fails. * * The array key is passed in the constructor. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_Constraint_ArrayHasKey extends PHPUnit_Framework_Constraint { /** * @var int|string */ protected $key; /** * @param int|string $key */ public function __construct($key) { parent::__construct(); $this->key = $key; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { if (is_array($other)) { return array_key_exists($this->key, $other); } if ($other instanceof ArrayAccess) { return $other->offsetExists($this->key); } return false; } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'has the key ' . $this->exporter->export($this->key); } /** * 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. * * @return string */ protected function failureDescription($other) { return 'an array ' . $this->toString(); } } phpunit-5.1.3/src/Framework/Constraint/ArraySubset.php000066400000000000000000000041111263222771600230410ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that asserts that the array it is evaluated for has a specified subset. * * Uses array_replace_recursive() to check if a key value subset is part of the * subject array. * * @since Class available since Release 4.4.0 */ class PHPUnit_Framework_Constraint_ArraySubset extends PHPUnit_Framework_Constraint { /** * @var array|ArrayAccess */ protected $subset; /** * @var bool */ protected $strict; /** * @param array|ArrayAccess $subset * @param bool $strict Check for object identity */ public function __construct($subset, $strict = false) { parent::__construct(); $this->strict = $strict; $this->subset = $subset; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param array|ArrayAccess $other Array or ArrayAccess object to evaluate. * * @return bool */ protected function matches($other) { $patched = array_replace_recursive($other, $this->subset); if ($this->strict) { return $other === $patched; } else { return $other == $patched; } } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'has the subset ' . $this->exporter->export($this->subset); } /** * Returns the description of the failure * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other Evaluated value or object. * * @return string */ protected function failureDescription($other) { return 'an array ' . $this->toString(); } } phpunit-5.1.3/src/Framework/Constraint/Attribute.php000066400000000000000000000046321263222771600225500ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 3.1.0 */ class PHPUnit_Framework_Constraint_Attribute extends PHPUnit_Framework_Constraint_Composite { /** * @var string */ protected $attributeName; /** * @param PHPUnit_Framework_Constraint $constraint * @param string $attributeName */ public function __construct(PHPUnit_Framework_Constraint $constraint, $attributeName) { parent::__construct($constraint); $this->attributeName = $attributeName; } /** * Evaluates the constraint for parameter $other * * If $returnResult is set to false (the default), an exception is thrown * in case of a failure. null is returned otherwise. * * If $returnResult is true, the result of the evaluation is returned as * a boolean value instead: true in case of success, false in case of a * failure. * * @param mixed $other Value or object to evaluate. * @param string $description Additional information about the test * @param bool $returnResult Whether to return a result or throw an exception * * @return mixed * * @throws PHPUnit_Framework_ExpectationFailedException */ public function evaluate($other, $description = '', $returnResult = false) { return parent::evaluate( PHPUnit_Framework_Assert::readAttribute( $other, $this->attributeName ), $description, $returnResult ); } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'attribute "' . $this->attributeName . '" ' . $this->innerConstraint->toString(); } /** * Returns the description of the failure * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other Evaluated value or object. * * @return string */ protected function failureDescription($other) { return $this->toString(); } } phpunit-5.1.3/src/Framework/Constraint/Callback.php000066400000000000000000000024631263222771600223010ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that evaluates against a specified closure. */ class PHPUnit_Framework_Constraint_Callback extends PHPUnit_Framework_Constraint { private $callback; /** * @param callable $callback * * @throws PHPUnit_Framework_Exception */ public function __construct($callback) { if (!is_callable($callback)) { throw PHPUnit_Util_InvalidArgumentHelper::factory( 1, 'callable' ); } parent::__construct(); $this->callback = $callback; } /** * Evaluates the constraint for parameter $value. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { return call_user_func($this->callback, $other); } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'is accepted by specified callback'; } } phpunit-5.1.3/src/Framework/Constraint/ClassHasAttribute.php000066400000000000000000000037031263222771600241700ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that asserts that the class it is evaluated for has a given * attribute. * * The attribute name is passed in the constructor. * * @since Class available since Release 3.1.0 */ class PHPUnit_Framework_Constraint_ClassHasAttribute extends PHPUnit_Framework_Constraint { /** * @var string */ protected $attributeName; /** * @param string $attributeName */ public function __construct($attributeName) { parent::__construct(); $this->attributeName = $attributeName; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { $class = new ReflectionClass($other); return $class->hasProperty($this->attributeName); } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return sprintf( 'has attribute "%s"', $this->attributeName ); } /** * 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. * * @return string */ protected function failureDescription($other) { return sprintf( '%sclass "%s" %s', is_object($other) ? 'object of ' : '', is_object($other) ? get_class($other) : $other, $this->toString() ); } } phpunit-5.1.3/src/Framework/Constraint/ClassHasStaticAttribute.php000066400000000000000000000026041263222771600253370ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that asserts that the class it is evaluated for has a given * static attribute. * * The attribute name is passed in the constructor. * * @since Class available since Release 3.1.0 */ class PHPUnit_Framework_Constraint_ClassHasStaticAttribute extends PHPUnit_Framework_Constraint_ClassHasAttribute { /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { $class = new ReflectionClass($other); if ($class->hasProperty($this->attributeName)) { $attribute = $class->getProperty($this->attributeName); return $attribute->isStatic(); } else { return false; } } /** * Returns a string representation of the constraint. * * @return string * * @since Method available since Release 3.3.0 */ public function toString() { return sprintf( 'has static attribute "%s"', $this->attributeName ); } } phpunit-5.1.3/src/Framework/Constraint/Composite.php000066400000000000000000000037041263222771600225460ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 3.1.0 */ abstract class PHPUnit_Framework_Constraint_Composite extends PHPUnit_Framework_Constraint { /** * @var PHPUnit_Framework_Constraint */ protected $innerConstraint; /** * @param PHPUnit_Framework_Constraint $innerConstraint */ public function __construct(PHPUnit_Framework_Constraint $innerConstraint) { parent::__construct(); $this->innerConstraint = $innerConstraint; } /** * Evaluates the constraint for parameter $other * * If $returnResult is set to false (the default), an exception is thrown * in case of a failure. null is returned otherwise. * * If $returnResult is true, the result of the evaluation is returned as * a boolean value instead: true in case of success, false in case of a * failure. * * @param mixed $other Value or object to evaluate. * @param string $description Additional information about the test * @param bool $returnResult Whether to return a result or throw an exception * * @return mixed * * @throws PHPUnit_Framework_ExpectationFailedException */ public function evaluate($other, $description = '', $returnResult = false) { try { return $this->innerConstraint->evaluate( $other, $description, $returnResult ); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->fail($other, $description); } } /** * Counts the number of constraint elements. * * @return int */ public function count() { return count($this->innerConstraint); } } phpunit-5.1.3/src/Framework/Constraint/Count.php000066400000000000000000000047451263222771600217020ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 3.6.0 */ class PHPUnit_Framework_Constraint_Count extends PHPUnit_Framework_Constraint { /** * @var int */ protected $expectedCount = 0; /** * @param int $expected */ public function __construct($expected) { parent::__construct(); $this->expectedCount = $expected; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other * * @return bool */ protected function matches($other) { return $this->expectedCount === $this->getCountOf($other); } /** * @param mixed $other * * @return bool */ protected function getCountOf($other) { if ($other instanceof Countable || is_array($other)) { return count($other); } elseif ($other instanceof Traversable) { if ($other instanceof IteratorAggregate) { $iterator = $other->getIterator(); } else { $iterator = $other; } $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; } } /** * 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. * * @return string */ protected function failureDescription($other) { return sprintf( 'actual size %d matches expected size %d', $this->getCountOf($other), $this->expectedCount ); } /** * @return string */ public function toString() { return sprintf( 'count matches %d', $this->expectedCount ); } } phpunit-5.1.3/src/Framework/Constraint/Exception.php000066400000000000000000000042321263222771600225370ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 3.6.6 */ class PHPUnit_Framework_Constraint_Exception extends PHPUnit_Framework_Constraint { /** * @var string */ protected $className; /** * @param string $className */ public function __construct($className) { parent::__construct(); $this->className = $className; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { 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. * * @return string */ protected function failureDescription($other) { if ($other !== null) { $message = ''; if ($other instanceof Exception || $other instanceof Throwable) { $message = '. Message was: "' . $other->getMessage() . '" at' . "\n" . PHPUnit_Util_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 ); } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return sprintf( 'exception of type "%s"', $this->className ); } } phpunit-5.1.3/src/Framework/Constraint/ExceptionCode.php000066400000000000000000000031331263222771600233310ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 3.6.6 */ class PHPUnit_Framework_Constraint_ExceptionCode extends PHPUnit_Framework_Constraint { /** * @var int */ protected $expectedCode; /** * @param int $expected */ public function __construct($expected) { parent::__construct(); $this->expectedCode = $expected; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param Exception $other * * @return bool */ protected function matches($other) { 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. * * @return string */ protected function failureDescription($other) { return sprintf( '%s is equal to expected exception code %s', $this->exporter->export($other->getCode()), $this->exporter->export($this->expectedCode) ); } /** * @return string */ public function toString() { return 'exception code is '; } } phpunit-5.1.3/src/Framework/Constraint/ExceptionMessage.php000066400000000000000000000031031263222771600240400ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 3.6.6 */ class PHPUnit_Framework_Constraint_ExceptionMessage extends PHPUnit_Framework_Constraint { /** * @var int */ protected $expectedMessage; /** * @param string $expected */ public function __construct($expected) { parent::__construct(); $this->expectedMessage = $expected; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param Exception $other * * @return bool */ protected function matches($other) { return strpos($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. * * @return string */ protected function failureDescription($other) { return sprintf( "exception message '%s' contains '%s'", $other->getMessage(), $this->expectedMessage ); } /** * @return string */ public function toString() { return 'exception message contains '; } } phpunit-5.1.3/src/Framework/Constraint/ExceptionMessageRegExp.php000066400000000000000000000035401263222771600251600ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 4.3.0 */ class PHPUnit_Framework_Constraint_ExceptionMessageRegExp extends PHPUnit_Framework_Constraint { /** * @var int */ protected $expectedMessageRegExp; /** * @param string $expected */ public function __construct($expected) { parent::__construct(); $this->expectedMessageRegExp = $expected; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param Exception $other * * @return bool */ protected function matches($other) { $match = PHPUnit_Util_Regex::pregMatchSafe($this->expectedMessageRegExp, $other->getMessage()); if (false === $match) { throw new PHPUnit_Framework_Exception( "Invalid expected exception message regex given: '{$this->expectedMessageRegExp}'" ); } return 1 === $match; } /** * 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. * * @return string */ protected function failureDescription($other) { return sprintf( "exception message '%s' matches '%s'", $other->getMessage(), $this->expectedMessageRegExp ); } /** * @return string */ public function toString() { return 'exception message matches '; } } phpunit-5.1.3/src/Framework/Constraint/FileExists.php000066400000000000000000000026631263222771600226660ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that checks if the file(name) that it is evaluated for exists. * * The file path to check is passed as $other in evaluate(). * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_Constraint_FileExists extends PHPUnit_Framework_Constraint { /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { 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. * * @return string */ protected function failureDescription($other) { return sprintf( 'file "%s" exists', $other ); } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'file exists'; } } phpunit-5.1.3/src/Framework/Constraint/GreaterThan.php000066400000000000000000000023071263222771600230060ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that asserts that the value it is evaluated for is greater * than a given value. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_Constraint_GreaterThan extends PHPUnit_Framework_Constraint { /** * @var numeric */ protected $value; /** * @param numeric $value */ public function __construct($value) { parent::__construct(); $this->value = $value; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { return $this->value < $other; } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'is greater than ' . $this->exporter->export($this->value); } } phpunit-5.1.3/src/Framework/Constraint/IsAnything.php000066400000000000000000000031601263222771600226550ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that accepts any input value. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_Constraint_IsAnything extends PHPUnit_Framework_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. * * @param mixed $other Value or object to evaluate. * @param string $description Additional information about the test * @param bool $returnResult Whether to return a result or throw an exception * * @return mixed * * @throws PHPUnit_Framework_ExpectationFailedException */ public function evaluate($other, $description = '', $returnResult = false) { return $returnResult ? true : null; } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'is anything'; } /** * Counts the number of constraint elements. * * @return int * * @since Method available since Release 3.5.0 */ public function count() { return 0; } } phpunit-5.1.3/src/Framework/Constraint/IsEmpty.php000066400000000000000000000030461263222771600221750ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that checks whether a variable is empty(). * * @since Class available since Release 3.5.0 */ class PHPUnit_Framework_Constraint_IsEmpty extends PHPUnit_Framework_Constraint { /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { if ($other instanceof Countable) { return count($other) === 0; } return empty($other); } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'is empty'; } /** * 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. * * @return string */ protected function failureDescription($other) { $type = gettype($other); return sprintf( '%s %s %s', $type[0] == 'a' || $type[0] == 'o' ? 'an' : 'a', $type, $this->toString() ); } } phpunit-5.1.3/src/Framework/Constraint/IsEqual.php000066400000000000000000000114411263222771600221440ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that checks if one value is equal to another. * * Equality is checked with PHP's == operator, the operator is explained in * detail at {@url http://www.php.net/manual/en/types.comparisons.php}. * Two values are equal if they have the same value disregarding type. * * The expected value is passed in the constructor. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_Constraint_IsEqual extends PHPUnit_Framework_Constraint { /** * @var mixed */ protected $value; /** * @var float */ protected $delta = 0.0; /** * @var int */ protected $maxDepth = 10; /** * @var bool */ protected $canonicalize = false; /** * @var bool */ protected $ignoreCase = false; /** * @var SebastianBergmann\Comparator\ComparisonFailure */ protected $lastFailure; /** * @param mixed $value * @param float $delta * @param int $maxDepth * @param bool $canonicalize * @param bool $ignoreCase * * @throws PHPUnit_Framework_Exception */ public function __construct($value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) { parent::__construct(); if (!is_numeric($delta)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'numeric'); } if (!is_int($maxDepth)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'integer'); } if (!is_bool($canonicalize)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(4, 'boolean'); } if (!is_bool($ignoreCase)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(5, 'boolean'); } $this->value = $value; $this->delta = $delta; $this->maxDepth = $maxDepth; $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. * * @param mixed $other Value or object to evaluate. * @param string $description Additional information about the test * @param bool $returnResult Whether to return a result or throw an exception * * @return mixed * * @throws PHPUnit_Framework_ExpectationFailedException */ public function evaluate($other, $description = '', $returnResult = false) { // 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 = SebastianBergmann\Comparator\Factory::getInstance(); try { $comparator = $comparatorFactory->getComparatorFor( $this->value, $other ); $comparator->assertEquals( $this->value, $other, $this->delta, $this->canonicalize, $this->ignoreCase ); } catch (SebastianBergmann\Comparator\ComparisonFailure $f) { if ($returnResult) { return false; } throw new PHPUnit_Framework_ExpectationFailedException( trim($description . "\n" . $f->getMessage()), $f ); } return true; } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { $delta = ''; if (is_string($this->value)) { if (strpos($this->value, "\n") !== false) { return 'is equal to '; } else { return sprintf( 'is equal to ', $this->value ); } } else { if ($this->delta != 0) { $delta = sprintf( ' with delta <%F>', $this->delta ); } return sprintf( 'is equal to %s%s', $this->exporter->export($this->value), $delta ); } } } phpunit-5.1.3/src/Framework/Constraint/IsFalse.php000066400000000000000000000015651263222771600221350ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that accepts false. * * @since Class available since Release 3.3.0 */ class PHPUnit_Framework_Constraint_IsFalse extends PHPUnit_Framework_Constraint { /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { return $other === false; } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'is false'; } } phpunit-5.1.3/src/Framework/Constraint/IsFinite.php000066400000000000000000000015761263222771600223230ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that accepts finite. * * @since Class available since Release 4.8.0 */ class PHPUnit_Framework_Constraint_IsFinite extends PHPUnit_Framework_Constraint { /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { return is_finite($other); } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'is finite'; } } phpunit-5.1.3/src/Framework/Constraint/IsIdentical.php000066400000000000000000000073251263222771600227770ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that asserts that one value is identical to another. * * Identical check is performed with PHP's === operator, the operator is * explained in detail at * {@url http://www.php.net/manual/en/types.comparisons.php}. * Two values are identical if they have the same value and are of the same * type. * * The expected value is passed in the constructor. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_Constraint_IsIdentical extends PHPUnit_Framework_Constraint { /** * @var float */ const EPSILON = 0.0000000001; /** * @var mixed */ protected $value; /** * @param mixed $value */ public function __construct($value) { parent::__construct(); $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. * * @param mixed $other Value or object to evaluate. * @param string $description Additional information about the test * @param bool $returnResult Whether to return a result or throw an exception * * @return mixed * * @throws PHPUnit_Framework_ExpectationFailedException */ public function evaluate($other, $description = '', $returnResult = false) { if (is_double($this->value) && is_double($other) && !is_infinite($this->value) && !is_infinite($other) && !is_nan($this->value) && !is_nan($other)) { $success = abs($this->value - $other) < self::EPSILON; } else { $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 SebastianBergmann\Comparator\ComparisonFailure( $this->value, $other, $this->value, $other ); } $this->fail($other, $description, $f); } } /** * 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. * * @return string */ protected function failureDescription($other) { 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'; } return parent::failureDescription($other); } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { if (is_object($this->value)) { return 'is identical to an object of class "' . get_class($this->value) . '"'; } else { return 'is identical to ' . $this->exporter->export($this->value); } } } phpunit-5.1.3/src/Framework/Constraint/IsInfinite.php000066400000000000000000000016061263222771600226440ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that accepts infinite. * * @since Class available since Release 4.8.0 */ class PHPUnit_Framework_Constraint_IsInfinite extends PHPUnit_Framework_Constraint { /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { return is_infinite($other); } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'is infinite'; } } phpunit-5.1.3/src/Framework/Constraint/IsInstanceOf.php000066400000000000000000000042761263222771600231360ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that asserts that the object it is evaluated for is an instance * of a given class. * * The expected class name is passed in the constructor. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_Constraint_IsInstanceOf extends PHPUnit_Framework_Constraint { /** * @var string */ protected $className; /** * @param string $className */ public function __construct($className) { parent::__construct(); $this->className = $className; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { 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. * * @return string */ protected function failureDescription($other) { return sprintf( '%s is an instance of %s "%s"', $this->exporter->shortenedExport($other), $this->getType(), $this->className ); } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return sprintf( 'is instance of %s "%s"', $this->getType(), $this->className ); } private function getType() { try { $reflection = new ReflectionClass($this->className); if ($reflection->isInterface()) { return 'interface'; } } catch (ReflectionException $e) { } return 'class'; } } phpunit-5.1.3/src/Framework/Constraint/IsJson.php000066400000000000000000000034651263222771600220150ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that asserts that a string is valid JSON. * * @since Class available since Release 3.7.20 */ class PHPUnit_Framework_Constraint_IsJson extends PHPUnit_Framework_Constraint { /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { 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. * * @return string */ protected function failureDescription($other) { if ($other === '') { return 'an empty string is valid JSON'; } json_decode($other); $error = PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::determineJsonError( json_last_error() ); return sprintf( '%s is valid JSON (%s)', $this->exporter->shortenedExport($other), $error ); } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'is valid JSON'; } } phpunit-5.1.3/src/Framework/Constraint/IsNan.php000066400000000000000000000015621263222771600216140ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that accepts nan. * * @since Class available since Release 4.8.0 */ class PHPUnit_Framework_Constraint_IsNan extends PHPUnit_Framework_Constraint { /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { return is_nan($other); } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'is nan'; } } phpunit-5.1.3/src/Framework/Constraint/IsNull.php000066400000000000000000000015611263222771600220110ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that accepts null. * * @since Class available since Release 3.3.0 */ class PHPUnit_Framework_Constraint_IsNull extends PHPUnit_Framework_Constraint { /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { return $other === null; } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'is null'; } } phpunit-5.1.3/src/Framework/Constraint/IsTrue.php000066400000000000000000000015611263222771600220160ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that accepts true. * * @since Class available since Release 3.3.0 */ class PHPUnit_Framework_Constraint_IsTrue extends PHPUnit_Framework_Constraint { /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { return $other === true; } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'is true'; } } phpunit-5.1.3/src/Framework/Constraint/IsType.php000066400000000000000000000065571263222771600220320ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that asserts that the value it is evaluated for is of a * specified type. * * The expected value is passed in the constructor. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_Constraint_IsType extends PHPUnit_Framework_Constraint { const TYPE_ARRAY = 'array'; const TYPE_BOOL = 'bool'; const TYPE_FLOAT = 'float'; const TYPE_INT = 'int'; const TYPE_NULL = 'null'; const TYPE_NUMERIC = 'numeric'; const TYPE_OBJECT = 'object'; const TYPE_RESOURCE = 'resource'; const TYPE_STRING = 'string'; const TYPE_SCALAR = 'scalar'; const TYPE_CALLABLE = 'callable'; /** * @var array */ protected $types = [ 'array' => true, 'boolean' => true, 'bool' => true, 'double' => true, 'float' => true, 'integer' => true, 'int' => true, 'null' => true, 'numeric' => true, 'object' => true, 'real' => true, 'resource' => true, 'string' => true, 'scalar' => true, 'callable' => true ]; /** * @var string */ protected $type; /** * @param string $type * * @throws PHPUnit_Framework_Exception */ public function __construct($type) { parent::__construct(); if (!isset($this->types[$type])) { throw new PHPUnit_Framework_Exception( sprintf( 'Type specified for PHPUnit_Framework_Constraint_IsType <%s> ' . 'is not a valid type.', $type ) ); } $this->type = $type; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { switch ($this->type) { case 'numeric': return is_numeric($other); case 'integer': case 'int': return is_integer($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 is_null($other); case 'array': return is_array($other); case 'object': return is_object($other); case 'resource': return is_resource($other) || is_string(@get_resource_type($other)); case 'scalar': return is_scalar($other); case 'callable': return is_callable($other); } } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return sprintf( 'is of type "%s"', $this->type ); } } phpunit-5.1.3/src/Framework/Constraint/JsonMatches.php000066400000000000000000000030401263222771600230130ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Asserts whether or not two JSON objects are equal. * * @since Class available since Release 3.7.0 */ class PHPUnit_Framework_Constraint_JsonMatches extends PHPUnit_Framework_Constraint { /** * @var string */ protected $value; /** * Creates a new constraint. * * @param string $value */ public function __construct($value) { parent::__construct(); $this->value = $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. * * @return bool */ protected function matches($other) { $decodedOther = json_decode($other); if (json_last_error()) { return false; } $decodedValue = json_decode($this->value); if (json_last_error()) { return false; } return $decodedOther == $decodedValue; } /** * Returns a string representation of the object. * * @return string */ public function toString() { return sprintf( 'matches JSON string "%s"', $this->value ); } } phpunit-5.1.3/src/Framework/Constraint/JsonMatches/000077500000000000000000000000001263222771600223055ustar00rootroot00000000000000phpunit-5.1.3/src/Framework/Constraint/JsonMatches/ErrorMessageProvider.php000066400000000000000000000036571263222771600271420ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Provides human readable messages for each JSON error. * * @since Class available since Release 3.7.0 */ class PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider { /** * Translates JSON error to a human readable string. * * @param string $error * @param string $prefix * * @return string */ public static function determineJsonError($error, $prefix = '') { switch ($error) { case JSON_ERROR_NONE: return; 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. * * @param string $type * * @return string */ public static function translateTypeToPrefix($type) { 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; } } phpunit-5.1.3/src/Framework/Constraint/LessThan.php000066400000000000000000000022761263222771600223300ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that asserts that the value it is evaluated for is less than * a given value. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_Constraint_LessThan extends PHPUnit_Framework_Constraint { /** * @var numeric */ protected $value; /** * @param numeric $value */ public function __construct($value) { parent::__construct(); $this->value = $value; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { return $this->value > $other; } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'is less than ' . $this->exporter->export($this->value); } } phpunit-5.1.3/src/Framework/Constraint/Not.php000066400000000000000000000102171263222771600213410ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Logical NOT. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_Constraint_Not extends PHPUnit_Framework_Constraint { /** * @var PHPUnit_Framework_Constraint */ protected $constraint; /** * @param PHPUnit_Framework_Constraint $constraint */ public function __construct($constraint) { parent::__construct(); if (!($constraint instanceof PHPUnit_Framework_Constraint)) { $constraint = new PHPUnit_Framework_Constraint_IsEqual($constraint); } $this->constraint = $constraint; } /** * @param string $string * * @return string */ public static function negate($string) { return str_replace( [ 'contains ', 'exists', 'has ', 'is ', 'are ', 'matches ', 'starts with ', 'ends with ', 'reference ', 'not not ' ], [ '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 ' ], $string ); } /** * 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 $other Value or object to evaluate. * @param string $description Additional information about the test * @param bool $returnResult Whether to return a result or throw an exception * * @return mixed * * @throws PHPUnit_Framework_ExpectationFailedException */ public function evaluate($other, $description = '', $returnResult = false) { $success = !$this->constraint->evaluate($other, $description, true); if ($returnResult) { return $success; } if (!$success) { $this->fail($other, $description); } } /** * 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. * * @return string */ protected function failureDescription($other) { switch (get_class($this->constraint)) { case 'PHPUnit_Framework_Constraint_And': case 'PHPUnit_Framework_Constraint_Not': case 'PHPUnit_Framework_Constraint_Or': return 'not( ' . $this->constraint->failureDescription($other) . ' )'; default: return self::negate( $this->constraint->failureDescription($other) ); } } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { switch (get_class($this->constraint)) { case 'PHPUnit_Framework_Constraint_And': case 'PHPUnit_Framework_Constraint_Not': case 'PHPUnit_Framework_Constraint_Or': return 'not( ' . $this->constraint->toString() . ' )'; default: return self::negate( $this->constraint->toString() ); } } /** * Counts the number of constraint elements. * * @return int * * @since Method available since Release 3.4.0 */ public function count() { return count($this->constraint); } } phpunit-5.1.3/src/Framework/Constraint/ObjectHasAttribute.php000066400000000000000000000016351263222771600243330ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that asserts that the object it is evaluated for has a given * attribute. * * The attribute name is passed in the constructor. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_Constraint_ObjectHasAttribute extends PHPUnit_Framework_Constraint_ClassHasAttribute { /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { $object = new ReflectionObject($other); return $object->hasProperty($this->attributeName); } } phpunit-5.1.3/src/Framework/Constraint/Or.php000066400000000000000000000055341263222771600211670ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Logical OR. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_Constraint_Or extends PHPUnit_Framework_Constraint { /** * @var PHPUnit_Framework_Constraint[] */ protected $constraints = []; /** * @param PHPUnit_Framework_Constraint[] $constraints */ public function setConstraints(array $constraints) { $this->constraints = []; foreach ($constraints as $constraint) { if (!($constraint instanceof PHPUnit_Framework_Constraint)) { $constraint = new PHPUnit_Framework_Constraint_IsEqual( $constraint ); } $this->constraints[] = $constraint; } } /** * Evaluates the constraint for parameter $other * * If $returnResult is set to false (the default), an exception is thrown * in case of a failure. null is returned otherwise. * * If $returnResult is true, the result of the evaluation is returned as * a boolean value instead: true in case of success, false in case of a * failure. * * @param mixed $other Value or object to evaluate. * @param string $description Additional information about the test * @param bool $returnResult Whether to return a result or throw an exception * * @return mixed * * @throws PHPUnit_Framework_ExpectationFailedException */ public function evaluate($other, $description = '', $returnResult = false) { $success = false; $constraint = null; foreach ($this->constraints as $constraint) { if ($constraint->evaluate($other, $description, true)) { $success = true; break; } } if ($returnResult) { return $success; } if (!$success) { $this->fail($other, $description); } } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { $text = ''; foreach ($this->constraints as $key => $constraint) { if ($key > 0) { $text .= ' or '; } $text .= $constraint->toString(); } return $text; } /** * Counts the number of constraint elements. * * @return int * * @since Method available since Release 3.4.0 */ public function count() { $count = 0; foreach ($this->constraints as $constraint) { $count += count($constraint); } return $count; } } phpunit-5.1.3/src/Framework/Constraint/PCREMatch.php000066400000000000000000000026751263222771600223200ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that asserts that the string it is evaluated for matches * a regular expression. * * Checks a given value using the Perl Compatible Regular Expression extension * in PHP. The pattern is matched by executing preg_match(). * * The pattern string passed in the constructor. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_Constraint_PCREMatch extends PHPUnit_Framework_Constraint { /** * @var string */ protected $pattern; /** * @param string $pattern */ public function __construct($pattern) { parent::__construct(); $this->pattern = $pattern; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { return preg_match($this->pattern, $other) > 0; } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return sprintf( 'matches PCRE pattern "%s"', $this->pattern ); } } phpunit-5.1.3/src/Framework/Constraint/SameSize.php000066400000000000000000000011231263222771600223150ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 3.6.0 */ class PHPUnit_Framework_Constraint_SameSize extends PHPUnit_Framework_Constraint_Count { /** * @var int */ protected $expectedCount; /** * @param int $expected */ public function __construct($expected) { parent::__construct($this->getCountOf($expected)); } } phpunit-5.1.3/src/Framework/Constraint/StringContains.php000066400000000000000000000034621263222771600235520ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that asserts that the string it is evaluated for contains * a given string. * * Uses strpos() to find the position of the string in the input, if not found * the evaluation fails. * * The sub-string is passed in the constructor. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_Constraint_StringContains extends PHPUnit_Framework_Constraint { /** * @var string */ protected $string; /** * @var bool */ protected $ignoreCase; /** * @param string $string * @param bool $ignoreCase */ public function __construct($string, $ignoreCase = false) { parent::__construct(); $this->string = $string; $this->ignoreCase = $ignoreCase; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { if ($this->ignoreCase) { return stripos($other, $this->string) !== false; } else { return strpos($other, $this->string) !== false; } } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { if ($this->ignoreCase) { $string = strtolower($this->string); } else { $string = $this->string; } return sprintf( 'contains "%s"', $string ); } } phpunit-5.1.3/src/Framework/Constraint/StringEndsWith.php000066400000000000000000000023271263222771600235200ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that asserts that the string it is evaluated for ends with a given * suffix. * * @since Class available since Release 3.4.0 */ class PHPUnit_Framework_Constraint_StringEndsWith extends PHPUnit_Framework_Constraint { /** * @var string */ protected $suffix; /** * @param string $suffix */ public function __construct($suffix) { parent::__construct(); $this->suffix = $suffix; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { return substr($other, 0 - strlen($this->suffix)) == $this->suffix; } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'ends with "' . $this->suffix . '"'; } } phpunit-5.1.3/src/Framework/Constraint/StringMatches.php000066400000000000000000000044251263222771600233600ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use SebastianBergmann\Diff\Differ; /** * ... * * @since Class available since Release 3.5.0 */ class PHPUnit_Framework_Constraint_StringMatches extends PHPUnit_Framework_Constraint_PCREMatch { /** * @var string */ protected $string; /** * @param string $string */ public function __construct($string) { parent::__construct($string); $this->pattern = $this->createPatternFromFormat( preg_replace('/\r\n/', "\n", $string) ); $this->string = $string; } protected function failureDescription($other) { return 'format description matches text'; } protected function additionalFailureDescription($other) { $from = preg_split('(\r\n|\r|\n)', $this->string); $to = preg_split('(\r\n|\r|\n)', $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); $differ = new Differ("--- Expected\n+++ Actual\n"); return $differ->diff($this->string, $other); } protected function createPatternFromFormat($string) { $string = str_replace( [ '%e', '%s', '%S', '%a', '%A', '%w', '%i', '%d', '%x', '%f', '%c' ], [ '\\' . DIRECTORY_SEPARATOR, '[^\r\n]+', '[^\r\n]*', '.+', '.*', '\s*', '[+-]?\d+', '\d+', '[0-9a-fA-F]+', '[+-]?\.?\d+\.?\d*(?:[Ee][+-]?\d+)?', '.' ], preg_quote($string, '/') ); return '/^' . $string . '$/s'; } } phpunit-5.1.3/src/Framework/Constraint/StringStartsWith.php000066400000000000000000000023061263222771600241040ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that asserts that the string it is evaluated for begins with a * given prefix. * * @since Class available since Release 3.4.0 */ class PHPUnit_Framework_Constraint_StringStartsWith extends PHPUnit_Framework_Constraint { /** * @var string */ protected $prefix; /** * @param string $prefix */ public function __construct($prefix) { parent::__construct(); $this->prefix = $prefix; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { return strpos($other, $this->prefix) === 0; } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'starts with "' . $this->prefix . '"'; } } phpunit-5.1.3/src/Framework/Constraint/TraversableContains.php000066400000000000000000000066531263222771600245630ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that asserts that the Traversable it is applied to contains * a given value. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_Constraint_TraversableContains extends PHPUnit_Framework_Constraint { /** * @var bool */ protected $checkForObjectIdentity; /** * @var bool */ protected $checkForNonObjectIdentity; /** * @var mixed */ protected $value; /** * @param mixed $value * @param bool $checkForObjectIdentity * @param bool $checkForNonObjectIdentity * * @throws PHPUnit_Framework_Exception */ public function __construct($value, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) { parent::__construct(); if (!is_bool($checkForObjectIdentity)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'boolean'); } if (!is_bool($checkForNonObjectIdentity)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'boolean'); } $this->checkForObjectIdentity = $checkForObjectIdentity; $this->checkForNonObjectIdentity = $checkForNonObjectIdentity; $this->value = $value; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other Value or object to evaluate. * * @return bool */ protected function matches($other) { if ($other instanceof SplObjectStorage) { return $other->contains($this->value); } if (is_object($this->value)) { foreach ($other as $element) { if (($this->checkForObjectIdentity && $element === $this->value) || (!$this->checkForObjectIdentity && $element == $this->value)) { return true; } } } else { foreach ($other as $element) { if (($this->checkForNonObjectIdentity && $element === $this->value) || (!$this->checkForNonObjectIdentity && $element == $this->value)) { return true; } } } return false; } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { if (is_string($this->value) && strpos($this->value, "\n") !== false) { return 'contains "' . $this->value . '"'; } else { 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. * * @return string */ protected function failureDescription($other) { return sprintf( '%s %s', is_array($other) ? 'an array' : 'a traversable', $this->toString() ); } } phpunit-5.1.3/src/Framework/Constraint/TraversableContainsOnly.php000066400000000000000000000046551263222771600254250ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Constraint that asserts that the Traversable it is applied to contains * only values of a given type. * * @since Class available since Release 3.1.4 */ class PHPUnit_Framework_Constraint_TraversableContainsOnly extends PHPUnit_Framework_Constraint { /** * @var PHPUnit_Framework_Constraint */ protected $constraint; /** * @var string */ protected $type; /** * @param string $type * @param bool $isNativeType */ public function __construct($type, $isNativeType = true) { parent::__construct(); if ($isNativeType) { $this->constraint = new PHPUnit_Framework_Constraint_IsType($type); } else { $this->constraint = new PHPUnit_Framework_Constraint_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 $other Value or object to evaluate. * @param string $description Additional information about the test * @param bool $returnResult Whether to return a result or throw an exception * * @return mixed * * @throws PHPUnit_Framework_ExpectationFailedException */ public function evaluate($other, $description = '', $returnResult = false) { $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); } } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { return 'contains only values of type "' . $this->type . '"'; } } phpunit-5.1.3/src/Framework/Constraint/Xor.php000066400000000000000000000057171263222771600213620ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Logical XOR. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_Constraint_Xor extends PHPUnit_Framework_Constraint { /** * @var PHPUnit_Framework_Constraint[] */ protected $constraints = []; /** * @param PHPUnit_Framework_Constraint[] $constraints */ public function setConstraints(array $constraints) { $this->constraints = []; foreach ($constraints as $constraint) { if (!($constraint instanceof PHPUnit_Framework_Constraint)) { $constraint = new PHPUnit_Framework_Constraint_IsEqual( $constraint ); } $this->constraints[] = $constraint; } } /** * Evaluates the constraint for parameter $other * * If $returnResult is set to false (the default), an exception is thrown * in case of a failure. null is returned otherwise. * * If $returnResult is true, the result of the evaluation is returned as * a boolean value instead: true in case of success, false in case of a * failure. * * @param mixed $other Value or object to evaluate. * @param string $description Additional information about the test * @param bool $returnResult Whether to return a result or throw an exception * * @return mixed * * @throws PHPUnit_Framework_ExpectationFailedException */ public function evaluate($other, $description = '', $returnResult = false) { $success = true; $lastResult = null; $constraint = null; foreach ($this->constraints as $constraint) { $result = $constraint->evaluate($other, $description, true); if ($result === $lastResult) { $success = false; break; } $lastResult = $result; } if ($returnResult) { return $success; } if (!$success) { $this->fail($other, $description); } } /** * Returns a string representation of the constraint. * * @return string */ public function toString() { $text = ''; foreach ($this->constraints as $key => $constraint) { if ($key > 0) { $text .= ' xor '; } $text .= $constraint->toString(); } return $text; } /** * Counts the number of constraint elements. * * @return int * * @since Method available since Release 3.4.0 */ public function count() { $count = 0; foreach ($this->constraints as $constraint) { $count += count($constraint); } return $count; } } phpunit-5.1.3/src/Framework/Error.php000066400000000000000000000014441263222771600175500ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Wrapper for PHP errors. * * @since Class available since Release 2.2.0 */ class PHPUnit_Framework_Error extends PHPUnit_Framework_Exception { /** * Constructor. * * @param string $message * @param int $code * @param string $file * @param int $line * @param Exception $previous */ public function __construct($message, $code, $file, $line, Exception $previous = null) { parent::__construct($message, $code, $previous); $this->file = $file; $this->line = $line; } } phpunit-5.1.3/src/Framework/Error/000077500000000000000000000000001263222771600170345ustar00rootroot00000000000000phpunit-5.1.3/src/Framework/Error/Deprecated.php000066400000000000000000000011061263222771600216030ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Wrapper for PHP deprecated errors. * You can disable deprecated-to-exception conversion by setting * * * PHPUnit_Framework_Error_Deprecated::$enabled = false; * * * @since Class available since Release 3.3.0 */ class PHPUnit_Framework_Error_Deprecated extends PHPUnit_Framework_Error { public static $enabled = true; } phpunit-5.1.3/src/Framework/Error/Notice.php000066400000000000000000000010601263222771600207630ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Wrapper for PHP notices. * You can disable notice-to-exception conversion by setting * * * PHPUnit_Framework_Error_Notice::$enabled = false; * * * @since Class available since Release 3.3.0 */ class PHPUnit_Framework_Error_Notice extends PHPUnit_Framework_Error { public static $enabled = true; } phpunit-5.1.3/src/Framework/Error/Warning.php000066400000000000000000000010631263222771600211520ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Wrapper for PHP warnings. * You can disable notice-to-exception conversion by setting * * * PHPUnit_Framework_Error_Warning::$enabled = false; * * * @since Class available since Release 3.3.0 */ class PHPUnit_Framework_Error_Warning extends PHPUnit_Framework_Error { public static $enabled = true; } phpunit-5.1.3/src/Framework/Exception.php000066400000000000000000000044351263222771600204200ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * 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 * @since Class available since Release 3.4.0 */ class PHPUnit_Framework_Exception extends RuntimeException implements PHPUnit_Exception { /** * @var array */ protected $serializableTrace; public function __construct($message = '', $code = 0, Exception $previous = null) { parent::__construct($message, $code, $previous); $this->serializableTrace = $this->getTrace(); foreach ($this->serializableTrace as $i => $call) { unset($this->serializableTrace[$i]['args']); } } /** * Returns the serializable trace (without 'args'). * * @return array */ public function getSerializableTrace() { return $this->serializableTrace; } /** * @return string */ public function __toString() { $string = PHPUnit_Framework_TestFailure::exceptionToString($this); if ($trace = PHPUnit_Util_Filter::getFilteredStacktrace($this)) { $string .= "\n" . $trace; } return $string; } public function __sleep() { return array_keys(get_object_vars($this)); } } phpunit-5.1.3/src/Framework/ExceptionWrapper.php000066400000000000000000000042301263222771600217520ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Wraps Exceptions thrown by code under test. * * Re-instantiates Exceptions thrown by user-space code to retain their original * class names, properties, and stack traces (but without arguments). * * Unlike PHPUnit_Framework_Exception, the complete stack of previous Exceptions * is processed. * * @since Class available since Release 4.3.0 */ class PHPUnit_Framework_ExceptionWrapper extends PHPUnit_Framework_Exception { /** * @var string */ protected $classname; /** * @var PHPUnit_Framework_ExceptionWrapper|null */ protected $previous; /** * @param Throwable|Exception $e */ public function __construct($e) { // PDOException::getCode() is a string. // @see http://php.net/manual/en/class.pdoexception.php#95812 parent::__construct($e->getMessage(), (int) $e->getCode()); $this->classname = get_class($e); $this->file = $e->getFile(); $this->line = $e->getLine(); $this->serializableTrace = $e->getTrace(); foreach ($this->serializableTrace as $i => $call) { unset($this->serializableTrace[$i]['args']); } if ($e->getPrevious()) { $this->previous = new self($e->getPrevious()); } } /** * @return string */ public function getClassname() { return $this->classname; } /** * @return PHPUnit_Framework_ExceptionWrapper */ public function getPreviousWrapped() { return $this->previous; } /** * @return string */ public function __toString() { $string = PHPUnit_Framework_TestFailure::exceptionToString($this); if ($trace = PHPUnit_Util_Filter::getFilteredStacktrace($this)) { $string .= "\n" . $trace; } if ($this->previous) { $string .= "\nCaused by\n" . $this->previous; } return $string; } } phpunit-5.1.3/src/Framework/ExpectationFailedException.php000066400000000000000000000022311263222771600237210ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * 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. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_ExpectationFailedException extends PHPUnit_Framework_AssertionFailedError { /** * @var SebastianBergmann\Comparator\ComparisonFailure */ protected $comparisonFailure; public function __construct($message, SebastianBergmann\Comparator\ComparisonFailure $comparisonFailure = null, Exception $previous = null) { $this->comparisonFailure = $comparisonFailure; parent::__construct($message, 0, $previous); } /** * @return SebastianBergmann\Comparator\ComparisonFailure */ public function getComparisonFailure() { return $this->comparisonFailure; } } phpunit-5.1.3/src/Framework/IncompleteTest.php000066400000000000000000000007441263222771600214200ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A marker interface for marking any exception/error as result of an unit * test as incomplete implementation or currently not implemented. * * @since Interface available since Release 2.0.0 */ interface PHPUnit_Framework_IncompleteTest { } phpunit-5.1.3/src/Framework/IncompleteTestCase.php000066400000000000000000000030651263222771600222130ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * An incomplete test case * * @since Class available since Release 4.3.0 */ class PHPUnit_Framework_IncompleteTestCase extends PHPUnit_Framework_TestCase { /** * @var string */ protected $message = ''; /** * @var bool */ protected $backupGlobals = false; /** * @var bool */ protected $backupStaticAttributes = false; /** * @var bool */ protected $runTestInSeparateProcess = false; /** * @var bool */ protected $useErrorHandler = false; /** * @var bool */ protected $useOutputBuffering = false; /** * @param string $className * @param string $methodName * @param string $message */ public function __construct($className, $methodName, $message = '') { $this->message = $message; parent::__construct($className . '::' . $methodName); } /** * @throws PHPUnit_Framework_Exception */ protected function runTest() { $this->markTestIncomplete($this->message); } /** * @return string */ public function getMessage() { return $this->message; } /** * Returns a string representation of the test case. * * @return string */ public function toString() { return $this->getName(); } } phpunit-5.1.3/src/Framework/IncompleteTestError.php000066400000000000000000000010231263222771600224210ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Extension to PHPUnit_Framework_AssertionFailedError to mark the special * case of an incomplete test. * * @since Class available since Release 2.0.0 */ class PHPUnit_Framework_IncompleteTestError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_IncompleteTest { } phpunit-5.1.3/src/Framework/InvalidCoversTargetError.php000066400000000000000000000011021263222771600233770ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Extension to PHPUnit_Framework_AssertionFailedError to mark the special * case of a test that is skipped because of an invalid @covers annotation. * * @since Class available since Release 4.0.0 */ class PHPUnit_Framework_InvalidCoversTargetError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_SkippedTest { } phpunit-5.1.3/src/Framework/InvalidCoversTargetException.php000066400000000000000000000006041263222771600242520ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 4.0.0 */ class PHPUnit_Framework_InvalidCoversTargetException extends PHPUnit_Framework_CodeCoverageException { } phpunit-5.1.3/src/Framework/OutputError.php000066400000000000000000000007471263222771600207760ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Extension to PHPUnit_Framework_AssertionFailedError to mark the special * case of a test that printed output. * * @since Class available since Release 3.6.0 */ class PHPUnit_Framework_OutputError extends PHPUnit_Framework_AssertionFailedError { } phpunit-5.1.3/src/Framework/RiskyTest.php000066400000000000000000000006561263222771600204240ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A marker interface for marking any exception/error as result of an unit * test as risky. * * @since Interface available since Release 4.0.0 */ interface PHPUnit_Framework_RiskyTest { } phpunit-5.1.3/src/Framework/RiskyTestError.php000066400000000000000000000010031263222771600214210ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Extension to PHPUnit_Framework_AssertionFailedError to mark the special * case of a risky test. * * @since Class available since Release 4.0.0 */ class PHPUnit_Framework_RiskyTestError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_RiskyTest { } phpunit-5.1.3/src/Framework/SelfDescribing.php000066400000000000000000000010331263222771600213340ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Interface for classes that can return a description of itself. * * @since Interface available since Release 3.0.0 */ interface PHPUnit_Framework_SelfDescribing { /** * Returns a string representation of the object. * * @return string */ public function toString(); } phpunit-5.1.3/src/Framework/SkippedTest.php000066400000000000000000000006231263222771600207140ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A marker interface for marking a unit test as being skipped. * * @since Interface available since Release 3.0.0 */ interface PHPUnit_Framework_SkippedTest { } phpunit-5.1.3/src/Framework/SkippedTestCase.php000066400000000000000000000027521263222771600215150ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A skipped test case * * @since Class available since Release 4.3.0 */ class PHPUnit_Framework_SkippedTestCase extends PHPUnit_Framework_TestCase { /** * @var string */ protected $message = ''; /** * @var bool */ protected $backupGlobals = false; /** * @var bool */ protected $backupStaticAttributes = false; /** * @var bool */ protected $runTestInSeparateProcess = false; /** * @var bool */ protected $useErrorHandler = false; /** * @var bool */ protected $useOutputBuffering = false; /** * @param string $message */ public function __construct($className, $methodName, $message = '') { $this->message = $message; parent::__construct($className . '::' . $methodName); } /** * @throws PHPUnit_Framework_Exception */ protected function runTest() { $this->markTestSkipped($this->message); } /** * @return string */ public function getMessage() { return $this->message; } /** * Returns a string representation of the test case. * * @return string */ public function toString() { return $this->getName(); } } phpunit-5.1.3/src/Framework/SkippedTestError.php000066400000000000000000000010111263222771600217160ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Extension to PHPUnit_Framework_AssertionFailedError to mark the special * case of a skipped test. * * @since Class available since Release 3.0.0 */ class PHPUnit_Framework_SkippedTestError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_SkippedTest { } phpunit-5.1.3/src/Framework/SkippedTestSuiteError.php000066400000000000000000000010241263222771600227340ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Extension to PHPUnit_Framework_AssertionFailedError to mark the special * case of a skipped test suite. * * @since Class available since Release 3.1.0 */ class PHPUnit_Framework_SkippedTestSuiteError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_SkippedTest { } phpunit-5.1.3/src/Framework/SyntheticError.php000066400000000000000000000030111263222771600214330ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Creates a synthetic failed assertion. * * @since Class available since Release 3.5.0 */ class PHPUnit_Framework_SyntheticError extends PHPUnit_Framework_AssertionFailedError { /** * The synthetic file. * * @var string */ protected $syntheticFile = ''; /** * The synthetic line number. * * @var int */ protected $syntheticLine = 0; /** * The synthetic trace. * * @var array */ protected $syntheticTrace = []; /** * Constructor. * * @param string $message * @param int $code * @param string $file * @param int $line * @param array $trace */ public function __construct($message, $code, $file, $line, $trace) { parent::__construct($message, $code); $this->syntheticFile = $file; $this->syntheticLine = $line; $this->syntheticTrace = $trace; } /** * @return string */ public function getSyntheticFile() { return $this->syntheticFile; } /** * @return int */ public function getSyntheticLine() { return $this->syntheticLine; } /** * @return array */ public function getSyntheticTrace() { return $this->syntheticTrace; } } phpunit-5.1.3/src/Framework/Test.php000066400000000000000000000012241263222771600173720ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A Test can be run and collect its results. * * @since Interface available since Release 2.0.0 */ interface PHPUnit_Framework_Test extends Countable { /** * Runs a test and collects its result in a TestResult instance. * * @param PHPUnit_Framework_TestResult $result * * @return PHPUnit_Framework_TestResult */ public function run(PHPUnit_Framework_TestResult $result = null); } phpunit-5.1.3/src/Framework/TestCase.php000066400000000000000000002016541263222771600201770ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use SebastianBergmann\GlobalState\Snapshot; use SebastianBergmann\GlobalState\Restorer; use SebastianBergmann\GlobalState\Blacklist; use SebastianBergmann\Diff\Differ; use SebastianBergmann\Exporter\Exporter; use Prophecy\Exception\Prediction\PredictionException; use Prophecy\Prophet; use DeepCopy\DeepCopy; /** * A TestCase defines the fixture to run multiple tests. * * To define a TestCase * * 1) Implement a subclass of PHPUnit_Framework_TestCase. * 2) Define instance variables that store the state of the fixture. * 3) Initialize the fixture state by overriding setUp(). * 4) Clean-up after a test by overriding tearDown(). * * Each test runs in its own fixture so there can be no side effects * among test runs. * * Here is an example: * * * value1 = 2; * $this->value2 = 3; * } * } * ?> * * * For each test implement a method which interacts with the fixture. * Verify the expected results with assertions specified by calling * assert with a boolean. * * * assertTrue($this->value1 + $this->value2 == 5); * } * ?> * * * @since Class available since Release 2.0.0 */ abstract class PHPUnit_Framework_TestCase extends PHPUnit_Framework_Assert implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing { /** * Enable or disable the backup and restoration of the $GLOBALS array. * Overwrite this attribute in a child class of TestCase. * Setting this attribute in setUp() has no effect! * * @var bool */ protected $backupGlobals = null; /** * @var array */ protected $backupGlobalsBlacklist = []; /** * Enable or disable the backup and restoration of static attributes. * Overwrite this attribute in a child class of TestCase. * Setting this attribute in setUp() has no effect! * * @var bool */ protected $backupStaticAttributes = null; /** * @var array */ protected $backupStaticAttributesBlacklist = []; /** * Whether or not this test is to be run in a separate PHP process. * * @var bool */ protected $runTestInSeparateProcess = null; /** * Whether or not this test should preserve the global state when * running in a separate PHP process. * * @var bool */ protected $preserveGlobalState = true; /** * Whether or not this test is running in a separate PHP process. * * @var bool */ private $inIsolation = false; /** * @var array */ private $data = []; /** * @var string */ private $dataName = ''; /** * @var bool */ private $useErrorHandler = null; /** * The name of the expected Exception. * * @var mixed */ private $expectedException = null; /** * The message of the expected Exception. * * @var string */ private $expectedExceptionMessage = ''; /** * The regex pattern to validate the expected Exception message. * * @var string */ private $expectedExceptionMessageRegExp = ''; /** * The code of the expected Exception. * * @var int */ private $expectedExceptionCode; /** * The name of the test case. * * @var string */ private $name = null; /** * @var array */ private $dependencies = []; /** * @var array */ private $dependencyInput = []; /** * @var array */ private $iniSettings = []; /** * @var array */ private $locale = []; /** * @var array */ private $mockObjects = []; /** * @var array */ private $mockObjectGenerator = null; /** * @var int */ private $status; /** * @var string */ private $statusMessage = ''; /** * @var int */ private $numAssertions = 0; /** * @var PHPUnit_Framework_TestResult */ private $result; /** * @var mixed */ private $testResult; /** * @var string */ private $output = ''; /** * @var string */ private $outputExpectedRegex = null; /** * @var string */ private $outputExpectedString = null; /** * @var mixed */ private $outputCallback = false; /** * @var bool */ private $outputBufferingActive = false; /** * @var int */ private $outputBufferingLevel; /** * @var SebastianBergmann\GlobalState\Snapshot */ private $snapshot; /** * @var Prophecy\Prophet */ private $prophet; /** * @var bool */ private $beStrictAboutChangesToGlobalState = false; /** * Constructs a test case with the given name. * * @param string $name * @param array $data * @param string $dataName */ public function __construct($name = null, array $data = [], $dataName = '') { if ($name !== null) { $this->setName($name); } $this->data = $data; $this->dataName = $dataName; } /** * Returns a string representation of the test case. * * @return string */ public function toString() { $class = new ReflectionClass($this); $buffer = sprintf( '%s::%s', $class->name, $this->getName(false) ); return $buffer . $this->getDataSetAsString(); } /** * Counts the number of test cases executed by run(TestResult result). * * @return int */ public function count() { return 1; } /** * Returns the annotations for this test. * * @return array * * @since Method available since Release 3.4.0 */ public function getAnnotations() { return PHPUnit_Util_Test::parseTestMethodAnnotations( get_class($this), $this->name ); } /** * Gets the name of a TestCase. * * @param bool $withDataSet * * @return string */ public function getName($withDataSet = true) { if ($withDataSet) { return $this->name . $this->getDataSetAsString(false); } else { return $this->name; } } /** * Returns the size of the test. * * @return int * * @since Method available since Release 3.6.0 */ public function getSize() { return PHPUnit_Util_Test::getSize( get_class($this), $this->getName(false) ); } /** * @return string * * @since Method available since Release 3.6.0 */ public function getActualOutput() { if (!$this->outputBufferingActive) { return $this->output; } else { return ob_get_contents(); } } /** * @return bool * * @since Method available since Release 3.6.0 */ public function hasOutput() { if (strlen($this->output) === 0) { return false; } if ($this->hasExpectationOnOutput()) { return false; } return true; } /** * @param string $expectedRegex * * @since Method available since Release 3.6.0 * * @throws PHPUnit_Framework_Exception */ public function expectOutputRegex($expectedRegex) { if ($this->outputExpectedString !== null) { throw new PHPUnit_Framework_Exception; } if (is_string($expectedRegex) || is_null($expectedRegex)) { $this->outputExpectedRegex = $expectedRegex; } } /** * @param string $expectedString * * @since Method available since Release 3.6.0 */ public function expectOutputString($expectedString) { if ($this->outputExpectedRegex !== null) { throw new PHPUnit_Framework_Exception; } if (is_string($expectedString) || is_null($expectedString)) { $this->outputExpectedString = $expectedString; } } /** * @return bool * * @since Method available since Release 3.6.5 * @deprecated */ public function hasPerformedExpectationsOnOutput() { return $this->hasExpectationOnOutput(); } /** * @return bool * * @since Method available since Release 4.3.3 */ public function hasExpectationOnOutput() { return is_string($this->outputExpectedString) || is_string($this->outputExpectedRegex); } /** * @return string * * @since Method available since Release 3.2.0 */ public function getExpectedException() { return $this->expectedException; } /** * @param mixed $exceptionName * @param string $exceptionMessage * @param int $exceptionCode * * @since Method available since Release 3.2.0 */ public function setExpectedException($exceptionName, $exceptionMessage = '', $exceptionCode = null) { $this->expectedException = $exceptionName; $this->expectedExceptionMessage = $exceptionMessage; $this->expectedExceptionCode = $exceptionCode; } /** * @param mixed $exceptionName * @param string $exceptionMessageRegExp * @param int $exceptionCode * * @since Method available since Release 4.3.0 */ public function setExpectedExceptionRegExp($exceptionName, $exceptionMessageRegExp = '', $exceptionCode = null) { $this->expectedException = $exceptionName; $this->expectedExceptionMessageRegExp = $exceptionMessageRegExp; $this->expectedExceptionCode = $exceptionCode; } /** * @since Method available since Release 3.4.0 */ protected function setExpectedExceptionFromAnnotation() { try { $expectedException = PHPUnit_Util_Test::getExpectedException( get_class($this), $this->name ); if ($expectedException !== false) { $this->setExpectedException( $expectedException['class'], $expectedException['message'], $expectedException['code'] ); if (!empty($expectedException['message_regex'])) { $this->setExpectedExceptionRegExp( $expectedException['class'], $expectedException['message_regex'], $expectedException['code'] ); } } } catch (ReflectionException $e) { } } /** * @param bool $useErrorHandler * * @since Method available since Release 3.4.0 */ public function setUseErrorHandler($useErrorHandler) { $this->useErrorHandler = $useErrorHandler; } /** * @since Method available since Release 3.4.0 */ protected function setUseErrorHandlerFromAnnotation() { try { $useErrorHandler = PHPUnit_Util_Test::getErrorHandlerSettings( get_class($this), $this->name ); if ($useErrorHandler !== null) { $this->setUseErrorHandler($useErrorHandler); } } catch (ReflectionException $e) { } } /** * @since Method available since Release 3.6.0 */ protected function checkRequirements() { if (!$this->name || !method_exists($this, $this->name)) { return; } $missingRequirements = PHPUnit_Util_Test::getMissingRequirements( get_class($this), $this->name ); if (!empty($missingRequirements)) { $this->markTestSkipped(implode(PHP_EOL, $missingRequirements)); } } /** * Returns the status of this test. * * @return int * * @since Method available since Release 3.1.0 */ public function getStatus() { return $this->status; } /** * Returns the status message of this test. * * @return string * * @since Method available since Release 3.3.0 */ public function getStatusMessage() { return $this->statusMessage; } /** * Returns whether or not this test has failed. * * @return bool * * @since Method available since Release 3.0.0 */ public function hasFailed() { $status = $this->getStatus(); return $status == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE || $status == PHPUnit_Runner_BaseTestRunner::STATUS_ERROR; } /** * Runs the test case and collects the results in a TestResult object. * If no TestResult object is passed a new one will be created. * * @param PHPUnit_Framework_TestResult $result * * @return PHPUnit_Framework_TestResult * * @throws PHPUnit_Framework_Exception */ public function run(PHPUnit_Framework_TestResult $result = null) { if ($result === null) { $result = $this->createResult(); } if (!$this instanceof PHPUnit_Framework_WarningTestCase) { $this->setTestResultObject($result); $this->setUseErrorHandlerFromAnnotation(); } if ($this->useErrorHandler !== null) { $oldErrorHandlerSetting = $result->getConvertErrorsToExceptions(); $result->convertErrorsToExceptions($this->useErrorHandler); } if (!$this instanceof PHPUnit_Framework_WarningTestCase && !$this->handleDependencies()) { return; } if ($this->runTestInSeparateProcess === true && $this->inIsolation !== true && !$this instanceof PHPUnit_Extensions_PhptTestCase) { $class = new ReflectionClass($this); $template = new Text_Template( __DIR__ . '/../Util/PHP/Template/TestCaseMethod.tpl' ); if ($this->preserveGlobalState) { $constants = PHPUnit_Util_GlobalState::getConstantsAsString(); $globals = PHPUnit_Util_GlobalState::getGlobalsAsString(); $includedFiles = PHPUnit_Util_GlobalState::getIncludedFilesAsString(); $iniSettings = PHPUnit_Util_GlobalState::getIniSettingsAsString(); } else { $constants = ''; if (!empty($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { $globals = '$GLOBALS[\'__PHPUNIT_BOOTSTRAP\'] = ' . var_export($GLOBALS['__PHPUNIT_BOOTSTRAP'], true) . ";\n"; } else { $globals = ''; } $includedFiles = ''; $iniSettings = ''; } $coverage = $result->getCollectCodeCoverageInformation() ? 'true' : 'false'; $isStrictAboutTestsThatDoNotTestAnything = $result->isStrictAboutTestsThatDoNotTestAnything() ? 'true' : 'false'; $isStrictAboutOutputDuringTests = $result->isStrictAboutOutputDuringTests() ? 'true' : 'false'; $enforcesTimeLimit = $result->enforcesTimeLimit() ? 'true' : 'false'; $isStrictAboutTodoAnnotatedTests = $result->isStrictAboutTodoAnnotatedTests() ? 'true' : 'false'; $isStrictAboutResourceUsageDuringSmallTests = $result->isStrictAboutResourceUsageDuringSmallTests() ? 'true' : 'false'; if (defined('PHPUNIT_COMPOSER_INSTALL')) { $composerAutoload = var_export(PHPUNIT_COMPOSER_INSTALL, true); } else { $composerAutoload = '\'\''; } if (defined('__PHPUNIT_PHAR__')) { $phar = var_export(__PHPUNIT_PHAR__, true); } else { $phar = '\'\''; } if ($result->getCodeCoverage()) { $codeCoverageFilter = $result->getCodeCoverage()->filter(); } else { $codeCoverageFilter = null; } $data = var_export(serialize($this->data), true); $dataName = var_export($this->dataName, true); $dependencyInput = var_export(serialize($this->dependencyInput), true); $includePath = var_export(get_include_path(), true); $codeCoverageFilter = var_export(serialize($codeCoverageFilter), true); // must do these fixes because TestCaseMethod.tpl has unserialize('{data}') in it, and we can't break BC // the lines above used to use addcslashes() rather than var_export(), which breaks null byte escape sequences $data = "'." . $data . ".'"; $dataName = "'.(" . $dataName . ").'"; $dependencyInput = "'." . $dependencyInput . ".'"; $includePath = "'." . $includePath . ".'"; $codeCoverageFilter = "'." . $codeCoverageFilter . ".'"; $configurationFilePath = (isset($GLOBALS['__PHPUNIT_CONFIGURATION_FILE']) ? $GLOBALS['__PHPUNIT_CONFIGURATION_FILE'] : ''); $template->setVar( [ 'composerAutoload' => $composerAutoload, 'phar' => $phar, 'filename' => $class->getFileName(), 'className' => $class->getName(), 'methodName' => $this->name, 'collectCodeCoverageInformation' => $coverage, 'data' => $data, 'dataName' => $dataName, 'dependencyInput' => $dependencyInput, 'constants' => $constants, 'globals' => $globals, 'include_path' => $includePath, 'included_files' => $includedFiles, 'iniSettings' => $iniSettings, 'isStrictAboutTestsThatDoNotTestAnything' => $isStrictAboutTestsThatDoNotTestAnything, 'isStrictAboutOutputDuringTests' => $isStrictAboutOutputDuringTests, 'enforcesTimeLimit' => $enforcesTimeLimit, 'isStrictAboutTodoAnnotatedTests' => $isStrictAboutTodoAnnotatedTests, 'isStrictAboutResourceUsageDuringSmallTests' => $isStrictAboutResourceUsageDuringSmallTests, 'codeCoverageFilter' => $codeCoverageFilter, 'configurationFilePath' => $configurationFilePath ] ); $this->prepareTemplate($template); $php = PHPUnit_Util_PHP::factory(); $php->runTestJob($template->render(), $this, $result); } else { $result->run($this); } if ($this->useErrorHandler !== null) { $result->convertErrorsToExceptions($oldErrorHandlerSetting); } $this->result = null; return $result; } /** * Runs the bare test sequence. */ public function runBare() { $this->numAssertions = 0; $this->snapshotGlobalState(); $this->startOutputBuffering(); clearstatcache(); $currentWorkingDirectory = getcwd(); $hookMethods = PHPUnit_Util_Test::getHookMethods(get_class($this)); try { $hasMetRequirements = false; $this->checkRequirements(); $hasMetRequirements = true; if ($this->inIsolation) { foreach ($hookMethods['beforeClass'] as $method) { $this->$method(); } } $this->setExpectedExceptionFromAnnotation(); foreach ($hookMethods['before'] as $method) { $this->$method(); } $this->assertPreConditions(); $this->testResult = $this->runTest(); $this->verifyMockObjects(); $this->assertPostConditions(); $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_PASSED; } catch (PHPUnit_Framework_IncompleteTest $e) { $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE; $this->statusMessage = $e->getMessage(); } catch (PHPUnit_Framework_SkippedTest $e) { $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED; $this->statusMessage = $e->getMessage(); } catch (PHPUnit_Framework_Warning $e) { $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_WARNING; $this->statusMessage = $e->getMessage(); } catch (PHPUnit_Framework_AssertionFailedError $e) { $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE; $this->statusMessage = $e->getMessage(); } catch (PredictionException $e) { $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE; $this->statusMessage = $e->getMessage(); } catch (Throwable $_e) { $e = $_e; } catch (Exception $_e) { $e = $_e; } if (isset($_e)) { $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_ERROR; $this->statusMessage = $_e->getMessage(); } // Clean up the mock objects. $this->mockObjects = []; $this->prophet = null; // Tear down the fixture. An exception raised in tearDown() will be // caught and passed on when no exception was raised before. try { if ($hasMetRequirements) { foreach ($hookMethods['after'] as $method) { $this->$method(); } if ($this->inIsolation) { foreach ($hookMethods['afterClass'] as $method) { $this->$method(); } } } } catch (Throwable $_e) { if (!isset($e)) { $e = $_e; } } catch (Exception $_e) { if (!isset($e)) { $e = $_e; } } try { $this->stopOutputBuffering(); } catch (PHPUnit_Framework_RiskyTestError $_e) { if (!isset($e)) { $e = $_e; } } clearstatcache(); if ($currentWorkingDirectory != getcwd()) { chdir($currentWorkingDirectory); } $this->restoreGlobalState(); // Clean up INI settings. foreach ($this->iniSettings as $varName => $oldValue) { ini_set($varName, $oldValue); } $this->iniSettings = []; // Clean up locale settings. foreach ($this->locale as $category => $locale) { setlocale($category, $locale); } // Perform assertion on output. if (!isset($e)) { try { if ($this->outputExpectedRegex !== null) { $this->assertRegExp($this->outputExpectedRegex, $this->output); } elseif ($this->outputExpectedString !== null) { $this->assertEquals($this->outputExpectedString, $this->output); } } catch (Throwable $_e) { $e = $_e; } catch (Exception $_e) { $e = $_e; } } // Workaround for missing "finally". if (isset($e)) { if ($e instanceof PredictionException) { $e = new PHPUnit_Framework_AssertionFailedError($e->getMessage()); } $this->onNotSuccessfulTest($e); } } /** * Override to run the test and assert its state. * * @return mixed * * @throws Exception|PHPUnit_Framework_Exception * @throws PHPUnit_Framework_Exception */ protected function runTest() { if ($this->name === null) { throw new PHPUnit_Framework_Exception( 'PHPUnit_Framework_TestCase::$name must not be null.' ); } try { $class = new ReflectionClass($this); $method = $class->getMethod($this->name); } catch (ReflectionException $e) { $this->fail($e->getMessage()); } $testArguments = array_merge($this->data, $this->dependencyInput); $this->registerMockObjectsFromTestArguments($testArguments); try { $testResult = $method->invokeArgs($this, $testArguments); } catch (Throwable $_e) { $e = $_e; } catch (Exception $_e) { $e = $_e; } if (isset($e)) { $checkException = false; if (is_string($this->expectedException)) { $checkException = true; if ($e instanceof PHPUnit_Framework_Exception) { $checkException = false; } $reflector = new ReflectionClass($this->expectedException); if ($this->expectedException == 'PHPUnit_Framework_Exception' || $reflector->isSubclassOf('PHPUnit_Framework_Exception')) { $checkException = true; } } if ($checkException) { $this->assertThat( $e, new PHPUnit_Framework_Constraint_Exception( $this->expectedException ) ); if (is_string($this->expectedExceptionMessage) && !empty($this->expectedExceptionMessage)) { $this->assertThat( $e, new PHPUnit_Framework_Constraint_ExceptionMessage( $this->expectedExceptionMessage ) ); } if (is_string($this->expectedExceptionMessageRegExp) && !empty($this->expectedExceptionMessageRegExp)) { $this->assertThat( $e, new PHPUnit_Framework_Constraint_ExceptionMessageRegExp( $this->expectedExceptionMessageRegExp ) ); } if ($this->expectedExceptionCode !== null) { $this->assertThat( $e, new PHPUnit_Framework_Constraint_ExceptionCode( $this->expectedExceptionCode ) ); } return; } else { throw $e; } } if ($this->expectedException !== null) { $this->assertThat( null, new PHPUnit_Framework_Constraint_Exception( $this->expectedException ) ); } return $testResult; } /** * Verifies the mock object expectations. * * @since Method available since Release 3.5.0 */ protected function verifyMockObjects() { foreach ($this->mockObjects as $mockObject) { if ($mockObject->__phpunit_hasMatchers()) { $this->numAssertions++; } $mockObject->__phpunit_verify( $this->shouldInvocationMockerBeReset($mockObject) ); } if ($this->prophet !== null) { try { $this->prophet->checkPredictions(); } catch (Throwable $t) { /* Intentionally left empty */ } catch (Exception $e) { /* Intentionally left empty */ } foreach ($this->prophet->getProphecies() as $objectProphecy) { foreach ($objectProphecy->getMethodProphecies() as $methodProphecies) { foreach ($methodProphecies as $methodProphecy) { $this->numAssertions += count($methodProphecy->getCheckedPredictions()); } } } if (isset($e)) { throw $e; } } } /** * Sets the name of a TestCase. * * @param string */ public function setName($name) { $this->name = $name; } /** * Sets the dependencies of a TestCase. * * @param array $dependencies * * @since Method available since Release 3.4.0 */ public function setDependencies(array $dependencies) { $this->dependencies = $dependencies; } /** * Returns true if the tests has dependencies * * @return bool * * @since Method available since Release 4.0.0 */ public function hasDependencies() { return count($this->dependencies) > 0; } /** * Sets * * @param array $dependencyInput * * @since Method available since Release 3.4.0 */ public function setDependencyInput(array $dependencyInput) { $this->dependencyInput = $dependencyInput; } /** * @param bool $beStrictAboutChangesToGlobalState * * @since Method available since Release 4.6.0 */ public function setbeStrictAboutChangesToGlobalState($beStrictAboutChangesToGlobalState) { $this->beStrictAboutChangesToGlobalState = $beStrictAboutChangesToGlobalState; } /** * Calling this method in setUp() has no effect! * * @param bool $backupGlobals * * @since Method available since Release 3.3.0 */ public function setBackupGlobals($backupGlobals) { if (is_null($this->backupGlobals) && is_bool($backupGlobals)) { $this->backupGlobals = $backupGlobals; } } /** * Calling this method in setUp() has no effect! * * @param bool $backupStaticAttributes * * @since Method available since Release 3.4.0 */ public function setBackupStaticAttributes($backupStaticAttributes) { if (is_null($this->backupStaticAttributes) && is_bool($backupStaticAttributes)) { $this->backupStaticAttributes = $backupStaticAttributes; } } /** * @param bool $runTestInSeparateProcess * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.4.0 */ public function setRunTestInSeparateProcess($runTestInSeparateProcess) { if (is_bool($runTestInSeparateProcess)) { if ($this->runTestInSeparateProcess === null) { $this->runTestInSeparateProcess = $runTestInSeparateProcess; } } else { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } } /** * @param bool $preserveGlobalState * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.4.0 */ public function setPreserveGlobalState($preserveGlobalState) { if (is_bool($preserveGlobalState)) { $this->preserveGlobalState = $preserveGlobalState; } else { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } } /** * @param bool $inIsolation * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.4.0 */ public function setInIsolation($inIsolation) { if (is_bool($inIsolation)) { $this->inIsolation = $inIsolation; } else { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } } /** * @return bool * * @since Method available since Release 4.3.0 */ public function isInIsolation() { return $this->inIsolation; } /** * @return mixed * * @since Method available since Release 3.4.0 */ public function getResult() { return $this->testResult; } /** * @param mixed $result * * @since Method available since Release 3.4.0 */ public function setResult($result) { $this->testResult = $result; } /** * @param callable $callback * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.6.0 */ public function setOutputCallback($callback) { if (!is_callable($callback)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'callback'); } $this->outputCallback = $callback; } /** * @return PHPUnit_Framework_TestResult * * @since Method available since Release 3.5.7 */ public function getTestResultObject() { return $this->result; } /** * @param PHPUnit_Framework_TestResult $result * * @since Method available since Release 3.6.0 */ public function setTestResultObject(PHPUnit_Framework_TestResult $result) { $this->result = $result; } /** * This method is a wrapper for the ini_set() function that automatically * resets the modified php.ini setting to its original value after the * test is run. * * @param string $varName * @param string $newValue * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.0.0 */ protected function iniSet($varName, $newValue) { if (!is_string($varName)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } $currentValue = ini_set($varName, $newValue); if ($currentValue !== false) { $this->iniSettings[$varName] = $currentValue; } else { throw new PHPUnit_Framework_Exception( sprintf( 'INI setting "%s" could not be set to "%s".', $varName, $newValue ) ); } } /** * This method is a wrapper for the setlocale() function that automatically * resets the locale to its original value after the test is run. * * @param int $category * @param string $locale * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.1.0 */ protected function setLocale() { $args = func_get_args(); if (count($args) < 2) { throw new PHPUnit_Framework_Exception; } $category = $args[0]; $locale = $args[1]; $categories = [ LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME ]; if (defined('LC_MESSAGES')) { $categories[] = LC_MESSAGES; } if (!in_array($category, $categories)) { throw new PHPUnit_Framework_Exception; } if (!is_array($locale) && !is_string($locale)) { throw new PHPUnit_Framework_Exception; } $this->locale[$category] = setlocale($category, null); $result = call_user_func_array('setlocale', $args); if ($result === false) { throw new PHPUnit_Framework_Exception( 'The locale functionality is not implemented on your platform, ' . 'the specified locale does not exist or the category name is ' . 'invalid.' ); } } /** * Returns a mock object for the specified class. * * @param string $originalClassName Name of the class to mock. * @param array|null $methods When provided, only methods whose names are in the array * are replaced with a configurable test double. The behavior * of the other methods is not changed. * Providing null means that no methods will be replaced. * @param array $arguments Parameters to pass to the original class' constructor. * @param string $mockClassName Class name for the generated test double class. * @param bool $callOriginalConstructor Can be used to disable the call to the original class' constructor. * @param bool $callOriginalClone Can be used to disable the call to the original class' clone constructor. * @param bool $callAutoload Can be used to disable __autoload() during the generation of the test double class. * @param bool $cloneArguments * @param bool $callOriginalMethods * * @return PHPUnit_Framework_MockObject_MockObject * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.0.0 */ public function getMock($originalClassName, $methods = [], array $arguments = [], $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false, $callOriginalMethods = false) { $mockObject = $this->getMockObjectGenerator()->getMock( $originalClassName, $methods, $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $cloneArguments, $callOriginalMethods ); $this->mockObjects[] = $mockObject; return $mockObject; } /** * Returns a mock with disabled constructor object for the specified class. * * @param string $originalClassName * * @return PHPUnit_Framework_MockObject_MockObject * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 5.0.0 */ public function getMockWithoutInvokingTheOriginalConstructor($originalClassName) { return $this->getMockBuilder($originalClassName) ->disableOriginalConstructor() ->getMock(); } /** * Returns a builder object to create mock objects using a fluent interface. * * @param string $className * * @return PHPUnit_Framework_MockObject_MockBuilder * * @since Method available since Release 3.5.0 */ public function getMockBuilder($className) { return new PHPUnit_Framework_MockObject_MockBuilder($this, $className); } /** * Mocks the specified class and returns the name of the mocked class. * * @param string $originalClassName * @param array $methods * @param array $arguments * @param string $mockClassName * @param bool $callOriginalConstructor * @param bool $callOriginalClone * @param bool $callAutoload * @param bool $cloneArguments * * @return string * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.5.0 */ protected function getMockClass($originalClassName, $methods = [], array $arguments = [], $mockClassName = '', $callOriginalConstructor = false, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false) { $mock = $this->getMock( $originalClassName, $methods, $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $cloneArguments ); return get_class($mock); } /** * Returns a mock object for the specified abstract class with all abstract * methods of the class mocked. Concrete methods are not mocked by default. * To mock concrete methods, use the 7th parameter ($mockedMethods). * * @param string $originalClassName * @param array $arguments * @param string $mockClassName * @param bool $callOriginalConstructor * @param bool $callOriginalClone * @param bool $callAutoload * @param array $mockedMethods * @param bool $cloneArguments * * @return PHPUnit_Framework_MockObject_MockObject * * @since Method available since Release 3.4.0 * * @throws PHPUnit_Framework_Exception */ public function getMockForAbstractClass($originalClassName, array $arguments = [], $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $mockedMethods = [], $cloneArguments = false) { $mockObject = $this->getMockObjectGenerator()->getMockForAbstractClass( $originalClassName, $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $mockedMethods, $cloneArguments ); $this->mockObjects[] = $mockObject; return $mockObject; } /** * Returns a mock object based on the given WSDL file. * * @param string $wsdlFile * @param string $originalClassName * @param string $mockClassName * @param array $methods * @param bool $callOriginalConstructor * @param array $options An array of options passed to SOAPClient::_construct * * @return PHPUnit_Framework_MockObject_MockObject * * @since Method available since Release 3.4.0 */ protected function getMockFromWsdl($wsdlFile, $originalClassName = '', $mockClassName = '', array $methods = [], $callOriginalConstructor = true, array $options = []) { if ($originalClassName === '') { $originalClassName = str_replace('.wsdl', '', basename($wsdlFile)); } if (!class_exists($originalClassName)) { eval( $this->getMockObjectGenerator()->generateClassFromWsdl( $wsdlFile, $originalClassName, $methods, $options ) ); } return $this->getMock( $originalClassName, $methods, ['', $options], $mockClassName, $callOriginalConstructor, false, false ); } /** * Returns a mock object for the specified trait with all abstract methods * of the trait mocked. Concrete methods to mock can be specified with the * `$mockedMethods` parameter. * * @param string $traitName * @param array $arguments * @param string $mockClassName * @param bool $callOriginalConstructor * @param bool $callOriginalClone * @param bool $callAutoload * @param array $mockedMethods * @param bool $cloneArguments * * @return PHPUnit_Framework_MockObject_MockObject * * @since Method available since Release 4.0.0 * * @throws PHPUnit_Framework_Exception */ public function getMockForTrait($traitName, array $arguments = [], $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $mockedMethods = [], $cloneArguments = false) { $mockObject = $this->getMockObjectGenerator()->getMockForTrait( $traitName, $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $mockedMethods, $cloneArguments ); $this->mockObjects[] = $mockObject; return $mockObject; } /** * Returns an object for the specified trait. * * @param string $traitName * @param array $arguments * @param string $traitClassName * @param bool $callOriginalConstructor * @param bool $callOriginalClone * @param bool $callAutoload * @param bool $cloneArguments * * @return object * * @since Method available since Release 3.6.0 * * @throws PHPUnit_Framework_Exception */ protected function getObjectForTrait($traitName, array $arguments = [], $traitClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false) { return $this->getMockObjectGenerator()->getObjectForTrait( $traitName, $arguments, $traitClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $cloneArguments ); } /** * @param string|null $classOrInterface * * @return \Prophecy\Prophecy\ObjectProphecy * * @throws \LogicException * * @since Method available since Release 4.5.0 */ protected function prophesize($classOrInterface = null) { return $this->getProphet()->prophesize($classOrInterface); } /** * Adds a value to the assertion counter. * * @param int $count * * @since Method available since Release 3.3.3 */ public function addToAssertionCount($count) { $this->numAssertions += $count; } /** * Returns the number of assertions performed by this test. * * @return int * * @since Method available since Release 3.3.0 */ public function getNumAssertions() { return $this->numAssertions; } /** * Returns a matcher that matches when the method is executed * zero or more times. * * @return PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount * * @since Method available since Release 3.0.0 */ public static function any() { return new PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount; } /** * Returns a matcher that matches when the method is never executed. * * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount * * @since Method available since Release 3.0.0 */ public static function never() { return new PHPUnit_Framework_MockObject_Matcher_InvokedCount(0); } /** * Returns a matcher that matches when the method is executed * at least N times. * * @param int $requiredInvocations * * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount * * @since Method available since Release 4.2.0 */ public static function atLeast($requiredInvocations) { return new PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount( $requiredInvocations ); } /** * Returns a matcher that matches when the method is executed at least once. * * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce * * @since Method available since Release 3.0.0 */ public static function atLeastOnce() { return new PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce; } /** * Returns a matcher that matches when the method is executed exactly once. * * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount * * @since Method available since Release 3.0.0 */ public static function once() { return new PHPUnit_Framework_MockObject_Matcher_InvokedCount(1); } /** * Returns a matcher that matches when the method is executed * exactly $count times. * * @param int $count * * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount * * @since Method available since Release 3.0.0 */ public static function exactly($count) { return new PHPUnit_Framework_MockObject_Matcher_InvokedCount($count); } /** * Returns a matcher that matches when the method is executed * at most N times. * * @param int $allowedInvocations * * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount * * @since Method available since Release 4.2.0 */ public static function atMost($allowedInvocations) { return new PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount( $allowedInvocations ); } /** * Returns a matcher that matches when the method is executed * at the given index. * * @param int $index * * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex * * @since Method available since Release 3.0.0 */ public static function at($index) { return new PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex($index); } /** * @param mixed $value * * @return PHPUnit_Framework_MockObject_Stub_Return * * @since Method available since Release 3.0.0 */ public static function returnValue($value) { return new PHPUnit_Framework_MockObject_Stub_Return($value); } /** * @param array $valueMap * * @return PHPUnit_Framework_MockObject_Stub_ReturnValueMap * * @since Method available since Release 3.6.0 */ public static function returnValueMap(array $valueMap) { return new PHPUnit_Framework_MockObject_Stub_ReturnValueMap($valueMap); } /** * @param int $argumentIndex * * @return PHPUnit_Framework_MockObject_Stub_ReturnArgument * * @since Method available since Release 3.3.0 */ public static function returnArgument($argumentIndex) { return new PHPUnit_Framework_MockObject_Stub_ReturnArgument( $argumentIndex ); } /** * @param mixed $callback * * @return PHPUnit_Framework_MockObject_Stub_ReturnCallback * * @since Method available since Release 3.3.0 */ public static function returnCallback($callback) { return new PHPUnit_Framework_MockObject_Stub_ReturnCallback($callback); } /** * Returns the current object. * * This method is useful when mocking a fluent interface. * * @return PHPUnit_Framework_MockObject_Stub_ReturnSelf * * @since Method available since Release 3.6.0 */ public static function returnSelf() { return new PHPUnit_Framework_MockObject_Stub_ReturnSelf(); } /** * @param Throwable|Exception $exception * * @return PHPUnit_Framework_MockObject_Stub_Exception * * @since Method available since Release 3.1.0 * @todo Add type declaration when support for PHP 5 is dropped */ public static function throwException($exception) { return new PHPUnit_Framework_MockObject_Stub_Exception($exception); } /** * @param mixed $value, ... * * @return PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls * * @since Method available since Release 3.0.0 */ public static function onConsecutiveCalls() { $args = func_get_args(); return new PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls($args); } /** * Gets the data set description of a TestCase. * * @param bool $includeData * * @return string * * @since Method available since Release 3.3.0 */ protected function getDataSetAsString($includeData = true) { $buffer = ''; if (!empty($this->data)) { if (is_int($this->dataName)) { $buffer .= sprintf(' with data set #%d', $this->dataName); } else { $buffer .= sprintf(' with data set "%s"', $this->dataName); } $exporter = new Exporter; if ($includeData) { $buffer .= sprintf(' (%s)', $exporter->shortenedRecursiveExport($this->data)); } } return $buffer; } /** * Creates a default TestResult object. * * @return PHPUnit_Framework_TestResult */ protected function createResult() { return new PHPUnit_Framework_TestResult; } /** * @since Method available since Release 3.5.4 */ protected function handleDependencies() { if (!empty($this->dependencies) && !$this->inIsolation) { $className = get_class($this); $passed = $this->result->passed(); $passedKeys = array_keys($passed); $numKeys = count($passedKeys); for ($i = 0; $i < $numKeys; $i++) { $pos = strpos($passedKeys[$i], ' with data set'); if ($pos !== false) { $passedKeys[$i] = substr($passedKeys[$i], 0, $pos); } } $passedKeys = array_flip(array_unique($passedKeys)); foreach ($this->dependencies as $dependency) { $clone = false; if (strpos($dependency, 'clone ') === 0) { $clone = true; $dependency = substr($dependency, strlen('clone ')); } elseif (strpos($dependency, '!clone ') === 0) { $clone = false; $dependency = substr($dependency, strlen('!clone ')); } if (strpos($dependency, '::') === false) { $dependency = $className . '::' . $dependency; } if (!isset($passedKeys[$dependency])) { $this->result->addError( $this, new PHPUnit_Framework_SkippedTestError( sprintf( 'This test depends on "%s" to pass.', $dependency ) ), 0 ); return false; } if (isset($passed[$dependency])) { if ($passed[$dependency]['size'] != PHPUnit_Util_Test::UNKNOWN && $this->getSize() != PHPUnit_Util_Test::UNKNOWN && $passed[$dependency]['size'] > $this->getSize()) { $this->result->addError( $this, new PHPUnit_Framework_SkippedTestError( 'This test depends on a test that is larger than itself.' ), 0 ); return false; } if ($clone) { $deepCopy = new DeepCopy; $deepCopy->skipUncloneable(false); $this->dependencyInput[$dependency] = $deepCopy->copy($passed[$dependency]['result']); } else { $this->dependencyInput[$dependency] = $passed[$dependency]['result']; } } else { $this->dependencyInput[$dependency] = null; } } } return true; } /** * This method is called before the first test of this test class is run. * * @since Method available since Release 3.4.0 */ public static function setUpBeforeClass() { } /** * Sets up the fixture, for example, open a network connection. * This method is called before a test is executed. */ protected function setUp() { } /** * Performs assertions shared by all tests of a test case. * * This method is called before the execution of a test starts * and after setUp() is called. * * @since Method available since Release 3.2.8 */ protected function assertPreConditions() { } /** * Performs assertions shared by all tests of a test case. * * This method is called before the execution of a test ends * and before tearDown() is called. * * @since Method available since Release 3.2.8 */ protected function assertPostConditions() { } /** * Tears down the fixture, for example, close a network connection. * This method is called after a test is executed. */ protected function tearDown() { } /** * This method is called after the last test of this test class is run. * * @since Method available since Release 3.4.0 */ public static function tearDownAfterClass() { } /** * This method is called when a test method did not execute successfully. * * @param Exception|Throwable $e * * @since Method available since Release 3.4.0 * * @throws Exception|Throwable */ protected function onNotSuccessfulTest($e) { $expected = PHP_MAJOR_VERSION >= 7 ? 'Throwable' : 'Exception'; if ($e instanceof $expected) { throw $e; } throw PHPUnit_Util_InvalidArgumentHelper::factory( 1, 'Throwable or Exception' ); } /** * Performs custom preparations on the process isolation template. * * @param Text_Template $template * * @since Method available since Release 3.4.0 */ protected function prepareTemplate(Text_Template $template) { } /** * Get the mock object generator, creating it if it doesn't exist. * * @return PHPUnit_Framework_MockObject_Generator */ protected function getMockObjectGenerator() { if (null === $this->mockObjectGenerator) { $this->mockObjectGenerator = new PHPUnit_Framework_MockObject_Generator; } return $this->mockObjectGenerator; } /** * @since Method available since Release 4.2.0 */ private function startOutputBuffering() { while (!defined('PHPUNIT_TESTSUITE') && ob_get_level() > 0) { ob_end_clean(); } ob_start(); $this->outputBufferingActive = true; $this->outputBufferingLevel = ob_get_level(); } /** * @since Method available since Release 4.2.0 */ private function stopOutputBuffering() { if (ob_get_level() != $this->outputBufferingLevel) { while (ob_get_level() > 0) { ob_end_clean(); } throw new PHPUnit_Framework_RiskyTestError( 'Test code or tested code did not (only) close its own output buffers' ); } $output = ob_get_contents(); if ($this->outputCallback === false) { $this->output = $output; } else { $this->output = call_user_func_array( $this->outputCallback, [$output] ); } ob_end_clean(); $this->outputBufferingActive = false; $this->outputBufferingLevel = ob_get_level(); } private function snapshotGlobalState() { $backupGlobals = $this->backupGlobals === null || $this->backupGlobals === true; if ($this->runTestInSeparateProcess || $this->inIsolation || (!$backupGlobals && !$this->backupStaticAttributes)) { return; } $this->snapshot = $this->createGlobalStateSnapshot($backupGlobals); } private function restoreGlobalState() { if (!$this->snapshot instanceof Snapshot) { return; } $backupGlobals = $this->backupGlobals === null || $this->backupGlobals === true; if ($this->beStrictAboutChangesToGlobalState) { try { $this->compareGlobalStateSnapshots( $this->snapshot, $this->createGlobalStateSnapshot($backupGlobals) ); } catch (PHPUnit_Framework_RiskyTestError $rte) { // Intentionally left empty } } $restorer = new Restorer; if ($backupGlobals) { $restorer->restoreGlobalVariables($this->snapshot); } if ($this->backupStaticAttributes) { $restorer->restoreStaticAttributes($this->snapshot); } $this->snapshot = null; if (isset($rte)) { throw $rte; } } /** * @param bool $backupGlobals * * @return Snapshot */ private function createGlobalStateSnapshot($backupGlobals) { $blacklist = new Blacklist; foreach ($this->backupGlobalsBlacklist as $globalVariable) { $blacklist->addGlobalVariable($globalVariable); } if (!defined('PHPUNIT_TESTSUITE')) { $blacklist->addClassNamePrefix('PHPUnit'); $blacklist->addClassNamePrefix('File_Iterator'); $blacklist->addClassNamePrefix('PHP_CodeCoverage'); $blacklist->addClassNamePrefix('PHP_Invoker'); $blacklist->addClassNamePrefix('PHP_Timer'); $blacklist->addClassNamePrefix('PHP_Token'); $blacklist->addClassNamePrefix('Symfony'); $blacklist->addClassNamePrefix('Text_Template'); $blacklist->addClassNamePrefix('Doctrine\Instantiator'); foreach ($this->backupStaticAttributesBlacklist as $class => $attributes) { foreach ($attributes as $attribute) { $blacklist->addStaticAttribute($class, $attribute); } } } return new Snapshot( $blacklist, $backupGlobals, $this->backupStaticAttributes, false, false, false, false, false, false, false ); } /** * @param Snapshot $before * @param Snapshot $after * * @throws PHPUnit_Framework_RiskyTestError */ private function compareGlobalStateSnapshots(Snapshot $before, Snapshot $after) { $backupGlobals = $this->backupGlobals === null || $this->backupGlobals === true; if ($backupGlobals) { $this->compareGlobalStateSnapshotPart( $before->globalVariables(), $after->globalVariables(), "--- Global variables before the test\n+++ Global variables after the test\n" ); $this->compareGlobalStateSnapshotPart( $before->superGlobalVariables(), $after->superGlobalVariables(), "--- Super-global variables before the test\n+++ Super-global variables after the test\n" ); } if ($this->backupStaticAttributes) { $this->compareGlobalStateSnapshotPart( $before->staticAttributes(), $after->staticAttributes(), "--- Static attributes before the test\n+++ Static attributes after the test\n" ); } } /** * @param array $before * @param array $after * @param string $header * * @throws PHPUnit_Framework_RiskyTestError */ private function compareGlobalStateSnapshotPart(array $before, array $after, $header) { if ($before != $after) { $differ = new Differ($header); $exporter = new Exporter; $diff = $differ->diff( $exporter->export($before), $exporter->export($after) ); throw new PHPUnit_Framework_RiskyTestError( $diff ); } } /** * @return Prophecy\Prophet * * @since Method available since Release 4.5.0 */ private function getProphet() { if ($this->prophet === null) { $this->prophet = new Prophet; } return $this->prophet; } /** * @param PHPUnit_Framework_MockObject_MockObject $mock * * @return bool * * @since Method available since Release 5.0.0 */ private function shouldInvocationMockerBeReset(PHPUnit_Framework_MockObject_MockObject $mock) { if ($this->testResult === $mock) { return false; } if (is_array($this->testResult)) { foreach ($this->testResult as $testResult) { if ($testResult === $mock) { return false; } } } foreach ($this->dependencyInput as $dependencyInput) { if ($dependencyInput === $mock) { return false; } } return true; } /** * @param array $testArguments * * @since Method available since Release 5.0.0 */ private function registerMockObjectsFromTestArguments(array $testArguments) { foreach ($testArguments as $testArgument) { if ($testArgument instanceof PHPUnit_Framework_MockObject_MockObject) { $this->mockObjects[] = $testArgument; } elseif (is_array($testArgument)) { $this->registerMockObjectsFromTestArguments($testArgument); } } } } phpunit-5.1.3/src/Framework/TestFailure.php000066400000000000000000000077511263222771600207150ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A TestFailure collects a failed test together with the caught exception. * * @since Class available since Release 2.0.0 */ class PHPUnit_Framework_TestFailure { /** * @var string */ private $testName; /** * @var PHPUnit_Framework_Test|null */ protected $failedTest; /** * @var Exception */ protected $thrownException; /** * Constructs a TestFailure with the given test and exception. * * @param PHPUnit_Framework_Test $failedTest * @param Throwable $t */ public function __construct(PHPUnit_Framework_Test $failedTest, $t) { if ($failedTest instanceof PHPUnit_Framework_SelfDescribing) { $this->testName = $failedTest->toString(); } else { $this->testName = get_class($failedTest); } if (!$failedTest instanceof PHPUnit_Framework_TestCase || !$failedTest->isInIsolation()) { $this->failedTest = $failedTest; } $this->thrownException = $t; } /** * Returns a short description of the failure. * * @return string */ public function toString() { return sprintf( '%s: %s', $this->testName, $this->thrownException->getMessage() ); } /** * Returns a description for the thrown exception. * * @return string * * @since Method available since Release 3.4.0 */ public function getExceptionAsString() { return self::exceptionToString($this->thrownException); } /** * Returns a description for an exception. * * @param Exception $e * * @return string * * @since Method available since Release 3.2.0 */ public static function exceptionToString(Exception $e) { if ($e instanceof PHPUnit_Framework_SelfDescribing) { $buffer = $e->toString(); if ($e instanceof PHPUnit_Framework_ExpectationFailedException && $e->getComparisonFailure()) { $buffer = $buffer . $e->getComparisonFailure()->getDiff(); } if (!empty($buffer)) { $buffer = trim($buffer) . "\n"; } } elseif ($e instanceof PHPUnit_Framework_Error) { $buffer = $e->getMessage() . "\n"; } elseif ($e instanceof PHPUnit_Framework_ExceptionWrapper) { $buffer = $e->getClassname() . ': ' . $e->getMessage() . "\n"; } else { $buffer = get_class($e) . ': ' . $e->getMessage() . "\n"; } return $buffer; } /** * Returns the name of the failing test (including data set, if any). * * @return string * * @since Method available since Release 4.3.0 */ public function getTestName() { return $this->testName; } /** * Returns the failing test. * * Note: The test object is not set when the test is executed in process * isolation. * * @see PHPUnit_Framework_Exception * * @return PHPUnit_Framework_Test|null */ public function failedTest() { return $this->failedTest; } /** * Gets the thrown exception. * * @return Exception */ public function thrownException() { return $this->thrownException; } /** * Returns the exception's message. * * @return string */ public function exceptionMessage() { return $this->thrownException()->getMessage(); } /** * Returns true if the thrown exception * is of type AssertionFailedError. * * @return bool */ public function isFailure() { return ($this->thrownException() instanceof PHPUnit_Framework_AssertionFailedError); } } phpunit-5.1.3/src/Framework/TestListener.php000066400000000000000000000061231263222771600211030ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A Listener for test progress. * * @since Interface available since Release 2.0.0 */ interface PHPUnit_Framework_TestListener { /** * An error occurred. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addError(PHPUnit_Framework_Test $test, Exception $e, $time); /** * A warning occurred. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_Warning $e * @param float $time * * @since Method available since Release 6.0.0 * @todo Uncomment in time for PHPUnit 6.0.0 * @see https://github.com/sebastianbergmann/phpunit/pull/1840#issuecomment-162535997 */ // public function addWarning(PHPUnit_Framework_Test $test, PHPUnit_Framework_Warning $e, $time); /** * A failure occurred. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_AssertionFailedError $e * @param float $time */ public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time); /** * Incomplete test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time); /** * Risky test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time * * @since Method available since Release 4.0.0 */ public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time); /** * Skipped test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time * * @since Method available since Release 3.0.0 */ public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time); /** * A test suite started. * * @param PHPUnit_Framework_TestSuite $suite * * @since Method available since Release 2.2.0 */ public function startTestSuite(PHPUnit_Framework_TestSuite $suite); /** * A test suite ended. * * @param PHPUnit_Framework_TestSuite $suite * * @since Method available since Release 2.2.0 */ public function endTestSuite(PHPUnit_Framework_TestSuite $suite); /** * A test started. * * @param PHPUnit_Framework_Test $test */ public function startTest(PHPUnit_Framework_Test $test); /** * A test ended. * * @param PHPUnit_Framework_Test $test * @param float $time */ public function endTest(PHPUnit_Framework_Test $test, $time); } phpunit-5.1.3/src/Framework/TestResult.php000066400000000000000000000764141263222771600206060ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use SebastianBergmann\ResourceOperations\ResourceOperations; /** * A TestResult collects the results of executing a test case. * * @since Class available since Release 2.0.0 */ class PHPUnit_Framework_TestResult implements Countable { /** * @var array */ protected $passed = []; /** * @var array */ protected $errors = []; /** * @var array */ protected $failures = []; /** * @var array */ protected $warnings = []; /** * @var array */ protected $notImplemented = []; /** * @var array */ protected $risky = []; /** * @var array */ protected $skipped = []; /** * @var array */ protected $listeners = []; /** * @var int */ protected $runTests = 0; /** * @var float */ protected $time = 0; /** * @var PHPUnit_Framework_TestSuite */ protected $topTestSuite = null; /** * Code Coverage information. * * @var PHP_CodeCoverage */ protected $codeCoverage; /** * @var bool */ protected $convertErrorsToExceptions = true; /** * @var bool */ protected $stop = false; /** * @var bool */ protected $stopOnError = false; /** * @var bool */ protected $stopOnFailure = false; /** * @var bool */ protected $stopOnWarning = false; /** * @var bool */ protected $beStrictAboutTestsThatDoNotTestAnything = false; /** * @var bool */ protected $beStrictAboutOutputDuringTests = false; /** * @var bool */ protected $beStrictAboutTodoAnnotatedTests = false; /** * @var bool */ protected $beStrictAboutResourceUsageDuringSmallTests = false; /** * @var bool */ protected $enforceTimeLimit = false; /** * @var int */ protected $timeoutForSmallTests = 1; /** * @var int */ protected $timeoutForMediumTests = 10; /** * @var int */ protected $timeoutForLargeTests = 60; /** * @var bool */ protected $stopOnRisky = false; /** * @var bool */ protected $stopOnIncomplete = false; /** * @var bool */ protected $stopOnSkipped = false; /** * @var bool */ protected $lastTestFailed = false; /** * Registers a TestListener. * * @param PHPUnit_Framework_TestListener */ public function addListener(PHPUnit_Framework_TestListener $listener) { $this->listeners[] = $listener; } /** * Unregisters a TestListener. * * @param PHPUnit_Framework_TestListener $listener */ public function removeListener(PHPUnit_Framework_TestListener $listener) { foreach ($this->listeners as $key => $_listener) { if ($listener === $_listener) { unset($this->listeners[$key]); } } } /** * Flushes all flushable TestListeners. * * @since Method available since Release 3.0.0 */ public function flushListeners() { foreach ($this->listeners as $listener) { if ($listener instanceof PHPUnit_Util_Printer) { $listener->flush(); } } } /** * Adds an error to the list of errors. * * @param PHPUnit_Framework_Test $test * @param Throwable $t * @param float $time */ public function addError(PHPUnit_Framework_Test $test, $t, $time) { if ($t instanceof PHPUnit_Framework_RiskyTest) { $this->risky[] = new PHPUnit_Framework_TestFailure($test, $t); $notifyMethod = 'addRiskyTest'; if ($this->stopOnRisky) { $this->stop(); } } elseif ($t instanceof PHPUnit_Framework_IncompleteTest) { $this->notImplemented[] = new PHPUnit_Framework_TestFailure($test, $t); $notifyMethod = 'addIncompleteTest'; if ($this->stopOnIncomplete) { $this->stop(); } } elseif ($t instanceof PHPUnit_Framework_SkippedTest) { $this->skipped[] = new PHPUnit_Framework_TestFailure($test, $t); $notifyMethod = 'addSkippedTest'; if ($this->stopOnSkipped) { $this->stop(); } } else { $this->errors[] = new PHPUnit_Framework_TestFailure($test, $t); $notifyMethod = 'addError'; if ($this->stopOnError || $this->stopOnFailure) { $this->stop(); } } // @see https://github.com/sebastianbergmann/phpunit/issues/1953 if ($t instanceof Error) { $t = new PHPUnit_Framework_ExceptionWrapper($t); } foreach ($this->listeners as $listener) { $listener->$notifyMethod($test, $t, $time); } $this->lastTestFailed = true; $this->time += $time; } /** * Adds a warning to the list of warnings. * The passed in exception caused the warning. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_Warning $e * @param float $time * * @since Method available since Release 5.1.0 */ public function addWarning(PHPUnit_Framework_Test $test, PHPUnit_Framework_Warning $e, $time) { if ($this->stopOnWarning) { $this->stop(); } $this->warnings[] = new PHPUnit_Framework_TestFailure($test, $e); foreach ($this->listeners as $listener) { // @todo Remove check for PHPUnit 6.0.0 // @see https://github.com/sebastianbergmann/phpunit/pull/1840#issuecomment-162535997 if (method_exists($listener, 'addWarning')) { $listener->addWarning($test, $e, $time); } } $this->time += $time; } /** * Adds a failure to the list of failures. * The passed in exception caused the failure. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_AssertionFailedError $e * @param float $time */ public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) { if ($e instanceof PHPUnit_Framework_RiskyTest || $e instanceof PHPUnit_Framework_OutputError) { $this->risky[] = new PHPUnit_Framework_TestFailure($test, $e); $notifyMethod = 'addRiskyTest'; if ($this->stopOnRisky) { $this->stop(); } } elseif ($e instanceof PHPUnit_Framework_IncompleteTest) { $this->notImplemented[] = new PHPUnit_Framework_TestFailure($test, $e); $notifyMethod = 'addIncompleteTest'; if ($this->stopOnIncomplete) { $this->stop(); } } elseif ($e instanceof PHPUnit_Framework_SkippedTest) { $this->skipped[] = new PHPUnit_Framework_TestFailure($test, $e); $notifyMethod = 'addSkippedTest'; if ($this->stopOnSkipped) { $this->stop(); } } else { $this->failures[] = new PHPUnit_Framework_TestFailure($test, $e); $notifyMethod = 'addFailure'; if ($this->stopOnFailure) { $this->stop(); } } foreach ($this->listeners as $listener) { $listener->$notifyMethod($test, $e, $time); } $this->lastTestFailed = true; $this->time += $time; } /** * Informs the result that a testsuite will be started. * * @param PHPUnit_Framework_TestSuite $suite * * @since Method available since Release 2.2.0 */ public function startTestSuite(PHPUnit_Framework_TestSuite $suite) { if ($this->topTestSuite === null) { $this->topTestSuite = $suite; } foreach ($this->listeners as $listener) { $listener->startTestSuite($suite); } } /** * Informs the result that a testsuite was completed. * * @param PHPUnit_Framework_TestSuite $suite * * @since Method available since Release 2.2.0 */ public function endTestSuite(PHPUnit_Framework_TestSuite $suite) { foreach ($this->listeners as $listener) { $listener->endTestSuite($suite); } } /** * Informs the result that a test will be started. * * @param PHPUnit_Framework_Test $test */ public function startTest(PHPUnit_Framework_Test $test) { $this->lastTestFailed = false; $this->runTests += count($test); foreach ($this->listeners as $listener) { $listener->startTest($test); } } /** * Informs the result that a test was completed. * * @param PHPUnit_Framework_Test $test * @param float $time */ public function endTest(PHPUnit_Framework_Test $test, $time) { foreach ($this->listeners as $listener) { $listener->endTest($test, $time); } if (!$this->lastTestFailed && $test instanceof PHPUnit_Framework_TestCase) { $class = get_class($test); $key = $class . '::' . $test->getName(); $this->passed[$key] = [ 'result' => $test->getResult(), 'size' => PHPUnit_Util_Test::getSize( $class, $test->getName(false) ) ]; $this->time += $time; } } /** * Returns true if no risky test occurred. * * @return bool * * @since Method available since Release 4.0.0 */ public function allHarmless() { return $this->riskyCount() == 0; } /** * Gets the number of risky tests. * * @return int * * @since Method available since Release 4.0.0 */ public function riskyCount() { return count($this->risky); } /** * Returns true if no incomplete test occurred. * * @return bool */ public function allCompletelyImplemented() { return $this->notImplementedCount() == 0; } /** * Gets the number of incomplete tests. * * @return int */ public function notImplementedCount() { return count($this->notImplemented); } /** * Returns an Enumeration for the risky tests. * * @return array * * @since Method available since Release 4.0.0 */ public function risky() { return $this->risky; } /** * Returns an Enumeration for the incomplete tests. * * @return array */ public function notImplemented() { return $this->notImplemented; } /** * Returns true if no test has been skipped. * * @return bool * * @since Method available since Release 3.0.0 */ public function noneSkipped() { return $this->skippedCount() == 0; } /** * Gets the number of skipped tests. * * @return int * * @since Method available since Release 3.0.0 */ public function skippedCount() { return count($this->skipped); } /** * Returns an Enumeration for the skipped tests. * * @return array * * @since Method available since Release 3.0.0 */ public function skipped() { return $this->skipped; } /** * Gets the number of detected errors. * * @return int */ public function errorCount() { return count($this->errors); } /** * Returns an Enumeration for the errors. * * @return array */ public function errors() { return $this->errors; } /** * Gets the number of detected failures. * * @return int */ public function failureCount() { return count($this->failures); } /** * Returns an Enumeration for the failures. * * @return array */ public function failures() { return $this->failures; } /** * Gets the number of detected warnings. * * @return int * * @since Method available since Release 5.1.0 */ public function warningCount() { return count($this->warnings); } /** * Returns an Enumeration for the warnings. * * @return array * * @since Method available since Release 5.1.0 */ public function warnings() { return $this->warnings; } /** * Returns the names of the tests that have passed. * * @return array * * @since Method available since Release 3.4.0 */ public function passed() { return $this->passed; } /** * Returns the (top) test suite. * * @return PHPUnit_Framework_TestSuite * * @since Method available since Release 3.0.0 */ public function topTestSuite() { return $this->topTestSuite; } /** * Returns whether code coverage information should be collected. * * @return bool If code coverage should be collected * * @since Method available since Release 3.2.0 */ public function getCollectCodeCoverageInformation() { return $this->codeCoverage !== null; } /** * Runs a TestCase. * * @param PHPUnit_Framework_Test $test */ public function run(PHPUnit_Framework_Test $test) { PHPUnit_Framework_Assert::resetCount(); $error = false; $failure = false; $warning = false; $incomplete = false; $risky = false; $skipped = false; $this->startTest($test); $errorHandlerSet = false; if ($this->convertErrorsToExceptions) { $oldErrorHandler = set_error_handler( ['PHPUnit_Util_ErrorHandler', 'handleError'], E_ALL | E_STRICT ); if ($oldErrorHandler === null) { $errorHandlerSet = true; } else { restore_error_handler(); } } $collectCodeCoverage = $this->codeCoverage !== null && !$test instanceof PHPUnit_Framework_WarningTestCase; if ($collectCodeCoverage) { $this->codeCoverage->start($test); } $monitorFunctions = $this->beStrictAboutResourceUsageDuringSmallTests && !$test instanceof PHPUnit_Framework_WarningTestCase && $test->getSize() == PHPUnit_Util_Test::SMALL && function_exists('xdebug_start_function_monitor'); if ($monitorFunctions) { xdebug_start_function_monitor(ResourceOperations::getFunctions()); } PHP_Timer::start(); try { if (!$test instanceof PHPUnit_Framework_WarningTestCase && $test->getSize() != PHPUnit_Util_Test::UNKNOWN && $this->enforceTimeLimit && extension_loaded('pcntl') && class_exists('PHP_Invoker')) { switch ($test->getSize()) { case PHPUnit_Util_Test::SMALL: $_timeout = $this->timeoutForSmallTests; break; case PHPUnit_Util_Test::MEDIUM: $_timeout = $this->timeoutForMediumTests; break; case PHPUnit_Util_Test::LARGE: $_timeout = $this->timeoutForLargeTests; break; } $invoker = new PHP_Invoker; $invoker->invoke([$test, 'runBare'], [], $_timeout); } else { $test->runBare(); } } catch (PHPUnit_Framework_AssertionFailedError $e) { $failure = true; if ($e instanceof PHPUnit_Framework_RiskyTestError) { $risky = true; } elseif ($e instanceof PHPUnit_Framework_IncompleteTestError) { $incomplete = true; } elseif ($e instanceof PHPUnit_Framework_SkippedTestError) { $skipped = true; } } catch (PHPUnit_Framework_Warning $e) { $warning = true; } catch (PHPUnit_Framework_Exception $e) { $error = true; } catch (Throwable $e) { $e = new PHPUnit_Framework_ExceptionWrapper($e); $error = true; } catch (Exception $e) { $e = new PHPUnit_Framework_ExceptionWrapper($e); $error = true; } $time = PHP_Timer::stop(); $test->addToAssertionCount(PHPUnit_Framework_Assert::getCount()); if ($monitorFunctions) { $blacklist = new PHPUnit_Util_Blacklist; $functions = xdebug_get_monitored_functions(); xdebug_stop_function_monitor(); foreach ($functions as $function) { if (!$blacklist->isBlacklisted($function['filename'])) { $this->addFailure( $test, new PHPUnit_Framework_RiskyTestError( sprintf( '%s() used in %s:%s', $function['function'], $function['filename'], $function['lineno'] ) ), $time ); } } } if ($this->beStrictAboutTestsThatDoNotTestAnything && $test->getNumAssertions() == 0) { $risky = true; } if ($collectCodeCoverage) { $append = !$risky && !$incomplete && !$skipped; $linesToBeCovered = []; $linesToBeUsed = []; if ($append && $test instanceof PHPUnit_Framework_TestCase) { $linesToBeCovered = PHPUnit_Util_Test::getLinesToBeCovered( get_class($test), $test->getName(false) ); $linesToBeUsed = PHPUnit_Util_Test::getLinesToBeUsed( get_class($test), $test->getName(false) ); } try { $this->codeCoverage->stop( $append, $linesToBeCovered, $linesToBeUsed ); } catch (PHP_CodeCoverage_UnintentionallyCoveredCodeException $cce) { $this->addFailure( $test, new PHPUnit_Framework_UnintentionallyCoveredCodeError( 'This test executed code that is not listed as code to be covered or used:' . PHP_EOL . $cce->getMessage() ), $time ); } catch (PHPUnit_Framework_InvalidCoversTargetException $cce) { $this->addFailure( $test, new PHPUnit_Framework_InvalidCoversTargetError( $cce->getMessage() ), $time ); } catch (PHP_CodeCoverage_Exception $cce) { $error = true; if (!isset($e)) { $e = $cce; } } } if ($errorHandlerSet === true) { restore_error_handler(); } if ($error === true) { $this->addError($test, $e, $time); } elseif ($failure === true) { $this->addFailure($test, $e, $time); } elseif ($warning === true) { $this->addWarning($test, $e, $time); } elseif ($this->beStrictAboutTestsThatDoNotTestAnything && $test->getNumAssertions() == 0) { $this->addFailure( $test, new PHPUnit_Framework_RiskyTestError( 'This test did not perform any assertions' ), $time ); } elseif ($this->beStrictAboutOutputDuringTests && $test->hasOutput()) { $this->addFailure( $test, new PHPUnit_Framework_OutputError( sprintf( 'This test printed output: %s', $test->getActualOutput() ) ), $time ); } elseif ($this->beStrictAboutTodoAnnotatedTests && $test instanceof PHPUnit_Framework_TestCase) { $annotations = $test->getAnnotations(); if (isset($annotations['method']['todo'])) { $this->addFailure( $test, new PHPUnit_Framework_RiskyTestError( 'Test method is annotated with @todo' ), $time ); } } $this->endTest($test, $time); } /** * Gets the number of run tests. * * @return int */ public function count() { return $this->runTests; } /** * Checks whether the test run should stop. * * @return bool */ public function shouldStop() { return $this->stop; } /** * Marks that the test run should stop. */ public function stop() { $this->stop = true; } /** * Returns the PHP_CodeCoverage object. * * @return PHP_CodeCoverage * * @since Method available since Release 3.5.0 */ public function getCodeCoverage() { return $this->codeCoverage; } /** * Sets the PHP_CodeCoverage object. * * @param PHP_CodeCoverage $codeCoverage * * @since Method available since Release 3.6.0 */ public function setCodeCoverage(PHP_CodeCoverage $codeCoverage) { $this->codeCoverage = $codeCoverage; } /** * Enables or disables the error-to-exception conversion. * * @param bool $flag * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.2.14 */ public function convertErrorsToExceptions($flag) { if (!is_bool($flag)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } $this->convertErrorsToExceptions = $flag; } /** * Returns the error-to-exception conversion setting. * * @return bool * * @since Method available since Release 3.4.0 */ public function getConvertErrorsToExceptions() { return $this->convertErrorsToExceptions; } /** * Enables or disables the stopping when an error occurs. * * @param bool $flag * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.5.0 */ public function stopOnError($flag) { if (!is_bool($flag)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } $this->stopOnError = $flag; } /** * Enables or disables the stopping when a failure occurs. * * @param bool $flag * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.1.0 */ public function stopOnFailure($flag) { if (!is_bool($flag)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } $this->stopOnFailure = $flag; } /** * Enables or disables the stopping when a warning occurs. * * @param bool $flag * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 5.1.0 */ public function stopOnWarning($flag) { if (!is_bool($flag)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } $this->stopOnWarning = $flag; } /** * @param bool $flag * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 4.0.0 */ public function beStrictAboutTestsThatDoNotTestAnything($flag) { if (!is_bool($flag)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } $this->beStrictAboutTestsThatDoNotTestAnything = $flag; } /** * @return bool * * @since Method available since Release 4.0.0 */ public function isStrictAboutTestsThatDoNotTestAnything() { return $this->beStrictAboutTestsThatDoNotTestAnything; } /** * @param bool $flag * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 4.0.0 */ public function beStrictAboutOutputDuringTests($flag) { if (!is_bool($flag)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } $this->beStrictAboutOutputDuringTests = $flag; } /** * @return bool * * @since Method available since Release 4.0.0 */ public function isStrictAboutOutputDuringTests() { return $this->beStrictAboutOutputDuringTests; } /** * @param bool $flag * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 5.0.0 */ public function beStrictAboutResourceUsageDuringSmallTests($flag) { if (!is_bool($flag)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } $this->beStrictAboutResourceUsageDuringSmallTests = $flag; } /** * @return bool * * @since Method available since Release 5.0.0 */ public function isStrictAboutResourceUsageDuringSmallTests() { return $this->beStrictAboutResourceUsageDuringSmallTests; } /** * @param bool $flag * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 5.0.0 */ public function enforceTimeLimit($flag) { if (!is_bool($flag)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } $this->enforceTimeLimit = $flag; } /** * @return bool * * @since Method available since Release 5.0.0 */ public function enforcesTimeLimit() { return $this->enforceTimeLimit; } /** * @param bool $flag * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 4.2.0 */ public function beStrictAboutTodoAnnotatedTests($flag) { if (!is_bool($flag)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } $this->beStrictAboutTodoAnnotatedTests = $flag; } /** * @return bool * * @since Method available since Release 4.2.0 */ public function isStrictAboutTodoAnnotatedTests() { return $this->beStrictAboutTodoAnnotatedTests; } /** * Enables or disables the stopping for risky tests. * * @param bool $flag * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 4.0.0 */ public function stopOnRisky($flag) { if (!is_bool($flag)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } $this->stopOnRisky = $flag; } /** * Enables or disables the stopping for incomplete tests. * * @param bool $flag * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.5.0 */ public function stopOnIncomplete($flag) { if (!is_bool($flag)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } $this->stopOnIncomplete = $flag; } /** * Enables or disables the stopping for skipped tests. * * @param bool $flag * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.1.0 */ public function stopOnSkipped($flag) { if (!is_bool($flag)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } $this->stopOnSkipped = $flag; } /** * Returns the time spent running the tests. * * @return float */ public function time() { return $this->time; } /** * Returns whether the entire test was successful or not. * * @return bool */ public function wasSuccessful() { return empty($this->errors) && empty($this->failures) && empty($this->warnings); } /** * Sets the timeout for small tests. * * @param int $timeout * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.6.0 */ public function setTimeoutForSmallTests($timeout) { if (!is_integer($timeout)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer'); } $this->timeoutForSmallTests = $timeout; } /** * Sets the timeout for medium tests. * * @param int $timeout * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.6.0 */ public function setTimeoutForMediumTests($timeout) { if (!is_integer($timeout)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer'); } $this->timeoutForMediumTests = $timeout; } /** * Sets the timeout for large tests. * * @param int $timeout * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.6.0 */ public function setTimeoutForLargeTests($timeout) { if (!is_integer($timeout)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer'); } $this->timeoutForLargeTests = $timeout; } /** * Returns the class hierarchy for a given class. * * @param string $className * @param bool $asReflectionObjects * * @return array */ protected function getHierarchy($className, $asReflectionObjects = false) { if ($asReflectionObjects) { $classes = [new ReflectionClass($className)]; } else { $classes = [$className]; } $done = false; while (!$done) { if ($asReflectionObjects) { $class = new ReflectionClass( $classes[count($classes) - 1]->getName() ); } else { $class = new ReflectionClass($classes[count($classes) - 1]); } $parent = $class->getParentClass(); if ($parent !== false) { if ($asReflectionObjects) { $classes[] = $parent; } else { $classes[] = $parent->getName(); } } else { $done = true; } } return $classes; } } phpunit-5.1.3/src/Framework/TestSuite.php000066400000000000000000000715121263222771600204130ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A TestSuite is a composite of Tests. It runs a collection of test cases. * * Here is an example using the dynamic test definition. * * * addTest(new MathTest('testPass')); * ?> * * * Alternatively, a TestSuite can extract the tests to be run automatically. * To do so you pass a ReflectionClass instance for your * PHPUnit_Framework_TestCase class to the PHPUnit_Framework_TestSuite * constructor. * * * * * * This constructor creates a suite with all the methods starting with * "test" that take no arguments. * * @since Class available since Release 2.0.0 */ class PHPUnit_Framework_TestSuite implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing, IteratorAggregate { /** * Last count of tests in this suite. * * @var int|null */ private $cachedNumTests; /** * Enable or disable the backup and restoration of the $GLOBALS array. * * @var bool */ protected $backupGlobals = null; /** * Enable or disable the backup and restoration of static attributes. * * @var bool */ protected $backupStaticAttributes = null; /** * @var bool */ private $beStrictAboutChangesToGlobalState = null; /** * @var bool */ protected $runTestInSeparateProcess = false; /** * The name of the test suite. * * @var string */ protected $name = ''; /** * The test groups of the test suite. * * @var array */ protected $groups = []; /** * The tests in the test suite. * * @var array */ protected $tests = []; /** * The number of tests in the test suite. * * @var int */ protected $numTests = -1; /** * @var bool */ protected $testCase = false; /** * @var array */ protected $foundClasses = []; /** * @var PHPUnit_Runner_Filter_Factory */ private $iteratorFilter = null; /** * Constructs a new TestSuite: * * - PHPUnit_Framework_TestSuite() constructs an empty TestSuite. * * - PHPUnit_Framework_TestSuite(ReflectionClass) constructs a * TestSuite from the given class. * * - PHPUnit_Framework_TestSuite(ReflectionClass, String) * constructs a TestSuite from the given class with the given * name. * * - PHPUnit_Framework_TestSuite(String) either constructs a * TestSuite from the given class (if the passed string is the * name of an existing class) or constructs an empty TestSuite * with the given name. * * @param mixed $theClass * @param string $name * * @throws PHPUnit_Framework_Exception */ public function __construct($theClass = '', $name = '') { $argumentsValid = false; if (is_object($theClass) && $theClass instanceof ReflectionClass) { $argumentsValid = true; } elseif (is_string($theClass) && $theClass !== '' && class_exists($theClass, false)) { $argumentsValid = true; if ($name == '') { $name = $theClass; } $theClass = new ReflectionClass($theClass); } elseif (is_string($theClass)) { $this->setName($theClass); return; } if (!$argumentsValid) { throw new PHPUnit_Framework_Exception; } if (!$theClass->isSubclassOf('PHPUnit_Framework_TestCase')) { throw new PHPUnit_Framework_Exception( 'Class "' . $theClass->name . '" does not extend PHPUnit_Framework_TestCase.' ); } if ($name != '') { $this->setName($name); } else { $this->setName($theClass->getName()); } $constructor = $theClass->getConstructor(); if ($constructor !== null && !$constructor->isPublic()) { $this->addTest( self::warning( sprintf( 'Class "%s" has no public constructor.', $theClass->getName() ) ) ); return; } foreach ($theClass->getMethods() as $method) { $this->addTestMethod($theClass, $method); } if (empty($this->tests)) { $this->addTest( self::warning( sprintf( 'No tests found in class "%s".', $theClass->getName() ) ) ); } $this->testCase = true; } /** * Returns a string representation of the test suite. * * @return string */ public function toString() { return $this->getName(); } /** * Adds a test to the suite. * * @param PHPUnit_Framework_Test $test * @param array $groups */ public function addTest(PHPUnit_Framework_Test $test, $groups = []) { $class = new ReflectionClass($test); if (!$class->isAbstract()) { $this->tests[] = $test; $this->numTests = -1; if ($test instanceof self && empty($groups)) { $groups = $test->getGroups(); } if (empty($groups)) { $groups = ['default']; } foreach ($groups as $group) { if (!isset($this->groups[$group])) { $this->groups[$group] = [$test]; } else { $this->groups[$group][] = $test; } } } } /** * Adds the tests from the given class to the suite. * * @param mixed $testClass * * @throws PHPUnit_Framework_Exception */ public function addTestSuite($testClass) { if (is_string($testClass) && class_exists($testClass)) { $testClass = new ReflectionClass($testClass); } if (!is_object($testClass)) { throw PHPUnit_Util_InvalidArgumentHelper::factory( 1, 'class name or object' ); } if ($testClass instanceof self) { $this->addTest($testClass); } elseif ($testClass instanceof ReflectionClass) { $suiteMethod = false; if (!$testClass->isAbstract()) { if ($testClass->hasMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME)) { $method = $testClass->getMethod( PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME ); if ($method->isStatic()) { $this->addTest( $method->invoke(null, $testClass->getName()) ); $suiteMethod = true; } } } if (!$suiteMethod && !$testClass->isAbstract()) { $this->addTest(new self($testClass)); } } else { throw new PHPUnit_Framework_Exception; } } /** * Wraps both addTest() and addTestSuite * as well as the separate import statements for the user's convenience. * * If the named file cannot be read or there are no new tests that can be * added, a PHPUnit_Framework_WarningTestCase will be created instead, * leaving the current test run untouched. * * @param string $filename * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 2.3.0 */ public function addTestFile($filename) { if (!is_string($filename)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (file_exists($filename) && substr($filename, -5) == '.phpt') { $this->addTest( new PHPUnit_Extensions_PhptTestCase($filename) ); return; } // The given file may contain further stub classes in addition to the // test class itself. Figure out the actual test class. $classes = get_declared_classes(); $filename = PHPUnit_Util_Fileloader::checkAndLoad($filename); $newClasses = array_diff(get_declared_classes(), $classes); // The diff is empty in case a parent class (with test methods) is added // AFTER a child class that inherited from it. To account for that case, // cumulate all discovered classes, so the parent class may be found in // a later invocation. if ($newClasses) { // On the assumption that test classes are defined first in files, // process discovered classes in approximate LIFO order, so as to // avoid unnecessary reflection. $this->foundClasses = array_merge($newClasses, $this->foundClasses); } // The test class's name must match the filename, either in full, or as // a PEAR/PSR-0 prefixed shortname ('NameSpace_ShortName'), or as a // PSR-1 local shortname ('NameSpace\ShortName'). The comparison must be // anchored to prevent false-positive matches (e.g., 'OtherShortName'). $shortname = basename($filename, '.php'); $shortnameRegEx = '/(?:^|_|\\\\)' . preg_quote($shortname, '/') . '$/'; foreach ($this->foundClasses as $i => $className) { if (preg_match($shortnameRegEx, $className)) { $class = new ReflectionClass($className); if ($class->getFileName() == $filename) { $newClasses = [$className]; unset($this->foundClasses[$i]); break; } } } foreach ($newClasses as $className) { $class = new ReflectionClass($className); if (!$class->isAbstract()) { if ($class->hasMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME)) { $method = $class->getMethod( PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME ); if ($method->isStatic()) { $this->addTest($method->invoke(null, $className)); } } elseif ($class->implementsInterface('PHPUnit_Framework_Test')) { $this->addTestSuite($class); } } } $this->numTests = -1; } /** * Wrapper for addTestFile() that adds multiple test files. * * @param array|Iterator $filenames * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 2.3.0 */ public function addTestFiles($filenames) { if (!(is_array($filenames) || (is_object($filenames) && $filenames instanceof Iterator))) { throw PHPUnit_Util_InvalidArgumentHelper::factory( 1, 'array or iterator' ); } foreach ($filenames as $filename) { $this->addTestFile((string) $filename); } } /** * Counts the number of test cases that will be run by this test. * * @param bool $preferCache Indicates if cache is preferred. * * @return int */ public function count($preferCache = false) { if ($preferCache && $this->cachedNumTests != null) { $numTests = $this->cachedNumTests; } else { $numTests = 0; foreach ($this as $test) { $numTests += count($test); } $this->cachedNumTests = $numTests; } return $numTests; } /** * @param ReflectionClass $theClass * @param string $name * * @return PHPUnit_Framework_Test * * @throws PHPUnit_Framework_Exception */ public static function createTest(ReflectionClass $theClass, $name) { $className = $theClass->getName(); if (!$theClass->isInstantiable()) { return self::warning( sprintf('Cannot instantiate class "%s".', $className) ); } $backupSettings = PHPUnit_Util_Test::getBackupSettings( $className, $name ); $preserveGlobalState = PHPUnit_Util_Test::getPreserveGlobalStateSettings( $className, $name ); $runTestInSeparateProcess = PHPUnit_Util_Test::getProcessIsolationSettings( $className, $name ); $constructor = $theClass->getConstructor(); if ($constructor !== null) { $parameters = $constructor->getParameters(); // TestCase() or TestCase($name) if (count($parameters) < 2) { $test = new $className; } // TestCase($name, $data) else { try { $data = PHPUnit_Util_Test::getProvidedData( $className, $name ); } catch (PHPUnit_Framework_IncompleteTestError $e) { $message = sprintf( 'Test for %s::%s marked incomplete by data provider', $className, $name ); $_message = $e->getMessage(); if (!empty($_message)) { $message .= "\n" . $_message; } $data = self::incompleteTest($className, $name, $message); } catch (PHPUnit_Framework_SkippedTestError $e) { $message = sprintf( 'Test for %s::%s skipped by data provider', $className, $name ); $_message = $e->getMessage(); if (!empty($_message)) { $message .= "\n" . $_message; } $data = self::skipTest($className, $name, $message); } catch (Throwable $_t) { $t = $_t; } catch (Exception $_t) { $t = $_t; } if (isset($t)) { $message = sprintf( 'The data provider specified for %s::%s is invalid.', $className, $name ); $_message = $t->getMessage(); if (!empty($_message)) { $message .= "\n" . $_message; } $data = self::warning($message); } // Test method with @dataProvider. if (isset($data)) { $test = new PHPUnit_Framework_TestSuite_DataProvider( $className . '::' . $name ); if (empty($data)) { $data = self::warning( sprintf( 'No tests found in suite "%s".', $test->getName() ) ); } $groups = PHPUnit_Util_Test::getGroups($className, $name); if ($data instanceof PHPUnit_Framework_WarningTestCase || $data instanceof PHPUnit_Framework_SkippedTestCase || $data instanceof PHPUnit_Framework_IncompleteTestCase) { $test->addTest($data, $groups); } else { foreach ($data as $_dataName => $_data) { $_test = new $className($name, $_data, $_dataName); if ($runTestInSeparateProcess) { $_test->setRunTestInSeparateProcess(true); if ($preserveGlobalState !== null) { $_test->setPreserveGlobalState($preserveGlobalState); } } if ($backupSettings['backupGlobals'] !== null) { $_test->setBackupGlobals( $backupSettings['backupGlobals'] ); } if ($backupSettings['backupStaticAttributes'] !== null) { $_test->setBackupStaticAttributes( $backupSettings['backupStaticAttributes'] ); } $test->addTest($_test, $groups); } } } else { $test = new $className; } } } if (!isset($test)) { throw new PHPUnit_Framework_Exception('No valid test provided.'); } if ($test instanceof PHPUnit_Framework_TestCase) { $test->setName($name); if ($runTestInSeparateProcess) { $test->setRunTestInSeparateProcess(true); if ($preserveGlobalState !== null) { $test->setPreserveGlobalState($preserveGlobalState); } } if ($backupSettings['backupGlobals'] !== null) { $test->setBackupGlobals($backupSettings['backupGlobals']); } if ($backupSettings['backupStaticAttributes'] !== null) { $test->setBackupStaticAttributes( $backupSettings['backupStaticAttributes'] ); } } return $test; } /** * Creates a default TestResult object. * * @return PHPUnit_Framework_TestResult */ protected function createResult() { return new PHPUnit_Framework_TestResult; } /** * Returns the name of the suite. * * @return string */ public function getName() { return $this->name; } /** * Returns the test groups of the suite. * * @return array * * @since Method available since Release 3.2.0 */ public function getGroups() { return array_keys($this->groups); } public function getGroupDetails() { return $this->groups; } /** * Set tests groups of the test case * * @param array $groups * * @since Method available since Release 4.0.0 */ public function setGroupDetails(array $groups) { $this->groups = $groups; } /** * Runs the tests and collects their result in a TestResult. * * @param PHPUnit_Framework_TestResult $result * * @return PHPUnit_Framework_TestResult */ public function run(PHPUnit_Framework_TestResult $result = null) { if ($result === null) { $result = $this->createResult(); } if (count($this) == 0) { return $result; } $hookMethods = PHPUnit_Util_Test::getHookMethods($this->name); $result->startTestSuite($this); try { $this->setUp(); foreach ($hookMethods['beforeClass'] as $beforeClassMethod) { if ($this->testCase === true && class_exists($this->name, false) && method_exists($this->name, $beforeClassMethod)) { if ($missingRequirements = PHPUnit_Util_Test::getMissingRequirements($this->name, $beforeClassMethod)) { $this->markTestSuiteSkipped(implode(PHP_EOL, $missingRequirements)); } call_user_func([$this->name, $beforeClassMethod]); } } } catch (PHPUnit_Framework_SkippedTestSuiteError $e) { $numTests = count($this); for ($i = 0; $i < $numTests; $i++) { $result->startTest($this); $result->addFailure($this, $e, 0); $result->endTest($this, 0); } $this->tearDown(); $result->endTestSuite($this); return $result; } catch (Throwable $_t) { $t = $_t; } catch (Exception $_t) { $t = $_t; } if (isset($t)) { $numTests = count($this); for ($i = 0; $i < $numTests; $i++) { $result->startTest($this); $result->addError($this, $t, 0); $result->endTest($this, 0); } $this->tearDown(); $result->endTestSuite($this); return $result; } foreach ($this as $test) { if ($result->shouldStop()) { break; } if ($test instanceof PHPUnit_Framework_TestCase || $test instanceof self) { $test->setbeStrictAboutChangesToGlobalState($this->beStrictAboutChangesToGlobalState); $test->setBackupGlobals($this->backupGlobals); $test->setBackupStaticAttributes($this->backupStaticAttributes); $test->setRunTestInSeparateProcess($this->runTestInSeparateProcess); } $test->run($result); } foreach ($hookMethods['afterClass'] as $afterClassMethod) { if ($this->testCase === true && class_exists($this->name, false) && method_exists($this->name, $afterClassMethod)) { call_user_func([$this->name, $afterClassMethod]); } } $this->tearDown(); $result->endTestSuite($this); return $result; } /** * @param bool $runTestInSeparateProcess * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.7.0 */ public function setRunTestInSeparateProcess($runTestInSeparateProcess) { if (is_bool($runTestInSeparateProcess)) { $this->runTestInSeparateProcess = $runTestInSeparateProcess; } else { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } } /** * Runs a test. * * @deprecated * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_TestResult $result */ public function runTest(PHPUnit_Framework_Test $test, PHPUnit_Framework_TestResult $result) { $test->run($result); } /** * Sets the name of the suite. * * @param string */ public function setName($name) { $this->name = $name; } /** * Returns the test at the given index. * * @param int * * @return PHPUnit_Framework_Test */ public function testAt($index) { if (isset($this->tests[$index])) { return $this->tests[$index]; } else { return false; } } /** * Returns the tests as an enumeration. * * @return array */ public function tests() { return $this->tests; } /** * Set tests of the test suite * * @param array $tests * * @since Method available since Release 4.0.0 */ public function setTests(array $tests) { $this->tests = $tests; } /** * Mark the test suite as skipped. * * @param string $message * * @throws PHPUnit_Framework_SkippedTestSuiteError * * @since Method available since Release 3.0.0 */ public function markTestSuiteSkipped($message = '') { throw new PHPUnit_Framework_SkippedTestSuiteError($message); } /** * @param ReflectionClass $class * @param ReflectionMethod $method */ protected function addTestMethod(ReflectionClass $class, ReflectionMethod $method) { if (!$this->isTestMethod($method)) { return; } $name = $method->getName(); if (!$method->isPublic()) { $this->addTest( self::warning( sprintf( 'Test method "%s" in test class "%s" is not public.', $name, $class->getName() ) ) ); return; } $test = self::createTest($class, $name); if ($test instanceof PHPUnit_Framework_TestCase || $test instanceof PHPUnit_Framework_TestSuite_DataProvider) { $test->setDependencies( PHPUnit_Util_Test::getDependencies($class->getName(), $name) ); } $this->addTest( $test, PHPUnit_Util_Test::getGroups($class->getName(), $name) ); } /** * @param ReflectionMethod $method * * @return bool */ public static function isTestMethod(ReflectionMethod $method) { if (strpos($method->name, 'test') === 0) { return true; } // @scenario on TestCase::testMethod() // @test on TestCase::testMethod() $doc_comment = $method->getDocComment(); return strpos($doc_comment, '@test') !== false || strpos($doc_comment, '@scenario') !== false; } /** * @param string $message * * @return PHPUnit_Framework_WarningTestCase */ protected static function warning($message) { return new PHPUnit_Framework_WarningTestCase($message); } /** * @param string $class * @param string $methodName * @param string $message * * @return PHPUnit_Framework_SkippedTestCase * * @since Method available since Release 4.3.0 */ protected static function skipTest($class, $methodName, $message) { return new PHPUnit_Framework_SkippedTestCase($class, $methodName, $message); } /** * @param string $class * @param string $methodName * @param string $message * * @return PHPUnit_Framework_IncompleteTestCase * * @since Method available since Release 4.3.0 */ protected static function incompleteTest($class, $methodName, $message) { return new PHPUnit_Framework_IncompleteTestCase($class, $methodName, $message); } /** * @param bool $beStrictAboutChangesToGlobalState * * @since Method available since Release 4.6.0 */ public function setbeStrictAboutChangesToGlobalState($beStrictAboutChangesToGlobalState) { if (is_null($this->beStrictAboutChangesToGlobalState) && is_bool($beStrictAboutChangesToGlobalState)) { $this->beStrictAboutChangesToGlobalState = $beStrictAboutChangesToGlobalState; } } /** * @param bool $backupGlobals * * @since Method available since Release 3.3.0 */ public function setBackupGlobals($backupGlobals) { if (is_null($this->backupGlobals) && is_bool($backupGlobals)) { $this->backupGlobals = $backupGlobals; } } /** * @param bool $backupStaticAttributes * * @since Method available since Release 3.4.0 */ public function setBackupStaticAttributes($backupStaticAttributes) { if (is_null($this->backupStaticAttributes) && is_bool($backupStaticAttributes)) { $this->backupStaticAttributes = $backupStaticAttributes; } } /** * Returns an iterator for this test suite. * * @return RecursiveIteratorIterator * * @since Method available since Release 3.1.0 */ public function getIterator() { $iterator = new PHPUnit_Util_TestSuiteIterator($this); if ($this->iteratorFilter !== null) { $iterator = $this->iteratorFilter->factory($iterator, $this); } return $iterator; } public function injectFilter(PHPUnit_Runner_Filter_Factory $filter) { $this->iteratorFilter = $filter; foreach ($this as $test) { if ($test instanceof self) { $test->injectFilter($filter); } } } /** * Template Method that is called before the tests * of this test suite are run. * * @since Method available since Release 3.1.0 */ protected function setUp() { } /** * Template Method that is called after the tests * of this test suite have finished running. * * @since Method available since Release 3.1.0 */ protected function tearDown() { } } phpunit-5.1.3/src/Framework/TestSuite/000077500000000000000000000000001263222771600176745ustar00rootroot00000000000000phpunit-5.1.3/src/Framework/TestSuite/DataProvider.php000066400000000000000000000012031263222771600227650ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 3.4.0 */ class PHPUnit_Framework_TestSuite_DataProvider extends PHPUnit_Framework_TestSuite { /** * Sets the dependencies of a TestCase. * * @param array $dependencies */ public function setDependencies(array $dependencies) { foreach ($this->tests as $test) { $test->setDependencies($dependencies); } } } phpunit-5.1.3/src/Framework/UnintentionallyCoveredCodeError.php000066400000000000000000000010071263222771600247630ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Extension to PHPUnit_Framework_AssertionFailedError to mark the special * case of a test test that unintentionally covers code. * * @since Class available since Release 4.0.0 */ class PHPUnit_Framework_UnintentionallyCoveredCodeError extends PHPUnit_Framework_RiskyTestError { } phpunit-5.1.3/src/Framework/Warning.php000066400000000000000000000011601263222771600200570ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Thrown when an there is a warning. * * @since Class available since Release 5.0.0 */ class PHPUnit_Framework_Warning extends PHPUnit_Framework_Exception implements PHPUnit_Framework_SelfDescribing { /** * Wrapper for getMessage() which is declared as final. * * @return string */ public function toString() { return $this->getMessage(); } } phpunit-5.1.3/src/Framework/WarningTestCase.php000066400000000000000000000027411263222771600215210ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A warning. * * @since Class available since Release 2.0.0 */ class PHPUnit_Framework_WarningTestCase extends PHPUnit_Framework_TestCase { /** * @var string */ protected $message = ''; /** * @var bool */ protected $backupGlobals = false; /** * @var bool */ protected $backupStaticAttributes = false; /** * @var bool */ protected $runTestInSeparateProcess = false; /** * @var bool */ protected $useErrorHandler = false; /** * @param string $message */ public function __construct($message = '') { $this->message = $message; parent::__construct('Warning'); } /** * @throws PHPUnit_Framework_Exception */ protected function runTest() { throw new PHPUnit_Framework_Warning($this->message); } /** * @return string * * @since Method available since Release 3.0.0 */ public function getMessage() { return $this->message; } /** * Returns a string representation of the test case. * * @return string * * @since Method available since Release 3.4.0 */ public function toString() { return 'Warning'; } } phpunit-5.1.3/src/Runner/000077500000000000000000000000001263222771600152575ustar00rootroot00000000000000phpunit-5.1.3/src/Runner/BaseTestRunner.php000066400000000000000000000071731263222771600207040ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Base class for all test runners. * * @since Class available since Release 2.0.0 */ abstract class PHPUnit_Runner_BaseTestRunner { const STATUS_PASSED = 0; const STATUS_SKIPPED = 1; const STATUS_INCOMPLETE = 2; const STATUS_FAILURE = 3; const STATUS_ERROR = 4; const STATUS_RISKY = 5; const STATUS_WARNING = 6; const SUITE_METHODNAME = 'suite'; /** * Returns the loader to be used. * * @return PHPUnit_Runner_TestSuiteLoader */ public function getLoader() { return new PHPUnit_Runner_StandardTestSuiteLoader; } /** * Returns the Test corresponding to the given suite. * This is a template method, subclasses override * the runFailed() and clearStatus() methods. * * @param string $suiteClassName * @param string $suiteClassFile * @param mixed $suffixes * * @return PHPUnit_Framework_Test */ public function getTest($suiteClassName, $suiteClassFile = '', $suffixes = '') { if (is_dir($suiteClassName) && !is_file($suiteClassName . '.php') && empty($suiteClassFile)) { $facade = new File_Iterator_Facade; $files = $facade->getFilesAsArray( $suiteClassName, $suffixes ); $suite = new PHPUnit_Framework_TestSuite($suiteClassName); $suite->addTestFiles($files); return $suite; } try { $testClass = $this->loadSuiteClass( $suiteClassName, $suiteClassFile ); } catch (PHPUnit_Framework_Exception $e) { $this->runFailed($e->getMessage()); return; } try { $suiteMethod = $testClass->getMethod(self::SUITE_METHODNAME); if (!$suiteMethod->isStatic()) { $this->runFailed( 'suite() method must be static.' ); return; } try { $test = $suiteMethod->invoke(null, $testClass->getName()); } catch (ReflectionException $e) { $this->runFailed( sprintf( "Failed to invoke suite() method.\n%s", $e->getMessage() ) ); return; } } catch (ReflectionException $e) { try { $test = new PHPUnit_Framework_TestSuite($testClass); } catch (PHPUnit_Framework_Exception $e) { $test = new PHPUnit_Framework_TestSuite; $test->setName($suiteClassName); } } $this->clearStatus(); return $test; } /** * Returns the loaded ReflectionClass for a suite name. * * @param string $suiteClassName * @param string $suiteClassFile * * @return ReflectionClass */ protected function loadSuiteClass($suiteClassName, $suiteClassFile = '') { $loader = $this->getLoader(); return $loader->load($suiteClassName, $suiteClassFile); } /** * Clears the status message. */ protected function clearStatus() { } /** * Override to define how to handle a failed loading of * a test suite. * * @param string $message */ abstract protected function runFailed($message); } phpunit-5.1.3/src/Runner/Exception.php000066400000000000000000000005641263222771600177330ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 4.0.0 */ class PHPUnit_Runner_Exception extends RuntimeException implements PHPUnit_Exception { } phpunit-5.1.3/src/Runner/Filter/000077500000000000000000000000001263222771600165045ustar00rootroot00000000000000phpunit-5.1.3/src/Runner/Filter/Factory.php000066400000000000000000000023221263222771600206230ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 4.0.0 */ class PHPUnit_Runner_Filter_Factory { /** * @var array */ private $filters = []; /** * @param ReflectionClass $filter * @param mixed $args */ public function addFilter(ReflectionClass $filter, $args) { if (!$filter->isSubclassOf('RecursiveFilterIterator')) { throw new InvalidArgumentException( sprintf( 'Class "%s" does not extend RecursiveFilterIterator', $filter->name ) ); } $this->filters[] = [$filter, $args]; } /** * @return FilterIterator */ public function factory(Iterator $iterator, PHPUnit_Framework_TestSuite $suite) { foreach ($this->filters as $filter) { list($class, $args) = $filter; $iterator = $class->newInstance($iterator, $args, $suite); } return $iterator; } } phpunit-5.1.3/src/Runner/Filter/Group.php000066400000000000000000000027731263222771600203220ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 4.0.0 */ abstract class PHPUnit_Runner_Filter_GroupFilterIterator extends RecursiveFilterIterator { /** * @var array */ protected $groupTests = []; /** * @param RecursiveIterator $iterator * @param array $groups * @param PHPUnit_Framework_TestSuite $suite */ public function __construct(RecursiveIterator $iterator, array $groups, PHPUnit_Framework_TestSuite $suite) { parent::__construct($iterator); foreach ($suite->getGroupDetails() as $group => $tests) { if (in_array($group, $groups)) { $testHashes = array_map( function ($test) { return spl_object_hash($test); }, $tests ); $this->groupTests = array_merge($this->groupTests, $testHashes); } } } /** * @return bool */ public function accept() { $test = $this->getInnerIterator()->current(); if ($test instanceof PHPUnit_Framework_TestSuite) { return true; } return $this->doAccept(spl_object_hash($test)); } abstract protected function doAccept($hash); } phpunit-5.1.3/src/Runner/Filter/Group/000077500000000000000000000000001263222771600176005ustar00rootroot00000000000000phpunit-5.1.3/src/Runner/Filter/Group/Exclude.php000066400000000000000000000007421263222771600217050ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 4.0.0 */ class PHPUnit_Runner_Filter_Group_Exclude extends PHPUnit_Runner_Filter_GroupFilterIterator { protected function doAccept($hash) { return !in_array($hash, $this->groupTests); } } phpunit-5.1.3/src/Runner/Filter/Group/Include.php000066400000000000000000000007411263222771600216760ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 4.0.0 */ class PHPUnit_Runner_Filter_Group_Include extends PHPUnit_Runner_Filter_GroupFilterIterator { protected function doAccept($hash) { return in_array($hash, $this->groupTests); } } phpunit-5.1.3/src/Runner/Filter/Test.php000066400000000000000000000060101263222771600201310ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 4.0.0 */ class PHPUnit_Runner_Filter_Test extends RecursiveFilterIterator { /** * @var string */ protected $filter = null; /** * @var int */ protected $filterMin; /** * @var int */ protected $filterMax; /** * @param RecursiveIterator $iterator * @param string $filter */ public function __construct(RecursiveIterator $iterator, $filter) { parent::__construct($iterator); $this->setFilter($filter); } /** * @param string $filter */ protected function setFilter($filter) { if (PHPUnit_Util_Regex::pregMatchSafe($filter, '') === false) { // Handles: // * testAssertEqualsSucceeds#4 // * testAssertEqualsSucceeds#4-8 if (preg_match('/^(.*?)#(\d+)(?:-(\d+))?$/', $filter, $matches)) { if (isset($matches[3]) && $matches[2] < $matches[3]) { $filter = sprintf( '%s.*with data set #(\d+)$', $matches[1] ); $this->filterMin = $matches[2]; $this->filterMax = $matches[3]; } else { $filter = sprintf( '%s.*with data set #%s$', $matches[1], $matches[2] ); } } // Handles: // * testDetermineJsonError@JSON_ERROR_NONE // * testDetermineJsonError@JSON.* elseif (preg_match('/^(.*?)@(.+)$/', $filter, $matches)) { $filter = sprintf( '%s.*with data set "%s"$', $matches[1], $matches[2] ); } // Escape delimiters in regular expression. Do NOT use preg_quote, // to keep magic characters. $filter = sprintf('/%s/', str_replace( '/', '\\/', $filter )); } $this->filter = $filter; } /** * @return bool */ public function accept() { $test = $this->getInnerIterator()->current(); if ($test instanceof PHPUnit_Framework_TestSuite) { return true; } $tmp = PHPUnit_Util_Test::describe($test, false); if ($tmp[0] != '') { $name = implode('::', $tmp); } else { $name = $tmp[1]; } $accepted = preg_match($this->filter, $name, $matches); if ($accepted && isset($this->filterMax)) { $set = end($matches); $accepted = $set >= $this->filterMin && $set <= $this->filterMax; } return $accepted; } } phpunit-5.1.3/src/Runner/StandardTestSuiteLoader.php000066400000000000000000000067141263222771600225410ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * The standard test suite loader. * * @since Class available since Release 2.0.0 */ class PHPUnit_Runner_StandardTestSuiteLoader implements PHPUnit_Runner_TestSuiteLoader { /** * @param string $suiteClassName * @param string $suiteClassFile * * @return ReflectionClass * * @throws PHPUnit_Framework_Exception */ public function load($suiteClassName, $suiteClassFile = '') { $suiteClassName = str_replace('.php', '', $suiteClassName); if (empty($suiteClassFile)) { $suiteClassFile = PHPUnit_Util_Filesystem::classNameToFilename( $suiteClassName ); } if (!class_exists($suiteClassName, false)) { $loadedClasses = get_declared_classes(); $filename = PHPUnit_Util_Fileloader::checkAndLoad($suiteClassFile); $loadedClasses = array_values( array_diff(get_declared_classes(), $loadedClasses) ); } if (!class_exists($suiteClassName, false) && !empty($loadedClasses)) { $offset = 0 - strlen($suiteClassName); foreach ($loadedClasses as $loadedClass) { $class = new ReflectionClass($loadedClass); if (substr($loadedClass, $offset) === $suiteClassName && $class->getFileName() == $filename) { $suiteClassName = $loadedClass; break; } } } if (!class_exists($suiteClassName, false) && !empty($loadedClasses)) { $testCaseClass = 'PHPUnit_Framework_TestCase'; foreach ($loadedClasses as $loadedClass) { $class = new ReflectionClass($loadedClass); $classFile = $class->getFileName(); if ($class->isSubclassOf($testCaseClass) && !$class->isAbstract()) { $suiteClassName = $loadedClass; $testCaseClass = $loadedClass; if ($classFile == realpath($suiteClassFile)) { break; } } if ($class->hasMethod('suite')) { $method = $class->getMethod('suite'); if (!$method->isAbstract() && $method->isPublic() && $method->isStatic()) { $suiteClassName = $loadedClass; if ($classFile == realpath($suiteClassFile)) { break; } } } } } if (class_exists($suiteClassName, false)) { $class = new ReflectionClass($suiteClassName); if ($class->getFileName() == realpath($suiteClassFile)) { return $class; } } throw new PHPUnit_Framework_Exception( sprintf( "Class '%s' could not be found in '%s'.", $suiteClassName, $suiteClassFile ) ); } /** * @param ReflectionClass $aClass * * @return ReflectionClass */ public function reload(ReflectionClass $aClass) { return $aClass; } } phpunit-5.1.3/src/Runner/TestSuiteLoader.php000066400000000000000000000013441263222771600210520ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * An interface to define how a test suite should be loaded. * * @since Interface available since Release 2.0.0 */ interface PHPUnit_Runner_TestSuiteLoader { /** * @param string $suiteClassName * @param string $suiteClassFile * * @return ReflectionClass */ public function load($suiteClassName, $suiteClassFile = ''); /** * @param ReflectionClass $aClass * * @return ReflectionClass */ public function reload(ReflectionClass $aClass); } phpunit-5.1.3/src/Runner/Version.php000066400000000000000000000032111263222771600174120ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * This class defines the current version of PHPUnit. * * @since Class available since Release 2.0.0 */ class PHPUnit_Runner_Version { private static $pharVersion; private static $version; /** * Returns the current version of PHPUnit. * * @return string */ public static function id() { if (self::$pharVersion !== null) { return self::$pharVersion; } if (self::$version === null) { $version = new SebastianBergmann\Version('5.1.3', dirname(dirname(__DIR__))); self::$version = $version->getVersion(); } return self::$version; } /** * @return string * * @since Method available since Release 4.8.13 */ public static function series() { return implode('.', array_slice(explode('.', self::id()), 0, 2)); } /** * @return string */ public static function getVersionString() { return 'PHPUnit ' . self::id() . ' by Sebastian Bergmann and contributors.'; } /** * @return string * * @since Method available since Release 4.0.0 */ public static function getReleaseChannel() { if (strpos(self::$pharVersion, 'alpha') !== false) { return '-alpha'; } if (strpos(self::$pharVersion, 'beta') !== false) { return '-beta'; } return ''; } } phpunit-5.1.3/src/TextUI/000077500000000000000000000000001263222771600151705ustar00rootroot00000000000000phpunit-5.1.3/src/TextUI/Command.php000066400000000000000000001046621263222771600172700ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A TestRunner for the Command Line Interface (CLI) * PHP SAPI Module. * * @since Class available since Release 3.0.0 */ class PHPUnit_TextUI_Command { /** * @var array */ protected $arguments = [ 'listGroups' => false, 'loader' => null, 'useDefaultConfiguration' => true ]; /** * @var array */ protected $options = []; /** * @var array */ protected $longOptions = [ 'atleast-version=' => null, 'bootstrap=' => null, 'colors==' => null, 'columns=' => null, 'configuration=' => null, 'coverage-clover=' => null, 'coverage-crap4j=' => null, 'coverage-html=' => null, 'coverage-php=' => null, 'coverage-text==' => null, 'coverage-xml=' => null, 'debug' => null, 'disallow-test-output' => null, 'disallow-resource-usage' => null, 'disallow-todo-tests' => null, 'enforce-time-limit' => null, 'exclude-group=' => null, 'filter=' => null, 'group=' => null, 'help' => null, 'include-path=' => null, 'list-groups' => null, 'loader=' => null, 'log-json=' => null, 'log-junit=' => null, 'log-tap=' => null, 'log-teamcity=' => null, 'no-configuration' => null, 'no-coverage' => null, 'no-globals-backup' => null, 'printer=' => null, 'process-isolation' => null, 'repeat=' => null, 'report-useless-tests' => null, 'reverse-list' => null, 'static-backup' => null, 'stderr' => null, 'stop-on-error' => null, 'stop-on-failure' => null, 'stop-on-warning' => null, 'stop-on-incomplete' => null, 'stop-on-risky' => null, 'stop-on-skipped' => null, 'strict-coverage' => null, 'strict-global-state' => null, 'tap' => null, 'teamcity' => null, 'testdox' => null, 'testdox-html=' => null, 'testdox-text=' => null, 'test-suffix=' => null, 'testsuite=' => null, 'verbose' => null, 'version' => null, 'whitelist=' => null ]; /** * @var bool */ private $versionStringPrinted = false; /** * @param bool $exit */ public static function main($exit = true) { $command = new static; return $command->run($_SERVER['argv'], $exit); } /** * @param array $argv * @param bool $exit * * @return int */ public function run(array $argv, $exit = true) { $this->handleArguments($argv); $runner = $this->createRunner(); if (is_object($this->arguments['test']) && $this->arguments['test'] instanceof PHPUnit_Framework_Test) { $suite = $this->arguments['test']; } else { $suite = $runner->getTest( $this->arguments['test'], $this->arguments['testFile'], $this->arguments['testSuffixes'] ); } if ($this->arguments['listGroups']) { $this->printVersionString(); print "Available test group(s):\n"; $groups = $suite->getGroups(); sort($groups); foreach ($groups as $group) { print " - $group\n"; } if ($exit) { exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); } else { return PHPUnit_TextUI_TestRunner::SUCCESS_EXIT; } } unset($this->arguments['test']); unset($this->arguments['testFile']); try { $result = $runner->doRun($suite, $this->arguments); } catch (PHPUnit_Framework_Exception $e) { print $e->getMessage() . "\n"; } $ret = PHPUnit_TextUI_TestRunner::FAILURE_EXIT; if (isset($result) && $result->wasSuccessful()) { $ret = PHPUnit_TextUI_TestRunner::SUCCESS_EXIT; } elseif (!isset($result) || $result->errorCount() > 0) { $ret = PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT; } if ($exit) { exit($ret); } else { return $ret; } } /** * Create a TestRunner, override in subclasses. * * @return PHPUnit_TextUI_TestRunner * * @since Method available since Release 3.6.0 */ protected function createRunner() { return new PHPUnit_TextUI_TestRunner($this->arguments['loader']); } /** * Handles the command-line arguments. * * A child class of PHPUnit_TextUI_Command can hook into the argument * parsing by adding the switch(es) to the $longOptions array and point to a * callback method that handles the switch(es) in the child class like this * * * longOptions['my-switch'] = 'myHandler'; * // my-secondswitch will accept a value - note the equals sign * $this->longOptions['my-secondswitch='] = 'myOtherHandler'; * } * * // --my-switch -> myHandler() * protected function myHandler() * { * } * * // --my-secondswitch foo -> myOtherHandler('foo') * protected function myOtherHandler ($value) * { * } * * // You will also need this - the static keyword in the * // PHPUnit_TextUI_Command will mean that it'll be * // PHPUnit_TextUI_Command that gets instantiated, * // not MyCommand * public static function main($exit = true) * { * $command = new static; * * return $command->run($_SERVER['argv'], $exit); * } * * } * * * @param array $argv */ protected function handleArguments(array $argv) { if (defined('__PHPUNIT_PHAR__')) { $this->longOptions['check-version'] = null; $this->longOptions['selfupdate'] = null; $this->longOptions['self-update'] = null; $this->longOptions['selfupgrade'] = null; $this->longOptions['self-upgrade'] = null; } try { $this->options = PHPUnit_Util_Getopt::getopt( $argv, 'd:c:hv', array_keys($this->longOptions) ); } catch (PHPUnit_Framework_Exception $e) { $this->showError($e->getMessage()); } foreach ($this->options[0] as $option) { switch ($option[0]) { case '--colors': $this->arguments['colors'] = $option[1] ?: PHPUnit_TextUI_ResultPrinter::COLOR_AUTO; break; case '--bootstrap': $this->arguments['bootstrap'] = $option[1]; break; case '--columns': if (is_numeric($option[1])) { $this->arguments['columns'] = (int) $option[1]; } elseif ($option[1] == 'max') { $this->arguments['columns'] = 'max'; } break; case 'c': case '--configuration': $this->arguments['configuration'] = $option[1]; break; case '--coverage-clover': $this->arguments['coverageClover'] = $option[1]; break; case '--coverage-crap4j': $this->arguments['coverageCrap4J'] = $option[1]; break; case '--coverage-html': $this->arguments['coverageHtml'] = $option[1]; break; case '--coverage-php': $this->arguments['coveragePHP'] = $option[1]; break; case '--coverage-text': if ($option[1] === null) { $option[1] = 'php://stdout'; } $this->arguments['coverageText'] = $option[1]; $this->arguments['coverageTextShowUncoveredFiles'] = false; $this->arguments['coverageTextShowOnlySummary'] = false; break; case '--coverage-xml': $this->arguments['coverageXml'] = $option[1]; break; case 'd': $ini = explode('=', $option[1]); if (isset($ini[0])) { if (isset($ini[1])) { ini_set($ini[0], $ini[1]); } else { ini_set($ini[0], true); } } break; case '--debug': $this->arguments['debug'] = true; break; case 'h': case '--help': $this->showHelp(); exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); break; case '--filter': $this->arguments['filter'] = $option[1]; break; case '--testsuite': $this->arguments['testsuite'] = $option[1]; break; case '--group': $this->arguments['groups'] = explode(',', $option[1]); break; case '--exclude-group': $this->arguments['excludeGroups'] = explode( ',', $option[1] ); break; case '--test-suffix': $this->arguments['testSuffixes'] = explode( ',', $option[1] ); break; case '--include-path': $includePath = $option[1]; break; case '--list-groups': $this->arguments['listGroups'] = true; break; case '--printer': $this->arguments['printer'] = $option[1]; break; case '--loader': $this->arguments['loader'] = $option[1]; break; case '--log-json': $this->arguments['jsonLogfile'] = $option[1]; break; case '--log-junit': $this->arguments['junitLogfile'] = $option[1]; break; case '--log-tap': $this->arguments['tapLogfile'] = $option[1]; break; case '--log-teamcity': $this->arguments['teamcityLogfile'] = $option[1]; break; case '--process-isolation': $this->arguments['processIsolation'] = true; break; case '--repeat': $this->arguments['repeat'] = (int) $option[1]; break; case '--stderr': $this->arguments['stderr'] = true; break; case '--stop-on-error': $this->arguments['stopOnError'] = true; break; case '--stop-on-failure': $this->arguments['stopOnFailure'] = true; break; case '--stop-on-warning': $this->arguments['stopOnWarning'] = true; break; case '--stop-on-incomplete': $this->arguments['stopOnIncomplete'] = true; break; case '--stop-on-risky': $this->arguments['stopOnRisky'] = true; break; case '--stop-on-skipped': $this->arguments['stopOnSkipped'] = true; break; case '--tap': $this->arguments['printer'] = 'PHPUnit_Util_Log_TAP'; break; case '--teamcity': $this->arguments['printer'] = 'PHPUnit_Util_Log_TeamCity'; break; case '--testdox': $this->arguments['printer'] = 'PHPUnit_Util_TestDox_ResultPrinter_Text'; break; case '--testdox-html': $this->arguments['testdoxHTMLFile'] = $option[1]; break; case '--testdox-text': $this->arguments['testdoxTextFile'] = $option[1]; break; case '--no-configuration': $this->arguments['useDefaultConfiguration'] = false; break; case '--no-coverage': $this->arguments['noCoverage'] = true; break; case '--no-globals-backup': $this->arguments['backupGlobals'] = false; break; case '--static-backup': $this->arguments['backupStaticAttributes'] = true; break; case 'v': case '--verbose': $this->arguments['verbose'] = true; break; case '--atleast-version': exit(version_compare(PHPUnit_Runner_Version::id(), $option[1], '>=') ? PHPUnit_TextUI_TestRunner::SUCCESS_EXIT : PHPUnit_TextUI_TestRunner::FAILURE_EXIT ); break; case '--version': $this->printVersionString(); exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); break; case '--report-useless-tests': $this->arguments['reportUselessTests'] = true; break; case '--strict-coverage': $this->arguments['strictCoverage'] = true; break; case '--strict-global-state': $this->arguments['beStrictAboutChangesToGlobalState'] = true; break; case '--disallow-test-output': $this->arguments['disallowTestOutput'] = true; break; case '--disallow-resource-usage': $this->arguments['beStrictAboutResourceUsageDuringSmallTests'] = true; break; case '--enforce-time-limit': $this->arguments['enforceTimeLimit'] = true; break; case '--disallow-todo-tests': $this->arguments['disallowTodoAnnotatedTests'] = true; break; case '--reverse-list': $this->arguments['reverseList'] = true; break; case '--check-version': $this->handleVersionCheck(); break; case '--selfupdate': case '--self-update': $this->handleSelfUpdate(); break; case '--selfupgrade': case '--self-upgrade': $this->handleSelfUpdate(true); break; case '--whitelist': $this->arguments['whitelist'] = $option[1]; break; default: $optionName = str_replace('--', '', $option[0]); if (isset($this->longOptions[$optionName])) { $handler = $this->longOptions[$optionName]; } elseif (isset($this->longOptions[$optionName . '='])) { $handler = $this->longOptions[$optionName . '=']; } if (isset($handler) && is_callable([$this, $handler])) { $this->$handler($option[1]); } } } $this->handleCustomTestSuite(); if (!isset($this->arguments['test'])) { if (isset($this->options[1][0])) { $this->arguments['test'] = $this->options[1][0]; } if (isset($this->options[1][1])) { $this->arguments['testFile'] = realpath($this->options[1][1]); } else { $this->arguments['testFile'] = ''; } if (isset($this->arguments['test']) && is_file($this->arguments['test']) && substr($this->arguments['test'], -5, 5) != '.phpt') { $this->arguments['testFile'] = realpath($this->arguments['test']); $this->arguments['test'] = substr($this->arguments['test'], 0, strrpos($this->arguments['test'], '.')); } } if (!isset($this->arguments['testSuffixes'])) { $this->arguments['testSuffixes'] = ['Test.php', '.phpt']; } if (isset($includePath)) { ini_set( 'include_path', $includePath . PATH_SEPARATOR . ini_get('include_path') ); } if ($this->arguments['loader'] !== null) { $this->arguments['loader'] = $this->handleLoader($this->arguments['loader']); } if (isset($this->arguments['configuration']) && is_dir($this->arguments['configuration'])) { $configurationFile = $this->arguments['configuration'] . '/phpunit.xml'; if (file_exists($configurationFile)) { $this->arguments['configuration'] = realpath( $configurationFile ); } elseif (file_exists($configurationFile . '.dist')) { $this->arguments['configuration'] = realpath( $configurationFile . '.dist' ); } } elseif (!isset($this->arguments['configuration']) && $this->arguments['useDefaultConfiguration']) { if (file_exists('phpunit.xml')) { $this->arguments['configuration'] = realpath('phpunit.xml'); } elseif (file_exists('phpunit.xml.dist')) { $this->arguments['configuration'] = realpath( 'phpunit.xml.dist' ); } } if (isset($this->arguments['configuration'])) { try { $configuration = PHPUnit_Util_Configuration::getInstance( $this->arguments['configuration'] ); } catch (Throwable $e) { print $e->getMessage() . "\n"; exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT); } catch (Exception $e) { print $e->getMessage() . "\n"; exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT); } $phpunitConfiguration = $configuration->getPHPUnitConfiguration(); $configuration->handlePHPConfiguration(); /* * Issue #1216 */ if (isset($this->arguments['bootstrap'])) { $this->handleBootstrap($this->arguments['bootstrap']); } elseif (isset($phpunitConfiguration['bootstrap'])) { $this->handleBootstrap($phpunitConfiguration['bootstrap']); } /* * Issue #657 */ if (isset($phpunitConfiguration['stderr']) && ! isset($this->arguments['stderr'])) { $this->arguments['stderr'] = $phpunitConfiguration['stderr']; } if (isset($phpunitConfiguration['columns']) && ! isset($this->arguments['columns'])) { $this->arguments['columns'] = $phpunitConfiguration['columns']; } if (!isset($this->arguments['printer']) && isset($phpunitConfiguration['printerClass'])) { if (isset($phpunitConfiguration['printerFile'])) { $file = $phpunitConfiguration['printerFile']; } else { $file = ''; } $this->arguments['printer'] = $this->handlePrinter( $phpunitConfiguration['printerClass'], $file ); } if (isset($phpunitConfiguration['testSuiteLoaderClass'])) { if (isset($phpunitConfiguration['testSuiteLoaderFile'])) { $file = $phpunitConfiguration['testSuiteLoaderFile']; } else { $file = ''; } $this->arguments['loader'] = $this->handleLoader( $phpunitConfiguration['testSuiteLoaderClass'], $file ); } if (!isset($this->arguments['test'])) { $testSuite = $configuration->getTestSuiteConfiguration(isset($this->arguments['testsuite']) ? $this->arguments['testsuite'] : null); if ($testSuite !== null) { $this->arguments['test'] = $testSuite; } } } elseif (isset($this->arguments['bootstrap'])) { $this->handleBootstrap($this->arguments['bootstrap']); } if (isset($this->arguments['printer']) && is_string($this->arguments['printer'])) { $this->arguments['printer'] = $this->handlePrinter($this->arguments['printer']); } if (isset($this->arguments['test']) && is_string($this->arguments['test']) && substr($this->arguments['test'], -5, 5) == '.phpt') { $test = new PHPUnit_Extensions_PhptTestCase($this->arguments['test']); $this->arguments['test'] = new PHPUnit_Framework_TestSuite; $this->arguments['test']->addTest($test); } if (!isset($this->arguments['test']) || (isset($this->arguments['testDatabaseLogRevision']) && !isset($this->arguments['testDatabaseDSN']))) { $this->showHelp(); exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT); } } /** * Handles the loading of the PHPUnit_Runner_TestSuiteLoader implementation. * * @param string $loaderClass * @param string $loaderFile * * @return PHPUnit_Runner_TestSuiteLoader */ protected function handleLoader($loaderClass, $loaderFile = '') { if (!class_exists($loaderClass, false)) { if ($loaderFile == '') { $loaderFile = PHPUnit_Util_Filesystem::classNameToFilename( $loaderClass ); } $loaderFile = stream_resolve_include_path($loaderFile); if ($loaderFile) { require $loaderFile; } } if (class_exists($loaderClass, false)) { $class = new ReflectionClass($loaderClass); if ($class->implementsInterface('PHPUnit_Runner_TestSuiteLoader') && $class->isInstantiable()) { return $class->newInstance(); } } if ($loaderClass == 'PHPUnit_Runner_StandardTestSuiteLoader') { return; } $this->showError( sprintf( 'Could not use "%s" as loader.', $loaderClass ) ); } /** * Handles the loading of the PHPUnit_Util_Printer implementation. * * @param string $printerClass * @param string $printerFile * * @return PHPUnit_Util_Printer */ protected function handlePrinter($printerClass, $printerFile = '') { if (!class_exists($printerClass, false)) { if ($printerFile == '') { $printerFile = PHPUnit_Util_Filesystem::classNameToFilename( $printerClass ); } $printerFile = stream_resolve_include_path($printerFile); if ($printerFile) { require $printerFile; } } if (class_exists($printerClass)) { $class = new ReflectionClass($printerClass); if ($class->implementsInterface('PHPUnit_Framework_TestListener') && $class->isSubclassOf('PHPUnit_Util_Printer') && $class->isInstantiable()) { if ($class->isSubclassOf('PHPUnit_TextUI_ResultPrinter')) { return $printerClass; } $outputStream = isset($this->arguments['stderr']) ? 'php://stderr' : null; return $class->newInstance($outputStream); } } $this->showError( sprintf( 'Could not use "%s" as printer.', $printerClass ) ); } /** * Loads a bootstrap file. * * @param string $filename */ protected function handleBootstrap($filename) { try { PHPUnit_Util_Fileloader::checkAndLoad($filename); } catch (PHPUnit_Framework_Exception $e) { $this->showError($e->getMessage()); } } /** * @since Method available since Release 4.0.0 */ protected function handleSelfUpdate($upgrade = false) { $this->printVersionString(); $localFilename = realpath($_SERVER['argv'][0]); if (!is_writable($localFilename)) { print 'No write permission to update ' . $localFilename . "\n"; exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT); } if (!extension_loaded('openssl')) { print "The OpenSSL extension is not loaded.\n"; exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT); } if (!$upgrade) { $remoteFilename = sprintf( 'https://phar.phpunit.de/phpunit-%s.phar', file_get_contents( sprintf( 'https://phar.phpunit.de/latest-version-of/phpunit-%s', PHPUnit_Runner_Version::series() ) ) ); } else { $remoteFilename = sprintf( 'https://phar.phpunit.de/phpunit%s.phar', PHPUnit_Runner_Version::getReleaseChannel() ); } $tempFilename = tempnam(sys_get_temp_dir(), 'phpunit') . '.phar'; // Workaround for https://bugs.php.net/bug.php?id=65538 $caFile = dirname($tempFilename) . '/ca.pem'; copy(__PHPUNIT_PHAR_ROOT__ . '/ca.pem', $caFile); print 'Updating the PHPUnit PHAR ... '; $options = [ 'ssl' => [ 'allow_self_signed' => false, 'cafile' => $caFile, 'verify_peer' => true ] ]; file_put_contents( $tempFilename, file_get_contents( $remoteFilename, false, stream_context_create($options) ) ); chmod($tempFilename, 0777 & ~umask()); try { $phar = new Phar($tempFilename); unset($phar); rename($tempFilename, $localFilename); unlink($caFile); } catch (Throwable $_e) { $e = $_e; } catch (Exception $_e) { $e = $_e; } if (isset($e)) { unlink($caFile); unlink($tempFilename); print " done\n\n" . $e->getMessage() . "\n"; exit(2); } print " done\n"; exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); } /** * @since Method available since Release 4.8.0 */ protected function handleVersionCheck() { $this->printVersionString(); $latestVersion = file_get_contents('https://phar.phpunit.de/latest-version-of/phpunit'); $isOutdated = version_compare($latestVersion, PHPUnit_Runner_Version::id(), '>'); if ($isOutdated) { print "You are not using the latest version of PHPUnit.\n"; print 'Use "phpunit --self-upgrade" to install PHPUnit ' . $latestVersion . "\n"; } else { print "You are using the latest version of PHPUnit.\n"; } exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); } /** * Show the help message. */ protected function showHelp() { $this->printVersionString(); print << Code Coverage Options: --coverage-clover Generate code coverage report in Clover XML format. --coverage-crap4j Generate code coverage report in Crap4J XML format. --coverage-html Generate code coverage report in HTML format. --coverage-php Export PHP_CodeCoverage object to file. --coverage-text= Generate code coverage report in text format. Default: Standard output. --coverage-xml Generate code coverage report in PHPUnit XML format. --whitelist Whitelist for code coverage analysis. Logging Options: --log-junit Log test execution in JUnit XML format to file. --log-tap Log test execution in TAP format to file. --log-teamcity Log test execution in TeamCity format to file. --log-json Log test execution in JSON format. --testdox-html Write agile documentation in HTML format to file. --testdox-text Write agile documentation in Text format to file. --reverse-list Print defects in reverse order Test Selection Options: --filter Filter which tests to run. --testsuite Filter which testsuite to run. --group ... Only runs tests from the specified group(s). --exclude-group ... Exclude tests from the specified group(s). --list-groups List available test groups. --test-suffix ... Only search for test in files with specified suffix(es). Default: Test.php,.phpt Test Execution Options: --report-useless-tests Be strict about tests that do not test anything. --strict-coverage Be strict about unintentionally covered code. --strict-global-state Be strict about changes to global state --disallow-test-output Be strict about output during tests. --disallow-resource-usage Be strict about resource usage during small tests. --enforce-time-limit Enforce time limit based on test size. --disallow-todo-tests Disallow @todo-annotated tests. --process-isolation Run each test in a separate PHP process. --no-globals-backup Do not backup and restore \$GLOBALS for each test. --static-backup Backup and restore static attributes for each test. --colors= Use colors in output ("never", "auto" or "always"). --columns Number of columns to use for progress output. --columns max Use maximum number of columns for progress output. --stderr Write to STDERR instead of STDOUT. --stop-on-error Stop execution upon first error. --stop-on-failure Stop execution upon first error or failure. --stop-on-warning Stop execution upon first warning. --stop-on-risky Stop execution upon first risky test. --stop-on-skipped Stop execution upon first skipped test. --stop-on-incomplete Stop execution upon first incomplete test. -v|--verbose Output more verbose information. --debug Display debugging information during test execution. --loader TestSuiteLoader implementation to use. --repeat Runs the test(s) repeatedly. --tap Report test execution progress in TAP format. --teamcity Report test execution progress in TeamCity format. --testdox Report test execution progress in TestDox format. --printer TestListener implementation to use. Configuration Options: --bootstrap A "bootstrap" PHP file that is run before the tests. -c|--configuration Read configuration from XML file. --no-configuration Ignore default configuration file (phpunit.xml). --no-coverage Ignore code coverage configuration. --include-path Prepend PHP's include_path with given path(s). -d key[=value] Sets a php.ini value. Miscellaneous Options: -h|--help Prints this usage information. --version Prints the version and exits. --atleast-version Checks that version is greater than min and exits. EOT; if (defined('__PHPUNIT_PHAR__')) { print "\n --check-version Check whether PHPUnit is the latest version."; print "\n --self-update Update PHPUnit to the latest version within the same\n release series.\n"; print "\n --self-upgrade Upgrade PHPUnit to the latest version.\n"; } } /** * Custom callback for test suite discovery. */ protected function handleCustomTestSuite() { } private function printVersionString() { if ($this->versionStringPrinted) { return; } print PHPUnit_Runner_Version::getVersionString() . "\n\n"; $this->versionStringPrinted = true; } /** */ private function showError($message) { $this->printVersionString(); print $message . "\n"; exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT); } } phpunit-5.1.3/src/TextUI/ResultPrinter.php000066400000000000000000000460661263222771600205370ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use SebastianBergmann\Environment\Console; /** * Prints the result of a TextUI TestRunner run. * * @since Class available since Release 2.0.0 */ class PHPUnit_TextUI_ResultPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener { const EVENT_TEST_START = 0; const EVENT_TEST_END = 1; const EVENT_TESTSUITE_START = 2; const EVENT_TESTSUITE_END = 3; const COLOR_NEVER = 'never'; const COLOR_AUTO = 'auto'; const COLOR_ALWAYS = 'always'; const COLOR_DEFAULT = self::COLOR_NEVER; /** * @var array */ private static $ansiCodes = [ 'bold' => 1, 'fg-black' => 30, 'fg-red' => 31, 'fg-green' => 32, 'fg-yellow' => 33, 'fg-blue' => 34, 'fg-magenta' => 35, 'fg-cyan' => 36, 'fg-white' => 37, 'bg-black' => 40, 'bg-red' => 41, 'bg-green' => 42, 'bg-yellow' => 43, 'bg-blue' => 44, 'bg-magenta' => 45, 'bg-cyan' => 46, 'bg-white' => 47 ]; /** * @var int */ protected $column = 0; /** * @var int */ protected $maxColumn; /** * @var bool */ protected $lastTestFailed = false; /** * @var int */ protected $numAssertions = 0; /** * @var int */ protected $numTests = -1; /** * @var int */ protected $numTestsRun = 0; /** * @var int */ protected $numTestsWidth; /** * @var bool */ protected $colors = false; /** * @var bool */ protected $debug = false; /** * @var bool */ protected $verbose = false; /** * @var int */ private $numberOfColumns; /** * @var bool */ private $reverse = false; /** * Constructor. * * @param mixed $out * @param bool $verbose * @param string $colors * @param bool $debug * @param int|string $numberOfColumns * @param bool $reverse * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.0.0 */ public function __construct($out = null, $verbose = false, $colors = self::COLOR_DEFAULT, $debug = false, $numberOfColumns = 80, $reverse = false) { parent::__construct($out); if (!is_bool($verbose)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'boolean'); } $availableColors = [self::COLOR_NEVER, self::COLOR_AUTO, self::COLOR_ALWAYS]; if (!in_array($colors, $availableColors)) { throw PHPUnit_Util_InvalidArgumentHelper::factory( 3, vsprintf('value from "%s", "%s" or "%s"', $availableColors) ); } if (!is_bool($debug)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(4, 'boolean'); } if (!is_int($numberOfColumns) && $numberOfColumns != 'max') { throw PHPUnit_Util_InvalidArgumentHelper::factory(5, 'integer or "max"'); } if (!is_bool($reverse)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(6, 'boolean'); } $console = new Console; $maxNumberOfColumns = $console->getNumberOfColumns(); if ($numberOfColumns == 'max' || $numberOfColumns > $maxNumberOfColumns) { $numberOfColumns = $maxNumberOfColumns; } $this->numberOfColumns = $numberOfColumns; $this->verbose = $verbose; $this->debug = $debug; $this->reverse = $reverse; if ($colors === self::COLOR_AUTO && $console->hasColorSupport()) { $this->colors = true; } else { $this->colors = (self::COLOR_ALWAYS === $colors); } } /** * @param PHPUnit_Framework_TestResult $result */ public function printResult(PHPUnit_Framework_TestResult $result) { $this->printHeader(); $this->printErrors($result); $printSeparator = $result->errorCount() > 0; $hasFailures = $result->failureCount() > 0; $hasWarnings = $result->warningCount() > 0; if ($printSeparator && ($hasFailures || $hasWarnings)) { $this->write("\n--\n\n"); } $printSeparator = $printSeparator || $hasFailures || $hasWarnings; if ($hasWarnings) { $this->printWarnings($result); } else { $this->printFailures($result); } if ($this->verbose) { if ($printSeparator && $result->riskyCount() > 0) { $this->write("\n--\n\n"); } $printSeparator = $printSeparator || $result->riskyCount() > 0; $this->printRisky($result); if ($printSeparator && $result->notImplementedCount() > 0) { $this->write("\n--\n\n"); } $printSeparator = $printSeparator || $result->notImplementedCount() > 0; $this->printIncompletes($result); if ($printSeparator && $result->skippedCount() > 0) { $this->write("\n--\n\n"); } $this->printSkipped($result); } $this->printFooter($result); } /** * @param array $defects * @param string $type */ protected function printDefects(array $defects, $type) { $count = count($defects); if ($count == 0) { return; } $this->write( sprintf( "There %s %d %s%s:\n", ($count == 1) ? 'was' : 'were', $count, $type, ($count == 1) ? '' : 's' ) ); $i = 1; if ($this->reverse) { $defects = array_reverse($defects); } foreach ($defects as $defect) { $this->printDefect($defect, $i++); } } /** * @param PHPUnit_Framework_TestFailure $defect * @param int $count */ protected function printDefect(PHPUnit_Framework_TestFailure $defect, $count) { $this->printDefectHeader($defect, $count); $this->printDefectTrace($defect); } /** * @param PHPUnit_Framework_TestFailure $defect * @param int $count */ protected function printDefectHeader(PHPUnit_Framework_TestFailure $defect, $count) { $this->write( sprintf( "\n%d) %s\n", $count, $defect->getTestName() ) ); } /** * @param PHPUnit_Framework_TestFailure $defect */ protected function printDefectTrace(PHPUnit_Framework_TestFailure $defect) { $e = $defect->thrownException(); $this->write((string) $e); while ($e = $e->getPrevious()) { $this->write("\nCaused by\n" . $e); } } /** * @param PHPUnit_Framework_TestResult $result */ protected function printErrors(PHPUnit_Framework_TestResult $result) { $this->printDefects($result->errors(), 'error'); } /** * @param PHPUnit_Framework_TestResult $result */ protected function printFailures(PHPUnit_Framework_TestResult $result) { $this->printDefects($result->failures(), 'failure'); } /** * @param PHPUnit_Framework_TestResult $result */ protected function printWarnings(PHPUnit_Framework_TestResult $result) { $this->printDefects($result->warnings(), 'warning'); } /** * @param PHPUnit_Framework_TestResult $result */ protected function printIncompletes(PHPUnit_Framework_TestResult $result) { $this->printDefects($result->notImplemented(), 'incomplete test'); } /** * @param PHPUnit_Framework_TestResult $result * * @since Method available since Release 4.0.0 */ protected function printRisky(PHPUnit_Framework_TestResult $result) { $this->printDefects($result->risky(), 'risky test'); } /** * @param PHPUnit_Framework_TestResult $result * * @since Method available since Release 3.0.0 */ protected function printSkipped(PHPUnit_Framework_TestResult $result) { $this->printDefects($result->skipped(), 'skipped test'); } protected function printHeader() { $this->write("\n\n" . PHP_Timer::resourceUsage() . "\n\n"); } /** * @param PHPUnit_Framework_TestResult $result */ protected function printFooter(PHPUnit_Framework_TestResult $result) { if (count($result) === 0) { $this->writeWithColor( 'fg-black, bg-yellow', 'No tests executed!' ); } elseif ($result->wasSuccessful() && $result->allHarmless() && $result->allCompletelyImplemented() && $result->noneSkipped()) { $this->writeWithColor( 'fg-black, bg-green', sprintf( 'OK (%d test%s, %d assertion%s)', count($result), (count($result) == 1) ? '' : 's', $this->numAssertions, ($this->numAssertions == 1) ? '' : 's' ) ); } else { if ($result->wasSuccessful()) { $color = 'fg-black, bg-yellow'; if ($this->verbose) { $this->write("\n"); } $this->writeWithColor( $color, 'OK, but incomplete, skipped, or risky tests!' ); } else { $showFailures = ( $result->errors() || $result->failures() || $result->skipped() || $result->notImplemented() || $result->risky()) && !$result->warnings() ; if ($showFailures) { $color = 'fg-white, bg-red'; $text = 'FAILURES!'; } else { $color = 'fg-black, bg-yellow'; $text = 'WARNINGS!'; } $this->write("\n"); $this->writeWithColor($color, $text); } $this->writeCountString(count($result), 'Tests', $color, true); $this->writeCountString($this->numAssertions, 'Assertions', $color, true); $this->writeCountString($result->errorCount(), 'Errors', $color); $this->writeCountString($result->failureCount(), 'Failures', $color); $this->writeCountString($result->warningCount(), 'Warnings', $color); $this->writeCountString($result->skippedCount(), 'Skipped', $color); $this->writeCountString($result->notImplementedCount(), 'Incomplete', $color); $this->writeCountString($result->riskyCount(), 'Risky', $color); $this->writeWithColor($color, '.', true); } } /** */ public function printWaitPrompt() { $this->write("\n to continue\n"); } /** * An error occurred. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->writeProgressWithColor('fg-red, bold', 'E'); $this->lastTestFailed = true; } /** * A failure occurred. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_AssertionFailedError $e * @param float $time */ public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) { $this->writeProgressWithColor('bg-red, fg-white', 'F'); $this->lastTestFailed = true; } /** * A warning occurred. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_Warning $e * @param float $time * * @since Method available since Release 5.1.0 */ public function addWarning(PHPUnit_Framework_Test $test, PHPUnit_Framework_Warning $e, $time) { $this->writeProgressWithColor('fg-yellow, bold', 'W'); $this->lastTestFailed = true; } /** * Incomplete test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->writeProgressWithColor('fg-yellow, bold', 'I'); $this->lastTestFailed = true; } /** * Risky test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time * * @since Method available since Release 4.0.0 */ public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->writeProgressWithColor('fg-yellow, bold', 'R'); $this->lastTestFailed = true; } /** * Skipped test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time * * @since Method available since Release 3.0.0 */ public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->writeProgressWithColor('fg-cyan, bold', 'S'); $this->lastTestFailed = true; } /** * A testsuite started. * * @param PHPUnit_Framework_TestSuite $suite * * @since Method available since Release 2.2.0 */ public function startTestSuite(PHPUnit_Framework_TestSuite $suite) { if ($this->numTests == -1) { $this->numTests = count($suite); $this->numTestsWidth = strlen((string) $this->numTests); $this->maxColumn = $this->numberOfColumns - strlen(' / (XXX%)') - (2 * $this->numTestsWidth); } } /** * A testsuite ended. * * @param PHPUnit_Framework_TestSuite $suite * * @since Method available since Release 2.2.0 */ public function endTestSuite(PHPUnit_Framework_TestSuite $suite) { } /** * A test started. * * @param PHPUnit_Framework_Test $test */ public function startTest(PHPUnit_Framework_Test $test) { if ($this->debug) { $this->write( sprintf( "\nStarting test '%s'.\n", PHPUnit_Util_Test::describe($test) ) ); } } /** * A test ended. * * @param PHPUnit_Framework_Test $test * @param float $time */ public function endTest(PHPUnit_Framework_Test $test, $time) { if (!$this->lastTestFailed) { $this->writeProgress('.'); } if ($test instanceof PHPUnit_Framework_TestCase) { $this->numAssertions += $test->getNumAssertions(); } elseif ($test instanceof PHPUnit_Extensions_PhptTestCase) { $this->numAssertions++; } $this->lastTestFailed = false; if ($test instanceof PHPUnit_Framework_TestCase) { if (!$test->hasExpectationOnOutput()) { $this->write($test->getActualOutput()); } } } /** * @param string $progress */ protected function writeProgress($progress) { $this->write($progress); $this->column++; $this->numTestsRun++; if ($this->column == $this->maxColumn || $this->numTestsRun == $this->numTests ) { if ($this->numTestsRun == $this->numTests) { $this->write(str_repeat(' ', $this->maxColumn - $this->column)); } $this->write( sprintf( ' %' . $this->numTestsWidth . 'd / %' . $this->numTestsWidth . 'd (%3s%%)', $this->numTestsRun, $this->numTests, floor(($this->numTestsRun / $this->numTests) * 100) ) ); if ($this->column == $this->maxColumn) { $this->writeNewLine(); } } } protected function writeNewLine() { $this->column = 0; $this->write("\n"); } /** * Formats a buffer with a specified ANSI color sequence if colors are * enabled. * * @param string $color * @param string $buffer * * @return string * * @since Method available since Release 4.0.0 */ protected function formatWithColor($color, $buffer) { if (!$this->colors) { return $buffer; } $codes = array_map('trim', explode(',', $color)); $lines = explode("\n", $buffer); $padding = max(array_map('strlen', $lines)); $styles = []; foreach ($codes as $code) { $styles[] = self::$ansiCodes[$code]; } $style = sprintf("\x1b[%sm", implode(';', $styles)); $styledLines = []; foreach ($lines as $line) { $styledLines[] = $style . str_pad($line, $padding) . "\x1b[0m"; } return implode("\n", $styledLines); } /** * Writes a buffer out with a color sequence if colors are enabled. * * @param string $color * @param string $buffer * @param bool $lf * * @since Method available since Release 4.0.0 */ protected function writeWithColor($color, $buffer, $lf = true) { $this->write($this->formatWithColor($color, $buffer)); if ($lf) { $this->write("\n"); } } /** * Writes progress with a color sequence if colors are enabled. * * @param string $color * @param string $buffer * * @since Method available since Release 4.0.0 */ protected function writeProgressWithColor($color, $buffer) { $buffer = $this->formatWithColor($color, $buffer); $this->writeProgress($buffer); } /** * @param int $count * @param string $name * @param string $color * @param bool $always * * @since Method available since Release 4.6.5 */ private function writeCountString($count, $name, $color, $always = false) { static $first = true; if ($always || $count > 0) { $this->writeWithColor( $color, sprintf( '%s%s: %d', !$first ? ', ' : '', $name, $count ), false ); $first = false; } } } phpunit-5.1.3/src/TextUI/TestRunner.php000066400000000000000000001235651263222771600200260ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use SebastianBergmann\Environment\Runtime; /** * A TestRunner for the Command Line Interface (CLI) * PHP SAPI Module. * * @since Class available since Release 2.0.0 */ class PHPUnit_TextUI_TestRunner extends PHPUnit_Runner_BaseTestRunner { const SUCCESS_EXIT = 0; const FAILURE_EXIT = 1; const EXCEPTION_EXIT = 2; /** * @var PHP_CodeCoverage_Filter */ protected $codeCoverageFilter; /** * @var PHPUnit_Runner_TestSuiteLoader */ protected $loader = null; /** * @var PHPUnit_TextUI_ResultPrinter */ protected $printer = null; /** * @var bool */ protected static $versionStringPrinted = false; /** * @var Runtime */ private $runtime; /** * @var bool */ private $messagePrinted = false; /** * @param PHPUnit_Runner_TestSuiteLoader $loader * @param PHP_CodeCoverage_Filter $filter * * @since Method available since Release 3.4.0 */ public function __construct(PHPUnit_Runner_TestSuiteLoader $loader = null, PHP_CodeCoverage_Filter $filter = null) { if ($filter === null) { $filter = new PHP_CodeCoverage_Filter; } $this->codeCoverageFilter = $filter; $this->loader = $loader; $this->runtime = new Runtime; } /** * @param PHPUnit_Framework_Test|ReflectionClass $test * @param array $arguments * * @return PHPUnit_Framework_TestResult * * @throws PHPUnit_Framework_Exception */ public static function run($test, array $arguments = []) { if ($test instanceof ReflectionClass) { $test = new PHPUnit_Framework_TestSuite($test); } if ($test instanceof PHPUnit_Framework_Test) { $aTestRunner = new self; return $aTestRunner->doRun( $test, $arguments ); } else { throw new PHPUnit_Framework_Exception( 'No test case or test suite found.' ); } } /** * @return PHPUnit_Framework_TestResult */ protected function createTestResult() { return new PHPUnit_Framework_TestResult; } private function processSuiteFilters(PHPUnit_Framework_TestSuite $suite, array $arguments) { if (!$arguments['filter'] && empty($arguments['groups']) && empty($arguments['excludeGroups'])) { return; } $filterFactory = new PHPUnit_Runner_Filter_Factory(); if (!empty($arguments['excludeGroups'])) { $filterFactory->addFilter( new ReflectionClass('PHPUnit_Runner_Filter_Group_Exclude'), $arguments['excludeGroups'] ); } if (!empty($arguments['groups'])) { $filterFactory->addFilter( new ReflectionClass('PHPUnit_Runner_Filter_Group_Include'), $arguments['groups'] ); } if ($arguments['filter']) { $filterFactory->addFilter( new ReflectionClass('PHPUnit_Runner_Filter_Test'), $arguments['filter'] ); } $suite->injectFilter($filterFactory); } /** * @param PHPUnit_Framework_Test $suite * @param array $arguments * * @return PHPUnit_Framework_TestResult */ public function doRun(PHPUnit_Framework_Test $suite, array $arguments = []) { if (isset($arguments['configuration'])) { $GLOBALS['__PHPUNIT_CONFIGURATION_FILE'] = $arguments['configuration']; } $this->handleConfiguration($arguments); $this->processSuiteFilters($suite, $arguments); if (isset($arguments['bootstrap'])) { $GLOBALS['__PHPUNIT_BOOTSTRAP'] = $arguments['bootstrap']; } if ($arguments['backupGlobals'] === false) { $suite->setBackupGlobals(false); } if ($arguments['backupStaticAttributes'] === true) { $suite->setBackupStaticAttributes(true); } if ($arguments['beStrictAboutChangesToGlobalState'] === true) { $suite->setbeStrictAboutChangesToGlobalState(true); } if (is_integer($arguments['repeat'])) { $test = new PHPUnit_Extensions_RepeatedTest( $suite, $arguments['repeat'], $arguments['processIsolation'] ); $suite = new PHPUnit_Framework_TestSuite(); $suite->addTest($test); } $result = $this->createTestResult(); if (!$arguments['convertErrorsToExceptions']) { $result->convertErrorsToExceptions(false); } if (!$arguments['convertNoticesToExceptions']) { PHPUnit_Framework_Error_Notice::$enabled = false; } if (!$arguments['convertWarningsToExceptions']) { PHPUnit_Framework_Error_Warning::$enabled = false; } if ($arguments['stopOnError']) { $result->stopOnError(true); } if ($arguments['stopOnFailure']) { $result->stopOnFailure(true); } if ($arguments['stopOnWarning']) { $result->stopOnWarning(true); } if ($arguments['stopOnIncomplete']) { $result->stopOnIncomplete(true); } if ($arguments['stopOnRisky']) { $result->stopOnRisky(true); } if ($arguments['stopOnSkipped']) { $result->stopOnSkipped(true); } if ($this->printer === null) { if (isset($arguments['printer']) && $arguments['printer'] instanceof PHPUnit_Util_Printer) { $this->printer = $arguments['printer']; } else { $printerClass = 'PHPUnit_TextUI_ResultPrinter'; if (isset($arguments['printer']) && is_string($arguments['printer']) && class_exists($arguments['printer'], false)) { $class = new ReflectionClass($arguments['printer']); if ($class->isSubclassOf('PHPUnit_TextUI_ResultPrinter')) { $printerClass = $arguments['printer']; } } $this->printer = new $printerClass( isset($arguments['stderr']) ? 'php://stderr' : null, $arguments['verbose'], $arguments['colors'], $arguments['debug'], $arguments['columns'], $arguments['reverseList'] ); } } if (!$this->printer instanceof PHPUnit_Util_Log_TAP) { $this->printer->write( PHPUnit_Runner_Version::getVersionString() . "\n" ); self::$versionStringPrinted = true; if ($arguments['verbose']) { $runtime = $this->runtime->getNameWithVersion(); if ($this->runtime->hasXdebug()) { $runtime .= sprintf( ' with Xdebug %s', phpversion('xdebug') ); } $this->writeMessage('Runtime', $runtime); if (isset($arguments['configuration'])) { $this->writeMessage( 'Configuration', $arguments['configuration']->getFilename() ); } } } foreach ($arguments['listeners'] as $listener) { $result->addListener($listener); } $result->addListener($this->printer); if (isset($arguments['testdoxHTMLFile'])) { $result->addListener( new PHPUnit_Util_TestDox_ResultPrinter_HTML( $arguments['testdoxHTMLFile'] ) ); } if (isset($arguments['testdoxTextFile'])) { $result->addListener( new PHPUnit_Util_TestDox_ResultPrinter_Text( $arguments['testdoxTextFile'] ) ); } $codeCoverageReports = 0; if (isset($arguments['coverageClover'])) { $codeCoverageReports++; } if (isset($arguments['coverageCrap4J'])) { $codeCoverageReports++; } if (isset($arguments['coverageHtml'])) { $codeCoverageReports++; } if (isset($arguments['coveragePHP'])) { $codeCoverageReports++; } if (isset($arguments['coverageText'])) { $codeCoverageReports++; } if (isset($arguments['coverageXml'])) { $codeCoverageReports++; } if (isset($arguments['noCoverage'])) { $codeCoverageReports = 0; } if ($codeCoverageReports > 0) { if (!$this->runtime->canCollectCodeCoverage()) { $this->writeMessage('Error', 'No code coverage driver is available'); $codeCoverageReports = 0; } elseif (!isset($arguments['whitelist']) && !$this->codeCoverageFilter->hasWhitelist()) { $this->writeMessage('Error', 'No whitelist configured, no code coverage will be generated'); $codeCoverageReports = 0; } } if (!$this->printer instanceof PHPUnit_Util_Log_TAP) { $this->printer->write("\n"); } if ($codeCoverageReports > 0) { $codeCoverage = new PHP_CodeCoverage( null, $this->codeCoverageFilter ); $codeCoverage->setAddUncoveredFilesFromWhitelist( $arguments['addUncoveredFilesFromWhitelist'] ); $codeCoverage->setCheckForUnintentionallyCoveredCode( $arguments['strictCoverage'] ); $codeCoverage->setProcessUncoveredFilesFromWhitelist( $arguments['processUncoveredFilesFromWhitelist'] ); if (isset($arguments['forceCoversAnnotation'])) { $codeCoverage->setForceCoversAnnotation( $arguments['forceCoversAnnotation'] ); } if (isset($arguments['mapTestClassNameToCoveredClassName'])) { $codeCoverage->setMapTestClassNameToCoveredClassName( $arguments['mapTestClassNameToCoveredClassName'] ); } if (isset($arguments['whitelist'])) { $this->codeCoverageFilter->addDirectoryToWhitelist($arguments['whitelist']); } $result->setCodeCoverage($codeCoverage); } if ($codeCoverageReports > 1) { if (isset($arguments['cacheTokens'])) { $codeCoverage->setCacheTokens($arguments['cacheTokens']); } } if (isset($arguments['jsonLogfile'])) { $result->addListener( new PHPUnit_Util_Log_JSON($arguments['jsonLogfile']) ); } if (isset($arguments['tapLogfile'])) { $result->addListener( new PHPUnit_Util_Log_TAP($arguments['tapLogfile']) ); } if (isset($arguments['teamcityLogfile'])) { $result->addListener( new PHPUnit_Util_Log_TeamCity($arguments['teamcityLogfile']) ); } if (isset($arguments['junitLogfile'])) { $result->addListener( new PHPUnit_Util_Log_JUnit( $arguments['junitLogfile'], $arguments['logIncompleteSkipped'] ) ); } $result->beStrictAboutTestsThatDoNotTestAnything($arguments['reportUselessTests']); $result->beStrictAboutOutputDuringTests($arguments['disallowTestOutput']); $result->beStrictAboutTodoAnnotatedTests($arguments['disallowTodoAnnotatedTests']); $result->beStrictAboutResourceUsageDuringSmallTests($arguments['beStrictAboutResourceUsageDuringSmallTests']); $result->enforceTimeLimit($arguments['enforceTimeLimit']); $result->setTimeoutForSmallTests($arguments['timeoutForSmallTests']); $result->setTimeoutForMediumTests($arguments['timeoutForMediumTests']); $result->setTimeoutForLargeTests($arguments['timeoutForLargeTests']); if ($suite instanceof PHPUnit_Framework_TestSuite) { $suite->setRunTestInSeparateProcess($arguments['processIsolation']); } $suite->run($result); unset($suite); $result->flushListeners(); if ($this->printer instanceof PHPUnit_TextUI_ResultPrinter) { $this->printer->printResult($result); } if (isset($codeCoverage)) { if (isset($arguments['coverageClover'])) { $this->printer->write( "\nGenerating code coverage report in Clover XML format ..." ); try { $writer = new PHP_CodeCoverage_Report_Clover; $writer->process($codeCoverage, $arguments['coverageClover']); $this->printer->write(" done\n"); unset($writer); } catch (PHP_CodeCoverage_Exception $e) { $this->printer->write( " failed\n" . $e->getMessage() . "\n" ); } } if (isset($arguments['coverageCrap4J'])) { $this->printer->write( "\nGenerating Crap4J report XML file ..." ); try { $writer = new PHP_CodeCoverage_Report_Crap4j($arguments['crap4jThreshold']); $writer->process($codeCoverage, $arguments['coverageCrap4J']); $this->printer->write(" done\n"); unset($writer); } catch (PHP_CodeCoverage_Exception $e) { $this->printer->write( " failed\n" . $e->getMessage() . "\n" ); } } if (isset($arguments['coverageHtml'])) { $this->printer->write( "\nGenerating code coverage report in HTML format ..." ); try { $writer = new PHP_CodeCoverage_Report_HTML( $arguments['reportLowUpperBound'], $arguments['reportHighLowerBound'], sprintf( ' and PHPUnit %s', PHPUnit_Runner_Version::id() ) ); $writer->process($codeCoverage, $arguments['coverageHtml']); $this->printer->write(" done\n"); unset($writer); } catch (PHP_CodeCoverage_Exception $e) { $this->printer->write( " failed\n" . $e->getMessage() . "\n" ); } } if (isset($arguments['coveragePHP'])) { $this->printer->write( "\nGenerating code coverage report in PHP format ..." ); try { $writer = new PHP_CodeCoverage_Report_PHP; $writer->process($codeCoverage, $arguments['coveragePHP']); $this->printer->write(" done\n"); unset($writer); } catch (PHP_CodeCoverage_Exception $e) { $this->printer->write( " failed\n" . $e->getMessage() . "\n" ); } } if (isset($arguments['coverageText'])) { if ($arguments['coverageText'] == 'php://stdout') { $outputStream = $this->printer; $colors = $arguments['colors'] && $arguments['colors'] != PHPUnit_TextUI_ResultPrinter::COLOR_NEVER; } else { $outputStream = new PHPUnit_Util_Printer($arguments['coverageText']); $colors = false; } $processor = new PHP_CodeCoverage_Report_Text( $arguments['reportLowUpperBound'], $arguments['reportHighLowerBound'], $arguments['coverageTextShowUncoveredFiles'], $arguments['coverageTextShowOnlySummary'] ); $outputStream->write( $processor->process($codeCoverage, $colors) ); } if (isset($arguments['coverageXml'])) { $this->printer->write( "\nGenerating code coverage report in PHPUnit XML format ..." ); try { $writer = new PHP_CodeCoverage_Report_XML; $writer->process($codeCoverage, $arguments['coverageXml']); $this->printer->write(" done\n"); unset($writer); } catch (PHP_CodeCoverage_Exception $e) { $this->printer->write( " failed\n" . $e->getMessage() . "\n" ); } } } return $result; } /** * @param PHPUnit_TextUI_ResultPrinter $resultPrinter */ public function setPrinter(PHPUnit_TextUI_ResultPrinter $resultPrinter) { $this->printer = $resultPrinter; } /** * Override to define how to handle a failed loading of * a test suite. * * @param string $message */ protected function runFailed($message) { $this->write($message . PHP_EOL); exit(self::FAILURE_EXIT); } /** * @param string $buffer * * @since Method available since Release 3.1.0 */ protected function write($buffer) { if (PHP_SAPI != 'cli') { $buffer = htmlspecialchars($buffer); } if ($this->printer !== null) { $this->printer->write($buffer); } else { print $buffer; } } /** * Returns the loader to be used. * * @return PHPUnit_Runner_TestSuiteLoader * * @since Method available since Release 2.2.0 */ public function getLoader() { if ($this->loader === null) { $this->loader = new PHPUnit_Runner_StandardTestSuiteLoader; } return $this->loader; } /** * @param array $arguments * * @since Method available since Release 3.2.1 */ protected function handleConfiguration(array &$arguments) { if (isset($arguments['configuration']) && !$arguments['configuration'] instanceof PHPUnit_Util_Configuration) { $arguments['configuration'] = PHPUnit_Util_Configuration::getInstance( $arguments['configuration'] ); } $arguments['debug'] = isset($arguments['debug']) ? $arguments['debug'] : false; $arguments['filter'] = isset($arguments['filter']) ? $arguments['filter'] : false; $arguments['listeners'] = isset($arguments['listeners']) ? $arguments['listeners'] : []; if (isset($arguments['configuration'])) { $arguments['configuration']->handlePHPConfiguration(); $phpunitConfiguration = $arguments['configuration']->getPHPUnitConfiguration(); if (isset($phpunitConfiguration['backupGlobals']) && !isset($arguments['backupGlobals'])) { $arguments['backupGlobals'] = $phpunitConfiguration['backupGlobals']; } if (isset($phpunitConfiguration['backupStaticAttributes']) && !isset($arguments['backupStaticAttributes'])) { $arguments['backupStaticAttributes'] = $phpunitConfiguration['backupStaticAttributes']; } if (isset($phpunitConfiguration['beStrictAboutChangesToGlobalState']) && !isset($arguments['beStrictAboutChangesToGlobalState'])) { $arguments['beStrictAboutChangesToGlobalState'] = $phpunitConfiguration['beStrictAboutChangesToGlobalState']; } if (isset($phpunitConfiguration['bootstrap']) && !isset($arguments['bootstrap'])) { $arguments['bootstrap'] = $phpunitConfiguration['bootstrap']; } if (isset($phpunitConfiguration['cacheTokens']) && !isset($arguments['cacheTokens'])) { $arguments['cacheTokens'] = $phpunitConfiguration['cacheTokens']; } if (isset($phpunitConfiguration['colors']) && !isset($arguments['colors'])) { $arguments['colors'] = $phpunitConfiguration['colors']; } if (isset($phpunitConfiguration['convertErrorsToExceptions']) && !isset($arguments['convertErrorsToExceptions'])) { $arguments['convertErrorsToExceptions'] = $phpunitConfiguration['convertErrorsToExceptions']; } if (isset($phpunitConfiguration['convertNoticesToExceptions']) && !isset($arguments['convertNoticesToExceptions'])) { $arguments['convertNoticesToExceptions'] = $phpunitConfiguration['convertNoticesToExceptions']; } if (isset($phpunitConfiguration['convertWarningsToExceptions']) && !isset($arguments['convertWarningsToExceptions'])) { $arguments['convertWarningsToExceptions'] = $phpunitConfiguration['convertWarningsToExceptions']; } if (isset($phpunitConfiguration['processIsolation']) && !isset($arguments['processIsolation'])) { $arguments['processIsolation'] = $phpunitConfiguration['processIsolation']; } if (isset($phpunitConfiguration['stopOnError']) && !isset($arguments['stopOnError'])) { $arguments['stopOnError'] = $phpunitConfiguration['stopOnError']; } if (isset($phpunitConfiguration['stopOnFailure']) && !isset($arguments['stopOnFailure'])) { $arguments['stopOnFailure'] = $phpunitConfiguration['stopOnFailure']; } if (isset($phpunitConfiguration['stopOnWarning']) && !isset($arguments['stopOnWarning'])) { $arguments['stopOnWarning'] = $phpunitConfiguration['stopOnWarning']; } if (isset($phpunitConfiguration['stopOnIncomplete']) && !isset($arguments['stopOnIncomplete'])) { $arguments['stopOnIncomplete'] = $phpunitConfiguration['stopOnIncomplete']; } if (isset($phpunitConfiguration['stopOnRisky']) && !isset($arguments['stopOnRisky'])) { $arguments['stopOnRisky'] = $phpunitConfiguration['stopOnRisky']; } if (isset($phpunitConfiguration['stopOnSkipped']) && !isset($arguments['stopOnSkipped'])) { $arguments['stopOnSkipped'] = $phpunitConfiguration['stopOnSkipped']; } if (isset($phpunitConfiguration['timeoutForSmallTests']) && !isset($arguments['timeoutForSmallTests'])) { $arguments['timeoutForSmallTests'] = $phpunitConfiguration['timeoutForSmallTests']; } if (isset($phpunitConfiguration['timeoutForMediumTests']) && !isset($arguments['timeoutForMediumTests'])) { $arguments['timeoutForMediumTests'] = $phpunitConfiguration['timeoutForMediumTests']; } if (isset($phpunitConfiguration['timeoutForLargeTests']) && !isset($arguments['timeoutForLargeTests'])) { $arguments['timeoutForLargeTests'] = $phpunitConfiguration['timeoutForLargeTests']; } if (isset($phpunitConfiguration['reportUselessTests']) && !isset($arguments['reportUselessTests'])) { $arguments['reportUselessTests'] = $phpunitConfiguration['reportUselessTests']; } if (isset($phpunitConfiguration['strictCoverage']) && !isset($arguments['strictCoverage'])) { $arguments['strictCoverage'] = $phpunitConfiguration['strictCoverage']; } if (isset($phpunitConfiguration['disallowTestOutput']) && !isset($arguments['disallowTestOutput'])) { $arguments['disallowTestOutput'] = $phpunitConfiguration['disallowTestOutput']; } if (isset($phpunitConfiguration['enforceTimeLimit']) && !isset($arguments['enforceTimeLimit'])) { $arguments['enforceTimeLimit'] = $phpunitConfiguration['enforceTimeLimit']; } if (isset($phpunitConfiguration['disallowTodoAnnotatedTests']) && !isset($arguments['disallowTodoAnnotatedTests'])) { $arguments['disallowTodoAnnotatedTests'] = $phpunitConfiguration['disallowTodoAnnotatedTests']; } if (isset($phpunitConfiguration['beStrictAboutResourceUsageDuringSmallTests']) && !isset($arguments['beStrictAboutResourceUsageDuringSmallTests'])) { $arguments['beStrictAboutResourceUsageDuringSmallTests'] = $phpunitConfiguration['beStrictAboutResourceUsageDuringSmallTests']; } if (isset($phpunitConfiguration['verbose']) && !isset($arguments['verbose'])) { $arguments['verbose'] = $phpunitConfiguration['verbose']; } if (isset($phpunitConfiguration['reverseDefectList']) && !isset($arguments['reverseList'])) { $arguments['reverseList'] = $phpunitConfiguration['reverseDefectList']; } if (isset($phpunitConfiguration['forceCoversAnnotation']) && !isset($arguments['forceCoversAnnotation'])) { $arguments['forceCoversAnnotation'] = $phpunitConfiguration['forceCoversAnnotation']; } if (isset($phpunitConfiguration['mapTestClassNameToCoveredClassName']) && !isset($arguments['mapTestClassNameToCoveredClassName'])) { $arguments['mapTestClassNameToCoveredClassName'] = $phpunitConfiguration['mapTestClassNameToCoveredClassName']; } $groupCliArgs = []; if (!empty($arguments['groups'])) { $groupCliArgs = $arguments['groups']; } $groupConfiguration = $arguments['configuration']->getGroupConfiguration(); if (!empty($groupConfiguration['include']) && !isset($arguments['groups'])) { $arguments['groups'] = $groupConfiguration['include']; } if (!empty($groupConfiguration['exclude']) && !isset($arguments['excludeGroups'])) { $arguments['excludeGroups'] = array_diff($groupConfiguration['exclude'], $groupCliArgs); } foreach ($arguments['configuration']->getListenerConfiguration() as $listener) { if (!class_exists($listener['class'], false) && $listener['file'] !== '') { require_once $listener['file']; } if (class_exists($listener['class'])) { if (count($listener['arguments']) == 0) { $listener = new $listener['class']; } else { $listenerClass = new ReflectionClass( $listener['class'] ); $listener = $listenerClass->newInstanceArgs( $listener['arguments'] ); } if ($listener instanceof PHPUnit_Framework_TestListener) { $arguments['listeners'][] = $listener; } } } $loggingConfiguration = $arguments['configuration']->getLoggingConfiguration(); if (isset($loggingConfiguration['coverage-clover']) && !isset($arguments['coverageClover'])) { $arguments['coverageClover'] = $loggingConfiguration['coverage-clover']; } if (isset($loggingConfiguration['coverage-crap4j']) && !isset($arguments['coverageCrap4J'])) { $arguments['coverageCrap4J'] = $loggingConfiguration['coverage-crap4j']; if (isset($loggingConfiguration['crap4jThreshold']) && !isset($arguments['crap4jThreshold'])) { $arguments['crap4jThreshold'] = $loggingConfiguration['crap4jThreshold']; } } if (isset($loggingConfiguration['coverage-html']) && !isset($arguments['coverageHtml'])) { if (isset($loggingConfiguration['lowUpperBound']) && !isset($arguments['reportLowUpperBound'])) { $arguments['reportLowUpperBound'] = $loggingConfiguration['lowUpperBound']; } if (isset($loggingConfiguration['highLowerBound']) && !isset($arguments['reportHighLowerBound'])) { $arguments['reportHighLowerBound'] = $loggingConfiguration['highLowerBound']; } $arguments['coverageHtml'] = $loggingConfiguration['coverage-html']; } if (isset($loggingConfiguration['coverage-php']) && !isset($arguments['coveragePHP'])) { $arguments['coveragePHP'] = $loggingConfiguration['coverage-php']; } if (isset($loggingConfiguration['coverage-text']) && !isset($arguments['coverageText'])) { $arguments['coverageText'] = $loggingConfiguration['coverage-text']; if (isset($loggingConfiguration['coverageTextShowUncoveredFiles'])) { $arguments['coverageTextShowUncoveredFiles'] = $loggingConfiguration['coverageTextShowUncoveredFiles']; } else { $arguments['coverageTextShowUncoveredFiles'] = false; } if (isset($loggingConfiguration['coverageTextShowOnlySummary'])) { $arguments['coverageTextShowOnlySummary'] = $loggingConfiguration['coverageTextShowOnlySummary']; } else { $arguments['coverageTextShowOnlySummary'] = false; } } if (isset($loggingConfiguration['coverage-xml']) && !isset($arguments['coverageXml'])) { $arguments['coverageXml'] = $loggingConfiguration['coverage-xml']; } if (isset($loggingConfiguration['json']) && !isset($arguments['jsonLogfile'])) { $arguments['jsonLogfile'] = $loggingConfiguration['json']; } if (isset($loggingConfiguration['plain'])) { $arguments['listeners'][] = new PHPUnit_TextUI_ResultPrinter( $loggingConfiguration['plain'], true ); } if (isset($loggingConfiguration['tap']) && !isset($arguments['tapLogfile'])) { $arguments['tapLogfile'] = $loggingConfiguration['tap']; } if (isset($loggingConfiguration['teamcity']) && !isset($arguments['teamcityLogfile'])) { $arguments['teamcityLogfile'] = $loggingConfiguration['teamcity']; } if (isset($loggingConfiguration['junit']) && !isset($arguments['junitLogfile'])) { $arguments['junitLogfile'] = $loggingConfiguration['junit']; if (isset($loggingConfiguration['logIncompleteSkipped']) && !isset($arguments['logIncompleteSkipped'])) { $arguments['logIncompleteSkipped'] = $loggingConfiguration['logIncompleteSkipped']; } } if (isset($loggingConfiguration['testdox-html']) && !isset($arguments['testdoxHTMLFile'])) { $arguments['testdoxHTMLFile'] = $loggingConfiguration['testdox-html']; } if (isset($loggingConfiguration['testdox-text']) && !isset($arguments['testdoxTextFile'])) { $arguments['testdoxTextFile'] = $loggingConfiguration['testdox-text']; } if ((isset($arguments['coverageClover']) || isset($arguments['coverageCrap4J']) || isset($arguments['coverageHtml']) || isset($arguments['coveragePHP']) || isset($arguments['coverageText']) || isset($arguments['coverageXml'])) && $this->runtime->canCollectCodeCoverage()) { $filterConfiguration = $arguments['configuration']->getFilterConfiguration(); $arguments['addUncoveredFilesFromWhitelist'] = $filterConfiguration['whitelist']['addUncoveredFilesFromWhitelist']; $arguments['processUncoveredFilesFromWhitelist'] = $filterConfiguration['whitelist']['processUncoveredFilesFromWhitelist']; foreach ($filterConfiguration['whitelist']['include']['directory'] as $dir) { $this->codeCoverageFilter->addDirectoryToWhitelist( $dir['path'], $dir['suffix'], $dir['prefix'] ); } foreach ($filterConfiguration['whitelist']['include']['file'] as $file) { $this->codeCoverageFilter->addFileToWhitelist($file); } foreach ($filterConfiguration['whitelist']['exclude']['directory'] as $dir) { $this->codeCoverageFilter->removeDirectoryFromWhitelist( $dir['path'], $dir['suffix'], $dir['prefix'] ); } foreach ($filterConfiguration['whitelist']['exclude']['file'] as $file) { $this->codeCoverageFilter->removeFileFromWhitelist($file); } } } $arguments['addUncoveredFilesFromWhitelist'] = isset($arguments['addUncoveredFilesFromWhitelist']) ? $arguments['addUncoveredFilesFromWhitelist'] : true; $arguments['processUncoveredFilesFromWhitelist'] = isset($arguments['processUncoveredFilesFromWhitelist']) ? $arguments['processUncoveredFilesFromWhitelist'] : false; $arguments['backupGlobals'] = isset($arguments['backupGlobals']) ? $arguments['backupGlobals'] : null; $arguments['backupStaticAttributes'] = isset($arguments['backupStaticAttributes']) ? $arguments['backupStaticAttributes'] : null; $arguments['beStrictAboutChangesToGlobalState'] = isset($arguments['beStrictAboutChangesToGlobalState']) ? $arguments['beStrictAboutChangesToGlobalState'] : null; $arguments['cacheTokens'] = isset($arguments['cacheTokens']) ? $arguments['cacheTokens'] : false; $arguments['columns'] = isset($arguments['columns']) ? $arguments['columns'] : 80; $arguments['colors'] = isset($arguments['colors']) ? $arguments['colors'] : PHPUnit_TextUI_ResultPrinter::COLOR_DEFAULT; $arguments['convertErrorsToExceptions'] = isset($arguments['convertErrorsToExceptions']) ? $arguments['convertErrorsToExceptions'] : true; $arguments['convertNoticesToExceptions'] = isset($arguments['convertNoticesToExceptions']) ? $arguments['convertNoticesToExceptions'] : true; $arguments['convertWarningsToExceptions'] = isset($arguments['convertWarningsToExceptions']) ? $arguments['convertWarningsToExceptions'] : true; $arguments['excludeGroups'] = isset($arguments['excludeGroups']) ? $arguments['excludeGroups'] : []; $arguments['groups'] = isset($arguments['groups']) ? $arguments['groups'] : []; $arguments['logIncompleteSkipped'] = isset($arguments['logIncompleteSkipped']) ? $arguments['logIncompleteSkipped'] : false; $arguments['processIsolation'] = isset($arguments['processIsolation']) ? $arguments['processIsolation'] : false; $arguments['repeat'] = isset($arguments['repeat']) ? $arguments['repeat'] : false; $arguments['reportHighLowerBound'] = isset($arguments['reportHighLowerBound']) ? $arguments['reportHighLowerBound'] : 90; $arguments['reportLowUpperBound'] = isset($arguments['reportLowUpperBound']) ? $arguments['reportLowUpperBound'] : 50; $arguments['crap4jThreshold'] = isset($arguments['crap4jThreshold']) ? $arguments['crap4jThreshold'] : 30; $arguments['stopOnError'] = isset($arguments['stopOnError']) ? $arguments['stopOnError'] : false; $arguments['stopOnFailure'] = isset($arguments['stopOnFailure']) ? $arguments['stopOnFailure'] : false; $arguments['stopOnWarning'] = isset($arguments['stopOnWarning']) ? $arguments['stopOnWarning'] : false; $arguments['stopOnIncomplete'] = isset($arguments['stopOnIncomplete']) ? $arguments['stopOnIncomplete'] : false; $arguments['stopOnRisky'] = isset($arguments['stopOnRisky']) ? $arguments['stopOnRisky'] : false; $arguments['stopOnSkipped'] = isset($arguments['stopOnSkipped']) ? $arguments['stopOnSkipped'] : false; $arguments['timeoutForSmallTests'] = isset($arguments['timeoutForSmallTests']) ? $arguments['timeoutForSmallTests'] : 1; $arguments['timeoutForMediumTests'] = isset($arguments['timeoutForMediumTests']) ? $arguments['timeoutForMediumTests'] : 10; $arguments['timeoutForLargeTests'] = isset($arguments['timeoutForLargeTests']) ? $arguments['timeoutForLargeTests'] : 60; $arguments['reportUselessTests'] = isset($arguments['reportUselessTests']) ? $arguments['reportUselessTests'] : false; $arguments['strictCoverage'] = isset($arguments['strictCoverage']) ? $arguments['strictCoverage'] : false; $arguments['disallowTestOutput'] = isset($arguments['disallowTestOutput']) ? $arguments['disallowTestOutput'] : false; $arguments['enforceTimeLimit'] = isset($arguments['enforceTimeLimit']) ? $arguments['enforceTimeLimit'] : false; $arguments['disallowTodoAnnotatedTests'] = isset($arguments['disallowTodoAnnotatedTests']) ? $arguments['disallowTodoAnnotatedTests'] : false; $arguments['beStrictAboutResourceUsageDuringSmallTests'] = isset($arguments['beStrictAboutResourceUsageDuringSmallTests']) ? $arguments['beStrictAboutResourceUsageDuringSmallTests'] : false; $arguments['reverseList'] = isset($arguments['reverseList']) ? $arguments['reverseList'] : false; $arguments['verbose'] = isset($arguments['verbose']) ? $arguments['verbose'] : false; } /** * @param string $type * @param string $message * * @since Method available since Release 5.0.0 */ private function writeMessage($type, $message) { if (!$this->messagePrinted) { $this->write("\n"); } $this->write( sprintf( "%-15s%s\n", $type . ':', $message ) ); $this->messagePrinted = true; } } phpunit-5.1.3/src/Util/000077500000000000000000000000001263222771600147235ustar00rootroot00000000000000phpunit-5.1.3/src/Util/Blacklist.php000066400000000000000000000067101263222771600173500ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Utility class for blacklisting PHPUnit's own source code files. * * @since Class available since Release 4.0.0 */ class PHPUnit_Util_Blacklist { /** * @var array */ public static $blacklistedClassNames = [ 'File_Iterator' => 1, 'PHP_CodeCoverage' => 1, 'PHP_Invoker' => 1, 'PHP_Timer' => 1, 'PHP_Token' => 1, 'PHPUnit_Framework_TestCase' => 2, 'PHPUnit_Extensions_Database_TestCase' => 2, 'PHPUnit_Framework_MockObject_Generator' => 2, 'Text_Template' => 1, 'Symfony\Component\Yaml\Yaml' => 1, 'SebastianBergmann\Diff\Diff' => 1, 'SebastianBergmann\Environment\Runtime' => 1, 'SebastianBergmann\Comparator\Comparator' => 1, 'SebastianBergmann\Exporter\Exporter' => 1, 'SebastianBergmann\GlobalState\Snapshot' => 1, 'SebastianBergmann\RecursionContext\Context' => 1, 'SebastianBergmann\Version' => 1, 'Composer\Autoload\ClassLoader' => 1, 'Doctrine\Instantiator\Instantiator' => 1, 'phpDocumentor\Reflection\DocBlock' => 1, 'Prophecy\Prophet' => 1, 'DeepCopy\DeepCopy' => 1 ]; /** * @var array */ private static $directories; /** * @return array * * @since Method available since Release 4.1.0 */ public function getBlacklistedDirectories() { $this->initialize(); return self::$directories; } /** * @param string $file * * @return bool */ public function isBlacklisted($file) { if (defined('PHPUNIT_TESTSUITE')) { return false; } $this->initialize(); foreach (self::$directories as $directory) { if (strpos($file, $directory) === 0) { return true; } } return false; } private function initialize() { if (self::$directories === null) { self::$directories = []; foreach (self::$blacklistedClassNames as $className => $parent) { if (!class_exists($className)) { continue; } $reflector = new ReflectionClass($className); $directory = $reflector->getFileName(); for ($i = 0; $i < $parent; $i++) { $directory = dirname($directory); } self::$directories[] = $directory; } // Hide process isolation workaround on Windows. // @see PHPUnit_Util_PHP::factory() // @see PHPUnit_Util_PHP_Windows::process() if (DIRECTORY_SEPARATOR === '\\') { // tempnam() prefix is limited to first 3 chars. // @see http://php.net/manual/en/function.tempnam.php self::$directories[] = sys_get_temp_dir() . '\\PHP'; } } } } phpunit-5.1.3/src/Util/Configuration.php000066400000000000000000001010641263222771600202450ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Wrapper for the PHPUnit XML configuration file. * * Example XML configuration file: * * * * * * * /path/to/files * /path/to/MyTest.php * /path/to/files/exclude * * * * * * name * * * name * * * * * * /path/to/files * /path/to/file * * /path/to/files * /path/to/file * * * * * * * * * * Sebastian * * * 22 * April * 19.78 * * * MyRelativeFile.php * MyRelativeDir * * * * * * * * * * * * * * * * * * * . * * * * * * * * * * * * * * * @since Class available since Release 3.2.0 */ class PHPUnit_Util_Configuration { private static $instances = []; protected $document; protected $xpath; protected $filename; /** * Loads a PHPUnit configuration file. * * @param string $filename */ protected function __construct($filename) { $this->filename = $filename; $this->document = PHPUnit_Util_XML::loadFile($filename, false, true, true); $this->xpath = new DOMXPath($this->document); } /** * @since Method available since Release 3.4.0 */ final private function __clone() { } /** * Returns a PHPUnit configuration object. * * @param string $filename * * @return PHPUnit_Util_Configuration * * @since Method available since Release 3.4.0 */ public static function getInstance($filename) { $realpath = realpath($filename); if ($realpath === false) { throw new PHPUnit_Framework_Exception( sprintf( 'Could not read "%s".', $filename ) ); } if (!isset(self::$instances[$realpath])) { self::$instances[$realpath] = new self($realpath); } return self::$instances[$realpath]; } /** * Returns the realpath to the configuration file. * * @return string * * @since Method available since Release 3.6.0 */ public function getFilename() { return $this->filename; } /** * Returns the configuration for SUT filtering. * * @return array * * @since Method available since Release 3.2.1 */ public function getFilterConfiguration() { $addUncoveredFilesFromWhitelist = true; $processUncoveredFilesFromWhitelist = false; $tmp = $this->xpath->query('filter/whitelist'); if ($tmp->length == 1) { if ($tmp->item(0)->hasAttribute('addUncoveredFilesFromWhitelist')) { $addUncoveredFilesFromWhitelist = $this->getBoolean( (string) $tmp->item(0)->getAttribute( 'addUncoveredFilesFromWhitelist' ), true ); } if ($tmp->item(0)->hasAttribute('processUncoveredFilesFromWhitelist')) { $processUncoveredFilesFromWhitelist = $this->getBoolean( (string) $tmp->item(0)->getAttribute( 'processUncoveredFilesFromWhitelist' ), false ); } } return [ 'whitelist' => [ 'addUncoveredFilesFromWhitelist' => $addUncoveredFilesFromWhitelist, 'processUncoveredFilesFromWhitelist' => $processUncoveredFilesFromWhitelist, 'include' => [ 'directory' => $this->readFilterDirectories( 'filter/whitelist/directory' ), 'file' => $this->readFilterFiles( 'filter/whitelist/file' ) ], 'exclude' => [ 'directory' => $this->readFilterDirectories( 'filter/whitelist/exclude/directory' ), 'file' => $this->readFilterFiles( 'filter/whitelist/exclude/file' ) ] ] ]; } /** * Returns the configuration for groups. * * @return array * * @since Method available since Release 3.2.1 */ public function getGroupConfiguration() { $groups = [ 'include' => [], 'exclude' => [] ]; foreach ($this->xpath->query('groups/include/group') as $group) { $groups['include'][] = (string) $group->textContent; } foreach ($this->xpath->query('groups/exclude/group') as $group) { $groups['exclude'][] = (string) $group->textContent; } return $groups; } /** * Returns the configuration for listeners. * * @return array * * @since Method available since Release 3.4.0 */ public function getListenerConfiguration() { $result = []; foreach ($this->xpath->query('listeners/listener') as $listener) { $class = (string) $listener->getAttribute('class'); $file = ''; $arguments = []; if ($listener->getAttribute('file')) { $file = $this->toAbsolutePath( (string) $listener->getAttribute('file'), true ); } foreach ($listener->childNodes as $node) { if ($node instanceof DOMElement && $node->tagName == 'arguments') { foreach ($node->childNodes as $argument) { if ($argument instanceof DOMElement) { if ($argument->tagName == 'file' || $argument->tagName == 'directory') { $arguments[] = $this->toAbsolutePath((string) $argument->textContent); } else { $arguments[] = PHPUnit_Util_XML::xmlToVariable($argument); } } } } } $result[] = [ 'class' => $class, 'file' => $file, 'arguments' => $arguments ]; } return $result; } /** * Returns the logging configuration. * * @return array */ public function getLoggingConfiguration() { $result = []; foreach ($this->xpath->query('logging/log') as $log) { $type = (string) $log->getAttribute('type'); $target = (string) $log->getAttribute('target'); if (!$target) { continue; } $target = $this->toAbsolutePath($target); if ($type == 'coverage-html') { if ($log->hasAttribute('lowUpperBound')) { $result['lowUpperBound'] = $this->getInteger( (string) $log->getAttribute('lowUpperBound'), 50 ); } if ($log->hasAttribute('highLowerBound')) { $result['highLowerBound'] = $this->getInteger( (string) $log->getAttribute('highLowerBound'), 90 ); } } elseif ($type == 'coverage-crap4j') { if ($log->hasAttribute('threshold')) { $result['crap4jThreshold'] = $this->getInteger( (string) $log->getAttribute('threshold'), 30 ); } } elseif ($type == 'junit') { if ($log->hasAttribute('logIncompleteSkipped')) { $result['logIncompleteSkipped'] = $this->getBoolean( (string) $log->getAttribute('logIncompleteSkipped'), false ); } } elseif ($type == 'coverage-text') { if ($log->hasAttribute('showUncoveredFiles')) { $result['coverageTextShowUncoveredFiles'] = $this->getBoolean( (string) $log->getAttribute('showUncoveredFiles'), false ); } if ($log->hasAttribute('showOnlySummary')) { $result['coverageTextShowOnlySummary'] = $this->getBoolean( (string) $log->getAttribute('showOnlySummary'), false ); } } $result[$type] = $target; } return $result; } /** * Returns the PHP configuration. * * @return array * * @since Method available since Release 3.2.1 */ public function getPHPConfiguration() { $result = [ 'include_path' => [], 'ini' => [], 'const' => [], 'var' => [], 'env' => [], 'post' => [], 'get' => [], 'cookie' => [], 'server' => [], 'files' => [], 'request' => [] ]; foreach ($this->xpath->query('php/includePath') as $includePath) { $path = (string) $includePath->textContent; if ($path) { $result['include_path'][] = $this->toAbsolutePath($path); } } foreach ($this->xpath->query('php/ini') as $ini) { $name = (string) $ini->getAttribute('name'); $value = (string) $ini->getAttribute('value'); $result['ini'][$name] = $value; } foreach ($this->xpath->query('php/const') as $const) { $name = (string) $const->getAttribute('name'); $value = (string) $const->getAttribute('value'); $result['const'][$name] = $this->getBoolean($value, $value); } foreach (['var', 'env', 'post', 'get', 'cookie', 'server', 'files', 'request'] as $array) { foreach ($this->xpath->query('php/' . $array) as $var) { $name = (string) $var->getAttribute('name'); $value = (string) $var->getAttribute('value'); $result[$array][$name] = $this->getBoolean($value, $value); } } return $result; } /** * Handles the PHP configuration. * * @since Method available since Release 3.2.20 */ public function handlePHPConfiguration() { $configuration = $this->getPHPConfiguration(); if (! empty($configuration['include_path'])) { ini_set( 'include_path', implode(PATH_SEPARATOR, $configuration['include_path']) . PATH_SEPARATOR . ini_get('include_path') ); } foreach ($configuration['ini'] as $name => $value) { if (defined($value)) { $value = constant($value); } ini_set($name, $value); } foreach ($configuration['const'] as $name => $value) { if (!defined($name)) { define($name, $value); } } foreach (['var', 'post', 'get', 'cookie', 'server', 'files', 'request'] as $array) { // See https://github.com/sebastianbergmann/phpunit/issues/277 switch ($array) { case 'var': $target = &$GLOBALS; break; case 'server': $target = &$_SERVER; break; default: $target = &$GLOBALS['_' . strtoupper($array)]; break; } foreach ($configuration[$array] as $name => $value) { $target[$name] = $value; } } foreach ($configuration['env'] as $name => $value) { if (false === getenv($name)) { putenv("{$name}={$value}"); } if (!isset($_ENV[$name])) { $_ENV[$name] = $value; } } } /** * Returns the PHPUnit configuration. * * @return array * * @since Method available since Release 3.2.14 */ public function getPHPUnitConfiguration() { $result = []; $root = $this->document->documentElement; if ($root->hasAttribute('cacheTokens')) { $result['cacheTokens'] = $this->getBoolean( (string) $root->getAttribute('cacheTokens'), false ); } if ($root->hasAttribute('columns')) { $columns = (string) $root->getAttribute('columns'); if ($columns == 'max') { $result['columns'] = 'max'; } else { $result['columns'] = $this->getInteger($columns, 80); } } if ($root->hasAttribute('colors')) { /* only allow boolean for compatibility with previous versions 'always' only allowed from command line */ if ($this->getBoolean($root->getAttribute('colors'), false)) { $result['colors'] = PHPUnit_TextUI_ResultPrinter::COLOR_AUTO; } else { $result['colors'] = PHPUnit_TextUI_ResultPrinter::COLOR_NEVER; } } /* * Issue #657 */ if ($root->hasAttribute('stderr')) { $result['stderr'] = $this->getBoolean( (string) $root->getAttribute('stderr'), false ); } if ($root->hasAttribute('backupGlobals')) { $result['backupGlobals'] = $this->getBoolean( (string) $root->getAttribute('backupGlobals'), true ); } if ($root->hasAttribute('backupStaticAttributes')) { $result['backupStaticAttributes'] = $this->getBoolean( (string) $root->getAttribute('backupStaticAttributes'), false ); } if ($root->getAttribute('bootstrap')) { $result['bootstrap'] = $this->toAbsolutePath( (string) $root->getAttribute('bootstrap') ); } if ($root->hasAttribute('convertErrorsToExceptions')) { $result['convertErrorsToExceptions'] = $this->getBoolean( (string) $root->getAttribute('convertErrorsToExceptions'), true ); } if ($root->hasAttribute('convertNoticesToExceptions')) { $result['convertNoticesToExceptions'] = $this->getBoolean( (string) $root->getAttribute('convertNoticesToExceptions'), true ); } if ($root->hasAttribute('convertWarningsToExceptions')) { $result['convertWarningsToExceptions'] = $this->getBoolean( (string) $root->getAttribute('convertWarningsToExceptions'), true ); } if ($root->hasAttribute('forceCoversAnnotation')) { $result['forceCoversAnnotation'] = $this->getBoolean( (string) $root->getAttribute('forceCoversAnnotation'), false ); } if ($root->hasAttribute('mapTestClassNameToCoveredClassName')) { $result['mapTestClassNameToCoveredClassName'] = $this->getBoolean( (string) $root->getAttribute('mapTestClassNameToCoveredClassName'), false ); } if ($root->hasAttribute('processIsolation')) { $result['processIsolation'] = $this->getBoolean( (string) $root->getAttribute('processIsolation'), false ); } if ($root->hasAttribute('stopOnError')) { $result['stopOnError'] = $this->getBoolean( (string) $root->getAttribute('stopOnError'), false ); } if ($root->hasAttribute('stopOnFailure')) { $result['stopOnFailure'] = $this->getBoolean( (string) $root->getAttribute('stopOnFailure'), false ); } if ($root->hasAttribute('stopOnWarning')) { $result['stopOnWarning'] = $this->getBoolean( (string) $root->getAttribute('stopOnWarning'), false ); } if ($root->hasAttribute('stopOnIncomplete')) { $result['stopOnIncomplete'] = $this->getBoolean( (string) $root->getAttribute('stopOnIncomplete'), false ); } if ($root->hasAttribute('stopOnRisky')) { $result['stopOnRisky'] = $this->getBoolean( (string) $root->getAttribute('stopOnRisky'), false ); } if ($root->hasAttribute('stopOnSkipped')) { $result['stopOnSkipped'] = $this->getBoolean( (string) $root->getAttribute('stopOnSkipped'), false ); } if ($root->hasAttribute('testSuiteLoaderClass')) { $result['testSuiteLoaderClass'] = (string) $root->getAttribute( 'testSuiteLoaderClass' ); } if ($root->getAttribute('testSuiteLoaderFile')) { $result['testSuiteLoaderFile'] = $this->toAbsolutePath( (string) $root->getAttribute('testSuiteLoaderFile') ); } if ($root->hasAttribute('printerClass')) { $result['printerClass'] = (string) $root->getAttribute( 'printerClass' ); } if ($root->getAttribute('printerFile')) { $result['printerFile'] = $this->toAbsolutePath( (string) $root->getAttribute('printerFile') ); } if ($root->hasAttribute('beStrictAboutChangesToGlobalState')) { $result['beStrictAboutChangesToGlobalState'] = $this->getBoolean( (string) $root->getAttribute('beStrictAboutChangesToGlobalState'), false ); } if ($root->hasAttribute('beStrictAboutOutputDuringTests')) { $result['disallowTestOutput'] = $this->getBoolean( (string) $root->getAttribute('beStrictAboutOutputDuringTests'), false ); } if ($root->hasAttribute('beStrictAboutResourceUsageDuringSmallTests')) { $result['beStrictAboutResourceUsageDuringSmallTests'] = $this->getBoolean( (string) $root->getAttribute('beStrictAboutResourceUsageDuringSmallTests'), false ); } if ($root->hasAttribute('beStrictAboutTestsThatDoNotTestAnything')) { $result['reportUselessTests'] = $this->getBoolean( (string) $root->getAttribute('beStrictAboutTestsThatDoNotTestAnything'), false ); } if ($root->hasAttribute('beStrictAboutTodoAnnotatedTests')) { $result['disallowTodoAnnotatedTests'] = $this->getBoolean( (string) $root->getAttribute('beStrictAboutTodoAnnotatedTests'), false ); } if ($root->hasAttribute('checkForUnintentionallyCoveredCode')) { $result['strictCoverage'] = $this->getBoolean( (string) $root->getAttribute('checkForUnintentionallyCoveredCode'), false ); } if ($root->hasAttribute('enforceTimeLimit')) { $result['enforceTimeLimit'] = $this->getBoolean( (string) $root->getAttribute('enforceTimeLimit'), false ); } if ($root->hasAttribute('timeoutForSmallTests')) { $result['timeoutForSmallTests'] = $this->getInteger( (string) $root->getAttribute('timeoutForSmallTests'), 1 ); } if ($root->hasAttribute('timeoutForMediumTests')) { $result['timeoutForMediumTests'] = $this->getInteger( (string) $root->getAttribute('timeoutForMediumTests'), 10 ); } if ($root->hasAttribute('timeoutForLargeTests')) { $result['timeoutForLargeTests'] = $this->getInteger( (string) $root->getAttribute('timeoutForLargeTests'), 60 ); } if ($root->hasAttribute('reverseDefectList')) { $result['reverseDefectList'] = $this->getBoolean( (string) $root->getAttribute('reverseDefectList'), false ); } if ($root->hasAttribute('verbose')) { $result['verbose'] = $this->getBoolean( (string) $root->getAttribute('verbose'), false ); } return $result; } /** * Returns the test suite configuration. * * @return PHPUnit_Framework_TestSuite * * @since Method available since Release 3.2.1 */ public function getTestSuiteConfiguration($testSuiteFilter = null) { $testSuiteNodes = $this->xpath->query('testsuites/testsuite'); if ($testSuiteNodes->length == 0) { $testSuiteNodes = $this->xpath->query('testsuite'); } if ($testSuiteNodes->length == 1) { return $this->getTestSuite($testSuiteNodes->item(0), $testSuiteFilter); } if ($testSuiteNodes->length > 1) { $suite = new PHPUnit_Framework_TestSuite; foreach ($testSuiteNodes as $testSuiteNode) { $suite->addTestSuite( $this->getTestSuite($testSuiteNode, $testSuiteFilter) ); } return $suite; } } /** * @param DOMElement $testSuiteNode * * @return PHPUnit_Framework_TestSuite * * @since Method available since Release 3.4.0 */ protected function getTestSuite(DOMElement $testSuiteNode, $testSuiteFilter = null) { if ($testSuiteNode->hasAttribute('name')) { $suite = new PHPUnit_Framework_TestSuite( (string) $testSuiteNode->getAttribute('name') ); } else { $suite = new PHPUnit_Framework_TestSuite; } $exclude = []; foreach ($testSuiteNode->getElementsByTagName('exclude') as $excludeNode) { $excludeFile = (string) $excludeNode->textContent; if ($excludeFile) { $exclude[] = $this->toAbsolutePath($excludeFile); } } $fileIteratorFacade = new File_Iterator_Facade; foreach ($testSuiteNode->getElementsByTagName('directory') as $directoryNode) { if ($testSuiteFilter && $directoryNode->parentNode->getAttribute('name') != $testSuiteFilter) { continue; } $directory = (string) $directoryNode->textContent; if (empty($directory)) { continue; } if ($directoryNode->hasAttribute('phpVersion')) { $phpVersion = (string) $directoryNode->getAttribute('phpVersion'); } else { $phpVersion = PHP_VERSION; } if ($directoryNode->hasAttribute('phpVersionOperator')) { $phpVersionOperator = (string) $directoryNode->getAttribute('phpVersionOperator'); } else { $phpVersionOperator = '>='; } if (!version_compare(PHP_VERSION, $phpVersion, $phpVersionOperator)) { continue; } if ($directoryNode->hasAttribute('prefix')) { $prefix = (string) $directoryNode->getAttribute('prefix'); } else { $prefix = ''; } if ($directoryNode->hasAttribute('suffix')) { $suffix = (string) $directoryNode->getAttribute('suffix'); } else { $suffix = 'Test.php'; } $files = $fileIteratorFacade->getFilesAsArray( $this->toAbsolutePath($directory), $suffix, $prefix, $exclude ); $suite->addTestFiles($files); } foreach ($testSuiteNode->getElementsByTagName('file') as $fileNode) { if ($testSuiteFilter && $fileNode->parentNode->getAttribute('name') != $testSuiteFilter) { continue; } $file = (string) $fileNode->textContent; if (empty($file)) { continue; } // Get the absolute path to the file $file = $fileIteratorFacade->getFilesAsArray( $this->toAbsolutePath($file) ); if (!isset($file[0])) { continue; } $file = $file[0]; if ($fileNode->hasAttribute('phpVersion')) { $phpVersion = (string) $fileNode->getAttribute('phpVersion'); } else { $phpVersion = PHP_VERSION; } if ($fileNode->hasAttribute('phpVersionOperator')) { $phpVersionOperator = (string) $fileNode->getAttribute('phpVersionOperator'); } else { $phpVersionOperator = '>='; } if (!version_compare(PHP_VERSION, $phpVersion, $phpVersionOperator)) { continue; } $suite->addTestFile($file); } return $suite; } /** * @param string $value * @param bool $default * * @return bool * * @since Method available since Release 3.2.3 */ protected function getBoolean($value, $default) { if (strtolower($value) == 'false') { return false; } elseif (strtolower($value) == 'true') { return true; } return $default; } /** * @param string $value * @param bool $default * * @return bool * * @since Method available since Release 3.6.0 */ protected function getInteger($value, $default) { if (is_numeric($value)) { return (int) $value; } return $default; } /** * @param string $query * * @return array * * @since Method available since Release 3.2.3 */ protected function readFilterDirectories($query) { $directories = []; foreach ($this->xpath->query($query) as $directory) { $directoryPath = (string) $directory->textContent; if (!$directoryPath) { continue; } if ($directory->hasAttribute('prefix')) { $prefix = (string) $directory->getAttribute('prefix'); } else { $prefix = ''; } if ($directory->hasAttribute('suffix')) { $suffix = (string) $directory->getAttribute('suffix'); } else { $suffix = '.php'; } if ($directory->hasAttribute('group')) { $group = (string) $directory->getAttribute('group'); } else { $group = 'DEFAULT'; } $directories[] = [ 'path' => $this->toAbsolutePath($directoryPath), 'prefix' => $prefix, 'suffix' => $suffix, 'group' => $group ]; } return $directories; } /** * @param string $query * * @return array * * @since Method available since Release 3.2.3 */ protected function readFilterFiles($query) { $files = []; foreach ($this->xpath->query($query) as $file) { $filePath = (string) $file->textContent; if ($filePath) { $files[] = $this->toAbsolutePath($filePath); } } return $files; } /** * @param string $path * @param bool $useIncludePath * * @return string * * @since Method available since Release 3.5.0 */ protected function toAbsolutePath($path, $useIncludePath = false) { if ($path[0] === '/') { return $path; } // Matches the following on Windows: // - \\NetworkComputer\Path // - \\.\D: // - \\.\c: // - C:\Windows // - C:\windows // - C:/windows // - c:/windows if (defined('PHP_WINDOWS_VERSION_BUILD') && ($path[0] === '\\' || (strlen($path) >= 3 && preg_match('#^[A-Z]\:[/\\\]#i', substr($path, 0, 3))))) { return $path; } // Stream if (strpos($path, '://') !== false) { return $path; } $file = dirname($this->filename) . DIRECTORY_SEPARATOR . $path; if ($useIncludePath && !file_exists($file)) { $includePathFile = stream_resolve_include_path($path); if ($includePathFile) { $file = $includePathFile; } } return $file; } } phpunit-5.1.3/src/Util/ErrorHandler.php000066400000000000000000000065751263222771600200400ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ // Workaround for http://bugs.php.net/bug.php?id=47987, // see https://github.com/sebastianbergmann/phpunit/issues#issue/125 for details // Use dirname(__DIR__) instead of using /../ because of https://github.com/facebook/hhvm/issues/5215 require_once dirname(__DIR__) . '/Framework/Error.php'; require_once dirname(__DIR__) . '/Framework/Error/Notice.php'; require_once dirname(__DIR__) . '/Framework/Error/Warning.php'; require_once dirname(__DIR__) . '/Framework/Error/Deprecated.php'; /** * Error handler that converts PHP errors and warnings to exceptions. * * @since Class available since Release 3.3.0 */ class PHPUnit_Util_ErrorHandler { protected static $errorStack = []; /** * Returns the error stack. * * @return array */ public static function getErrorStack() { return self::$errorStack; } /** * @param int $errno * @param string $errstr * @param string $errfile * @param int $errline * * @throws PHPUnit_Framework_Error */ public static function handleError($errno, $errstr, $errfile, $errline) { if (!($errno & error_reporting())) { return false; } self::$errorStack[] = [$errno, $errstr, $errfile, $errline]; $trace = debug_backtrace(false); array_shift($trace); foreach ($trace as $frame) { if ($frame['function'] == '__toString') { return false; } } if ($errno == E_NOTICE || $errno == E_USER_NOTICE || $errno == E_STRICT) { if (PHPUnit_Framework_Error_Notice::$enabled !== true) { return false; } $exception = 'PHPUnit_Framework_Error_Notice'; } elseif ($errno == E_WARNING || $errno == E_USER_WARNING) { if (PHPUnit_Framework_Error_Warning::$enabled !== true) { return false; } $exception = 'PHPUnit_Framework_Error_Warning'; } elseif ($errno == E_DEPRECATED || $errno == E_USER_DEPRECATED) { if (PHPUnit_Framework_Error_Deprecated::$enabled !== true) { return false; } $exception = 'PHPUnit_Framework_Error_Deprecated'; } else { $exception = 'PHPUnit_Framework_Error'; } throw new $exception($errstr, $errno, $errfile, $errline); } /** * Registers an error handler and returns a function that will restore * the previous handler when invoked * * @param int $severity PHP predefined error constant * * @throws Exception if event of specified severity is emitted */ public static function handleErrorOnce($severity = E_WARNING) { $terminator = function () { static $expired = false; if (!$expired) { $expired = true; // cleans temporary error handler return restore_error_handler(); } }; set_error_handler(function ($errno, $errstr) use ($severity) { if ($errno === $severity) { return; } return false; }); return $terminator; } } phpunit-5.1.3/src/Util/Fileloader.php000066400000000000000000000033421263222771600175040ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Utility methods to load PHP sourcefiles. * * @since Class available since Release 2.3.0 */ class PHPUnit_Util_Fileloader { /** * Checks if a PHP sourcefile is readable. * The sourcefile is loaded through the load() method. * * @param string $filename * * @return string * * @throws PHPUnit_Framework_Exception */ public static function checkAndLoad($filename) { $includePathFilename = stream_resolve_include_path($filename); if (!$includePathFilename || !is_readable($includePathFilename)) { throw new PHPUnit_Framework_Exception( sprintf('Cannot open file "%s".' . "\n", $filename) ); } self::load($includePathFilename); return $includePathFilename; } /** * Loads a PHP sourcefile. * * @param string $filename * * @return mixed * * @since Method available since Release 3.0.0 */ public static function load($filename) { $oldVariableNames = array_keys(get_defined_vars()); include_once $filename; $newVariables = get_defined_vars(); $newVariableNames = array_diff( array_keys($newVariables), $oldVariableNames ); foreach ($newVariableNames as $variableName) { if ($variableName != 'oldVariableNames') { $GLOBALS[$variableName] = $newVariables[$variableName]; } } return $filename; } } phpunit-5.1.3/src/Util/Filesystem.php000066400000000000000000000016141263222771600175620ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Filesystem helpers. * * @since Class available since Release 3.0.0 */ class PHPUnit_Util_Filesystem { /** * @var array */ protected static $buffer = []; /** * Maps class names to source file names: * - PEAR CS: Foo_Bar_Baz -> Foo/Bar/Baz.php * - Namespace: Foo\Bar\Baz -> Foo/Bar/Baz.php * * @param string $className * * @return string * * @since Method available since Release 3.4.0 */ public static function classNameToFilename($className) { return str_replace( ['_', '\\'], DIRECTORY_SEPARATOR, $className ) . '.php'; } } phpunit-5.1.3/src/Util/Filter.php000066400000000000000000000057071263222771600166720ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Utility class for code filtering. * * @since Class available since Release 2.0.0 */ class PHPUnit_Util_Filter { /** * Filters stack frames from PHPUnit classes. * * @param Exception $e * @param bool $asString * * @return string */ public static function getFilteredStacktrace($e, $asString = true) { $prefix = false; $script = realpath($GLOBALS['_SERVER']['SCRIPT_NAME']); if (defined('__PHPUNIT_PHAR_ROOT__')) { $prefix = __PHPUNIT_PHAR_ROOT__; } if ($asString === true) { $filteredStacktrace = ''; } else { $filteredStacktrace = []; } if ($e instanceof PHPUnit_Framework_SyntheticError) { $eTrace = $e->getSyntheticTrace(); $eFile = $e->getSyntheticFile(); $eLine = $e->getSyntheticLine(); } elseif ($e instanceof PHPUnit_Framework_Exception) { $eTrace = $e->getSerializableTrace(); $eFile = $e->getFile(); $eLine = $e->getLine(); } else { if ($e->getPrevious()) { $e = $e->getPrevious(); } $eTrace = $e->getTrace(); $eFile = $e->getFile(); $eLine = $e->getLine(); } if (!self::frameExists($eTrace, $eFile, $eLine)) { array_unshift( $eTrace, ['file' => $eFile, 'line' => $eLine] ); } $blacklist = new PHPUnit_Util_Blacklist; foreach ($eTrace as $frame) { if (isset($frame['file']) && is_file($frame['file']) && !$blacklist->isBlacklisted($frame['file']) && ($prefix === false || strpos($frame['file'], $prefix) !== 0) && $frame['file'] !== $script) { if ($asString === true) { $filteredStacktrace .= sprintf( "%s:%s\n", $frame['file'], isset($frame['line']) ? $frame['line'] : '?' ); } else { $filteredStacktrace[] = $frame; } } } return $filteredStacktrace; } /** * @param array $trace * @param string $file * @param int $line * * @return bool * * @since Method available since Release 3.3.2 */ private static function frameExists(array $trace, $file, $line) { foreach ($trace as $frame) { if (isset($frame['file']) && $frame['file'] == $file && isset($frame['line']) && $frame['line'] == $line) { return true; } } return false; } } phpunit-5.1.3/src/Util/Getopt.php000066400000000000000000000112111263222771600166720ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Command-line options parsing class. * * @since Class available since Release 3.0.0 */ class PHPUnit_Util_Getopt { public static function getopt(array $args, $short_options, $long_options = null) { if (empty($args)) { return [[], []]; } $opts = []; $non_opts = []; if ($long_options) { sort($long_options); } if (isset($args[0][0]) && $args[0][0] != '-') { array_shift($args); } reset($args); array_map('trim', $args); while (list($i, $arg) = each($args)) { if ($arg == '') { continue; } if ($arg == '--') { $non_opts = array_merge($non_opts, array_slice($args, $i + 1)); break; } if ($arg[0] != '-' || (strlen($arg) > 1 && $arg[1] == '-' && !$long_options)) { $non_opts[] = $args[$i]; continue; } elseif (strlen($arg) > 1 && $arg[1] == '-') { self::parseLongOption( substr($arg, 2), $long_options, $opts, $args ); } else { self::parseShortOption( substr($arg, 1), $short_options, $opts, $args ); } } return [$opts, $non_opts]; } protected static function parseShortOption($arg, $short_options, &$opts, &$args) { $argLen = strlen($arg); for ($i = 0; $i < $argLen; $i++) { $opt = $arg[$i]; $opt_arg = null; if (($spec = strstr($short_options, $opt)) === false || $arg[$i] == ':') { throw new PHPUnit_Framework_Exception( "unrecognized option -- $opt" ); } if (strlen($spec) > 1 && $spec[1] == ':') { if (strlen($spec) > 2 && $spec[2] == ':') { if ($i + 1 < $argLen) { $opts[] = [$opt, substr($arg, $i + 1)]; break; } } else { if ($i + 1 < $argLen) { $opts[] = [$opt, substr($arg, $i + 1)]; break; } elseif (list(, $opt_arg) = each($args)) { } else { throw new PHPUnit_Framework_Exception( "option requires an argument -- $opt" ); } } } $opts[] = [$opt, $opt_arg]; } } protected static function parseLongOption($arg, $long_options, &$opts, &$args) { $count = count($long_options); $list = explode('=', $arg); $opt = $list[0]; $opt_arg = null; if (count($list) > 1) { $opt_arg = $list[1]; } $opt_len = strlen($opt); for ($i = 0; $i < $count; $i++) { $long_opt = $long_options[$i]; $opt_start = substr($long_opt, 0, $opt_len); if ($opt_start != $opt) { continue; } $opt_rest = substr($long_opt, $opt_len); if ($opt_rest != '' && $opt[0] != '=' && $i + 1 < $count && $opt == substr($long_options[$i+1], 0, $opt_len)) { throw new PHPUnit_Framework_Exception( "option --$opt is ambiguous" ); } if (substr($long_opt, -1) == '=') { if (substr($long_opt, -2) != '==') { if (!strlen($opt_arg) && !(list(, $opt_arg) = each($args))) { throw new PHPUnit_Framework_Exception( "option --$opt requires an argument" ); } } } elseif ($opt_arg) { throw new PHPUnit_Framework_Exception( "option --$opt doesn't allow an argument" ); } $full_option = '--' . preg_replace('/={1,2}$/', '', $long_opt); $opts[] = [$full_option, $opt_arg]; return; } throw new PHPUnit_Framework_Exception("unrecognized option --$opt"); } } phpunit-5.1.3/src/Util/GlobalState.php000066400000000000000000000120451263222771600176370ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 3.4.0 */ class PHPUnit_Util_GlobalState { /** * @var array */ protected static $superGlobalArrays = [ '_ENV', '_POST', '_GET', '_COOKIE', '_SERVER', '_FILES', '_REQUEST' ]; /** * @var array */ protected static $superGlobalArraysLong = [ 'HTTP_ENV_VARS', 'HTTP_POST_VARS', 'HTTP_GET_VARS', 'HTTP_COOKIE_VARS', 'HTTP_SERVER_VARS', 'HTTP_POST_FILES' ]; public static function getIncludedFilesAsString() { return static::processIncludedFilesAsString(get_included_files()); } public static function processIncludedFilesAsString(array $files) { $blacklist = new PHPUnit_Util_Blacklist; $prefix = false; $result = ''; if (defined('__PHPUNIT_PHAR__')) { $prefix = 'phar://' . __PHPUNIT_PHAR__ . '/'; } for ($i = count($files) - 1; $i > 0; $i--) { $file = $files[$i]; if ($prefix !== false && strpos($file, $prefix) === 0) { continue; } // Skip virtual file system protocols if (preg_match('/^(vfs|phpvfs[a-z0-9]+):/', $file)) { continue; } if (!$blacklist->isBlacklisted($file) && is_file($file)) { $result = 'require_once \'' . $file . "';\n" . $result; } } return $result; } public static function getIniSettingsAsString() { $result = ''; $iniSettings = ini_get_all(null, false); foreach ($iniSettings as $key => $value) { $result .= sprintf( '@ini_set(%s, %s);' . "\n", self::exportVariable($key), self::exportVariable($value) ); } return $result; } public static function getConstantsAsString() { $constants = get_defined_constants(true); $result = ''; if (isset($constants['user'])) { foreach ($constants['user'] as $name => $value) { $result .= sprintf( 'if (!defined(\'%s\')) define(\'%s\', %s);' . "\n", $name, $name, self::exportVariable($value) ); } } return $result; } public static function getGlobalsAsString() { $result = ''; $superGlobalArrays = self::getSuperGlobalArrays(); foreach ($superGlobalArrays as $superGlobalArray) { if (isset($GLOBALS[$superGlobalArray]) && is_array($GLOBALS[$superGlobalArray])) { foreach (array_keys($GLOBALS[$superGlobalArray]) as $key) { if ($GLOBALS[$superGlobalArray][$key] instanceof Closure) { continue; } $result .= sprintf( '$GLOBALS[\'%s\'][\'%s\'] = %s;' . "\n", $superGlobalArray, $key, self::exportVariable($GLOBALS[$superGlobalArray][$key]) ); } } } $blacklist = $superGlobalArrays; $blacklist[] = 'GLOBALS'; foreach (array_keys($GLOBALS) as $key) { if (!in_array($key, $blacklist) && !$GLOBALS[$key] instanceof Closure) { $result .= sprintf( '$GLOBALS[\'%s\'] = %s;' . "\n", $key, self::exportVariable($GLOBALS[$key]) ); } } return $result; } protected static function getSuperGlobalArrays() { if (ini_get('register_long_arrays') == '1') { return array_merge( self::$superGlobalArrays, self::$superGlobalArraysLong ); } else { return self::$superGlobalArrays; } } protected static function exportVariable($variable) { if (is_scalar($variable) || is_null($variable) || (is_array($variable) && self::arrayOnlyContainsScalars($variable))) { return var_export($variable, true); } return 'unserialize(' . var_export(serialize($variable), true) . ')'; } protected static function arrayOnlyContainsScalars(array $array) { $result = true; foreach ($array as $element) { if (is_array($element)) { $result = self::arrayOnlyContainsScalars($element); } elseif (!is_scalar($element) && !is_null($element)) { $result = false; } if ($result === false) { break; } } return $result; } } phpunit-5.1.3/src/Util/InvalidArgumentHelper.php000066400000000000000000000021231263222771600216630ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Factory for PHPUnit_Framework_Exception objects that are used to describe * invalid arguments passed to a function or method. * * @since Class available since Release 3.4.0 */ class PHPUnit_Util_InvalidArgumentHelper { /** * @param int $argument * @param string $type * @param mixed $value * * @return PHPUnit_Framework_Exception */ public static function factory($argument, $type, $value = null) { $stack = debug_backtrace(false); return new PHPUnit_Framework_Exception( sprintf( 'Argument #%d%sof %s::%s() must be a %s', $argument, $value !== null ? ' (' . gettype($value) . '#' . $value . ')' : ' (No Value) ', $stack[1]['class'], $stack[1]['function'], $type ) ); } } phpunit-5.1.3/src/Util/Log/000077500000000000000000000000001263222771600154445ustar00rootroot00000000000000phpunit-5.1.3/src/Util/Log/JSON.php000066400000000000000000000153661263222771600167410ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A TestListener that generates JSON messages. * * @since Class available since Release 3.0.0 */ class PHPUnit_Util_Log_JSON extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener { /** * @var string */ protected $currentTestSuiteName = ''; /** * @var string */ protected $currentTestName = ''; /** * @var bool */ protected $currentTestPass = true; /** * An error occurred. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->writeCase( 'error', $time, PHPUnit_Util_Filter::getFilteredStacktrace($e, false), $e->getMessage(), $test ); $this->currentTestPass = false; } /** * A warning occurred. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_Warning $e * @param float $time * * @since Method available since Release 5.1.0 */ public function addWarning(PHPUnit_Framework_Test $test, PHPUnit_Framework_Warning $e, $time) { $this->writeCase( 'warning', $time, PHPUnit_Util_Filter::getFilteredStacktrace($e, false), $e->getMessage(), $test ); $this->currentTestPass = false; } /** * A failure occurred. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_AssertionFailedError $e * @param float $time */ public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) { $this->writeCase( 'fail', $time, PHPUnit_Util_Filter::getFilteredStacktrace($e, false), $e->getMessage(), $test ); $this->currentTestPass = false; } /** * Incomplete test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->writeCase( 'error', $time, PHPUnit_Util_Filter::getFilteredStacktrace($e, false), 'Incomplete Test: ' . $e->getMessage(), $test ); $this->currentTestPass = false; } /** * Risky test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time * * @since Method available since Release 4.0.0 */ public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->writeCase( 'error', $time, PHPUnit_Util_Filter::getFilteredStacktrace($e, false), 'Risky Test: ' . $e->getMessage(), $test ); $this->currentTestPass = false; } /** * Skipped test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->writeCase( 'error', $time, PHPUnit_Util_Filter::getFilteredStacktrace($e, false), 'Skipped Test: ' . $e->getMessage(), $test ); $this->currentTestPass = false; } /** * A testsuite started. * * @param PHPUnit_Framework_TestSuite $suite */ public function startTestSuite(PHPUnit_Framework_TestSuite $suite) { $this->currentTestSuiteName = $suite->getName(); $this->currentTestName = ''; $this->write( [ 'event' => 'suiteStart', 'suite' => $this->currentTestSuiteName, 'tests' => count($suite) ] ); } /** * A testsuite ended. * * @param PHPUnit_Framework_TestSuite $suite */ public function endTestSuite(PHPUnit_Framework_TestSuite $suite) { $this->currentTestSuiteName = ''; $this->currentTestName = ''; } /** * A test started. * * @param PHPUnit_Framework_Test $test */ public function startTest(PHPUnit_Framework_Test $test) { $this->currentTestName = PHPUnit_Util_Test::describe($test); $this->currentTestPass = true; $this->write( [ 'event' => 'testStart', 'suite' => $this->currentTestSuiteName, 'test' => $this->currentTestName ] ); } /** * A test ended. * * @param PHPUnit_Framework_Test $test * @param float $time */ public function endTest(PHPUnit_Framework_Test $test, $time) { if ($this->currentTestPass) { $this->writeCase('pass', $time, [], '', $test); } } /** * @param string $status * @param float $time * @param array $trace * @param string $message * @param PHPUnit_Framework_TestCase|null $test */ protected function writeCase($status, $time, array $trace = [], $message = '', $test = null) { $output = ''; // take care of TestSuite producing error (e.g. by running into exception) as TestSuite doesn't have hasOutput if ($test !== null && method_exists($test, 'hasOutput') && $test->hasOutput()) { $output = $test->getActualOutput(); } $this->write( [ 'event' => 'test', 'suite' => $this->currentTestSuiteName, 'test' => $this->currentTestName, 'status' => $status, 'time' => $time, 'trace' => $trace, 'message' => PHPUnit_Util_String::convertToUtf8($message), 'output' => $output, ] ); } /** * @param string $buffer */ public function write($buffer) { array_walk_recursive($buffer, function (&$input) { if (is_string($input)) { $input = PHPUnit_Util_String::convertToUtf8($input); } }); parent::write(json_encode($buffer, JSON_PRETTY_PRINT)); } } phpunit-5.1.3/src/Util/Log/JUnit.php000066400000000000000000000316371263222771600172200ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A TestListener that generates a logfile of the test execution in XML markup. * * The XML markup used is the same as the one that is used by the JUnit Ant task. * * @since Class available since Release 2.1.0 */ class PHPUnit_Util_Log_JUnit extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener { /** * @var DOMDocument */ protected $document; /** * @var DOMElement */ protected $root; /** * @var bool */ protected $logIncompleteSkipped = false; /** * @var bool */ protected $writeDocument = true; /** * @var DOMElement[] */ protected $testSuites = []; /** * @var int[] */ protected $testSuiteTests = [0]; /** * @var int[] */ protected $testSuiteAssertions = [0]; /** * @var int[] */ protected $testSuiteErrors = [0]; /** * @var int[] */ protected $testSuiteFailures = [0]; /** * @var int[] */ protected $testSuiteTimes = [0]; /** * @var int */ protected $testSuiteLevel = 0; /** * @var DOMElement */ protected $currentTestCase = null; /** * @var bool */ protected $attachCurrentTestCase = true; /** * Constructor. * * @param mixed $out * @param bool $logIncompleteSkipped */ public function __construct($out = null, $logIncompleteSkipped = false) { $this->document = new DOMDocument('1.0', 'UTF-8'); $this->document->formatOutput = true; $this->root = $this->document->createElement('testsuites'); $this->document->appendChild($this->root); parent::__construct($out); $this->logIncompleteSkipped = $logIncompleteSkipped; } /** * Flush buffer and close output. */ public function flush() { if ($this->writeDocument === true) { $this->write($this->getXML()); } parent::flush(); } /** * An error occurred. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->doAddFault($test, $e, $time, 'error'); $this->testSuiteErrors[$this->testSuiteLevel]++; } /** * A warning occurred. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_Warning $e * @param float $time * * @since Method available since Release 5.1.0 */ public function addWarning(PHPUnit_Framework_Test $test, PHPUnit_Framework_Warning $e, $time) { $this->doAddFault($test, $e, $time, 'warning'); $this->testSuiteFailures[$this->testSuiteLevel]++; } /** * A failure occurred. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_AssertionFailedError $e * @param float $time */ public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) { $this->doAddFault($test, $e, $time, 'failure'); $this->testSuiteFailures[$this->testSuiteLevel]++; } /** * Incomplete test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) { if ($this->logIncompleteSkipped && $this->currentTestCase !== null) { $error = $this->document->createElement( 'error', PHPUnit_Util_XML::prepareString( "Incomplete Test\n" . PHPUnit_Util_Filter::getFilteredStacktrace($e) ) ); $error->setAttribute('type', get_class($e)); $this->currentTestCase->appendChild($error); $this->testSuiteErrors[$this->testSuiteLevel]++; } else { $this->attachCurrentTestCase = false; } } /** * Risky test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time * * @since Method available since Release 4.0.0 */ public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) { if ($this->logIncompleteSkipped && $this->currentTestCase !== null) { $error = $this->document->createElement( 'error', PHPUnit_Util_XML::prepareString( "Risky Test\n" . PHPUnit_Util_Filter::getFilteredStacktrace($e) ) ); $error->setAttribute('type', get_class($e)); $this->currentTestCase->appendChild($error); $this->testSuiteErrors[$this->testSuiteLevel]++; } else { $this->attachCurrentTestCase = false; } } /** * Skipped test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time * * @since Method available since Release 3.0.0 */ public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) { if ($this->logIncompleteSkipped && $this->currentTestCase !== null) { $error = $this->document->createElement( 'error', PHPUnit_Util_XML::prepareString( "Skipped Test\n" . PHPUnit_Util_Filter::getFilteredStacktrace($e) ) ); $error->setAttribute('type', get_class($e)); $this->currentTestCase->appendChild($error); $this->testSuiteErrors[$this->testSuiteLevel]++; } else { $this->attachCurrentTestCase = false; } } /** * A testsuite started. * * @param PHPUnit_Framework_TestSuite $suite * * @since Method available since Release 2.2.0 */ public function startTestSuite(PHPUnit_Framework_TestSuite $suite) { $testSuite = $this->document->createElement('testsuite'); $testSuite->setAttribute('name', $suite->getName()); if (class_exists($suite->getName(), false)) { try { $class = new ReflectionClass($suite->getName()); $testSuite->setAttribute('file', $class->getFileName()); } catch (ReflectionException $e) { } } if ($this->testSuiteLevel > 0) { $this->testSuites[$this->testSuiteLevel]->appendChild($testSuite); } else { $this->root->appendChild($testSuite); } $this->testSuiteLevel++; $this->testSuites[$this->testSuiteLevel] = $testSuite; $this->testSuiteTests[$this->testSuiteLevel] = 0; $this->testSuiteAssertions[$this->testSuiteLevel] = 0; $this->testSuiteErrors[$this->testSuiteLevel] = 0; $this->testSuiteFailures[$this->testSuiteLevel] = 0; $this->testSuiteTimes[$this->testSuiteLevel] = 0; } /** * A testsuite ended. * * @param PHPUnit_Framework_TestSuite $suite * * @since Method available since Release 2.2.0 */ public function endTestSuite(PHPUnit_Framework_TestSuite $suite) { $this->testSuites[$this->testSuiteLevel]->setAttribute( 'tests', $this->testSuiteTests[$this->testSuiteLevel] ); $this->testSuites[$this->testSuiteLevel]->setAttribute( 'assertions', $this->testSuiteAssertions[$this->testSuiteLevel] ); $this->testSuites[$this->testSuiteLevel]->setAttribute( 'failures', $this->testSuiteFailures[$this->testSuiteLevel] ); $this->testSuites[$this->testSuiteLevel]->setAttribute( 'errors', $this->testSuiteErrors[$this->testSuiteLevel] ); $this->testSuites[$this->testSuiteLevel]->setAttribute( 'time', sprintf('%F', $this->testSuiteTimes[$this->testSuiteLevel]) ); if ($this->testSuiteLevel > 1) { $this->testSuiteTests[$this->testSuiteLevel - 1] += $this->testSuiteTests[$this->testSuiteLevel]; $this->testSuiteAssertions[$this->testSuiteLevel - 1] += $this->testSuiteAssertions[$this->testSuiteLevel]; $this->testSuiteErrors[$this->testSuiteLevel - 1] += $this->testSuiteErrors[$this->testSuiteLevel]; $this->testSuiteFailures[$this->testSuiteLevel - 1] += $this->testSuiteFailures[$this->testSuiteLevel]; $this->testSuiteTimes[$this->testSuiteLevel - 1] += $this->testSuiteTimes[$this->testSuiteLevel]; } $this->testSuiteLevel--; } /** * A test started. * * @param PHPUnit_Framework_Test $test */ public function startTest(PHPUnit_Framework_Test $test) { $testCase = $this->document->createElement('testcase'); $testCase->setAttribute('name', $test->getName()); if ($test instanceof PHPUnit_Framework_TestCase) { $class = new ReflectionClass($test); $methodName = $test->getName(); if ($class->hasMethod($methodName)) { $method = $class->getMethod($test->getName()); $testCase->setAttribute('class', $class->getName()); $testCase->setAttribute('file', $class->getFileName()); $testCase->setAttribute('line', $method->getStartLine()); } } $this->currentTestCase = $testCase; } /** * A test ended. * * @param PHPUnit_Framework_Test $test * @param float $time */ public function endTest(PHPUnit_Framework_Test $test, $time) { if ($this->attachCurrentTestCase) { if ($test instanceof PHPUnit_Framework_TestCase) { $numAssertions = $test->getNumAssertions(); $this->testSuiteAssertions[$this->testSuiteLevel] += $numAssertions; $this->currentTestCase->setAttribute( 'assertions', $numAssertions ); } $this->currentTestCase->setAttribute( 'time', sprintf('%F', $time) ); $this->testSuites[$this->testSuiteLevel]->appendChild( $this->currentTestCase ); $this->testSuiteTests[$this->testSuiteLevel]++; $this->testSuiteTimes[$this->testSuiteLevel] += $time; if (method_exists($test, 'hasOutput') && $test->hasOutput()) { $systemOut = $this->document->createElement('system-out'); $systemOut->appendChild( $this->document->createTextNode($test->getActualOutput()) ); $this->currentTestCase->appendChild($systemOut); } } $this->attachCurrentTestCase = true; $this->currentTestCase = null; } /** * Returns the XML as a string. * * @return string * * @since Method available since Release 2.2.0 */ public function getXML() { return $this->document->saveXML(); } /** * Enables or disables the writing of the document * in flush(). * * This is a "hack" needed for the integration of * PHPUnit with Phing. * * @return string * * @since Method available since Release 2.2.0 */ public function setWriteDocument($flag) { if (is_bool($flag)) { $this->writeDocument = $flag; } } /** * Method which generalizes addError() and addFailure() * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time * @param string $type */ private function doAddFault(PHPUnit_Framework_Test $test, Exception $e, $time, $type) { if ($this->currentTestCase === null) { return; } if ($test instanceof PHPUnit_Framework_SelfDescribing) { $buffer = $test->toString() . "\n"; } else { $buffer = ''; } $buffer .= PHPUnit_Framework_TestFailure::exceptionToString($e) . "\n" . PHPUnit_Util_Filter::getFilteredStacktrace($e); $fault = $this->document->createElement( $type, PHPUnit_Util_XML::prepareString($buffer) ); $fault->setAttribute('type', get_class($e)); $this->currentTestCase->appendChild($fault); } } phpunit-5.1.3/src/Util/Log/TAP.php000066400000000000000000000152161263222771600166060ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A TestListener that generates a logfile of the * test execution using the Test Anything Protocol (TAP). * * @since Class available since Release 3.0.0 */ class PHPUnit_Util_Log_TAP extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener { /** * @var int */ protected $testNumber = 0; /** * @var int */ protected $testSuiteLevel = 0; /** * @var bool */ protected $testSuccessful = true; /** * Constructor. * * @param mixed $out * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.3.4 */ public function __construct($out = null) { parent::__construct($out); $this->write("TAP version 13\n"); } /** * An error occurred. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->writeNotOk($test, 'Error'); } /** * A warning occurred. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_Warning $e * @param float $time * * @since Method available since Release 5.1.0 */ public function addWarning(PHPUnit_Framework_Test $test, PHPUnit_Framework_Warning $e, $time) { $this->writeNotOk($test, 'Warning'); } /** * A failure occurred. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_AssertionFailedError $e * @param float $time */ public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) { $this->writeNotOk($test, 'Failure'); $message = explode( "\n", PHPUnit_Framework_TestFailure::exceptionToString($e) ); $diagnostic = [ 'message' => $message[0], 'severity' => 'fail' ]; if ($e instanceof PHPUnit_Framework_ExpectationFailedException) { $cf = $e->getComparisonFailure(); if ($cf !== null) { $diagnostic['data'] = [ 'got' => $cf->getActual(), 'expected' => $cf->getExpected() ]; } } $yaml = new Symfony\Component\Yaml\Dumper; $this->write( sprintf( " ---\n%s ...\n", $yaml->dump($diagnostic, 2, 2) ) ); } /** * Incomplete test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->writeNotOk($test, '', 'TODO Incomplete Test'); } /** * Risky test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time * * @since Method available since Release 4.0.0 */ public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->write( sprintf( "ok %d - # RISKY%s\n", $this->testNumber, $e->getMessage() != '' ? ' ' . $e->getMessage() : '' ) ); $this->testSuccessful = false; } /** * Skipped test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time * * @since Method available since Release 3.0.0 */ public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->write( sprintf( "ok %d - # SKIP%s\n", $this->testNumber, $e->getMessage() != '' ? ' ' . $e->getMessage() : '' ) ); $this->testSuccessful = false; } /** * A testsuite started. * * @param PHPUnit_Framework_TestSuite $suite */ public function startTestSuite(PHPUnit_Framework_TestSuite $suite) { $this->testSuiteLevel++; } /** * A testsuite ended. * * @param PHPUnit_Framework_TestSuite $suite */ public function endTestSuite(PHPUnit_Framework_TestSuite $suite) { $this->testSuiteLevel--; if ($this->testSuiteLevel == 0) { $this->write(sprintf("1..%d\n", $this->testNumber)); } } /** * A test started. * * @param PHPUnit_Framework_Test $test */ public function startTest(PHPUnit_Framework_Test $test) { $this->testNumber++; $this->testSuccessful = true; } /** * A test ended. * * @param PHPUnit_Framework_Test $test * @param float $time */ public function endTest(PHPUnit_Framework_Test $test, $time) { if ($this->testSuccessful === true) { $this->write( sprintf( "ok %d - %s\n", $this->testNumber, PHPUnit_Util_Test::describe($test) ) ); } $this->writeDiagnostics($test); } /** * @param PHPUnit_Framework_Test $test * @param string $prefix * @param string $directive */ protected function writeNotOk(PHPUnit_Framework_Test $test, $prefix = '', $directive = '') { $this->write( sprintf( "not ok %d - %s%s%s\n", $this->testNumber, $prefix != '' ? $prefix . ': ' : '', PHPUnit_Util_Test::describe($test), $directive != '' ? ' # ' . $directive : '' ) ); $this->testSuccessful = false; } /** * @param PHPUnit_Framework_Test $test */ private function writeDiagnostics(PHPUnit_Framework_Test $test) { if (!$test instanceof PHPUnit_Framework_TestCase) { return; } if (!$test->hasOutput()) { return; } foreach (explode("\n", trim($test->getActualOutput())) as $line) { $this->write( sprintf( "# %s\n", $line ) ); } } } phpunit-5.1.3/src/Util/Log/TeamCity.php000066400000000000000000000255541263222771600177070ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use SebastianBergmann\Comparator\ComparisonFailure; /** * A TestListener that generates a logfile of the test execution using the * TeamCity format (for use with PhpStorm, for instance). * * @since Class available since Release 5.0.0 */ class PHPUnit_Util_Log_TeamCity extends PHPUnit_TextUI_ResultPrinter { /** * @var bool */ private $isSummaryTestCountPrinted = false; /** * @var string */ private $startedTestName; /** * @var string */ private $flowId; /** * @param string $progress */ protected function writeProgress($progress) { } /** * @param PHPUnit_Framework_TestResult $result */ public function printResult(PHPUnit_Framework_TestResult $result) { $this->printHeader(); $this->printFooter($result); } /** * An error occurred. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->printEvent( 'testFailed', [ 'name' => $test->getName(), 'message' => self::getMessage($e), 'details' => self::getDetails($e), ] ); } /** * A warning occurred. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_Warning $e * @param float $time * * @since Method available since Release 5.1.0 */ public function addWarning(PHPUnit_Framework_Test $test, PHPUnit_Framework_Warning $e, $time) { $this->printEvent( 'testFailed', [ 'name' => $test->getName(), 'message' => self::getMessage($e), 'details' => self::getDetails($e) ] ); } /** * A failure occurred. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_AssertionFailedError $e * @param float $time */ public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) { $parameters = [ 'name' => $test->getName(), 'message' => self::getMessage($e), 'details' => self::getDetails($e), ]; if ($e instanceof PHPUnit_Framework_ExpectationFailedException) { $comparisonFailure = $e->getComparisonFailure(); if ($comparisonFailure instanceof ComparisonFailure) { $expectedString = $comparisonFailure->getExpectedAsString(); if (is_null($expectedString) || empty($expectedString)) { $expectedString = self::getPrimitiveValueAsString($comparisonFailure->getExpected()); } $actualString = $comparisonFailure->getActualAsString(); if (is_null($actualString) || empty($actualString)) { $actualString = self::getPrimitiveValueAsString($comparisonFailure->getActual()); } if (!is_null($actualString) && !is_null($expectedString)) { $parameters['actual'] = $actualString; $parameters['expected'] = $expectedString; } } } $this->printEvent('testFailed', $parameters); } /** * Incomplete test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->printIgnoredTest($test->getName(), $e); } /** * Risky test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->addError($test, $e, $time); } /** * Skipped test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) { $testName = $test->getName(); if ($this->startedTestName != $testName) { $this->startTest($test); $this->printIgnoredTest($testName, $e); $this->endTest($test, $time); } else { $this->printIgnoredTest($testName, $e); } } public function printIgnoredTest($testName, Exception $e) { $this->printEvent( 'testIgnored', [ 'name' => $testName, 'message' => self::getMessage($e), 'details' => self::getDetails($e), ] ); } /** * A testsuite started. * * @param PHPUnit_Framework_TestSuite $suite */ public function startTestSuite(PHPUnit_Framework_TestSuite $suite) { if (stripos(ini_get('disable_functions'), 'getmypid') === false) { $this->flowId = getmypid(); } else { $this->flowId = false; } if (!$this->isSummaryTestCountPrinted) { $this->isSummaryTestCountPrinted = true; $this->printEvent( 'testCount', ['count' => count($suite)] ); } $suiteName = $suite->getName(); if (empty($suiteName)) { return; } $parameters = ['name' => $suiteName]; if (class_exists($suiteName, false)) { $fileName = self::getFileName($suiteName); $parameters['locationHint'] = "php_qn://$fileName::\\$suiteName"; } else { $split = preg_split('/::/', $suiteName); if (count($split) == 2 && method_exists($split[0], $split[1])) { $fileName = self::getFileName($split[0]); $parameters['locationHint'] = "php_qn://$fileName::\\$suiteName"; $parameters['name'] = $split[1]; } } $this->printEvent('testSuiteStarted', $parameters); } /** * A testsuite ended. * * @param PHPUnit_Framework_TestSuite $suite */ public function endTestSuite(PHPUnit_Framework_TestSuite $suite) { $suiteName = $suite->getName(); if (empty($suiteName)) { return; } $parameters = ['name' => $suiteName]; if (!class_exists($suiteName, false)) { $split = preg_split('/::/', $suiteName); if (count($split) == 2 && method_exists($split[0], $split[1])) { $parameters['name'] = $split[1]; } } $this->printEvent('testSuiteFinished', $parameters); } /** * A test started. * * @param PHPUnit_Framework_Test $test */ public function startTest(PHPUnit_Framework_Test $test) { $testName = $test->getName(); $this->startedTestName = $testName; $params = ['name' => $testName]; if ($test instanceof PHPUnit_Framework_TestCase) { $className = get_class($test); $fileName = self::getFileName($className); $params['locationHint'] = "php_qn://$fileName::\\$className::$testName"; } $this->printEvent('testStarted', $params); } /** * A test ended. * * @param PHPUnit_Framework_Test $test * @param float $time */ public function endTest(PHPUnit_Framework_Test $test, $time) { parent::endTest($test, $time); $this->printEvent( 'testFinished', [ 'name' => $test->getName(), 'duration' => (int) (round($time, 2) * 1000) ] ); } /** * @param string $eventName * @param array $params */ private function printEvent($eventName, $params = []) { $this->write("\n##teamcity[$eventName"); if ($this->flowId) { $params['flowId'] = $this->flowId; } foreach ($params as $key => $value) { $escapedValue = self::escapeValue($value); $this->write(" $key='$escapedValue'"); } $this->write("]\n"); } /** * @param Exception $e * * @return string */ private static function getMessage(Exception $e) { $message = ''; if (!$e instanceof PHPUnit_Framework_Exception) { if (strlen(get_class($e)) != 0) { $message = $message . get_class($e); } if (strlen($message) != 0 && strlen($e->getMessage()) != 0) { $message = $message . ' : '; } } return $message . $e->getMessage(); } /** * @param Exception $e * * @return string */ private static function getDetails(Exception $e) { $stackTrace = PHPUnit_Util_Filter::getFilteredStacktrace($e); $previous = $e->getPrevious(); while ($previous) { $stackTrace .= "\nCaused by\n" . PHPUnit_Framework_TestFailure::exceptionToString($previous) . "\n" . PHPUnit_Util_Filter::getFilteredStacktrace($previous); $previous = $previous->getPrevious(); } return ' ' . str_replace("\n", "\n ", $stackTrace); } /** * @param mixed $value * * @return string */ private static function getPrimitiveValueAsString($value) { if (is_null($value)) { return 'null'; } elseif (is_bool($value)) { return $value == true ? 'true' : 'false'; } elseif (is_scalar($value)) { return print_r($value, true); } return; } /** * @param $text * * @return string */ private static function escapeValue($text) { $text = str_replace('|', '||', $text); $text = str_replace("'", "|'", $text); $text = str_replace("\n", '|n', $text); $text = str_replace("\r", '|r', $text); $text = str_replace(']', '|]', $text); $text = str_replace('[', '|[', $text); return $text; } /** * @param string $className * * @return string */ private static function getFileName($className) { $reflectionClass = new ReflectionClass($className); $fileName = $reflectionClass->getFileName(); return $fileName; } } phpunit-5.1.3/src/Util/PHP.php000066400000000000000000000204231263222771600160640ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use SebastianBergmann\Environment\Runtime; /** * Utility methods for PHP sub-processes. * * @since Class available since Release 3.4.0 */ abstract class PHPUnit_Util_PHP { /** * @var Runtime */ protected $runtime; /** * @var bool */ protected $stderrRedirection = false; /** * Creates internal Runtime instance. */ public function __construct() { $this->runtime = new Runtime(); } /** * Defines if should use STDERR redirection or not. * * Then $stderrRedirection is TRUE, STDERR is redirected to STDOUT. * * @throws PHPUnit_Framework_Exception * * @param bool $stderrRedirection */ public function setUseStderrRedirection($stderrRedirection) { if (!is_bool($stderrRedirection)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } $this->stderrRedirection = $stderrRedirection; } /** * Returns TRUE if uses STDERR redirection or FALSE if not. * * @return bool */ public function useStderrRedirection() { return $this->stderrRedirection; } /** * @return PHPUnit_Util_PHP * * @since Method available since Release 3.5.12 */ public static function factory() { if (DIRECTORY_SEPARATOR == '\\') { return new PHPUnit_Util_PHP_Windows; } return new PHPUnit_Util_PHP_Default; } /** * Runs a single test in a separate PHP process. * * @param string $job * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_TestResult $result * * @throws PHPUnit_Framework_Exception */ public function runTestJob($job, PHPUnit_Framework_Test $test, PHPUnit_Framework_TestResult $result) { $result->startTest($test); $_result = $this->runJob($job); $this->processChildResult( $test, $result, $_result['stdout'], $_result['stderr'] ); } /** * Returns the command based into the configurations. * * @param array $settings * * @return string */ public function getCommand(array $settings) { $command = $this->runtime->getBinary(); $command .= $this->settingsToParameters($settings); if ('phpdbg' === PHP_SAPI) { $command .= ' -qrr ' . escapeshellarg(__DIR__ . '/PHP/eval-stdin.php'); } if (true === $this->stderrRedirection) { $command .= ' 2>&1'; } return $command; } /** * Runs a single job (PHP code) using a separate PHP process. * * @param string $job * @param array $settings * * @return array * * @throws PHPUnit_Framework_Exception */ abstract public function runJob($job, array $settings = []); /** * @param array $settings * * @return string * * @since Method available since Release 4.0.0 */ protected function settingsToParameters(array $settings) { $buffer = ''; foreach ($settings as $setting) { $buffer .= ' -d ' . $setting; } return $buffer; } /** * Processes the TestResult object from an isolated process. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_TestResult $result * @param string $stdout * @param string $stderr * * @since Method available since Release 3.5.0 */ private function processChildResult(PHPUnit_Framework_Test $test, PHPUnit_Framework_TestResult $result, $stdout, $stderr) { $time = 0; if (!empty($stderr)) { $result->addError( $test, new PHPUnit_Framework_Exception(trim($stderr)), $time ); } else { set_error_handler(function ($errno, $errstr, $errfile, $errline) { throw new ErrorException($errstr, $errno, $errno, $errfile, $errline); }); try { if (strpos($stdout, "#!/usr/bin/env php\n") === 0) { $stdout = substr($stdout, 19); } $childResult = unserialize(str_replace("#!/usr/bin/env php\n", '', $stdout)); restore_error_handler(); } catch (ErrorException $e) { restore_error_handler(); $childResult = false; $result->addError( $test, new PHPUnit_Framework_Exception(trim($stdout), 0, $e), $time ); } if ($childResult !== false) { if (!empty($childResult['output'])) { $output = $childResult['output']; } $test->setResult($childResult['testResult']); $test->addToAssertionCount($childResult['numAssertions']); $childResult = $childResult['result']; if ($result->getCollectCodeCoverageInformation()) { $result->getCodeCoverage()->merge( $childResult->getCodeCoverage() ); } $time = $childResult->time(); $notImplemented = $childResult->notImplemented(); $risky = $childResult->risky(); $skipped = $childResult->skipped(); $errors = $childResult->errors(); $failures = $childResult->failures(); if (!empty($notImplemented)) { $result->addError( $test, $this->getException($notImplemented[0]), $time ); } elseif (!empty($risky)) { $result->addError( $test, $this->getException($risky[0]), $time ); } elseif (!empty($skipped)) { $result->addError( $test, $this->getException($skipped[0]), $time ); } elseif (!empty($errors)) { $result->addError( $test, $this->getException($errors[0]), $time ); } elseif (!empty($failures)) { $result->addFailure( $test, $this->getException($failures[0]), $time ); } } } $result->endTest($test, $time); if (!empty($output)) { print $output; } } /** * Gets the thrown exception from a PHPUnit_Framework_TestFailure. * * @param PHPUnit_Framework_TestFailure $error * * @return Exception * * @since Method available since Release 3.6.0 * @see https://github.com/sebastianbergmann/phpunit/issues/74 */ private function getException(PHPUnit_Framework_TestFailure $error) { $exception = $error->thrownException(); if ($exception instanceof __PHP_Incomplete_Class) { $exceptionArray = []; foreach ((array) $exception as $key => $value) { $key = substr($key, strrpos($key, "\0") + 1); $exceptionArray[$key] = $value; } $exception = new PHPUnit_Framework_SyntheticError( sprintf( '%s: %s', $exceptionArray['_PHP_Incomplete_Class_Name'], $exceptionArray['message'] ), $exceptionArray['code'], $exceptionArray['file'], $exceptionArray['line'], $exceptionArray['trace'] ); } return $exception; } } phpunit-5.1.3/src/Util/PHP/000077500000000000000000000000001263222771600153525ustar00rootroot00000000000000phpunit-5.1.3/src/Util/PHP/Default.php000066400000000000000000000034161263222771600174530ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Default utility for PHP sub-processes. * * @since Class available since Release 3.5.12 */ class PHPUnit_Util_PHP_Default extends PHPUnit_Util_PHP { /** * Runs a single job (PHP code) using a separate PHP process. * * @param string $job * @param array $settings * * @return array * * @throws PHPUnit_Framework_Exception */ public function runJob($job, array $settings = []) { $process = proc_open( $this->getCommand($settings), [ 0 => ['pipe', 'r'], 1 => ['pipe', 'w'], 2 => ['pipe', 'w'] ], $pipes ); if (!is_resource($process)) { throw new PHPUnit_Framework_Exception( 'Unable to spawn worker process' ); } $this->process($pipes[0], $job); fclose($pipes[0]); $stdout = stream_get_contents($pipes[1]); fclose($pipes[1]); $stderr = stream_get_contents($pipes[2]); fclose($pipes[2]); proc_close($process); $this->cleanup(); return ['stdout' => $stdout, 'stderr' => $stderr]; } /** * @param resource $pipe * @param string $job * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.5.12 */ protected function process($pipe, $job) { fwrite($pipe, $job); } /** * @since Method available since Release 3.5.12 */ protected function cleanup() { } } phpunit-5.1.3/src/Util/PHP/Template/000077500000000000000000000000001263222771600171255ustar00rootroot00000000000000phpunit-5.1.3/src/Util/PHP/Template/TestCaseMethod.tpl.dist000066400000000000000000000047441263222771600234750ustar00rootroot00000000000000setCodeCoverage( new PHP_CodeCoverage( null, unserialize('{codeCoverageFilter}') ) ); } $result->beStrictAboutTestsThatDoNotTestAnything({isStrictAboutTestsThatDoNotTestAnything}); $result->beStrictAboutOutputDuringTests({isStrictAboutOutputDuringTests}); $result->enforceTimeLimit({enforcesTimeLimit}); $result->beStrictAboutTodoAnnotatedTests({isStrictAboutTodoAnnotatedTests}); $result->beStrictAboutResourceUsageDuringSmallTests({isStrictAboutResourceUsageDuringSmallTests}); $test = new {className}('{methodName}', unserialize('{data}'), '{dataName}'); $test->setDependencyInput(unserialize('{dependencyInput}')); $test->setInIsolation(TRUE); ob_end_clean(); $test->run($result); $output = ''; if (!$test->hasExpectationOnOutput()) { $output = $test->getActualOutput(); } rewind(STDOUT); if ($stdout = stream_get_contents(STDOUT)) { $output = $stdout . $output; } print serialize( array( 'testResult' => $test->getResult(), 'numAssertions' => $test->getNumAssertions(), 'result' => $result, 'output' => $output ) ); } $configurationFilePath = '{configurationFilePath}'; if ('' !== $configurationFilePath) { $configuration = PHPUnit_Util_Configuration::getInstance($configurationFilePath); $configuration->handlePHPConfiguration(); } {constants} {included_files} {globals} if (isset($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { require_once $GLOBALS['__PHPUNIT_BOOTSTRAP']; unset($GLOBALS['__PHPUNIT_BOOTSTRAP']); } __phpunit_run_isolated_test(); phpunit-5.1.3/src/Util/PHP/Windows.php000066400000000000000000000047421263222771600175240ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Windows utility for PHP sub-processes. * * @since Class available since Release 3.5.12 */ class PHPUnit_Util_PHP_Windows extends PHPUnit_Util_PHP_Default { /** * @var string */ private $tempFile; /** * {@inheritdoc} * * Reading from STDOUT or STDERR hangs forever on Windows if the output is * too large. * * @see https://bugs.php.net/bug.php?id=51800 */ public function runJob($job, array $settings = []) { if (false === $stdout_handle = tmpfile()) { throw new PHPUnit_Framework_Exception( 'A temporary file could not be created; verify that your TEMP environment variable is writable' ); } $process = proc_open( $this->getCommand($settings), [ 0 => ['pipe', 'r'], 1 => $stdout_handle, 2 => ['pipe', 'w'] ], $pipes ); if (!is_resource($process)) { throw new PHPUnit_Framework_Exception( 'Unable to spawn worker process' ); } $this->process($pipes[0], $job); fclose($pipes[0]); $stderr = stream_get_contents($pipes[2]); fclose($pipes[2]); proc_close($process); rewind($stdout_handle); $stdout = stream_get_contents($stdout_handle); fclose($stdout_handle); $this->cleanup(); return ['stdout' => $stdout, 'stderr' => $stderr]; } /** * @param resource $pipe * @param string $job * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.5.12 */ protected function process($pipe, $job) { if (!($this->tempFile = tempnam(sys_get_temp_dir(), 'PHPUnit')) || file_put_contents($this->tempFile, $job) === false) { throw new PHPUnit_Framework_Exception( 'Unable to write temporary file' ); } fwrite( $pipe, 'tempFile, true) . '; ?>' ); } /** * @since Method available since Release 3.5.12 */ protected function cleanup() { unlink($this->tempFile); } } phpunit-5.1.3/src/Util/PHP/eval-stdin.php000066400000000000000000000000661263222771600201330ustar00rootroot00000000000000' . file_get_contents('php://input')); phpunit-5.1.3/src/Util/Printer.php000066400000000000000000000101271263222771600170600ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Utility class that can print to STDOUT or write to a file. * * @since Class available since Release 2.0.0 */ class PHPUnit_Util_Printer { /** * If true, flush output after every write. * * @var bool */ protected $autoFlush = false; /** * @var resource */ protected $out; /** * @var string */ protected $outTarget; /** * @var bool */ protected $printsHTML = false; /** * Constructor. * * @param mixed $out * * @throws PHPUnit_Framework_Exception */ public function __construct($out = null) { if ($out !== null) { if (is_string($out)) { if (strpos($out, 'socket://') === 0) { $out = explode(':', str_replace('socket://', '', $out)); if (sizeof($out) != 2) { throw new PHPUnit_Framework_Exception; } $this->out = fsockopen($out[0], $out[1]); } else { if (strpos($out, 'php://') === false && !is_dir(dirname($out))) { mkdir(dirname($out), 0777, true); } $this->out = fopen($out, 'wt'); } $this->outTarget = $out; } else { $this->out = $out; } } } /** * Flush buffer, optionally tidy up HTML, and close output if it's not to a php stream */ public function flush() { if ($this->out && strncmp($this->outTarget, 'php://', 6) !== 0) { fclose($this->out); } if ($this->printsHTML === true && $this->outTarget !== null && strpos($this->outTarget, 'php://') !== 0 && strpos($this->outTarget, 'socket://') !== 0 && extension_loaded('tidy')) { file_put_contents( $this->outTarget, tidy_repair_file( $this->outTarget, ['indent' => true, 'wrap' => 0], 'utf8' ) ); } } /** * Performs a safe, incremental flush. * * Do not confuse this function with the flush() function of this class, * since the flush() function may close the file being written to, rendering * the current object no longer usable. * * @since Method available since Release 3.3.0 */ public function incrementalFlush() { if ($this->out) { fflush($this->out); } else { flush(); } } /** * @param string $buffer */ public function write($buffer) { if ($this->out) { fwrite($this->out, $buffer); if ($this->autoFlush) { $this->incrementalFlush(); } } else { if (PHP_SAPI != 'cli') { $buffer = htmlspecialchars($buffer); } print $buffer; if ($this->autoFlush) { $this->incrementalFlush(); } } } /** * Check auto-flush mode. * * @return bool * * @since Method available since Release 3.3.0 */ public function getAutoFlush() { return $this->autoFlush; } /** * Set auto-flushing mode. * * If set, *incremental* flushes will be done after each write. This should * not be confused with the different effects of this class' flush() method. * * @param bool $autoFlush * * @since Method available since Release 3.3.0 */ public function setAutoFlush($autoFlush) { if (is_bool($autoFlush)) { $this->autoFlush = $autoFlush; } else { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); } } } phpunit-5.1.3/src/Util/Regex.php000066400000000000000000000013451263222771600165110ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Error handler that converts PHP errors and warnings to exceptions. * * @since Class available since Release 4.2.0 */ class PHPUnit_Util_Regex { public static function pregMatchSafe($pattern, $subject, $matches = null, $flags = 0, $offset = 0) { $handler_terminator = PHPUnit_Util_ErrorHandler::handleErrorOnce(E_WARNING); $match = preg_match($pattern, $subject, $matches, $flags, $offset); $handler_terminator(); // cleaning return $match; } } phpunit-5.1.3/src/Util/String.php000066400000000000000000000031771263222771600167120ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * String helpers. * * @since Class available since Release 3.6.0 */ class PHPUnit_Util_String { /** * Converts a string to UTF-8 encoding. * * @param string $string * * @return string */ public static function convertToUtf8($string) { if (!self::isUtf8($string)) { if (function_exists('mb_convert_encoding')) { $string = mb_convert_encoding($string, 'UTF-8'); } else { $string = utf8_encode($string); } } return $string; } /** * Checks a string for UTF-8 encoding. * * @param string $string * * @return bool */ protected static function isUtf8($string) { $length = strlen($string); for ($i = 0; $i < $length; $i++) { if (ord($string[$i]) < 0x80) { $n = 0; } elseif ((ord($string[$i]) & 0xE0) == 0xC0) { $n = 1; } elseif ((ord($string[$i]) & 0xF0) == 0xE0) { $n = 2; } elseif ((ord($string[$i]) & 0xF0) == 0xF0) { $n = 3; } else { return false; } for ($j = 0; $j < $n; $j++) { if ((++$i == $length) || ((ord($string[$i]) & 0xC0) != 0x80)) { return false; } } } return true; } } phpunit-5.1.3/src/Util/Test.php000066400000000000000000001021141263222771600163520ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Test helpers. * * @since Class available since Release 3.0.0 */ class PHPUnit_Util_Test { const REGEX_DATA_PROVIDER = '/@dataProvider\s+([a-zA-Z0-9._:-\\\\x7f-\xff]+)/'; const REGEX_TEST_WITH = '/@testWith\s+/'; const REGEX_EXPECTED_EXCEPTION = '(@expectedException\s+([:.\w\\\\x7f-\xff]+)(?:[\t ]+(\S*))?(?:[\t ]+(\S*))?\s*$)m'; const REGEX_REQUIRES_VERSION = '/@requires\s+(?PPHP(?:Unit)?)\s+(?P[\d\.-]+(dev|(RC|alpha|beta)[\d\.])?)[ \t]*\r?$/m'; const REGEX_REQUIRES_OS = '/@requires\s+OS\s+(?P.+?)[ \t]*\r?$/m'; const REGEX_REQUIRES = '/@requires\s+(?Pfunction|extension)\s+(?P([^ ]+?))[ \t]*\r?$/m'; const UNKNOWN = -1; const SMALL = 0; const MEDIUM = 1; const LARGE = 2; private static $annotationCache = []; private static $hookMethods = []; /** * @param PHPUnit_Framework_Test $test * @param bool $asString * * @return mixed */ public static function describe(PHPUnit_Framework_Test $test, $asString = true) { if ($asString) { if ($test instanceof PHPUnit_Framework_SelfDescribing) { return $test->toString(); } else { return get_class($test); } } else { if ($test instanceof PHPUnit_Framework_TestCase) { return [ get_class($test), $test->getName() ]; } elseif ($test instanceof PHPUnit_Framework_SelfDescribing) { return ['', $test->toString()]; } else { return ['', get_class($test)]; } } } /** * @param string $className * @param string $methodName * * @return array|bool * * @throws PHPUnit_Framework_CodeCoverageException * * @since Method available since Release 4.0.0 */ public static function getLinesToBeCovered($className, $methodName) { $annotations = self::parseTestMethodAnnotations( $className, $methodName ); if (isset($annotations['class']['coversNothing']) || isset($annotations['method']['coversNothing'])) { return false; } return self::getLinesToBeCoveredOrUsed($className, $methodName, 'covers'); } /** * Returns lines of code specified with the @uses annotation. * * @param string $className * @param string $methodName * * @return array * * @since Method available since Release 4.0.0 */ public static function getLinesToBeUsed($className, $methodName) { return self::getLinesToBeCoveredOrUsed($className, $methodName, 'uses'); } /** * @param string $className * @param string $methodName * @param string $mode * * @return array * * @throws PHPUnit_Framework_CodeCoverageException * * @since Method available since Release 4.2.0 */ private static function getLinesToBeCoveredOrUsed($className, $methodName, $mode) { $annotations = self::parseTestMethodAnnotations( $className, $methodName ); $classShortcut = null; if (!empty($annotations['class'][$mode . 'DefaultClass'])) { if (count($annotations['class'][$mode . 'DefaultClass']) > 1) { throw new PHPUnit_Framework_CodeCoverageException( sprintf( 'More than one @%sClass annotation in class or interface "%s".', $mode, $className ) ); } $classShortcut = $annotations['class'][$mode . 'DefaultClass'][0]; } $list = []; if (isset($annotations['class'][$mode])) { $list = $annotations['class'][$mode]; } if (isset($annotations['method'][$mode])) { $list = array_merge($list, $annotations['method'][$mode]); } $codeList = []; foreach (array_unique($list) as $element) { if ($classShortcut && strncmp($element, '::', 2) === 0) { $element = $classShortcut . $element; } $element = preg_replace('/[\s()]+$/', '', $element); $element = explode(' ', $element); $element = $element[0]; $codeList = array_merge( $codeList, self::resolveElementToReflectionObjects($element) ); } return self::resolveReflectionObjectsToLines($codeList); } /** * Returns the requirements for a test. * * @param string $className * @param string $methodName * * @return array * * @since Method available since Release 3.6.0 */ public static function getRequirements($className, $methodName) { $reflector = new ReflectionClass($className); $docComment = $reflector->getDocComment(); $reflector = new ReflectionMethod($className, $methodName); $docComment .= "\n" . $reflector->getDocComment(); $requires = []; if ($count = preg_match_all(self::REGEX_REQUIRES_OS, $docComment, $matches)) { $requires['OS'] = sprintf( '/%s/i', addcslashes($matches['value'][$count - 1], '/') ); } if ($count = preg_match_all(self::REGEX_REQUIRES_VERSION, $docComment, $matches)) { for ($i = 0; $i < $count; $i++) { $requires[$matches['name'][$i]] = $matches['value'][$i]; } } // https://bugs.php.net/bug.php?id=63055 $matches = []; if ($count = preg_match_all(self::REGEX_REQUIRES, $docComment, $matches)) { for ($i = 0; $i < $count; $i++) { $name = $matches['name'][$i] . 's'; if (!isset($requires[$name])) { $requires[$name] = []; } $requires[$name][] = $matches['value'][$i]; } } return $requires; } /** * Returns the missing requirements for a test. * * @param string $className * @param string $methodName * * @return array * * @since Method available since Release 4.3.0 */ public static function getMissingRequirements($className, $methodName) { $required = static::getRequirements($className, $methodName); $missing = []; if (!empty($required['PHP']) && version_compare(PHP_VERSION, $required['PHP'], '<')) { $missing[] = sprintf('PHP %s (or later) is required.', $required['PHP']); } if (!empty($required['PHPUnit'])) { $phpunitVersion = PHPUnit_Runner_Version::id(); if (version_compare($phpunitVersion, $required['PHPUnit'], '<')) { $missing[] = sprintf('PHPUnit %s (or later) is required.', $required['PHPUnit']); } } if (!empty($required['OS']) && !preg_match($required['OS'], PHP_OS)) { $missing[] = sprintf('Operating system matching %s is required.', $required['OS']); } if (!empty($required['functions'])) { foreach ($required['functions'] as $function) { $pieces = explode('::', $function); if (2 === count($pieces) && method_exists($pieces[0], $pieces[1])) { continue; } if (function_exists($function)) { continue; } $missing[] = sprintf('Function %s is required.', $function); } } if (!empty($required['extensions'])) { foreach ($required['extensions'] as $extension) { if (!extension_loaded($extension)) { $missing[] = sprintf('Extension %s is required.', $extension); } } } return $missing; } /** * Returns the expected exception for a test. * * @param string $className * @param string $methodName * * @return array * * @since Method available since Release 3.3.6 */ public static function getExpectedException($className, $methodName) { $reflector = new ReflectionMethod($className, $methodName); $docComment = $reflector->getDocComment(); $docComment = substr($docComment, 3, -2); if (preg_match(self::REGEX_EXPECTED_EXCEPTION, $docComment, $matches)) { $annotations = self::parseTestMethodAnnotations( $className, $methodName ); $class = $matches[1]; $code = null; $message = ''; $messageRegExp = ''; if (isset($matches[2])) { $message = trim($matches[2]); } elseif (isset($annotations['method']['expectedExceptionMessage'])) { $message = self::parseAnnotationContent( $annotations['method']['expectedExceptionMessage'][0] ); } if (isset($annotations['method']['expectedExceptionMessageRegExp'])) { $messageRegExp = self::parseAnnotationContent( $annotations['method']['expectedExceptionMessageRegExp'][0] ); } if (isset($matches[3])) { $code = $matches[3]; } elseif (isset($annotations['method']['expectedExceptionCode'])) { $code = self::parseAnnotationContent( $annotations['method']['expectedExceptionCode'][0] ); } if (is_numeric($code)) { $code = (int) $code; } elseif (is_string($code) && defined($code)) { $code = (int) constant($code); } return [ 'class' => $class, 'code' => $code, 'message' => $message, 'message_regex' => $messageRegExp ]; } return false; } /** * Parse annotation content to use constant/class constant values * * Constants are specified using a starting '@'. For example: @ClassName::CONST_NAME * * If the constant is not found the string is used as is to ensure maximum BC. * * @param string $message * * @return string */ private static function parseAnnotationContent($message) { if (strpos($message, '::') !== false && count(explode('::', $message) == 2)) { if (defined($message)) { $message = constant($message); } } return $message; } /** * Returns the provided data for a method. * * @param string $className * @param string $methodName * * @return array|Iterator when a data provider is specified and exists * null when no data provider is specified * * @throws PHPUnit_Framework_Exception * * @since Method available since Release 3.2.0 */ public static function getProvidedData($className, $methodName) { $reflector = new ReflectionMethod($className, $methodName); $docComment = $reflector->getDocComment(); $data = null; if ($dataProviderData = self::getDataFromDataProviderAnnotation($docComment, $className, $methodName)) { $data = $dataProviderData; } if ($testWithData = self::getDataFromTestWithAnnotation($docComment)) { $data = $testWithData; } if ($data !== null) { if (is_object($data)) { $data = iterator_to_array($data); } foreach ($data as $key => $value) { if (!is_array($value)) { throw new PHPUnit_Framework_Exception( sprintf( 'Data set %s is invalid.', is_int($key) ? '#' . $key : '"' . $key . '"' ) ); } } } return $data; } /** * Returns the provided data for a method. * * @param string $docComment * @param string $className * @param string $methodName * * @return array|Iterator when a data provider is specified and exists * null when no data provider is specified * * @throws PHPUnit_Framework_Exception */ private static function getDataFromDataProviderAnnotation($docComment, $className, $methodName) { if (preg_match(self::REGEX_DATA_PROVIDER, $docComment, $matches)) { $dataProviderMethodNameNamespace = explode('\\', $matches[1]); $leaf = explode('::', array_pop($dataProviderMethodNameNamespace)); $dataProviderMethodName = array_pop($leaf); if (!empty($dataProviderMethodNameNamespace)) { $dataProviderMethodNameNamespace = implode('\\', $dataProviderMethodNameNamespace) . '\\'; } else { $dataProviderMethodNameNamespace = ''; } if (!empty($leaf)) { $dataProviderClassName = $dataProviderMethodNameNamespace . array_pop($leaf); } else { $dataProviderClassName = $className; } $dataProviderClass = new ReflectionClass($dataProviderClassName); $dataProviderMethod = $dataProviderClass->getMethod( $dataProviderMethodName ); if ($dataProviderMethod->isStatic()) { $object = null; } else { $object = $dataProviderClass->newInstance(); } if ($dataProviderMethod->getNumberOfParameters() == 0) { $data = $dataProviderMethod->invoke($object); } else { $data = $dataProviderMethod->invoke($object, $methodName); } return $data; } } /** * @param string $docComment full docComment string * * @return array when @testWith annotation is defined * null when @testWith annotation is omitted * * @throws PHPUnit_Framework_Exception when @testWith annotation is defined but cannot be parsed */ public static function getDataFromTestWithAnnotation($docComment) { $docComment = self::cleanUpMultiLineAnnotation($docComment); if (preg_match(self::REGEX_TEST_WITH, $docComment, $matches, PREG_OFFSET_CAPTURE)) { $offset = strlen($matches[0][0]) + $matches[0][1]; $annotationContent = substr($docComment, $offset); $data = []; foreach (explode("\n", $annotationContent) as $candidateRow) { $candidateRow = trim($candidateRow); $dataSet = json_decode($candidateRow, true); if (json_last_error() != JSON_ERROR_NONE) { break; } $data[] = $dataSet; } if (!$data) { throw new PHPUnit_Framework_Exception('The dataset for the @testWith annotation cannot be parsed.'); } return $data; } } private static function cleanUpMultiLineAnnotation($docComment) { //removing initial ' * ' for docComment $docComment = preg_replace('/' . '\n' . '\s*' . '\*' . '\s?' . '/', "\n", $docComment); $docComment = substr($docComment, 0, -1); $docComment = rtrim($docComment, "\n"); return $docComment; } /** * @param string $className * @param string $methodName * * @return array * * @throws ReflectionException * * @since Method available since Release 3.4.0 */ public static function parseTestMethodAnnotations($className, $methodName = '') { if (!isset(self::$annotationCache[$className])) { $class = new ReflectionClass($className); self::$annotationCache[$className] = self::parseAnnotations($class->getDocComment()); } if (!empty($methodName) && !isset(self::$annotationCache[$className . '::' . $methodName])) { try { $method = new ReflectionMethod($className, $methodName); $annotations = self::parseAnnotations($method->getDocComment()); } catch (ReflectionException $e) { $annotations = []; } self::$annotationCache[$className . '::' . $methodName] = $annotations; } return [ 'class' => self::$annotationCache[$className], 'method' => !empty($methodName) ? self::$annotationCache[$className . '::' . $methodName] : [] ]; } /** * @param string $docblock * * @return array * * @since Method available since Release 3.4.0 */ private static function parseAnnotations($docblock) { $annotations = []; // Strip away the docblock header and footer to ease parsing of one line annotations $docblock = substr($docblock, 3, -2); if (preg_match_all('/@(?P[A-Za-z_-]+)(?:[ \t]+(?P.*?))?[ \t]*\r?$/m', $docblock, $matches)) { $numMatches = count($matches[0]); for ($i = 0; $i < $numMatches; ++$i) { $annotations[$matches['name'][$i]][] = $matches['value'][$i]; } } return $annotations; } /** * Returns the backup settings for a test. * * @param string $className * @param string $methodName * * @return array * * @since Method available since Release 3.4.0 */ public static function getBackupSettings($className, $methodName) { return [ 'backupGlobals' => self::getBooleanAnnotationSetting( $className, $methodName, 'backupGlobals' ), 'backupStaticAttributes' => self::getBooleanAnnotationSetting( $className, $methodName, 'backupStaticAttributes' ) ]; } /** * Returns the dependencies for a test class or method. * * @param string $className * @param string $methodName * * @return array * * @since Method available since Release 3.4.0 */ public static function getDependencies($className, $methodName) { $annotations = self::parseTestMethodAnnotations( $className, $methodName ); $dependencies = []; if (isset($annotations['class']['depends'])) { $dependencies = $annotations['class']['depends']; } if (isset($annotations['method']['depends'])) { $dependencies = array_merge( $dependencies, $annotations['method']['depends'] ); } return array_unique($dependencies); } /** * Returns the error handler settings for a test. * * @param string $className * @param string $methodName * * @return bool * * @since Method available since Release 3.4.0 */ public static function getErrorHandlerSettings($className, $methodName) { return self::getBooleanAnnotationSetting( $className, $methodName, 'errorHandler' ); } /** * Returns the groups for a test class or method. * * @param string $className * @param string $methodName * * @return array * * @since Method available since Release 3.2.0 */ public static function getGroups($className, $methodName = '') { $annotations = self::parseTestMethodAnnotations( $className, $methodName ); $groups = []; if (isset($annotations['method']['author'])) { $groups = $annotations['method']['author']; } elseif (isset($annotations['class']['author'])) { $groups = $annotations['class']['author']; } if (isset($annotations['class']['group'])) { $groups = array_merge($groups, $annotations['class']['group']); } if (isset($annotations['method']['group'])) { $groups = array_merge($groups, $annotations['method']['group']); } if (isset($annotations['class']['ticket'])) { $groups = array_merge($groups, $annotations['class']['ticket']); } if (isset($annotations['method']['ticket'])) { $groups = array_merge($groups, $annotations['method']['ticket']); } foreach (['method', 'class'] as $element) { foreach (['small', 'medium', 'large'] as $size) { if (isset($annotations[$element][$size])) { $groups[] = $size; break 2; } if (isset($annotations[$element][$size])) { $groups[] = $size; break 2; } } } return array_unique($groups); } /** * Returns the size of the test. * * @param string $className * @param string $methodName * * @return int * * @since Method available since Release 3.6.0 */ public static function getSize($className, $methodName) { $groups = array_flip(self::getGroups($className, $methodName)); $size = self::UNKNOWN; $class = new ReflectionClass($className); if (isset($groups['large']) || (class_exists('PHPUnit_Extensions_Database_TestCase', false) && $class->isSubclassOf('PHPUnit_Extensions_Database_TestCase'))) { $size = self::LARGE; } elseif (isset($groups['medium'])) { $size = self::MEDIUM; } elseif (isset($groups['small'])) { $size = self::SMALL; } return $size; } /** * Returns the tickets for a test class or method. * * @param string $className * @param string $methodName * * @return array * * @since Method available since Release 3.4.0 */ public static function getTickets($className, $methodName) { $annotations = self::parseTestMethodAnnotations( $className, $methodName ); $tickets = []; if (isset($annotations['class']['ticket'])) { $tickets = $annotations['class']['ticket']; } if (isset($annotations['method']['ticket'])) { $tickets = array_merge($tickets, $annotations['method']['ticket']); } return array_unique($tickets); } /** * Returns the process isolation settings for a test. * * @param string $className * @param string $methodName * * @return bool * * @since Method available since Release 3.4.1 */ public static function getProcessIsolationSettings($className, $methodName) { $annotations = self::parseTestMethodAnnotations( $className, $methodName ); if (isset($annotations['class']['runTestsInSeparateProcesses']) || isset($annotations['method']['runInSeparateProcess'])) { return true; } else { return false; } } /** * Returns the preserve global state settings for a test. * * @param string $className * @param string $methodName * * @return bool * * @since Method available since Release 3.4.0 */ public static function getPreserveGlobalStateSettings($className, $methodName) { return self::getBooleanAnnotationSetting( $className, $methodName, 'preserveGlobalState' ); } /** * @param string $className * * @return array * * @since Method available since Release 4.0.8 */ public static function getHookMethods($className) { if (!class_exists($className, false)) { return self::emptyHookMethodsArray(); } if (!isset(self::$hookMethods[$className])) { self::$hookMethods[$className] = self::emptyHookMethodsArray(); try { $class = new ReflectionClass($className); foreach ($class->getMethods() as $method) { if (self::isBeforeClassMethod($method)) { self::$hookMethods[$className]['beforeClass'][] = $method->getName(); } if (self::isBeforeMethod($method)) { self::$hookMethods[$className]['before'][] = $method->getName(); } if (self::isAfterMethod($method)) { self::$hookMethods[$className]['after'][] = $method->getName(); } if (self::isAfterClassMethod($method)) { self::$hookMethods[$className]['afterClass'][] = $method->getName(); } } } catch (ReflectionException $e) { } } return self::$hookMethods[$className]; } /** * @return array * * @since Method available since Release 4.0.9 */ private static function emptyHookMethodsArray() { return [ 'beforeClass' => ['setUpBeforeClass'], 'before' => ['setUp'], 'after' => ['tearDown'], 'afterClass' => ['tearDownAfterClass'] ]; } /** * @param string $className * @param string $methodName * @param string $settingName * * @return bool * * @since Method available since Release 3.4.0 */ private static function getBooleanAnnotationSetting($className, $methodName, $settingName) { $annotations = self::parseTestMethodAnnotations( $className, $methodName ); $result = null; if (isset($annotations['class'][$settingName])) { if ($annotations['class'][$settingName][0] == 'enabled') { $result = true; } elseif ($annotations['class'][$settingName][0] == 'disabled') { $result = false; } } if (isset($annotations['method'][$settingName])) { if ($annotations['method'][$settingName][0] == 'enabled') { $result = true; } elseif ($annotations['method'][$settingName][0] == 'disabled') { $result = false; } } return $result; } /** * @param string $element * * @return array * * @throws PHPUnit_Framework_InvalidCoversTargetException * * @since Method available since Release 4.0.0 */ private static function resolveElementToReflectionObjects($element) { $codeToCoverList = []; if (strpos($element, '\\') !== false && function_exists($element)) { $codeToCoverList[] = new ReflectionFunction($element); } elseif (strpos($element, '::') !== false) { list($className, $methodName) = explode('::', $element); if (isset($methodName[0]) && $methodName[0] == '<') { $classes = [$className]; foreach ($classes as $className) { if (!class_exists($className) && !interface_exists($className) && !trait_exists($className)) { throw new PHPUnit_Framework_InvalidCoversTargetException( sprintf( 'Trying to @cover or @use not existing class or ' . 'interface "%s".', $className ) ); } $class = new ReflectionClass($className); $methods = $class->getMethods(); $inverse = isset($methodName[1]) && $methodName[1] == '!'; if (strpos($methodName, 'protected')) { $visibility = 'isProtected'; } elseif (strpos($methodName, 'private')) { $visibility = 'isPrivate'; } elseif (strpos($methodName, 'public')) { $visibility = 'isPublic'; } foreach ($methods as $method) { if ($inverse && !$method->$visibility()) { $codeToCoverList[] = $method; } elseif (!$inverse && $method->$visibility()) { $codeToCoverList[] = $method; } } } } else { $classes = [$className]; foreach ($classes as $className) { if ($className == '' && function_exists($methodName)) { $codeToCoverList[] = new ReflectionFunction( $methodName ); } else { if (!((class_exists($className) || interface_exists($className) || trait_exists($className)) && method_exists($className, $methodName))) { throw new PHPUnit_Framework_InvalidCoversTargetException( sprintf( 'Trying to @cover or @use not existing method "%s::%s".', $className, $methodName ) ); } $codeToCoverList[] = new ReflectionMethod( $className, $methodName ); } } } } else { $extended = false; if (strpos($element, '') !== false) { $element = str_replace('', '', $element); $extended = true; } $classes = [$element]; if ($extended) { $classes = array_merge( $classes, class_implements($element), class_parents($element) ); } foreach ($classes as $className) { if (!class_exists($className) && !interface_exists($className) && !trait_exists($className)) { throw new PHPUnit_Framework_InvalidCoversTargetException( sprintf( 'Trying to @cover or @use not existing class or ' . 'interface "%s".', $className ) ); } $codeToCoverList[] = new ReflectionClass($className); } } return $codeToCoverList; } /** * @param array $reflectors * * @return array */ private static function resolveReflectionObjectsToLines(array $reflectors) { $result = []; foreach ($reflectors as $reflector) { $filename = $reflector->getFileName(); if (!isset($result[$filename])) { $result[$filename] = []; } $result[$filename] = array_unique( array_merge( $result[$filename], range($reflector->getStartLine(), $reflector->getEndLine()) ) ); } return $result; } /** * @param ReflectionMethod $method * * @return bool * * @since Method available since Release 4.0.8 */ private static function isBeforeClassMethod(ReflectionMethod $method) { return $method->isStatic() && strpos($method->getDocComment(), '@beforeClass') !== false; } /** * @param ReflectionMethod $method * * @return bool * * @since Method available since Release 4.0.8 */ private static function isBeforeMethod(ReflectionMethod $method) { return preg_match('/@before\b/', $method->getDocComment()); } /** * @param ReflectionMethod $method * * @return bool * * @since Method available since Release 4.0.8 */ private static function isAfterClassMethod(ReflectionMethod $method) { return $method->isStatic() && strpos($method->getDocComment(), '@afterClass') !== false; } /** * @param ReflectionMethod $method * * @return bool * * @since Method available since Release 4.0.8 */ private static function isAfterMethod(ReflectionMethod $method) { return preg_match('/@after\b/', $method->getDocComment()); } } phpunit-5.1.3/src/Util/TestDox/000077500000000000000000000000001263222771600163155ustar00rootroot00000000000000phpunit-5.1.3/src/Util/TestDox/NamePrettifier.php000066400000000000000000000061141263222771600217460ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Prettifies class and method names for use in TestDox documentation. * * @since Class available since Release 2.1.0 */ class PHPUnit_Util_TestDox_NamePrettifier { /** * @var string */ protected $prefix = 'Test'; /** * @var string */ protected $suffix = 'Test'; /** * @var array */ protected $strings = []; /** * Prettifies the name of a test class. * * @param string $name * * @return string */ public function prettifyTestClass($name) { $title = $name; if ($this->suffix !== null && $this->suffix == substr($name, -1 * strlen($this->suffix))) { $title = substr($title, 0, strripos($title, $this->suffix)); } if ($this->prefix !== null && $this->prefix == substr($name, 0, strlen($this->prefix))) { $title = substr($title, strlen($this->prefix)); } if (substr($title, 0, 1) == '\\') { $title = substr($title, 1); } return $title; } /** * Prettifies the name of a test method. * * @param string $name * * @return string */ public function prettifyTestMethod($name) { $buffer = ''; if (!is_string($name) || strlen($name) == 0) { return $buffer; } $string = preg_replace('#\d+$#', '', $name, -1, $count); if (in_array($string, $this->strings)) { $name = $string; } elseif ($count == 0) { $this->strings[] = $string; } if (strpos($name, '_') !== false) { return str_replace('_', ' ', $name); } $max = strlen($name); if (substr($name, 0, 4) == 'test') { $offset = 4; } else { $offset = 0; $name[0] = strtoupper($name[0]); } $wasNumeric = false; for ($i = $offset; $i < $max; $i++) { if ($i > $offset && ord($name[$i]) >= 65 && ord($name[$i]) <= 90) { $buffer .= ' ' . strtolower($name[$i]); } else { $isNumeric = is_numeric($name[$i]); if (!$wasNumeric && $isNumeric) { $buffer .= ' '; $wasNumeric = true; } if ($wasNumeric && !$isNumeric) { $wasNumeric = false; } $buffer .= $name[$i]; } } return $buffer; } /** * Sets the prefix of test names. * * @param string $prefix */ public function setPrefix($prefix) { $this->prefix = $prefix; } /** * Sets the suffix of test names. * * @param string $suffix */ public function setSuffix($suffix) { $this->suffix = $suffix; } } phpunit-5.1.3/src/Util/TestDox/ResultPrinter.php000066400000000000000000000211511263222771600216500ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Base class for printers of TestDox documentation. * * @since Class available since Release 2.1.0 */ abstract class PHPUnit_Util_TestDox_ResultPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener { /** * @var PHPUnit_Util_TestDox_NamePrettifier */ protected $prettifier; /** * @var string */ protected $testClass = ''; /** * @var int */ protected $testStatus = false; /** * @var array */ protected $tests = []; /** * @var int */ protected $successful = 0; /** * @var int */ protected $warned = 0; /** * @var int */ protected $failed = 0; /** * @var int */ protected $risky = 0; /** * @var int */ protected $skipped = 0; /** * @var int */ protected $incomplete = 0; /** * @var string */ protected $currentTestClassPrettified; /** * @var string */ protected $currentTestMethodPrettified; /** * Constructor. * * @param resource $out */ public function __construct($out = null) { parent::__construct($out); $this->prettifier = new PHPUnit_Util_TestDox_NamePrettifier; $this->startRun(); } /** * Flush buffer and close output. */ public function flush() { $this->doEndClass(); $this->endRun(); parent::flush(); } /** * An error occurred. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) { if (!$this->isOfInterest($test)) { return; } $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_ERROR; $this->failed++; } /** * A warning occurred. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_Warning $e * @param float $time * * @since Method available since Release 5.1.0 */ public function addWarning(PHPUnit_Framework_Test $test, PHPUnit_Framework_Warning $e, $time) { if (!$this->isOfInterest($test)) { return; } $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_WARNING; $this->warned++; } /** * A failure occurred. * * @param PHPUnit_Framework_Test $test * @param PHPUnit_Framework_AssertionFailedError $e * @param float $time */ public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) { if (!$this->isOfInterest($test)) { return; } $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE; $this->failed++; } /** * Incomplete test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time */ public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) { if (!$this->isOfInterest($test)) { return; } $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE; $this->incomplete++; } /** * Risky test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time * * @since Method available since Release 4.0.0 */ public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) { if (!$this->isOfInterest($test)) { return; } $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_RISKY; $this->risky++; } /** * Skipped test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time * * @since Method available since Release 3.0.0 */ public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) { if (!$this->isOfInterest($test)) { return; } $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED; $this->skipped++; } /** * A testsuite started. * * @param PHPUnit_Framework_TestSuite $suite * * @since Method available since Release 2.2.0 */ public function startTestSuite(PHPUnit_Framework_TestSuite $suite) { } /** * A testsuite ended. * * @param PHPUnit_Framework_TestSuite $suite * * @since Method available since Release 2.2.0 */ public function endTestSuite(PHPUnit_Framework_TestSuite $suite) { } /** * A test started. * * @param PHPUnit_Framework_Test $test */ public function startTest(PHPUnit_Framework_Test $test) { if (!$this->isOfInterest($test)) { return; } $class = get_class($test); if ($this->testClass != $class) { if ($this->testClass != '') { $this->doEndClass(); } $classAnnotations = PHPUnit_Util_Test::parseTestMethodAnnotations($class); if (isset($classAnnotations['class']['testdox'][0])) { $this->currentTestClassPrettified = $classAnnotations['class']['testdox'][0]; } else { $this->currentTestClassPrettified = $this->prettifier->prettifyTestClass($class); } $this->startClass($class); $this->testClass = $class; $this->tests = []; } $annotations = $test->getAnnotations(); if (isset($annotations['method']['testdox'][0])) { $this->currentTestMethodPrettified = $annotations['method']['testdox'][0]; } else { $this->currentTestMethodPrettified = $this->prettifier->prettifyTestMethod($test->getName(false)); } $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_PASSED; } /** * A test ended. * * @param PHPUnit_Framework_Test $test * @param float $time */ public function endTest(PHPUnit_Framework_Test $test, $time) { if (!$this->isOfInterest($test)) { return; } if (!isset($this->tests[$this->currentTestMethodPrettified])) { if ($this->testStatus == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) { $this->tests[$this->currentTestMethodPrettified]['success'] = 1; $this->tests[$this->currentTestMethodPrettified]['failure'] = 0; } else { $this->tests[$this->currentTestMethodPrettified]['success'] = 0; $this->tests[$this->currentTestMethodPrettified]['failure'] = 1; } } else { if ($this->testStatus == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) { $this->tests[$this->currentTestMethodPrettified]['success']++; } else { $this->tests[$this->currentTestMethodPrettified]['failure']++; } } $this->currentTestClassPrettified = null; $this->currentTestMethodPrettified = null; } /** * @since Method available since Release 2.3.0 */ protected function doEndClass() { foreach ($this->tests as $name => $data) { $this->onTest($name, $data['failure'] == 0); } $this->endClass($this->testClass); } /** * Handler for 'start run' event. */ protected function startRun() { } /** * Handler for 'start class' event. * * @param string $name */ protected function startClass($name) { } /** * Handler for 'on test' event. * * @param string $name * @param bool $success */ protected function onTest($name, $success = true) { } /** * Handler for 'end class' event. * * @param string $name */ protected function endClass($name) { } /** * Handler for 'end run' event. */ protected function endRun() { } private function isOfInterest(PHPUnit_Framework_Test $test) { return $test instanceof PHPUnit_Framework_TestCase && get_class($test) != 'PHPUnit_Framework_WarningTestCase'; } } phpunit-5.1.3/src/Util/TestDox/ResultPrinter/000077500000000000000000000000001263222771600211375ustar00rootroot00000000000000phpunit-5.1.3/src/Util/TestDox/ResultPrinter/HTML.php000066400000000000000000000032521263222771600224160ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Prints TestDox documentation in HTML format. * * @since Class available since Release 2.1.0 */ class PHPUnit_Util_TestDox_ResultPrinter_HTML extends PHPUnit_Util_TestDox_ResultPrinter { /** * @var bool */ protected $printsHTML = true; /** * Handler for 'start run' event. */ protected function startRun() { $this->write(''); } /** * Handler for 'start class' event. * * @param string $name */ protected function startClass($name) { $this->write( '

' . $this->currentTestClassPrettified . '

    ' ); } /** * Handler for 'on test' event. * * @param string $name * @param bool $success */ protected function onTest($name, $success = true) { if (!$success) { $strikeOpen = ''; $strikeClose = ''; } else { $strikeOpen = ''; $strikeClose = ''; } $this->write('
  • ' . $strikeOpen . $name . $strikeClose . '
  • '); } /** * Handler for 'end class' event. * * @param string $name */ protected function endClass($name) { $this->write('
'); } /** * Handler for 'end run' event. */ protected function endRun() { $this->write(''); } } phpunit-5.1.3/src/Util/TestDox/ResultPrinter/Text.php000066400000000000000000000021671263222771600226020ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Prints TestDox documentation in text format. * * @since Class available since Release 2.1.0 */ class PHPUnit_Util_TestDox_ResultPrinter_Text extends PHPUnit_Util_TestDox_ResultPrinter { /** * Handler for 'start class' event. * * @param string $name */ protected function startClass($name) { $this->write($this->currentTestClassPrettified . "\n"); } /** * Handler for 'on test' event. * * @param string $name * @param bool $success */ protected function onTest($name, $success = true) { if ($success) { $this->write(' [x] '); } else { $this->write(' [ ] '); } $this->write($name . "\n"); } /** * Handler for 'end class' event. * * @param string $name */ protected function endClass($name) { $this->write("\n"); } } phpunit-5.1.3/src/Util/TestSuiteIterator.php000066400000000000000000000037731263222771600211110ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Iterator for test suites. * * @since Class available since Release 3.1.0 */ class PHPUnit_Util_TestSuiteIterator implements RecursiveIterator { /** * @var int */ protected $position; /** * @var PHPUnit_Framework_Test[] */ protected $tests; /** * @param PHPUnit_Framework_TestSuite $testSuite */ public function __construct(PHPUnit_Framework_TestSuite $testSuite) { $this->tests = $testSuite->tests(); } /** * Rewinds the Iterator to the first element. */ public function rewind() { $this->position = 0; } /** * Checks if there is a current element after calls to rewind() or next(). * * @return bool */ public function valid() { return $this->position < count($this->tests); } /** * Returns the key of the current element. * * @return int */ public function key() { return $this->position; } /** * Returns the current element. * * @return PHPUnit_Framework_Test */ public function current() { return $this->valid() ? $this->tests[$this->position] : null; } /** * Moves forward to next element. */ public function next() { $this->position++; } /** * Returns the sub iterator for the current element. * * @return PHPUnit_Util_TestSuiteIterator */ public function getChildren() { return new self( $this->tests[$this->position] ); } /** * Checks whether the current element has children. * * @return bool */ public function hasChildren() { return $this->tests[$this->position] instanceof PHPUnit_Framework_TestSuite; } } phpunit-5.1.3/src/Util/Type.php000066400000000000000000000014031263222771600163530ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Utility class for textual type (and value) representation. * * @since Class available since Release 3.0.0 */ class PHPUnit_Util_Type { public static function isType($type) { return in_array( $type, [ 'numeric', 'integer', 'int', 'float', 'string', 'boolean', 'bool', 'null', 'array', 'object', 'resource', 'scalar' ] ); } } phpunit-5.1.3/src/Util/XML.php000066400000000000000000000157651263222771600161120ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * XML helpers. * * @since Class available since Release 3.2.0 */ class PHPUnit_Util_XML { /** * Load an $actual document into a DOMDocument. This is called * from the selector assertions. * * If $actual is already a DOMDocument, it is returned with * no changes. Otherwise, $actual is loaded into a new DOMDocument * as either HTML or XML, depending on the value of $isHtml. If $isHtml is * false and $xinclude is true, xinclude is performed on the loaded * DOMDocument. * * Note: prior to PHPUnit 3.3.0, this method loaded a file and * not a string as it currently does. To load a file into a * DOMDocument, use loadFile() instead. * * @param string|DOMDocument $actual * @param bool $isHtml * @param string $filename * @param bool $xinclude * @param bool $strict * * @return DOMDocument * * @since Method available since Release 3.3.0 */ public static function load($actual, $isHtml = false, $filename = '', $xinclude = false, $strict = false) { if ($actual instanceof DOMDocument) { return $actual; } // Required for XInclude on Windows. if ($xinclude) { $cwd = getcwd(); @chdir(dirname($filename)); } $document = new DOMDocument; $document->preserveWhiteSpace = false; $internal = libxml_use_internal_errors(true); $message = ''; $reporting = error_reporting(0); if ('' !== $filename) { // Necessary for xinclude $document->documentURI = $filename; } if ($isHtml) { $loaded = $document->loadHTML($actual); } else { $loaded = $document->loadXML($actual); } if (!$isHtml && $xinclude) { $document->xinclude(); } foreach (libxml_get_errors() as $error) { $message .= "\n" . $error->message; } libxml_use_internal_errors($internal); error_reporting($reporting); if ($xinclude) { @chdir($cwd); } if ($loaded === false || ($strict && $message !== '')) { if ($filename !== '') { throw new PHPUnit_Framework_Exception( sprintf( 'Could not load "%s".%s', $filename, $message != '' ? "\n" . $message : '' ) ); } else { throw new PHPUnit_Framework_Exception($message); } } return $document; } /** * Loads an XML (or HTML) file into a DOMDocument object. * * @param string $filename * @param bool $isHtml * @param bool $xinclude * @param bool $strict * * @return DOMDocument * * @since Method available since Release 3.3.0 */ public static function loadFile($filename, $isHtml = false, $xinclude = false, $strict = false) { $reporting = error_reporting(0); $contents = file_get_contents($filename); error_reporting($reporting); if ($contents === false) { throw new PHPUnit_Framework_Exception( sprintf( 'Could not read "%s".', $filename ) ); } return self::load($contents, $isHtml, $filename, $xinclude, $strict); } /** * @param DOMNode $node * * @since Method available since Release 3.3.0 */ public static function removeCharacterDataNodes(DOMNode $node) { if ($node->hasChildNodes()) { for ($i = $node->childNodes->length - 1; $i >= 0; $i--) { if (($child = $node->childNodes->item($i)) instanceof DOMCharacterData) { $node->removeChild($child); } } } } /** * Escapes a string for the use in XML documents * Any Unicode character is allowed, excluding the surrogate blocks, FFFE, * and FFFF (not even as character reference). * See http://www.w3.org/TR/xml/#charsets * * @param string $string * * @return string * * @since Method available since Release 3.4.6 */ public static function prepareString($string) { return preg_replace( '/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/', '', htmlspecialchars( PHPUnit_Util_String::convertToUtf8($string), ENT_QUOTES, 'UTF-8' ) ); } /** * "Convert" a DOMElement object into a PHP variable. * * @param DOMElement $element * * @return mixed * * @since Method available since Release 3.4.0 */ public static function xmlToVariable(DOMElement $element) { $variable = null; switch ($element->tagName) { case 'array': $variable = []; foreach ($element->getElementsByTagName('element') as $element) { $item = $element->childNodes->item(0); if ($item instanceof DOMText) { $item = $element->childNodes->item(1); } $value = self::xmlToVariable($item); if ($element->hasAttribute('key')) { $variable[(string) $element->getAttribute('key')] = $value; } else { $variable[] = $value; } } break; case 'object': $className = $element->getAttribute('class'); if ($element->hasChildNodes()) { $arguments = $element->childNodes->item(1)->childNodes; $constructorArgs = []; foreach ($arguments as $argument) { if ($argument instanceof DOMElement) { $constructorArgs[] = self::xmlToVariable($argument); } } $class = new ReflectionClass($className); $variable = $class->newInstanceArgs($constructorArgs); } else { $variable = new $className; } break; case 'boolean': $variable = $element->textContent == 'true' ? true : false; break; case 'integer': case 'double': case 'string': $variable = $element->textContent; settype($variable, $element->tagName); break; } return $variable; } } phpunit-5.1.3/tests/000077500000000000000000000000001263222771600143615ustar00rootroot00000000000000phpunit-5.1.3/tests/Extensions/000077500000000000000000000000001263222771600165205ustar00rootroot00000000000000phpunit-5.1.3/tests/Extensions/PhptTestCaseTest.php000066400000000000000000000146111263222771600224430ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ class Extensions_PhptTestCaseTest extends \PHPUnit_Framework_TestCase { const EXPECT_CONTENT = << --EXPECT-- Hello PHPUnit! EOF; const EXPECTF_CONTENT = << --EXPECTF-- Hello %s! EOF; const EXPECTREGEX_CONTENT = << --EXPECTREGEX-- Hello [HPU]{4}[nit]{3}! EOF; const FILE_SECTION = << EOF; protected $filename; protected $testCase; protected $phpUtil; protected function setUp() { $this->filename = sys_get_temp_dir() . '/phpunit.phpt'; touch($this->filename); $this->phpUtil = $this->getMockForAbstractClass('PHPUnit_Util_PHP', [], '', false); $this->testCase = new PHPUnit_Extensions_PhptTestCase($this->filename, $this->phpUtil); } protected function tearDown() { @unlink($this->filename); $this->filename = null; $this->testCase = null; } /** * Defines the content of the current PHPT test. * * @param string $content */ private function setPhpContent($content) { file_put_contents($this->filename, $content); } public function testShouldRunFileSectionAsTest() { $this->setPhpContent(self::EXPECT_CONTENT); $fileSection = '' . PHP_EOL; $this->phpUtil ->expects($this->once()) ->method('runJob') ->with($fileSection) ->will($this->returnValue(['stdout' => '', 'stderr' => ''])); $this->testCase->run(); } public function testShouldRunSkipifSectionWhenExists() { $skipifSection = '' . PHP_EOL; $phptContent = self::EXPECT_CONTENT . PHP_EOL; $phptContent .= '--SKIPIF--' . PHP_EOL; $phptContent .= $skipifSection; $this->setPhpContent($phptContent); $this->phpUtil ->expects($this->at(0)) ->method('runJob') ->with($skipifSection) ->will($this->returnValue(['stdout' => '', 'stderr' => ''])); $this->testCase->run(); } public function testShouldNotRunTestSectionIfSkipifSectionReturnsOutputWithSkipWord() { $skipifSection = '' . PHP_EOL; $phptContent = self::EXPECT_CONTENT . PHP_EOL; $phptContent .= '--SKIPIF--' . PHP_EOL; $phptContent .= $skipifSection; $this->setPhpContent($phptContent); $this->phpUtil ->expects($this->once()) ->method('runJob') ->with($skipifSection) ->will($this->returnValue(['stdout' => 'skip: Reason', 'stderr' => ''])); $this->testCase->run(); } public function testShouldRunCleanSectionWhenDefined() { $cleanSection = '' . PHP_EOL; $phptContent = self::EXPECT_CONTENT . PHP_EOL; $phptContent .= '--CLEAN--' . PHP_EOL; $phptContent .= $cleanSection; $this->setPhpContent($phptContent); $this->phpUtil ->expects($this->at(1)) ->method('runJob') ->with($cleanSection); $this->testCase->run(); } /** * @expectedException PHPUnit_Framework_Exception * @expectedExceptionMessage Invalid PHPT file */ public function testShouldThrowsAnExceptionWhenPhptFileIsEmpty() { $this->setPhpContent(''); $this->testCase->run(); } /** * @expectedException PHPUnit_Framework_Exception * @expectedExceptionMessage Invalid PHPT file */ public function testShouldThrowsAnExceptionWhenFileSectionIsMissing() { $this->setPhpContent( <<testCase->run(); } /** * @expectedException PHPUnit_Framework_Exception * @expectedExceptionMessage Invalid PHPT file */ public function testShouldThrowsAnExceptionWhenThereIsNoExpecOrExpectifOrExpecregexSectionInPhptFile() { $this->setPhpContent( << EOF ); $this->testCase->run(); } public function testShouldValidateExpectSession() { $this->setPhpContent(self::EXPECT_CONTENT); $this->phpUtil ->expects($this->once()) ->method('runJob') ->with(self::FILE_SECTION) ->will($this->returnValue(['stdout' => 'Hello PHPUnit!', 'stderr' => ''])); $result = $this->testCase->run(); $this->assertTrue($result->wasSuccessful()); } public function testShouldValidateExpectfSession() { $this->setPhpContent(self::EXPECTF_CONTENT); $this->phpUtil ->expects($this->once()) ->method('runJob') ->with(self::FILE_SECTION) ->will($this->returnValue(['stdout' => 'Hello PHPUnit!', 'stderr' => ''])); $result = $this->testCase->run(); $this->assertTrue($result->wasSuccessful()); } public function testShouldValidateExpectregexSession() { $this->setPhpContent(self::EXPECTREGEX_CONTENT); $this->phpUtil ->expects($this->once()) ->method('runJob') ->with(self::FILE_SECTION) ->will($this->returnValue(['stdout' => 'Hello PHPUnit!', 'stderr' => ''])); $result = $this->testCase->run(); $this->assertTrue($result->wasSuccessful()); } public function testParseIniSection() { $phptTestCase = new PhpTestCaseProxy(__FILE__); $settings = $phptTestCase->parseIniSection("foo=1\nbar = 2\rbaz = 3\r\nempty=\nignore"); $expected = [ 'foo=1', 'bar = 2', 'baz = 3', 'empty=', 'ignore', ]; $this->assertEquals($expected, $settings); } } class PhpTestCaseProxy extends PHPUnit_Extensions_PhptTestCase { public function parseIniSection($content) { return parent::parseIniSection($content); } } phpunit-5.1.3/tests/Extensions/RepeatedTestTest.php000066400000000000000000000031441263222771600224640ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 2.0.0 * @covers PHPUnit_Extensions_RepeatedTest */ class Extensions_RepeatedTestTest extends PHPUnit_Framework_TestCase { protected $suite; public function __construct() { $this->suite = new PHPUnit_Framework_TestSuite; $this->suite->addTest(new Success); $this->suite->addTest(new Success); } public function testRepeatedOnce() { $test = new PHPUnit_Extensions_RepeatedTest($this->suite, 1); $this->assertEquals(2, count($test)); $result = $test->run(); $this->assertEquals(2, count($result)); } public function testRepeatedMoreThanOnce() { $test = new PHPUnit_Extensions_RepeatedTest($this->suite, 3); $this->assertEquals(6, count($test)); $result = $test->run(); $this->assertEquals(6, count($result)); } public function testRepeatedZero() { $test = new PHPUnit_Extensions_RepeatedTest($this->suite, 0); $this->assertEquals(0, count($test)); $result = $test->run(); $this->assertEquals(0, count($result)); } public function testRepeatedNegative() { try { $test = new PHPUnit_Extensions_RepeatedTest($this->suite, -1); } catch (Exception $e) { return; } $this->fail('Should throw an Exception'); } } phpunit-5.1.3/tests/Fail/000077500000000000000000000000001263222771600152345ustar00rootroot00000000000000phpunit-5.1.3/tests/Fail/fail.phpt000066400000000000000000000001471263222771600170460ustar00rootroot00000000000000--TEST-- // This test intentionally fails and it is checked by Travis. --FILE-- --EXPECTF-- unexpected phpunit-5.1.3/tests/Framework/000077500000000000000000000000001263222771600163165ustar00rootroot00000000000000phpunit-5.1.3/tests/Framework/AssertTest.php000066400000000000000000003460641263222771600211450ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 2.0.0 */ class Framework_AssertTest extends PHPUnit_Framework_TestCase { /** * @var string */ private $filesDirectory; protected function setUp() { $this->filesDirectory = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR; } /** * @covers PHPUnit_Framework_Assert::fail */ public function testFail() { try { $this->fail(); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } throw new PHPUnit_Framework_AssertionFailedError('Fail did not throw fail exception'); } /** * @covers PHPUnit_Framework_Assert::assertContains */ public function testAssertSplObjectStorageContainsObject() { $a = new stdClass; $b = new stdClass; $c = new SplObjectStorage; $c->attach($a); $this->assertContains($a, $c); try { $this->assertContains($b, $c); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertContains */ public function testAssertArrayContainsObject() { $a = new stdClass; $b = new stdClass; $this->assertContains($a, [$a]); try { $this->assertContains($a, [$b]); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertContains */ public function testAssertArrayContainsString() { $this->assertContains('foo', ['foo']); try { $this->assertContains('foo', ['bar']); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertContains */ public function testAssertArrayContainsNonObject() { $this->assertContains('foo', [true]); try { $this->assertContains('foo', [true], '', false, true, true); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertContainsOnlyInstancesOf */ public function testAssertContainsOnlyInstancesOf() { $test = [ new Book(), new Book ]; $this->assertContainsOnlyInstancesOf('Book', $test); $this->assertContainsOnlyInstancesOf('stdClass', [new stdClass()]); $test2 = [ new Author('Test') ]; try { $this->assertContainsOnlyInstancesOf('Book', $test2); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertArrayHasKey * @expectedException PHPUnit_Framework_Exception */ public function testAssertArrayHasKeyThrowsExceptionForInvalidFirstArgument() { $this->assertArrayHasKey(null, []); } /** * @covers PHPUnit_Framework_Assert::assertArrayHasKey * @expectedException PHPUnit_Framework_Exception */ public function testAssertArrayHasKeyThrowsExceptionForInvalidSecondArgument() { $this->assertArrayHasKey(0, null); } /** * @covers PHPUnit_Framework_Assert::assertArrayHasKey */ public function testAssertArrayHasIntegerKey() { $this->assertArrayHasKey(0, ['foo']); try { $this->assertArrayHasKey(1, ['foo']); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertArraySubset * @covers PHPUnit_Framework_Constraint_ArraySubset */ public function testAssertArraySubset() { $array = [ 'a' => 'item a', 'b' => 'item b', 'c' => ['a2' => 'item a2', 'b2' => 'item b2'], 'd' => ['a2' => ['a3' => 'item a3', 'b3' => 'item b3']] ]; $this->assertArraySubset(['a' => 'item a', 'c' => ['a2' => 'item a2']], $array); $this->assertArraySubset(['a' => 'item a', 'd' => ['a2' => ['b3' => 'item b3']]], $array); try { $this->assertArraySubset(['a' => 'bad value'], $array); } catch (PHPUnit_Framework_AssertionFailedError $e) { } try { $this->assertArraySubset(['d' => ['a2' => ['bad index' => 'item b3']]], $array); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertArraySubset * @covers PHPUnit_Framework_Constraint_ArraySubset */ public function testAssertArraySubsetWithDeepNestedArrays() { $array = [ 'path' => [ 'to' => [ 'the' => [ 'cake' => 'is a lie' ] ] ] ]; $this->assertArraySubset(['path' => []], $array); $this->assertArraySubset(['path' => ['to' => []]], $array); $this->assertArraySubset(['path' => ['to' => ['the' => []]]], $array); $this->assertArraySubset(['path' => ['to' => ['the' => ['cake' => 'is a lie']]]], $array); try { $this->assertArraySubset(['path' => ['to' => ['the' => ['cake' => 'is not a lie']]]], $array); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertArraySubset * @covers PHPUnit_Framework_Constraint_ArraySubset */ public function testAssertArraySubsetWithNoStrictCheckAndObjects() { $obj = new \stdClass; $reference = &$obj; $array = ['a' => $obj]; $this->assertArraySubset(['a' => $reference], $array); $this->assertArraySubset(['a' => new \stdClass], $array); } /** * @covers PHPUnit_Framework_Assert::assertArraySubset * @covers PHPUnit_Framework_Constraint_ArraySubset */ public function testAssertArraySubsetWithStrictCheckAndObjects() { $obj = new \stdClass; $reference = &$obj; $array = ['a' => $obj]; $this->assertArraySubset(['a' => $reference], $array, true); try { $this->assertArraySubset(['a' => new \stdClass], $array, true); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail('Strict recursive array check fail.'); } /** * @covers PHPUnit_Framework_Assert::assertArraySubset * @covers PHPUnit_Framework_Constraint_ArraySubset * @expectedException PHPUnit_Framework_Exception * @expectedExceptionMessage array or ArrayAccess * @dataProvider assertArraySubsetInvalidArgumentProvider */ public function testAssertArraySubsetRaisesExceptionForInvalidArguments($partial, $subject) { $this->assertArraySubset($partial, $subject); } /** * @return array */ public function assertArraySubsetInvalidArgumentProvider() { return [ [false, []], [[], false], ]; } /** * @covers PHPUnit_Framework_Assert::assertArrayNotHasKey * @expectedException PHPUnit_Framework_Exception */ public function testAssertArrayNotHasKeyThrowsExceptionForInvalidFirstArgument() { $this->assertArrayNotHasKey(null, []); } /** * @covers PHPUnit_Framework_Assert::assertArrayNotHasKey * @expectedException PHPUnit_Framework_Exception */ public function testAssertArrayNotHasKeyThrowsExceptionForInvalidSecondArgument() { $this->assertArrayNotHasKey(0, null); } /** * @covers PHPUnit_Framework_Assert::assertArrayNotHasKey */ public function testAssertArrayNotHasIntegerKey() { $this->assertArrayNotHasKey(1, ['foo']); try { $this->assertArrayNotHasKey(0, ['foo']); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertArrayHasKey */ public function testAssertArrayHasStringKey() { $this->assertArrayHasKey('foo', ['foo' => 'bar']); try { $this->assertArrayHasKey('bar', ['foo' => 'bar']); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertArrayNotHasKey */ public function testAssertArrayNotHasStringKey() { $this->assertArrayNotHasKey('bar', ['foo' => 'bar']); try { $this->assertArrayNotHasKey('foo', ['foo' => 'bar']); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertArrayHasKey */ public function testAssertArrayHasKeyAcceptsArrayObjectValue() { $array = new ArrayObject(); $array['foo'] = 'bar'; $this->assertArrayHasKey('foo', $array); } /** * @covers PHPUnit_Framework_Assert::assertArrayHasKey * @expectedException PHPUnit_Framework_AssertionFailedError */ public function testAssertArrayHasKeyProperlyFailsWithArrayObjectValue() { $array = new ArrayObject(); $array['bar'] = 'bar'; $this->assertArrayHasKey('foo', $array); } /** * @covers PHPUnit_Framework_Assert::assertArrayHasKey */ public function testAssertArrayHasKeyAcceptsArrayAccessValue() { $array = new SampleArrayAccess(); $array['foo'] = 'bar'; $this->assertArrayHasKey('foo', $array); } /** * @covers PHPUnit_Framework_Assert::assertArrayHasKey * @expectedException PHPUnit_Framework_AssertionFailedError */ public function testAssertArrayHasKeyProperlyFailsWithArrayAccessValue() { $array = new SampleArrayAccess(); $array['bar'] = 'bar'; $this->assertArrayHasKey('foo', $array); } /** * @covers PHPUnit_Framework_Assert::assertArrayNotHasKey */ public function testAssertArrayNotHasKeyAcceptsArrayAccessValue() { $array = new ArrayObject(); $array['foo'] = 'bar'; $this->assertArrayNotHasKey('bar', $array); } /** * @covers PHPUnit_Framework_Assert::assertArrayNotHasKey * @expectedException PHPUnit_Framework_AssertionFailedError */ public function testAssertArrayNotHasKeyPropertlyFailsWithArrayAccessValue() { $array = new ArrayObject(); $array['bar'] = 'bar'; $this->assertArrayNotHasKey('bar', $array); } /** * @covers PHPUnit_Framework_Assert::assertContains * @expectedException PHPUnit_Framework_Exception */ public function testAssertContainsThrowsException() { $this->assertContains(null, null); } /** * @covers PHPUnit_Framework_Assert::assertContains */ public function testAssertIteratorContainsObject() { $foo = new stdClass; $this->assertContains($foo, new TestIterator([$foo])); try { $this->assertContains($foo, new TestIterator([new stdClass])); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertContains */ public function testAssertIteratorContainsString() { $this->assertContains('foo', new TestIterator(['foo'])); try { $this->assertContains('foo', new TestIterator(['bar'])); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertContains */ public function testAssertStringContainsString() { $this->assertContains('foo', 'foobar'); try { $this->assertContains('foo', 'bar'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotContains * @expectedException PHPUnit_Framework_Exception */ public function testAssertNotContainsThrowsException() { $this->assertNotContains(null, null); } /** * @covers PHPUnit_Framework_Assert::assertNotContains */ public function testAssertSplObjectStorageNotContainsObject() { $a = new stdClass; $b = new stdClass; $c = new SplObjectStorage; $c->attach($a); $this->assertNotContains($b, $c); try { $this->assertNotContains($a, $c); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotContains */ public function testAssertArrayNotContainsObject() { $a = new stdClass; $b = new stdClass; $this->assertNotContains($a, [$b]); try { $this->assertNotContains($a, [$a]); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotContains */ public function testAssertArrayNotContainsString() { $this->assertNotContains('foo', ['bar']); try { $this->assertNotContains('foo', ['foo']); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotContains */ public function testAssertArrayNotContainsNonObject() { $this->assertNotContains('foo', [true], '', false, true, true); try { $this->assertNotContains('foo', [true]); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotContains */ public function testAssertStringNotContainsString() { $this->assertNotContains('foo', 'bar'); try { $this->assertNotContains('foo', 'foo'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertContainsOnly * @expectedException PHPUnit_Framework_Exception */ public function testAssertContainsOnlyThrowsException() { $this->assertContainsOnly(null, null); } /** * @covers PHPUnit_Framework_Assert::assertNotContainsOnly * @expectedException PHPUnit_Framework_Exception */ public function testAssertNotContainsOnlyThrowsException() { $this->assertNotContainsOnly(null, null); } /** * @covers PHPUnit_Framework_Assert::assertContainsOnlyInstancesOf * @expectedException PHPUnit_Framework_Exception */ public function testAssertContainsOnlyInstancesOfThrowsException() { $this->assertContainsOnlyInstancesOf(null, null); } /** * @covers PHPUnit_Framework_Assert::assertContainsOnly */ public function testAssertArrayContainsOnlyIntegers() { $this->assertContainsOnly('integer', [1, 2, 3]); try { $this->assertContainsOnly('integer', ['1', 2, 3]); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotContainsOnly */ public function testAssertArrayNotContainsOnlyIntegers() { $this->assertNotContainsOnly('integer', ['1', 2, 3]); try { $this->assertNotContainsOnly('integer', [1, 2, 3]); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertContainsOnly */ public function testAssertArrayContainsOnlyStdClass() { $this->assertContainsOnly('StdClass', [new stdClass]); try { $this->assertContainsOnly('StdClass', ['StdClass']); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotContainsOnly */ public function testAssertArrayNotContainsOnlyStdClass() { $this->assertNotContainsOnly('StdClass', ['StdClass']); try { $this->assertNotContainsOnly('StdClass', [new stdClass]); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } protected function sameValues() { $object = new SampleClass(4, 8, 15); // cannot use $filesDirectory, because neither setUp() nor // setUpBeforeClass() are executed before the data providers $file = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'foo.xml'; $resource = fopen($file, 'r'); return [ // null [null, null], // strings ['a', 'a'], // integers [0, 0], // floats [2.3, 2.3], [1/3, 1 - 2/3], [log(0), log(0)], // arrays [[], []], [[0 => 1], [0 => 1]], [[0 => null], [0 => null]], [['a', 'b' => [1, 2]], ['a', 'b' => [1, 2]]], // objects [$object, $object], // resources [$resource, $resource], ]; } protected function notEqualValues() { // cyclic dependencies $book1 = new Book; $book1->author = new Author('Terry Pratchett'); $book1->author->books[] = $book1; $book2 = new Book; $book2->author = new Author('Terry Pratch'); $book2->author->books[] = $book2; $book3 = new Book; $book3->author = 'Terry Pratchett'; $book4 = new stdClass; $book4->author = 'Terry Pratchett'; $object1 = new SampleClass(4, 8, 15); $object2 = new SampleClass(16, 23, 42); $object3 = new SampleClass(4, 8, 15); $storage1 = new SplObjectStorage; $storage1->attach($object1); $storage2 = new SplObjectStorage; $storage2->attach($object3); // same content, different object // cannot use $filesDirectory, because neither setUp() nor // setUpBeforeClass() are executed before the data providers $file = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'foo.xml'; return [ // strings ['a', 'b'], ['a', 'A'], // https://github.com/sebastianbergmann/phpunit/issues/1023 ['9E6666666','9E7777777'], // integers [1, 2], [2, 1], // floats [2.3, 4.2], [2.3, 4.2, 0.5], [[2.3], [4.2], 0.5], [[[2.3]], [[4.2]], 0.5], [new Struct(2.3), new Struct(4.2), 0.5], [[new Struct(2.3)], [new Struct(4.2)], 0.5], // NAN [NAN, NAN], // arrays [[], [0 => 1]], [[0 => 1], []], [[0 => null], []], [[0 => 1, 1 => 2], [0 => 1, 1 => 3]], [['a', 'b' => [1, 2]], ['a', 'b' => [2, 1]]], // objects [new SampleClass(4, 8, 15), new SampleClass(16, 23, 42)], [$object1, $object2], [$book1, $book2], [$book3, $book4], // same content, different class // resources [fopen($file, 'r'), fopen($file, 'r')], // SplObjectStorage [$storage1, $storage2], // DOMDocument [ PHPUnit_Util_XML::load(''), PHPUnit_Util_XML::load(''), ], [ PHPUnit_Util_XML::load(''), PHPUnit_Util_XML::load(''), ], [ PHPUnit_Util_XML::load(' bar '), PHPUnit_Util_XML::load(''), ], [ PHPUnit_Util_XML::load(''), PHPUnit_Util_XML::load(''), ], [ PHPUnit_Util_XML::load(' bar '), PHPUnit_Util_XML::load(' bir '), ], [ new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 03:13:35', new DateTimeZone('America/New_York')), ], [ new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 03:13:35', new DateTimeZone('America/New_York')), 3500 ], [ new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 05:13:35', new DateTimeZone('America/New_York')), 3500 ], [ new DateTime('2013-03-29', new DateTimeZone('America/New_York')), new DateTime('2013-03-30', new DateTimeZone('America/New_York')), ], [ new DateTime('2013-03-29', new DateTimeZone('America/New_York')), new DateTime('2013-03-30', new DateTimeZone('America/New_York')), 43200 ], [ new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/Chicago')), ], [ new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/Chicago')), 3500 ], [ new DateTime('2013-03-30', new DateTimeZone('America/New_York')), new DateTime('2013-03-30', new DateTimeZone('America/Chicago')), ], [ new DateTime('2013-03-29T05:13:35-0600'), new DateTime('2013-03-29T04:13:35-0600'), ], [ new DateTime('2013-03-29T05:13:35-0600'), new DateTime('2013-03-29T05:13:35-0500'), ], // Exception //array(new Exception('Exception 1'), new Exception('Exception 2')), // different types [new SampleClass(4, 8, 15), false], [false, new SampleClass(4, 8, 15)], [[0 => 1, 1 => 2], false], [false, [0 => 1, 1 => 2]], [[], new stdClass], [new stdClass, []], // PHP: 0 == 'Foobar' => true! // We want these values to differ [0, 'Foobar'], ['Foobar', 0], [3, acos(8)], [acos(8), 3] ]; } protected function equalValues() { // cyclic dependencies $book1 = new Book; $book1->author = new Author('Terry Pratchett'); $book1->author->books[] = $book1; $book2 = new Book; $book2->author = new Author('Terry Pratchett'); $book2->author->books[] = $book2; $object1 = new SampleClass(4, 8, 15); $object2 = new SampleClass(4, 8, 15); $storage1 = new SplObjectStorage; $storage1->attach($object1); $storage2 = new SplObjectStorage; $storage2->attach($object1); return [ // strings ['a', 'A', 0, false, true], // ignore case // arrays [['a' => 1, 'b' => 2], ['b' => 2, 'a' => 1]], [[1], ['1']], [[3, 2, 1], [2, 3, 1], 0, true], // canonicalized comparison // floats [2.3, 2.5, 0.5], [[2.3], [2.5], 0.5], [[[2.3]], [[2.5]], 0.5], [new Struct(2.3), new Struct(2.5), 0.5], [[new Struct(2.3)], [new Struct(2.5)], 0.5], // numeric with delta [1, 2, 1], // objects [$object1, $object2], [$book1, $book2], // SplObjectStorage [$storage1, $storage2], // DOMDocument [ PHPUnit_Util_XML::load(''), PHPUnit_Util_XML::load(''), ], [ PHPUnit_Util_XML::load(''), PHPUnit_Util_XML::load(''), ], [ PHPUnit_Util_XML::load(''), PHPUnit_Util_XML::load(''), ], [ PHPUnit_Util_XML::load("\n \n"), PHPUnit_Util_XML::load(''), ], [ new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), ], [ new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 04:13:25', new DateTimeZone('America/New_York')), 10 ], [ new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 04:14:40', new DateTimeZone('America/New_York')), 65 ], [ new DateTime('2013-03-29', new DateTimeZone('America/New_York')), new DateTime('2013-03-29', new DateTimeZone('America/New_York')), ], [ new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 03:13:35', new DateTimeZone('America/Chicago')), ], [ new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 03:13:49', new DateTimeZone('America/Chicago')), 15 ], [ new DateTime('2013-03-30', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 23:00:00', new DateTimeZone('America/Chicago')), ], [ new DateTime('2013-03-30', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 23:01:30', new DateTimeZone('America/Chicago')), 100 ], [ new DateTime('@1364616000'), new DateTime('2013-03-29 23:00:00', new DateTimeZone('America/Chicago')), ], [ new DateTime('2013-03-29T05:13:35-0500'), new DateTime('2013-03-29T04:13:35-0600'), ], // Exception //array(new Exception('Exception 1'), new Exception('Exception 1')), // mixed types [0, '0'], ['0', 0], [2.3, '2.3'], ['2.3', 2.3], [(string) (1/3), 1 - 2/3], [1/3, (string) (1 - 2/3)], ['string representation', new ClassWithToString], [new ClassWithToString, 'string representation'], ]; } public function equalProvider() { // same |= equal return array_merge($this->equalValues(), $this->sameValues()); } public function notEqualProvider() { return $this->notEqualValues(); } public function sameProvider() { return $this->sameValues(); } public function notSameProvider() { // not equal |= not same // equal, ¬same |= not same return array_merge($this->notEqualValues(), $this->equalValues()); } /** * @covers PHPUnit_Framework_Assert::assertEquals * @dataProvider equalProvider */ public function testAssertEqualsSucceeds($a, $b, $delta = 0.0, $canonicalize = false, $ignoreCase = false) { $this->assertEquals($a, $b, '', $delta, 10, $canonicalize, $ignoreCase); } /** * @covers PHPUnit_Framework_Assert::assertEquals * @dataProvider notEqualProvider */ public function testAssertEqualsFails($a, $b, $delta = 0.0, $canonicalize = false, $ignoreCase = false) { try { $this->assertEquals($a, $b, '', $delta, 10, $canonicalize, $ignoreCase); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotEquals * @dataProvider notEqualProvider */ public function testAssertNotEqualsSucceeds($a, $b, $delta = 0.0, $canonicalize = false, $ignoreCase = false) { $this->assertNotEquals($a, $b, '', $delta, 10, $canonicalize, $ignoreCase); } /** * @covers PHPUnit_Framework_Assert::assertNotEquals * @dataProvider equalProvider */ public function testAssertNotEqualsFails($a, $b, $delta = 0.0, $canonicalize = false, $ignoreCase = false) { try { $this->assertNotEquals($a, $b, '', $delta, 10, $canonicalize, $ignoreCase); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertSame * @dataProvider sameProvider */ public function testAssertSameSucceeds($a, $b) { $this->assertSame($a, $b); } /** * @covers PHPUnit_Framework_Assert::assertSame * @dataProvider notSameProvider */ public function testAssertSameFails($a, $b) { try { $this->assertSame($a, $b); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotSame * @dataProvider notSameProvider */ public function testAssertNotSameSucceeds($a, $b) { $this->assertNotSame($a, $b); } /** * @covers PHPUnit_Framework_Assert::assertNotSame * @dataProvider sameProvider */ public function testAssertNotSameFails($a, $b) { try { $this->assertNotSame($a, $b); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertXmlFileEqualsXmlFile */ public function testAssertXmlFileEqualsXmlFile() { $this->assertXmlFileEqualsXmlFile( $this->filesDirectory . 'foo.xml', $this->filesDirectory . 'foo.xml' ); try { $this->assertXmlFileEqualsXmlFile( $this->filesDirectory . 'foo.xml', $this->filesDirectory . 'bar.xml' ); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertXmlFileNotEqualsXmlFile */ public function testAssertXmlFileNotEqualsXmlFile() { $this->assertXmlFileNotEqualsXmlFile( $this->filesDirectory . 'foo.xml', $this->filesDirectory . 'bar.xml' ); try { $this->assertXmlFileNotEqualsXmlFile( $this->filesDirectory . 'foo.xml', $this->filesDirectory . 'foo.xml' ); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertXmlStringEqualsXmlFile */ public function testAssertXmlStringEqualsXmlFile() { $this->assertXmlStringEqualsXmlFile( $this->filesDirectory . 'foo.xml', file_get_contents($this->filesDirectory . 'foo.xml') ); try { $this->assertXmlStringEqualsXmlFile( $this->filesDirectory . 'foo.xml', file_get_contents($this->filesDirectory . 'bar.xml') ); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertXmlStringNotEqualsXmlFile */ public function testXmlStringNotEqualsXmlFile() { $this->assertXmlStringNotEqualsXmlFile( $this->filesDirectory . 'foo.xml', file_get_contents($this->filesDirectory . 'bar.xml') ); try { $this->assertXmlStringNotEqualsXmlFile( $this->filesDirectory . 'foo.xml', file_get_contents($this->filesDirectory . 'foo.xml') ); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertXmlStringEqualsXmlString */ public function testAssertXmlStringEqualsXmlString() { $this->assertXmlStringEqualsXmlString('', ''); try { $this->assertXmlStringEqualsXmlString('', ''); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @expectedException PHPUnit_Framework_Exception * @covers PHPUnit_Framework_Assert::assertXmlStringEqualsXmlString * @ticket 1860 */ public function testAssertXmlStringEqualsXmlString2() { $this->assertXmlStringEqualsXmlString('', ''); } /** * @covers PHPUnit_Framework_Assert::assertXmlStringEqualsXmlString * @ticket 1860 */ public function testAssertXmlStringEqualsXmlString3() { $expected = << XML; $actual = << XML; $this->assertXmlStringEqualsXmlString($expected, $actual); } /** * @covers PHPUnit_Framework_Assert::assertXmlStringNotEqualsXmlString */ public function testAssertXmlStringNotEqualsXmlString() { $this->assertXmlStringNotEqualsXmlString('', ''); try { $this->assertXmlStringNotEqualsXmlString('', ''); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertEqualXMLStructure */ public function testXMLStructureIsSame() { $expected = new DOMDocument; $expected->load($this->filesDirectory . 'structureExpected.xml'); $actual = new DOMDocument; $actual->load($this->filesDirectory . 'structureExpected.xml'); $this->assertEqualXMLStructure( $expected->firstChild, $actual->firstChild, true ); } /** * @covers PHPUnit_Framework_Assert::assertEqualXMLStructure * @expectedException PHPUnit_Framework_ExpectationFailedException */ public function testXMLStructureWrongNumberOfAttributes() { $expected = new DOMDocument; $expected->load($this->filesDirectory . 'structureExpected.xml'); $actual = new DOMDocument; $actual->load($this->filesDirectory . 'structureWrongNumberOfAttributes.xml'); $this->assertEqualXMLStructure( $expected->firstChild, $actual->firstChild, true ); } /** * @covers PHPUnit_Framework_Assert::assertEqualXMLStructure * @expectedException PHPUnit_Framework_ExpectationFailedException */ public function testXMLStructureWrongNumberOfNodes() { $expected = new DOMDocument; $expected->load($this->filesDirectory . 'structureExpected.xml'); $actual = new DOMDocument; $actual->load($this->filesDirectory . 'structureWrongNumberOfNodes.xml'); $this->assertEqualXMLStructure( $expected->firstChild, $actual->firstChild, true ); } /** * @covers PHPUnit_Framework_Assert::assertEqualXMLStructure */ public function testXMLStructureIsSameButDataIsNot() { $expected = new DOMDocument; $expected->load($this->filesDirectory . 'structureExpected.xml'); $actual = new DOMDocument; $actual->load($this->filesDirectory . 'structureIsSameButDataIsNot.xml'); $this->assertEqualXMLStructure( $expected->firstChild, $actual->firstChild, true ); } /** * @covers PHPUnit_Framework_Assert::assertEqualXMLStructure */ public function testXMLStructureAttributesAreSameButValuesAreNot() { $expected = new DOMDocument; $expected->load($this->filesDirectory . 'structureExpected.xml'); $actual = new DOMDocument; $actual->load($this->filesDirectory . 'structureAttributesAreSameButValuesAreNot.xml'); $this->assertEqualXMLStructure( $expected->firstChild, $actual->firstChild, true ); } /** * @covers PHPUnit_Framework_Assert::assertEqualXMLStructure */ public function testXMLStructureIgnoreTextNodes() { $expected = new DOMDocument; $expected->load($this->filesDirectory . 'structureExpected.xml'); $actual = new DOMDocument; $actual->load($this->filesDirectory . 'structureIgnoreTextNodes.xml'); $this->assertEqualXMLStructure( $expected->firstChild, $actual->firstChild, true ); } /** * @covers PHPUnit_Framework_Assert::assertEquals */ public function testAssertStringEqualsNumeric() { $this->assertEquals('0', 0); try { $this->assertEquals('0', 1); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotEquals */ public function testAssertStringEqualsNumeric2() { $this->assertNotEquals('A', 0); } /** * @covers PHPUnit_Framework_Assert::assertFileExists * @expectedException PHPUnit_Framework_Exception */ public function testAssertFileExistsThrowsException() { $this->assertFileExists(null); } /** * @covers PHPUnit_Framework_Assert::assertFileExists */ public function testAssertFileExists() { $this->assertFileExists(__FILE__); try { $this->assertFileExists(__DIR__ . DIRECTORY_SEPARATOR . 'NotExisting'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertFileNotExists * @expectedException PHPUnit_Framework_Exception */ public function testAssertFileNotExistsThrowsException() { $this->assertFileNotExists(null); } /** * @covers PHPUnit_Framework_Assert::assertFileNotExists */ public function testAssertFileNotExists() { $this->assertFileNotExists(__DIR__ . DIRECTORY_SEPARATOR . 'NotExisting'); try { $this->assertFileNotExists(__FILE__); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertObjectHasAttribute */ public function testAssertObjectHasAttribute() { $o = new Author('Terry Pratchett'); $this->assertObjectHasAttribute('name', $o); try { $this->assertObjectHasAttribute('foo', $o); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertObjectNotHasAttribute */ public function testAssertObjectNotHasAttribute() { $o = new Author('Terry Pratchett'); $this->assertObjectNotHasAttribute('foo', $o); try { $this->assertObjectNotHasAttribute('name', $o); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertFinite */ public function testAssertFinite() { $this->assertFinite(1); try { $this->assertFinite(INF); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertInfinite */ public function testAssertInfinite() { $this->assertInfinite(INF); try { $this->assertInfinite(1); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNan */ public function testAssertNan() { $this->assertNan(NAN); try { $this->assertNan(1); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNull */ public function testAssertNull() { $this->assertNull(null); try { $this->assertNull(new stdClass); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotNull */ public function testAssertNotNull() { $this->assertNotNull(new stdClass); try { $this->assertNotNull(null); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertTrue */ public function testAssertTrue() { $this->assertTrue(true); try { $this->assertTrue(false); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotTrue */ public function testAssertNotTrue() { $this->assertNotTrue(false); $this->assertNotTrue(1); $this->assertNotTrue('true'); try { $this->assertNotTrue(true); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertFalse */ public function testAssertFalse() { $this->assertFalse(false); try { $this->assertFalse(true); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotFalse */ public function testAssertNotFalse() { $this->assertNotFalse(true); $this->assertNotFalse(0); $this->assertNotFalse(''); try { $this->assertNotFalse(false); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertRegExp * @expectedException PHPUnit_Framework_Exception */ public function testAssertRegExpThrowsException() { $this->assertRegExp(null, null); } /** * @covers PHPUnit_Framework_Assert::assertRegExp * @expectedException PHPUnit_Framework_Exception */ public function testAssertRegExpThrowsException2() { $this->assertRegExp('', null); } /** * @covers PHPUnit_Framework_Assert::assertNotRegExp * @expectedException PHPUnit_Framework_Exception */ public function testAssertNotRegExpThrowsException() { $this->assertNotRegExp(null, null); } /** * @covers PHPUnit_Framework_Assert::assertNotRegExp * @expectedException PHPUnit_Framework_Exception */ public function testAssertNotRegExpThrowsException2() { $this->assertNotRegExp('', null); } /** * @covers PHPUnit_Framework_Assert::assertRegExp */ public function testAssertRegExp() { $this->assertRegExp('/foo/', 'foobar'); try { $this->assertRegExp('/foo/', 'bar'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotRegExp */ public function testAssertNotRegExp() { $this->assertNotRegExp('/foo/', 'bar'); try { $this->assertNotRegExp('/foo/', 'foobar'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertSame */ public function testAssertSame() { $o = new stdClass; $this->assertSame($o, $o); try { $this->assertSame( new stdClass, new stdClass ); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertSame */ public function testAssertSame2() { $this->assertSame(true, true); $this->assertSame(false, false); try { $this->assertSame(true, false); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotSame */ public function testAssertNotSame() { $this->assertNotSame( new stdClass, null ); $this->assertNotSame( null, new stdClass ); $this->assertNotSame( new stdClass, new stdClass ); $o = new stdClass; try { $this->assertNotSame($o, $o); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotSame */ public function testAssertNotSame2() { $this->assertNotSame(true, false); $this->assertNotSame(false, true); try { $this->assertNotSame(true, true); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotSame */ public function testAssertNotSameFailsNull() { try { $this->assertNotSame(null, null); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertGreaterThan */ public function testGreaterThan() { $this->assertGreaterThan(1, 2); try { $this->assertGreaterThan(2, 1); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeGreaterThan */ public function testAttributeGreaterThan() { $this->assertAttributeGreaterThan( 1, 'bar', new ClassWithNonPublicAttributes ); try { $this->assertAttributeGreaterThan( 1, 'foo', new ClassWithNonPublicAttributes ); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertGreaterThanOrEqual */ public function testGreaterThanOrEqual() { $this->assertGreaterThanOrEqual(1, 2); try { $this->assertGreaterThanOrEqual(2, 1); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeGreaterThanOrEqual */ public function testAttributeGreaterThanOrEqual() { $this->assertAttributeGreaterThanOrEqual( 1, 'bar', new ClassWithNonPublicAttributes ); try { $this->assertAttributeGreaterThanOrEqual( 2, 'foo', new ClassWithNonPublicAttributes ); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertLessThan */ public function testLessThan() { $this->assertLessThan(2, 1); try { $this->assertLessThan(1, 2); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeLessThan */ public function testAttributeLessThan() { $this->assertAttributeLessThan( 2, 'foo', new ClassWithNonPublicAttributes ); try { $this->assertAttributeLessThan( 1, 'bar', new ClassWithNonPublicAttributes ); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertLessThanOrEqual */ public function testLessThanOrEqual() { $this->assertLessThanOrEqual(2, 1); try { $this->assertLessThanOrEqual(1, 2); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeLessThanOrEqual */ public function testAttributeLessThanOrEqual() { $this->assertAttributeLessThanOrEqual( 2, 'foo', new ClassWithNonPublicAttributes ); try { $this->assertAttributeLessThanOrEqual( 1, 'bar', new ClassWithNonPublicAttributes ); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::readAttribute * @covers PHPUnit_Framework_Assert::getStaticAttribute * @covers PHPUnit_Framework_Assert::getObjectAttribute */ public function testReadAttribute() { $obj = new ClassWithNonPublicAttributes; $this->assertEquals('foo', $this->readAttribute($obj, 'publicAttribute')); $this->assertEquals('bar', $this->readAttribute($obj, 'protectedAttribute')); $this->assertEquals('baz', $this->readAttribute($obj, 'privateAttribute')); $this->assertEquals('bar', $this->readAttribute($obj, 'protectedParentAttribute')); //$this->assertEquals('bar', $this->readAttribute($obj, 'privateParentAttribute')); } /** * @covers PHPUnit_Framework_Assert::readAttribute * @covers PHPUnit_Framework_Assert::getStaticAttribute * @covers PHPUnit_Framework_Assert::getObjectAttribute */ public function testReadAttribute2() { $this->assertEquals('foo', $this->readAttribute('ClassWithNonPublicAttributes', 'publicStaticAttribute')); $this->assertEquals('bar', $this->readAttribute('ClassWithNonPublicAttributes', 'protectedStaticAttribute')); $this->assertEquals('baz', $this->readAttribute('ClassWithNonPublicAttributes', 'privateStaticAttribute')); $this->assertEquals('foo', $this->readAttribute('ClassWithNonPublicAttributes', 'protectedStaticParentAttribute')); $this->assertEquals('foo', $this->readAttribute('ClassWithNonPublicAttributes', 'privateStaticParentAttribute')); } /** * @covers PHPUnit_Framework_Assert::readAttribute * @covers PHPUnit_Framework_Assert::getStaticAttribute * @covers PHPUnit_Framework_Assert::getObjectAttribute * @expectedException PHPUnit_Framework_Exception */ public function testReadAttribute3() { $this->readAttribute('StdClass', null); } /** * @covers PHPUnit_Framework_Assert::readAttribute * @covers PHPUnit_Framework_Assert::getStaticAttribute * @covers PHPUnit_Framework_Assert::getObjectAttribute * @expectedException PHPUnit_Framework_Exception */ public function testReadAttribute4() { $this->readAttribute('NotExistingClass', 'foo'); } /** * @covers PHPUnit_Framework_Assert::readAttribute * @covers PHPUnit_Framework_Assert::getStaticAttribute * @covers PHPUnit_Framework_Assert::getObjectAttribute * @expectedException PHPUnit_Framework_Exception */ public function testReadAttribute5() { $this->readAttribute(null, 'foo'); } /** * @covers PHPUnit_Framework_Assert::readAttribute * @covers PHPUnit_Framework_Assert::getStaticAttribute * @covers PHPUnit_Framework_Assert::getObjectAttribute * @expectedException PHPUnit_Framework_Exception */ public function testReadAttributeIfAttributeNameIsNotValid() { $this->readAttribute('StdClass', '2'); } /** * @covers PHPUnit_Framework_Assert::getStaticAttribute * @expectedException PHPUnit_Framework_Exception */ public function testGetStaticAttributeRaisesExceptionForInvalidFirstArgument() { $this->getStaticAttribute(null, 'foo'); } /** * @covers PHPUnit_Framework_Assert::getStaticAttribute * @expectedException PHPUnit_Framework_Exception */ public function testGetStaticAttributeRaisesExceptionForInvalidFirstArgument2() { $this->getStaticAttribute('NotExistingClass', 'foo'); } /** * @covers PHPUnit_Framework_Assert::getStaticAttribute * @expectedException PHPUnit_Framework_Exception */ public function testGetStaticAttributeRaisesExceptionForInvalidSecondArgument() { $this->getStaticAttribute('stdClass', null); } /** * @covers PHPUnit_Framework_Assert::getStaticAttribute * @expectedException PHPUnit_Framework_Exception */ public function testGetStaticAttributeRaisesExceptionForInvalidSecondArgument2() { $this->getStaticAttribute('stdClass', '0'); } /** * @covers PHPUnit_Framework_Assert::getStaticAttribute * @expectedException PHPUnit_Framework_Exception */ public function testGetStaticAttributeRaisesExceptionForInvalidSecondArgument3() { $this->getStaticAttribute('stdClass', 'foo'); } /** * @covers PHPUnit_Framework_Assert::getObjectAttribute * @expectedException PHPUnit_Framework_Exception */ public function testGetObjectAttributeRaisesExceptionForInvalidFirstArgument() { $this->getObjectAttribute(null, 'foo'); } /** * @covers PHPUnit_Framework_Assert::getObjectAttribute * @expectedException PHPUnit_Framework_Exception */ public function testGetObjectAttributeRaisesExceptionForInvalidSecondArgument() { $this->getObjectAttribute(new stdClass, null); } /** * @covers PHPUnit_Framework_Assert::getObjectAttribute * @expectedException PHPUnit_Framework_Exception */ public function testGetObjectAttributeRaisesExceptionForInvalidSecondArgument2() { $this->getObjectAttribute(new stdClass, '0'); } /** * @covers PHPUnit_Framework_Assert::getObjectAttribute * @expectedException PHPUnit_Framework_Exception */ public function testGetObjectAttributeRaisesExceptionForInvalidSecondArgument3() { $this->getObjectAttribute(new stdClass, 'foo'); } /** * @covers PHPUnit_Framework_Assert::getObjectAttribute */ public function testGetObjectAttributeWorksForInheritedAttributes() { $this->assertEquals( 'bar', $this->getObjectAttribute(new ClassWithNonPublicAttributes, 'privateParentAttribute') ); } /** * @covers PHPUnit_Framework_Assert::assertAttributeContains */ public function testAssertPublicAttributeContains() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeContains('foo', 'publicArray', $obj); try { $this->assertAttributeContains('bar', 'publicArray', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeContainsOnly */ public function testAssertPublicAttributeContainsOnly() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeContainsOnly('string', 'publicArray', $obj); try { $this->assertAttributeContainsOnly('integer', 'publicArray', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeNotContains */ public function testAssertPublicAttributeNotContains() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeNotContains('bar', 'publicArray', $obj); try { $this->assertAttributeNotContains('foo', 'publicArray', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeNotContainsOnly */ public function testAssertPublicAttributeNotContainsOnly() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeNotContainsOnly('integer', 'publicArray', $obj); try { $this->assertAttributeNotContainsOnly('string', 'publicArray', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeContains */ public function testAssertProtectedAttributeContains() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeContains('bar', 'protectedArray', $obj); try { $this->assertAttributeContains('foo', 'protectedArray', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeNotContains */ public function testAssertProtectedAttributeNotContains() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeNotContains('foo', 'protectedArray', $obj); try { $this->assertAttributeNotContains('bar', 'protectedArray', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeContains */ public function testAssertPrivateAttributeContains() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeContains('baz', 'privateArray', $obj); try { $this->assertAttributeContains('foo', 'privateArray', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeNotContains */ public function testAssertPrivateAttributeNotContains() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeNotContains('foo', 'privateArray', $obj); try { $this->assertAttributeNotContains('baz', 'privateArray', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeContains */ public function testAssertAttributeContainsNonObject() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeContains(true, 'privateArray', $obj); try { $this->assertAttributeContains(true, 'privateArray', $obj, '', false, true, true); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeNotContains */ public function testAssertAttributeNotContainsNonObject() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeNotContains(true, 'privateArray', $obj, '', false, true, true); try { $this->assertAttributeNotContains(true, 'privateArray', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeEquals */ public function testAssertPublicAttributeEquals() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeEquals('foo', 'publicAttribute', $obj); try { $this->assertAttributeEquals('bar', 'publicAttribute', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeNotEquals */ public function testAssertPublicAttributeNotEquals() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeNotEquals('bar', 'publicAttribute', $obj); try { $this->assertAttributeNotEquals('foo', 'publicAttribute', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeSame */ public function testAssertPublicAttributeSame() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeSame('foo', 'publicAttribute', $obj); try { $this->assertAttributeSame('bar', 'publicAttribute', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeNotSame */ public function testAssertPublicAttributeNotSame() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeNotSame('bar', 'publicAttribute', $obj); try { $this->assertAttributeNotSame('foo', 'publicAttribute', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeEquals */ public function testAssertProtectedAttributeEquals() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeEquals('bar', 'protectedAttribute', $obj); try { $this->assertAttributeEquals('foo', 'protectedAttribute', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeNotEquals */ public function testAssertProtectedAttributeNotEquals() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeNotEquals('foo', 'protectedAttribute', $obj); try { $this->assertAttributeNotEquals('bar', 'protectedAttribute', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeEquals */ public function testAssertPrivateAttributeEquals() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeEquals('baz', 'privateAttribute', $obj); try { $this->assertAttributeEquals('foo', 'privateAttribute', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeNotEquals */ public function testAssertPrivateAttributeNotEquals() { $obj = new ClassWithNonPublicAttributes; $this->assertAttributeNotEquals('foo', 'privateAttribute', $obj); try { $this->assertAttributeNotEquals('baz', 'privateAttribute', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeEquals */ public function testAssertPublicStaticAttributeEquals() { $this->assertAttributeEquals('foo', 'publicStaticAttribute', 'ClassWithNonPublicAttributes'); try { $this->assertAttributeEquals('bar', 'publicStaticAttribute', 'ClassWithNonPublicAttributes'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeNotEquals */ public function testAssertPublicStaticAttributeNotEquals() { $this->assertAttributeNotEquals('bar', 'publicStaticAttribute', 'ClassWithNonPublicAttributes'); try { $this->assertAttributeNotEquals('foo', 'publicStaticAttribute', 'ClassWithNonPublicAttributes'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeEquals */ public function testAssertProtectedStaticAttributeEquals() { $this->assertAttributeEquals('bar', 'protectedStaticAttribute', 'ClassWithNonPublicAttributes'); try { $this->assertAttributeEquals('foo', 'protectedStaticAttribute', 'ClassWithNonPublicAttributes'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeNotEquals */ public function testAssertProtectedStaticAttributeNotEquals() { $this->assertAttributeNotEquals('foo', 'protectedStaticAttribute', 'ClassWithNonPublicAttributes'); try { $this->assertAttributeNotEquals('bar', 'protectedStaticAttribute', 'ClassWithNonPublicAttributes'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeEquals */ public function testAssertPrivateStaticAttributeEquals() { $this->assertAttributeEquals('baz', 'privateStaticAttribute', 'ClassWithNonPublicAttributes'); try { $this->assertAttributeEquals('foo', 'privateStaticAttribute', 'ClassWithNonPublicAttributes'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeNotEquals */ public function testAssertPrivateStaticAttributeNotEquals() { $this->assertAttributeNotEquals('foo', 'privateStaticAttribute', 'ClassWithNonPublicAttributes'); try { $this->assertAttributeNotEquals('baz', 'privateStaticAttribute', 'ClassWithNonPublicAttributes'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertClassHasAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertClassHasAttributeThrowsException() { $this->assertClassHasAttribute(null, null); } /** * @covers PHPUnit_Framework_Assert::assertClassHasAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertClassHasAttributeThrowsException2() { $this->assertClassHasAttribute('foo', null); } /** * @covers PHPUnit_Framework_Assert::assertClassHasAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertClassHasAttributeThrowsExceptionIfAttributeNameIsNotValid() { $this->assertClassHasAttribute('1', 'ClassWithNonPublicAttributes'); } /** * @covers PHPUnit_Framework_Assert::assertClassNotHasAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertClassNotHasAttributeThrowsException() { $this->assertClassNotHasAttribute(null, null); } /** * @covers PHPUnit_Framework_Assert::assertClassNotHasAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertClassNotHasAttributeThrowsException2() { $this->assertClassNotHasAttribute('foo', null); } /** * @covers PHPUnit_Framework_Assert::assertClassNotHasAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertClassNotHasAttributeThrowsExceptionIfAttributeNameIsNotValid() { $this->assertClassNotHasAttribute('1', 'ClassWithNonPublicAttributes'); } /** * @covers PHPUnit_Framework_Assert::assertClassHasStaticAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertClassHasStaticAttributeThrowsException() { $this->assertClassHasStaticAttribute(null, null); } /** * @covers PHPUnit_Framework_Assert::assertClassHasStaticAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertClassHasStaticAttributeThrowsException2() { $this->assertClassHasStaticAttribute('foo', null); } /** * @covers PHPUnit_Framework_Assert::assertClassHasStaticAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertClassHasStaticAttributeThrowsExceptionIfAttributeNameIsNotValid() { $this->assertClassHasStaticAttribute('1', 'ClassWithNonPublicAttributes'); } /** * @covers PHPUnit_Framework_Assert::assertClassNotHasStaticAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertClassNotHasStaticAttributeThrowsException() { $this->assertClassNotHasStaticAttribute(null, null); } /** * @covers PHPUnit_Framework_Assert::assertClassNotHasStaticAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertClassNotHasStaticAttributeThrowsException2() { $this->assertClassNotHasStaticAttribute('foo', null); } /** * @covers PHPUnit_Framework_Assert::assertClassNotHasStaticAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertClassNotHasStaticAttributeThrowsExceptionIfAttributeNameIsNotValid() { $this->assertClassNotHasStaticAttribute('1', 'ClassWithNonPublicAttributes'); } /** * @covers PHPUnit_Framework_Assert::assertObjectHasAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertObjectHasAttributeThrowsException() { $this->assertObjectHasAttribute(null, null); } /** * @covers PHPUnit_Framework_Assert::assertObjectHasAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertObjectHasAttributeThrowsException2() { $this->assertObjectHasAttribute('foo', null); } /** * @covers PHPUnit_Framework_Assert::assertObjectHasAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertObjectHasAttributeThrowsExceptionIfAttributeNameIsNotValid() { $this->assertObjectHasAttribute('1', 'ClassWithNonPublicAttributes'); } /** * @covers PHPUnit_Framework_Assert::assertObjectNotHasAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertObjectNotHasAttributeThrowsException() { $this->assertObjectNotHasAttribute(null, null); } /** * @covers PHPUnit_Framework_Assert::assertObjectNotHasAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertObjectNotHasAttributeThrowsException2() { $this->assertObjectNotHasAttribute('foo', null); } /** * @covers PHPUnit_Framework_Assert::assertObjectNotHasAttribute * @expectedException PHPUnit_Framework_Exception */ public function testAssertObjectNotHasAttributeThrowsExceptionIfAttributeNameIsNotValid() { $this->assertObjectNotHasAttribute('1', 'ClassWithNonPublicAttributes'); } /** * @covers PHPUnit_Framework_Assert::assertClassHasAttribute */ public function testClassHasPublicAttribute() { $this->assertClassHasAttribute('publicAttribute', 'ClassWithNonPublicAttributes'); try { $this->assertClassHasAttribute('attribute', 'ClassWithNonPublicAttributes'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertClassNotHasAttribute */ public function testClassNotHasPublicAttribute() { $this->assertClassNotHasAttribute('attribute', 'ClassWithNonPublicAttributes'); try { $this->assertClassNotHasAttribute('publicAttribute', 'ClassWithNonPublicAttributes'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertClassHasStaticAttribute */ public function testClassHasPublicStaticAttribute() { $this->assertClassHasStaticAttribute('publicStaticAttribute', 'ClassWithNonPublicAttributes'); try { $this->assertClassHasStaticAttribute('attribute', 'ClassWithNonPublicAttributes'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertClassNotHasStaticAttribute */ public function testClassNotHasPublicStaticAttribute() { $this->assertClassNotHasStaticAttribute('attribute', 'ClassWithNonPublicAttributes'); try { $this->assertClassNotHasStaticAttribute('publicStaticAttribute', 'ClassWithNonPublicAttributes'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertObjectHasAttribute */ public function testObjectHasPublicAttribute() { $obj = new ClassWithNonPublicAttributes; $this->assertObjectHasAttribute('publicAttribute', $obj); try { $this->assertObjectHasAttribute('attribute', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertObjectNotHasAttribute */ public function testObjectNotHasPublicAttribute() { $obj = new ClassWithNonPublicAttributes; $this->assertObjectNotHasAttribute('attribute', $obj); try { $this->assertObjectNotHasAttribute('publicAttribute', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertObjectHasAttribute */ public function testObjectHasOnTheFlyAttribute() { $obj = new stdClass; $obj->foo = 'bar'; $this->assertObjectHasAttribute('foo', $obj); try { $this->assertObjectHasAttribute('bar', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertObjectNotHasAttribute */ public function testObjectNotHasOnTheFlyAttribute() { $obj = new stdClass; $obj->foo = 'bar'; $this->assertObjectNotHasAttribute('bar', $obj); try { $this->assertObjectNotHasAttribute('foo', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertObjectHasAttribute */ public function testObjectHasProtectedAttribute() { $obj = new ClassWithNonPublicAttributes; $this->assertObjectHasAttribute('protectedAttribute', $obj); try { $this->assertObjectHasAttribute('attribute', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertObjectNotHasAttribute */ public function testObjectNotHasProtectedAttribute() { $obj = new ClassWithNonPublicAttributes; $this->assertObjectNotHasAttribute('attribute', $obj); try { $this->assertObjectNotHasAttribute('protectedAttribute', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertObjectHasAttribute */ public function testObjectHasPrivateAttribute() { $obj = new ClassWithNonPublicAttributes; $this->assertObjectHasAttribute('privateAttribute', $obj); try { $this->assertObjectHasAttribute('attribute', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertObjectNotHasAttribute */ public function testObjectNotHasPrivateAttribute() { $obj = new ClassWithNonPublicAttributes; $this->assertObjectNotHasAttribute('attribute', $obj); try { $this->assertObjectNotHasAttribute('privateAttribute', $obj); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::attribute * @covers PHPUnit_Framework_Assert::equalTo */ public function testAssertThatAttributeEquals() { $this->assertThat( new ClassWithNonPublicAttributes, $this->attribute( $this->equalTo('foo'), 'publicAttribute' ) ); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::attribute * @covers PHPUnit_Framework_Assert::equalTo * @expectedException PHPUnit_Framework_AssertionFailedError */ public function testAssertThatAttributeEquals2() { $this->assertThat( new ClassWithNonPublicAttributes, $this->attribute( $this->equalTo('bar'), 'publicAttribute' ) ); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::attribute * @covers PHPUnit_Framework_Assert::equalTo */ public function testAssertThatAttributeEqualTo() { $this->assertThat( new ClassWithNonPublicAttributes, $this->attributeEqualTo('publicAttribute', 'foo') ); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::anything */ public function testAssertThatAnything() { $this->assertThat('anything', $this->anything()); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::isTrue */ public function testAssertThatIsTrue() { $this->assertThat(true, $this->isTrue()); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::isFalse */ public function testAssertThatIsFalse() { $this->assertThat(false, $this->isFalse()); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::isJson */ public function testAssertThatIsJson() { $this->assertThat('{}', $this->isJson()); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::anything * @covers PHPUnit_Framework_Assert::logicalAnd */ public function testAssertThatAnythingAndAnything() { $this->assertThat( 'anything', $this->logicalAnd( $this->anything(), $this->anything() ) ); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::anything * @covers PHPUnit_Framework_Assert::logicalOr */ public function testAssertThatAnythingOrAnything() { $this->assertThat( 'anything', $this->logicalOr( $this->anything(), $this->anything() ) ); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::anything * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_Assert::logicalXor */ public function testAssertThatAnythingXorNotAnything() { $this->assertThat( 'anything', $this->logicalXor( $this->anything(), $this->logicalNot($this->anything()) ) ); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::contains */ public function testAssertThatContains() { $this->assertThat(['foo'], $this->contains('foo')); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::stringContains */ public function testAssertThatStringContains() { $this->assertThat('barfoobar', $this->stringContains('foo')); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::containsOnly */ public function testAssertThatContainsOnly() { $this->assertThat(['foo'], $this->containsOnly('string')); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::containsOnlyInstancesOf */ public function testAssertThatContainsOnlyInstancesOf() { $this->assertThat([new Book], $this->containsOnlyInstancesOf('Book')); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::arrayHasKey */ public function testAssertThatArrayHasKey() { $this->assertThat(['foo' => 'bar'], $this->arrayHasKey('foo')); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::classHasAttribute */ public function testAssertThatClassHasAttribute() { $this->assertThat( new ClassWithNonPublicAttributes, $this->classHasAttribute('publicAttribute') ); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::classHasStaticAttribute */ public function testAssertThatClassHasStaticAttribute() { $this->assertThat( new ClassWithNonPublicAttributes, $this->classHasStaticAttribute('publicStaticAttribute') ); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::objectHasAttribute */ public function testAssertThatObjectHasAttribute() { $this->assertThat( new ClassWithNonPublicAttributes, $this->objectHasAttribute('publicAttribute') ); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::equalTo */ public function testAssertThatEqualTo() { $this->assertThat('foo', $this->equalTo('foo')); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::identicalTo */ public function testAssertThatIdenticalTo() { $value = new stdClass; $constraint = $this->identicalTo($value); $this->assertThat($value, $constraint); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::isInstanceOf */ public function testAssertThatIsInstanceOf() { $this->assertThat(new stdClass, $this->isInstanceOf('StdClass')); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::isType */ public function testAssertThatIsType() { $this->assertThat('string', $this->isType('string')); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::isEmpty */ public function testAssertThatIsEmpty() { $this->assertThat([], $this->isEmpty()); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::fileExists */ public function testAssertThatFileExists() { $this->assertThat(__FILE__, $this->fileExists()); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::greaterThan */ public function testAssertThatGreaterThan() { $this->assertThat(2, $this->greaterThan(1)); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::greaterThanOrEqual */ public function testAssertThatGreaterThanOrEqual() { $this->assertThat(2, $this->greaterThanOrEqual(1)); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::lessThan */ public function testAssertThatLessThan() { $this->assertThat(1, $this->lessThan(2)); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::lessThanOrEqual */ public function testAssertThatLessThanOrEqual() { $this->assertThat(1, $this->lessThanOrEqual(2)); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::matchesRegularExpression */ public function testAssertThatMatchesRegularExpression() { $this->assertThat('foobar', $this->matchesRegularExpression('/foo/')); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::callback */ public function testAssertThatCallback() { $this->assertThat( null, $this->callback(function ($other) { return true; }) ); } /** * @covers PHPUnit_Framework_Assert::assertThat * @covers PHPUnit_Framework_Assert::countOf */ public function testAssertThatCountOf() { $this->assertThat([1], $this->countOf(1)); } /** * @covers PHPUnit_Framework_Assert::assertFileEquals */ public function testAssertFileEquals() { $this->assertFileEquals( $this->filesDirectory . 'foo.xml', $this->filesDirectory . 'foo.xml' ); try { $this->assertFileEquals( $this->filesDirectory . 'foo.xml', $this->filesDirectory . 'bar.xml' ); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertFileNotEquals */ public function testAssertFileNotEquals() { $this->assertFileNotEquals( $this->filesDirectory . 'foo.xml', $this->filesDirectory . 'bar.xml' ); try { $this->assertFileNotEquals( $this->filesDirectory . 'foo.xml', $this->filesDirectory . 'foo.xml' ); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertStringEqualsFile */ public function testAssertStringEqualsFile() { $this->assertStringEqualsFile( $this->filesDirectory . 'foo.xml', file_get_contents($this->filesDirectory . 'foo.xml') ); try { $this->assertStringEqualsFile( $this->filesDirectory . 'foo.xml', file_get_contents($this->filesDirectory . 'bar.xml') ); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertStringNotEqualsFile */ public function testAssertStringNotEqualsFile() { $this->assertStringNotEqualsFile( $this->filesDirectory . 'foo.xml', file_get_contents($this->filesDirectory . 'bar.xml') ); try { $this->assertStringNotEqualsFile( $this->filesDirectory . 'foo.xml', file_get_contents($this->filesDirectory . 'foo.xml') ); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertStringStartsWith * @expectedException PHPUnit_Framework_Exception */ public function testAssertStringStartsWithThrowsException() { $this->assertStringStartsWith(null, null); } /** * @covers PHPUnit_Framework_Assert::assertStringStartsWith * @expectedException PHPUnit_Framework_Exception */ public function testAssertStringStartsWithThrowsException2() { $this->assertStringStartsWith('', null); } /** * @covers PHPUnit_Framework_Assert::assertStringStartsNotWith * @expectedException PHPUnit_Framework_Exception */ public function testAssertStringStartsNotWithThrowsException() { $this->assertStringStartsNotWith(null, null); } /** * @covers PHPUnit_Framework_Assert::assertStringStartsNotWith * @expectedException PHPUnit_Framework_Exception */ public function testAssertStringStartsNotWithThrowsException2() { $this->assertStringStartsNotWith('', null); } /** * @covers PHPUnit_Framework_Assert::assertStringEndsWith * @expectedException PHPUnit_Framework_Exception */ public function testAssertStringEndsWithThrowsException() { $this->assertStringEndsWith(null, null); } /** * @covers PHPUnit_Framework_Assert::assertStringEndsWith * @expectedException PHPUnit_Framework_Exception */ public function testAssertStringEndsWithThrowsException2() { $this->assertStringEndsWith('', null); } /** * @covers PHPUnit_Framework_Assert::assertStringEndsNotWith * @expectedException PHPUnit_Framework_Exception */ public function testAssertStringEndsNotWithThrowsException() { $this->assertStringEndsNotWith(null, null); } /** * @covers PHPUnit_Framework_Assert::assertStringEndsNotWith * @expectedException PHPUnit_Framework_Exception */ public function testAssertStringEndsNotWithThrowsException2() { $this->assertStringEndsNotWith('', null); } /** * @covers PHPUnit_Framework_Assert::assertStringStartsWith */ public function testAssertStringStartsWith() { $this->assertStringStartsWith('prefix', 'prefixfoo'); try { $this->assertStringStartsWith('prefix', 'foo'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertStringStartsNotWith */ public function testAssertStringStartsNotWith() { $this->assertStringStartsNotWith('prefix', 'foo'); try { $this->assertStringStartsNotWith('prefix', 'prefixfoo'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertStringEndsWith */ public function testAssertStringEndsWith() { $this->assertStringEndsWith('suffix', 'foosuffix'); try { $this->assertStringEndsWith('suffix', 'foo'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertStringEndsNotWith */ public function testAssertStringEndsNotWith() { $this->assertStringEndsNotWith('suffix', 'foo'); try { $this->assertStringEndsNotWith('suffix', 'foosuffix'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertStringMatchesFormat * @expectedException PHPUnit_Framework_Exception */ public function testAssertStringMatchesFormatRaisesExceptionForInvalidFirstArgument() { $this->assertStringMatchesFormat(null, ''); } /** * @covers PHPUnit_Framework_Assert::assertStringMatchesFormat * @expectedException PHPUnit_Framework_Exception */ public function testAssertStringMatchesFormatRaisesExceptionForInvalidSecondArgument() { $this->assertStringMatchesFormat('', null); } /** * @covers PHPUnit_Framework_Assert::assertStringMatchesFormat */ public function testAssertStringMatchesFormat() { $this->assertStringMatchesFormat('*%s*', '***'); } /** * @covers PHPUnit_Framework_Assert::assertStringMatchesFormat * @expectedException PHPUnit_Framework_AssertionFailedError */ public function testAssertStringMatchesFormatFailure() { $this->assertStringMatchesFormat('*%s*', '**'); } /** * @covers PHPUnit_Framework_Assert::assertStringNotMatchesFormat * @expectedException PHPUnit_Framework_Exception */ public function testAssertStringNotMatchesFormatRaisesExceptionForInvalidFirstArgument() { $this->assertStringNotMatchesFormat(null, ''); } /** * @covers PHPUnit_Framework_Assert::assertStringNotMatchesFormat * @expectedException PHPUnit_Framework_Exception */ public function testAssertStringNotMatchesFormatRaisesExceptionForInvalidSecondArgument() { $this->assertStringNotMatchesFormat('', null); } /** * @covers PHPUnit_Framework_Assert::assertStringNotMatchesFormat */ public function testAssertStringNotMatchesFormat() { $this->assertStringNotMatchesFormat('*%s*', '**'); try { $this->assertStringMatchesFormat('*%s*', '**'); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertEmpty */ public function testAssertEmpty() { $this->assertEmpty([]); try { $this->assertEmpty(['foo']); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotEmpty */ public function testAssertNotEmpty() { $this->assertNotEmpty(['foo']); try { $this->assertNotEmpty([]); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeEmpty */ public function testAssertAttributeEmpty() { $o = new stdClass; $o->a = []; $this->assertAttributeEmpty('a', $o); try { $o->a = ['b']; $this->assertAttributeEmpty('a', $o); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeNotEmpty */ public function testAssertAttributeNotEmpty() { $o = new stdClass; $o->a = ['b']; $this->assertAttributeNotEmpty('a', $o); try { $o->a = []; $this->assertAttributeNotEmpty('a', $o); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::markTestIncomplete */ public function testMarkTestIncomplete() { try { $this->markTestIncomplete('incomplete'); } catch (PHPUnit_Framework_IncompleteTestError $e) { $this->assertEquals('incomplete', $e->getMessage()); return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::markTestSkipped */ public function testMarkTestSkipped() { try { $this->markTestSkipped('skipped'); } catch (PHPUnit_Framework_SkippedTestError $e) { $this->assertEquals('skipped', $e->getMessage()); return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertCount */ public function testAssertCount() { $this->assertCount(2, [1, 2]); try { $this->assertCount(2, [1, 2, 3]); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertCount */ public function testAssertCountTraversable() { $this->assertCount(2, new ArrayIterator([1, 2])); try { $this->assertCount(2, new ArrayIterator([1, 2, 3])); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertCount */ public function testAssertCountThrowsExceptionIfExpectedCountIsNoInteger() { try { $this->assertCount('a', []); } catch (PHPUnit_Framework_Exception $e) { $this->assertEquals('Argument #1 (No Value) of PHPUnit_Framework_Assert::assertCount() must be a integer', $e->getMessage()); return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertCount */ public function testAssertCountThrowsExceptionIfElementIsNotCountable() { try { $this->assertCount(2, ''); } catch (PHPUnit_Framework_Exception $e) { $this->assertEquals('Argument #2 (No Value) of PHPUnit_Framework_Assert::assertCount() must be a countable or traversable', $e->getMessage()); return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertAttributeCount */ public function testAssertAttributeCount() { $o = new stdClass; $o->a = []; $this->assertAttributeCount(0, 'a', $o); } /** * @covers PHPUnit_Framework_Assert::assertNotCount */ public function testAssertNotCount() { $this->assertNotCount(2, [1, 2, 3]); try { $this->assertNotCount(2, [1, 2]); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotCount * @expectedException PHPUnit_Framework_Exception */ public function testAssertNotCountThrowsExceptionIfExpectedCountIsNoInteger() { $this->assertNotCount('a', []); } /** * @covers PHPUnit_Framework_Assert::assertNotCount * @expectedException PHPUnit_Framework_Exception */ public function testAssertNotCountThrowsExceptionIfElementIsNotCountable() { $this->assertNotCount(2, ''); } /** * @covers PHPUnit_Framework_Assert::assertAttributeNotCount */ public function testAssertAttributeNotCount() { $o = new stdClass; $o->a = []; $this->assertAttributeNotCount(1, 'a', $o); } /** * @covers PHPUnit_Framework_Assert::assertSameSize */ public function testAssertSameSize() { $this->assertSameSize([1, 2], [3, 4]); try { $this->assertSameSize([1, 2], [1, 2, 3]); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertSameSize */ public function testAssertSameSizeThrowsExceptionIfExpectedIsNotCountable() { try { $this->assertSameSize('a', []); } catch (PHPUnit_Framework_Exception $e) { $this->assertEquals('Argument #1 (No Value) of PHPUnit_Framework_Assert::assertSameSize() must be a countable or traversable', $e->getMessage()); return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertSameSize */ public function testAssertSameSizeThrowsExceptionIfActualIsNotCountable() { try { $this->assertSameSize([], ''); } catch (PHPUnit_Framework_Exception $e) { $this->assertEquals('Argument #2 (No Value) of PHPUnit_Framework_Assert::assertSameSize() must be a countable or traversable', $e->getMessage()); return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotSameSize */ public function testAssertNotSameSize() { $this->assertNotSameSize([1, 2], [1, 2, 3]); try { $this->assertNotSameSize([1, 2], [3, 4]); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotSameSize * @expectedException PHPUnit_Framework_Exception */ public function testAssertNotSameSizeThrowsExceptionIfExpectedIsNotCountable() { $this->assertNotSameSize('a', []); } /** * @covers PHPUnit_Framework_Assert::assertNotSameSize * @expectedException PHPUnit_Framework_Exception */ public function testAssertNotSameSizeThrowsExceptionIfActualIsNotCountable() { $this->assertNotSameSize([], ''); } /** * @covers PHPUnit_Framework_Assert::assertJson * @expectedException PHPUnit_Framework_Exception */ public function testAssertJsonRaisesExceptionForInvalidArgument() { $this->assertJson(null); } /** * @covers PHPUnit_Framework_Assert::assertJson */ public function testAssertJson() { $this->assertJson('{}'); } /** * @covers PHPUnit_Framework_Assert::assertJsonStringEqualsJsonString */ public function testAssertJsonStringEqualsJsonString() { $expected = '{"Mascott" : "Tux"}'; $actual = '{"Mascott" : "Tux"}'; $message = 'Given Json strings do not match'; $this->assertJsonStringEqualsJsonString($expected, $actual, $message); } /** * @dataProvider validInvalidJsonDataprovider * @covers PHPUnit_Framework_Assert::assertJsonStringEqualsJsonString */ public function testAssertJsonStringEqualsJsonStringErrorRaised($expected, $actual) { try { $this->assertJsonStringEqualsJsonString($expected, $actual); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail('Expected exception not found'); } /** * @covers PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonString */ public function testAssertJsonStringNotEqualsJsonString() { $expected = '{"Mascott" : "Beastie"}'; $actual = '{"Mascott" : "Tux"}'; $message = 'Given Json strings do match'; $this->assertJsonStringNotEqualsJsonString($expected, $actual, $message); } /** * @dataProvider validInvalidJsonDataprovider * @covers PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonString */ public function testAssertJsonStringNotEqualsJsonStringErrorRaised($expected, $actual) { try { $this->assertJsonStringNotEqualsJsonString($expected, $actual); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail('Expected exception not found'); } /** * @covers PHPUnit_Framework_Assert::assertJsonStringEqualsJsonFile */ public function testAssertJsonStringEqualsJsonFile() { $file = __DIR__ . '/../_files/JsonData/simpleObject.json'; $actual = json_encode(['Mascott' => 'Tux']); $message = ''; $this->assertJsonStringEqualsJsonFile($file, $actual, $message); } /** * @covers PHPUnit_Framework_Assert::assertJsonStringEqualsJsonFile */ public function testAssertJsonStringEqualsJsonFileExpectingExpectationFailedException() { $file = __DIR__ . '/../_files/JsonData/simpleObject.json'; $actual = json_encode(['Mascott' => 'Beastie']); $message = ''; try { $this->assertJsonStringEqualsJsonFile($file, $actual, $message); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( 'Failed asserting that \'{"Mascott":"Beastie"}\' matches JSON string "{"Mascott":"Tux"}".', $e->getMessage() ); return; } $this->fail('Expected Exception not thrown.'); } /** * @covers PHPUnit_Framework_Assert::assertJsonStringEqualsJsonFile */ public function testAssertJsonStringEqualsJsonFileExpectingException() { $file = __DIR__ . '/../_files/JsonData/simpleObject.json'; try { $this->assertJsonStringEqualsJsonFile($file, null); } catch (PHPUnit_Framework_Exception $e) { return; } $this->fail('Expected Exception not thrown.'); } /** * @covers PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonFile */ public function testAssertJsonStringNotEqualsJsonFile() { $file = __DIR__ . '/../_files/JsonData/simpleObject.json'; $actual = json_encode(['Mascott' => 'Beastie']); $message = ''; $this->assertJsonStringNotEqualsJsonFile($file, $actual, $message); } /** * @covers PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonFile */ public function testAssertJsonStringNotEqualsJsonFileExpectingException() { $file = __DIR__ . '/../_files/JsonData/simpleObject.json'; try { $this->assertJsonStringNotEqualsJsonFile($file, null); } catch (PHPUnit_Framework_Exception $e) { return; } $this->fail('Expected exception not found.'); } /** * @covers PHPUnit_Framework_Assert::assertJsonFileNotEqualsJsonFile */ public function testAssertJsonFileNotEqualsJsonFile() { $fileExpected = __DIR__ . '/../_files/JsonData/simpleObject.json'; $fileActual = __DIR__ . '/../_files/JsonData/arrayObject.json'; $message = ''; $this->assertJsonFileNotEqualsJsonFile($fileExpected, $fileActual, $message); } /** * @covers PHPUnit_Framework_Assert::assertJsonFileEqualsJsonFile */ public function testAssertJsonFileEqualsJsonFile() { $file = __DIR__ . '/../_files/JsonData/simpleObject.json'; $message = ''; $this->assertJsonFileEqualsJsonFile($file, $file, $message); } /** * @covers PHPUnit_Framework_Assert::assertInstanceOf */ public function testAssertInstanceOf() { $this->assertInstanceOf('stdClass', new stdClass); try { $this->assertInstanceOf('Exception', new stdClass); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertInstanceOf * @expectedException PHPUnit_Framework_Exception */ public function testAssertInstanceOfThrowsExceptionForInvalidArgument() { $this->assertInstanceOf(null, new stdClass); } /** * @covers PHPUnit_Framework_Assert::assertAttributeInstanceOf */ public function testAssertAttributeInstanceOf() { $o = new stdClass; $o->a = new stdClass; $this->assertAttributeInstanceOf('stdClass', 'a', $o); } /** * @covers PHPUnit_Framework_Assert::assertNotInstanceOf */ public function testAssertNotInstanceOf() { $this->assertNotInstanceOf('Exception', new stdClass); try { $this->assertNotInstanceOf('stdClass', new stdClass); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotInstanceOf * @expectedException PHPUnit_Framework_Exception */ public function testAssertNotInstanceOfThrowsExceptionForInvalidArgument() { $this->assertNotInstanceOf(null, new stdClass); } /** * @covers PHPUnit_Framework_Assert::assertAttributeNotInstanceOf */ public function testAssertAttributeNotInstanceOf() { $o = new stdClass; $o->a = new stdClass; $this->assertAttributeNotInstanceOf('Exception', 'a', $o); } /** * @covers PHPUnit_Framework_Assert::assertInternalType */ public function testAssertInternalType() { $this->assertInternalType('integer', 1); try { $this->assertInternalType('string', 1); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertInternalType */ public function testAssertInternalTypeDouble() { $this->assertInternalType('double', 1.0); try { $this->assertInternalType('double', 1); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertInternalType * @expectedException PHPUnit_Framework_Exception */ public function testAssertInternalTypeThrowsExceptionForInvalidArgument() { $this->assertInternalType(null, 1); } /** * @covers PHPUnit_Framework_Assert::assertAttributeInternalType */ public function testAssertAttributeInternalType() { $o = new stdClass; $o->a = 1; $this->assertAttributeInternalType('integer', 'a', $o); } /** * @covers PHPUnit_Framework_Assert::assertNotInternalType */ public function testAssertNotInternalType() { $this->assertNotInternalType('string', 1); try { $this->assertNotInternalType('integer', 1); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertNotInternalType * @expectedException PHPUnit_Framework_Exception */ public function testAssertNotInternalTypeThrowsExceptionForInvalidArgument() { $this->assertNotInternalType(null, 1); } /** * @covers PHPUnit_Framework_Assert::assertAttributeNotInternalType */ public function testAssertAttributeNotInternalType() { $o = new stdClass; $o->a = 1; $this->assertAttributeNotInternalType('string', 'a', $o); } /** * @covers PHPUnit_Framework_Assert::assertStringMatchesFormatFile * @expectedException PHPUnit_Framework_Exception */ public function testAssertStringMatchesFormatFileThrowsExceptionForInvalidArgument() { $this->assertStringMatchesFormatFile('not_existing_file', ''); } /** * @covers PHPUnit_Framework_Assert::assertStringMatchesFormatFile * @expectedException PHPUnit_Framework_Exception */ public function testAssertStringMatchesFormatFileThrowsExceptionForInvalidArgument2() { $this->assertStringMatchesFormatFile($this->filesDirectory . 'expectedFileFormat.txt', null); } /** * @covers PHPUnit_Framework_Assert::assertStringMatchesFormatFile */ public function testAssertStringMatchesFormatFile() { $this->assertStringMatchesFormatFile($this->filesDirectory . 'expectedFileFormat.txt', "FOO\n"); try { $this->assertStringMatchesFormatFile($this->filesDirectory . 'expectedFileFormat.txt', "BAR\n"); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @covers PHPUnit_Framework_Assert::assertStringNotMatchesFormatFile * @expectedException PHPUnit_Framework_Exception */ public function testAssertStringNotMatchesFormatFileThrowsExceptionForInvalidArgument() { $this->assertStringNotMatchesFormatFile('not_existing_file', ''); } /** * @covers PHPUnit_Framework_Assert::assertStringNotMatchesFormatFile * @expectedException PHPUnit_Framework_Exception */ public function testAssertStringNotMatchesFormatFileThrowsExceptionForInvalidArgument2() { $this->assertStringNotMatchesFormatFile($this->filesDirectory . 'expectedFileFormat.txt', null); } /** * @covers PHPUnit_Framework_Assert::assertStringNotMatchesFormatFile */ public function testAssertStringNotMatchesFormatFile() { $this->assertStringNotMatchesFormatFile($this->filesDirectory . 'expectedFileFormat.txt', "BAR\n"); try { $this->assertStringNotMatchesFormatFile($this->filesDirectory . 'expectedFileFormat.txt', "FOO\n"); } catch (PHPUnit_Framework_AssertionFailedError $e) { return; } $this->fail(); } /** * @return array */ public static function validInvalidJsonDataprovider() { return [ 'error syntax in expected JSON' => ['{"Mascott"::}', '{"Mascott" : "Tux"}'], 'error UTF-8 in actual JSON' => ['{"Mascott" : "Tux"}', '{"Mascott" : :}'], ]; } } phpunit-5.1.3/tests/Framework/BaseTestListenerTest.php000066400000000000000000000015061263222771600231110ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 4.0.0 */ class Framework_BaseTestListenerTest extends PHPUnit_Framework_TestCase { /** * @var PHPUnit_Framework_TestResult */ private $result; /** * @covers PHPUnit_Framework_TestResult */ public function testEndEventsAreCounted() { $this->result = new PHPUnit_Framework_TestResult; $listener = new BaseTestListenerSample(); $this->result->addListener($listener); $test = new Success; $test->run($this->result); $this->assertEquals(1, $listener->endCount); } } phpunit-5.1.3/tests/Framework/Constraint/000077500000000000000000000000001263222771600204425ustar00rootroot00000000000000phpunit-5.1.3/tests/Framework/Constraint/CountTest.php000066400000000000000000000037021263222771600231050ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 3.7.30 * @covers PHPUnit_Framework_Constraint_Count */ class CountTest extends PHPUnit_Framework_TestCase { public function testCount() { $countConstraint = new PHPUnit_Framework_Constraint_Count(3); $this->assertTrue($countConstraint->evaluate([1, 2, 3], '', true)); $countConstraint = new PHPUnit_Framework_Constraint_Count(0); $this->assertTrue($countConstraint->evaluate([], '', true)); $countConstraint = new PHPUnit_Framework_Constraint_Count(2); $it = new TestIterator([1, 2]); $this->assertTrue($countConstraint->evaluate($it, '', true)); } public function testCountDoesNotChangeIteratorKey() { $countConstraint = new PHPUnit_Framework_Constraint_Count(2); // test with 1st implementation of Iterator $it = new TestIterator([1, 2]); $countConstraint->evaluate($it, '', true); $this->assertEquals(1, $it->current()); $it->next(); $countConstraint->evaluate($it, '', true); $this->assertEquals(2, $it->current()); $it->next(); $countConstraint->evaluate($it, '', true); $this->assertFalse($it->valid()); // test with 2nd implementation of Iterator $it = new TestIterator2([1, 2]); $countConstraint = new PHPUnit_Framework_Constraint_Count(2); $countConstraint->evaluate($it, '', true); $this->assertEquals(1, $it->current()); $it->next(); $countConstraint->evaluate($it, '', true); $this->assertEquals(2, $it->current()); $it->next(); $countConstraint->evaluate($it, '', true); $this->assertFalse($it->valid()); } } phpunit-5.1.3/tests/Framework/Constraint/ExceptionMessageRegExpTest.php000066400000000000000000000030261263222771600263720ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 4.3.0 * @covers PHPUnit_Framework_Constraint_ExceptionMessageRegExp */ class ExceptionMessageRegExpTest extends PHPUnit_Framework_TestCase { /** * @expectedException \Exception * @expectedExceptionMessageRegExp /^A polymorphic \w+ message/ */ public function testRegexMessage() { throw new Exception('A polymorphic exception message'); } /** * @expectedException \Exception * @expectedExceptionMessageRegExp /^a poly[a-z]+ [a-zA-Z0-9_]+ me(s){2}age$/i */ public function testRegexMessageExtreme() { throw new Exception('A polymorphic exception message'); } /** * @runInSeparateProcess * @requires extension xdebug * @expectedException \Exception * @expectedExceptionMessageRegExp #Screaming preg_match# */ public function testMessageXdebugScreamCompatibility() { ini_set('xdebug.scream', '1'); throw new Exception('Screaming preg_match'); } /** * @coversNothing * @expectedException \Exception variadic * @expectedExceptionMessageRegExp /^A variadic \w+ message/ */ public function testSimultaneousLiteralAndRegExpExceptionMessage() { throw new Exception('A variadic exception message'); } } phpunit-5.1.3/tests/Framework/Constraint/ExceptionMessageTest.php000066400000000000000000000024241263222771600252600ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 4.0.20 * @covers PHPUnit_Framework_Constraint_ExceptionMessage */ class ExceptionMessageTest extends PHPUnit_Framework_TestCase { /** * @expectedException \Exception * @expectedExceptionMessage A literal exception message */ public function testLiteralMessage() { throw new Exception('A literal exception message'); } /** * @expectedException \Exception * @expectedExceptionMessage A partial */ public function testPatialMessageBegin() { throw new Exception('A partial exception message'); } /** * @expectedException \Exception * @expectedExceptionMessage partial exception */ public function testPatialMessageMiddle() { throw new Exception('A partial exception message'); } /** * @expectedException \Exception * @expectedExceptionMessage exception message */ public function testPatialMessageEnd() { throw new Exception('A partial exception message'); } } phpunit-5.1.3/tests/Framework/Constraint/IsJsonTest.php000066400000000000000000000017651263222771600232310ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ class Framework_Constraint_IsJsonTest extends PHPUnit_Framework_TestCase { /** * @dataProvider evaluateDataprovider * @covers PHPUnit_Framework_Constraint_IsJson::evaluate * @covers PHPUnit_Framework_Constraint_IsJson::matches * @covers PHPUnit_Framework_Constraint_IsJson::__construct */ public function testEvaluate($expected, $jsonOther) { $constraint = new PHPUnit_Framework_Constraint_IsJson(); $this->assertEquals($expected, $constraint->evaluate($jsonOther, '', true)); } public static function evaluateDataprovider() { return [ 'valid JSON' => [true, '{}'], 'empty string should be treated as invalid JSON' => [false, ''], ]; } } phpunit-5.1.3/tests/Framework/Constraint/JsonMatches/000077500000000000000000000000001263222771600226605ustar00rootroot00000000000000phpunit-5.1.3/tests/Framework/Constraint/JsonMatches/ErrorMessageProviderTest.php000066400000000000000000000052101263222771600303400ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since File available since Release 3.7.0 */ class Framework_Constraint_JsonMatches_ErrorMessageProviderTest extends PHPUnit_Framework_TestCase { /** * @dataProvider translateTypeToPrefixDataprovider * @covers PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::translateTypeToPrefix */ public function testTranslateTypeToPrefix($expected, $type) { $this->assertEquals( $expected, PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::translateTypeToPrefix($type) ); } /** * @dataProvider determineJsonErrorDataprovider * @covers PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::determineJsonError */ public function testDetermineJsonError($expected, $error, $prefix) { $this->assertEquals( $expected, PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::determineJsonError( $error, $prefix ) ); } public static function determineJsonErrorDataprovider() { return [ 'JSON_ERROR_NONE' => [ null, 'json_error_none', '' ], 'JSON_ERROR_DEPTH' => [ 'Maximum stack depth exceeded', JSON_ERROR_DEPTH, '' ], 'prefixed JSON_ERROR_DEPTH' => [ 'TUX: Maximum stack depth exceeded', JSON_ERROR_DEPTH, 'TUX: ' ], 'JSON_ERROR_STATE_MISMatch' => [ 'Underflow or the modes mismatch', JSON_ERROR_STATE_MISMATCH, '' ], 'JSON_ERROR_CTRL_CHAR' => [ 'Unexpected control character found', JSON_ERROR_CTRL_CHAR, '' ], 'JSON_ERROR_SYNTAX' => [ 'Syntax error, malformed JSON', JSON_ERROR_SYNTAX, '' ], 'JSON_ERROR_UTF8`' => [ 'Malformed UTF-8 characters, possibly incorrectly encoded', JSON_ERROR_UTF8, '' ], 'Invalid error indicator' => [ 'Unknown error', 55, '' ], ]; } public static function translateTypeToPrefixDataprovider() { return [ 'expected' => ['Expected value JSON decode error - ', 'expected'], 'actual' => ['Actual value JSON decode error - ', 'actual'], 'default' => ['', ''], ]; } } phpunit-5.1.3/tests/Framework/Constraint/JsonMatchesTest.php000066400000000000000000000035471263222771600242420ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since File available since Release 3.7.0 */ class Framework_Constraint_JsonMatchesTest extends PHPUnit_Framework_TestCase { /** * @dataProvider evaluateDataprovider * @covers PHPUnit_Framework_Constraint_JsonMatches::evaluate * @covers PHPUnit_Framework_Constraint_JsonMatches::matches * @covers PHPUnit_Framework_Constraint_JsonMatches::__construct */ public function testEvaluate($expected, $jsonOther, $jsonValue) { $constraint = new PHPUnit_Framework_Constraint_JsonMatches($jsonValue); $this->assertEquals($expected, $constraint->evaluate($jsonOther, '', true)); } /** * @covers PHPUnit_Framework_Constraint_JsonMatches::toString */ public function testToString() { $jsonValue = json_encode(['Mascott' => 'Tux']); $constraint = new PHPUnit_Framework_Constraint_JsonMatches($jsonValue); $this->assertEquals('matches JSON string "' . $jsonValue . '"', $constraint->toString()); } public static function evaluateDataprovider() { return [ 'valid JSON' => [true, json_encode(['Mascott' => 'Tux']), json_encode(['Mascott' => 'Tux'])], 'error syntax' => [false, '{"Mascott"::}', json_encode(['Mascott' => 'Tux'])], 'error UTF-8' => [false, json_encode('\xB1\x31'), json_encode(['Mascott' => 'Tux'])], 'invalid JSON in class instantiation' => [false, json_encode(['Mascott' => 'Tux']), '{"Mascott"::}'], ]; } } phpunit-5.1.3/tests/Framework/ConstraintTest.php000066400000000000000000003145161263222771600220250ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 3.0.0 */ class Framework_ConstraintTest extends PHPUnit_Framework_TestCase { /** * @covers PHPUnit_Framework_Constraint_ArrayHasKey * @covers PHPUnit_Framework_Assert::arrayHasKey * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintArrayHasKey() { $constraint = PHPUnit_Framework_Assert::arrayHasKey(0); $this->assertFalse($constraint->evaluate([], '', true)); $this->assertEquals('has the key 0', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate([]); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_ArrayHasKey * @covers PHPUnit_Framework_Assert::arrayHasKey * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintArrayHasKey2() { $constraint = PHPUnit_Framework_Assert::arrayHasKey(0); try { $constraint->evaluate([], 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_ArrayHasKey * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::arrayHasKey * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintArrayNotHasKey() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::arrayHasKey(0) ); $this->assertFalse($constraint->evaluate([0 => 1], '', true)); $this->assertEquals('does not have the key 0', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate([0 => 1]); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_ArrayHasKey * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::arrayHasKey * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintArrayNotHasKey2() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::arrayHasKey(0) ); try { $constraint->evaluate([0], 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_FileExists * @covers PHPUnit_Framework_Assert::fileExists * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintFileExists() { $constraint = PHPUnit_Framework_Assert::fileExists(); $this->assertFalse($constraint->evaluate('foo', '', true)); $this->assertEquals('file exists', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate('foo'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_FileExists * @covers PHPUnit_Framework_Assert::fileExists * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintFileExists2() { $constraint = PHPUnit_Framework_Assert::fileExists(); try { $constraint->evaluate('foo', 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_FileExists * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_Assert::fileExists * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintFileNotExists() { $file = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ClassWithNonPublicAttributes.php'; $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::fileExists() ); $this->assertFalse($constraint->evaluate($file, '', true)); $this->assertEquals('file does not exist', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate($file); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_FileExists * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_Assert::fileExists * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintFileNotExists2() { $file = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ClassWithNonPublicAttributes.php'; $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::fileExists() ); try { $constraint->evaluate($file, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_GreaterThan * @covers PHPUnit_Framework_Assert::greaterThan * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintGreaterThan() { $constraint = PHPUnit_Framework_Assert::greaterThan(1); $this->assertFalse($constraint->evaluate(0, '', true)); $this->assertTrue($constraint->evaluate(2, '', true)); $this->assertEquals('is greater than 1', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate(0); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_GreaterThan * @covers PHPUnit_Framework_Assert::greaterThan * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintGreaterThan2() { $constraint = PHPUnit_Framework_Assert::greaterThan(1); try { $constraint->evaluate(0, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_GreaterThan * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::greaterThan * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintNotGreaterThan() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::greaterThan(1) ); $this->assertTrue($constraint->evaluate(1, '', true)); $this->assertEquals('is not greater than 1', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate(2); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_GreaterThan * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::greaterThan * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintNotGreaterThan2() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::greaterThan(1) ); try { $constraint->evaluate(2, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsEqual * @covers PHPUnit_Framework_Constraint_GreaterThan * @covers PHPUnit_Framework_Constraint_Or * @covers PHPUnit_Framework_Assert::greaterThanOrEqual * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintGreaterThanOrEqual() { $constraint = PHPUnit_Framework_Assert::greaterThanOrEqual(1); $this->assertTrue($constraint->evaluate(1, '', true)); $this->assertFalse($constraint->evaluate(0, '', true)); $this->assertEquals('is equal to 1 or is greater than 1', $constraint->toString()); $this->assertEquals(2, count($constraint)); try { $constraint->evaluate(0); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsEqual * @covers PHPUnit_Framework_Constraint_GreaterThan * @covers PHPUnit_Framework_Constraint_Or * @covers PHPUnit_Framework_Assert::greaterThanOrEqual * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintGreaterThanOrEqual2() { $constraint = PHPUnit_Framework_Assert::greaterThanOrEqual(1); try { $constraint->evaluate(0, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsEqual * @covers PHPUnit_Framework_Constraint_GreaterThan * @covers PHPUnit_Framework_Constraint_Or * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::greaterThanOrEqual * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintNotGreaterThanOrEqual() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::greaterThanOrEqual(1) ); $this->assertFalse($constraint->evaluate(1, '', true)); $this->assertEquals('not( is equal to 1 or is greater than 1 )', $constraint->toString()); $this->assertEquals(2, count($constraint)); try { $constraint->evaluate(1); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsEqual * @covers PHPUnit_Framework_Constraint_GreaterThan * @covers PHPUnit_Framework_Constraint_Or * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::greaterThanOrEqual * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintNotGreaterThanOrEqual2() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::greaterThanOrEqual(1) ); try { $constraint->evaluate(1, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsAnything * @covers PHPUnit_Framework_Assert::anything * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsAnything() { $constraint = PHPUnit_Framework_Assert::anything(); $this->assertTrue($constraint->evaluate(null, '', true)); $this->assertNull($constraint->evaluate(null)); $this->assertEquals('is anything', $constraint->toString()); $this->assertEquals(0, count($constraint)); } /** * @covers PHPUnit_Framework_Constraint_IsAnything * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::anything * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintNotIsAnything() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::anything() ); $this->assertFalse($constraint->evaluate(null, '', true)); $this->assertEquals('is not anything', $constraint->toString()); $this->assertEquals(0, count($constraint)); try { $constraint->evaluate(null); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsEqual * @covers PHPUnit_Framework_Assert::equalTo * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsEqual() { $constraint = PHPUnit_Framework_Assert::equalTo(1); $this->assertTrue($constraint->evaluate(1, '', true)); $this->assertFalse($constraint->evaluate(0, '', true)); $this->assertEquals('is equal to 1', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate(0); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } public function isEqualProvider() { $a = new stdClass; $a->foo = 'bar'; $b = new stdClass; $ahash = spl_object_hash($a); $bhash = spl_object_hash($b); $c = new stdClass; $c->foo = 'bar'; $c->int = 1; $c->array = [0, [1], [2], 3]; $c->related = new stdClass; $c->related->foo = "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk"; $c->self = $c; $c->c = $c; $d = new stdClass; $d->foo = 'bar'; $d->int = 2; $d->array = [0, [4], [2], 3]; $d->related = new stdClass; $d->related->foo = "a\np\nc\nd\ne\nf\ng\nh\ni\nw\nk"; $d->self = $d; $d->c = $c; $storage1 = new SplObjectStorage; $storage1->attach($a); $storage1->attach($b); $storage2 = new SplObjectStorage; $storage2->attach($b); $storage1hash = spl_object_hash($storage1); $storage2hash = spl_object_hash($storage2); $dom1 = new DOMDocument; $dom1->preserveWhiteSpace = false; $dom1->loadXML(''); $dom2 = new DOMDocument; $dom2->preserveWhiteSpace = false; $dom2->loadXML(''); $data = [ [1, 0, << 0 + 0 => 1 ) EOF ], [[true], ['true'], << true + 0 => 'true' ) EOF ], [[0, [1], [2], 3], [0, [4], [2], 3], << 0 1 => Array ( - 0 => 1 + 0 => 4 ) 2 => Array (...) 3 => 3 ) EOF ], [$a, [0], << 'bar' ) EOF ], [$c, $d, << 'bar' - 'int' => 1 + 'int' => 2 'array' => Array ( 0 => 0 1 => Array ( - 0 => 1 + 0 => 4 @@ @@ 'foo' => 'a - b + p @@ @@ i - j + w k' ) 'self' => stdClass Object (...) 'c' => stdClass Object (...) ) EOF ], [$dom1, $dom2, << - + + + EOF ], [ new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/Chicago')), << Array &0 ( - 'obj' => stdClass Object &$ahash ( - 'foo' => 'bar' - ) +SplObjectStorage Object &$storage2hash ( + '$bhash' => Array &0 ( + 'obj' => stdClass Object &$bhash () 'inf' => null ) - '$bhash' => Array &0 ) EOF ]; } else { $data[] = [$storage1, $storage2, << Array &0 ( - 'obj' => stdClass Object &$ahash ( - 'foo' => 'bar' - ) +SplObjectStorage Object &$storage2hash ( + '$bhash' => Array &0 ( + 'obj' => stdClass Object &$bhash () 'inf' => null ) - '$bhash' => Array &0 ) EOF ]; } return $data; } /** * @dataProvider isEqualProvider * @covers PHPUnit_Framework_Constraint_IsEqual * @covers PHPUnit_Framework_Assert::equalTo * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsEqual2($expected, $actual, $message) { $constraint = PHPUnit_Framework_Assert::equalTo($expected); try { $constraint->evaluate($actual, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( "custom message\n$message", $this->trimnl(PHPUnit_Framework_TestFailure::exceptionToString($e)) ); return; } $this->fail(); } /** * @covers PHPUnit_Framework_Constraint_IsEqual * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::equalTo * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsNotEqual() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::equalTo(1) ); $this->assertTrue($constraint->evaluate(0, '', true)); $this->assertFalse($constraint->evaluate(1, '', true)); $this->assertEquals('is not equal to 1', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate(1); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsEqual * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::equalTo * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsNotEqual2() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::equalTo(1) ); try { $constraint->evaluate(1, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsIdentical * @covers PHPUnit_Framework_Assert::identicalTo * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsIdentical() { $a = new stdClass; $b = new stdClass; $constraint = PHPUnit_Framework_Assert::identicalTo($a); $this->assertFalse($constraint->evaluate($b, '', true)); $this->assertTrue($constraint->evaluate($a, '', true)); $this->assertEquals('is identical to an object of class "stdClass"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate($b); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsIdentical * @covers PHPUnit_Framework_Assert::identicalTo * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsIdentical2() { $a = new stdClass; $b = new stdClass; $constraint = PHPUnit_Framework_Assert::identicalTo($a); try { $constraint->evaluate($b, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsIdentical * @covers PHPUnit_Framework_Assert::identicalTo * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsIdentical3() { $constraint = PHPUnit_Framework_Assert::identicalTo('a'); try { $constraint->evaluate('b', 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsIdentical * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::identicalTo * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsNotIdentical() { $a = new stdClass; $b = new stdClass; $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::identicalTo($a) ); $this->assertTrue($constraint->evaluate($b, '', true)); $this->assertFalse($constraint->evaluate($a, '', true)); $this->assertEquals('is not identical to an object of class "stdClass"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate($a); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<trimnl(PHPUnit_Framework_TestFailure::exceptionToString($e)) ); return; } $this->fail(); } /** * @covers PHPUnit_Framework_Constraint_IsIdentical * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::identicalTo * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsNotIdentical2() { $a = new stdClass; $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::identicalTo($a) ); try { $constraint->evaluate($a, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsIdentical * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::identicalTo * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsNotIdentical3() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::identicalTo('a') ); try { $constraint->evaluate('a', 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<trimnl(PHPUnit_Framework_TestFailure::exceptionToString($e)) ); return; } $this->fail(); } /** * @covers PHPUnit_Framework_Constraint_IsInstanceOf * @covers PHPUnit_Framework_Assert::isInstanceOf * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsInstanceOf() { $constraint = PHPUnit_Framework_Assert::isInstanceOf('Exception'); $this->assertFalse($constraint->evaluate(new stdClass, '', true)); $this->assertTrue($constraint->evaluate(new Exception, '', true)); $this->assertEquals('is instance of class "Exception"', $constraint->toString()); $this->assertEquals(1, count($constraint)); $interfaceConstraint = PHPUnit_Framework_Assert::isInstanceOf('Countable'); $this->assertFalse($interfaceConstraint->evaluate(new stdClass, '', true)); $this->assertTrue($interfaceConstraint->evaluate(new ArrayObject, '', true)); $this->assertEquals('is instance of interface "Countable"', $interfaceConstraint->toString()); try { $constraint->evaluate(new stdClass); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsInstanceOf * @covers PHPUnit_Framework_Assert::isInstanceOf * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsInstanceOf2() { $constraint = PHPUnit_Framework_Assert::isInstanceOf('Exception'); try { $constraint->evaluate(new stdClass, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsInstanceOf * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::isInstanceOf * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsNotInstanceOf() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::isInstanceOf('stdClass') ); $this->assertFalse($constraint->evaluate(new stdClass, '', true)); $this->assertTrue($constraint->evaluate(new Exception, '', true)); $this->assertEquals('is not instance of class "stdClass"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate(new stdClass); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsInstanceOf * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::isInstanceOf * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsNotInstanceOf2() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::isInstanceOf('stdClass') ); try { $constraint->evaluate(new stdClass, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsType * @covers PHPUnit_Framework_Assert::isType * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsType() { $constraint = PHPUnit_Framework_Assert::isType('string'); $this->assertFalse($constraint->evaluate(0, '', true)); $this->assertTrue($constraint->evaluate('', '', true)); $this->assertEquals('is of type "string"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate(new stdClass); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertStringMatchesFormat(<<trimnl(PHPUnit_Framework_TestFailure::exceptionToString($e)) ); return; } $this->fail(); } /** * @covers PHPUnit_Framework_Constraint_IsType * @covers PHPUnit_Framework_Assert::isType * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsType2() { $constraint = PHPUnit_Framework_Assert::isType('string'); try { $constraint->evaluate(new stdClass, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertStringMatchesFormat(<<trimnl(PHPUnit_Framework_TestFailure::exceptionToString($e)) ); return; } $this->fail(); } public function resources() { $fh = fopen(__FILE__, 'r'); fclose($fh); return [ 'open resource' => [fopen(__FILE__, 'r')], 'closed resource' => [$fh], ]; } /** * @dataProvider resources * @covers PHPUnit_Framework_Constraint_IsType * @covers PHPUnit_Framework_Assert::isType */ public function testConstraintIsResourceTypeEvaluatesCorrectlyWithResources($resource) { $constraint = PHPUnit_Framework_Assert::isType('resource'); $this->assertTrue($constraint->evaluate($resource, '', true)); @fclose($resource); } /** * @covers PHPUnit_Framework_Constraint_IsType * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::isType * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsNotType() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::isType('string') ); $this->assertTrue($constraint->evaluate(0, '', true)); $this->assertFalse($constraint->evaluate('', '', true)); $this->assertEquals('is not of type "string"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate(''); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsType * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::isType * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsNotType2() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::isType('string') ); try { $constraint->evaluate('', 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsNull * @covers PHPUnit_Framework_Assert::isNull * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsNull() { $constraint = PHPUnit_Framework_Assert::isNull(); $this->assertFalse($constraint->evaluate(0, '', true)); $this->assertTrue($constraint->evaluate(null, '', true)); $this->assertEquals('is null', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate(0); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsNull * @covers PHPUnit_Framework_Assert::isNull * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsNull2() { $constraint = PHPUnit_Framework_Assert::isNull(); try { $constraint->evaluate(0, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsNull * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::isNull * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsNotNull() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::isNull() ); $this->assertFalse($constraint->evaluate(null, '', true)); $this->assertTrue($constraint->evaluate(0, '', true)); $this->assertEquals('is not null', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate(null); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsNull * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::isNull * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsNotNull2() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::isNull() ); try { $constraint->evaluate(null, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_LessThan * @covers PHPUnit_Framework_Assert::lessThan * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintLessThan() { $constraint = PHPUnit_Framework_Assert::lessThan(1); $this->assertTrue($constraint->evaluate(0, '', true)); $this->assertFalse($constraint->evaluate(1, '', true)); $this->assertEquals('is less than 1', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate(1); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_LessThan * @covers PHPUnit_Framework_Assert::lessThan * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintLessThan2() { $constraint = PHPUnit_Framework_Assert::lessThan(1); try { $constraint->evaluate(1, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_LessThan * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::lessThan * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintNotLessThan() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::lessThan(1) ); $this->assertTrue($constraint->evaluate(1, '', true)); $this->assertFalse($constraint->evaluate(0, '', true)); $this->assertEquals('is not less than 1', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate(0); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_LessThan * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::lessThan * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintNotLessThan2() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::lessThan(1) ); try { $constraint->evaluate(0, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsEqual * @covers PHPUnit_Framework_Constraint_LessThan * @covers PHPUnit_Framework_Constraint_Or * @covers PHPUnit_Framework_Assert::lessThanOrEqual * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintLessThanOrEqual() { $constraint = PHPUnit_Framework_Assert::lessThanOrEqual(1); $this->assertTrue($constraint->evaluate(1, '', true)); $this->assertFalse($constraint->evaluate(2, '', true)); $this->assertEquals('is equal to 1 or is less than 1', $constraint->toString()); $this->assertEquals(2, count($constraint)); try { $constraint->evaluate(2); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_Callback */ public function testConstraintCallback() { $closureReflect = function ($parameter) { return $parameter; }; $closureWithoutParameter = function () { return true; }; $constraint = PHPUnit_Framework_Assert::callback($closureWithoutParameter); $this->assertTrue($constraint->evaluate('', '', true)); $constraint = PHPUnit_Framework_Assert::callback($closureReflect); $this->assertTrue($constraint->evaluate(true, '', true)); $this->assertFalse($constraint->evaluate(false, '', true)); $callback = [$this, 'callbackReturningTrue']; $constraint = PHPUnit_Framework_Assert::callback($callback); $this->assertTrue($constraint->evaluate(false, '', true)); $callback = ['Framework_ConstraintTest', 'staticCallbackReturningTrue']; $constraint = PHPUnit_Framework_Assert::callback($callback); $this->assertTrue($constraint->evaluate(null, '', true)); $this->assertEquals('is accepted by specified callback', $constraint->toString()); } /** * @covers PHPUnit_Framework_Constraint_Callback * @expectedException PHPUnit_Framework_ExpectationFailedException * @expectedExceptionMessage Failed asserting that 'This fails' is accepted by specified callback. */ public function testConstraintCallbackFailure() { $constraint = PHPUnit_Framework_Assert::callback(function () { return false; }); $constraint->evaluate('This fails'); } public function callbackReturningTrue() { return true; } public static function staticCallbackReturningTrue() { return true; } /** * @covers PHPUnit_Framework_Constraint_IsEqual * @covers PHPUnit_Framework_Constraint_LessThan * @covers PHPUnit_Framework_Constraint_Or * @covers PHPUnit_Framework_Assert::lessThanOrEqual * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintLessThanOrEqual2() { $constraint = PHPUnit_Framework_Assert::lessThanOrEqual(1); try { $constraint->evaluate(2, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsEqual * @covers PHPUnit_Framework_Constraint_LessThan * @covers PHPUnit_Framework_Constraint_Or * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::lessThanOrEqual * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintNotLessThanOrEqual() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::lessThanOrEqual(1) ); $this->assertTrue($constraint->evaluate(2, '', true)); $this->assertFalse($constraint->evaluate(1, '', true)); $this->assertEquals('not( is equal to 1 or is less than 1 )', $constraint->toString()); $this->assertEquals(2, count($constraint)); try { $constraint->evaluate(1); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsEqual * @covers PHPUnit_Framework_Constraint_LessThan * @covers PHPUnit_Framework_Constraint_Or * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::lessThanOrEqual * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintNotLessThanOrEqual2() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::lessThanOrEqual(1) ); try { $constraint->evaluate(1, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_ClassHasAttribute * @covers PHPUnit_Framework_Assert::classHasAttribute * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintClassHasAttribute() { $constraint = PHPUnit_Framework_Assert::classHasAttribute('privateAttribute'); $this->assertTrue($constraint->evaluate('ClassWithNonPublicAttributes', '', true)); $this->assertFalse($constraint->evaluate('stdClass', '', true)); $this->assertEquals('has attribute "privateAttribute"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate('stdClass'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_ClassHasAttribute * @covers PHPUnit_Framework_Assert::classHasAttribute * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintClassHasAttribute2() { $constraint = PHPUnit_Framework_Assert::classHasAttribute('privateAttribute'); try { $constraint->evaluate('stdClass', 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_ClassHasAttribute * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::classHasAttribute * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintClassNotHasAttribute() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::classHasAttribute('privateAttribute') ); $this->assertTrue($constraint->evaluate('stdClass', '', true)); $this->assertFalse($constraint->evaluate('ClassWithNonPublicAttributes', '', true)); $this->assertEquals('does not have attribute "privateAttribute"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate('ClassWithNonPublicAttributes'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_ClassHasAttribute * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::classHasAttribute * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintClassNotHasAttribute2() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::classHasAttribute('privateAttribute') ); try { $constraint->evaluate('ClassWithNonPublicAttributes', 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_ClassHasStaticAttribute * @covers PHPUnit_Framework_Assert::classHasStaticAttribute * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintClassHasStaticAttribute() { $constraint = PHPUnit_Framework_Assert::classHasStaticAttribute('privateStaticAttribute'); $this->assertTrue($constraint->evaluate('ClassWithNonPublicAttributes', '', true)); $this->assertFalse($constraint->evaluate('stdClass', '', true)); $this->assertEquals('has static attribute "privateStaticAttribute"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate('stdClass'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_ClassHasStaticAttribute * @covers PHPUnit_Framework_Assert::classHasStaticAttribute * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintClassHasStaticAttribute2() { $constraint = PHPUnit_Framework_Assert::classHasStaticAttribute('foo'); try { $constraint->evaluate('stdClass', 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_ClassHasStaticAttribute * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::classHasStaticAttribute * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintClassNotHasStaticAttribute() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::classHasStaticAttribute('privateStaticAttribute') ); $this->assertTrue($constraint->evaluate('stdClass', '', true)); $this->assertFalse($constraint->evaluate('ClassWithNonPublicAttributes', '', true)); $this->assertEquals('does not have static attribute "privateStaticAttribute"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate('ClassWithNonPublicAttributes'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_ClassHasStaticAttribute * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::classHasStaticAttribute * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintClassNotHasStaticAttribute2() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::classHasStaticAttribute('privateStaticAttribute') ); try { $constraint->evaluate('ClassWithNonPublicAttributes', 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_ObjectHasAttribute * @covers PHPUnit_Framework_Assert::objectHasAttribute * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintObjectHasAttribute() { $constraint = PHPUnit_Framework_Assert::objectHasAttribute('privateAttribute'); $this->assertTrue($constraint->evaluate(new ClassWithNonPublicAttributes, '', true)); $this->assertFalse($constraint->evaluate(new stdClass, '', true)); $this->assertEquals('has attribute "privateAttribute"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate(new stdClass); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_ObjectHasAttribute * @covers PHPUnit_Framework_Assert::objectHasAttribute * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintObjectHasAttribute2() { $constraint = PHPUnit_Framework_Assert::objectHasAttribute('privateAttribute'); try { $constraint->evaluate(new stdClass, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_ObjectHasAttribute * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::objectHasAttribute * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintObjectNotHasAttribute() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::objectHasAttribute('privateAttribute') ); $this->assertTrue($constraint->evaluate(new stdClass, '', true)); $this->assertFalse($constraint->evaluate(new ClassWithNonPublicAttributes, '', true)); $this->assertEquals('does not have attribute "privateAttribute"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate(new ClassWithNonPublicAttributes); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_ObjectHasAttribute * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::objectHasAttribute * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintObjectNotHasAttribute2() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::objectHasAttribute('privateAttribute') ); try { $constraint->evaluate(new ClassWithNonPublicAttributes, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_PCREMatch * @covers PHPUnit_Framework_Assert::matchesRegularExpression * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintPCREMatch() { $constraint = PHPUnit_Framework_Assert::matchesRegularExpression('/foo/'); $this->assertFalse($constraint->evaluate('barbazbar', '', true)); $this->assertTrue($constraint->evaluate('barfoobar', '', true)); $this->assertEquals('matches PCRE pattern "/foo/"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate('barbazbar'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_PCREMatch * @covers PHPUnit_Framework_Assert::matchesRegularExpression * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintPCREMatch2() { $constraint = PHPUnit_Framework_Assert::matchesRegularExpression('/foo/'); try { $constraint->evaluate('barbazbar', 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_PCREMatch * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::matchesRegularExpression * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintPCRENotMatch() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::matchesRegularExpression('/foo/') ); $this->assertTrue($constraint->evaluate('barbazbar', '', true)); $this->assertFalse($constraint->evaluate('barfoobar', '', true)); $this->assertEquals('does not match PCRE pattern "/foo/"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate('barfoobar'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_PCREMatch * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::matchesRegularExpression * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintPCRENotMatch2() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::matchesRegularExpression('/foo/') ); try { $constraint->evaluate('barfoobar', 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals(<<fail(); } /** * @covers PHPUnit_Framework_Constraint_StringMatches * @covers PHPUnit_Framework_Assert::matches * @covers PHPUnit_Framework_Constraint::count */ public function testConstraintStringMatches() { $constraint = PHPUnit_Framework_Assert::matches('*%c*'); $this->assertFalse($constraint->evaluate('**', '', true)); $this->assertTrue($constraint->evaluate('***', '', true)); $this->assertEquals('matches PCRE pattern "/^\*.\*$/s"', $constraint->toString()); $this->assertEquals(1, count($constraint)); } /** * @covers PHPUnit_Framework_Constraint_StringMatches * @covers PHPUnit_Framework_Assert::matches * @covers PHPUnit_Framework_Constraint::count */ public function testConstraintStringMatches2() { $constraint = PHPUnit_Framework_Assert::matches('*%s*'); $this->assertFalse($constraint->evaluate('**', '', true)); $this->assertTrue($constraint->evaluate('***', '', true)); $this->assertEquals('matches PCRE pattern "/^\*[^\r\n]+\*$/s"', $constraint->toString()); $this->assertEquals(1, count($constraint)); } /** * @covers PHPUnit_Framework_Constraint_StringMatches * @covers PHPUnit_Framework_Assert::matches * @covers PHPUnit_Framework_Constraint::count */ public function testConstraintStringMatches3() { $constraint = PHPUnit_Framework_Assert::matches('*%i*'); $this->assertFalse($constraint->evaluate('**', '', true)); $this->assertTrue($constraint->evaluate('*0*', '', true)); $this->assertEquals('matches PCRE pattern "/^\*[+-]?\d+\*$/s"', $constraint->toString()); $this->assertEquals(1, count($constraint)); } /** * @covers PHPUnit_Framework_Constraint_StringMatches * @covers PHPUnit_Framework_Assert::matches * @covers PHPUnit_Framework_Constraint::count */ public function testConstraintStringMatches4() { $constraint = PHPUnit_Framework_Assert::matches('*%d*'); $this->assertFalse($constraint->evaluate('**', '', true)); $this->assertTrue($constraint->evaluate('*0*', '', true)); $this->assertEquals('matches PCRE pattern "/^\*\d+\*$/s"', $constraint->toString()); $this->assertEquals(1, count($constraint)); } /** * @covers PHPUnit_Framework_Constraint_StringMatches * @covers PHPUnit_Framework_Assert::matches * @covers PHPUnit_Framework_Constraint::count */ public function testConstraintStringMatches5() { $constraint = PHPUnit_Framework_Assert::matches('*%x*'); $this->assertFalse($constraint->evaluate('**', '', true)); $this->assertTrue($constraint->evaluate('*0f0f0f*', '', true)); $this->assertEquals('matches PCRE pattern "/^\*[0-9a-fA-F]+\*$/s"', $constraint->toString()); $this->assertEquals(1, count($constraint)); } /** * @covers PHPUnit_Framework_Constraint_StringMatches * @covers PHPUnit_Framework_Assert::matches * @covers PHPUnit_Framework_Constraint::count */ public function testConstraintStringMatches6() { $constraint = PHPUnit_Framework_Assert::matches('*%f*'); $this->assertFalse($constraint->evaluate('**', '', true)); $this->assertTrue($constraint->evaluate('*1.0*', '', true)); $this->assertEquals('matches PCRE pattern "/^\*[+-]?\.?\d+\.?\d*(?:[Ee][+-]?\d+)?\*$/s"', $constraint->toString()); $this->assertEquals(1, count($constraint)); } /** * @covers PHPUnit_Framework_Constraint_StringStartsWith * @covers PHPUnit_Framework_Assert::stringStartsWith * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintStringStartsWith() { $constraint = PHPUnit_Framework_Assert::stringStartsWith('prefix'); $this->assertFalse($constraint->evaluate('foo', '', true)); $this->assertTrue($constraint->evaluate('prefixfoo', '', true)); $this->assertEquals('starts with "prefix"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate('foo'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_StringStartsWith * @covers PHPUnit_Framework_Assert::stringStartsWith * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintStringStartsWith2() { $constraint = PHPUnit_Framework_Assert::stringStartsWith('prefix'); try { $constraint->evaluate('foo', 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_StringStartsWith * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::stringStartsWith * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintStringStartsNotWith() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::stringStartsWith('prefix') ); $this->assertTrue($constraint->evaluate('foo', '', true)); $this->assertFalse($constraint->evaluate('prefixfoo', '', true)); $this->assertEquals('starts not with "prefix"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate('prefixfoo'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_StringStartsWith * @covers PHPUnit_Framework_Assert::stringStartsWith * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintStringStartsNotWith2() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::stringStartsWith('prefix') ); try { $constraint->evaluate('prefixfoo', 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_StringContains * @covers PHPUnit_Framework_Assert::stringContains * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintStringContains() { $constraint = PHPUnit_Framework_Assert::stringContains('foo'); $this->assertFalse($constraint->evaluate('barbazbar', '', true)); $this->assertTrue($constraint->evaluate('barfoobar', '', true)); $this->assertEquals('contains "foo"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate('barbazbar'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_StringContains * @covers PHPUnit_Framework_Assert::stringContains * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintStringContains2() { $constraint = PHPUnit_Framework_Assert::stringContains('foo'); try { $constraint->evaluate('barbazbar', 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_StringContains * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::stringContains * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintStringNotContains() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::stringContains('foo') ); $this->assertTrue($constraint->evaluate('barbazbar', '', true)); $this->assertFalse($constraint->evaluate('barfoobar', '', true)); $this->assertEquals('does not contain "foo"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate('barfoobar'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_StringContains * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::stringContains * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintStringNotContains2() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::stringContains('foo') ); try { $constraint->evaluate('barfoobar', 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_StringEndsWith * @covers PHPUnit_Framework_Assert::stringEndsWith * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintStringEndsWith() { $constraint = PHPUnit_Framework_Assert::stringEndsWith('suffix'); $this->assertFalse($constraint->evaluate('foo', '', true)); $this->assertTrue($constraint->evaluate('foosuffix', '', true)); $this->assertEquals('ends with "suffix"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate('foo'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_StringEndsWith * @covers PHPUnit_Framework_Assert::stringEndsWith * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintStringEndsWith2() { $constraint = PHPUnit_Framework_Assert::stringEndsWith('suffix'); try { $constraint->evaluate('foo', 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_StringEndsWith * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::stringEndsWith * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintStringEndsNotWith() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::stringEndsWith('suffix') ); $this->assertTrue($constraint->evaluate('foo', '', true)); $this->assertFalse($constraint->evaluate('foosuffix', '', true)); $this->assertEquals('ends not with "suffix"', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate('foosuffix'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_StringEndsWith * @covers PHPUnit_Framework_Assert::stringEndsWith * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintStringEndsNotWith2() { $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::stringEndsWith('suffix') ); try { $constraint->evaluate('foosuffix', 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_TraversableContains */ public function testConstraintArrayContainsCheckForObjectIdentity() { // Check for primitive type. $constraint = new PHPUnit_Framework_Constraint_TraversableContains('foo', true, true); $this->assertFalse($constraint->evaluate([0], '', true)); $this->assertFalse($constraint->evaluate([true], '', true)); // Default case. $constraint = new PHPUnit_Framework_Constraint_TraversableContains('foo'); $this->assertTrue($constraint->evaluate([0], '', true)); $this->assertTrue($constraint->evaluate([true], '', true)); } /** * @covers PHPUnit_Framework_Constraint_TraversableContains * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintArrayContains() { $constraint = new PHPUnit_Framework_Constraint_TraversableContains('foo'); $this->assertFalse($constraint->evaluate(['bar'], '', true)); $this->assertTrue($constraint->evaluate(['foo'], '', true)); $this->assertEquals("contains 'foo'", $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate(['bar']); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_TraversableContains * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintArrayContains2() { $constraint = new PHPUnit_Framework_Constraint_TraversableContains('foo'); try { $constraint->evaluate(['bar'], 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_TraversableContains * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintArrayNotContains() { $constraint = PHPUnit_Framework_Assert::logicalNot( new PHPUnit_Framework_Constraint_TraversableContains('foo') ); $this->assertTrue($constraint->evaluate(['bar'], '', true)); $this->assertFalse($constraint->evaluate(['foo'], '', true)); $this->assertEquals("does not contain 'foo'", $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate(['foo']); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_TraversableContains * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintArrayNotContains2() { $constraint = PHPUnit_Framework_Assert::logicalNot( new PHPUnit_Framework_Constraint_TraversableContains('foo') ); try { $constraint->evaluate(['foo'], 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_TraversableContains * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintSplObjectStorageContains() { $object = new StdClass; $constraint = new PHPUnit_Framework_Constraint_TraversableContains($object); $this->assertStringMatchesFormat('contains stdClass Object &%s ()', $constraint->toString()); $storage = new SplObjectStorage; $this->assertFalse($constraint->evaluate($storage, '', true)); $storage->attach($object); $this->assertTrue($constraint->evaluate($storage, '', true)); try { $constraint->evaluate(new SplObjectStorage); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertStringMatchesFormat( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_TraversableContains * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintSplObjectStorageContains2() { $object = new StdClass; $constraint = new PHPUnit_Framework_Constraint_TraversableContains($object); try { $constraint->evaluate(new SplObjectStorage, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertStringMatchesFormat( <<fail(); } /** * @covers PHPUnit_Framework_Assert::attributeEqualTo * @covers PHPUnit_Framework_Constraint_Attribute * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testAttributeEqualTo() { $object = new ClassWithNonPublicAttributes; $constraint = PHPUnit_Framework_Assert::attributeEqualTo('foo', 1); $this->assertTrue($constraint->evaluate($object, '', true)); $this->assertEquals('attribute "foo" is equal to 1', $constraint->toString()); $this->assertEquals(1, count($constraint)); $constraint = PHPUnit_Framework_Assert::attributeEqualTo('foo', 2); $this->assertFalse($constraint->evaluate($object, '', true)); try { $constraint->evaluate($object); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Assert::attributeEqualTo * @covers PHPUnit_Framework_Constraint_Attribute * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testAttributeEqualTo2() { $object = new ClassWithNonPublicAttributes; $constraint = PHPUnit_Framework_Assert::attributeEqualTo('foo', 2); try { $constraint->evaluate($object, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Assert::attributeEqualTo * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_Constraint_Attribute * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testAttributeNotEqualTo() { $object = new ClassWithNonPublicAttributes; $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::attributeEqualTo('foo', 2) ); $this->assertTrue($constraint->evaluate($object, '', true)); $this->assertEquals('attribute "foo" is not equal to 2', $constraint->toString()); $this->assertEquals(1, count($constraint)); $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::attributeEqualTo('foo', 1) ); $this->assertFalse($constraint->evaluate($object, '', true)); try { $constraint->evaluate($object); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Assert::attributeEqualTo * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_Constraint_Attribute * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testAttributeNotEqualTo2() { $object = new ClassWithNonPublicAttributes; $constraint = PHPUnit_Framework_Assert::logicalNot( PHPUnit_Framework_Assert::attributeEqualTo('foo', 1) ); try { $constraint->evaluate($object, 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsEmpty * @covers PHPUnit_Framework_Constraint::count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsEmpty() { $constraint = new PHPUnit_Framework_Constraint_IsEmpty; $this->assertFalse($constraint->evaluate(['foo'], '', true)); $this->assertTrue($constraint->evaluate([], '', true)); $this->assertFalse($constraint->evaluate(new ArrayObject(['foo']), '', true)); $this->assertTrue($constraint->evaluate(new ArrayObject([]), '', true)); $this->assertEquals('is empty', $constraint->toString()); $this->assertEquals(1, count($constraint)); try { $constraint->evaluate(['foo']); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_IsEmpty * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintIsEmpty2() { $constraint = new PHPUnit_Framework_Constraint_IsEmpty; try { $constraint->evaluate(['foo'], 'custom message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_Count */ public function testConstraintCountWithAnArray() { $constraint = new PHPUnit_Framework_Constraint_Count(5); $this->assertTrue($constraint->evaluate([1, 2, 3, 4, 5], '', true)); $this->assertFalse($constraint->evaluate([1, 2, 3, 4], '', true)); } /** * @covers PHPUnit_Framework_Constraint_Count */ public function testConstraintCountWithAnIteratorWhichDoesNotImplementCountable() { $constraint = new PHPUnit_Framework_Constraint_Count(5); $this->assertTrue($constraint->evaluate(new TestIterator([1, 2, 3, 4, 5]), '', true)); $this->assertFalse($constraint->evaluate(new TestIterator([1, 2, 3, 4]), '', true)); } /** * @covers PHPUnit_Framework_Constraint_Count */ public function testConstraintCountWithAnObjectImplementingCountable() { $constraint = new PHPUnit_Framework_Constraint_Count(5); $this->assertTrue($constraint->evaluate(new ArrayObject([1, 2, 3, 4, 5]), '', true)); $this->assertFalse($constraint->evaluate(new ArrayObject([1, 2, 3, 4]), '', true)); } /** * @covers PHPUnit_Framework_Constraint_Count * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintCountFailing() { $constraint = new PHPUnit_Framework_Constraint_Count(5); try { $constraint->evaluate([1, 2]); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_Count * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintNotCountFailing() { $constraint = PHPUnit_Framework_Assert::logicalNot( new PHPUnit_Framework_Constraint_Count(2) ); try { $constraint->evaluate([1, 2]); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_SameSize */ public function testConstraintSameSizeWithAnArray() { $constraint = new PHPUnit_Framework_Constraint_SameSize([1, 2, 3, 4, 5]); $this->assertTrue($constraint->evaluate([6, 7, 8, 9, 10], '', true)); $this->assertFalse($constraint->evaluate([1, 2, 3, 4], '', true)); } /** * @covers PHPUnit_Framework_Constraint_SameSize */ public function testConstraintSameSizeWithAnIteratorWhichDoesNotImplementCountable() { $constraint = new PHPUnit_Framework_Constraint_SameSize(new TestIterator([1, 2, 3, 4, 5])); $this->assertTrue($constraint->evaluate(new TestIterator([6, 7, 8, 9, 10]), '', true)); $this->assertFalse($constraint->evaluate(new TestIterator([1, 2, 3, 4]), '', true)); } /** * @covers PHPUnit_Framework_Constraint_SameSize */ public function testConstraintSameSizeWithAnObjectImplementingCountable() { $constraint = new PHPUnit_Framework_Constraint_SameSize(new ArrayObject([1, 2, 3, 4, 5])); $this->assertTrue($constraint->evaluate(new ArrayObject([6, 7, 8, 9, 10]), '', true)); $this->assertFalse($constraint->evaluate(new ArrayObject([1, 2, 3, 4]), '', true)); } /** * @covers PHPUnit_Framework_Constraint_SameSize * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintSameSizeFailing() { $constraint = new PHPUnit_Framework_Constraint_SameSize([1, 2, 3, 4, 5]); try { $constraint->evaluate([1, 2]); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_SameSize * @covers PHPUnit_Framework_Constraint_Not * @covers PHPUnit_Framework_Assert::logicalNot * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintNotSameSizeFailing() { $constraint = PHPUnit_Framework_Assert::logicalNot( new PHPUnit_Framework_Constraint_SameSize([1, 2]) ); try { $constraint->evaluate([3, 4]); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * @covers PHPUnit_Framework_Constraint_Exception * @covers PHPUnit_Framework_TestFailure::exceptionToString */ public function testConstraintException() { $constraint = new PHPUnit_Framework_Constraint_Exception('FoobarException'); $exception = new DummyException('Test'); $stackTrace = PHPUnit_Util_Filter::getFilteredStacktrace($exception); try { $constraint->evaluate($exception); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $this->assertEquals( <<fail(); } /** * Removes spaces in front of newlines * * @param string $string * * @return string */ private function trimnl($string) { return preg_replace('/[ ]*\n/', "\n", $string); } } phpunit-5.1.3/tests/Framework/SuiteTest.php000066400000000000000000000177131263222771600207710ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'BeforeAndAfterTest.php'; require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'BeforeClassAndAfterClassTest.php'; require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'TestWithTest.php'; require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'DataProviderSkippedTest.php'; require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'DataProviderIncompleteTest.php'; require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'InheritedTestCase.php'; require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'NoTestCaseClass.php'; require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'NoTestCases.php'; require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'NotPublicTestCase.php'; require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'NotVoidTestCase.php'; require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'OverrideTestCase.php'; require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'RequirementsClassBeforeClassHookTest.php'; /** * @since Class available since Release 2.0.0 * @covers PHPUnit_Framework_TestSuite */ class Framework_SuiteTest extends PHPUnit_Framework_TestCase { protected $result; protected function setUp() { $this->result = new PHPUnit_Framework_TestResult; } public static function suite() { $suite = new PHPUnit_Framework_TestSuite; $suite->addTest(new self('testAddTestSuite')); $suite->addTest(new self('testInheritedTests')); $suite->addTest(new self('testNoTestCases')); $suite->addTest(new self('testNoTestCaseClass')); $suite->addTest(new self('testNotExistingTestCase')); $suite->addTest(new self('testNotPublicTestCase')); $suite->addTest(new self('testNotVoidTestCase')); $suite->addTest(new self('testOneTestCase')); $suite->addTest(new self('testShadowedTests')); $suite->addTest(new self('testBeforeClassAndAfterClassAnnotations')); $suite->addTest(new self('testBeforeAnnotation')); $suite->addTest(new self('testTestWithAnnotation')); $suite->addTest(new self('testSkippedTestDataProvider')); $suite->addTest(new self('testIncompleteTestDataProvider')); $suite->addTest(new self('testRequirementsBeforeClassHook')); $suite->addTest(new self('testDontSkipInheritedClass')); return $suite; } public function testAddTestSuite() { $suite = new PHPUnit_Framework_TestSuite( 'OneTestCase' ); $suite->run($this->result); $this->assertEquals(1, count($this->result)); } public function testInheritedTests() { $suite = new PHPUnit_Framework_TestSuite( 'InheritedTestCase' ); $suite->run($this->result); $this->assertTrue($this->result->wasSuccessful()); $this->assertEquals(2, count($this->result)); } public function testNoTestCases() { $suite = new PHPUnit_Framework_TestSuite( 'NoTestCases' ); $suite->run($this->result); $this->assertTrue(!$this->result->wasSuccessful()); $this->assertEquals(0, $this->result->failureCount()); $this->assertEquals(1, $this->result->warningCount()); $this->assertEquals(1, count($this->result)); } /** * @expectedException PHPUnit_Framework_Exception */ public function testNoTestCaseClass() { $suite = new PHPUnit_Framework_TestSuite('NoTestCaseClass'); } public function testNotExistingTestCase() { $suite = new self('notExistingMethod'); $suite->run($this->result); $this->assertEquals(0, $this->result->errorCount()); $this->assertEquals(1, $this->result->failureCount()); $this->assertEquals(1, count($this->result)); } public function testNotPublicTestCase() { $suite = new PHPUnit_Framework_TestSuite( 'NotPublicTestCase' ); $this->assertEquals(2, count($suite)); } public function testNotVoidTestCase() { $suite = new PHPUnit_Framework_TestSuite( 'NotVoidTestCase' ); $this->assertEquals(1, count($suite)); } public function testOneTestCase() { $suite = new PHPUnit_Framework_TestSuite( 'OneTestCase' ); $suite->run($this->result); $this->assertEquals(0, $this->result->errorCount()); $this->assertEquals(0, $this->result->failureCount()); $this->assertEquals(1, count($this->result)); $this->assertTrue($this->result->wasSuccessful()); } public function testShadowedTests() { $suite = new PHPUnit_Framework_TestSuite( 'OverrideTestCase' ); $suite->run($this->result); $this->assertEquals(1, count($this->result)); } public function testBeforeClassAndAfterClassAnnotations() { $suite = new PHPUnit_Framework_TestSuite( 'BeforeClassAndAfterClassTest' ); BeforeClassAndAfterClassTest::resetProperties(); $suite->run($this->result); $this->assertEquals(1, BeforeClassAndAfterClassTest::$beforeClassWasRun, '@beforeClass method was not run once for the whole suite.'); $this->assertEquals(1, BeforeClassAndAfterClassTest::$afterClassWasRun, '@afterClass method was not run once for the whole suite.'); } public function testBeforeAnnotation() { $test = new PHPUnit_Framework_TestSuite( 'BeforeAndAfterTest' ); BeforeAndAfterTest::resetProperties(); $result = $test->run(); $this->assertEquals(2, BeforeAndAfterTest::$beforeWasRun); $this->assertEquals(2, BeforeAndAfterTest::$afterWasRun); } public function testTestWithAnnotation() { $test = new PHPUnit_Framework_TestSuite( 'TestWithTest' ); BeforeAndAfterTest::resetProperties(); $result = $test->run(); $this->assertEquals(4, count($result->passed())); } public function testSkippedTestDataProvider() { $suite = new PHPUnit_Framework_TestSuite('DataProviderSkippedTest'); $suite->run($this->result); $this->assertEquals(3, $this->result->count()); $this->assertEquals(1, $this->result->skippedCount()); } public function testIncompleteTestDataProvider() { $suite = new PHPUnit_Framework_TestSuite('DataProviderIncompleteTest'); $suite->run($this->result); $this->assertEquals(3, $this->result->count()); $this->assertEquals(1, $this->result->notImplementedCount()); } public function testRequirementsBeforeClassHook() { $suite = new PHPUnit_Framework_TestSuite( 'RequirementsClassBeforeClassHookTest' ); $suite->run($this->result); $this->assertEquals(0, $this->result->errorCount()); $this->assertEquals(1, $this->result->skippedCount()); } public function testDontSkipInheritedClass() { $suite = new PHPUnit_Framework_TestSuite( 'DontSkipInheritedClass' ); $dir = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Inheritance' . DIRECTORY_SEPARATOR; $suite->addTestFile($dir . 'InheritanceA.php'); $suite->addTestFile($dir . 'InheritanceB.php'); $result = $suite->run(); $this->assertEquals(2, count($result)); } } phpunit-5.1.3/tests/Framework/TestCaseTest.php000066400000000000000000000417221263222771600214100ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'NoArgTestCaseTest.php'; require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Singleton.php'; $GLOBALS['a'] = 'a'; $_ENV['b'] = 'b'; $_POST['c'] = 'c'; $_GET['d'] = 'd'; $_COOKIE['e'] = 'e'; $_SERVER['f'] = 'f'; $_FILES['g'] = 'g'; $_REQUEST['h'] = 'h'; $GLOBALS['i'] = 'i'; /** * @since Class available since Release 2.0.0 * @covers PHPUnit_Framework_TestCase */ class Framework_TestCaseTest extends PHPUnit_Framework_TestCase { protected $backupGlobalsBlacklist = ['i', 'singleton']; /** * Used be testStaticAttributesBackupPre */ protected static $_testStatic = 0; public function testCaseToString() { $this->assertEquals( 'Framework_TestCaseTest::testCaseToString', $this->toString() ); } public function testSuccess() { $test = new Success; $result = $test->run(); $this->assertEquals(PHPUnit_Runner_BaseTestRunner::STATUS_PASSED, $test->getStatus()); $this->assertEquals(0, $result->errorCount()); $this->assertEquals(0, $result->failureCount()); $this->assertEquals(0, $result->skippedCount()); $this->assertEquals(1, count($result)); } public function testFailure() { $test = new Failure; $result = $test->run(); $this->assertEquals(PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE, $test->getStatus()); $this->assertEquals(0, $result->errorCount()); $this->assertEquals(1, $result->failureCount()); $this->assertEquals(0, $result->skippedCount()); $this->assertEquals(1, count($result)); } public function testError() { $test = new TestError; $result = $test->run(); $this->assertEquals(PHPUnit_Runner_BaseTestRunner::STATUS_ERROR, $test->getStatus()); $this->assertEquals(1, $result->errorCount()); $this->assertEquals(0, $result->failureCount()); $this->assertEquals(0, $result->skippedCount()); $this->assertEquals(1, count($result)); } public function testSkipped() { $test = new TestSkipped(); $result = $test->run(); $this->assertEquals(PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED, $test->getStatus()); $this->assertEquals('Skipped test', $test->getStatusMessage()); $this->assertEquals(0, $result->errorCount()); $this->assertEquals(0, $result->failureCount()); $this->assertEquals(1, $result->skippedCount()); $this->assertEquals(1, count($result)); } public function testIncomplete() { $test = new TestIncomplete(); $result = $test->run(); $this->assertEquals(PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE, $test->getStatus()); $this->assertEquals('Incomplete test', $test->getStatusMessage()); $this->assertEquals(0, $result->errorCount()); $this->assertEquals(0, $result->failureCount()); $this->assertEquals(0, $result->skippedCount()); $this->assertEquals(1, count($result)); } public function testExceptionInSetUp() { $test = new ExceptionInSetUpTest('testSomething'); $result = $test->run(); $this->assertTrue($test->setUp); $this->assertFalse($test->assertPreConditions); $this->assertFalse($test->testSomething); $this->assertFalse($test->assertPostConditions); $this->assertTrue($test->tearDown); } public function testExceptionInAssertPreConditions() { $test = new ExceptionInAssertPreConditionsTest('testSomething'); $result = $test->run(); $this->assertTrue($test->setUp); $this->assertTrue($test->assertPreConditions); $this->assertFalse($test->testSomething); $this->assertFalse($test->assertPostConditions); $this->assertTrue($test->tearDown); } public function testExceptionInTest() { $test = new ExceptionInTest('testSomething'); $result = $test->run(); $this->assertTrue($test->setUp); $this->assertTrue($test->assertPreConditions); $this->assertTrue($test->testSomething); $this->assertFalse($test->assertPostConditions); $this->assertTrue($test->tearDown); } public function testExceptionInAssertPostConditions() { $test = new ExceptionInAssertPostConditionsTest('testSomething'); $result = $test->run(); $this->assertTrue($test->setUp); $this->assertTrue($test->assertPreConditions); $this->assertTrue($test->testSomething); $this->assertTrue($test->assertPostConditions); $this->assertTrue($test->tearDown); } public function testExceptionInTearDown() { $test = new ExceptionInTearDownTest('testSomething'); $result = $test->run(); $this->assertTrue($test->setUp); $this->assertTrue($test->assertPreConditions); $this->assertTrue($test->testSomething); $this->assertTrue($test->assertPostConditions); $this->assertTrue($test->tearDown); } public function testNoArgTestCasePasses() { $result = new PHPUnit_Framework_TestResult; $t = new PHPUnit_Framework_TestSuite('NoArgTestCaseTest'); $t->run($result); $this->assertEquals(1, count($result)); $this->assertEquals(0, $result->failureCount()); $this->assertEquals(0, $result->errorCount()); } public function testWasRun() { $test = new WasRun; $test->run(); $this->assertTrue($test->wasRun); } public function testException() { $test = new ThrowExceptionTestCase('test'); $test->setExpectedException('RuntimeException'); $result = $test->run(); $this->assertEquals(1, count($result)); $this->assertTrue($result->wasSuccessful()); } public function testExceptionWithMessage() { $test = new ThrowExceptionTestCase('test'); $test->setExpectedException('RuntimeException', 'A runtime error occurred'); $result = $test->run(); $this->assertEquals(1, count($result)); $this->assertTrue($result->wasSuccessful()); } public function testExceptionWithWrongMessage() { $test = new ThrowExceptionTestCase('test'); $test->setExpectedException('RuntimeException', 'A logic error occurred'); $result = $test->run(); $this->assertEquals(1, $result->failureCount()); $this->assertEquals(1, count($result)); $this->assertEquals( "Failed asserting that exception message 'A runtime error occurred' contains 'A logic error occurred'.", $test->getStatusMessage() ); } public function testExceptionWithRegexpMessage() { $test = new ThrowExceptionTestCase('test'); $test->setExpectedExceptionRegExp('RuntimeException', '/runtime .*? occurred/'); $result = $test->run(); $this->assertEquals(1, count($result)); $this->assertTrue($result->wasSuccessful()); } public function testExceptionWithWrongRegexpMessage() { $test = new ThrowExceptionTestCase('test'); $test->setExpectedExceptionRegExp('RuntimeException', '/logic .*? occurred/'); $result = $test->run(); $this->assertEquals(1, $result->failureCount()); $this->assertEquals(1, count($result)); $this->assertEquals( "Failed asserting that exception message 'A runtime error occurred' matches '/logic .*? occurred/'.", $test->getStatusMessage() ); } /** * @covers PHPUnit_Framework_Constraint_ExceptionMessageRegExp */ public function testExceptionWithInvalidRegexpMessage() { $test = new ThrowExceptionTestCase('test'); $test->setExpectedExceptionRegExp('RuntimeException', '#runtime .*? occurred/'); // wrong delimiter $result = $test->run(); $this->assertEquals( "Invalid expected exception message regex given: '#runtime .*? occurred/'", $test->getStatusMessage() ); } public function testNoException() { $test = new ThrowNoExceptionTestCase('test'); $test->setExpectedException('RuntimeException'); $result = $test->run(); $this->assertEquals(1, $result->failureCount()); $this->assertEquals(1, count($result)); } public function testWrongException() { $test = new ThrowExceptionTestCase('test'); $test->setExpectedException('InvalidArgumentException'); $result = $test->run(); $this->assertEquals(1, $result->failureCount()); $this->assertEquals(1, count($result)); } /** * @backupGlobals enabled */ public function testGlobalsBackupPre() { global $a; global $i; $this->assertEquals('a', $a); $this->assertEquals('a', $GLOBALS['a']); $this->assertEquals('b', $_ENV['b']); $this->assertEquals('c', $_POST['c']); $this->assertEquals('d', $_GET['d']); $this->assertEquals('e', $_COOKIE['e']); $this->assertEquals('f', $_SERVER['f']); $this->assertEquals('g', $_FILES['g']); $this->assertEquals('h', $_REQUEST['h']); $this->assertEquals('i', $i); $this->assertEquals('i', $GLOBALS['i']); $GLOBALS['a'] = 'aa'; $GLOBALS['foo'] = 'bar'; $_ENV['b'] = 'bb'; $_POST['c'] = 'cc'; $_GET['d'] = 'dd'; $_COOKIE['e'] = 'ee'; $_SERVER['f'] = 'ff'; $_FILES['g'] = 'gg'; $_REQUEST['h'] = 'hh'; $GLOBALS['i'] = 'ii'; $this->assertEquals('aa', $a); $this->assertEquals('aa', $GLOBALS['a']); $this->assertEquals('bar', $GLOBALS['foo']); $this->assertEquals('bb', $_ENV['b']); $this->assertEquals('cc', $_POST['c']); $this->assertEquals('dd', $_GET['d']); $this->assertEquals('ee', $_COOKIE['e']); $this->assertEquals('ff', $_SERVER['f']); $this->assertEquals('gg', $_FILES['g']); $this->assertEquals('hh', $_REQUEST['h']); $this->assertEquals('ii', $i); $this->assertEquals('ii', $GLOBALS['i']); } public function testGlobalsBackupPost() { global $a; global $i; $this->assertEquals('a', $a); $this->assertEquals('a', $GLOBALS['a']); $this->assertEquals('b', $_ENV['b']); $this->assertEquals('c', $_POST['c']); $this->assertEquals('d', $_GET['d']); $this->assertEquals('e', $_COOKIE['e']); $this->assertEquals('f', $_SERVER['f']); $this->assertEquals('g', $_FILES['g']); $this->assertEquals('h', $_REQUEST['h']); $this->assertEquals('ii', $i); $this->assertEquals('ii', $GLOBALS['i']); $this->assertArrayNotHasKey('foo', $GLOBALS); } /** * @backupGlobals enabled * @backupStaticAttributes enabled */ public function testStaticAttributesBackupPre() { $GLOBALS['singleton'] = Singleton::getInstance(); self::$_testStatic = 123; } /** * @depends testStaticAttributesBackupPre */ public function testStaticAttributesBackupPost() { $this->assertNotSame($GLOBALS['singleton'], Singleton::getInstance()); $this->assertSame(0, self::$_testStatic); } public function testIsInIsolationReturnsFalse() { $test = new IsolationTest('testIsInIsolationReturnsFalse'); $result = $test->run(); $this->assertEquals(1, count($result)); $this->assertTrue($result->wasSuccessful()); } public function testIsInIsolationReturnsTrue() { $test = new IsolationTest('testIsInIsolationReturnsTrue'); $test->setRunTestInSeparateProcess(true); $result = $test->run(); $this->assertEquals(1, count($result)); $this->assertTrue($result->wasSuccessful()); } public function testExpectOutputStringFooActualFoo() { $test = new OutputTestCase('testExpectOutputStringFooActualFoo'); $result = $test->run(); $this->assertEquals(1, count($result)); $this->assertTrue($result->wasSuccessful()); } public function testExpectOutputStringFooActualBar() { $test = new OutputTestCase('testExpectOutputStringFooActualBar'); $result = $test->run(); $this->assertEquals(1, count($result)); $this->assertFalse($result->wasSuccessful()); } public function testExpectOutputRegexFooActualFoo() { $test = new OutputTestCase('testExpectOutputRegexFooActualFoo'); $result = $test->run(); $this->assertEquals(1, count($result)); $this->assertTrue($result->wasSuccessful()); } public function testExpectOutputRegexFooActualBar() { $test = new OutputTestCase('testExpectOutputRegexFooActualBar'); $result = $test->run(); $this->assertEquals(1, count($result)); $this->assertFalse($result->wasSuccessful()); } public function testSkipsIfRequiresHigherVersionOfPHPUnit() { $test = new RequirementsTest('testAlwaysSkip'); $result = $test->run(); $this->assertEquals(1, $result->skippedCount()); $this->assertEquals( 'PHPUnit 1111111 (or later) is required.', $test->getStatusMessage() ); } public function testSkipsIfRequiresHigherVersionOfPHP() { $test = new RequirementsTest('testAlwaysSkip2'); $result = $test->run(); $this->assertEquals(1, $result->skippedCount()); $this->assertEquals( 'PHP 9999999 (or later) is required.', $test->getStatusMessage() ); } public function testSkipsIfRequiresNonExistingOs() { $test = new RequirementsTest('testAlwaysSkip3'); $result = $test->run(); $this->assertEquals(1, $result->skippedCount()); $this->assertEquals( 'Operating system matching /DOESNOTEXIST/i is required.', $test->getStatusMessage() ); } public function testSkipsIfRequiresNonExistingFunction() { $test = new RequirementsTest('testNine'); $result = $test->run(); $this->assertEquals(1, $result->skippedCount()); $this->assertEquals( 'Function testFunc is required.', $test->getStatusMessage() ); } public function testSkipsIfRequiresNonExistingExtension() { $test = new RequirementsTest('testTen'); $result = $test->run(); $this->assertEquals( 'Extension testExt is required.', $test->getStatusMessage() ); } public function testSkipsProvidesMessagesForAllSkippingReasons() { $test = new RequirementsTest('testAllPossibleRequirements'); $result = $test->run(); $this->assertEquals( 'PHP 99-dev (or later) is required.' . PHP_EOL . 'PHPUnit 9-dev (or later) is required.' . PHP_EOL . 'Operating system matching /DOESNOTEXIST/i is required.' . PHP_EOL . 'Function testFuncOne is required.' . PHP_EOL . 'Function testFuncTwo is required.' . PHP_EOL . 'Extension testExtOne is required.' . PHP_EOL . 'Extension testExtTwo is required.', $test->getStatusMessage() ); } public function testRequiringAnExistingMethodDoesNotSkip() { $test = new RequirementsTest('testExistingMethod'); $result = $test->run(); $this->assertEquals(0, $result->skippedCount()); } public function testRequiringAnExistingFunctionDoesNotSkip() { $test = new RequirementsTest('testExistingFunction'); $result = $test->run(); $this->assertEquals(0, $result->skippedCount()); } public function testRequiringAnExistingExtensionDoesNotSkip() { $test = new RequirementsTest('testExistingExtension'); $result = $test->run(); $this->assertEquals(0, $result->skippedCount()); } public function testRequiringAnExistingOsDoesNotSkip() { $test = new RequirementsTest('testExistingOs'); $result = $test->run(); $this->assertEquals(0, $result->skippedCount()); } public function testCurrentWorkingDirectoryIsRestored() { $expectedCwd = getcwd(); $test = new ChangeCurrentWorkingDirectoryTest('testSomethingThatChangesTheCwd'); $test->run(); $this->assertSame($expectedCwd, getcwd()); } /** * @requires PHP 7 * @expectedException TypeError */ public function testTypeErrorCanBeExpected() { $o = new ClassWithScalarTypeDeclarations; $o->foo(null, null); } } phpunit-5.1.3/tests/Framework/TestFailureTest.php000066400000000000000000000013441263222771600221200ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since File available since Release 3.7.20 */ class Framework_TestFailureTest extends PHPUnit_Framework_TestCase { /** * @covers PHPUnit_Framework_TestFailure::toString */ public function testToString() { $test = new self(__FUNCTION__); $exception = new PHPUnit_Framework_Exception('message'); $failure = new PHPUnit_Framework_TestFailure($test, $exception); $this->assertEquals(__METHOD__ . ': message', $failure->toString()); } } phpunit-5.1.3/tests/Framework/TestImplementorTest.php000066400000000000000000000014101263222771600230160ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 2.0.0 */ class Framework_TestImplementorTest extends PHPUnit_Framework_TestCase { /** * @covers PHPUnit_Framework_TestCase */ public function testSuccessfulRun() { $result = new PHPUnit_Framework_TestResult; $test = new DoubleTestCase(new Success); $test->run($result); $this->assertEquals(count($test), count($result)); $this->assertEquals(0, $result->errorCount()); $this->assertEquals(0, $result->failureCount()); } } phpunit-5.1.3/tests/Framework/TestListenerTest.php000066400000000000000000000055361263222771600223250ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 2.0.0 * @covers PHPUnit_Framework_TestCase */ class Framework_TestListenerTest extends PHPUnit_Framework_TestCase implements PHPUnit_Framework_TestListener { protected $endCount; protected $errorCount; protected $failureCount; protected $warningCount; protected $notImplementedCount; protected $riskyCount; protected $skippedCount; protected $result; protected $startCount; public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->errorCount++; } public function addWarning(PHPUnit_Framework_Test $test, PHPUnit_Framework_Warning $e, $time) { $this->warningCount++; } public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) { $this->failureCount++; } public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->notImplementedCount++; } public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->riskyCount++; } public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) { $this->skippedCount++; } public function startTestSuite(PHPUnit_Framework_TestSuite $suite) { } public function endTestSuite(PHPUnit_Framework_TestSuite $suite) { } public function startTest(PHPUnit_Framework_Test $test) { $this->startCount++; } public function endTest(PHPUnit_Framework_Test $test, $time) { $this->endCount++; } protected function setUp() { $this->result = new PHPUnit_Framework_TestResult; $this->result->addListener($this); $this->endCount = 0; $this->failureCount = 0; $this->notImplementedCount = 0; $this->riskyCount = 0; $this->skippedCount = 0; $this->startCount = 0; } public function testError() { $test = new TestError; $test->run($this->result); $this->assertEquals(1, $this->errorCount); $this->assertEquals(1, $this->endCount); } public function testFailure() { $test = new Failure; $test->run($this->result); $this->assertEquals(1, $this->failureCount); $this->assertEquals(1, $this->endCount); } public function testStartStop() { $test = new Success; $test->run($this->result); $this->assertEquals(1, $this->startCount); $this->assertEquals(1, $this->endCount); } } phpunit-5.1.3/tests/Regression/000077500000000000000000000000001263222771600165015ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/1021.phpt000066400000000000000000000010021263222771600177520ustar00rootroot00000000000000--TEST-- #1021: Depending on a test that uses a data provider does not work --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: %s, Memory: %sMb OK (2 tests, 1 assertion) phpunit-5.1.3/tests/Regression/1021/000077500000000000000000000000001263222771600170645ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/1021/Issue1021Test.php000066400000000000000000000005561263222771600220370ustar00rootroot00000000000000assertTrue($data); } /** * @depends testSomething */ public function testSomethingElse() { } public function provider() { return [[true]]; } } phpunit-5.1.3/tests/Regression/523.phpt000066400000000000000000000010121263222771600177010ustar00rootroot00000000000000--TEST-- #523: assertAttributeEquals does not work with classes extending ArrayIterator --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/Regression/523/000077500000000000000000000000001263222771600170125ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/523/Issue523Test.php000066400000000000000000000004051263222771600217040ustar00rootroot00000000000000assertAttributeEquals('foo', 'field', new Issue523()); } }; class Issue523 extends ArrayIterator { protected $field = 'foo'; } phpunit-5.1.3/tests/Regression/578.phpt000066400000000000000000000015671263222771600177320ustar00rootroot00000000000000--TEST-- #578: Double printing of trace line for exceptions from notices and warnings --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. EEE 3 / 3 (100%) Time: %s, Memory: %sMb There were 3 errors: 1) Issue578Test::testNoticesDoublePrintStackTrace Invalid error type specified %sIssue578Test.php:%i 2) Issue578Test::testWarningsDoublePrintStackTrace Invalid error type specified %sIssue578Test.php:%i 3) Issue578Test::testUnexpectedExceptionsPrintsCorrectly Exception: Double printed exception %sIssue578Test.php:%i FAILURES! Tests: 3, Assertions: 0, Errors: 3. phpunit-5.1.3/tests/Regression/578/000077500000000000000000000000001263222771600170245ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/578/Issue578Test.php000066400000000000000000000010751263222771600217340ustar00rootroot00000000000000iniSet('error_reporting', E_ALL | E_NOTICE); trigger_error('Stack Trace Test Notice', E_NOTICE); } public function testWarningsDoublePrintStackTrace() { $this->iniSet('error_reporting', E_ALL | E_NOTICE); trigger_error('Stack Trace Test Notice', E_WARNING); } public function testUnexpectedExceptionsPrintsCorrectly() { throw new Exception('Double printed exception'); } } phpunit-5.1.3/tests/Regression/684.phpt000066400000000000000000000011401263222771600177130ustar00rootroot00000000000000--TEST-- #684: Unable to find test class when no test methods exists --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. W 1 / 1 (100%) Time: %s, Memory: %sMb There was 1 warning: 1) Warning No tests found in class "Foo_Bar_Issue684Test". WARNINGS! Tests: 1, Assertions: 0, Warnings: 1. phpunit-5.1.3/tests/Regression/684/000077500000000000000000000000001263222771600170225ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/684/Issue684Test.php000066400000000000000000000001101263222771600217150ustar00rootroot00000000000000 --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: %s, Memory: %sMb OK (2 tests, 0 assertions) phpunit-5.1.3/tests/Regression/783/000077500000000000000000000000001263222771600170225ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/783/ChildSuite.php000066400000000000000000000004501263222771600215670ustar00rootroot00000000000000addTestSuite('OneTest'); $suite->addTestSuite('TwoTest'); return $suite; } } phpunit-5.1.3/tests/Regression/783/OneTest.php000066400000000000000000000002011263222771600211050ustar00rootroot00000000000000addTest(ChildSuite::suite()); return $suite; } } phpunit-5.1.3/tests/Regression/783/TwoTest.php000066400000000000000000000002011263222771600211350ustar00rootroot00000000000000 --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. .1. 2 / 2 (100%)2 Time: %s, Memory: %sMb OK (2 tests, 2 assertions) phpunit-5.1.3/tests/Regression/GitHub/1149/000077500000000000000000000000001263222771600202615ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/1149/Issue1149Test.php000066400000000000000000000004531263222771600232430ustar00rootroot00000000000000assertTrue(true); print '1'; } /** * @runInSeparateProcess */ public function testTwo() { $this->assertTrue(true); print '2'; } } phpunit-5.1.3/tests/Regression/GitHub/1216.phpt000066400000000000000000000014101263222771600211450ustar00rootroot00000000000000--TEST-- GH-1216: PHPUnit bootstrap must take globals vars even when the file is specified in command line --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. Starting test 'Issue1216Test::testConfigAvailableInBootstrap'. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/Regression/GitHub/1216/000077500000000000000000000000001263222771600202545ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/1216/Issue1216Test.php000066400000000000000000000003021263222771600232220ustar00rootroot00000000000000assertTrue($_ENV['configAvailableInBootstrap']); } } phpunit-5.1.3/tests/Regression/GitHub/1216/bootstrap1216.php000066400000000000000000000001161263222771600233120ustar00rootroot00000000000000 Issue1216Test.php phpunit-5.1.3/tests/Regression/GitHub/1265.phpt000066400000000000000000000011141263222771600211520ustar00rootroot00000000000000--TEST-- GH-1265: Could not use "PHPUnit_Runner_StandardTestSuiteLoader" as loader --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/Regression/GitHub/1265/000077500000000000000000000000001263222771600202605ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/1265/Issue1265Test.php000066400000000000000000000002151263222771600232350ustar00rootroot00000000000000assertTrue(true); } } phpunit-5.1.3/tests/Regression/GitHub/1265/phpunit1265.xml000066400000000000000000000001231263222771600230030ustar00rootroot00000000000000 phpunit-5.1.3/tests/Regression/GitHub/1330.phpt000066400000000000000000000011641263222771600211500ustar00rootroot00000000000000--TEST-- GH-1330: Allow non-ambiguous shortened longopts --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. Starting test 'Issue1330Test::testTrue'. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/Regression/GitHub/1330/000077500000000000000000000000001263222771600202515ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/1330/Issue1330Test.php000066400000000000000000000002251263222771600232200ustar00rootroot00000000000000assertTrue(PHPUNIT_1330); } } phpunit-5.1.3/tests/Regression/GitHub/1330/phpunit1330.xml000066400000000000000000000001241263222771600227660ustar00rootroot00000000000000 phpunit-5.1.3/tests/Regression/GitHub/1335.phpt000066400000000000000000000010741263222771600211550ustar00rootroot00000000000000--TEST-- GH-1335: exportVariable multiple backslash problem --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ............ 12 / 12 (100%) Time: %s, Memory: %sMb OK (12 tests, 12 assertions) phpunit-5.1.3/tests/Regression/GitHub/1335/000077500000000000000000000000001263222771600202565ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/1335/Issue1335Test.php000066400000000000000000000032311263222771600232320ustar00rootroot00000000000000assertEquals('Hello', $GLOBALS['globalString']); } public function testGlobalIntTruthy() { $this->assertEquals(1, $GLOBALS['globalIntTruthy']); } public function testGlobalIntFalsey() { $this->assertEquals(0, $GLOBALS['globalIntFalsey']); } public function testGlobalFloat() { $this->assertEquals(1.123, $GLOBALS['globalFloat']); } public function testGlobalBoolTrue() { $this->assertEquals(true, $GLOBALS['globalBoolTrue']); } public function testGlobalBoolFalse() { $this->assertEquals(false, $GLOBALS['globalBoolFalse']); } public function testGlobalNull() { $this->assertEquals(null, $GLOBALS['globalNull']); } public function testGlobalArray() { $this->assertEquals(['foo'], $GLOBALS['globalArray']); } public function testGlobalNestedArray() { $this->assertEquals([['foo']], $GLOBALS['globalNestedArray']); } public function testGlobalObject() { $this->assertEquals((object) ['foo'=> 'bar'], $GLOBALS['globalObject']); } public function testGlobalObjectWithBackSlashString() { $this->assertEquals((object) ['foo'=> 'back\\slash'], $GLOBALS['globalObjectWithBackSlashString']); } public function testGlobalObjectWithDoubleBackSlashString() { $this->assertEquals((object) ['foo'=> 'back\\\\slash'], $GLOBALS['globalObjectWithDoubleBackSlashString']); } } phpunit-5.1.3/tests/Regression/GitHub/1335/bootstrap1335.php000066400000000000000000000012171263222771600233210ustar00rootroot00000000000000 'bar']; $globalObjectWithBackSlashString = (object) ['foo'=> 'back\\slash']; $globalObjectWithDoubleBackSlashString = (object) ['foo'=> 'back\\\\slash']; phpunit-5.1.3/tests/Regression/GitHub/1337.phpt000066400000000000000000000011041263222771600211510ustar00rootroot00000000000000--TEST-- GH-1337: Data Provider with \ at the end of the name breaks with process isolation --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: %s, Memory: %sMb OK (2 tests, 2 assertions) phpunit-5.1.3/tests/Regression/GitHub/1337/000077500000000000000000000000001263222771600202605ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/1337/Issue1337Test.php000066400000000000000000000005041263222771600232360ustar00rootroot00000000000000assertTrue($a); } public function dataProvider() { return [ 'c:\\'=> [true], 0.9 => [true] ]; } } phpunit-5.1.3/tests/Regression/GitHub/1348.phpt000066400000000000000000000015241263222771600211610ustar00rootroot00000000000000--TEST-- GH-1348: STDOUT/STDERR IO streams should exist in process isolation --SKIPIF-- --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . STDOUT does not break test result E 2 / 2 (100%) Time: %s, Memory: %sMb There was 1 error: 1) Issue1348Test::testSTDERR PHPUnit_Framework_Exception: STDERR works as usual. FAILURES! Tests: 2, Assertions: 1, Errors: 1. phpunit-5.1.3/tests/Regression/GitHub/1348/000077500000000000000000000000001263222771600202625ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/1348/Issue1348Test.php000066400000000000000000000004601263222771600232430ustar00rootroot00000000000000assertTrue(true); } public function testSTDERR() { fwrite(STDERR, 'STDERR works as usual.'); } } phpunit-5.1.3/tests/Regression/GitHub/1351.phpt000066400000000000000000000021111263222771600211440ustar00rootroot00000000000000--TEST-- GH-1351: Test result does not serialize test class in process isolation --SKIPIF-- --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. F.E.E 5 / 5 (100%) Time: %s, Memory: %sMb There were 2 errors: 1) Issue1351Test::testExceptionPre RuntimeException: Expected rethrown exception. %A Caused by LogicException: Expected exception. %A 2) Issue1351Test::testPhpCoreLanguageException PDOException: SQLSTATE[HY000]: General error: 1 no such table: php_wtf %A -- There was 1 failure: 1) Issue1351Test::testFailurePre Expected failure. %A FAILURES! Tests: 5, Assertions: 5, Errors: 2, Failures: 1. phpunit-5.1.3/tests/Regression/GitHub/1351/000077500000000000000000000000001263222771600202545ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/1351/ChildProcessClass1351.php000066400000000000000000000000461263222771600246470ustar00rootroot00000000000000instance = new ChildProcessClass1351(); $this->assertFalse(true, 'Expected failure.'); } public function testFailurePost() { $this->assertNull($this->instance); $this->assertFalse(class_exists('ChildProcessClass1351', false), 'ChildProcessClass1351 is not loaded.'); } /** * @runInSeparateProcess */ public function testExceptionPre() { $this->instance = new ChildProcessClass1351(); try { throw new LogicException('Expected exception.'); } catch (LogicException $e) { throw new RuntimeException('Expected rethrown exception.', 0, $e); } } public function testExceptionPost() { $this->assertNull($this->instance); $this->assertFalse(class_exists('ChildProcessClass1351', false), 'ChildProcessClass1351 is not loaded.'); } public function testPhpCoreLanguageException() { // User-space code cannot instantiate a PDOException with a string code, // so trigger a real one. $connection = new PDO('sqlite::memory:'); $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $connection->query("DELETE FROM php_wtf WHERE exception_code = 'STRING'"); } } phpunit-5.1.3/tests/Regression/GitHub/1374.phpt000066400000000000000000000010641263222771600211570ustar00rootroot00000000000000--TEST-- GH-1374: tearDown() is called despite unmet requirements --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. S 1 / 1 (100%) Time: %s, Memory: %sMb OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Skipped: 1. phpunit-5.1.3/tests/Regression/GitHub/1374/000077500000000000000000000000001263222771600202615ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/1374/Issue1374Test.php000066400000000000000000000005451263222771600232450ustar00rootroot00000000000000fail('This should not be reached'); } protected function tearDown() { print __FUNCTION__; } } phpunit-5.1.3/tests/Regression/GitHub/1437.phpt000066400000000000000000000011661263222771600211620ustar00rootroot00000000000000--TEST-- GH-1437: Risky test messages mask failures --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: %s, Memory: %sMb There was 1 failure: 1) Issue1437Test::testFailure Failed asserting that false is true. %sIssue1437Test.php:%i FAILURES! Tests: 1, Assertions: 1, Failures: 1. phpunit-5.1.3/tests/Regression/GitHub/1437/000077500000000000000000000000001263222771600202615ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/1437/Issue1437Test.php000066400000000000000000000002451263222771600232420ustar00rootroot00000000000000assertTrue(false); } } phpunit-5.1.3/tests/Regression/GitHub/1468.phpt000066400000000000000000000011431263222771600211610ustar00rootroot00000000000000--TEST-- GH-1468: Incomplete and @todo annotated tests are counted twice --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. I 1 / 1 (100%) Time: %s, Memory: %sMb OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Incomplete: 1. phpunit-5.1.3/tests/Regression/GitHub/1468/000077500000000000000000000000001263222771600202655ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/1468/Issue1468Test.php000066400000000000000000000003051263222771600232470ustar00rootroot00000000000000markTestIncomplete(); } } phpunit-5.1.3/tests/Regression/GitHub/1471.phpt000066400000000000000000000012661263222771600211610ustar00rootroot00000000000000--TEST-- GH-1471: Output made while test is running is printed although expectOutputString() is used when an assertion fails --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: %s, Memory: %sMb There was 1 failure: 1) Issue1471Test::testFailure Failed asserting that false is true. %s/Issue1471Test.php:10 FAILURES! Tests: 1, Assertions: 1, Failures: 1. phpunit-5.1.3/tests/Regression/GitHub/1471/000077500000000000000000000000001263222771600202575ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/1471/Issue1471Test.php000066400000000000000000000003161263222771600232350ustar00rootroot00000000000000expectOutputString('*'); print '*'; $this->assertTrue(false); } } phpunit-5.1.3/tests/Regression/GitHub/1472.phpt000066400000000000000000000012451263222771600211570ustar00rootroot00000000000000--TEST-- GH-1472: assertEqualXMLStructure modifies the tested elements --SKIPIF-- --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 4 assertions) phpunit-5.1.3/tests/Regression/GitHub/1472/000077500000000000000000000000001263222771600202605ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/1472/Issue1472Test.php000066400000000000000000000014561263222771600232450ustar00rootroot00000000000000loadXML(''); $xpath = new DOMXPath($doc); $labelElement = $doc->getElementsByTagName('label')->item(0); $this->assertEquals(1, $xpath->evaluate('count(//label[text() = "text content"])')); $expectedElmt = $doc->createElement('label', 'text content'); $this->assertEqualXMLStructure($expectedElmt, $labelElement); // the following assertion fails, even though it passed before - which is due to the assertEqualXMLStructure() has modified the $labelElement $this->assertEquals(1, $xpath->evaluate('count(//label[text() = "text content"])')); } } phpunit-5.1.3/tests/Regression/GitHub/1570.phpt000066400000000000000000000012241263222771600211530ustar00rootroot00000000000000--TEST-- GH-1570: Test that prints output is marked as failure and not as risky when --disallow-test-output is used --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. R 1 / 1 (100%)* Time: %s, Memory: %sMb OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Risky: 1. phpunit-5.1.3/tests/Regression/GitHub/1570/000077500000000000000000000000001263222771600202575ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/1570/Issue1570Test.php000066400000000000000000000001761263222771600232410ustar00rootroot00000000000000 --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. .FFF 4 / 4 (100%) Time: %s, Memory: %sMb There were 3 failures: 1) Issue244Test::testFails Failed asserting that '123StringCode' is equal to expected exception code 'OtherString'. 2) Issue244Test::testFailsTooIfExpectationIsANumber Failed asserting that '123StringCode' is equal to expected exception code 123. 3) Issue244Test::testFailsTooIfExceptionCodeIsANumber Failed asserting that 123 is equal to expected exception code '123String'. FAILURES! Tests: 4, Assertions: 8, Failures: 3. phpunit-5.1.3/tests/Regression/GitHub/244/000077500000000000000000000000001263222771600201745ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/244/Issue244Test.php000066400000000000000000000021341263222771600230670ustar00rootroot00000000000000code = '123StringCode'; } } class Issue244ExceptionIntCode extends Exception { public function __construct() { $this->code = 123; } } phpunit-5.1.3/tests/Regression/GitHub/322.phpt000066400000000000000000000013331263222771600210660ustar00rootroot00000000000000--TEST-- GH-322: group commandline option should override group/exclude setting in phpunit.xml --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. Starting test 'Issue322Test::testOne'. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 0 assertions) phpunit-5.1.3/tests/Regression/GitHub/322/000077500000000000000000000000001263222771600201715ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/322/Issue322Test.php000066400000000000000000000003311263222771600230560ustar00rootroot00000000000000 Test.php one phpunit-5.1.3/tests/Regression/GitHub/433.phpt000066400000000000000000000012531263222771600210720ustar00rootroot00000000000000--TEST-- GH-433: expectOutputString not completely working as expected --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ..F 3 / 3 (100%) Time: %s, Memory: %sMb There was 1 failure: 1) Issue433Test::testNotMatchingOutput Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'foo' +'bar' FAILURES! Tests: 3, Assertions: 3, Failures: 1. phpunit-5.1.3/tests/Regression/GitHub/433/000077500000000000000000000000001263222771600201745ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/433/Issue433Test.php000066400000000000000000000006761263222771600231000ustar00rootroot00000000000000expectOutputString('test'); print 'test'; } public function testOutputWithExpectationAfter() { print 'test'; $this->expectOutputString('test'); } public function testNotMatchingOutput() { print 'bar'; $this->expectOutputString('foo'); } } phpunit-5.1.3/tests/Regression/GitHub/445.phpt000066400000000000000000000013231263222771600210730ustar00rootroot00000000000000--TEST-- GH-455: expectOutputString not working in strict mode --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ..F 3 / 3 (100%) Time: %s, Memory: %sMb There was 1 failure: 1) Issue445Test::testNotMatchingOutput Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'foo' +'bar' FAILURES! Tests: 3, Assertions: 3, Failures: 1. phpunit-5.1.3/tests/Regression/GitHub/445/000077500000000000000000000000001263222771600201775ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/445/Issue445Test.php000066400000000000000000000006761263222771600231060ustar00rootroot00000000000000expectOutputString('test'); print 'test'; } public function testOutputWithExpectationAfter() { print 'test'; $this->expectOutputString('test'); } public function testNotMatchingOutput() { print 'bar'; $this->expectOutputString('foo'); } } phpunit-5.1.3/tests/Regression/GitHub/498.phpt000066400000000000000000000014071263222771600211060ustar00rootroot00000000000000--TEST-- GH-498: The test methods won't be run if a dataProvider throws Exception and --group is added in command line --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. W 1 / 1 (100%) Time: %s, Memory: %sMb There was 1 warning: 1) Warning The data provider specified for Issue498Test::shouldBeFalse is invalid. Can't create the data WARNINGS! Tests: 1, Assertions: 0, Warnings: 1. phpunit-5.1.3/tests/Regression/GitHub/498/000077500000000000000000000000001263222771600202075ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/498/Issue498Test.php000066400000000000000000000014561263222771600231230ustar00rootroot00000000000000assertTrue(true); } /** * @test * @dataProvider shouldBeFalseDataProvider * @group trueOnly */ public function shouldBeFalse($testData) { $this->assertFalse(false); } public function shouldBeTrueDataProvider() { //throw new Exception("Can't create the data"); return [ [true], [false] ]; } public function shouldBeFalseDataProvider() { throw new Exception("Can't create the data"); return [ [true], [false] ]; } } phpunit-5.1.3/tests/Regression/GitHub/503.phpt000066400000000000000000000013471263222771600210740ustar00rootroot00000000000000--TEST-- GH-503: assertEquals() Line Ending Differences Are Obscure --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: %s, Memory: %sMb There was 1 failure: 1) Issue503Test::testCompareDifferentLineEndings Failed asserting that two strings are identical. --- Expected +++ Actual @@ @@ #Warning: Strings contain different line endings! foo %s:%i FAILURES! Tests: 1, Assertions: 1, Failures: 1. phpunit-5.1.3/tests/Regression/GitHub/503/000077500000000000000000000000001263222771600201725ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/503/Issue503Test.php000066400000000000000000000003231263222771600230610ustar00rootroot00000000000000assertSame( "foo\n", "foo\r\n" ); } } phpunit-5.1.3/tests/Regression/GitHub/581.phpt000066400000000000000000000015131263222771600210750ustar00rootroot00000000000000--TEST-- GH-581: PHPUnit_Util_Type::export adds extra newlines in Windows --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: %s, Memory: %sMb There was 1 failure: 1) Issue581Test::testExportingObjectsDoesNotBreakWindowsLineFeeds Failed asserting that two objects are equal. --- Expected +++ Actual @@ @@ stdClass Object ( 0 => 1 1 => 2 2 => 'Test\n' 3 => 4 - 4 => 5 + 4 => 1 5 => 6 6 => 7 7 => 8 ) %s:%i FAILURES! Tests: 1, Assertions: 1, Failures: 1. phpunit-5.1.3/tests/Regression/GitHub/581/000077500000000000000000000000001263222771600202005ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/581/Issue581Test.php000066400000000000000000000004521263222771600231000ustar00rootroot00000000000000assertEquals( (object) [1, 2, "Test\r\n", 4, 5, 6, 7, 8], (object) [1, 2, "Test\r\n", 4, 1, 6, 7, 8] ); } } phpunit-5.1.3/tests/Regression/GitHub/74.phpt000066400000000000000000000012501263222771600210100ustar00rootroot00000000000000--TEST-- GH-74: catchable fatal error in 3.5 --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. E 1 / 1 (100%) Time: %s, Memory: %sMb There was 1 error: 1) Issue74Test::testCreateAndThrowNewExceptionInProcessIsolation NewException: Testing GH-74 %sIssue74Test.php:7 FAILURES! Tests: 1, Assertions: 0, Errors: 1. phpunit-5.1.3/tests/Regression/GitHub/74/000077500000000000000000000000001263222771600201155ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/74/Issue74Test.php000066400000000000000000000003671263222771600227370ustar00rootroot00000000000000 --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. .W 2 / 2 (100%) Time: %s, Memory: %sMb There was 1 warning: 1) Warning The data provider specified for Issue765Test::testDependent is invalid. WARNINGS! Tests: 2, Assertions: 1, Warnings: 1. phpunit-5.1.3/tests/Regression/GitHub/765/000077500000000000000000000000001263222771600202045ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/765/Issue765Test.php000066400000000000000000000006121263222771600231060ustar00rootroot00000000000000assertTrue(true); } /** * @depends testDependee * @dataProvider dependentProvider */ public function testDependent($a) { $this->assertTrue(true); } public function dependentProvider() { throw new Exception; } } phpunit-5.1.3/tests/Regression/GitHub/797.phpt000066400000000000000000000011351263222771600211060ustar00rootroot00000000000000--TEST-- GH-797: Disabled $preserveGlobalState does not load bootstrap.php. --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/Regression/GitHub/797/000077500000000000000000000000001263222771600202115ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/797/Issue797Test.php000066400000000000000000000003451263222771600231230ustar00rootroot00000000000000assertEquals(GITHUB_ISSUE, 797); } } phpunit-5.1.3/tests/Regression/GitHub/797/bootstrap797.php000066400000000000000000000003001263222771600231770ustar00rootroot00000000000000 --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ............................................................... 63 / 150 ( 42%) ............................................................... 126 / 150 ( 84%) ........................ 150 / 150 (100%) Time: %s, Memory: %sMb OK (150 tests, 150 assertions) phpunit-5.1.3/tests/Regression/GitHub/873-php5.phpt000066400000000000000000000011021263222771600217450ustar00rootroot00000000000000--TEST-- GH-873: PHPUnit suppresses exceptions thrown outside of test case function --SKIPIF-- 5) { print 'skip: PHP 5 is required'; } ?> --FILE-- --EXPECTF-- Fatal error: Uncaught exception 'Exception' with message 'PHPUnit suppresses exceptions thrown outside of test case function' in %s:%i Stack trace: %a phpunit-5.1.3/tests/Regression/GitHub/873-php7.phpt000066400000000000000000000010501263222771600217510ustar00rootroot00000000000000--TEST-- GH-873: PHPUnit suppresses exceptions thrown outside of test case function --SKIPIF-- --FILE-- --EXPECTF-- Fatal error: Uncaught Exception: PHPUnit suppresses exceptions thrown outside of test case function in %s:%i Stack trace: %a phpunit-5.1.3/tests/Regression/GitHub/873/000077500000000000000000000000001263222771600202045ustar00rootroot00000000000000phpunit-5.1.3/tests/Regression/GitHub/873/Issue873Test.php000066400000000000000000000002571263222771600231130ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 2.0.0 * @covers PHPUnit_Runner_BaseTestRunner */ class Runner_BaseTestRunnerTest extends PHPUnit_Framework_TestCase { public function testInvokeNonStaticSuite() { $runner = new MockRunner; $runner->getTest('NonStatic'); } } phpunit-5.1.3/tests/TextUI/000077500000000000000000000000001263222771600155435ustar00rootroot00000000000000phpunit-5.1.3/tests/TextUI/abstract-test-class.phpt000066400000000000000000000011311263222771600223170ustar00rootroot00000000000000--TEST-- phpunit AbstractTest ../_files/AbstractTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. W 1 / 1 (100%) Time: %s, Memory: %sMb There was 1 warning: 1) Warning Cannot instantiate class "AbstractTest". WARNINGS! Tests: 1, Assertions: 0, Warnings: 1. phpunit-5.1.3/tests/TextUI/colors-always.phpt000066400000000000000000000010231263222771600212330ustar00rootroot00000000000000--TEST-- phpunit --colors=always BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: %s, Memory: %sMb %s[30;42mOK (3 tests, 3 assertions)%s[0m phpunit-5.1.3/tests/TextUI/concrete-test-class.phpt000066400000000000000000000007711263222771600223270ustar00rootroot00000000000000--TEST-- phpunit ConcreteTest ../_files/ConcreteTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: %s, Memory: %sMb OK (2 tests, 0 assertions) phpunit-5.1.3/tests/TextUI/custom-printer-debug.phpt000066400000000000000000000015441263222771600225230ustar00rootroot00000000000000--TEST-- phpunit -c ../_files/configuration.custom-printer.xml --debug BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. Starting test 'BankAccountTest::testBalanceIsInitiallyZero'. . Starting test 'BankAccountTest::testBalanceCannotBecomeNegative'. . Starting test 'BankAccountTest::testBalanceCannotBecomeNegative2'. . 3 / 3 (100%) Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/custom-printer-verbose.phpt000066400000000000000000000015631263222771600231030ustar00rootroot00000000000000--TEST-- phpunit -c ../_files/configuration.custom-printer.xml --verbose IncompleteTest ../_files/IncompleteTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. Runtime: %s Configuration: %sconfiguration.custom-printer.xml I 1 / 1 (100%) Time: %s, Memory: %sMb There was 1 incomplete test: 1) IncompleteTest::testIncomplete Test incomplete %s OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Incomplete: 1. phpunit-5.1.3/tests/TextUI/dataprovider-debug.phpt000066400000000000000000000026271263222771600222170ustar00rootroot00000000000000--TEST-- phpunit --debug DataProviderDebugTest ../_files/DataProviderDebugTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. Starting test 'DataProviderDebugTest::testProvider with data set #0 (null, true, 1, 1.0)'. . Starting test 'DataProviderDebugTest::testProvider with data set #1 (1.2, resource(%d) of type (stream), '1')'. . Starting test 'DataProviderDebugTest::testProvider with data set #2 (array(array(1, 2, 3), array(3, 4, 5)))'. . Starting test 'DataProviderDebugTest::testProvider with data set #3 ('this\nis\na\nvery\nvery\nvery\nvery...g\ntext')'. . Starting test 'DataProviderDebugTest::testProvider with data set #4 (stdClass Object (), stdClass Object (...), array(), SplObjectStorage Object (...), stdClass Object (...))'. . Starting test 'DataProviderDebugTest::testProvider with data set #5 (Binary String: 0x000102030405, Binary String: 0x0e0f101112131...c1d1e1f)'. . Starting test 'DataProviderDebugTest::testProvider with data set #6 (Binary String: 0x0009)'. . 7 / 7 (100%) Time: %s, Memory: %sMb OK (7 tests, 7 assertions) phpunit-5.1.3/tests/TextUI/dataprovider-log-xml-isolation.phpt000066400000000000000000000032071263222771600245020ustar00rootroot00000000000000--TEST-- phpunit --process-isolation --log-junit php://stdout DataProviderTest ../_files/DataProviderTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ..F. 4 / 4 (100%) DataProviderTest::testAdd with data set #2 (1, 1, 3) Failed asserting that 2 matches expected 3. %s:%i Time: %s, Memory: %sMb There was 1 failure: 1) DataProviderTest::testAdd with data set #2 (1, 1, 3) Failed asserting that 2 matches expected 3. %s:%i FAILURES! Tests: 4, Assertions: 4, Failures: 1. phpunit-5.1.3/tests/TextUI/dataprovider-log-xml.phpt000066400000000000000000000031061263222771600225010ustar00rootroot00000000000000--TEST-- phpunit --log-junit php://stdout DataProviderTest ../_files/DataProviderTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ..F. 4 / 4 (100%) DataProviderTest::testAdd with data set #2 (1, 1, 3) Failed asserting that 2 matches expected 3. %s:%i Time: %s, Memory: %sMb There was 1 failure: 1) DataProviderTest::testAdd with data set #2 (1, 1, 3) Failed asserting that 2 matches expected 3. %s:%i FAILURES! Tests: 4, Assertions: 4, Failures: 1. phpunit-5.1.3/tests/TextUI/dataprovider-testdox.phpt000066400000000000000000000007071263222771600226200ustar00rootroot00000000000000--TEST-- phpunit --testdox DataProviderTest ../_files/DataProviderTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. DataProvider [ ] Add phpunit-5.1.3/tests/TextUI/debug.phpt000066400000000000000000000013551263222771600175320ustar00rootroot00000000000000--TEST-- phpunit --debug BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. Starting test 'BankAccountTest::testBalanceIsInitiallyZero'. . Starting test 'BankAccountTest::testBalanceCannotBecomeNegative'. . Starting test 'BankAccountTest::testBalanceCannotBecomeNegative2'. . 3 / 3 (100%) Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/default-isolation.phpt000066400000000000000000000011001263222771600220530ustar00rootroot00000000000000--TEST-- phpunit --process-isolation BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/default.phpt000066400000000000000000000007771263222771600200770ustar00rootroot00000000000000--TEST-- phpunit BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/dependencies-clone.phpt000066400000000000000000000011301263222771600221570ustar00rootroot00000000000000--TEST-- phpunit --verbose ClonedDependencyTest ../_files/ClonedDependencyTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. Runtime: %s .... 4 / 4 (100%) Time: %s, Memory: %s OK (4 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/dependencies-isolation.phpt000066400000000000000000000021011263222771600230570ustar00rootroot00000000000000--TEST-- phpunit --process-isolation --verbose DependencyTestSuite ../_files/DependencyTestSuite.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. Runtime: %s ...FSSS 7 / 7 (100%) Time: %s, Memory: %sMb There was 1 failure: 1) DependencyFailureTest::testOne %s:%i -- There were 3 skipped tests: 1) DependencyFailureTest::testTwo This test depends on "DependencyFailureTest::testOne" to pass. 2) DependencyFailureTest::testThree This test depends on "DependencyFailureTest::testTwo" to pass. 3) DependencyFailureTest::testFour This test depends on "DependencyFailureTest::testOne" to pass. FAILURES! Tests: 4, Assertions: 0, Failures: 1, Skipped: 3. phpunit-5.1.3/tests/TextUI/dependencies.phpt000066400000000000000000000020001263222771600210560ustar00rootroot00000000000000--TEST-- phpunit --verbose DependencyTestSuite ../_files/DependencyTestSuite.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. Runtime: %s ...FSSS 7 / 7 (100%) Time: %s, Memory: %sMb There was 1 failure: 1) DependencyFailureTest::testOne %s:%i -- There were 3 skipped tests: 1) DependencyFailureTest::testTwo This test depends on "DependencyFailureTest::testOne" to pass. 2) DependencyFailureTest::testThree This test depends on "DependencyFailureTest::testTwo" to pass. 3) DependencyFailureTest::testFour This test depends on "DependencyFailureTest::testOne" to pass. FAILURES! Tests: 4, Assertions: 0, Failures: 1, Skipped: 3. phpunit-5.1.3/tests/TextUI/dependencies2-isolation.phpt000066400000000000000000000010561263222771600231510ustar00rootroot00000000000000--TEST-- phpunit --process-isolation StackTest ../_files/StackTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: %s, Memory: %sMb OK (2 tests, 5 assertions) phpunit-5.1.3/tests/TextUI/dependencies2.phpt000066400000000000000000000007551263222771600211570ustar00rootroot00000000000000--TEST-- phpunit StackTest ../_files/StackTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: %s, Memory: %sMb OK (2 tests, 5 assertions) phpunit-5.1.3/tests/TextUI/dependencies3-isolation.phpt000066400000000000000000000011261263222771600231500ustar00rootroot00000000000000--TEST-- phpunit --process-isolation MultiDependencyTest ../_files/MultiDependencyTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: %s, Memory: %sMb OK (3 tests, 2 assertions) phpunit-5.1.3/tests/TextUI/dependencies3.phpt000066400000000000000000000010251263222771600211470ustar00rootroot00000000000000--TEST-- phpunit MultiDependencyTest ../_files/MultiDependencyTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: %s, Memory: %sMb OK (3 tests, 2 assertions) phpunit-5.1.3/tests/TextUI/empty-testcase.phpt000066400000000000000000000011611263222771600214060ustar00rootroot00000000000000--TEST-- phpunit EmptyTestCaseTest ../_files/EmptyTestCaseTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. W 1 / 1 (100%) Time: %s, Memory: %sMb There was 1 warning: 1) Warning No tests found in class "EmptyTestCaseTest". WARNINGS! Tests: 1, Assertions: 0, Warnings: 1. phpunit-5.1.3/tests/TextUI/exception-stack.phpt000066400000000000000000000020661263222771600215450ustar00rootroot00000000000000--TEST-- phpunit ExceptionStackTest ../_files/ExceptionStackTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. EE 2 / 2 (100%) Time: %s, Memory: %sMb There were 2 errors: 1) ExceptionStackTest::testPrintingChildException PHPUnit_Framework_Exception: Child exception message Failed asserting that two arrays are equal. --- Expected +++ Actual @@ @@ Array ( - 0 => 1 + 0 => 2 ) %s:%i Caused by message Failed asserting that two arrays are equal. --- Expected +++ Actual @@ @@ Array ( - 0 => 1 + 0 => 2 ) %s:%i 2) ExceptionStackTest::testNestedExceptions Exception: One %s:%i Caused by InvalidArgumentException: Two %s:%i Caused by Exception: Three %s:%i FAILURES! Tests: 2, Assertions: 1, Errors: 2. phpunit-5.1.3/tests/TextUI/exclude-group-isolation.phpt000066400000000000000000000013001263222771600232140ustar00rootroot00000000000000--TEST-- phpunit --process-isolation --exclude-group balanceIsInitiallyZero BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: %s, Memory: %sMb OK (2 tests, 2 assertions) phpunit-5.1.3/tests/TextUI/exclude-group.phpt000066400000000000000000000011771263222771600212310ustar00rootroot00000000000000--TEST-- phpunit --exclude-group balanceIsInitiallyZero BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: %s, Memory: %sMb OK (2 tests, 2 assertions) phpunit-5.1.3/tests/TextUI/failure-isolation.phpt000066400000000000000000000045761263222771600221020ustar00rootroot00000000000000--TEST-- phpunit --process-isolation FailureTest ../_files/FailureTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. FFFFFFFFFFFFF 13 / 13 (100%) Time: %s, Memory: %sMb There were 13 failures: 1) FailureTest::testAssertArrayEqualsArray message Failed asserting that two arrays are equal. --- Expected +++ Actual @@ @@ Array ( - 0 => 1 + 0 => 2 ) %s:%i 2) FailureTest::testAssertIntegerEqualsInteger message Failed asserting that 2 matches expected 1. %s:%i 3) FailureTest::testAssertObjectEqualsObject message Failed asserting that two objects are equal. --- Expected +++ Actual @@ @@ stdClass Object ( - 'foo' => 'bar' + 'bar' => 'foo' ) %s:%i 4) FailureTest::testAssertNullEqualsString message Failed asserting that 'bar' matches expected null. %s:%i 5) FailureTest::testAssertStringEqualsString message Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'foo' +'bar' %s:%i 6) FailureTest::testAssertTextEqualsText message Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ 'foo -bar +baz ' %s:%i 7) FailureTest::testAssertStringMatchesFormat message Failed asserting that format description matches text. --- Expected +++ Actual @@ @@ -*%s* +** %s:%i 8) FailureTest::testAssertNumericEqualsNumeric message Failed asserting that 2 matches expected 1. %s:%i 9) FailureTest::testAssertTextSameText message Failed asserting that two strings are identical. --- Expected +++ Actual @@ @@ -foo +bar %s:%i 10) FailureTest::testAssertObjectSameObject message Failed asserting that two variables reference the same object. %s:%i 11) FailureTest::testAssertObjectSameNull message Failed asserting that null is identical to an object of class "stdClass". %s:%i 12) FailureTest::testAssertFloatSameFloat message Failed asserting that 1.5 is identical to 1.0. %s:%i 13) FailureTest::testAssertStringMatchesFormatFile Failed asserting that format description matches text. --- Expected +++ Actual @@ @@ -FOO - +...BAR... %s:%i FAILURES! Tests: 13, Assertions: 14, Failures: 13. phpunit-5.1.3/tests/TextUI/failure-reverse-list.phpt000066400000000000000000000045641263222771600225220ustar00rootroot00000000000000--TEST-- phpunit --reverse-list FailureTest ../_files/FailureTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. FFFFFFFFFFFFF 13 / 13 (100%) Time: %s, Memory: %sMb There were 13 failures: 1) FailureTest::testAssertStringMatchesFormatFile Failed asserting that format description matches text. --- Expected +++ Actual @@ @@ -FOO - +...BAR... %s:%d 2) FailureTest::testAssertFloatSameFloat message Failed asserting that 1.5 is identical to 1.0. %s:%d 3) FailureTest::testAssertObjectSameNull message Failed asserting that null is identical to an object of class "stdClass". %s:%d 4) FailureTest::testAssertObjectSameObject message Failed asserting that two variables reference the same object. %s:%d 5) FailureTest::testAssertTextSameText message Failed asserting that two strings are identical. --- Expected +++ Actual @@ @@ -foo +bar %s:%d 6) FailureTest::testAssertNumericEqualsNumeric message Failed asserting that 2 matches expected 1. %s:%d 7) FailureTest::testAssertStringMatchesFormat message Failed asserting that format description matches text. --- Expected +++ Actual @@ @@ -*%s* +** %s:%d 8) FailureTest::testAssertTextEqualsText message Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ 'foo -bar +baz ' %s:%d 9) FailureTest::testAssertStringEqualsString message Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'foo' +'bar' %s:%d 10) FailureTest::testAssertNullEqualsString message Failed asserting that 'bar' matches expected null. %s:%d 11) FailureTest::testAssertObjectEqualsObject message Failed asserting that two objects are equal. --- Expected +++ Actual @@ @@ stdClass Object ( - 'foo' => 'bar' + 'bar' => 'foo' ) %s:22 12) FailureTest::testAssertIntegerEqualsInteger message Failed asserting that 2 matches expected 1. %s:%d 13) FailureTest::testAssertArrayEqualsArray message Failed asserting that two arrays are equal. --- Expected +++ Actual @@ @@ Array ( - 0 => 1 + 0 => 2 ) %s:%d FAILURES! Tests: 13, Assertions: 14, Failures: 13. phpunit-5.1.3/tests/TextUI/failure.phpt000066400000000000000000000044751263222771600201010ustar00rootroot00000000000000--TEST-- phpunit FailureTest ../_files/FailureTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. FFFFFFFFFFFFF 13 / 13 (100%) Time: %s, Memory: %sMb There were 13 failures: 1) FailureTest::testAssertArrayEqualsArray message Failed asserting that two arrays are equal. --- Expected +++ Actual @@ @@ Array ( - 0 => 1 + 0 => 2 ) %s:%i 2) FailureTest::testAssertIntegerEqualsInteger message Failed asserting that 2 matches expected 1. %s:%i 3) FailureTest::testAssertObjectEqualsObject message Failed asserting that two objects are equal. --- Expected +++ Actual @@ @@ stdClass Object ( - 'foo' => 'bar' + 'bar' => 'foo' ) %s:%i 4) FailureTest::testAssertNullEqualsString message Failed asserting that 'bar' matches expected null. %s:%i 5) FailureTest::testAssertStringEqualsString message Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'foo' +'bar' %s:%i 6) FailureTest::testAssertTextEqualsText message Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ 'foo -bar +baz ' %s:%i 7) FailureTest::testAssertStringMatchesFormat message Failed asserting that format description matches text. --- Expected +++ Actual @@ @@ -*%s* +** %s:%i 8) FailureTest::testAssertNumericEqualsNumeric message Failed asserting that 2 matches expected 1. %s:%i 9) FailureTest::testAssertTextSameText message Failed asserting that two strings are identical. --- Expected +++ Actual @@ @@ -foo +bar %s:%i 10) FailureTest::testAssertObjectSameObject message Failed asserting that two variables reference the same object. %s:%i 11) FailureTest::testAssertObjectSameNull message Failed asserting that null is identical to an object of class "stdClass". %s:%i 12) FailureTest::testAssertFloatSameFloat message Failed asserting that 1.5 is identical to 1.0. %s:%i 13) FailureTest::testAssertStringMatchesFormatFile Failed asserting that format description matches text. --- Expected +++ Actual @@ @@ -FOO - +...BAR... %s:%i FAILURES! Tests: 13, Assertions: 14, Failures: 13. phpunit-5.1.3/tests/TextUI/fatal-isolation.phpt000066400000000000000000000011661263222771600215320ustar00rootroot00000000000000--TEST-- phpunit FatalTest --process-isolation ../_files/FatalTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. E 1 / 1 (100%) Time: %s, Memory: %sMb There was 1 error: 1) FatalTest::testFatalError %s FAILURES! Tests: 1, Assertions: 0, Errors: 1. phpunit-5.1.3/tests/TextUI/filter-class-isolation.phpt000066400000000000000000000012441263222771600230300ustar00rootroot00000000000000--TEST-- phpunit --process-isolation --filter BankAccountTest BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/filter-class.phpt000066400000000000000000000011431263222771600210270ustar00rootroot00000000000000--TEST-- phpunit --filter BankAccountTest BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/filter-dataprovider-by-classname-and-range-isolation.phpt000066400000000000000000000013261263222771600306160ustar00rootroot00000000000000--TEST-- phpunit --process-isolation --filter DataProviderFilterTest#1-3 DataProviderFilterTest ../_files/DataProviderFilterTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/filter-dataprovider-by-classname-and-range.phpt000066400000000000000000000012251263222771600266150ustar00rootroot00000000000000--TEST-- phpunit --filter DataProviderFilterTest#1-3 DataProviderFilterTest ../_files/DataProviderFilterTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/filter-dataprovider-by-number-isolation.phpt000066400000000000000000000012641263222771600263070ustar00rootroot00000000000000--TEST-- phpunit --process-isolation --filter testTrue#3 DataProviderFilterTest ../_files/DataProviderFilterTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/TextUI/filter-dataprovider-by-number.phpt000066400000000000000000000011631263222771600243060ustar00rootroot00000000000000--TEST-- phpunit --filter testTrue#3 DataProviderFilterTest ../_files/DataProviderFilterTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/TextUI/filter-dataprovider-by-only-range-isolation.phpt000066400000000000000000000012531263222771600270700ustar00rootroot00000000000000--TEST-- phpunit --process-isolation --filter \#1-3 DataProviderFilterTest ../_files/DataProviderFilterTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/filter-dataprovider-by-only-range.phpt000066400000000000000000000011521263222771600250670ustar00rootroot00000000000000--TEST-- phpunit --filter \#1-3 DataProviderFilterTest ../_files/DataProviderFilterTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/filter-dataprovider-by-only-regexp-isolation.phpt000066400000000000000000000012621263222771600272660ustar00rootroot00000000000000--TEST-- phpunit --process-isolation --filter @false.* DataProviderFilterTest ../_files/DataProviderFilterTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: %s, Memory: %sMb OK (2 tests, 2 assertions) phpunit-5.1.3/tests/TextUI/filter-dataprovider-by-only-regexp.phpt000066400000000000000000000011611263222771600252650ustar00rootroot00000000000000--TEST-- phpunit --filter @false.* DataProviderFilterTest ../_files/DataProviderFilterTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: %s, Memory: %sMb OK (2 tests, 2 assertions) phpunit-5.1.3/tests/TextUI/filter-dataprovider-by-only-string-isolation.phpt000066400000000000000000000012671263222771600273070ustar00rootroot00000000000000--TEST-- phpunit --process-isolation --filter @false\ test DataProviderFilterTest ../_files/DataProviderFilterTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/TextUI/filter-dataprovider-by-only-string.phpt000066400000000000000000000011661263222771600253060ustar00rootroot00000000000000--TEST-- phpunit --filter @false\ test DataProviderFilterTest ../_files/DataProviderFilterTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/TextUI/filter-dataprovider-by-range-isolation.phpt000066400000000000000000000012721263222771600261120ustar00rootroot00000000000000--TEST-- phpunit --process-isolation --filter testTrue#1-3 DataProviderFilterTest ../_files/DataProviderFilterTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/filter-dataprovider-by-range.phpt000066400000000000000000000011711263222771600241110ustar00rootroot00000000000000--TEST-- phpunit --filter testTrue#1-3 DataProviderFilterTest ../_files/DataProviderFilterTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/filter-dataprovider-by-regexp-isolation.phpt000066400000000000000000000013041263222771600263040ustar00rootroot00000000000000--TEST-- phpunit --process-isolation --filter testFalse@false.* DataProviderFilterTest ../_files/DataProviderFilterTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: %s, Memory: %sMb OK (2 tests, 2 assertions) phpunit-5.1.3/tests/TextUI/filter-dataprovider-by-regexp.phpt000066400000000000000000000012031263222771600243030ustar00rootroot00000000000000--TEST-- phpunit --filter testFalse@false.* DataProviderFilterTest ../_files/DataProviderFilterTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: %s, Memory: %sMb OK (2 tests, 2 assertions) phpunit-5.1.3/tests/TextUI/filter-dataprovider-by-string-isolation.phpt000066400000000000000000000013111263222771600263160ustar00rootroot00000000000000--TEST-- phpunit --process-isolation --filter testFalse@false\ test DataProviderFilterTest ../_files/DataProviderFilterTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/TextUI/filter-dataprovider-by-string.phpt000066400000000000000000000012101263222771600243150ustar00rootroot00000000000000--TEST-- phpunit --filter testFalse@false\ test DataProviderFilterTest ../_files/DataProviderFilterTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/TextUI/filter-method-case-insensitive.phpt000066400000000000000000000011651263222771600244550ustar00rootroot00000000000000--TEST-- phpunit --filter /balanceIsInitiallyZero/i BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/TextUI/filter-method-case-sensitive-no-result.phpt000066400000000000000000000010331263222771600260460ustar00rootroot00000000000000--TEST-- phpunit --filter balanceIsInitiallyZero BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. Time: %s, Memory: %sMb No tests executed! phpunit-5.1.3/tests/TextUI/filter-method-isolation.phpt000066400000000000000000000012701263222771600232020ustar00rootroot00000000000000--TEST-- phpunit --process-isolation --filter testBalanceIsInitiallyZero BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/TextUI/filter-method.phpt000066400000000000000000000011671263222771600212100ustar00rootroot00000000000000--TEST-- phpunit --filter testBalanceIsInitiallyZero BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/TextUI/filter-no-results.phpt000066400000000000000000000010051263222771600220320ustar00rootroot00000000000000--TEST-- phpunit --filter doesNotExist BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. Time: %s, Memory: %sMb No tests executed! phpunit-5.1.3/tests/TextUI/group-isolation.phpt000066400000000000000000000012561263222771600215770ustar00rootroot00000000000000--TEST-- phpunit --process-isolation --group balanceIsInitiallyZero BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/TextUI/group.phpt000066400000000000000000000011551263222771600175760ustar00rootroot00000000000000--TEST-- phpunit --group balanceIsInitiallyZero BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/TextUI/help.phpt000066400000000000000000000107231263222771600173730ustar00rootroot00000000000000--TEST-- phpunit --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. Usage: phpunit [options] UnitTest [UnitTest.php] phpunit [options] Code Coverage Options: --coverage-clover Generate code coverage report in Clover XML format. --coverage-crap4j Generate code coverage report in Crap4J XML format. --coverage-html Generate code coverage report in HTML format. --coverage-php Export PHP_CodeCoverage object to file. --coverage-text= Generate code coverage report in text format. Default: Standard output. --coverage-xml Generate code coverage report in PHPUnit XML format. --whitelist Whitelist for code coverage analysis. Logging Options: --log-junit Log test execution in JUnit XML format to file. --log-tap Log test execution in TAP format to file. --log-teamcity Log test execution in TeamCity format to file. --log-json Log test execution in JSON format. --testdox-html Write agile documentation in HTML format to file. --testdox-text Write agile documentation in Text format to file. --reverse-list Print defects in reverse order Test Selection Options: --filter Filter which tests to run. --testsuite Filter which testsuite to run. --group ... Only runs tests from the specified group(s). --exclude-group ... Exclude tests from the specified group(s). --list-groups List available test groups. --test-suffix ... Only search for test in files with specified suffix(es). Default: Test.php,.phpt Test Execution Options: --report-useless-tests Be strict about tests that do not test anything. --strict-coverage Be strict about unintentionally covered code. --strict-global-state Be strict about changes to global state --disallow-test-output Be strict about output during tests. --disallow-resource-usage Be strict about resource usage during small tests. --enforce-time-limit Enforce time limit based on test size. --disallow-todo-tests Disallow @todo-annotated tests. --process-isolation Run each test in a separate PHP process. --no-globals-backup Do not backup and restore $GLOBALS for each test. --static-backup Backup and restore static attributes for each test. --colors= Use colors in output ("never", "auto" or "always"). --columns Number of columns to use for progress output. --columns max Use maximum number of columns for progress output. --stderr Write to STDERR instead of STDOUT. --stop-on-error Stop execution upon first error. --stop-on-failure Stop execution upon first error or failure. --stop-on-warning Stop execution upon first warning. --stop-on-risky Stop execution upon first risky test. --stop-on-skipped Stop execution upon first skipped test. --stop-on-incomplete Stop execution upon first incomplete test. -v|--verbose Output more verbose information. --debug Display debugging information during test execution. --loader TestSuiteLoader implementation to use. --repeat Runs the test(s) repeatedly. --tap Report test execution progress in TAP format. --teamcity Report test execution progress in TeamCity format. --testdox Report test execution progress in TestDox format. --printer TestListener implementation to use. Configuration Options: --bootstrap A "bootstrap" PHP file that is run before the tests. -c|--configuration Read configuration from XML file. --no-configuration Ignore default configuration file (phpunit.xml). --no-coverage Ignore code coverage configuration. --include-path Prepend PHP's include_path with given path(s). -d key[=value] Sets a php.ini value. Miscellaneous Options: -h|--help Prints this usage information. --version Prints the version and exits. --atleast-version Checks that version is greater than min and exits. phpunit-5.1.3/tests/TextUI/help2.phpt000066400000000000000000000107721263222771600174610ustar00rootroot00000000000000--TEST-- phpunit --help --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. Usage: phpunit [options] UnitTest [UnitTest.php] phpunit [options] Code Coverage Options: --coverage-clover Generate code coverage report in Clover XML format. --coverage-crap4j Generate code coverage report in Crap4J XML format. --coverage-html Generate code coverage report in HTML format. --coverage-php Export PHP_CodeCoverage object to file. --coverage-text= Generate code coverage report in text format. Default: Standard output. --coverage-xml Generate code coverage report in PHPUnit XML format. --whitelist Whitelist for code coverage analysis. Logging Options: --log-junit Log test execution in JUnit XML format to file. --log-tap Log test execution in TAP format to file. --log-teamcity Log test execution in TeamCity format to file. --log-json Log test execution in JSON format. --testdox-html Write agile documentation in HTML format to file. --testdox-text Write agile documentation in Text format to file. --reverse-list Print defects in reverse order Test Selection Options: --filter Filter which tests to run. --testsuite Filter which testsuite to run. --group ... Only runs tests from the specified group(s). --exclude-group ... Exclude tests from the specified group(s). --list-groups List available test groups. --test-suffix ... Only search for test in files with specified suffix(es). Default: Test.php,.phpt Test Execution Options: --report-useless-tests Be strict about tests that do not test anything. --strict-coverage Be strict about unintentionally covered code. --strict-global-state Be strict about changes to global state --disallow-test-output Be strict about output during tests. --disallow-resource-usage Be strict about resource usage during small tests. --enforce-time-limit Enforce time limit based on test size. --disallow-todo-tests Disallow @todo-annotated tests. --process-isolation Run each test in a separate PHP process. --no-globals-backup Do not backup and restore $GLOBALS for each test. --static-backup Backup and restore static attributes for each test. --colors= Use colors in output ("never", "auto" or "always"). --columns Number of columns to use for progress output. --columns max Use maximum number of columns for progress output. --stderr Write to STDERR instead of STDOUT. --stop-on-error Stop execution upon first error. --stop-on-failure Stop execution upon first error or failure. --stop-on-warning Stop execution upon first warning. --stop-on-risky Stop execution upon first risky test. --stop-on-skipped Stop execution upon first skipped test. --stop-on-incomplete Stop execution upon first incomplete test. -v|--verbose Output more verbose information. --debug Display debugging information during test execution. --loader TestSuiteLoader implementation to use. --repeat Runs the test(s) repeatedly. --tap Report test execution progress in TAP format. --teamcity Report test execution progress in TeamCity format. --testdox Report test execution progress in TestDox format. --printer TestListener implementation to use. Configuration Options: --bootstrap A "bootstrap" PHP file that is run before the tests. -c|--configuration Read configuration from XML file. --no-configuration Ignore default configuration file (phpunit.xml). --no-coverage Ignore code coverage configuration. --include-path Prepend PHP's include_path with given path(s). -d key[=value] Sets a php.ini value. Miscellaneous Options: -h|--help Prints this usage information. --version Prints the version and exits. --atleast-version Checks that version is greater than min and exits. phpunit-5.1.3/tests/TextUI/ini-isolation.phpt000066400000000000000000000012441263222771600212170ustar00rootroot00000000000000--TEST-- phpunit --process-isolation -d default_mimetype=application/x-test IniTest ../_files/IniTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/TextUI/list-groups.phpt000066400000000000000000000010221263222771600207230ustar00rootroot00000000000000--TEST-- phpunit --list-groups BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. Available test group(s): - balanceCannotBecomeNegative - balanceIsInitiallyZero - specification phpunit-5.1.3/tests/TextUI/log-json-post-66021.phpt000066400000000000000000000036171263222771600216360ustar00rootroot00000000000000--TEST-- phpunit --log-json php://stdout BankAccountTest ../_files/BankAccountTest.php --SKIPIF-- --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. { "event": "suiteStart", "suite": "BankAccountTest", "tests": 3 }{ "event": "testStart", "suite": "BankAccountTest", "test": "BankAccountTest::testBalanceIsInitiallyZero" }.{ "event": "test", "suite": "BankAccountTest", "test": "BankAccountTest::testBalanceIsInitiallyZero", "status": "pass", "time": %f, "trace": [], "message": "", "output": "" }{ "event": "testStart", "suite": "BankAccountTest", "test": "BankAccountTest::testBalanceCannotBecomeNegative" }.{ "event": "test", "suite": "BankAccountTest", "test": "BankAccountTest::testBalanceCannotBecomeNegative", "status": "pass", "time": %f, "trace": [], "message": "", "output": "" }{ "event": "testStart", "suite": "BankAccountTest", "test": "BankAccountTest::testBalanceCannotBecomeNegative2" }. 3 / 3 (100%){ "event": "test", "suite": "BankAccountTest", "test": "BankAccountTest::testBalanceCannotBecomeNegative2", "status": "pass", "time": %f, "trace": [], "message": "", "output": "" } Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/log-tap.phpt000066400000000000000000000014271263222771600200070ustar00rootroot00000000000000--TEST-- phpunit --log-tap php://stdout BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. TAP version 13 .ok 1 - BankAccountTest::testBalanceIsInitiallyZero .ok 2 - BankAccountTest::testBalanceCannotBecomeNegative . 3 / 3 (100%)ok 3 - BankAccountTest::testBalanceCannotBecomeNegative2 1..3 Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/log-teamcity.phpt000066400000000000000000000032331263222771600210370ustar00rootroot00000000000000--TEST-- phpunit --log-teamcity php://stdout BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ##teamcity[testCount count='3' flowId='%d'] ##teamcity[testSuiteStarted name='BankAccountTest' locationHint='php_qn://%s/tests/_files/BankAccountTest.php::\BankAccountTest' flowId='%d'] ##teamcity[testStarted name='testBalanceIsInitiallyZero' locationHint='php_qn://%s/tests/_files/BankAccountTest.php::\BankAccountTest::testBalanceIsInitiallyZero' flowId='%d'] . ##teamcity[testFinished name='testBalanceIsInitiallyZero' duration='%s' flowId='%d'] ##teamcity[testStarted name='testBalanceCannotBecomeNegative' locationHint='php_qn://%s/tests/_files/BankAccountTest.php::\BankAccountTest::testBalanceCannotBecomeNegative' flowId='%d'] . ##teamcity[testFinished name='testBalanceCannotBecomeNegative' duration='%s' flowId='%d'] ##teamcity[testStarted name='testBalanceCannotBecomeNegative2' locationHint='php_qn://%s/tests/_files/BankAccountTest.php::\BankAccountTest::testBalanceCannotBecomeNegative2' flowId='%d'] . 3 / 3 (100%) ##teamcity[testFinished name='testBalanceCannotBecomeNegative2' duration='%s' flowId='%d'] ##teamcity[testSuiteFinished name='BankAccountTest' flowId='%d'] Time: %s, Memory: %s OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/log-xml.phpt000066400000000000000000000023321263222771600200170ustar00rootroot00000000000000--TEST-- phpunit --log-junit php://stdout BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/options-after-arguments.phpt000066400000000000000000000010141263222771600232310ustar00rootroot00000000000000--TEST-- phpunit BankAccountTest ../_files/BankAccountTest.php --colors --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: %s, Memory: %sMb %s[30;42mOK (3 tests, 3 assertions)%s[0m phpunit-5.1.3/tests/TextUI/output-isolation.phpt000066400000000000000000000012151263222771600217760ustar00rootroot00000000000000--TEST-- phpunit --process-isolation --filter testExpectOutputStringFooActualFoo ../_files/OutputTestCase.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: %s, Memory: %sMb OK (1 test, 1 assertion) phpunit-5.1.3/tests/TextUI/phpt-stderr.phpt000066400000000000000000000003701263222771600207140ustar00rootroot00000000000000--TEST-- GH-1169: PHPT runner doesn't look at STDERR. --FILE-- --EXPECTF-- PHPUnit must look at STDERR when running PHPT tests. phpunit-5.1.3/tests/TextUI/repeat.phpt000066400000000000000000000011071263222771600177170ustar00rootroot00000000000000--TEST-- phpunit --repeat 3 BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ......... 9 / 9 (100%) Time: %s, Memory: %sMb OK (9 tests, 9 assertions) phpunit-5.1.3/tests/TextUI/report-useless-tests-incomplete.phpt000066400000000000000000000012021263222771600247240ustar00rootroot00000000000000--TEST-- phpunit --report-useless-tests IncompleteTest ../_files/IncompleteTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. I 1 / 1 (100%) Time: %s, Memory: %sMb OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Incomplete: 1. phpunit-5.1.3/tests/TextUI/report-useless-tests-isolation.phpt000066400000000000000000000012701263222771600245730ustar00rootroot00000000000000--TEST-- phpunit --report-useless-tests --process-isolation IncompleteTest ../_files/IncompleteTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. R 1 / 1 (100%) Time: %s, Memory: %sMb OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Risky: 1. phpunit-5.1.3/tests/TextUI/report-useless-tests.phpt000066400000000000000000000011611263222771600225730ustar00rootroot00000000000000--TEST-- phpunit --report-useless-tests NothingTest ../_files/NothingTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. R 1 / 1 (100%) Time: %s, Memory: %sMb OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Risky: 1. phpunit-5.1.3/tests/TextUI/stop-on-warning-via-cli.phpt000066400000000000000000000011611263222771600230230ustar00rootroot00000000000000--TEST-- phpunit --stop-on-warning StopOnWarningTestSuite ./tests/_files/StopOnWarningTestSuite.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. W Time: %s, Memory: %sMb There was 1 warning: 1) Warning No tests found in class "NoTestCases". WARNINGS! Tests: 1, Assertions: 0, Warnings: 1.phpunit-5.1.3/tests/TextUI/stop-on-warning-via-config.phpt000066400000000000000000000013521263222771600235230ustar00rootroot00000000000000--TEST-- phpunit -c ../_files/configuration_stop_on_warning.xml --stop-on-warning StopOnWarningTestSuite ./tests/_files/StopOnWarningTestSuite.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. W Time: %s, Memory: %sMb There was 1 warning: 1) Warning No tests found in class "NoTestCases". WARNINGS! Tests: 1, Assertions: 0, Warnings: 1.phpunit-5.1.3/tests/TextUI/tap.phpt000066400000000000000000000010431263222771600172220ustar00rootroot00000000000000--TEST-- phpunit --tap BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- TAP version 13 ok 1 - BankAccountTest::testBalanceIsInitiallyZero ok 2 - BankAccountTest::testBalanceCannotBecomeNegative ok 3 - BankAccountTest::testBalanceCannotBecomeNegative2 1..3 phpunit-5.1.3/tests/TextUI/teamcity.phpt000066400000000000000000000030201263222771600202520ustar00rootroot00000000000000--TEST-- phpunit --teamcity BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ##teamcity[testCount count='3' flowId='%d'] ##teamcity[testSuiteStarted name='BankAccountTest' locationHint='php_qn://%s/tests/_files/BankAccountTest.php::\BankAccountTest' flowId='%d'] ##teamcity[testStarted name='testBalanceIsInitiallyZero' locationHint='php_qn://%s/tests/_files/BankAccountTest.php::\BankAccountTest::testBalanceIsInitiallyZero' flowId='%d'] ##teamcity[testFinished name='testBalanceIsInitiallyZero' duration='%s' flowId='%d'] ##teamcity[testStarted name='testBalanceCannotBecomeNegative' locationHint='php_qn://%s/tests/_files/BankAccountTest.php::\BankAccountTest::testBalanceCannotBecomeNegative' flowId='%d'] ##teamcity[testFinished name='testBalanceCannotBecomeNegative' duration='%s' flowId='%d'] ##teamcity[testStarted name='testBalanceCannotBecomeNegative2' locationHint='php_qn://%s/tests/_files/BankAccountTest.php::\BankAccountTest::testBalanceCannotBecomeNegative2' flowId='%d'] ##teamcity[testFinished name='testBalanceCannotBecomeNegative2' duration='%s' flowId='%d'] ##teamcity[testSuiteFinished name='BankAccountTest' flowId='%d'] Time: %s, Memory: %s OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/test-suffix-multiple.phpt000066400000000000000000000010221263222771600225450ustar00rootroot00000000000000--TEST-- phpunit --test-suffix .test.php,.my.php ../_files/ --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ..... 5 / 5 (100%) Time: %s, Memory: %sMb OK (5 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/test-suffix-single.phpt000066400000000000000000000010021263222771600221710ustar00rootroot00000000000000--TEST-- phpunit --test-suffix .test.php ../_files/ --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/testdox-html.phpt000066400000000000000000000013761263222771600211030ustar00rootroot00000000000000--TEST-- phpunit --testdox-html php://stdout BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors.

BankAccount

    ... 3 / 3 (100%)
  • Balance is initially zero
  • Balance cannot become negative
Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/testdox-text.phpt000066400000000000000000000012711263222771600211150ustar00rootroot00000000000000--TEST-- phpunit --testdox-text php://stdout BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. BankAccount ... 3 / 3 (100%) [x] Balance is initially zero [x] Balance cannot become negative Time: %s, Memory: %sMb OK (3 tests, 3 assertions) phpunit-5.1.3/tests/TextUI/testdox.phpt000066400000000000000000000010041263222771600201250ustar00rootroot00000000000000--TEST-- phpunit --testdox php://stdout BankAccountTest ../_files/BankAccountTest.php --FILE-- --EXPECTF-- PHPUnit %s by Sebastian Bergmann and contributors. BankAccount [x] Balance is initially zero [x] Balance cannot become negative phpunit-5.1.3/tests/Util/000077500000000000000000000000001263222771600152765ustar00rootroot00000000000000phpunit-5.1.3/tests/Util/ConfigurationTest.php000066400000000000000000000373161263222771600214700ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 3.3.0 */ class Util_ConfigurationTest extends PHPUnit_Framework_TestCase { protected $configuration; protected function setUp() { $this->configuration = PHPUnit_Util_Configuration::getInstance( dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'configuration.xml' ); } /** * @covers PHPUnit_Util_Configuration::getInstance * @expectedException PHPUnit_Framework_Exception */ public function testExceptionIsThrownForNotExistingConfigurationFile() { PHPUnit_Util_Configuration::getInstance('not_existing_file.xml'); } /** * @covers PHPUnit_Util_Configuration::getPHPUnitConfiguration */ public function testShouldReadColorsWhenTrueInConfigurationfile() { $configurationFilename = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'configuration.colors.true.xml'; $configurationInstance = PHPUnit_Util_Configuration::getInstance($configurationFilename); $configurationValues = $configurationInstance->getPHPUnitConfiguration(); $this->assertEquals(PHPUnit_TextUI_ResultPrinter::COLOR_AUTO, $configurationValues['colors']); } /** * @covers PHPUnit_Util_Configuration::getPHPUnitConfiguration */ public function testShouldReadColorsWhenFalseInConfigurationfile() { $configurationFilename = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'configuration.colors.false.xml'; $configurationInstance = PHPUnit_Util_Configuration::getInstance($configurationFilename); $configurationValues = $configurationInstance->getPHPUnitConfiguration(); $this->assertEquals(PHPUnit_TextUI_ResultPrinter::COLOR_NEVER, $configurationValues['colors']); } /** * @covers PHPUnit_Util_Configuration::getPHPUnitConfiguration */ public function testShouldReadColorsWhenEmptyInConfigurationfile() { $configurationFilename = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'configuration.colors.empty.xml'; $configurationInstance = PHPUnit_Util_Configuration::getInstance($configurationFilename); $configurationValues = $configurationInstance->getPHPUnitConfiguration(); $this->assertEquals(PHPUnit_TextUI_ResultPrinter::COLOR_NEVER, $configurationValues['colors']); } /** * @covers PHPUnit_Util_Configuration::getPHPUnitConfiguration */ public function testShouldReadColorsWhenInvalidInConfigurationfile() { $configurationFilename = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'configuration.colors.invalid.xml'; $configurationInstance = PHPUnit_Util_Configuration::getInstance($configurationFilename); $configurationValues = $configurationInstance->getPHPUnitConfiguration(); $this->assertEquals(PHPUnit_TextUI_ResultPrinter::COLOR_NEVER, $configurationValues['colors']); } /** * @covers PHPUnit_Util_Configuration::getFilterConfiguration */ public function testFilterConfigurationIsReadCorrectly() { $this->assertEquals( [ 'whitelist' => [ 'addUncoveredFilesFromWhitelist' => true, 'processUncoveredFilesFromWhitelist' => false, 'include' => [ 'directory' => [ 0 => [ 'path' => '/path/to/files', 'prefix' => '', 'suffix' => '.php', 'group' => 'DEFAULT' ], ], 'file' => [ 0 => '/path/to/file', ], ], 'exclude' => [ 'directory' => [ 0 => [ 'path' => '/path/to/files', 'prefix' => '', 'suffix' => '.php', 'group' => 'DEFAULT' ], ], 'file' => [ 0 => '/path/to/file', ], ], ], ], $this->configuration->getFilterConfiguration() ); } /** * @covers PHPUnit_Util_Configuration::getGroupConfiguration */ public function testGroupConfigurationIsReadCorrectly() { $this->assertEquals( [ 'include' => [ 0 => 'name', ], 'exclude' => [ 0 => 'name', ], ], $this->configuration->getGroupConfiguration() ); } /** * @covers PHPUnit_Util_Configuration::getListenerConfiguration */ public function testListenerConfigurationIsReadCorrectly() { $dir = __DIR__; $includePath = ini_get('include_path'); ini_set('include_path', $dir . PATH_SEPARATOR . $includePath); $this->assertEquals( [ 0 => [ 'class' => 'MyListener', 'file' => '/optional/path/to/MyListener.php', 'arguments' => [ 0 => [ 0 => 'Sebastian', ], 1 => 22, 2 => 'April', 3 => 19.78, 4 => null, 5 => new stdClass, 6 => dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'MyTestFile.php', 7 => dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'MyRelativePath', ], ], [ 'class' => 'IncludePathListener', 'file' => __FILE__, 'arguments' => [] ], [ 'class' => 'CompactArgumentsListener', 'file' => '/CompactArgumentsListener.php', 'arguments' => [ 0 => 42 ], ], ], $this->configuration->getListenerConfiguration() ); ini_set('include_path', $includePath); } /** * @covers PHPUnit_Util_Configuration::getLoggingConfiguration */ public function testLoggingConfigurationIsReadCorrectly() { $this->assertEquals( [ 'lowUpperBound' => '50', 'highLowerBound' => '90', 'coverage-html' => '/tmp/report', 'coverage-clover' => '/tmp/clover.xml', 'json' => '/tmp/logfile.json', 'plain' => '/tmp/logfile.txt', 'tap' => '/tmp/logfile.tap', 'logIncompleteSkipped' => false, 'junit' => '/tmp/logfile.xml', 'testdox-html' => '/tmp/testdox.html', 'testdox-text' => '/tmp/testdox.txt', ], $this->configuration->getLoggingConfiguration() ); } /** * @covers PHPUnit_Util_Configuration::getPHPConfiguration */ public function testPHPConfigurationIsReadCorrectly() { $this->assertEquals( [ 'include_path' => [ dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . '.', '/path/to/lib' ], 'ini' => ['foo' => 'bar'], 'const' => ['FOO' => false, 'BAR' => true], 'var' => ['foo' => false], 'env' => ['foo' => true], 'post' => ['foo' => 'bar'], 'get' => ['foo' => 'bar'], 'cookie' => ['foo' => 'bar'], 'server' => ['foo' => 'bar'], 'files' => ['foo' => 'bar'], 'request'=> ['foo' => 'bar'], ], $this->configuration->getPHPConfiguration() ); } /** * @backupGlobals enabled * @covers PHPUnit_Util_Configuration::handlePHPConfiguration */ public function testPHPConfigurationIsHandledCorrectly() { $this->configuration->handlePHPConfiguration(); $path = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . '.' . PATH_SEPARATOR . '/path/to/lib'; $this->assertStringStartsWith($path, ini_get('include_path')); $this->assertEquals(false, FOO); $this->assertEquals(true, BAR); $this->assertEquals(false, $GLOBALS['foo']); $this->assertEquals(true, $_ENV['foo']); $this->assertEquals(true, getenv('foo')); $this->assertEquals('bar', $_POST['foo']); $this->assertEquals('bar', $_GET['foo']); $this->assertEquals('bar', $_COOKIE['foo']); $this->assertEquals('bar', $_SERVER['foo']); $this->assertEquals('bar', $_FILES['foo']); $this->assertEquals('bar', $_REQUEST['foo']); } /** * @backupGlobals enabled * * @see https://github.com/sebastianbergmann/phpunit/issues/1181 */ public function testHandlePHPConfigurationDoesNotOverwrittenExistingEnvArrayVariables() { $_ENV['foo'] = false; $this->configuration->handlePHPConfiguration(); $this->assertEquals(false, $_ENV['foo']); $this->assertEquals(true, getenv('foo')); } /** * @backupGlobals enabled * * @see https://github.com/sebastianbergmann/phpunit/issues/1181 */ public function testHandlePHPConfigurationDoesNotOverriteVariablesFromPutEnv() { putenv('foo=putenv'); $this->configuration->handlePHPConfiguration(); $this->assertEquals(true, $_ENV['foo']); $this->assertEquals('putenv', getenv('foo')); } /** * @covers PHPUnit_Util_Configuration::getPHPUnitConfiguration */ public function testPHPUnitConfigurationIsReadCorrectly() { $this->assertEquals( [ 'backupGlobals' => true, 'backupStaticAttributes' => false, 'beStrictAboutChangesToGlobalState' => false, 'bootstrap' => '/path/to/bootstrap.php', 'cacheTokens' => false, 'columns' => 80, 'colors' => 'never', 'stderr' => false, 'convertErrorsToExceptions' => true, 'convertNoticesToExceptions' => true, 'convertWarningsToExceptions' => true, 'forceCoversAnnotation' => false, 'mapTestClassNameToCoveredClassName' => false, 'printerClass' => 'PHPUnit_TextUI_ResultPrinter', 'stopOnFailure' => false, 'stopOnWarning' => false, 'reportUselessTests' => false, 'strictCoverage' => false, 'disallowTestOutput' => false, 'enforceTimeLimit' => false, 'testSuiteLoaderClass' => 'PHPUnit_Runner_StandardTestSuiteLoader', 'verbose' => false, 'timeoutForSmallTests' => 1, 'timeoutForMediumTests' => 10, 'timeoutForLargeTests' => 60, 'beStrictAboutResourceUsageDuringSmallTests' => false, 'disallowTodoAnnotatedTests' => false ], $this->configuration->getPHPUnitConfiguration() ); } /** * @covers PHPUnit_Util_Configuration::getInstance */ public function testXincludeInConfiguration() { $configurationWithXinclude = PHPUnit_Util_Configuration::getInstance( dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'configuration_xinclude.xml' ); $this->assertConfigurationEquals( $this->configuration, $configurationWithXinclude ); } /** * @ticket 1311 * @covers PHPUnit_Util_Configuration::getLoggingConfiguration * @covers PHPUnit_Util_Configuration::getPHPConfiguration * @covers PHPUnit_Util_Configuration::getPHPUnitConfiguration * @covers PHPUnit_Util_Configuration::getTestSuiteConfiguration * @covers PHPUnit_Util_Configuration::getFilterConfiguration * * @uses PHPUnit_Util_Configuration::getInstance */ public function testWithEmptyConfigurations() { $emptyConfiguration = PHPUnit_Util_Configuration::getInstance( dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'configuration_empty.xml' ); $logging = $emptyConfiguration->getLoggingConfiguration(); $this->assertEmpty($logging); $php = $emptyConfiguration->getPHPConfiguration(); $this->assertEmpty($php['include_path']); $phpunit = $emptyConfiguration->getPHPUnitConfiguration(); $this->assertArrayNotHasKey('bootstrap', $phpunit); $this->assertArrayNotHasKey('testSuiteLoaderFile', $phpunit); $this->assertArrayNotHasKey('printerFile', $phpunit); $suite = $emptyConfiguration->getTestSuiteConfiguration(); $this->assertEmpty($suite->getGroups()); $filter = $emptyConfiguration->getFilterConfiguration(); $this->assertEmpty($filter['whitelist']['include']['directory']); $this->assertEmpty($filter['whitelist']['include']['file']); $this->assertEmpty($filter['whitelist']['exclude']['directory']); $this->assertEmpty($filter['whitelist']['exclude']['file']); } /** * Asserts that the values in $actualConfiguration equal $expectedConfiguration. * * @param PHPUnit_Util_Configuration $expectedConfiguration * @param PHPUnit_Util_Configuration $actualConfiguration */ protected function assertConfigurationEquals(PHPUnit_Util_Configuration $expectedConfiguration, PHPUnit_Util_Configuration $actualConfiguration) { $this->assertEquals( $expectedConfiguration->getFilterConfiguration(), $actualConfiguration->getFilterConfiguration() ); $this->assertEquals( $expectedConfiguration->getGroupConfiguration(), $actualConfiguration->getGroupConfiguration() ); $this->assertEquals( $expectedConfiguration->getListenerConfiguration(), $actualConfiguration->getListenerConfiguration() ); $this->assertEquals( $expectedConfiguration->getLoggingConfiguration(), $actualConfiguration->getLoggingConfiguration() ); $this->assertEquals( $expectedConfiguration->getPHPConfiguration(), $actualConfiguration->getPHPConfiguration() ); $this->assertEquals( $expectedConfiguration->getPHPUnitConfiguration(), $actualConfiguration->getPHPUnitConfiguration() ); $this->assertEquals( $expectedConfiguration->getTestSuiteConfiguration(), $actualConfiguration->getTestSuiteConfiguration() ); } } phpunit-5.1.3/tests/Util/GetoptTest.php000066400000000000000000000024401263222771600201110ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** */ class Util_GetoptTest extends PHPUnit_Framework_TestCase { public function testItIncludeTheLongOptionsAfterTheArgument() { $args = [ 'command', 'myArgument', '--colors', ]; $actual = PHPUnit_Util_Getopt::getopt($args, '', ['colors==']); $expected = [ [ [ '--colors', null, ], ], [ 'myArgument', ], ]; $this->assertEquals($expected, $actual); } public function testItIncludeTheShortOptionsAfterTheArgument() { $args = [ 'command', 'myArgument', '-v', ]; $actual = PHPUnit_Util_Getopt::getopt($args, 'v'); $expected = [ [ [ 'v', null, ], ], [ 'myArgument', ], ]; $this->assertEquals($expected, $actual); } } phpunit-5.1.3/tests/Util/GlobalStateTest.php000066400000000000000000000021311263222771600210450ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** */ class Util_GlobalStateTest extends PHPUnit_Framework_TestCase { /** * @covers PHPUnit_Util_GlobalState::processIncludedFilesAsString */ public function testIncludedFilesAsStringSkipsVfsProtocols() { $dir = __DIR__; $files = [ 'phpunit', // The 0 index is not used $dir . '/ConfigurationTest.php', $dir . '/GlobalStateTest.php', 'vfs://' . $dir . '/RegexTest.php', 'phpvfs53e46260465c7://' . $dir . '/TestTest.php', 'file://' . $dir . '/XMLTest.php' ]; $this->assertEquals( "require_once '" . $dir . "/ConfigurationTest.php';\n" . "require_once '" . $dir . "/GlobalStateTest.php';\n" . "require_once 'file://" . $dir . "/XMLTest.php';\n", PHPUnit_Util_GlobalState::processIncludedFilesAsString($files)); } } phpunit-5.1.3/tests/Util/PHPTest.php000066400000000000000000000051251263222771600173010ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @author Henrique Moody * @copyright Sebastian Bergmann * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License * * @link http://www.phpunit.de/ * @covers PHPUnit_Util_PHP */ class PHPUnit_Util_PHPTest extends PHPUnit_Framework_TestCase { public function testShouldNotUseStderrRedirectionByDefault() { $phpMock = $this->getMockForAbstractClass('PHPUnit_Util_PHP'); $this->assertFalse($phpMock->useStderrRedirection()); } public function testShouldDefinedIfUseStderrRedirection() { $phpMock = $this->getMockForAbstractClass('PHPUnit_Util_PHP'); $phpMock->setUseStderrRedirection(true); $this->assertTrue($phpMock->useStderrRedirection()); } public function testShouldDefinedIfDoNotUseStderrRedirection() { $phpMock = $this->getMockForAbstractClass('PHPUnit_Util_PHP'); $phpMock->setUseStderrRedirection(false); $this->assertFalse($phpMock->useStderrRedirection()); } /** * @expectedException PHPUnit_Framework_Exception * @expectedExceptionMessage Argument #1 (No Value) of PHPUnit_Util_PHP::setUseStderrRedirection() must be a boolean */ public function testShouldThrowsExceptionWhenStderrRedirectionVariableIsNotABoolean() { $phpMock = $this->getMockForAbstractClass('PHPUnit_Util_PHP'); $phpMock->setUseStderrRedirection(null); } public function testShouldUseGivenSettingsToCreateCommand() { $phpMock = $this->getMockForAbstractClass('PHPUnit_Util_PHP'); $settings = [ 'allow_url_fopen=1', 'auto_append_file=', 'display_errors=1', ]; $expectedCommandFormat = '%s -d allow_url_fopen=1 -d auto_append_file= -d display_errors=1'; $actualCommand = $phpMock->getCommand($settings); $this->assertStringMatchesFormat($expectedCommandFormat, $actualCommand); } public function testShouldRedirectStderrToStdoutWhenDefined() { $phpMock = $this->getMockForAbstractClass('PHPUnit_Util_PHP'); $phpMock->setUseStderrRedirection(true); $expectedCommandFormat = '%s 2>&1'; $actualCommand = $phpMock->getCommand([]); $this->assertStringMatchesFormat($expectedCommandFormat, $actualCommand); } } phpunit-5.1.3/tests/Util/RegexTest.php000066400000000000000000000025331263222771600177240ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 4.2.0 */ class Util_RegexTest extends PHPUnit_Framework_TestCase { public function validRegexpProvider() { return [ ['#valid regexp#', 'valid regexp', 1], [';val.*xp;', 'valid regexp', 1], ['/val.*xp/i', 'VALID REGEXP', 1], ['/a val.*p/','valid regexp', 0], ]; } public function invalidRegexpProvider() { return [ ['valid regexp', 'valid regexp'], [';val.*xp', 'valid regexp'], ['val.*xp/i', 'VALID REGEXP'], ]; } /** * @dataProvider validRegexpProvider * @covers PHPUnit_Util_Regex::pregMatchSafe */ public function testValidRegex($pattern, $subject, $return) { $this->assertEquals($return, PHPUnit_Util_Regex::pregMatchSafe($pattern, $subject)); } /** * @dataProvider invalidRegexpProvider * @covers PHPUnit_Util_Regex::pregMatchSafe */ public function testInvalidRegex($pattern, $subject) { $this->assertFalse(PHPUnit_Util_Regex::pregMatchSafe($pattern, $subject)); } } phpunit-5.1.3/tests/Util/TestDox/000077500000000000000000000000001263222771600166705ustar00rootroot00000000000000phpunit-5.1.3/tests/Util/TestDox/NamePrettifierTest.php000066400000000000000000000062461263222771600231670ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 2.1.0 */ class Util_TestDox_NamePrettifierTest extends PHPUnit_Framework_TestCase { protected $namePrettifier; protected function setUp() { $this->namePrettifier = new PHPUnit_Util_TestDox_NamePrettifier; } /** * @covers PHPUnit_Util_TestDox_NamePrettifier::prettifyTestClass */ public function testTitleHasSensibleDefaults() { $this->assertEquals('Foo', $this->namePrettifier->prettifyTestClass('FooTest')); $this->assertEquals('Foo', $this->namePrettifier->prettifyTestClass('TestFoo')); $this->assertEquals('Foo', $this->namePrettifier->prettifyTestClass('TestFooTest')); $this->assertEquals('Foo', $this->namePrettifier->prettifyTestClass('Test\FooTest')); } /** * @covers PHPUnit_Util_TestDox_NamePrettifier::prettifyTestClass */ public function testCaterForUserDefinedSuffix() { $this->namePrettifier->setSuffix('TestCase'); $this->namePrettifier->setPrefix(null); $this->assertEquals('Foo', $this->namePrettifier->prettifyTestClass('FooTestCase')); $this->assertEquals('TestFoo', $this->namePrettifier->prettifyTestClass('TestFoo')); $this->assertEquals('FooTest', $this->namePrettifier->prettifyTestClass('FooTest')); } /** * @covers PHPUnit_Util_TestDox_NamePrettifier::prettifyTestClass */ public function testCaterForUserDefinedPrefix() { $this->namePrettifier->setSuffix(null); $this->namePrettifier->setPrefix('XXX'); $this->assertEquals('Foo', $this->namePrettifier->prettifyTestClass('XXXFoo')); $this->assertEquals('TestXXX', $this->namePrettifier->prettifyTestClass('TestXXX')); $this->assertEquals('XXX', $this->namePrettifier->prettifyTestClass('XXXXXX')); } /** * @covers PHPUnit_Util_TestDox_NamePrettifier::prettifyTestMethod */ public function testTestNameIsConvertedToASentence() { $this->assertEquals('This is a test', $this->namePrettifier->prettifyTestMethod('testThisIsATest')); $this->assertEquals('This is a test', $this->namePrettifier->prettifyTestMethod('testThisIsATest2')); $this->assertEquals('this is a test', $this->namePrettifier->prettifyTestMethod('this_is_a_test')); $this->assertEquals('Foo for bar is 0', $this->namePrettifier->prettifyTestMethod('testFooForBarIs0')); $this->assertEquals('Foo for baz is 1', $this->namePrettifier->prettifyTestMethod('testFooForBazIs1')); } /** * @covers PHPUnit_Util_TestDox_NamePrettifier::prettifyTestMethod * @ticket 224 */ public function testTestNameIsNotGroupedWhenNotInSequence() { $this->assertEquals('Sets redirect header on 301', $this->namePrettifier->prettifyTestMethod('testSetsRedirectHeaderOn301')); $this->assertEquals('Sets redirect header on 302', $this->namePrettifier->prettifyTestMethod('testSetsRedirectHeaderOn302')); } } phpunit-5.1.3/tests/Util/TestTest.php000066400000000000000000000541321263222771600175730ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (!defined('TEST_FILES_PATH')) { define( 'TEST_FILES_PATH', dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR ); } require TEST_FILES_PATH . 'CoverageNamespacedFunctionTest.php'; require TEST_FILES_PATH . 'NamespaceCoveredFunction.php'; /** * @since Class available since Release 3.3.6 */ class Util_TestTest extends PHPUnit_Framework_TestCase { /** * @covers PHPUnit_Util_Test::getExpectedException * * @todo Split up in separate tests */ public function testGetExpectedException() { $this->assertArraySubset( ['class' => 'FooBarBaz', 'code' => null, 'message' => ''], PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testOne') ); $this->assertArraySubset( ['class' => 'Foo_Bar_Baz', 'code' => null, 'message' => ''], PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testTwo') ); $this->assertArraySubset( ['class' => 'Foo\Bar\Baz', 'code' => null, 'message' => ''], PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testThree') ); $this->assertArraySubset( ['class' => 'ã»ã’', 'code' => null, 'message' => ''], PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testFour') ); $this->assertArraySubset( ['class' => 'Class', 'code' => 1234, 'message' => 'Message'], PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testFive') ); $this->assertArraySubset( ['class' => 'Class', 'code' => 1234, 'message' => 'Message'], PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testSix') ); $this->assertArraySubset( ['class' => 'Class', 'code' => 'ExceptionCode', 'message' => 'Message'], PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testSeven') ); $this->assertArraySubset( ['class' => 'Class', 'code' => 0, 'message' => 'Message'], PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testEight') ); $this->assertArraySubset( ['class' => 'Class', 'code' => ExceptionTest::ERROR_CODE, 'message' => ExceptionTest::ERROR_MESSAGE], PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testNine') ); $this->assertArraySubset( ['class' => 'Class', 'code' => null, 'message' => ''], PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testSingleLine') ); $this->assertArraySubset( ['class' => 'Class', 'code' => My\Space\ExceptionNamespaceTest::ERROR_CODE, 'message' => My\Space\ExceptionNamespaceTest::ERROR_MESSAGE], PHPUnit_Util_Test::getExpectedException('My\Space\ExceptionNamespaceTest', 'testConstants') ); // Ensure the Class::CONST expression is only evaluated when the constant really exists $this->assertArraySubset( ['class' => 'Class', 'code' => 'ExceptionTest::UNKNOWN_CODE_CONSTANT', 'message' => 'ExceptionTest::UNKNOWN_MESSAGE_CONSTANT'], PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testUnknownConstants') ); $this->assertArraySubset( ['class' => 'Class', 'code' => 'My\Space\ExceptionNamespaceTest::UNKNOWN_CODE_CONSTANT', 'message' => 'My\Space\ExceptionNamespaceTest::UNKNOWN_MESSAGE_CONSTANT'], PHPUnit_Util_Test::getExpectedException('My\Space\ExceptionNamespaceTest', 'testUnknownConstants') ); } /** * @covers PHPUnit_Util_Test::getExpectedException */ public function testGetExpectedRegExp() { $this->assertArraySubset( ['message_regex' => '#regex#'], PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testWithRegexMessage') ); $this->assertArraySubset( ['message_regex' => '#regex#'], PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testWithRegexMessageFromClassConstant') ); $this->assertArraySubset( ['message_regex' => 'ExceptionTest::UNKNOWN_MESSAGE_REGEX_CONSTANT'], PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testWithUnknowRegexMessageFromClassConstant') ); } /** * @covers PHPUnit_Util_Test::getRequirements * @dataProvider requirementsProvider */ public function testGetRequirements($test, $result) { $this->assertEquals( $result, PHPUnit_Util_Test::getRequirements('RequirementsTest', $test) ); } public function requirementsProvider() { return [ ['testOne', []], ['testTwo', ['PHPUnit' => '1.0']], ['testThree', ['PHP' => '2.0']], ['testFour', ['PHPUnit' => '2.0', 'PHP' => '1.0']], ['testFive', ['PHP' => '5.4.0RC6']], ['testSix', ['PHP' => '5.4.0-alpha1']], ['testSeven', ['PHP' => '5.4.0beta2']], ['testEight', ['PHP' => '5.4-dev']], ['testNine', ['functions' => ['testFunc']]], ['testTen', ['extensions' => ['testExt']]], ['testEleven', ['OS' => '/Linux/i']], [ 'testSpace', [ 'extensions' => ['spl'], 'OS' => '/.*/i' ] ], [ 'testAllPossibleRequirements', [ 'PHP' => '99-dev', 'PHPUnit' => '9-dev', 'OS' => '/DOESNOTEXIST/i', 'functions' => [ 'testFuncOne', 'testFuncTwo', ], 'extensions' => [ 'testExtOne', 'testExtTwo', ] ] ] ]; } /** * @covers PHPUnit_Util_Test::getRequirements */ public function testGetRequirementsMergesClassAndMethodDocBlocks() { $expectedAnnotations = [ 'PHP' => '5.4', 'PHPUnit' => '3.7', 'OS' => '/WINNT/i', 'functions' => [ 'testFuncClass', 'testFuncMethod', ], 'extensions' => [ 'testExtClass', 'testExtMethod', ] ]; $this->assertEquals( $expectedAnnotations, PHPUnit_Util_Test::getRequirements('RequirementsClassDocBlockTest', 'testMethod') ); } /** * @covers PHPUnit_Util_Test::getMissingRequirements * @dataProvider missingRequirementsProvider */ public function testGetMissingRequirements($test, $result) { $this->assertEquals( $result, PHPUnit_Util_Test::getMissingRequirements('RequirementsTest', $test) ); } public function missingRequirementsProvider() { return [ ['testOne', []], ['testNine', ['Function testFunc is required.']], ['testTen', ['Extension testExt is required.']], ['testAlwaysSkip', ['PHPUnit 1111111 (or later) is required.']], ['testAlwaysSkip2', ['PHP 9999999 (or later) is required.']], ['testAlwaysSkip3', ['Operating system matching /DOESNOTEXIST/i is required.']], ['testAllPossibleRequirements', [ 'PHP 99-dev (or later) is required.', 'PHPUnit 9-dev (or later) is required.', 'Operating system matching /DOESNOTEXIST/i is required.', 'Function testFuncOne is required.', 'Function testFuncTwo is required.', 'Extension testExtOne is required.', 'Extension testExtTwo is required.', ]], ]; } /** * @coversNothing * * @todo This test does not really test functionality of PHPUnit_Util_Test */ public function testGetProvidedDataRegEx() { $result = preg_match(PHPUnit_Util_Test::REGEX_DATA_PROVIDER, '@dataProvider method', $matches); $this->assertEquals(1, $result); $this->assertEquals('method', $matches[1]); $result = preg_match(PHPUnit_Util_Test::REGEX_DATA_PROVIDER, '@dataProvider class::method', $matches); $this->assertEquals(1, $result); $this->assertEquals('class::method', $matches[1]); $result = preg_match(PHPUnit_Util_Test::REGEX_DATA_PROVIDER, '@dataProvider namespace\class::method', $matches); $this->assertEquals(1, $result); $this->assertEquals('namespace\class::method', $matches[1]); $result = preg_match(PHPUnit_Util_Test::REGEX_DATA_PROVIDER, '@dataProvider namespace\namespace\class::method', $matches); $this->assertEquals(1, $result); $this->assertEquals('namespace\namespace\class::method', $matches[1]); $result = preg_match(PHPUnit_Util_Test::REGEX_DATA_PROVIDER, '@dataProvider メソッド', $matches); $this->assertEquals(1, $result); $this->assertEquals('メソッド', $matches[1]); } /** * @covers PHPUnit_Util_Test::getDataFromTestWithAnnotation */ public function testTestWithEmptyAnnotation() { $result = PHPUnit_Util_Test::getDataFromTestWithAnnotation("/**\n * @anotherAnnotation\n */"); $this->assertNull($result); } /** * @covers PHPUnit_Util_Test::getDataFromTestWithAnnotation */ public function testTestWithSimpleCase() { $result = PHPUnit_Util_Test::getDataFromTestWithAnnotation('/** * @testWith [1] */'); $this->assertEquals([[1]], $result); } /** * @covers PHPUnit_Util_Test::getDataFromTestWithAnnotation */ public function testTestWithMultiLineMultiParameterCase() { $result = PHPUnit_Util_Test::getDataFromTestWithAnnotation('/** * @testWith [1, 2] * [3, 4] */'); $this->assertEquals([[1, 2], [3, 4]], $result); } /** * @covers PHPUnit_Util_Test::getDataFromTestWithAnnotation */ public function testTestWithVariousTypes() { $result = PHPUnit_Util_Test::getDataFromTestWithAnnotation('/** * @testWith ["ab"] * [true] * [null] */'); $this->assertEquals([['ab'], [true], [null]], $result); } /** * @covers PHPUnit_Util_Test::getDataFromTestWithAnnotation */ public function testTestWithAnnotationAfter() { $result = PHPUnit_Util_Test::getDataFromTestWithAnnotation('/** * @testWith [1] * [2] * @annotation */'); $this->assertEquals([[1], [2]], $result); } /** * @covers PHPUnit_Util_Test::getDataFromTestWithAnnotation */ public function testTestWithSimpleTextAfter() { $result = PHPUnit_Util_Test::getDataFromTestWithAnnotation('/** * @testWith [1] * [2] * blah blah */'); $this->assertEquals([[1], [2]], $result); } /** * @covers PHPUnit_Util_Test::getDataFromTestWithAnnotation */ public function testTestWithCharacterEscape() { $result = PHPUnit_Util_Test::getDataFromTestWithAnnotation('/** * @testWith ["\"", "\""] */'); $this->assertEquals([['"', '"']], $result); } /** * @covers PHPUnit_Util_Test::getDataFromTestWithAnnotation */ public function testTestWithThrowsProperExceptionIfDatasetCannotBeParsed() { $this->setExpectedExceptionRegExp( 'PHPUnit_Framework_Exception', '/^The dataset for the @testWith annotation cannot be parsed.$/' ); PHPUnit_Util_Test::getDataFromTestWithAnnotation('/** * @testWith [s] */'); } /** * @covers PHPUnit_Util_Test::getDependencies * * @todo Not sure what this test tests (name is misleading at least) */ public function testParseAnnotation() { $this->assertEquals( ['Foo', 'ã»ã’'], PHPUnit_Util_Test::getDependencies(get_class($this), 'methodForTestParseAnnotation') ); } /** * @depends Foo * @depends ã»ã’ * * @todo Remove fixture from test class */ public function methodForTestParseAnnotation() { } /** * @covers PHPUnit_Util_Test::getDependencies */ public function testParseAnnotationThatIsOnlyOneLine() { $this->assertEquals( ['Bar'], PHPUnit_Util_Test::getDependencies(get_class($this), 'methodForTestParseAnnotationThatIsOnlyOneLine') ); } /** @depends Bar */ public function methodForTestParseAnnotationThatIsOnlyOneLine() { // TODO Remove fixture from test class } /** * @covers PHPUnit_Util_Test::getLinesToBeCovered * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed * @covers PHPUnit_Util_Test::resolveElementToReflectionObjects * @dataProvider getLinesToBeCoveredProvider */ public function testGetLinesToBeCovered($test, $lines) { if (strpos($test, 'Namespace') === 0) { $expected = [ TEST_FILES_PATH . 'NamespaceCoveredClass.php' => $lines ]; } elseif ($test === 'CoverageNoneTest') { $expected = []; } elseif ($test === 'CoverageNothingTest') { $expected = false; } elseif ($test === 'CoverageFunctionTest') { $expected = [ TEST_FILES_PATH . 'CoveredFunction.php' => $lines ]; } else { $expected = [TEST_FILES_PATH . 'CoveredClass.php' => $lines]; } $this->assertEquals( $expected, PHPUnit_Util_Test::getLinesToBeCovered( $test, 'testSomething' ) ); } /** * @covers PHPUnit_Util_Test::getLinesToBeCovered * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed * @covers PHPUnit_Util_Test::resolveElementToReflectionObjects * @expectedException PHPUnit_Framework_CodeCoverageException */ public function testGetLinesToBeCovered2() { PHPUnit_Util_Test::getLinesToBeCovered( 'NotExistingCoveredElementTest', 'testOne' ); } /** * @covers PHPUnit_Util_Test::getLinesToBeCovered * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed * @covers PHPUnit_Util_Test::resolveElementToReflectionObjects * @expectedException PHPUnit_Framework_CodeCoverageException */ public function testGetLinesToBeCovered3() { PHPUnit_Util_Test::getLinesToBeCovered( 'NotExistingCoveredElementTest', 'testTwo' ); } /** * @covers PHPUnit_Util_Test::getLinesToBeCovered * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed * @covers PHPUnit_Util_Test::resolveElementToReflectionObjects * @expectedException PHPUnit_Framework_CodeCoverageException */ public function testGetLinesToBeCovered4() { PHPUnit_Util_Test::getLinesToBeCovered( 'NotExistingCoveredElementTest', 'testThree' ); } /** * @covers PHPUnit_Util_Test::getLinesToBeCovered * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed */ public function testGetLinesToBeCoveredSkipsNonExistentMethods() { $this->assertSame( [], PHPUnit_Util_Test::getLinesToBeCovered( 'NotExistingCoveredElementTest', 'methodDoesNotExist' ) ); } /** * @covers PHPUnit_Util_Test::getLinesToBeCovered * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed * @expectedException PHPUnit_Framework_CodeCoverageException */ public function testTwoCoversDefaultClassAnnoationsAreNotAllowed() { PHPUnit_Util_Test::getLinesToBeCovered( 'CoverageTwoDefaultClassAnnotations', 'testSomething' ); } /** * @covers PHPUnit_Util_Test::getLinesToBeCovered * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed */ public function testFunctionParenthesesAreAllowed() { $this->assertSame( [TEST_FILES_PATH . 'CoveredFunction.php' => range(2, 4)], PHPUnit_Util_Test::getLinesToBeCovered( 'CoverageFunctionParenthesesTest', 'testSomething' ) ); } /** * @covers PHPUnit_Util_Test::getLinesToBeCovered * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed */ public function testFunctionParenthesesAreAllowedWithWhitespace() { $this->assertSame( [TEST_FILES_PATH . 'CoveredFunction.php' => range(2, 4)], PHPUnit_Util_Test::getLinesToBeCovered( 'CoverageFunctionParenthesesWhitespaceTest', 'testSomething' ) ); } /** * @covers PHPUnit_Util_Test::getLinesToBeCovered * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed */ public function testMethodParenthesesAreAllowed() { $this->assertSame( [TEST_FILES_PATH . 'CoveredClass.php' => range(31, 35)], PHPUnit_Util_Test::getLinesToBeCovered( 'CoverageMethodParenthesesTest', 'testSomething' ) ); } /** * @covers PHPUnit_Util_Test::getLinesToBeCovered * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed */ public function testMethodParenthesesAreAllowedWithWhitespace() { $this->assertSame( [TEST_FILES_PATH . 'CoveredClass.php' => range(31, 35)], PHPUnit_Util_Test::getLinesToBeCovered( 'CoverageMethodParenthesesWhitespaceTest', 'testSomething' ) ); } /** * @covers PHPUnit_Util_Test::getLinesToBeCovered * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed */ public function testNamespacedFunctionCanBeCoveredOrUsed() { $this->assertEquals( [ TEST_FILES_PATH . 'NamespaceCoveredFunction.php' => range(4, 7) ], PHPUnit_Util_Test::getLinesToBeCovered( 'CoverageNamespacedFunctionTest', 'testFunc' ) ); } public function getLinesToBeCoveredProvider() { return [ [ 'CoverageNoneTest', [] ], [ 'CoverageClassExtendedTest', array_merge(range(19, 36), range(2, 17)) ], [ 'CoverageClassTest', range(19, 36) ], [ 'CoverageMethodTest', range(31, 35) ], [ 'CoverageMethodOneLineAnnotationTest', range(31, 35) ], [ 'CoverageNotPrivateTest', array_merge(range(25, 29), range(31, 35)) ], [ 'CoverageNotProtectedTest', array_merge(range(21, 23), range(31, 35)) ], [ 'CoverageNotPublicTest', array_merge(range(21, 23), range(25, 29)) ], [ 'CoveragePrivateTest', range(21, 23) ], [ 'CoverageProtectedTest', range(25, 29) ], [ 'CoveragePublicTest', range(31, 35) ], [ 'CoverageFunctionTest', range(2, 4) ], [ 'NamespaceCoverageClassExtendedTest', array_merge(range(21, 38), range(4, 19)) ], [ 'NamespaceCoverageClassTest', range(21, 38) ], [ 'NamespaceCoverageMethodTest', range(33, 37) ], [ 'NamespaceCoverageNotPrivateTest', array_merge(range(27, 31), range(33, 37)) ], [ 'NamespaceCoverageNotProtectedTest', array_merge(range(23, 25), range(33, 37)) ], [ 'NamespaceCoverageNotPublicTest', array_merge(range(23, 25), range(27, 31)) ], [ 'NamespaceCoveragePrivateTest', range(23, 25) ], [ 'NamespaceCoverageProtectedTest', range(27, 31) ], [ 'NamespaceCoveragePublicTest', range(33, 37) ], [ 'NamespaceCoverageCoversClassTest', array_merge(range(23, 25), range(27, 31), range(33, 37), range(6, 8), range(10, 13), range(15, 18)) ], [ 'NamespaceCoverageCoversClassPublicTest', range(33, 37) ], [ 'CoverageNothingTest', false ] ]; } } phpunit-5.1.3/tests/Util/XMLTest.php000066400000000000000000000021731263222771600173120ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @since Class available since Release 3.3.0 * @covers PHPUnit_Util_XML */ class Util_XMLTest extends PHPUnit_Framework_TestCase { /** * @dataProvider charProvider */ public function testPrepareString($char) { $e = null; $escapedString = PHPUnit_Util_XML::prepareString($char); $xml = "$escapedString"; $dom = new DomDocument('1.0', 'UTF-8'); try { $dom->loadXML($xml); } catch (Exception $e) { } $this->assertNull($e, sprintf( 'PHPUnit_Util_XML::prepareString("\x%02x") should not crash DomDocument', ord($char) )); } public function charProvider() { $data = []; for ($i = 0; $i < 256; $i++) { $data[] = [chr($i)]; } return $data; } } phpunit-5.1.3/tests/_files/000077500000000000000000000000001263222771600156225ustar00rootroot00000000000000phpunit-5.1.3/tests/_files/AbstractTest.php000066400000000000000000000001631263222771600207360ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * An author. * * @since Class available since Release 3.6.0 */ class Author { // the order of properties is important for testing the cycle! public $books = []; private $name = ''; public function __construct($name) { $this->name = $name; } } phpunit-5.1.3/tests/_files/BankAccount.php000066400000000000000000000030761263222771600205310ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ class BankAccountException extends RuntimeException { } /** * A bank account. * * @since Class available since Release 2.3.0 */ class BankAccount { /** * The bank account's balance. * * @var float */ protected $balance = 0; /** * Returns the bank account's balance. * * @return float */ public function getBalance() { return $this->balance; } /** * Sets the bank account's balance. * * @param float $balance * * @throws BankAccountException */ protected function setBalance($balance) { if ($balance >= 0) { $this->balance = $balance; } else { throw new BankAccountException; } } /** * Deposits an amount of money to the bank account. * * @param float $balance * * @throws BankAccountException */ public function depositMoney($balance) { $this->setBalance($this->getBalance() + $balance); return $this->getBalance(); } /** * Withdraws an amount of money from the bank account. * * @param float $balance * * @throws BankAccountException */ public function withdrawMoney($balance) { $this->setBalance($this->getBalance() - $balance); return $this->getBalance(); } } phpunit-5.1.3/tests/_files/BankAccountTest.php000066400000000000000000000040121263222771600213600ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Tests for the BankAccount class. * * @since Class available since Release 2.3.0 */ class BankAccountTest extends PHPUnit_Framework_TestCase { protected $ba; protected function setUp() { $this->ba = new BankAccount; } /** * @covers BankAccount::getBalance * @group balanceIsInitiallyZero * @group specification */ public function testBalanceIsInitiallyZero() { $this->assertEquals(0, $this->ba->getBalance()); } /** * @covers BankAccount::withdrawMoney * @group balanceCannotBecomeNegative * @group specification */ public function testBalanceCannotBecomeNegative() { try { $this->ba->withdrawMoney(1); } catch (BankAccountException $e) { $this->assertEquals(0, $this->ba->getBalance()); return; } $this->fail(); } /** * @covers BankAccount::depositMoney * @group balanceCannotBecomeNegative * @group specification */ public function testBalanceCannotBecomeNegative2() { try { $this->ba->depositMoney(-1); } catch (BankAccountException $e) { $this->assertEquals(0, $this->ba->getBalance()); return; } $this->fail(); } /* * @covers BankAccount::getBalance * @covers BankAccount::depositMoney * @covers BankAccount::withdrawMoney * @group balanceCannotBecomeNegative */ /* public function testDepositingAndWithdrawingMoneyWorks() { $this->assertEquals(0, $this->ba->getBalance()); $this->ba->depositMoney(1); $this->assertEquals(1, $this->ba->getBalance()); $this->ba->withdrawMoney(1); $this->assertEquals(0, $this->ba->getBalance()); } */ } phpunit-5.1.3/tests/_files/BankAccountTest.test.php000066400000000000000000000040351263222771600223430ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Tests for the BankAccount class. * * @since Class available since Release 2.3.0 */ class BankAccountWithCustomExtensionTest extends PHPUnit_Framework_TestCase { protected $ba; protected function setUp() { $this->ba = new BankAccount; } /** * @covers BankAccount::getBalance * @group balanceIsInitiallyZero * @group specification */ public function testBalanceIsInitiallyZero() { $this->assertEquals(0, $this->ba->getBalance()); } /** * @covers BankAccount::withdrawMoney * @group balanceCannotBecomeNegative * @group specification */ public function testBalanceCannotBecomeNegative() { try { $this->ba->withdrawMoney(1); } catch (BankAccountException $e) { $this->assertEquals(0, $this->ba->getBalance()); return; } $this->fail(); } /** * @covers BankAccount::depositMoney * @group balanceCannotBecomeNegative * @group specification */ public function testBalanceCannotBecomeNegative2() { try { $this->ba->depositMoney(-1); } catch (BankAccountException $e) { $this->assertEquals(0, $this->ba->getBalance()); return; } $this->fail(); } /* * @covers BankAccount::getBalance * @covers BankAccount::depositMoney * @covers BankAccount::withdrawMoney * @group balanceCannotBecomeNegative */ /* public function testDepositingAndWithdrawingMoneyWorks() { $this->assertEquals(0, $this->ba->getBalance()); $this->ba->depositMoney(1); $this->assertEquals(1, $this->ba->getBalance()); $this->ba->withdrawMoney(1); $this->assertEquals(0, $this->ba->getBalance()); } */ } phpunit-5.1.3/tests/_files/BaseTestListenerSample.php000066400000000000000000000003261263222771600227160ustar00rootroot00000000000000endCount++; } } phpunit-5.1.3/tests/_files/BeforeAndAfterTest.php000066400000000000000000000010571263222771600220050ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A book. * * @since Class available since Release 3.6.0 */ class Book { // the order of properties is important for testing the cycle! public $author = null; } phpunit-5.1.3/tests/_files/Calculator.php000066400000000000000000000003331263222771600204230ustar00rootroot00000000000000assertTrue(true); } } phpunit-5.1.3/tests/_files/ClassWithNonPublicAttributes.php000066400000000000000000000016771263222771600241300ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A class with a __toString() method. * * @since Class available since Release 3.6.0 */ class ClassWithToString { public function __toString() { return 'string representation'; } } phpunit-5.1.3/tests/_files/ClonedDependencyTest.php000066400000000000000000000013701263222771600223770ustar00rootroot00000000000000assertSame(self::$dependency, $dependency); } /** * @depends !clone testOne */ public function testThree($dependency) { $this->assertSame(self::$dependency, $dependency); } /** * @depends clone testOne */ public function testFour($dependency) { $this->assertNotSame(self::$dependency, $dependency); } } phpunit-5.1.3/tests/_files/ConcreteTest.my.php000066400000000000000000000001611263222771600213570ustar00rootroot00000000000000 */ public function testSomething() { $o = new CoveredClass; $o->publicMethod(); } } phpunit-5.1.3/tests/_files/CoverageClassTest.php000066400000000000000000000003341263222771600217140ustar00rootroot00000000000000publicMethod(); } } phpunit-5.1.3/tests/_files/CoverageFunctionParenthesesTest.php000066400000000000000000000003171263222771600246370ustar00rootroot00000000000000publicMethod(); } } phpunit-5.1.3/tests/_files/CoverageMethodParenthesesTest.php000066400000000000000000000003701263222771600242710ustar00rootroot00000000000000publicMethod(); } } phpunit-5.1.3/tests/_files/CoverageMethodParenthesesWhitespaceTest.php000066400000000000000000000004041263222771600263040ustar00rootroot00000000000000publicMethod(); } } phpunit-5.1.3/tests/_files/CoverageMethodTest.php000066400000000000000000000003531263222771600220700ustar00rootroot00000000000000publicMethod(); } } phpunit-5.1.3/tests/_files/CoverageNamespacedFunctionTest.php000066400000000000000000000002731263222771600244170ustar00rootroot00000000000000publicMethod(); } } phpunit-5.1.3/tests/_files/CoverageNotPrivateTest.php000066400000000000000000000003551263222771600227450ustar00rootroot00000000000000 */ public function testSomething() { $o = new CoveredClass; $o->publicMethod(); } } phpunit-5.1.3/tests/_files/CoverageNotProtectedTest.php000066400000000000000000000003611263222771600232610ustar00rootroot00000000000000 */ public function testSomething() { $o = new CoveredClass; $o->publicMethod(); } } phpunit-5.1.3/tests/_files/CoverageNotPublicTest.php000066400000000000000000000003531263222771600225470ustar00rootroot00000000000000 */ public function testSomething() { $o = new CoveredClass; $o->publicMethod(); } } phpunit-5.1.3/tests/_files/CoverageNothingTest.php000066400000000000000000000004021263222771600222510ustar00rootroot00000000000000publicMethod(); } } phpunit-5.1.3/tests/_files/CoveragePrivateTest.php000066400000000000000000000003511263222771600222600ustar00rootroot00000000000000 */ public function testSomething() { $o = new CoveredClass; $o->publicMethod(); } } phpunit-5.1.3/tests/_files/CoverageProtectedTest.php000066400000000000000000000003551263222771600226030ustar00rootroot00000000000000 */ public function testSomething() { $o = new CoveredClass; $o->publicMethod(); } } phpunit-5.1.3/tests/_files/CoveragePublicTest.php000066400000000000000000000003471263222771600220710ustar00rootroot00000000000000 */ public function testSomething() { $o = new CoveredClass; $o->publicMethod(); } } phpunit-5.1.3/tests/_files/CoverageTwoDefaultClassAnnotations.php000066400000000000000000000005121263222771600252670ustar00rootroot00000000000000 */ public function testSomething() { $o = new Foo\CoveredClass; $o->publicMethod(); } } phpunit-5.1.3/tests/_files/CoveredClass.php000066400000000000000000000011131263222771600207040ustar00rootroot00000000000000privateMethod(); } public function publicMethod() { $this->protectedMethod(); } } class CoveredClass extends CoveredParentClass { private function privateMethod() { } protected function protectedMethod() { parent::protectedMethod(); $this->privateMethod(); } public function publicMethod() { parent::publicMethod(); $this->protectedMethod(); } } phpunit-5.1.3/tests/_files/CoveredFunction.php000066400000000000000000000000441263222771600214260ustar00rootroot00000000000000assertTrue(true); } public static function provider() { $obj2 = new \stdClass(); $obj2->foo = 'bar'; $obj3 = (object) [1,2,"Test\r\n",4,5,6,7,8]; $obj = new \stdClass(); //@codingStandardsIgnoreStart $obj->null = null; //@codingStandardsIgnoreEnd $obj->boolean = true; $obj->integer = 1; $obj->double = 1.2; $obj->string = '1'; $obj->text = "this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext"; $obj->object = $obj2; $obj->objectagain = $obj2; $obj->array = ['foo' => 'bar']; $obj->self = $obj; $storage = new \SplObjectStorage(); $storage->attach($obj2); $storage->foo = $obj2; return [ [null, true, 1, 1.0], [1.2, fopen('php://memory', 'r'), '1'], [[[1,2,3], [3,4,5]]], // \n\r and \r is converted to \n ["this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext"], [new \stdClass(), $obj, [], $storage, $obj3], [chr(0) . chr(1) . chr(2) . chr(3) . chr(4) . chr(5), implode('', array_map('chr', range(0x0e, 0x1f)))], [chr(0x00) . chr(0x09)] ]; } } phpunit-5.1.3/tests/_files/DataProviderFilterTest.php000066400000000000000000000013611263222771600227260ustar00rootroot00000000000000assertTrue($truth); } public static function truthProvider() { return [ [true], [true], [true], [true] ]; } /** * @dataProvider falseProvider */ public function testFalse($false) { $this->assertFalse($false); } public static function falseProvider() { return [ 'false test' => [false], 'false test 2' => [false], 'other false test' => [false], 'other false test2'=> [false] ]; } } phpunit-5.1.3/tests/_files/DataProviderIncompleteTest.php000066400000000000000000000012661263222771600236040ustar00rootroot00000000000000assertTrue(true); } /** * @dataProvider providerMethod */ public function testAdd($a, $b, $c) { $this->assertEquals($c, $a + $b); } public function incompleteTestProviderMethod() { $this->markTestIncomplete('incomplete'); return [ [0, 0, 0], [0, 1, 1], ]; } public static function providerMethod() { return [ [0, 0, 0], [0, 1, 1], ]; } } phpunit-5.1.3/tests/_files/DataProviderSkippedTest.php000066400000000000000000000012441263222771600231000ustar00rootroot00000000000000assertTrue(true); } /** * @dataProvider providerMethod */ public function testAdd($a, $b, $c) { $this->assertEquals($c, $a + $b); } public function skippedTestProviderMethod() { $this->markTestSkipped('skipped'); return [ [0, 0, 0], [0, 1, 1], ]; } public static function providerMethod() { return [ [0, 0, 0], [0, 1, 1], ]; } } phpunit-5.1.3/tests/_files/DataProviderTest.php000066400000000000000000000005761263222771600215670ustar00rootroot00000000000000assertEquals($c, $a + $b); } public static function providerMethod() { return [ [0, 0, 0], [0, 1, 1], [1, 1, 3], [1, 0, 1] ]; } } phpunit-5.1.3/tests/_files/DependencyFailureTest.php000066400000000000000000000006231263222771600225620ustar00rootroot00000000000000fail(); } /** * @depends testOne */ public function testTwo() { } /** * @depends !clone testTwo */ public function testThree() { } /** * @depends clone testOne */ public function testFour() { } } phpunit-5.1.3/tests/_files/DependencySuccessTest.php000066400000000000000000000004621263222771600226040ustar00rootroot00000000000000addTestSuite('DependencySuccessTest'); $suite->addTestSuite('DependencyFailureTest'); return $suite; } } phpunit-5.1.3/tests/_files/DoubleTestCase.php000066400000000000000000000007601263222771600212040ustar00rootroot00000000000000testCase = $testCase; } public function count() { return 2; } public function run(PHPUnit_Framework_TestResult $result = null) { $result->startTest($this); $this->testCase->runBare(); $this->testCase->runBare(); $result->endTest($this, 0); } } phpunit-5.1.3/tests/_files/DummyException.php000066400000000000000000000000621263222771600213030ustar00rootroot00000000000000setUp = true; } protected function assertPreConditions() { $this->assertPreConditions = true; } public function testSomething() { $this->testSomething = true; } protected function assertPostConditions() { $this->assertPostConditions = true; throw new Exception; } protected function tearDown() { $this->tearDown = true; } } phpunit-5.1.3/tests/_files/ExceptionInAssertPreConditionsTest.php000066400000000000000000000013771263222771600253130ustar00rootroot00000000000000setUp = true; } protected function assertPreConditions() { $this->assertPreConditions = true; throw new Exception; } public function testSomething() { $this->testSomething = true; } protected function assertPostConditions() { $this->assertPostConditions = true; } protected function tearDown() { $this->tearDown = true; } } phpunit-5.1.3/tests/_files/ExceptionInSetUpTest.php000066400000000000000000000013611263222771600224020ustar00rootroot00000000000000setUp = true; throw new Exception; } protected function assertPreConditions() { $this->assertPreConditions = true; } public function testSomething() { $this->testSomething = true; } protected function assertPostConditions() { $this->assertPostConditions = true; } protected function tearDown() { $this->tearDown = true; } } phpunit-5.1.3/tests/_files/ExceptionInTearDownTest.php000066400000000000000000000013641263222771600230700ustar00rootroot00000000000000setUp = true; } protected function assertPreConditions() { $this->assertPreConditions = true; } public function testSomething() { $this->testSomething = true; } protected function assertPostConditions() { $this->assertPostConditions = true; } protected function tearDown() { $this->tearDown = true; throw new Exception; } } phpunit-5.1.3/tests/_files/ExceptionInTest.php000066400000000000000000000013541263222771600214230ustar00rootroot00000000000000setUp = true; } protected function assertPreConditions() { $this->assertPreConditions = true; } public function testSomething() { $this->testSomething = true; throw new Exception; } protected function assertPostConditions() { $this->assertPostConditions = true; } protected function tearDown() { $this->tearDown = true; } } phpunit-5.1.3/tests/_files/ExceptionNamespaceTest.php000066400000000000000000000015121263222771600227450ustar00rootroot00000000000000assertEquals([1], [2], 'message'); } catch (PHPUnit_Framework_ExpectationFailedException $e) { $message = $e->getMessage() . $e->getComparisonFailure()->getDiff(); throw new PHPUnit_Framework_Exception("Child exception\n$message", 101, $e); } } public function testNestedExceptions() { $exceptionThree = new Exception('Three'); $exceptionTwo = new InvalidArgumentException('Two', 0, $exceptionThree); $exceptionOne = new Exception('One', 0, $exceptionTwo); throw $exceptionOne; } } phpunit-5.1.3/tests/_files/ExceptionTest.php000066400000000000000000000052221263222771600211320ustar00rootroot00000000000000fail(); } } phpunit-5.1.3/tests/_files/FailureTest.php000066400000000000000000000034501263222771600205640ustar00rootroot00000000000000assertEquals([1], [2], 'message'); } public function testAssertIntegerEqualsInteger() { $this->assertEquals(1, 2, 'message'); } public function testAssertObjectEqualsObject() { $a = new StdClass; $a->foo = 'bar'; $b = new StdClass; $b->bar = 'foo'; $this->assertEquals($a, $b, 'message'); } public function testAssertNullEqualsString() { $this->assertEquals(null, 'bar', 'message'); } public function testAssertStringEqualsString() { $this->assertEquals('foo', 'bar', 'message'); } public function testAssertTextEqualsText() { $this->assertEquals("foo\nbar\n", "foo\nbaz\n", 'message'); } public function testAssertStringMatchesFormat() { $this->assertStringMatchesFormat('*%s*', '**', 'message'); } public function testAssertNumericEqualsNumeric() { $this->assertEquals(1, 2, 'message'); } public function testAssertTextSameText() { $this->assertSame('foo', 'bar', 'message'); } public function testAssertObjectSameObject() { $this->assertSame(new StdClass, new StdClass, 'message'); } public function testAssertObjectSameNull() { $this->assertSame(new StdClass, null, 'message'); } public function testAssertFloatSameFloat() { $this->assertSame(1.0, 1.5, 'message'); } // Note that due to the implementation of this assertion it counts as 2 asserts public function testAssertStringMatchesFormatFile() { $this->assertStringMatchesFormatFile(__DIR__ . '/expectedFileFormat.txt', '...BAR...'); } } phpunit-5.1.3/tests/_files/FatalTest.php000066400000000000000000000003461263222771600202250ustar00rootroot00000000000000markTestIncomplete('Test incomplete'); } } phpunit-5.1.3/tests/_files/Inheritance/000077500000000000000000000000001263222771600200535ustar00rootroot00000000000000phpunit-5.1.3/tests/_files/Inheritance/InheritanceA.php000066400000000000000000000001411263222771600231120ustar00rootroot00000000000000assertEquals('application/x-test', ini_get('default_mimetype')); } } phpunit-5.1.3/tests/_files/IsolationTest.php000066400000000000000000000004501263222771600211330ustar00rootroot00000000000000assertFalse($this->isInIsolation()); } public function testIsInIsolationReturnsTrue() { $this->assertTrue($this->isInIsolation()); } } phpunit-5.1.3/tests/_files/JsonData/000077500000000000000000000000001263222771600173255ustar00rootroot00000000000000phpunit-5.1.3/tests/_files/JsonData/arrayObject.json000066400000000000000000000000421263222771600224610ustar00rootroot00000000000000["Mascott", "Tux", "OS", "Linux"] phpunit-5.1.3/tests/_files/JsonData/simpleObject.json000066400000000000000000000000211263222771600226310ustar00rootroot00000000000000{"Mascott":"Tux"}phpunit-5.1.3/tests/_files/MockRunner.php000066400000000000000000000001701263222771600204140ustar00rootroot00000000000000assertEquals('foo', $a); $this->assertEquals('bar', $b); } } phpunit-5.1.3/tests/_files/NamespaceCoverageClassExtendedTest.php000066400000000000000000000003771263222771600252210ustar00rootroot00000000000000 */ public function testSomething() { $o = new Foo\CoveredClass; $o->publicMethod(); } } phpunit-5.1.3/tests/_files/NamespaceCoverageClassTest.php000066400000000000000000000003551263222771600235340ustar00rootroot00000000000000publicMethod(); } } phpunit-5.1.3/tests/_files/NamespaceCoverageCoversClassPublicTest.php000066400000000000000000000004501263222771600260510ustar00rootroot00000000000000publicMethod(); } } phpunit-5.1.3/tests/_files/NamespaceCoverageCoversClassTest.php000066400000000000000000000010051263222771600247070ustar00rootroot00000000000000publicMethod(); } } phpunit-5.1.3/tests/_files/NamespaceCoverageMethodTest.php000066400000000000000000000003741263222771600237100ustar00rootroot00000000000000publicMethod(); } } phpunit-5.1.3/tests/_files/NamespaceCoverageNotPrivateTest.php000066400000000000000000000003761263222771600245650ustar00rootroot00000000000000 */ public function testSomething() { $o = new Foo\CoveredClass; $o->publicMethod(); } } phpunit-5.1.3/tests/_files/NamespaceCoverageNotProtectedTest.php000066400000000000000000000004021263222771600250720ustar00rootroot00000000000000 */ public function testSomething() { $o = new Foo\CoveredClass; $o->publicMethod(); } } phpunit-5.1.3/tests/_files/NamespaceCoverageNotPublicTest.php000066400000000000000000000003741263222771600243670ustar00rootroot00000000000000 */ public function testSomething() { $o = new Foo\CoveredClass; $o->publicMethod(); } } phpunit-5.1.3/tests/_files/NamespaceCoveragePrivateTest.php000066400000000000000000000003721263222771600241000ustar00rootroot00000000000000 */ public function testSomething() { $o = new Foo\CoveredClass; $o->publicMethod(); } } phpunit-5.1.3/tests/_files/NamespaceCoverageProtectedTest.php000066400000000000000000000003761263222771600244230ustar00rootroot00000000000000 */ public function testSomething() { $o = new Foo\CoveredClass; $o->publicMethod(); } } phpunit-5.1.3/tests/_files/NamespaceCoveragePublicTest.php000066400000000000000000000003701263222771600237020ustar00rootroot00000000000000 */ public function testSomething() { $o = new Foo\CoveredClass; $o->publicMethod(); } } phpunit-5.1.3/tests/_files/NamespaceCoveredClass.php000066400000000000000000000011331263222771600225230ustar00rootroot00000000000000privateMethod(); } public function publicMethod() { $this->protectedMethod(); } } class CoveredClass extends CoveredParentClass { private function privateMethod() { } protected function protectedMethod() { parent::protectedMethod(); $this->privateMethod(); } public function publicMethod() { parent::publicMethod(); $this->protectedMethod(); } } phpunit-5.1.3/tests/_files/NamespaceCoveredFunction.php000066400000000000000000000000731263222771600232450ustar00rootroot00000000000000 */ public function testThree() { } } phpunit-5.1.3/tests/_files/NotPublicTestCase.php000066400000000000000000000002461263222771600216700ustar00rootroot00000000000000expectOutputString('foo'); print 'foo'; } public function testExpectOutputStringFooActualBar() { $this->expectOutputString('foo'); print 'bar'; } public function testExpectOutputRegexFooActualFoo() { $this->expectOutputRegex('/foo/'); print 'foo'; } public function testExpectOutputRegexFooActualBar() { $this->expectOutputRegex('/foo/'); print 'bar'; } } phpunit-5.1.3/tests/_files/OverrideTestCase.php000066400000000000000000000001511263222771600215430ustar00rootroot00000000000000container = []; } public function offsetSet($offset, $value) { if (is_null($offset)) { $this->container[] = $value; } else { $this->container[$offset] = $value; } } public function offsetExists($offset) { return isset($this->container[$offset]); } public function offsetUnset($offset) { unset($this->container[$offset]); } public function offsetGet($offset) { return isset($this->container[$offset]) ? $this->container[$offset] : null; } } phpunit-5.1.3/tests/_files/SampleClass.php000066400000000000000000000003151263222771600205410ustar00rootroot00000000000000a = $a; $this->b = $b; $this->c = $c; } } phpunit-5.1.3/tests/_files/Singleton.php000066400000000000000000000005541263222771600203010ustar00rootroot00000000000000assertEquals(0, count($stack)); array_push($stack, 'foo'); $this->assertEquals('foo', $stack[count($stack)-1]); $this->assertEquals(1, count($stack)); return $stack; } /** * @depends testPush */ public function testPop(array $stack) { $this->assertEquals('foo', array_pop($stack)); $this->assertEquals(0, count($stack)); } } phpunit-5.1.3/tests/_files/StopOnWarningTestSuite.php000066400000000000000000000004221263222771600227530ustar00rootroot00000000000000addTestSuite('NoTestCases'); $suite->addTestSuite('CoverageClassTest'); return $suite; } } phpunit-5.1.3/tests/_files/StopsOnWarningTest.php000066400000000000000000000001601263222771600221230ustar00rootroot00000000000000var = $var; } } phpunit-5.1.3/tests/_files/Success.php000066400000000000000000000001501263222771600177370ustar00rootroot00000000000000assertTrue(true); } public function testTwo() { print __METHOD__ . "\n"; $this->assertTrue(false); } protected function assertPostConditions() { print __METHOD__ . "\n"; } protected function tearDown() { print __METHOD__ . "\n"; } public static function tearDownAfterClass() { print __METHOD__ . "\n"; } protected function onNotSuccessfulTest(Exception $e) { print __METHOD__ . "\n"; throw $e; } } phpunit-5.1.3/tests/_files/TestIncomplete.php000066400000000000000000000002451263222771600212730ustar00rootroot00000000000000markTestIncomplete('Incomplete test'); } } phpunit-5.1.3/tests/_files/TestIterator.php000066400000000000000000000011061263222771600207620ustar00rootroot00000000000000array = $array; } public function rewind() { $this->position = 0; } public function valid() { return $this->position < count($this->array); } public function key() { return $this->position; } public function current() { return $this->array[$this->position]; } public function next() { $this->position++; } } phpunit-5.1.3/tests/_files/TestIterator2.php000066400000000000000000000010241263222771600210430ustar00rootroot00000000000000data = $array; } public function current() { return current($this->data); } public function next() { next($this->data); } public function key() { return key($this->data); } public function valid() { return key($this->data) !== null; } public function rewind() { reset($this->data); } } phpunit-5.1.3/tests/_files/TestSkipped.php000066400000000000000000000002341263222771600205710ustar00rootroot00000000000000markTestSkipped('Skipped test'); } } phpunit-5.1.3/tests/_files/TestTestError.php000066400000000000000000000002071263222771600211230ustar00rootroot00000000000000assertEquals($c, $a + $b); } public static function providerMethod() { return [ [0, 0, 0], [0, 1, 1], [1, 1, 3], [1, 0, 1] ]; } } phpunit-5.1.3/tests/_files/ThrowExceptionTestCase.php000066400000000000000000000002611263222771600227500ustar00rootroot00000000000000wasRun = true; } } phpunit-5.1.3/tests/_files/bar.xml000066400000000000000000000000071263222771600171050ustar00rootroot00000000000000 phpunit-5.1.3/tests/_files/configuration.colors.empty.xml000066400000000000000000000000361263222771600236470ustar00rootroot00000000000000 phpunit-5.1.3/tests/_files/configuration.colors.false.xml000066400000000000000000000000431263222771600236010ustar00rootroot00000000000000 phpunit-5.1.3/tests/_files/configuration.colors.invalid.xml000066400000000000000000000000541263222771600241370ustar00rootroot00000000000000 phpunit-5.1.3/tests/_files/configuration.colors.true.xml000066400000000000000000000000421263222771600234650ustar00rootroot00000000000000 phpunit-5.1.3/tests/_files/configuration.custom-printer.xml000066400000000000000000000001571263222771600242100ustar00rootroot00000000000000 phpunit-5.1.3/tests/_files/configuration.xml000066400000000000000000000071141263222771600212160ustar00rootroot00000000000000 /path/to/files /path/to/MyTest.php name name /path/to/files /path/to/file /path/to/files /path/to/file Sebastian 22 April 19.78 MyTestFile.php MyRelativePath 42 . /path/to/lib phpunit-5.1.3/tests/_files/configuration_empty.xml000066400000000000000000000017641263222771600224410ustar00rootroot00000000000000 phpunit-5.1.3/tests/_files/configuration_stop_on_warning.xml000066400000000000000000000001071263222771600244770ustar00rootroot00000000000000 phpunit-5.1.3/tests/_files/configuration_xinclude.xml000066400000000000000000000046601263222771600231140ustar00rootroot00000000000000 . /path/to/lib phpunit-5.1.3/tests/_files/expectedFileFormat.txt000066400000000000000000000000041263222771600221270ustar00rootroot00000000000000FOO phpunit-5.1.3/tests/_files/foo.xml000066400000000000000000000000071263222771600171240ustar00rootroot00000000000000 phpunit-5.1.3/tests/_files/structureAttributesAreSameButValuesAreNot.xml000066400000000000000000000014271263222771600266610ustar00rootroot00000000000000 Image 1: Dette er en test caption phpunit-5.1.3/tests/_files/structureExpected.xml000066400000000000000000000015161263222771600220710ustar00rootroot00000000000000 Image 1: Dette er en test caption phpunit-5.1.3/tests/_files/structureIgnoreTextNodes.xml000066400000000000000000000016021263222771600234050ustar00rootroot00000000000000 textnode textnode textnode Image 1: Dette er en test caption textnode phpunit-5.1.3/tests/_files/structureIsSameButDataIsNot.xml000066400000000000000000000015361263222771600237350ustar00rootroot00000000000000 Image is not the same 1: Dette er en test caption phpunit-5.1.3/tests/_files/structureWrongNumberOfAttributes.xml000066400000000000000000000014001263222771600251210ustar00rootroot00000000000000 Image 1: Dette er en test caption phpunit-5.1.3/tests/_files/structureWrongNumberOfNodes.xml000066400000000000000000000011041263222771600240440ustar00rootroot00000000000000 phpunit-5.1.3/tests/bootstrap.php000066400000000000000000000002171263222771600171070ustar00rootroot00000000000000