From 790406fc82d63016dfc5bba7b3b9074e87a3eb44 Mon Sep 17 00:00:00 2001 From: ElectricMaxxx Date: Sun, 6 May 2018 00:06:40 +0200 Subject: [PATCH 1/7] move to FOSCKEditor-Bundle --- composer.json | 4 ++-- src/Admin/Content/StaticContentAdmin.php | 2 +- src/DependencyInjection/Factory/ContentAdminFactory.php | 3 +-- tests/Fixtures/App/config/bundles.php | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index ca733aa..c6acf76 100644 --- a/composer.json +++ b/composer.json @@ -37,10 +37,10 @@ "matthiasnoback/symfony-dependency-injection-test": "^1.1", "matthiasnoback/symfony-config-test": "^2.1", "burgov/key-value-form-bundle": "^1.0", - "egeloen/ckeditor-bundle": "^4.0", "symfony/asset": "^2.8 || ^3.3 || ^4.0", "symfony/browser-kit": "^2.8 || ^3.3 || ^4.0", - "symfony/css-selector": "^2.8 || ^3.3 || ^4.0" + "symfony/css-selector": "^2.8 || ^3.3 || ^4.0", + "friendsofsymfony/ckeditor-bundle": "^1.0" }, "suggest": { "symfony-cmf/routing-bundle": "To make use of the alternate locale provider.", diff --git a/src/Admin/Content/StaticContentAdmin.php b/src/Admin/Content/StaticContentAdmin.php index 111def3..d63b799 100644 --- a/src/Admin/Content/StaticContentAdmin.php +++ b/src/Admin/Content/StaticContentAdmin.php @@ -11,7 +11,7 @@ namespace Symfony\Cmf\Bundle\SonataPhpcrAdminIntegrationBundle\Admin\Content; -use Ivory\CKEditorBundle\Form\Type\CKEditorType; +use FOS\CKEditorBundle\Form\Type\CKEditorType; use Sonata\AdminBundle\Datagrid\DatagridMapper; use Sonata\AdminBundle\Datagrid\ListMapper; use Sonata\AdminBundle\Form\FormMapper; diff --git a/src/DependencyInjection/Factory/ContentAdminFactory.php b/src/DependencyInjection/Factory/ContentAdminFactory.php index 65a4016..3493d41 100644 --- a/src/DependencyInjection/Factory/ContentAdminFactory.php +++ b/src/DependencyInjection/Factory/ContentAdminFactory.php @@ -11,7 +11,6 @@ namespace Symfony\Cmf\Bundle\SonataPhpcrAdminIntegrationBundle\DependencyInjection\Factory; -use Ivory\CKEditorBundle\IvoryCKEditorBundle; use Symfony\Component\Config\Definition\Builder\NodeBuilder; use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -63,7 +62,7 @@ public function create(array $config, ContainerBuilder $container, XmlFileLoader $loader->load('content.xml'); $message = 'IvoryCKEditorBundle integration was explicitely enabled, but the bundle is not available.'; - if (class_exists(IvoryCKEditorBundle::class)) { + if (class_exists(FOSCKEditorBundle::class)) { $message .= ' (did you forget to register the bundle in the AppKernel?)'; } diff --git a/tests/Fixtures/App/config/bundles.php b/tests/Fixtures/App/config/bundles.php index cfa07af..a3fba7d 100644 --- a/tests/Fixtures/App/config/bundles.php +++ b/tests/Fixtures/App/config/bundles.php @@ -27,11 +27,11 @@ Symfony\Cmf\Bundle\MenuBundle\CmfMenuBundle::class => ['all' => true], Symfony\Cmf\Bundle\ContentBundle\CmfContentBundle::class => ['all' => true], JMS\SerializerBundle\JMSSerializerBundle::class => ['all' => true], - Ivory\CKEditorBundle\IvoryCKEditorBundle::class => ['all' => true], SonataBlockBundle::class => ['all' => true], SonataCoreBundle::class => ['all' => true], SonataAdminBundle::class => ['all' => true], KnpMenuBundle::class => ['all' => true], SonataDoctrinePHPCRAdminBundle::class => ['all' => true], CmfTreeBrowserBundle::class => ['all' => true], + \FOS\CKEditorBundle\FOSCKEditorBundle::class => ['all' => true], ]; From 4528ec7a60cba68f5733dc2d74410ed3fbf73d05 Mon Sep 17 00:00:00 2001 From: ElectricMaxxx Date: Sun, 6 May 2018 00:56:31 +0200 Subject: [PATCH 2/7] beat the collegue --- .phpunit/.5.7.md5 | 2 + .phpunit/5.7.zip | Bin 0 -> 423554 bytes .phpunit/phpunit-5.7/.gitattributes | 4 + .../phpunit-5.7/.github/CODE_OF_CONDUCT.md | 28 + .phpunit/phpunit-5.7/.github/CONTRIBUTING.md | 72 + .../phpunit-5.7/.github/ISSUE_TEMPLATE.md | 15 + .phpunit/phpunit-5.7/.gitignore | 20 + .phpunit/phpunit-5.7/.php_cs.dist | 81 + .phpunit/phpunit-5.7/.stickler.yml | 3 + .phpunit/phpunit-5.7/.travis.yml | 55 + .phpunit/phpunit-5.7/ChangeLog-5.7.md | 242 ++ .phpunit/phpunit-5.7/LICENSE | 33 + .phpunit/phpunit-5.7/README.md | 46 + .phpunit/phpunit-5.7/build.xml | 418 ++ .phpunit/phpunit-5.7/composer.json | 92 + .phpunit/phpunit-5.7/phpunit | 17 + .phpunit/phpunit-5.7/phpunit.xml | 34 + .phpunit/phpunit-5.7/phpunit.xsd | 254 ++ .phpunit/phpunit-5.7/src/Exception.php | 16 + .../src/Extensions/GroupTestSuite.php | 58 + .../src/Extensions/PhptTestCase.php | 430 ++ .../src/Extensions/PhptTestSuite.php | 38 + .../src/Extensions/RepeatedTest.php | 88 + .../src/Extensions/TestDecorator.php | 107 + .../src/Extensions/TicketListener.php | 194 + .../src/ForwardCompatibility/Assert.php | 17 + .../AssertionFailedError.php | 17 + .../ForwardCompatibility/BaseTestListener.php | 17 + .../src/ForwardCompatibility/Test.php | 17 + .../src/ForwardCompatibility/TestCase.php | 17 + .../src/ForwardCompatibility/TestListener.php | 17 + .../src/ForwardCompatibility/TestSuite.php | 17 + .phpunit/phpunit-5.7/src/Framework/Assert.php | 2952 +++++++++++++ .../src/Framework/Assert/Functions.php | 2174 ++++++++++ .../src/Framework/AssertionFailedError.php | 25 + .../src/Framework/BaseTestListener.php | 58 + .../src/Framework/CodeCoverageException.php | 13 + .../phpunit-5.7/src/Framework/Constraint.php | 149 + .../src/Framework/Constraint/And.php | 121 + .../src/Framework/Constraint/ArrayHasKey.php | 80 + .../src/Framework/Constraint/ArraySubset.php | 107 + .../src/Framework/Constraint/Attribute.php | 84 + .../src/Framework/Constraint/Callback.php | 59 + .../Constraint/ClassHasAttribute.php | 80 + .../Constraint/ClassHasStaticAttribute.php | 52 + .../src/Framework/Constraint/Composite.php | 67 + .../src/Framework/Constraint/Count.php | 122 + .../Framework/Constraint/DirectoryExists.php | 58 + .../src/Framework/Constraint/Exception.php | 85 + .../Framework/Constraint/ExceptionCode.php | 66 + .../Framework/Constraint/ExceptionMessage.php | 81 + .../Constraint/ExceptionMessageRegExp.php | 74 + .../src/Framework/Constraint/FileExists.php | 58 + .../src/Framework/Constraint/GreaterThan.php | 53 + .../src/Framework/Constraint/IsAnything.php | 58 + .../src/Framework/Constraint/IsEmpty.php | 64 + .../src/Framework/Constraint/IsEqual.php | 177 + .../src/Framework/Constraint/IsFalse.php | 38 + .../src/Framework/Constraint/IsFinite.php | 38 + .../src/Framework/Constraint/IsIdentical.php | 130 + .../src/Framework/Constraint/IsInfinite.php | 38 + .../src/Framework/Constraint/IsInstanceOf.php | 92 + .../src/Framework/Constraint/IsJson.php | 75 + .../src/Framework/Constraint/IsNan.php | 38 + .../src/Framework/Constraint/IsNull.php | 38 + .../src/Framework/Constraint/IsReadable.php | 58 + .../src/Framework/Constraint/IsTrue.php | 38 + .../src/Framework/Constraint/IsType.php | 141 + .../src/Framework/Constraint/IsWritable.php | 58 + .../src/Framework/Constraint/JsonMatches.php | 69 + .../JsonMatches/ErrorMessageProvider.php | 67 + .../src/Framework/Constraint/LessThan.php | 53 + .../src/Framework/Constraint/Not.php | 156 + .../Constraint/ObjectHasAttribute.php | 33 + .../src/Framework/Constraint/Or.php | 113 + .../src/Framework/Constraint/PCREMatch.php | 61 + .../src/Framework/Constraint/SameSize.php | 25 + .../Framework/Constraint/StringContains.php | 79 + .../Framework/Constraint/StringEndsWith.php | 53 + .../Framework/Constraint/StringMatches.php | 99 + .../Framework/Constraint/StringStartsWith.php | 53 + .../Constraint/TraversableContains.php | 123 + .../Constraint/TraversableContainsOnly.php | 93 + .../src/Framework/Constraint/Xor.php | 118 + .../CoveredCodeNotExecutedException.php | 17 + .phpunit/phpunit-5.7/src/Framework/Error.php | 32 + .../src/Framework/Error/Deprecated.php | 22 + .../src/Framework/Error/Notice.php | 22 + .../src/Framework/Error/Warning.php | 22 + .../phpunit-5.7/src/Framework/Exception.php | 76 + .../src/Framework/ExceptionWrapper.php | 89 + .../Framework/ExpectationFailedException.php | 39 + .../src/Framework/IncompleteTest.php | 17 + .../src/Framework/IncompleteTestCase.php | 82 + .../src/Framework/IncompleteTestError.php | 17 + .../InvalidCoversTargetException.php | 13 + .../MissingCoversAnnotationException.php | 17 + .../phpunit-5.7/src/Framework/OutputError.php | 17 + .../phpunit-5.7/src/Framework/RiskyTest.php | 17 + .../src/Framework/RiskyTestError.php | 17 + .../src/Framework/SelfDescribing.php | 22 + .../phpunit-5.7/src/Framework/SkippedTest.php | 16 + .../src/Framework/SkippedTestCase.php | 80 + .../src/Framework/SkippedTestError.php | 17 + .../src/Framework/SkippedTestSuiteError.php | 17 + .../src/Framework/SyntheticError.php | 78 + .phpunit/phpunit-5.7/src/Framework/Test.php | 24 + .../phpunit-5.7/src/Framework/TestCase.php | 2491 +++++++++++ .../phpunit-5.7/src/Framework/TestFailure.php | 161 + .../src/Framework/TestListener.php | 102 + .../phpunit-5.7/src/Framework/TestResult.php | 1310 ++++++ .../phpunit-5.7/src/Framework/TestSuite.php | 1000 +++++ .../src/Framework/TestSuite/DataProvider.php | 24 + .../UnintentionallyCoveredCodeError.php | 17 + .../phpunit-5.7/src/Framework/Warning.php | 25 + .../src/Framework/WarningTestCase.php | 75 + .../phpunit-5.7/src/Runner/BaseTestRunner.php | 139 + .phpunit/phpunit-5.7/src/Runner/Exception.php | 13 + .../phpunit-5.7/src/Runner/Filter/Factory.php | 48 + .../phpunit-5.7/src/Runner/Filter/Group.php | 56 + .../src/Runner/Filter/Group/Exclude.php | 22 + .../src/Runner/Filter/Group/Include.php | 22 + .../phpunit-5.7/src/Runner/Filter/Test.php | 117 + .../src/Runner/StandardTestSuiteLoader.php | 116 + .../src/Runner/TestSuiteLoader.php | 30 + .phpunit/phpunit-5.7/src/Runner/Version.php | 73 + .phpunit/phpunit-5.7/src/TextUI/Command.php | 1172 +++++ .../phpunit-5.7/src/TextUI/ResultPrinter.php | 680 +++ .../phpunit-5.7/src/TextUI/TestRunner.php | 1142 +++++ .phpunit/phpunit-5.7/src/Util/Blacklist.php | 111 + .../phpunit-5.7/src/Util/Configuration.php | 1135 +++++ .../src/Util/ConfigurationGenerator.php | 66 + .../phpunit-5.7/src/Util/ErrorHandler.php | 115 + .phpunit/phpunit-5.7/src/Util/Fileloader.php | 68 + .phpunit/phpunit-5.7/src/Util/Filesystem.php | 38 + .phpunit/phpunit-5.7/src/Util/Filter.php | 103 + .phpunit/phpunit-5.7/src/Util/Getopt.php | 164 + .phpunit/phpunit-5.7/src/Util/GlobalState.php | 214 + .../src/Util/InvalidArgumentHelper.php | 39 + .phpunit/phpunit-5.7/src/Util/Log/JSON.php | 254 ++ .phpunit/phpunit-5.7/src/Util/Log/JUnit.php | 450 ++ .phpunit/phpunit-5.7/src/Util/Log/TAP.php | 261 ++ .../phpunit-5.7/src/Util/Log/TeamCity.php | 406 ++ .phpunit/phpunit-5.7/src/Util/PHP.php | 410 ++ .phpunit/phpunit-5.7/src/Util/PHP/Default.php | 208 + .../Util/PHP/Template/TestCaseMethod.tpl.dist | 102 + .phpunit/phpunit-5.7/src/Util/PHP/Windows.php | 40 + .../phpunit-5.7/src/Util/PHP/eval-stdin.php | 10 + .phpunit/phpunit-5.7/src/Util/Printer.php | 144 + .phpunit/phpunit-5.7/src/Util/Regex.php | 33 + .phpunit/phpunit-5.7/src/Util/String.php | 61 + .phpunit/phpunit-5.7/src/Util/Test.php | 1099 +++++ .../src/Util/TestDox/NamePrettifier.php | 142 + .../src/Util/TestDox/ResultPrinter.php | 399 ++ .../src/Util/TestDox/ResultPrinter/HTML.php | 137 + .../src/Util/TestDox/ResultPrinter/Text.php | 52 + .../src/Util/TestDox/ResultPrinter/XML.php | 225 + .../src/Util/TestSuiteIterator.php | 101 + .phpunit/phpunit-5.7/src/Util/Type.php | 41 + .phpunit/phpunit-5.7/src/Util/XML.php | 246 ++ .../tests/Extensions/PhptTestCaseTest.php | 263 ++ .../tests/Extensions/RepeatedTestTest.php | 60 + .phpunit/phpunit-5.7/tests/Fail/fail.phpt | 5 + .../tests/Framework/AssertTest.php | 3768 +++++++++++++++++ .../tests/Framework/BaseTestListenerTest.php | 28 + .../Framework/Constraint/ArraySubsetTest.php | 65 + .../tests/Framework/Constraint/CountTest.php | 92 + .../Constraint/ExceptionMessageRegExpTest.php | 51 + .../Constraint/ExceptionMessageTest.php | 48 + .../tests/Framework/Constraint/IsJsonTest.php | 29 + .../JsonMatches/ErrorMessageProviderTest.php | 78 + .../Framework/Constraint/JsonMatchesTest.php | 39 + .../tests/Framework/ConstraintTest.php | 3053 +++++++++++++ .../phpunit-5.7/tests/Framework/SuiteTest.php | 269 ++ .../tests/Framework/TestCaseTest.php | 690 +++ .../tests/Framework/TestFailureTest.php | 21 + .../tests/Framework/TestImplementorTest.php | 24 + .../tests/Framework/TestListenerTest.php | 110 + .../tests/Regression/GitHub/1149.phpt | 20 + .../Regression/GitHub/1149/Issue1149Test.php | 18 + .../tests/Regression/GitHub/1216.phpt | 25 + .../Regression/GitHub/1216/Issue1216Test.php | 8 + .../Regression/GitHub/1216/bootstrap1216.php | 2 + .../Regression/GitHub/1216/phpunit1216.xml | 8 + .../tests/Regression/GitHub/1265.phpt | 21 + .../Regression/GitHub/1265/Issue1265Test.php | 8 + .../Regression/GitHub/1265/phpunit1265.xml | 2 + .../tests/Regression/GitHub/1330.phpt | 24 + .../Regression/GitHub/1330/Issue1330Test.php | 8 + .../Regression/GitHub/1330/phpunit1330.xml | 5 + .../tests/Regression/GitHub/1335.phpt | 19 + .../Regression/GitHub/1335/Issue1335Test.php | 67 + .../Regression/GitHub/1335/bootstrap1335.php | 13 + .../tests/Regression/GitHub/1337.phpt | 19 + .../Regression/GitHub/1337/Issue1337Test.php | 19 + .../tests/Regression/GitHub/1348.phpt | 34 + .../Regression/GitHub/1348/Issue1348Test.php | 14 + .../tests/Regression/GitHub/1351.phpt | 46 + .../GitHub/1351/ChildProcessClass1351.php | 4 + .../Regression/GitHub/1351/Issue1351Test.php | 48 + .../tests/Regression/GitHub/1374.phpt | 19 + .../Regression/GitHub/1374/Issue1374Test.php | 21 + .../tests/Regression/GitHub/1437.phpt | 26 + .../Regression/GitHub/1437/Issue1437Test.php | 9 + .../tests/Regression/GitHub/1468.phpt | 20 + .../Regression/GitHub/1468/Issue1468Test.php | 11 + .../tests/Regression/GitHub/1471.phpt | 26 + .../Regression/GitHub/1471/Issue1471Test.php | 12 + .../tests/Regression/GitHub/1472.phpt | 25 + .../Regression/GitHub/1472/Issue1472Test.php | 21 + .../tests/Regression/GitHub/1570.phpt | 20 + .../Regression/GitHub/1570/Issue1570Test.php | 8 + .../tests/Regression/GitHub/2137-filter.phpt | 28 + .../Regression/GitHub/2137-no_filter.phpt | 30 + .../Regression/GitHub/2137/Issue2137Test.php | 33 + .../tests/Regression/GitHub/2145.phpt | 26 + .../Regression/GitHub/2145/Issue2145Test.php | 16 + .../tests/Regression/GitHub/2158.phpt | 19 + .../Regression/GitHub/2158/Issue2158Test.php | 23 + .../tests/Regression/GitHub/2158/constant.inc | 5 + .../Regression/GitHub/2299/Issue2299Test.php | 20 + .../tests/Regression/GitHub/2366.phpt | 19 + .../Regression/GitHub/2366/Issue2366Test.php | 30 + .../tests/Regression/GitHub/2380.phpt | 19 + .../Regression/GitHub/2380/Issue2380Test.php | 21 + .../tests/Regression/GitHub/2382.phpt | 19 + .../Regression/GitHub/2382/Issue2382Test.php | 22 + .../tests/Regression/GitHub/2435.phpt | 20 + .../Regression/GitHub/2435/Issue2435Test.php | 12 + .../tests/Regression/GitHub/244.phpt | 32 + .../Regression/GitHub/244/Issue244Test.php | 55 + .../tests/Regression/GitHub/2731.phpt | 26 + .../Regression/GitHub/2731/Issue2731Test.php | 11 + .../tests/Regression/GitHub/2758.phpt | 22 + .../Regression/GitHub/2758/Issue2758Test.php | 7 + .../GitHub/2758/Issue2758TestListener.php | 12 + .../tests/Regression/GitHub/2758/phpunit.xml | 7 + .../tests/Regression/GitHub/2811.phpt | 20 + .../Regression/GitHub/2811/Issue2811Test.php | 10 + .../tests/Regression/GitHub/2972.phpt | 18 + .../GitHub/2972/issue-2972-test.phpt | 10 + .../2972/unconventiallyNamedIssue2972Test.php | 13 + .../tests/Regression/GitHub/322.phpt | 26 + .../Regression/GitHub/322/Issue322Test.php | 17 + .../Regression/GitHub/322/phpunit322.xml | 11 + .../tests/Regression/GitHub/433.phpt | 31 + .../Regression/GitHub/433/Issue433Test.php | 21 + .../tests/Regression/GitHub/445.phpt | 32 + .../Regression/GitHub/445/Issue445Test.php | 21 + .../tests/Regression/GitHub/498.phpt | 29 + .../Regression/GitHub/498/Issue498Test.php | 44 + .../tests/Regression/GitHub/503.phpt | 33 + .../Regression/GitHub/503/Issue503Test.php | 11 + .../tests/Regression/GitHub/581.phpt | 42 + .../Regression/GitHub/581/Issue581Test.php | 11 + .../tests/Regression/GitHub/74.phpt | 28 + .../Regression/GitHub/74/Issue74Test.php | 9 + .../Regression/GitHub/74/NewException.php | 4 + .../tests/Regression/GitHub/765.phpt | 26 + .../Regression/GitHub/765/Issue765Test.php | 22 + .../tests/Regression/GitHub/797.phpt | 22 + .../Regression/GitHub/797/Issue797Test.php | 10 + .../Regression/GitHub/797/bootstrap797.php | 6 + .../tests/Regression/GitHub/863.phpt | 24 + .../tests/Regression/GitHub/873-php5.phpt | 22 + .../tests/Regression/GitHub/873-php7.phpt | 22 + .../Regression/GitHub/873/Issue873Test.php | 9 + .../tests/Regression/Trac/1021.phpt | 19 + .../Regression/Trac/1021/Issue1021Test.php | 23 + .../tests/Regression/Trac/523.phpt | 19 + .../Regression/Trac/523/Issue523Test.php | 13 + .../tests/Regression/Trac/578.phpt | 37 + .../Regression/Trac/578/Issue578Test.php | 20 + .../tests/Regression/Trac/684.phpt | 25 + .../Regression/Trac/684/Issue684Test.php | 4 + .../tests/Regression/Trac/783.phpt | 21 + .../tests/Regression/Trac/783/ChildSuite.php | 15 + .../tests/Regression/Trac/783/OneTest.php | 10 + .../tests/Regression/Trac/783/ParentSuite.php | 13 + .../tests/Regression/Trac/783/TwoTest.php | 10 + .../tests/Runner/BaseTestRunnerTest.php | 18 + .../tests/TextUI/_files/expect_external.txt | 1 + .../tests/TextUI/_files/phpt-env.expected.txt | 1 + .../tests/TextUI/_files/phpt_external.php | 2 + .../tests/TextUI/abstract-test-class.phpt | 24 + .../phpunit-5.7/tests/TextUI/assertion.phpt | 38 + .../tests/TextUI/code-coverage-ignore.phpt | 36 + .../tests/TextUI/colors-always.phpt | 18 + .../tests/TextUI/concrete-test-class.phpt | 18 + .../tests/TextUI/custom-printer-debug.phpt | 26 + .../tests/TextUI/custom-printer-verbose.phpt | 31 + .../tests/TextUI/dataprovider-debug.phpt | 33 + .../tests/TextUI/dataprovider-issue-2833.phpt | 17 + .../tests/TextUI/dataprovider-issue-2859.phpt | 17 + .../tests/TextUI/dataprovider-issue-2922.phpt | 18 + .../dataprovider-log-xml-isolation.phpt | 46 + .../tests/TextUI/dataprovider-log-xml.phpt | 45 + .../tests/TextUI/dataprovider-testdox.phpt | 19 + .phpunit/phpunit-5.7/tests/TextUI/debug.phpt | 25 + .../tests/TextUI/default-isolation.phpt | 19 + .../phpunit-5.7/tests/TextUI/default.phpt | 18 + .../tests/TextUI/dependencies-clone.phpt | 22 + .../tests/TextUI/dependencies-isolation.phpt | 42 + .../tests/TextUI/dependencies.phpt | 41 + .../tests/TextUI/dependencies2-isolation.phpt | 19 + .../tests/TextUI/dependencies2.phpt | 18 + .../tests/TextUI/dependencies3-isolation.phpt | 19 + .../tests/TextUI/dependencies3.phpt | 19 + .../TextUI/disable-code-coverage-ignore.phpt | 40 + .../tests/TextUI/empty-testcase.phpt | 25 + .../tests/TextUI/exception-stack.phpt | 64 + .../tests/TextUI/exclude-group-isolation.phpt | 21 + .../tests/TextUI/exclude-group.phpt | 20 + .../tests/TextUI/failure-isolation.phpt | 141 + .../tests/TextUI/failure-reverse-list.phpt | 141 + .../phpunit-5.7/tests/TextUI/failure.phpt | 140 + .../tests/TextUI/fatal-isolation.phpt | 25 + .../tests/TextUI/filter-class-isolation.phpt | 21 + .../tests/TextUI/filter-class.phpt | 20 + ...ider-by-classname-and-range-isolation.phpt | 21 + ...r-dataprovider-by-classname-and-range.phpt | 20 + ...lter-dataprovider-by-number-isolation.phpt | 21 + .../TextUI/filter-dataprovider-by-number.phpt | 20 + ...-dataprovider-by-only-range-isolation.phpt | 21 + .../filter-dataprovider-by-only-range.phpt | 20 + ...dataprovider-by-only-regexp-isolation.phpt | 21 + .../filter-dataprovider-by-only-regexp.phpt | 20 + ...dataprovider-by-only-string-isolation.phpt | 21 + .../filter-dataprovider-by-only-string.phpt | 20 + ...ilter-dataprovider-by-range-isolation.phpt | 21 + .../TextUI/filter-dataprovider-by-range.phpt | 20 + ...lter-dataprovider-by-regexp-isolation.phpt | 21 + .../TextUI/filter-dataprovider-by-regexp.phpt | 20 + ...lter-dataprovider-by-string-isolation.phpt | 21 + .../TextUI/filter-dataprovider-by-string.phpt | 20 + .../filter-method-case-insensitive.phpt | 20 + ...ilter-method-case-sensitive-no-result.phpt | 20 + .../tests/TextUI/filter-method-isolation.phpt | 21 + .../tests/TextUI/filter-method.phpt | 20 + .../tests/TextUI/filter-no-results.phpt | 20 + .../tests/TextUI/forward-compatibility.phpt | 18 + .../tests/TextUI/group-isolation.phpt | 21 + .phpunit/phpunit-5.7/tests/TextUI/group.phpt | 20 + .phpunit/phpunit-5.7/tests/TextUI/help.phpt | 99 + .phpunit/phpunit-5.7/tests/TextUI/help2.phpt | 100 + .../tests/TextUI/ini-isolation.phpt | 21 + .../phpunit-5.7/tests/TextUI/list-groups.phpt | 18 + .../phpunit-5.7/tests/TextUI/list-suites.phpt | 16 + .../tests/TextUI/log-json-post-66021.phpt | 73 + .../phpunit-5.7/tests/TextUI/log-junit.phpt | 68 + .../phpunit-5.7/tests/TextUI/log-tap.phpt | 27 + .../tests/TextUI/log-teamcity.phpt | 38 + .../phpunit-5.7/tests/TextUI/mycommand.phpt | 23 + .../tests/TextUI/options-after-arguments.phpt | 18 + .../tests/TextUI/output-isolation.phpt | 20 + .../TextUI/phar-extension-suppressed.phpt | 12 + .../tests/TextUI/phar-extension.phpt | 21 + .../phpunit-5.7/tests/TextUI/phpt-args.phpt | 12 + .../phpunit-5.7/tests/TextUI/phpt-env.phpt | 12 + .../tests/TextUI/phpt-external.phpt | 6 + .../phpunit-5.7/tests/TextUI/phpt-stderr.phpt | 8 + .../phpunit-5.7/tests/TextUI/phpt-stdin.phpt | 11 + .../phpunit-5.7/tests/TextUI/phpt-xfail.phpt | 18 + .phpunit/phpunit-5.7/tests/TextUI/repeat.phpt | 20 + .../report-useless-tests-incomplete.phpt | 20 + .../report-useless-tests-isolation.phpt | 21 + .../tests/TextUI/report-useless-tests.phpt | 28 + .../tests/TextUI/stop-on-warning-via-cli.phpt | 25 + .../TextUI/stop-on-warning-via-config.phpt | 26 + .phpunit/phpunit-5.7/tests/TextUI/tap.phpt | 17 + .../TextUI/teamcity-inner-exceptions.phpt | 39 + .../phpunit-5.7/tests/TextUI/teamcity.phpt | 37 + .../tests/TextUI/test-suffix-multiple.phpt | 19 + .../tests/TextUI/test-suffix-single.phpt | 19 + .../tests/TextUI/testdox-exclude-group.phpt | 25 + .../tests/TextUI/testdox-group.phpt | 25 + .../tests/TextUI/testdox-html.phpt | 56 + .../tests/TextUI/testdox-text.phpt | 24 + .../phpunit-5.7/tests/TextUI/testdox-xml.phpt | 56 + .../phpunit-5.7/tests/TextUI/testdox.phpt | 18 + .../tests/Util/ConfigurationTest.php | 431 ++ .../phpunit-5.7/tests/Util/GetoptTest.php | 60 + .../tests/Util/GlobalStateTest.php | 30 + .phpunit/phpunit-5.7/tests/Util/PHPTest.php | 132 + .phpunit/phpunit-5.7/tests/Util/RegexTest.php | 47 + .../tests/Util/TestDox/NamePrettifierTest.php | 66 + .phpunit/phpunit-5.7/tests/Util/TestTest.php | 823 ++++ .phpunit/phpunit-5.7/tests/Util/XMLTest.php | 90 + .../phpunit-5.7/tests/_files/AbstractTest.php | 7 + .../tests/_files/ArrayAccessible.php | 40 + .../tests/_files/AssertionExample.php | 8 + .../tests/_files/AssertionExampleTest.php | 10 + .phpunit/phpunit-5.7/tests/_files/Author.php | 26 + .../phpunit-5.7/tests/_files/BankAccount.php | 81 + .../tests/_files/BankAccountTest.php | 93 + .../tests/_files/BankAccountTest.test.php | 86 + .../tests/_files/BankAccountTest2.php | 56 + .../tests/_files/BaseTestListenerSample.php | 11 + .../tests/_files/BeforeAndAfterTest.php | 35 + .../_files/BeforeClassAndAfterClassTest.php | 35 + .../BeforeClassWithOnlyDataProviderTest.php | 39 + .phpunit/phpunit-5.7/tests/_files/Book.php | 19 + .../phpunit-5.7/tests/_files/Calculator.php | 14 + .../ChangeCurrentWorkingDirectoryTest.php | 9 + .../_files/ClassWithNonPublicAttributes.php | 29 + .../ClassWithScalarTypeDeclarations.php | 7 + .../tests/_files/ClassWithToString.php | 21 + .../tests/_files/ClonedDependencyTest.php | 39 + .../tests/_files/ConcreteTest.my.php | 7 + .../phpunit-5.7/tests/_files/ConcreteTest.php | 7 + .../_files/CoverageClassExtendedTest.php | 12 + .../tests/_files/CoverageClassTest.php | 12 + .../CoverageFunctionParenthesesTest.php | 11 + ...erageFunctionParenthesesWhitespaceTest.php | 11 + .../tests/_files/CoverageFunctionTest.php | 11 + .../CoverageMethodOneLineAnnotationTest.php | 11 + .../_files/CoverageMethodParenthesesTest.php | 12 + ...overageMethodParenthesesWhitespaceTest.php | 12 + .../tests/_files/CoverageMethodTest.php | 12 + .../_files/CoverageNamespacedFunctionTest.php | 11 + .../tests/_files/CoverageNoneTest.php | 9 + .../tests/_files/CoverageNotPrivateTest.php | 12 + .../tests/_files/CoverageNotProtectedTest.php | 12 + .../tests/_files/CoverageNotPublicTest.php | 12 + .../tests/_files/CoverageNothingTest.php | 13 + .../tests/_files/CoveragePrivateTest.php | 12 + .../tests/_files/CoverageProtectedTest.php | 12 + .../tests/_files/CoveragePublicTest.php | 12 + .../CoverageTwoDefaultClassAnnotations.php | 17 + .../phpunit-5.7/tests/_files/CoveredClass.php | 36 + .../tests/_files/CoveredFunction.php | 4 + .../tests/_files/CustomPrinter.php | 4 + .../tests/_files/DataProviderDebugTest.php | 48 + .../_files/DataProviderDependencyTest.php | 25 + .../tests/_files/DataProviderFilterTest.php | 39 + .../_files/DataProviderIncompleteTest.php | 37 + .../DataProviderIssue2833/FirstTest.php | 23 + .../DataProviderIssue2833/SecondTest.php | 15 + .../_files/DataProviderIssue2859/phpunit.xml | 10 + .../another/TestWithDataProviderTest.php | 21 + .../DataProviderIssue2922/FirstTest.php | 24 + .../DataProviderIssue2922/SecondTest.php | 14 + .../tests/_files/DataProviderSkippedTest.php | 37 + .../tests/_files/DataProviderTest.php | 21 + .../tests/_files/DataProviderTestDoxTest.php | 26 + .../tests/_files/DependencyFailureTest.php | 29 + .../tests/_files/DependencySuccessTest.php | 21 + .../tests/_files/DependencyTestSuite.php | 13 + .../tests/_files/DoubleTestCase.php | 25 + .../tests/_files/DummyException.php | 5 + .../tests/_files/EmptyTestCaseTest.php | 4 + .../ExceptionInAssertPostConditionsTest.php | 35 + .../ExceptionInAssertPreConditionsTest.php | 35 + .../tests/_files/ExceptionInSetUpTest.php | 35 + .../tests/_files/ExceptionInTearDownTest.php | 35 + .../tests/_files/ExceptionInTest.php | 35 + .../tests/_files/ExceptionNamespaceTest.php | 38 + .../tests/_files/ExceptionStackTest.php | 21 + .../tests/_files/ExceptionTest.php | 139 + .phpunit/phpunit-5.7/tests/_files/Failure.php | 8 + .../phpunit-5.7/tests/_files/FailureTest.php | 75 + .../phpunit-5.7/tests/_files/FatalTest.php | 13 + .../tests/_files/IgnoreCodeCoverageClass.php | 16 + .../_files/IgnoreCodeCoverageClassTest.php | 15 + .../tests/_files/IncompleteTest.php | 8 + .../tests/_files/Inheritance/InheritanceA.php | 7 + .../tests/_files/Inheritance/InheritanceB.php | 8 + .../tests/_files/InheritedTestCase.php | 7 + .phpunit/phpunit-5.7/tests/_files/IniTest.php | 8 + .../tests/_files/IsolationTest.php | 13 + .../tests/_files/JsonData/arrayObject.json | 1 + .../tests/_files/JsonData/simpleObject.json | 1 + .../phpunit-5.7/tests/_files/MockRunner.php | 7 + .../phpunit-5.7/tests/_files/Mockable.php | 26 + .../tests/_files/MultiDependencyTest.php | 23 + .../tests/_files/MultipleDataProviderTest.php | 75 + .../phpunit-5.7/tests/_files/MyCommand.php | 15 + .../NamespaceCoverageClassExtendedTest.php | 12 + .../_files/NamespaceCoverageClassTest.php | 12 + ...NamespaceCoverageCoversClassPublicTest.php | 15 + .../NamespaceCoverageCoversClassTest.php | 20 + .../_files/NamespaceCoverageMethodTest.php | 12 + .../NamespaceCoverageNotPrivateTest.php | 12 + .../NamespaceCoverageNotProtectedTest.php | 12 + .../_files/NamespaceCoverageNotPublicTest.php | 12 + .../_files/NamespaceCoveragePrivateTest.php | 12 + .../_files/NamespaceCoverageProtectedTest.php | 12 + .../_files/NamespaceCoveragePublicTest.php | 12 + .../tests/_files/NamespaceCoveredClass.php | 38 + .../tests/_files/NamespaceCoveredFunction.php | 7 + .../tests/_files/NoArgTestCaseTest.php | 7 + .../tests/_files/NoTestCaseClass.php | 4 + .../phpunit-5.7/tests/_files/NoTestCases.php | 7 + .../phpunit-5.7/tests/_files/NonStatic.php | 8 + .../_files/NotExistingCoveredElementTest.php | 24 + .../tests/_files/NotPublicTestCase.php | 11 + .../tests/_files/NotVoidTestCase.php | 4 + .../phpunit-5.7/tests/_files/NothingTest.php | 7 + .../phpunit-5.7/tests/_files/OneTestCase.php | 11 + .../tests/_files/OutputTestCase.php | 27 + .../tests/_files/OverrideTestCase.php | 7 + .../RequirementsClassBeforeClassHookTest.php | 12 + .../_files/RequirementsClassDocBlockTest.php | 22 + .../tests/_files/RequirementsTest.php | 345 ++ .../tests/_files/SampleArrayAccess.php | 36 + .../phpunit-5.7/tests/_files/SampleClass.php | 14 + .../phpunit-5.7/tests/_files/Singleton.php | 22 + .../phpunit-5.7/tests/_files/StackTest.php | 24 + .../phpunit-5.7/tests/_files/StatusTest.php | 37 + .../tests/_files/StopOnWarningTestSuite.php | 13 + .../tests/_files/StopsOnWarningTest.php | 7 + .phpunit/phpunit-5.7/tests/_files/Struct.php | 10 + .phpunit/phpunit-5.7/tests/_files/Success.php | 7 + .../tests/_files/TemplateMethodsTest.php | 51 + .../tests/_files/TestAutoreferenced.php | 12 + .../tests/_files/TestDoxGroupTest.php | 18 + .../tests/_files/TestGeneratorMaker.php | 11 + .../tests/_files/TestIncomplete.php | 8 + .../phpunit-5.7/tests/_files/TestIterator.php | 36 + .../tests/_files/TestIterator2.php | 35 + .../phpunit-5.7/tests/_files/TestSkipped.php | 8 + .../tests/_files/TestTestError.php | 8 + .../phpunit-5.7/tests/_files/TestWithTest.php | 24 + .../tests/_files/ThrowExceptionTestCase.php | 8 + .../tests/_files/ThrowNoExceptionTestCase.php | 7 + .phpunit/phpunit-5.7/tests/_files/WasRun.php | 10 + .phpunit/phpunit-5.7/tests/_files/bar.xml | 1 + .../_files/configuration.colors.empty.xml | 1 + .../_files/configuration.colors.false.xml | 1 + .../_files/configuration.colors.invalid.xml | 1 + .../_files/configuration.colors.true.xml | 1 + .../_files/configuration.custom-printer.xml | 2 + .../tests/_files/configuration.suites.xml | 6 + .../tests/_files/configuration.xml | 121 + .../tests/_files/configuration_empty.xml | 49 + .../_files/configuration_stop_on_warning.xml | 2 + .../tests/_files/configuration_xinclude.xml | 74 + .../tests/_files/expectedFileFormat.txt | 1 + .phpunit/phpunit-5.7/tests/_files/foo.xml | 1 + .../tests/_files/phpt-for-coverage.phpt | 8 + .../phpunit-5.7/tests/_files/phpt-xfail.phpt | 11 + .../phpunit-example-extension/phpunit.xml | 10 + .../tests/OneTest.php | 12 + .../phpunit-example-extension-1.0.0.phar | Bin 0 -> 3187 bytes ...uctureAttributesAreSameButValuesAreNot.xml | 10 + .../tests/_files/structureExpected.xml | 10 + .../tests/_files/structureIgnoreTextNodes.xml | 13 + .../_files/structureIsSameButDataIsNot.xml | 10 + .../structureWrongNumberOfAttributes.xml | 10 + .../_files/structureWrongNumberOfNodes.xml | 9 + .phpunit/phpunit-5.7/tests/bootstrap.php | 6 + composer.json | 5 +- phpunit.xml.dist | 5 - src/Admin/Content/StaticContentAdmin.php | 2 +- .../Factory/ContentAdminFactory.php | 29 +- src/Resources/config/content.xml | 2 +- tests/Fixtures/App/config/bundles.php | 3 +- .../config/cmf_sonata_admin_integration.yml | 4 +- .../Factory/ContentAdminFactoryTest.php | 12 +- 559 files changed, 46703 insertions(+), 24 deletions(-) create mode 100644 .phpunit/.5.7.md5 create mode 100644 .phpunit/5.7.zip create mode 100644 .phpunit/phpunit-5.7/.gitattributes create mode 100644 .phpunit/phpunit-5.7/.github/CODE_OF_CONDUCT.md create mode 100644 .phpunit/phpunit-5.7/.github/CONTRIBUTING.md create mode 100644 .phpunit/phpunit-5.7/.github/ISSUE_TEMPLATE.md create mode 100644 .phpunit/phpunit-5.7/.gitignore create mode 100644 .phpunit/phpunit-5.7/.php_cs.dist create mode 100644 .phpunit/phpunit-5.7/.stickler.yml create mode 100644 .phpunit/phpunit-5.7/.travis.yml create mode 100644 .phpunit/phpunit-5.7/ChangeLog-5.7.md create mode 100644 .phpunit/phpunit-5.7/LICENSE create mode 100644 .phpunit/phpunit-5.7/README.md create mode 100644 .phpunit/phpunit-5.7/build.xml create mode 100644 .phpunit/phpunit-5.7/composer.json create mode 100644 .phpunit/phpunit-5.7/phpunit create mode 100644 .phpunit/phpunit-5.7/phpunit.xml create mode 100644 .phpunit/phpunit-5.7/phpunit.xsd create mode 100644 .phpunit/phpunit-5.7/src/Exception.php create mode 100644 .phpunit/phpunit-5.7/src/Extensions/GroupTestSuite.php create mode 100644 .phpunit/phpunit-5.7/src/Extensions/PhptTestCase.php create mode 100644 .phpunit/phpunit-5.7/src/Extensions/PhptTestSuite.php create mode 100644 .phpunit/phpunit-5.7/src/Extensions/RepeatedTest.php create mode 100644 .phpunit/phpunit-5.7/src/Extensions/TestDecorator.php create mode 100644 .phpunit/phpunit-5.7/src/Extensions/TicketListener.php create mode 100644 .phpunit/phpunit-5.7/src/ForwardCompatibility/Assert.php create mode 100644 .phpunit/phpunit-5.7/src/ForwardCompatibility/AssertionFailedError.php create mode 100644 .phpunit/phpunit-5.7/src/ForwardCompatibility/BaseTestListener.php create mode 100644 .phpunit/phpunit-5.7/src/ForwardCompatibility/Test.php create mode 100644 .phpunit/phpunit-5.7/src/ForwardCompatibility/TestCase.php create mode 100644 .phpunit/phpunit-5.7/src/ForwardCompatibility/TestListener.php create mode 100644 .phpunit/phpunit-5.7/src/ForwardCompatibility/TestSuite.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Assert.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Assert/Functions.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/AssertionFailedError.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/BaseTestListener.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/CodeCoverageException.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/And.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/ArrayHasKey.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/ArraySubset.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/Attribute.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/Callback.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/ClassHasAttribute.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/ClassHasStaticAttribute.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/Composite.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/Count.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/DirectoryExists.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/Exception.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/ExceptionCode.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/ExceptionMessage.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/ExceptionMessageRegExp.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/FileExists.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/GreaterThan.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/IsAnything.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/IsEmpty.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/IsEqual.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/IsFalse.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/IsFinite.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/IsIdentical.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/IsInfinite.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/IsInstanceOf.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/IsJson.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/IsNan.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/IsNull.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/IsReadable.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/IsTrue.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/IsType.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/IsWritable.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/JsonMatches.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/JsonMatches/ErrorMessageProvider.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/LessThan.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/Not.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/ObjectHasAttribute.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/Or.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/PCREMatch.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/SameSize.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/StringContains.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/StringEndsWith.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/StringMatches.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/StringStartsWith.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/TraversableContains.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/TraversableContainsOnly.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Constraint/Xor.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/CoveredCodeNotExecutedException.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Error.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Error/Deprecated.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Error/Notice.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Error/Warning.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Exception.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/ExceptionWrapper.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/ExpectationFailedException.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/IncompleteTest.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/IncompleteTestCase.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/IncompleteTestError.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/InvalidCoversTargetException.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/MissingCoversAnnotationException.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/OutputError.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/RiskyTest.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/RiskyTestError.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/SelfDescribing.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/SkippedTest.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/SkippedTestCase.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/SkippedTestError.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/SkippedTestSuiteError.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/SyntheticError.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Test.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/TestCase.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/TestFailure.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/TestListener.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/TestResult.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/TestSuite.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/TestSuite/DataProvider.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/UnintentionallyCoveredCodeError.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/Warning.php create mode 100644 .phpunit/phpunit-5.7/src/Framework/WarningTestCase.php create mode 100644 .phpunit/phpunit-5.7/src/Runner/BaseTestRunner.php create mode 100644 .phpunit/phpunit-5.7/src/Runner/Exception.php create mode 100644 .phpunit/phpunit-5.7/src/Runner/Filter/Factory.php create mode 100644 .phpunit/phpunit-5.7/src/Runner/Filter/Group.php create mode 100644 .phpunit/phpunit-5.7/src/Runner/Filter/Group/Exclude.php create mode 100644 .phpunit/phpunit-5.7/src/Runner/Filter/Group/Include.php create mode 100644 .phpunit/phpunit-5.7/src/Runner/Filter/Test.php create mode 100644 .phpunit/phpunit-5.7/src/Runner/StandardTestSuiteLoader.php create mode 100644 .phpunit/phpunit-5.7/src/Runner/TestSuiteLoader.php create mode 100644 .phpunit/phpunit-5.7/src/Runner/Version.php create mode 100644 .phpunit/phpunit-5.7/src/TextUI/Command.php create mode 100644 .phpunit/phpunit-5.7/src/TextUI/ResultPrinter.php create mode 100644 .phpunit/phpunit-5.7/src/TextUI/TestRunner.php create mode 100644 .phpunit/phpunit-5.7/src/Util/Blacklist.php create mode 100644 .phpunit/phpunit-5.7/src/Util/Configuration.php create mode 100644 .phpunit/phpunit-5.7/src/Util/ConfigurationGenerator.php create mode 100644 .phpunit/phpunit-5.7/src/Util/ErrorHandler.php create mode 100644 .phpunit/phpunit-5.7/src/Util/Fileloader.php create mode 100644 .phpunit/phpunit-5.7/src/Util/Filesystem.php create mode 100644 .phpunit/phpunit-5.7/src/Util/Filter.php create mode 100644 .phpunit/phpunit-5.7/src/Util/Getopt.php create mode 100644 .phpunit/phpunit-5.7/src/Util/GlobalState.php create mode 100644 .phpunit/phpunit-5.7/src/Util/InvalidArgumentHelper.php create mode 100644 .phpunit/phpunit-5.7/src/Util/Log/JSON.php create mode 100644 .phpunit/phpunit-5.7/src/Util/Log/JUnit.php create mode 100644 .phpunit/phpunit-5.7/src/Util/Log/TAP.php create mode 100644 .phpunit/phpunit-5.7/src/Util/Log/TeamCity.php create mode 100644 .phpunit/phpunit-5.7/src/Util/PHP.php create mode 100644 .phpunit/phpunit-5.7/src/Util/PHP/Default.php create mode 100644 .phpunit/phpunit-5.7/src/Util/PHP/Template/TestCaseMethod.tpl.dist create mode 100644 .phpunit/phpunit-5.7/src/Util/PHP/Windows.php create mode 100644 .phpunit/phpunit-5.7/src/Util/PHP/eval-stdin.php create mode 100644 .phpunit/phpunit-5.7/src/Util/Printer.php create mode 100644 .phpunit/phpunit-5.7/src/Util/Regex.php create mode 100644 .phpunit/phpunit-5.7/src/Util/String.php create mode 100644 .phpunit/phpunit-5.7/src/Util/Test.php create mode 100644 .phpunit/phpunit-5.7/src/Util/TestDox/NamePrettifier.php create mode 100644 .phpunit/phpunit-5.7/src/Util/TestDox/ResultPrinter.php create mode 100644 .phpunit/phpunit-5.7/src/Util/TestDox/ResultPrinter/HTML.php create mode 100644 .phpunit/phpunit-5.7/src/Util/TestDox/ResultPrinter/Text.php create mode 100644 .phpunit/phpunit-5.7/src/Util/TestDox/ResultPrinter/XML.php create mode 100644 .phpunit/phpunit-5.7/src/Util/TestSuiteIterator.php create mode 100644 .phpunit/phpunit-5.7/src/Util/Type.php create mode 100644 .phpunit/phpunit-5.7/src/Util/XML.php create mode 100644 .phpunit/phpunit-5.7/tests/Extensions/PhptTestCaseTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Extensions/RepeatedTestTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Fail/fail.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Framework/AssertTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Framework/BaseTestListenerTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Framework/Constraint/ArraySubsetTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Framework/Constraint/CountTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Framework/Constraint/ExceptionMessageRegExpTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Framework/Constraint/ExceptionMessageTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Framework/Constraint/IsJsonTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Framework/Constraint/JsonMatches/ErrorMessageProviderTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Framework/Constraint/JsonMatchesTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Framework/ConstraintTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Framework/SuiteTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Framework/TestCaseTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Framework/TestFailureTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Framework/TestImplementorTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Framework/TestListenerTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1149.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1149/Issue1149Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1216.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1216/Issue1216Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1216/bootstrap1216.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1216/phpunit1216.xml create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1265.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1265/Issue1265Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1265/phpunit1265.xml create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1330.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1330/Issue1330Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1330/phpunit1330.xml create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1335.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1335/Issue1335Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1335/bootstrap1335.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1337.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1337/Issue1337Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1348.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1348/Issue1348Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1351.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1351/ChildProcessClass1351.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1351/Issue1351Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1374.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1374/Issue1374Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1437.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1437/Issue1437Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1468.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1468/Issue1468Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1471.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1471/Issue1471Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1472.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1472/Issue1472Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1570.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/1570/Issue1570Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2137-filter.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2137-no_filter.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2137/Issue2137Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2145.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2145/Issue2145Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2158.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2158/Issue2158Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2158/constant.inc create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2299/Issue2299Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2366.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2366/Issue2366Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2380.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2380/Issue2380Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2382.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2382/Issue2382Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2435.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2435/Issue2435Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/244.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/244/Issue244Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2731.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2731/Issue2731Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2758.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2758/Issue2758Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2758/Issue2758TestListener.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2758/phpunit.xml create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2811.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2811/Issue2811Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2972.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2972/issue-2972-test.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/2972/unconventiallyNamedIssue2972Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/322.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/322/Issue322Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/322/phpunit322.xml create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/433.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/433/Issue433Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/445.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/445/Issue445Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/498.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/498/Issue498Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/503.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/503/Issue503Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/581.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/581/Issue581Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/74.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/74/Issue74Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/74/NewException.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/765.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/765/Issue765Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/797.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/797/Issue797Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/797/bootstrap797.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/863.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/873-php5.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/873-php7.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/GitHub/873/Issue873Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/Trac/1021.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/Trac/1021/Issue1021Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/Trac/523.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/Trac/523/Issue523Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/Trac/578.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/Trac/578/Issue578Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/Trac/684.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/Trac/684/Issue684Test.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/Trac/783.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Regression/Trac/783/ChildSuite.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/Trac/783/OneTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/Trac/783/ParentSuite.php create mode 100644 .phpunit/phpunit-5.7/tests/Regression/Trac/783/TwoTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Runner/BaseTestRunnerTest.php create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/_files/expect_external.txt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/_files/phpt-env.expected.txt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/_files/phpt_external.php create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/abstract-test-class.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/assertion.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/code-coverage-ignore.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/colors-always.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/concrete-test-class.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/custom-printer-debug.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/custom-printer-verbose.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/dataprovider-debug.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/dataprovider-issue-2833.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/dataprovider-issue-2859.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/dataprovider-issue-2922.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/dataprovider-log-xml-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/dataprovider-log-xml.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/dataprovider-testdox.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/debug.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/default-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/default.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/dependencies-clone.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/dependencies-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/dependencies.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/dependencies2-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/dependencies2.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/dependencies3-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/dependencies3.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/disable-code-coverage-ignore.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/empty-testcase.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/exception-stack.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/exclude-group-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/exclude-group.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/failure-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/failure-reverse-list.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/failure.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/fatal-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-class-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-class.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-dataprovider-by-classname-and-range-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-dataprovider-by-classname-and-range.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-dataprovider-by-number-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-dataprovider-by-number.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-dataprovider-by-only-range-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-dataprovider-by-only-range.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-dataprovider-by-only-regexp-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-dataprovider-by-only-regexp.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-dataprovider-by-only-string-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-dataprovider-by-only-string.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-dataprovider-by-range-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-dataprovider-by-range.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-dataprovider-by-regexp-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-dataprovider-by-regexp.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-dataprovider-by-string-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-dataprovider-by-string.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-method-case-insensitive.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-method-case-sensitive-no-result.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-method-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-method.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/filter-no-results.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/forward-compatibility.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/group-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/group.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/help.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/help2.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/ini-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/list-groups.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/list-suites.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/log-json-post-66021.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/log-junit.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/log-tap.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/log-teamcity.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/mycommand.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/options-after-arguments.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/output-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/phar-extension-suppressed.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/phar-extension.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/phpt-args.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/phpt-env.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/phpt-external.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/phpt-stderr.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/phpt-stdin.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/phpt-xfail.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/repeat.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/report-useless-tests-incomplete.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/report-useless-tests-isolation.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/report-useless-tests.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/stop-on-warning-via-cli.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/stop-on-warning-via-config.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/tap.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/teamcity-inner-exceptions.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/teamcity.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/test-suffix-multiple.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/test-suffix-single.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/testdox-exclude-group.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/testdox-group.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/testdox-html.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/testdox-text.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/testdox-xml.phpt create mode 100644 .phpunit/phpunit-5.7/tests/TextUI/testdox.phpt create mode 100644 .phpunit/phpunit-5.7/tests/Util/ConfigurationTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Util/GetoptTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Util/GlobalStateTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Util/PHPTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Util/RegexTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Util/TestDox/NamePrettifierTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Util/TestTest.php create mode 100644 .phpunit/phpunit-5.7/tests/Util/XMLTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/AbstractTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ArrayAccessible.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/AssertionExample.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/AssertionExampleTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/Author.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/BankAccount.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/BankAccountTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/BankAccountTest.test.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/BankAccountTest2.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/BaseTestListenerSample.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/BeforeAndAfterTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/BeforeClassAndAfterClassTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/BeforeClassWithOnlyDataProviderTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/Book.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/Calculator.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ChangeCurrentWorkingDirectoryTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ClassWithNonPublicAttributes.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ClassWithScalarTypeDeclarations.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ClassWithToString.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ClonedDependencyTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ConcreteTest.my.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ConcreteTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoverageClassExtendedTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoverageClassTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoverageFunctionParenthesesTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoverageFunctionParenthesesWhitespaceTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoverageFunctionTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoverageMethodOneLineAnnotationTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoverageMethodParenthesesTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoverageMethodParenthesesWhitespaceTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoverageMethodTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoverageNamespacedFunctionTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoverageNoneTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoverageNotPrivateTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoverageNotProtectedTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoverageNotPublicTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoverageNothingTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoveragePrivateTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoverageProtectedTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoveragePublicTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoverageTwoDefaultClassAnnotations.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoveredClass.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CoveredFunction.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/CustomPrinter.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/DataProviderDebugTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/DataProviderDependencyTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/DataProviderFilterTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/DataProviderIncompleteTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/DataProviderIssue2833/FirstTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/DataProviderIssue2833/SecondTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/DataProviderIssue2859/phpunit.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/DataProviderIssue2859/tests/another/TestWithDataProviderTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/DataProviderIssue2922/FirstTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/DataProviderIssue2922/SecondTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/DataProviderSkippedTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/DataProviderTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/DataProviderTestDoxTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/DependencyFailureTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/DependencySuccessTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/DependencyTestSuite.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/DoubleTestCase.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/DummyException.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/EmptyTestCaseTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ExceptionInAssertPostConditionsTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ExceptionInAssertPreConditionsTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ExceptionInSetUpTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ExceptionInTearDownTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ExceptionInTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ExceptionNamespaceTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ExceptionStackTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ExceptionTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/Failure.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/FailureTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/FatalTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/IgnoreCodeCoverageClass.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/IgnoreCodeCoverageClassTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/IncompleteTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/Inheritance/InheritanceA.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/Inheritance/InheritanceB.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/InheritedTestCase.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/IniTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/IsolationTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/JsonData/arrayObject.json create mode 100644 .phpunit/phpunit-5.7/tests/_files/JsonData/simpleObject.json create mode 100644 .phpunit/phpunit-5.7/tests/_files/MockRunner.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/Mockable.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/MultiDependencyTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/MultipleDataProviderTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/MyCommand.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NamespaceCoverageClassExtendedTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NamespaceCoverageClassTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NamespaceCoverageCoversClassPublicTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NamespaceCoverageCoversClassTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NamespaceCoverageMethodTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NamespaceCoverageNotPrivateTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NamespaceCoverageNotProtectedTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NamespaceCoverageNotPublicTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NamespaceCoveragePrivateTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NamespaceCoverageProtectedTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NamespaceCoveragePublicTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NamespaceCoveredClass.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NamespaceCoveredFunction.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NoArgTestCaseTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NoTestCaseClass.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NoTestCases.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NonStatic.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NotExistingCoveredElementTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NotPublicTestCase.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NotVoidTestCase.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/NothingTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/OneTestCase.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/OutputTestCase.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/OverrideTestCase.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/RequirementsClassBeforeClassHookTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/RequirementsClassDocBlockTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/RequirementsTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/SampleArrayAccess.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/SampleClass.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/Singleton.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/StackTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/StatusTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/StopOnWarningTestSuite.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/StopsOnWarningTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/Struct.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/Success.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/TemplateMethodsTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/TestAutoreferenced.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/TestDoxGroupTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/TestGeneratorMaker.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/TestIncomplete.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/TestIterator.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/TestIterator2.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/TestSkipped.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/TestTestError.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/TestWithTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ThrowExceptionTestCase.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/ThrowNoExceptionTestCase.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/WasRun.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/bar.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/configuration.colors.empty.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/configuration.colors.false.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/configuration.colors.invalid.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/configuration.colors.true.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/configuration.custom-printer.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/configuration.suites.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/configuration.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/configuration_empty.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/configuration_stop_on_warning.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/configuration_xinclude.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/expectedFileFormat.txt create mode 100644 .phpunit/phpunit-5.7/tests/_files/foo.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/phpt-for-coverage.phpt create mode 100644 .phpunit/phpunit-5.7/tests/_files/phpt-xfail.phpt create mode 100644 .phpunit/phpunit-5.7/tests/_files/phpunit-example-extension/phpunit.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/phpunit-example-extension/tests/OneTest.php create mode 100644 .phpunit/phpunit-5.7/tests/_files/phpunit-example-extension/tools/phpunit.d/phpunit-example-extension-1.0.0.phar create mode 100644 .phpunit/phpunit-5.7/tests/_files/structureAttributesAreSameButValuesAreNot.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/structureExpected.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/structureIgnoreTextNodes.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/structureIsSameButDataIsNot.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/structureWrongNumberOfAttributes.xml create mode 100644 .phpunit/phpunit-5.7/tests/_files/structureWrongNumberOfNodes.xml create mode 100644 .phpunit/phpunit-5.7/tests/bootstrap.php diff --git a/.phpunit/.5.7.md5 b/.phpunit/.5.7.md5 new file mode 100644 index 0000000..6d342ea --- /dev/null +++ b/.phpunit/.5.7.md5 @@ -0,0 +1,2 @@ +078c5fb3e25446a8925ae3d63aae4a98 +symfony/yaml \ No newline at end of file diff --git a/.phpunit/5.7.zip b/.phpunit/5.7.zip new file mode 100644 index 0000000000000000000000000000000000000000..bc7c428a5a33046c4901e35b73e89ce5f45a73f9 GIT binary patch literal 423554 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%0A}&OhFp`oeDv)SdizsJVFE2U{ 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

i>uh~jTU5SZ>e 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 z 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 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 `master` 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://cs.sensiolabs.org/download/php-cs-fixer-v2.phar -O 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](https://getcomposer.org/): + +```bash +$ composer install +``` + +The `phpunit` script can be used to invoke the PHPUnit test runner: + +```bash +$ ./phpunit --version +``` + +## Running PHPUnit's own test suite + +After following the steps shown above, PHPUnit's own test suite is run like this: + +```bash +$ ./phpunit +``` + +## 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) + diff --git a/.phpunit/phpunit-5.7/.github/ISSUE_TEMPLATE.md b/.phpunit/phpunit-5.7/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..ad1dc39 --- /dev/null +++ b/.phpunit/phpunit-5.7/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,15 @@ +| Q | A +| --------------------| --------------- +| PHPUnit version | x.y.z +| PHP version | x.y.z +| Installation Method | Composer / PHAR + + + diff --git a/.phpunit/phpunit-5.7/.gitignore b/.phpunit/phpunit-5.7/.gitignore new file mode 100644 index 0000000..bf33323 --- /dev/null +++ b/.phpunit/phpunit-5.7/.gitignore @@ -0,0 +1,20 @@ +/.ant_targets +/.idea +/.php_cs +/.php_cs.cache +/build/documentation +/build/logfiles +/build/phar +/build/phpdox +/build/*.phar +/build/*.phar.asc +/build/binary-phar-autoload.php +/cache.properties +/composer.lock +/tests/TextUI/*.diff +/tests/TextUI/*.exp +/tests/TextUI/*.log +/tests/TextUI/*.out +/tests/TextUI/*.php +/vendor + diff --git a/.phpunit/phpunit-5.7/.php_cs.dist b/.phpunit/phpunit-5.7/.php_cs.dist new file mode 100644 index 0000000..7dbee6e --- /dev/null +++ b/.phpunit/phpunit-5.7/.php_cs.dist @@ -0,0 +1,81 @@ + + +For the full copyright and license information, please view the LICENSE +file that was distributed with this source code. +EOF; + +return PhpCsFixer\Config::create() + ->setRiskyAllowed(true) + ->setRules( + [ + 'array_syntax' => ['syntax' => 'short'], + 'binary_operator_spaces' => [ + 'align_double_arrow' => true, + 'align_equals' => true + ], + 'blank_line_after_namespace' => true, + 'blank_line_before_return' => true, + 'braces' => true, + 'cast_spaces' => true, + 'concat_space' => ['spacing' => 'one'], + 'elseif' => true, + 'encoding' => true, + 'full_opening_tag' => true, + 'function_declaration' => true, + 'header_comment' => ['header' => $header, 'separate' => 'none'], + 'indentation_type' => true, + 'line_ending' => true, + 'lowercase_constants' => true, + 'lowercase_keywords' => true, + 'method_argument_space' => true, + 'no_alias_functions' => true, + 'no_blank_lines_after_class_opening' => true, + 'no_blank_lines_after_phpdoc' => true, + 'no_closing_tag' => true, + 'no_empty_phpdoc' => true, + 'no_empty_statement' => true, + 'no_extra_consecutive_blank_lines' => true, + 'no_leading_namespace_whitespace' => true, + 'no_singleline_whitespace_before_semicolons' => true, + 'no_spaces_after_function_name' => true, + 'no_spaces_inside_parenthesis' => true, + 'no_trailing_comma_in_list_call' => true, + 'no_trailing_whitespace' => true, + 'no_unused_imports' => true, + 'no_whitespace_in_blank_line' => true, + 'phpdoc_align' => true, + 'phpdoc_indent' => true, + 'phpdoc_no_access' => true, + 'phpdoc_no_empty_return' => true, + 'phpdoc_no_package' => true, + 'phpdoc_scalar' => true, + 'phpdoc_separation' => true, + 'phpdoc_to_comment' => true, + 'phpdoc_trim' => true, + 'phpdoc_types' => true, + 'phpdoc_var_without_name' => true, + 'self_accessor' => true, + 'simplified_null_return' => true, + 'single_blank_line_at_eof' => true, + 'single_import_per_statement' => true, + 'single_line_after_imports' => true, + 'single_quote' => true, + 'ternary_operator_spaces' => true, + 'trim_array_spaces' => true, + 'visibility_required' => true, + ] + ) + ->setFinder( + PhpCsFixer\Finder::create() + ->files() + ->in(__DIR__ . '/build') + ->in(__DIR__ . '/src') + ->in(__DIR__ . '/tests/Framework') + ->in(__DIR__ . '/tests/Runner') + ->in(__DIR__ . '/tests/Util') + ->name('*.php') + ); diff --git a/.phpunit/phpunit-5.7/.stickler.yml b/.phpunit/phpunit-5.7/.stickler.yml new file mode 100644 index 0000000..f4afbc0 --- /dev/null +++ b/.phpunit/phpunit-5.7/.stickler.yml @@ -0,0 +1,3 @@ +linters: + phpcs: + standard: 'build/phpcs.xml' diff --git a/.phpunit/phpunit-5.7/.travis.yml b/.phpunit/phpunit-5.7/.travis.yml new file mode 100644 index 0000000..29957e7 --- /dev/null +++ b/.phpunit/phpunit-5.7/.travis.yml @@ -0,0 +1,55 @@ +language: php + +sudo: false + +addons: + apt: + packages: + - libxml2-utils + +php: + - 5.6 + - 7.0 + - 7.1 + - 7.2 + - master + +matrix: + allow_failures: + - php: 7.2 + - php: master + fast_finish: true + +env: + matrix: + - DEPENDENCIES="high" + - DEPENDENCIES="low" + global: + - DEFAULT_COMPOSER_FLAGS="--no-interaction --no-ansi --no-progress --no-suggest" + +before_install: + - composer self-update + - composer clear-cache + +install: + - if [[ "$DEPENDENCIES" = 'high' ]]; then travis_retry composer update $DEFAULT_COMPOSER_FLAGS; fi + - if [[ "$DEPENDENCIES" = 'low' ]]; then travis_retry composer update $DEFAULT_COMPOSER_FLAGS --prefer-lowest; fi + +before_script: + - echo 'zend.assertions=1' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini + - echo 'assert.exception=On' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini + +script: + - ./phpunit --coverage-clover=coverage.xml + - ./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 + - 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 + +after_success: + - bash <(curl -s https://codecov.io/bash) + +notifications: + email: false + diff --git a/.phpunit/phpunit-5.7/ChangeLog-5.7.md b/.phpunit/phpunit-5.7/ChangeLog-5.7.md new file mode 100644 index 0000000..c8c7787 --- /dev/null +++ b/.phpunit/phpunit-5.7/ChangeLog-5.7.md @@ -0,0 +1,242 @@ +# Changes in PHPUnit 5.7 + +All notable changes of the PHPUnit 5.7 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [5.7.27] - 2018-02-01 + +### Fixed + +* Fixed [#2236](https://github.com/sebastianbergmann/phpunit/issues/2236): Exceptions in `tearDown()` do not affect `getStatus()` +* Fixed [#2950](https://github.com/sebastianbergmann/phpunit/issues/2950): Class extending `PHPUnit\Framework\TestSuite` does not extend `PHPUnit\FrameworkTestCase` +* Fixed [#2972](https://github.com/sebastianbergmann/phpunit/issues/2972): PHPUnit crashes when test suite contains both `.phpt` files and unconventionally named tests + +## [5.7.26] - 2017-12-17 + +### Fixed + +* Fixed [#2472](https://github.com/sebastianbergmann/phpunit/issues/2472): `PHPUnit\Util\Getopt` uses deprecated `each()` function +* Fixed [#2833](https://github.com/sebastianbergmann/phpunit/issues/2833): Test class loaded during data provider execution is not discovered +* Fixed [#2922](https://github.com/sebastianbergmann/phpunit/issues/2922): Test class is not discovered when there is a test class with `@group` and provider throwing exception in it, tests are run with `--exclude-group` for that group, there is another class called later (after the class from above), and the name of that another class does not match its filename + +## [5.7.25] - 2017-11-14 + +### Fixed + +* Fixed [#2859](https://github.com/sebastianbergmann/phpunit/issues/2859): Regression caused by fix for [#2833](https://github.com/sebastianbergmann/phpunit/issues/2833) + +## [5.7.24] - 2017-11-14 + +### Fixed + +* Fixed [#2833](https://github.com/sebastianbergmann/phpunit/issues/2833): Test class loaded during data provider execution is not discovered + +## [5.7.23] - 2017-10-15 + +### Fixed + +* Fixed [#2731](https://github.com/sebastianbergmann/phpunit/issues/2731): Empty exception message cannot be expected + +## [5.7.22] - 2017-09-24 + +### Fixed + +* Fixed [#2769](https://github.com/sebastianbergmann/phpunit/issues/2769): Usage of `setUseErrorHandler()` produces `Undefined variable` error + +## [5.7.21] - 2017-06-21 + +### Added + +* Added `PHPUnit\Framework\AssertionFailedError`, `PHPUnit\Framework\Test`, and `PHPUnit\Framework\TestSuite` to the forward compatibility layer for PHPUnit 6 + +### Fixed + +* Fixed [#2705](https://github.com/sebastianbergmann/phpunit/issues/2705): `stderr` parameter in `phpunit.xml` always considered `true` + +## [5.7.20] - 2017-05-22 + +### Fixed + +* Fixed [#2563](https://github.com/sebastianbergmann/phpunit/pull/2563): `phpunit --version` does not display version when running unsupported PHP + +## [5.7.19] - 2017-04-03 + +### Fixed + +* Fixed [#2638](https://github.com/sebastianbergmann/phpunit/pull/2638): Regression in `PHPUnit\Framework\TestCase:registerMockObjectsFromTestArguments()` + +## [5.7.18] - 2017-04-02 + +### Fixed + +* Fixed [#2145](https://github.com/sebastianbergmann/phpunit/issues/2145): `--stop-on-failure` fails to stop on PHP 7 +* Fixed [#2572](https://github.com/sebastianbergmann/phpunit/issues/2572): `PHPUnit\Framework\TestCase:registerMockObjectsFromTestArguments()` does not correctly handle arrays that reference themselves + +## [5.7.17] - 2017-03-19 + +### Fixed + +* Fixed [#2016](https://github.com/sebastianbergmann/phpunit/issues/2016): `prophesize()` does not work when static attributes are backed up +* Fixed [#2568](https://github.com/sebastianbergmann/phpunit/issues/2568): `ArraySubsetConstraint` uses invalid cast to array +* Fixed [#2573](https://github.com/sebastianbergmann/phpunit/issues/2573): `getMockFromWsdl()` does not handle URLs with query parameters +* `PHPUnit\Util\Test::getDataFromTestWithAnnotation()` raises notice when docblock contains Windows line endings + +## [5.7.16] - 2017-03-15 + +### Fixed + +* Fixed [#2547](https://github.com/sebastianbergmann/phpunit/issues/2547): Code Coverage data is collected for test annotated with `@coversNothing` +* Fixed [#2558](https://github.com/sebastianbergmann/phpunit/issues/2558): `countOf()` function is missing + +## [5.7.15] - 2017-03-02 + +### Fixed + +* Fixed [#1999](https://github.com/sebastianbergmann/phpunit/issues/1999): Handler is inherited from previous custom option with handler +* Fixed [#2149](https://github.com/sebastianbergmann/phpunit/issues/2149): `assertCount()` does not handle generators properly +* Fixed [#2478](https://github.com/sebastianbergmann/phpunit/issues/2478): Tests that take too long are not reported as risky test + +## [5.7.14] - 2017-02-19 + +### Fixed + +* Fixed [#2489](https://github.com/sebastianbergmann/phpunit/issues/2489): `processUncoveredFilesFromWhitelist` is not handled correctly +* Fixed default values for `addUncoveredFilesFromWhitelist` and `processUncoveredFilesFromWhitelist` in `phpunit.xsd` + +## [5.7.13] - 2017-02-10 + +### Fixed + +* Fixed [#2493](https://github.com/sebastianbergmann/phpunit/issues/2493): Fix for [#2475](https://github.com/sebastianbergmann/phpunit/pull/2475) does not apply to PHPUnit 5.7 + +## [5.7.12] - 2017-02-08 + +### Fixed + +* Fixed [#2475](https://github.com/sebastianbergmann/phpunit/pull/2475): Defining a test suite with only one file does not work + +## [5.7.11] - 2017-02-05 + +### Fixed + +* Deprecation errors when used with PHP 7.2 + +## [5.7.10] - 2017-02-04 + +### Fixed + +* Fixed [#2462](https://github.com/sebastianbergmann/phpunit/issues/2462): Code Coverage whitelist is filled even if no code coverage data is to be collected + +## [5.7.9] - 2017-01-28 + +### Fixed + +* Fixed [#2447](https://github.com/sebastianbergmann/phpunit/issues/2447): Reverted backwards incompatible change to handling of boolean environment variable values specified in XML + +## [5.7.8] - 2017-01-26 + +### Fixed + +* Fixed [#2446](https://github.com/sebastianbergmann/phpunit/issues/2446): Reverted backwards incompatible change to exit code in case of warnings + +## [5.7.7] - 2017-01-25 + +### Fixed + +* Fixed [#1896](https://github.com/sebastianbergmann/phpunit/issues/1896): Wrong test location when `@depends` and `@dataProvider` are combined +* Fixed [#1983](https://github.com/sebastianbergmann/phpunit/pull/1983): Tests with `@expectedException` annotation cannot be skipped +* Fixed [#2137](https://github.com/sebastianbergmann/phpunit/issues/2137): Warnings for invalid data providers are suppressed when test execution is filtered +* Fixed [#2275](https://github.com/sebastianbergmann/phpunit/pull/2275): Invalid UTF-8 characters can lead to missing output +* Fixed [#2299](https://github.com/sebastianbergmann/phpunit/issues/2299): `expectExceptionMessage()` and `expectExceptionCode()` do not work without `expectException()` +* Fixed [#2328](https://github.com/sebastianbergmann/phpunit/issues/2328): `TestListener` callbacks `startTest()` and `endTest()` are not called when test is skipped due to `@depends` +* Fixed [#2331](https://github.com/sebastianbergmann/phpunit/issues/2331): Boolean environment variable values specified in XML get mangled +* Fixed [#2333](https://github.com/sebastianbergmann/phpunit/issues/2333): `assertContains()` and `assertNotContains()` do not handle UTF-8 strings correctly +* Fixed [#2340](https://github.com/sebastianbergmann/phpunit/pull/2340): Data providers that use `yield` or implement `Iterator` cannot be combined +* Fixed [#2349](https://github.com/sebastianbergmann/phpunit/pull/2349): `PHPUnit_TextUI_Command` does not `exit()` when it should +* Fixed [#2392](https://github.com/sebastianbergmann/phpunit/issues/2392): Empty (but valid) data provider should skip the test +* Fixed [#2431](https://github.com/sebastianbergmann/phpunit/issues/2431): `assertArraySubset()` does not support `ArrayAccess` +* Fixed [#2435](https://github.com/sebastianbergmann/phpunit/issues/2435): Empty `@group` annotation causes error on PHP 7.2+ + +## [5.7.6] - 2017-01-22 + +### Fixed + +* Fixed [#2424](https://github.com/sebastianbergmann/phpunit/issues/2424): `TestCase::getStatus()` returns `STATUS_PASSED` instead of `STATUS_RISKY` for risky test +* Fixed [#2427](https://github.com/sebastianbergmann/phpunit/issues/2427): TestDox group configuration is not handled +* Fixed [#2428](https://github.com/sebastianbergmann/phpunit/pull/2428): Nested arrays specificied in XML configuration file are not handled correctly + +## [5.7.5] - 2016-12-28 + +### Fixed + +* Fixed [#2404](https://github.com/sebastianbergmann/phpunit/pull/2404): `assertDirectoryNotIsWriteable()` calls itself + +## [5.7.4] - 2016-12-13 + +### Fixed + +* Fixed [#2394](https://github.com/sebastianbergmann/phpunit/issues/2394): Do not treat `AssertionError` as assertion failure on PHP 5 + +## [5.7.3] - 2016-12-09 + +### Fixed + +* Fixed [#2384](https://github.com/sebastianbergmann/phpunit/pull/2384): Handle `PHPUnit_Framework_Exception` correctly when expecting exceptions + +## [5.7.2] - 2016-12-03 + +### Fixed + +* Fixed [#2382](https://github.com/sebastianbergmann/phpunit/issues/2382): Uncloneable test doubles passed via data provider do not work + +## [5.7.1] - 2016-12-02 + +### Fixed + +* Fixed [#2380](https://github.com/sebastianbergmann/phpunit/issues/2380): Data Providers cannot be generators anymore + +## [5.7.0] - 2016-12-02 + +### Added + +* Merged [#2223](https://github.com/sebastianbergmann/phpunit/pull/2223): Add support for multiple data providers +* Added `extensionsDirectory` configuration directive to configure a directory from which all `.phar` files are loaded as PHPUnit extensions +* Added `--no-extensions` commandline option to suppress loading of extensions (from configured extension directory) +* Added `PHPUnit\Framework\Assert` as an alias for `PHPUnit_Framework_Assert` for forward compatibility +* Added `PHPUnit\Framework\BaseTestListener` as an alias for `PHPUnit_Framework_BaseTestListener` for forward compatibility +* Added `PHPUnit\Framework\TestListener` as an alias for `PHPUnit_Framework_TestListener` for forward compatibility + +### Changed + +* The `--log-json` commandline option has been deprecated +* The `--tap` and `--log-tap` commandline options have been deprecated +* The `--self-update` and `--self-upgrade` commandline options have been deprecated (PHAR binary only) + +[5.7.27]: https://github.com/sebastianbergmann/phpunit/compare/5.7.26...5.7.27 +[5.7.26]: https://github.com/sebastianbergmann/phpunit/compare/5.7.25...5.7.26 +[5.7.25]: https://github.com/sebastianbergmann/phpunit/compare/5.7.24...5.7.25 +[5.7.24]: https://github.com/sebastianbergmann/phpunit/compare/5.7.23...5.7.24 +[5.7.23]: https://github.com/sebastianbergmann/phpunit/compare/5.7.22...5.7.23 +[5.7.22]: https://github.com/sebastianbergmann/phpunit/compare/5.7.21...5.7.22 +[5.7.21]: https://github.com/sebastianbergmann/phpunit/compare/5.7.20...5.7.21 +[5.7.20]: https://github.com/sebastianbergmann/phpunit/compare/5.7.19...5.7.20 +[5.7.19]: https://github.com/sebastianbergmann/phpunit/compare/5.7.18...5.7.19 +[5.7.18]: https://github.com/sebastianbergmann/phpunit/compare/5.7.17...5.7.18 +[5.7.17]: https://github.com/sebastianbergmann/phpunit/compare/5.7.16...5.7.17 +[5.7.16]: https://github.com/sebastianbergmann/phpunit/compare/5.7.15...5.7.16 +[5.7.15]: https://github.com/sebastianbergmann/phpunit/compare/5.7.14...5.7.15 +[5.7.14]: https://github.com/sebastianbergmann/phpunit/compare/5.7.13...5.7.14 +[5.7.13]: https://github.com/sebastianbergmann/phpunit/compare/5.7.12...5.7.13 +[5.7.12]: https://github.com/sebastianbergmann/phpunit/compare/5.7.11...5.7.12 +[5.7.11]: https://github.com/sebastianbergmann/phpunit/compare/5.7.10...5.7.11 +[5.7.10]: https://github.com/sebastianbergmann/phpunit/compare/5.7.9...5.7.10 +[5.7.9]: https://github.com/sebastianbergmann/phpunit/compare/5.7.8...5.7.9 +[5.7.8]: https://github.com/sebastianbergmann/phpunit/compare/5.7.7...5.7.8 +[5.7.7]: https://github.com/sebastianbergmann/phpunit/compare/5.7.6...5.7.7 +[5.7.6]: https://github.com/sebastianbergmann/phpunit/compare/5.7.5...5.7.6 +[5.7.5]: https://github.com/sebastianbergmann/phpunit/compare/5.7.4...5.7.5 +[5.7.4]: https://github.com/sebastianbergmann/phpunit/compare/5.7.3...5.7.4 +[5.7.3]: https://github.com/sebastianbergmann/phpunit/compare/5.7.2...5.7.3 +[5.7.2]: https://github.com/sebastianbergmann/phpunit/compare/5.7.1...5.7.2 +[5.7.1]: https://github.com/sebastianbergmann/phpunit/compare/5.7.0...5.7.1 +[5.7.0]: https://github.com/sebastianbergmann/phpunit/compare/5.6...5.7.0 + diff --git a/.phpunit/phpunit-5.7/LICENSE b/.phpunit/phpunit-5.7/LICENSE new file mode 100644 index 0000000..faba266 --- /dev/null +++ b/.phpunit/phpunit-5.7/LICENSE @@ -0,0 +1,33 @@ +PHPUnit + +Copyright (c) 2001-2018, 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. diff --git a/.phpunit/phpunit-5.7/README.md b/.phpunit/phpunit-5.7/README.md new file mode 100644 index 0000000..e886b55 --- /dev/null +++ b/.phpunit/phpunit-5.7/README.md @@ -0,0 +1,46 @@ +# 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.7.svg?style=flat-square)](https://phpunit.de/build-status.html) + +## 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/.github/CONTRIBUTING.md) for information on how to contribute to PHPUnit and its related projects. + +## List of Contributors + +Thanks to everyone who has contributed to PHPUnit! You can find a detailed list of contributors on every PHPUnit related package on GitHub. This list shows only the major components: + +* [PHPUnit](https://github.com/sebastianbergmann/phpunit/graphs/contributors) +* [PHP_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) + diff --git a/.phpunit/phpunit-5.7/build.xml b/.phpunit/phpunit-5.7/build.xml new file mode 100644 index 0000000..224904b --- /dev/null +++ b/.phpunit/phpunit-5.7/build.xml @@ -0,0 +1,418 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.phpunit/phpunit-5.7/composer.json b/.phpunit/phpunit-5.7/composer.json new file mode 100644 index 0000000..0141794 --- /dev/null +++ b/.phpunit/phpunit-5.7/composer.json @@ -0,0 +1,92 @@ +{ + "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" + }, + "prefer-stable": true, + "require": { + "php": "^5.6 || ^7.0", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "myclabs/deep-copy": "~1.3", + "phpspec/prophecy": "^1.6.2", + "phpunit/php-code-coverage": "^4.0.4", + "phpunit/php-file-iterator": "~1.4", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": "^1.0.6", + "phpunit/phpunit-mock-objects": "^3.2", + "sebastian/comparator": "^1.2.4", + "sebastian/diff": "^1.4.3", + "sebastian/environment": "^1.3.4 || ^2.0", + "sebastian/exporter": "~2.0", + "sebastian/global-state": "^1.1", + "sebastian/object-enumerator": "~2.0", + "sebastian/resource-operations": "~1.0", + "sebastian/version": "^1.0.6|^2.0.1", + "symfony/phpunit-bridge": "*@dev" + }, + "require-dev": { + "ext-PDO": "*" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "3.0.2" + }, + "config": { + "platform": { + "php": "5.6.0" + }, + "optimize-autoloader": true, + "sort-packages": true + }, + "suggest": { + "phpunit/php-invoker": "~1.1", + "ext-xdebug": "*" + }, + "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.7.x-dev" + } + }, + "repositories": { + "phpunit-bridge": { + "type": "path", + "url": "/home/maximilian/OpenSource/Cmf/sonata-admin/vendor/symfony/phpunit-bridge" + } + } +} diff --git a/.phpunit/phpunit-5.7/phpunit b/.phpunit/phpunit-5.7/phpunit new file mode 100644 index 0000000..34f3773 --- /dev/null +++ b/.phpunit/phpunit-5.7/phpunit @@ -0,0 +1,17 @@ + + + + + tests/Framework + tests/Extensions + tests/Runner + tests/Util + + + + tests/TextUI + tests/Regression + + + + + + src + + src/Framework/Assert/Functions.php + src/Util/PHP/eval-stdin.php + + + + + + + + diff --git a/.phpunit/phpunit-5.7/phpunit.xsd b/.phpunit/phpunit-5.7/phpunit.xsd new file mode 100644 index 0000000..4660b0d --- /dev/null +++ b/.phpunit/phpunit-5.7/phpunit.xsd @@ -0,0 +1,254 @@ + + + + + This Schema file defines the rules by which the XML configuration file of PHPUnit 5.7 may be structured. + + + + + + Root Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The main type specifying the document structure + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.phpunit/phpunit-5.7/src/Exception.php b/.phpunit/phpunit-5.7/src/Exception.php new file mode 100644 index 0000000..b9c30dc --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Exception.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Marker interface for PHPUnit exceptions. + */ +interface PHPUnit_Exception +{ +} diff --git a/.phpunit/phpunit-5.7/src/Extensions/GroupTestSuite.php b/.phpunit/phpunit-5.7/src/Extensions/GroupTestSuite.php new file mode 100644 index 0000000..2708b5a --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Extensions/GroupTestSuite.php @@ -0,0 +1,58 @@ + + * + * 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')); + * + */ +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); + } + } + } + } + } + } +} diff --git a/.phpunit/phpunit-5.7/src/Extensions/PhptTestCase.php b/.phpunit/phpunit-5.7/src/Extensions/PhptTestCase.php new file mode 100644 index 0000000..4d143e2 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Extensions/PhptTestCase.php @@ -0,0 +1,430 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Runner for PHPT test cases. + */ +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', + '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; + $xfail = false; + $time = 0; + $settings = $this->settings; + + $result->startTest($this); + + if (isset($sections['INI'])) { + $settings = array_merge($settings, $this->parseIniSection($sections['INI'])); + } + + if (isset($sections['ENV'])) { + $env = $this->parseEnvSection($sections['ENV']); + $this->phpUtil->setEnv($env); + } + + // Redirects STDERR to STDOUT + $this->phpUtil->setUseStderrRedirection(true); + + if ($result->enforcesTimeLimit()) { + $this->phpUtil->setTimeout($result->getTimeoutForLargeTests()); + } + + 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 (isset($sections['XFAIL'])) { + $xfail = trim($sections['XFAIL']); + } + + if (!$skip) { + if (isset($sections['STDIN'])) { + $this->phpUtil->setStdin($sections['STDIN']); + } + + if (isset($sections['ARGS'])) { + $this->phpUtil->setArgs($sections['ARGS']); + } + + PHP_Timer::start(); + + $jobResult = $this->phpUtil->runJob($code, $settings); + $time = PHP_Timer::stop(); + + try { + $this->assertPhptExpectation($sections, $jobResult['stdout']); + } catch (PHPUnit_Framework_AssertionFailedError $e) { + if ($xfail !== false) { + $result->addFailure( + $this, + new PHPUnit_Framework_IncompleteTestError( + $xfail, + 0, + $e + ), + $time + ); + } else { + $result->addFailure($this, $e, $time); + } + } catch (Throwable $t) { + $result->addError($this, $t, $time); + } catch (Exception $e) { + $result->addError($this, $e, $time); + } + + if ($result->allCompletelyImplemented() && $xfail !== false) { + $result->addFailure( + $this, + new PHPUnit_Framework_IncompleteTestError( + 'XFAIL section but test passes' + ), + $time + ); + } + + $this->phpUtil->setStdin(''); + $this->phpUtil->setArgs(''); + + 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 = ''; + + $allowExternalSections = [ + 'FILE', + 'EXPECT', + 'EXPECTF', + 'EXPECTREGEX' + ]; + + $requiredSections = [ + 'FILE', + [ + 'EXPECT', + 'EXPECTF', + 'EXPECTREGEX' + ] + ]; + + $unsupportedSections = [ + 'REDIRECTTEST', + 'REQUEST', + 'POST', + 'PUT', + 'POST_RAW', + 'GZIP_POST', + 'DEFLATE_POST', + 'GET', + 'COOKIE', + 'HEADERS', + 'CGI', + 'EXPECTHEADERS', + 'EXTENSIONS', + 'PHPDBG' + ]; + + 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['FILEEOF'])) { + $sections['FILE'] = rtrim($sections['FILEEOF'], "\r\n"); + unset($sections['FILEEOF']); + } + + $testDirectory = dirname($this->filename) . DIRECTORY_SEPARATOR; + + foreach ($allowExternalSections as $section) { + if (isset($sections[$section . '_EXTERNAL'])) { + // do not allow directory traversal + $externalFilename = str_replace('..', '', trim($sections[$section . '_EXTERNAL'])); + + // only allow files from the test directory + if (!is_file($testDirectory . $externalFilename) || !is_readable($testDirectory . $externalFilename)) { + throw new PHPUnit_Framework_Exception( + sprintf( + 'Could not load --%s-- %s for PHPT file', + $section . '_EXTERNAL', + $testDirectory . $externalFilename + ) + ); + } + + $sections[$section] = file_get_contents($testDirectory . $externalFilename); + + unset($sections[$section . '_EXTERNAL']); + } + } + + $isValid = true; + + foreach ($requiredSections as $section) { + if (is_array($section)) { + $foundSection = false; + + foreach ($section as $anySection) { + if (isset($sections[$anySection])) { + $foundSection = true; + + break; + } + } + + if (!$foundSection) { + $isValid = false; + + break; + } + } else { + if (!isset($sections[$section])) { + $isValid = false; + + break; + } + } + } + + if (!$isValid) { + throw new PHPUnit_Framework_Exception('Invalid PHPT file'); + } + + foreach ($unsupportedSections as $section) { + if (isset($sections[$section])) { + throw new PHPUnit_Framework_Exception( + 'PHPUnit does not support this 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); + } + + protected function parseEnvSection($content) + { + $env = []; + + foreach (explode("\n", trim($content)) as $e) { + $e = explode('=', trim($e), 2); + + if (!empty($e[0]) && isset($e[1])) { + $env[$e[0]] = $e[1]; + } + } + + return $env; + } +} diff --git a/.phpunit/phpunit-5.7/src/Extensions/PhptTestSuite.php b/.phpunit/phpunit-5.7/src/Extensions/PhptTestSuite.php new file mode 100644 index 0000000..3f37be8 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Extensions/PhptTestSuite.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Suite for .phpt test cases. + */ +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'); + } + } +} diff --git a/.phpunit/phpunit-5.7/src/Extensions/RepeatedTest.php b/.phpunit/phpunit-5.7/src/Extensions/RepeatedTest.php new file mode 100644 index 0000000..fb972a7 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Extensions/RepeatedTest.php @@ -0,0 +1,88 @@ + + * + * 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. + */ +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_int($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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Extensions/TestDecorator.php b/.phpunit/phpunit-5.7/src/Extensions/TestDecorator.php new file mode 100644 index 0000000..fd0a658 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Extensions/TestDecorator.php @@ -0,0 +1,107 @@ + + * + * 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. + */ +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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Extensions/TicketListener.php b/.phpunit/phpunit-5.7/src/Extensions/TicketListener.php new file mode 100644 index 0000000..32ccc15 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Extensions/TicketListener.php @@ -0,0 +1,194 @@ + + * + * 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. + */ +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 + */ + public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $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) + { + } + + /** + * A test suite started. + * + * @param PHPUnit_Framework_TestSuite $suite + */ + public function startTestSuite(PHPUnit_Framework_TestSuite $suite) + { + } + + /** + * A test suite ended. + * + * @param PHPUnit_Framework_TestSuite $suite + */ + 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); +} diff --git a/.phpunit/phpunit-5.7/src/ForwardCompatibility/Assert.php b/.phpunit/phpunit-5.7/src/ForwardCompatibility/Assert.php new file mode 100644 index 0000000..cf3186a --- /dev/null +++ b/.phpunit/phpunit-5.7/src/ForwardCompatibility/Assert.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace PHPUnit\Framework; + +use PHPUnit_Framework_Assert; + +abstract class Assert extends PHPUnit_Framework_Assert +{ +} diff --git a/.phpunit/phpunit-5.7/src/ForwardCompatibility/AssertionFailedError.php b/.phpunit/phpunit-5.7/src/ForwardCompatibility/AssertionFailedError.php new file mode 100644 index 0000000..d0cbe72 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/ForwardCompatibility/AssertionFailedError.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace PHPUnit\Framework; + +use PHPUnit_Framework_AssertionFailedError; + +class AssertionFailedError extends PHPUnit_Framework_AssertionFailedError +{ +} diff --git a/.phpunit/phpunit-5.7/src/ForwardCompatibility/BaseTestListener.php b/.phpunit/phpunit-5.7/src/ForwardCompatibility/BaseTestListener.php new file mode 100644 index 0000000..3eef490 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/ForwardCompatibility/BaseTestListener.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace PHPUnit\Framework; + +use PHPUnit_Framework_BaseTestListener; + +abstract class BaseTestListener extends PHPUnit_Framework_BaseTestListener +{ +} diff --git a/.phpunit/phpunit-5.7/src/ForwardCompatibility/Test.php b/.phpunit/phpunit-5.7/src/ForwardCompatibility/Test.php new file mode 100644 index 0000000..ce98526 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/ForwardCompatibility/Test.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace PHPUnit\Framework; + +use PHPUnit_Framework_Test; + +interface Test extends PHPUnit_Framework_Test +{ +} diff --git a/.phpunit/phpunit-5.7/src/ForwardCompatibility/TestCase.php b/.phpunit/phpunit-5.7/src/ForwardCompatibility/TestCase.php new file mode 100644 index 0000000..03189e3 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/ForwardCompatibility/TestCase.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace PHPUnit\Framework; + +use PHPUnit_Framework_TestCase; + +abstract class TestCase extends PHPUnit_Framework_TestCase +{ +} diff --git a/.phpunit/phpunit-5.7/src/ForwardCompatibility/TestListener.php b/.phpunit/phpunit-5.7/src/ForwardCompatibility/TestListener.php new file mode 100644 index 0000000..8440b14 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/ForwardCompatibility/TestListener.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace PHPUnit\Framework; + +use PHPUnit_Framework_TestListener; + +interface TestListener extends PHPUnit_Framework_TestListener +{ +} diff --git a/.phpunit/phpunit-5.7/src/ForwardCompatibility/TestSuite.php b/.phpunit/phpunit-5.7/src/ForwardCompatibility/TestSuite.php new file mode 100644 index 0000000..535bbbe --- /dev/null +++ b/.phpunit/phpunit-5.7/src/ForwardCompatibility/TestSuite.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace PHPUnit\Framework; + +use PHPUnit_Framework_TestSuite; + +class TestSuite extends PHPUnit_Framework_TestSuite +{ +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Assert.php b/.phpunit/phpunit-5.7/src/Framework/Assert.php new file mode 100644 index 0000000..de009d1 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Assert.php @@ -0,0 +1,2952 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * A set of assertion methods. + */ +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 + */ + public static function assertArrayHasKey($key, $array, $message = '') + { + if (!(is_int($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); + + static::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 + */ + public static function assertArraySubset($subset, $array, $strict = false, $message = '') + { + if (!(is_array($subset) || $subset instanceof ArrayAccess)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory( + 1, + 'array or ArrayAccess' + ); + } + + if (!(is_array($array) || $array instanceof ArrayAccess)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory( + 2, + 'array or ArrayAccess' + ); + } + + $constraint = new PHPUnit_Framework_Constraint_ArraySubset($subset, $strict); + + static::assertThat($array, $constraint, $message); + } + + /** + * Asserts that an array does not have a specified key. + * + * @param mixed $key + * @param array|ArrayAccess $array + * @param string $message + */ + public static function assertArrayNotHasKey($key, $array, $message = '') + { + if (!(is_int($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) + ); + + static::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 + */ + 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' + ); + } + + static::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 string|object $haystackClassOrObject + * @param string $message + * @param bool $ignoreCase + * @param bool $checkForObjectIdentity + * @param bool $checkForNonObjectIdentity + */ + public static function assertAttributeContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) + { + static::assertContains( + $needle, + static::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 + */ + 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' + ); + } + + static::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 string|object $haystackClassOrObject + * @param string $message + * @param bool $ignoreCase + * @param bool $checkForObjectIdentity + * @param bool $checkForNonObjectIdentity + */ + public static function assertAttributeNotContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) + { + static::assertNotContains( + $needle, + static::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 + */ + 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); + } + + static::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' + ); + } + + static::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 string|object $haystackClassOrObject + * @param bool $isNativeType + * @param string $message + */ + public static function assertAttributeContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '') + { + static::assertContainsOnly( + $type, + static::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 + */ + 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); + } + + static::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 string|object $haystackClassOrObject + * @param bool $isNativeType + * @param string $message + */ + public static function assertAttributeNotContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '') + { + static::assertNotContainsOnly( + $type, + static::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'); + } + + static::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 string|object $haystackClassOrObject + * @param string $message + */ + public static function assertAttributeCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '') + { + static::assertCount( + $expectedCount, + static::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) + ); + + static::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 string|object $haystackClassOrObject + * @param string $message + */ + public static function assertAttributeNotCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '') + { + static::assertNotCount( + $expectedCount, + static::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 + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that a variable is equal to an attribute of an object. + * + * @param mixed $expected + * @param string $actualAttributeName + * @param string|object $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) + { + static::assertEquals( + $expected, + static::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 + */ + 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 + ) + ); + + static::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|object $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) + { + static::assertNotEquals( + $expected, + static::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 = '') + { + static::assertThat($actual, static::isEmpty(), $message); + } + + /** + * Asserts that a static attribute of a class or an attribute of an object + * is empty. + * + * @param string $haystackAttributeName + * @param string|object $haystackClassOrObject + * @param string $message + */ + public static function assertAttributeEmpty($haystackAttributeName, $haystackClassOrObject, $message = '') + { + static::assertEmpty( + static::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 = '') + { + static::assertThat($actual, static::logicalNot(static::isEmpty()), $message); + } + + /** + * Asserts that a static attribute of a class or an attribute of an object + * is not empty. + * + * @param string $haystackAttributeName + * @param string|object $haystackClassOrObject + * @param string $message + */ + public static function assertAttributeNotEmpty($haystackAttributeName, $haystackClassOrObject, $message = '') + { + static::assertNotEmpty( + static::readAttribute($haystackClassOrObject, $haystackAttributeName), + $message + ); + } + + /** + * Asserts that a value is greater than another value. + * + * @param mixed $expected + * @param mixed $actual + * @param string $message + */ + public static function assertGreaterThan($expected, $actual, $message = '') + { + static::assertThat($actual, static::greaterThan($expected), $message); + } + + /** + * Asserts that an attribute is greater than another value. + * + * @param mixed $expected + * @param string $actualAttributeName + * @param string|object $actualClassOrObject + * @param string $message + */ + public static function assertAttributeGreaterThan($expected, $actualAttributeName, $actualClassOrObject, $message = '') + { + static::assertGreaterThan( + $expected, + static::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 + */ + public static function assertGreaterThanOrEqual($expected, $actual, $message = '') + { + static::assertThat( + $actual, + static::greaterThanOrEqual($expected), + $message + ); + } + + /** + * Asserts that an attribute is greater than or equal to another value. + * + * @param mixed $expected + * @param string $actualAttributeName + * @param string|object $actualClassOrObject + * @param string $message + */ + public static function assertAttributeGreaterThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '') + { + static::assertGreaterThanOrEqual( + $expected, + static::readAttribute($actualClassOrObject, $actualAttributeName), + $message + ); + } + + /** + * Asserts that a value is smaller than another value. + * + * @param mixed $expected + * @param mixed $actual + * @param string $message + */ + public static function assertLessThan($expected, $actual, $message = '') + { + static::assertThat($actual, static::lessThan($expected), $message); + } + + /** + * Asserts that an attribute is smaller than another value. + * + * @param mixed $expected + * @param string $actualAttributeName + * @param string|object $actualClassOrObject + * @param string $message + */ + public static function assertAttributeLessThan($expected, $actualAttributeName, $actualClassOrObject, $message = '') + { + static::assertLessThan( + $expected, + static::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 + */ + public static function assertLessThanOrEqual($expected, $actual, $message = '') + { + static::assertThat($actual, static::lessThanOrEqual($expected), $message); + } + + /** + * Asserts that an attribute is smaller than or equal to another value. + * + * @param mixed $expected + * @param string $actualAttributeName + * @param string|object $actualClassOrObject + * @param string $message + */ + public static function assertAttributeLessThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '') + { + static::assertLessThanOrEqual( + $expected, + static::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 + */ + public static function assertFileEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false) + { + static::assertFileExists($expected, $message); + static::assertFileExists($actual, $message); + + static::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 + */ + public static function assertFileNotEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false) + { + static::assertFileExists($expected, $message); + static::assertFileExists($actual, $message); + + static::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 + */ + public static function assertStringEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false) + { + static::assertFileExists($expectedFile, $message); + + static::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 + */ + public static function assertStringNotEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false) + { + static::assertFileExists($expectedFile, $message); + + static::assertNotEquals( + file_get_contents($expectedFile), + $actualString, + $message, + 0, + 10, + $canonicalize, + $ignoreCase + ); + } + + /** + * Asserts that a file/dir is readable. + * + * @param string $filename + * @param string $message + */ + public static function assertIsReadable($filename, $message = '') + { + if (!is_string($filename)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); + } + + $constraint = new PHPUnit_Framework_Constraint_IsReadable; + + static::assertThat($filename, $constraint, $message); + } + + /** + * Asserts that a file/dir exists and is not readable. + * + * @param string $filename + * @param string $message + */ + public static function assertNotIsReadable($filename, $message = '') + { + if (!is_string($filename)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); + } + + $constraint = new PHPUnit_Framework_Constraint_Not( + new PHPUnit_Framework_Constraint_IsReadable + ); + + static::assertThat($filename, $constraint, $message); + } + + /** + * Asserts that a file/dir exists and is writable. + * + * @param string $filename + * @param string $message + */ + public static function assertIsWritable($filename, $message = '') + { + if (!is_string($filename)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); + } + + $constraint = new PHPUnit_Framework_Constraint_IsWritable; + + static::assertThat($filename, $constraint, $message); + } + + /** + * Asserts that a file/dir exists and is not writable. + * + * @param string $filename + * @param string $message + */ + public static function assertNotIsWritable($filename, $message = '') + { + if (!is_string($filename)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); + } + + $constraint = new PHPUnit_Framework_Constraint_Not( + new PHPUnit_Framework_Constraint_IsWritable + ); + + static::assertThat($filename, $constraint, $message); + } + + /** + * Asserts that a directory exists. + * + * @param string $directory + * @param string $message + */ + public static function assertDirectoryExists($directory, $message = '') + { + if (!is_string($directory)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); + } + + $constraint = new PHPUnit_Framework_Constraint_DirectoryExists; + + static::assertThat($directory, $constraint, $message); + } + + /** + * Asserts that a directory does not exist. + * + * @param string $directory + * @param string $message + */ + public static function assertDirectoryNotExists($directory, $message = '') + { + if (!is_string($directory)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); + } + + $constraint = new PHPUnit_Framework_Constraint_Not( + new PHPUnit_Framework_Constraint_DirectoryExists + ); + + static::assertThat($directory, $constraint, $message); + } + + /** + * Asserts that a directory exists and is readable. + * + * @param string $directory + * @param string $message + */ + public static function assertDirectoryIsReadable($directory, $message = '') + { + self::assertDirectoryExists($directory, $message); + self::assertIsReadable($directory, $message); + } + + /** + * Asserts that a directory exists and is not readable. + * + * @param string $directory + * @param string $message + */ + public static function assertDirectoryNotIsReadable($directory, $message = '') + { + self::assertDirectoryExists($directory, $message); + self::assertNotIsReadable($directory, $message); + } + + /** + * Asserts that a directory exists and is writable. + * + * @param string $directory + * @param string $message + */ + public static function assertDirectoryIsWritable($directory, $message = '') + { + self::assertDirectoryExists($directory, $message); + self::assertIsWritable($directory, $message); + } + + /** + * Asserts that a directory exists and is not writable. + * + * @param string $directory + * @param string $message + */ + public static function assertDirectoryNotIsWritable($directory, $message = '') + { + self::assertDirectoryExists($directory, $message); + self::assertNotIsWritable($directory, $message); + } + + /** + * Asserts that a file exists. + * + * @param string $filename + * @param string $message + */ + public static function assertFileExists($filename, $message = '') + { + if (!is_string($filename)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); + } + + $constraint = new PHPUnit_Framework_Constraint_FileExists; + + static::assertThat($filename, $constraint, $message); + } + + /** + * Asserts that a file does not exist. + * + * @param string $filename + * @param string $message + */ + 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 + ); + + static::assertThat($filename, $constraint, $message); + } + + /** + * Asserts that a file exists and is readable. + * + * @param string $file + * @param string $message + */ + public static function assertFileIsReadable($file, $message = '') + { + self::assertFileExists($file, $message); + self::assertIsReadable($file, $message); + } + + /** + * Asserts that a file exists and is not readable. + * + * @param string $file + * @param string $message + */ + public static function assertFileNotIsReadable($file, $message = '') + { + self::assertFileExists($file, $message); + self::assertNotIsReadable($file, $message); + } + + /** + * Asserts that a file exists and is writable. + * + * @param string $file + * @param string $message + */ + public static function assertFileIsWritable($file, $message = '') + { + self::assertFileExists($file, $message); + self::assertIsWritable($file, $message); + } + + /** + * Asserts that a file exists and is not writable. + * + * @param string $file + * @param string $message + */ + public static function assertFileNotIsWritable($file, $message = '') + { + self::assertFileExists($file, $message); + self::assertNotIsWritable($file, $message); + } + + /** + * Asserts that a condition is true. + * + * @param bool $condition + * @param string $message + * + * @throws PHPUnit_Framework_AssertionFailedError + */ + public static function assertTrue($condition, $message = '') + { + static::assertThat($condition, static::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 = '') + { + static::assertThat($condition, static::logicalNot(static::isTrue()), $message); + } + + /** + * Asserts that a condition is false. + * + * @param bool $condition + * @param string $message + * + * @throws PHPUnit_Framework_AssertionFailedError + */ + public static function assertFalse($condition, $message = '') + { + static::assertThat($condition, static::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 = '') + { + static::assertThat($condition, static::logicalNot(static::isFalse()), $message); + } + + /** + * Asserts that a variable is null. + * + * @param mixed $actual + * @param string $message + */ + public static function assertNull($actual, $message = '') + { + static::assertThat($actual, static::isNull(), $message); + } + + /** + * Asserts that a variable is not null. + * + * @param mixed $actual + * @param string $message + */ + public static function assertNotNull($actual, $message = '') + { + static::assertThat($actual, static::logicalNot(static::isNull()), $message); + } + + /** + * Asserts that a variable is finite. + * + * @param mixed $actual + * @param string $message + */ + public static function assertFinite($actual, $message = '') + { + static::assertThat($actual, static::isFinite(), $message); + } + + /** + * Asserts that a variable is infinite. + * + * @param mixed $actual + * @param string $message + */ + public static function assertInfinite($actual, $message = '') + { + static::assertThat($actual, static::isInfinite(), $message); + } + + /** + * Asserts that a variable is nan. + * + * @param mixed $actual + * @param string $message + */ + public static function assertNan($actual, $message = '') + { + static::assertThat($actual, static::isNan(), $message); + } + + /** + * Asserts that a class has a specified attribute. + * + * @param string $attributeName + * @param string $className + * @param string $message + */ + 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 + ); + + static::assertThat($className, $constraint, $message); + } + + /** + * Asserts that a class does not have a specified attribute. + * + * @param string $attributeName + * @param string $className + * @param string $message + */ + 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) + ); + + static::assertThat($className, $constraint, $message); + } + + /** + * Asserts that a class has a specified static attribute. + * + * @param string $attributeName + * @param string $className + * @param string $message + */ + 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 + ); + + static::assertThat($className, $constraint, $message); + } + + /** + * Asserts that a class does not have a specified static attribute. + * + * @param string $attributeName + * @param string $className + * @param string $message + */ + 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 + ) + ); + + static::assertThat($className, $constraint, $message); + } + + /** + * Asserts that an object has a specified attribute. + * + * @param string $attributeName + * @param object $object + * @param string $message + */ + 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 + ); + + static::assertThat($object, $constraint, $message); + } + + /** + * Asserts that an object does not have a specified attribute. + * + * @param string $attributeName + * @param object $object + * @param string $message + */ + 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) + ); + + static::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)) { + static::assertEquals($expected, $actual, $message); + } else { + $constraint = new PHPUnit_Framework_Constraint_IsIdentical( + $expected + ); + + static::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 string|object $actualClassOrObject + * @param string $message + */ + public static function assertAttributeSame($expected, $actualAttributeName, $actualClassOrObject, $message = '') + { + static::assertSame( + $expected, + static::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)) { + static::assertNotEquals($expected, $actual, $message); + } else { + $constraint = new PHPUnit_Framework_Constraint_Not( + new PHPUnit_Framework_Constraint_IsIdentical($expected) + ); + + static::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 string|object $actualClassOrObject + * @param string $message + */ + public static function assertAttributeNotSame($expected, $actualAttributeName, $actualClassOrObject, $message = '') + { + static::assertNotSame( + $expected, + static::readAttribute($actualClassOrObject, $actualAttributeName), + $message + ); + } + + /** + * Asserts that a variable is of a given type. + * + * @param string $expected + * @param mixed $actual + * @param string $message + */ + 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 + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that an attribute is of a given type. + * + * @param string $expected + * @param string $attributeName + * @param string|object $classOrObject + * @param string $message + */ + public static function assertAttributeInstanceOf($expected, $attributeName, $classOrObject, $message = '') + { + static::assertInstanceOf( + $expected, + static::readAttribute($classOrObject, $attributeName), + $message + ); + } + + /** + * Asserts that a variable is not of a given type. + * + * @param string $expected + * @param mixed $actual + * @param string $message + */ + 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) + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that an attribute is of a given type. + * + * @param string $expected + * @param string $attributeName + * @param string|object $classOrObject + * @param string $message + */ + public static function assertAttributeNotInstanceOf($expected, $attributeName, $classOrObject, $message = '') + { + static::assertNotInstanceOf( + $expected, + static::readAttribute($classOrObject, $attributeName), + $message + ); + } + + /** + * Asserts that a variable is of a given type. + * + * @param string $expected + * @param mixed $actual + * @param string $message + */ + 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 + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that an attribute is of a given type. + * + * @param string $expected + * @param string $attributeName + * @param string|object $classOrObject + * @param string $message + */ + public static function assertAttributeInternalType($expected, $attributeName, $classOrObject, $message = '') + { + static::assertInternalType( + $expected, + static::readAttribute($classOrObject, $attributeName), + $message + ); + } + + /** + * Asserts that a variable is not of a given type. + * + * @param string $expected + * @param mixed $actual + * @param string $message + */ + 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) + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that an attribute is of a given type. + * + * @param string $expected + * @param string $attributeName + * @param string|object $classOrObject + * @param string $message + */ + public static function assertAttributeNotInternalType($expected, $attributeName, $classOrObject, $message = '') + { + static::assertNotInternalType( + $expected, + static::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); + + static::assertThat($string, $constraint, $message); + } + + /** + * Asserts that a string does not match a given regular expression. + * + * @param string $pattern + * @param string $string + * @param string $message + */ + 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) + ); + + static::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'); + } + + static::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) + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that a string matches a given format string. + * + * @param string $format + * @param string $string + * @param string $message + */ + 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); + + static::assertThat($string, $constraint, $message); + } + + /** + * Asserts that a string does not match a given format string. + * + * @param string $format + * @param string $string + * @param string $message + */ + 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) + ); + + static::assertThat($string, $constraint, $message); + } + + /** + * Asserts that a string matches a given format file. + * + * @param string $formatFile + * @param string $string + * @param string $message + */ + public static function assertStringMatchesFormatFile($formatFile, $string, $message = '') + { + static::assertFileExists($formatFile, $message); + + if (!is_string($string)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); + } + + $constraint = new PHPUnit_Framework_Constraint_StringMatches( + file_get_contents($formatFile) + ); + + static::assertThat($string, $constraint, $message); + } + + /** + * Asserts that a string does not match a given format string. + * + * @param string $formatFile + * @param string $string + * @param string $message + */ + public static function assertStringNotMatchesFormatFile($formatFile, $string, $message = '') + { + static::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) + ) + ); + + static::assertThat($string, $constraint, $message); + } + + /** + * Asserts that a string starts with a given prefix. + * + * @param string $prefix + * @param string $string + * @param string $message + */ + 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 + ); + + static::assertThat($string, $constraint, $message); + } + + /** + * Asserts that a string starts not with a given prefix. + * + * @param string $prefix + * @param string $string + * @param string $message + */ + 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) + ); + + static::assertThat($string, $constraint, $message); + } + + /** + * Asserts that a string ends with a given suffix. + * + * @param string $suffix + * @param string $string + * @param string $message + */ + 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); + + static::assertThat($string, $constraint, $message); + } + + /** + * Asserts that a string ends not with a given suffix. + * + * @param string $suffix + * @param string $string + * @param string $message + */ + 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) + ); + + static::assertThat($string, $constraint, $message); + } + + /** + * Asserts that two XML files are equal. + * + * @param string $expectedFile + * @param string $actualFile + * @param string $message + */ + public static function assertXmlFileEqualsXmlFile($expectedFile, $actualFile, $message = '') + { + $expected = PHPUnit_Util_XML::loadFile($expectedFile); + $actual = PHPUnit_Util_XML::loadFile($actualFile); + + static::assertEquals($expected, $actual, $message); + } + + /** + * Asserts that two XML files are not equal. + * + * @param string $expectedFile + * @param string $actualFile + * @param string $message + */ + public static function assertXmlFileNotEqualsXmlFile($expectedFile, $actualFile, $message = '') + { + $expected = PHPUnit_Util_XML::loadFile($expectedFile); + $actual = PHPUnit_Util_XML::loadFile($actualFile); + + static::assertNotEquals($expected, $actual, $message); + } + + /** + * Asserts that two XML documents are equal. + * + * @param string $expectedFile + * @param string $actualXml + * @param string $message + */ + public static function assertXmlStringEqualsXmlFile($expectedFile, $actualXml, $message = '') + { + $expected = PHPUnit_Util_XML::loadFile($expectedFile); + $actual = PHPUnit_Util_XML::load($actualXml); + + static::assertEquals($expected, $actual, $message); + } + + /** + * Asserts that two XML documents are not equal. + * + * @param string $expectedFile + * @param string $actualXml + * @param string $message + */ + public static function assertXmlStringNotEqualsXmlFile($expectedFile, $actualXml, $message = '') + { + $expected = PHPUnit_Util_XML::loadFile($expectedFile); + $actual = PHPUnit_Util_XML::load($actualXml); + + static::assertNotEquals($expected, $actual, $message); + } + + /** + * Asserts that two XML documents are equal. + * + * @param string $expectedXml + * @param string $actualXml + * @param string $message + */ + public static function assertXmlStringEqualsXmlString($expectedXml, $actualXml, $message = '') + { + $expected = PHPUnit_Util_XML::load($expectedXml); + $actual = PHPUnit_Util_XML::load($actualXml); + + static::assertEquals($expected, $actual, $message); + } + + /** + * Asserts that two XML documents are not equal. + * + * @param string $expectedXml + * @param string $actualXml + * @param string $message + */ + public static function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, $message = '') + { + $expected = PHPUnit_Util_XML::load($expectedXml); + $actual = PHPUnit_Util_XML::load($actualXml); + + static::assertNotEquals($expected, $actual, $message); + } + + /** + * Asserts that a hierarchy of DOMElements matches. + * + * @param DOMElement $expectedElement + * @param DOMElement $actualElement + * @param bool $checkAttributes + * @param string $message + */ + 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); + + static::assertEquals( + $expectedElement->tagName, + $actualElement->tagName, + $message + ); + + if ($checkAttributes) { + static::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) { + static::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); + + static::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++) { + static::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 + */ + 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 + */ + public static function assertJson($actualJson, $message = '') + { + if (!is_string($actualJson)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); + } + + static::assertThat($actualJson, static::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 = '') + { + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + + $expected = json_decode($expectedJson); + $actual = json_decode($actualJson); + + static::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 = '') + { + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + + $expected = json_decode($expectedJson); + $actual = json_decode($actualJson); + + static::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 = '') + { + static::assertFileExists($expectedFile, $message); + $expectedJson = file_get_contents($expectedFile); + + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + + // call constraint + $constraint = new PHPUnit_Framework_Constraint_JsonMatches( + $expectedJson + ); + + static::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 = '') + { + static::assertFileExists($expectedFile, $message); + $expectedJson = file_get_contents($expectedFile); + + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + + // call constraint + $constraint = new PHPUnit_Framework_Constraint_JsonMatches( + $expectedJson + ); + + static::assertThat($actualJson, new PHPUnit_Framework_Constraint_Not($constraint), $message); + } + + /** + * Asserts that two JSON files are equal. + * + * @param string $expectedFile + * @param string $actualFile + * @param string $message + */ + public static function assertJsonFileEqualsJsonFile($expectedFile, $actualFile, $message = '') + { + static::assertFileExists($expectedFile, $message); + static::assertFileExists($actualFile, $message); + + $actualJson = file_get_contents($actualFile); + $expectedJson = file_get_contents($expectedFile); + + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + + // call constraint + $constraintExpected = new PHPUnit_Framework_Constraint_JsonMatches( + $expectedJson + ); + + $constraintActual = new PHPUnit_Framework_Constraint_JsonMatches($actualJson); + + static::assertThat($expectedJson, $constraintActual, $message); + static::assertThat($actualJson, $constraintExpected, $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 = '') + { + static::assertFileExists($expectedFile, $message); + static::assertFileExists($actualFile, $message); + + $actualJson = file_get_contents($actualFile); + $expectedJson = file_get_contents($expectedFile); + + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + + // call constraint + $constraintExpected = new PHPUnit_Framework_Constraint_JsonMatches( + $expectedJson + ); + + $constraintActual = new PHPUnit_Framework_Constraint_JsonMatches($actualJson); + + static::assertThat($expectedJson, new PHPUnit_Framework_Constraint_Not($constraintActual), $message); + static::assertThat($actualJson, new PHPUnit_Framework_Constraint_Not($constraintExpected), $message); + } + + /** + * Returns a PHPUnit_Framework_Constraint_And matcher object. + * + * @return PHPUnit_Framework_Constraint_And + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + public static function anything() + { + return new PHPUnit_Framework_Constraint_IsAnything; + } + + /** + * Returns a PHPUnit_Framework_Constraint_IsTrue matcher object. + * + * @return PHPUnit_Framework_Constraint_IsTrue + */ + 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 + */ + public static function isFalse() + { + return new PHPUnit_Framework_Constraint_IsFalse; + } + + /** + * Returns a PHPUnit_Framework_Constraint_IsJson matcher object. + * + * @return PHPUnit_Framework_Constraint_IsJson + */ + public static function isJson() + { + return new PHPUnit_Framework_Constraint_IsJson; + } + + /** + * Returns a PHPUnit_Framework_Constraint_IsNull matcher object. + * + * @return PHPUnit_Framework_Constraint_IsNull + */ + public static function isNull() + { + return new PHPUnit_Framework_Constraint_IsNull; + } + + /** + * Returns a PHPUnit_Framework_Constraint_IsFinite matcher object. + * + * @return PHPUnit_Framework_Constraint_IsFinite + */ + public static function isFinite() + { + return new PHPUnit_Framework_Constraint_IsFinite; + } + + /** + * Returns a PHPUnit_Framework_Constraint_IsInfinite matcher object. + * + * @return PHPUnit_Framework_Constraint_IsInfinite + */ + public static function isInfinite() + { + return new PHPUnit_Framework_Constraint_IsInfinite; + } + + /** + * Returns a PHPUnit_Framework_Constraint_IsNan matcher object. + * + * @return PHPUnit_Framework_Constraint_IsNan + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + public static function attributeEqualTo($attributeName, $value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) + { + return static::attribute( + static::equalTo( + $value, + $delta, + $maxDepth, + $canonicalize, + $ignoreCase + ), + $attributeName + ); + } + + /** + * Returns a PHPUnit_Framework_Constraint_IsEmpty matcher object. + * + * @return PHPUnit_Framework_Constraint_IsEmpty + */ + public static function isEmpty() + { + return new PHPUnit_Framework_Constraint_IsEmpty; + } + + /** + * Returns a PHPUnit_Framework_Constraint_IsWritable matcher object. + * + * @return PHPUnit_Framework_Constraint_IsWritable + */ + public static function isWritable() + { + return new PHPUnit_Framework_Constraint_IsWritable; + } + + /** + * Returns a PHPUnit_Framework_Constraint_IsReadable matcher object. + * + * @return PHPUnit_Framework_Constraint_IsReadable + */ + public static function isReadable() + { + return new PHPUnit_Framework_Constraint_IsReadable; + } + + /** + * Returns a PHPUnit_Framework_Constraint_DirectoryExists matcher object. + * + * @return PHPUnit_Framework_Constraint_DirectoryExists + */ + public static function directoryExists() + { + return new PHPUnit_Framework_Constraint_DirectoryExists; + } + + /** + * Returns a PHPUnit_Framework_Constraint_FileExists matcher object. + * + * @return PHPUnit_Framework_Constraint_FileExists + */ + 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 + */ + 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 + */ + public static function greaterThanOrEqual($value) + { + return static::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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + public static function lessThanOrEqual($value) + { + return static::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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 string|object $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 static::getStaticAttribute( + $classOrObject, + $attributeName + ); + } elseif (is_object($classOrObject)) { + return static::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 + */ + 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 + */ + 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 + */ + public static function markTestIncomplete($message = '') + { + throw new PHPUnit_Framework_IncompleteTestError($message); + } + + /** + * Mark the test as skipped. + * + * @param string $message + * + * @throws PHPUnit_Framework_SkippedTestError + */ + public static function markTestSkipped($message = '') + { + throw new PHPUnit_Framework_SkippedTestError($message); + } + + /** + * Return the current assertion count. + * + * @return int + */ + public static function getCount() + { + return self::$count; + } + + /** + * Reset the assertion counter. + */ + public static function resetCount() + { + self::$count = 0; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Assert/Functions.php b/.phpunit/phpunit-5.7/src/Framework/Assert/Functions.php new file mode 100644 index 0000000..c048e14 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Assert/Functions.php @@ -0,0 +1,2174 @@ + + * + * 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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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_Count matcher object. + * + * @param int $count + * + * @return Count + */ +function countOf($count) +{ + return call_user_func_array( + 'PHPUnit\Framework\Assert::countOf', + 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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +function objectHasAttribute($attributeName) +{ + return call_user_func_array( + 'PHPUnit_Framework_Assert::objectHasAttribute', + func_get_args() + ); +} + +/** + * @param mixed $value, ... + * + * @return PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls + */ +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 + */ +function once() +{ + return call_user_func_array( + 'PHPUnit_Framework_TestCase::once', + func_get_args() + ); +} + +/** + * @param int $argumentIndex + * + * @return PHPUnit_Framework_MockObject_Stub_ReturnArgument + */ +function returnArgument($argumentIndex) +{ + return call_user_func_array( + 'PHPUnit_Framework_TestCase::returnArgument', + func_get_args() + ); +} + +/** + * @param mixed $callback + * + * @return PHPUnit_Framework_MockObject_Stub_ReturnCallback + */ +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 + */ +function returnSelf() +{ + return call_user_func_array( + 'PHPUnit_Framework_TestCase::returnSelf', + func_get_args() + ); +} + +/** + * @param mixed $value + * + * @return PHPUnit_Framework_MockObject_Stub_Return + */ +function returnValue($value) +{ + return call_user_func_array( + 'PHPUnit_Framework_TestCase::returnValue', + func_get_args() + ); +} + +/** + * @param array $valueMap + * + * @return PHPUnit_Framework_MockObject_Stub_ReturnValueMap + */ +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 + */ +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 + */ +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 + */ +function stringStartsWith($prefix) +{ + return call_user_func_array( + 'PHPUnit_Framework_Assert::stringStartsWith', + func_get_args() + ); +} + +/** + * @param Exception $exception + * + * @return PHPUnit_Framework_MockObject_Stub_Exception + */ +function throwException(Exception $exception) +{ + return call_user_func_array( + 'PHPUnit_Framework_TestCase::throwException', + func_get_args() + ); +} diff --git a/.phpunit/phpunit-5.7/src/Framework/AssertionFailedError.php b/.phpunit/phpunit-5.7/src/Framework/AssertionFailedError.php new file mode 100644 index 0000000..77c6843 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/AssertionFailedError.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Thrown when an assertion failed. + */ +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(); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/BaseTestListener.php b/.phpunit/phpunit-5.7/src/Framework/BaseTestListener.php new file mode 100644 index 0000000..0fd7cf5 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/BaseTestListener.php @@ -0,0 +1,58 @@ + + * + * 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. + */ +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) + { + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/CodeCoverageException.php b/.phpunit/phpunit-5.7/src/Framework/CodeCoverageException.php new file mode 100644 index 0000000..6fe365d --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/CodeCoverageException.php @@ -0,0 +1,13 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +class PHPUnit_Framework_CodeCoverageException extends PHPUnit_Framework_Exception +{ +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint.php b/.phpunit/phpunit-5.7/src/Framework/Constraint.php new file mode 100644 index 0000000..80bba68 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint.php @@ -0,0 +1,149 @@ + + * + * 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 can be applied to any value. + */ +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 + */ + 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(); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/And.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/And.php new file mode 100644 index 0000000..640d774 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/And.php @@ -0,0 +1,121 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Logical AND. + */ +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 + */ + public function count() + { + $count = 0; + + foreach ($this->constraints as $constraint) { + $count += count($constraint); + } + + return $count; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/ArrayHasKey.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/ArrayHasKey.php new file mode 100644 index 0000000..19904eb --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/ArrayHasKey.php @@ -0,0 +1,80 @@ + + * + * 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. + */ +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(); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/ArraySubset.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/ArraySubset.php new file mode 100644 index 0000000..5d3e6c4 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/ArraySubset.php @@ -0,0 +1,107 @@ + + * + * 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. + */ +class PHPUnit_Framework_Constraint_ArraySubset extends PHPUnit_Framework_Constraint +{ + /** + * @var array|Traversable + */ + protected $subset; + + /** + * @var bool + */ + protected $strict; + + /** + * @param array|Traversable $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|Traversable $other Array or Traversable object to evaluate. + * + * @return bool + */ + protected function matches($other) + { + //type cast $other & $this->subset as an array to allow + //support in standard array functions. + $other = $this->toArray($other); + $this->subset = $this->toArray($this->subset); + + $patched = array_replace_recursive($other, $this->subset); + + if ($this->strict) { + 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(); + } + + /** + * @param array|Traversable $other + * + * @return array + */ + private function toArray($other) + { + if (is_array($other)) { + return $other; + } elseif ($other instanceof ArrayObject) { + return $other->getArrayCopy(); + } elseif ($other instanceof Traversable) { + return iterator_to_array($other); + } + + // Keep BC even if we know that array would not be the expected one + return (array) $other; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/Attribute.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/Attribute.php new file mode 100644 index 0000000..e63c1d4 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/Attribute.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +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(); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/Callback.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/Callback.php new file mode 100644 index 0000000..df60d68 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/Callback.php @@ -0,0 +1,59 @@ + + * + * 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'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/ClassHasAttribute.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/ClassHasAttribute.php new file mode 100644 index 0000000..68c7db7 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/ClassHasAttribute.php @@ -0,0 +1,80 @@ + + * + * 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. + */ +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() + ); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/ClassHasStaticAttribute.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/ClassHasStaticAttribute.php new file mode 100644 index 0000000..e274770 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/ClassHasStaticAttribute.php @@ -0,0 +1,52 @@ + + * + * 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. + */ +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 + */ + public function toString() + { + return sprintf( + 'has static attribute "%s"', + $this->attributeName + ); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/Composite.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/Composite.php new file mode 100644 index 0000000..34e50a8 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/Composite.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +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); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/Count.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/Count.php new file mode 100644 index 0000000..5014dc9 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/Count.php @@ -0,0 +1,122 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +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; + } + + if ($iterator instanceof Generator) { + return $this->getCountOfGenerator($iterator); + } + + $key = $iterator->key(); + $count = iterator_count($iterator); + + // Manually rewind $iterator to previous key, since iterator_count + // moves pointer. + if ($key !== null) { + $iterator->rewind(); + while ($iterator->valid() && $key !== $iterator->key()) { + $iterator->next(); + } + } + + return $count; + } + } + + /** + * Returns the total number of iterations from a generator. + * This will fully exhaust the generator. + * + * @param Generator $generator + * + * @return int + */ + protected function getCountOfGenerator(Generator $generator) + { + for ($count = 0; $generator->valid(); $generator->next()) { + $count += 1; + } + + 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 + ); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/DirectoryExists.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/DirectoryExists.php new file mode 100644 index 0000000..c54a58a --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/DirectoryExists.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Constraint that checks if the directory(name) that it is evaluated for exists. + * + * The file path to check is passed as $other in evaluate(). + */ +class PHPUnit_Framework_Constraint_DirectoryExists 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_dir($other); + } + + /** + * Returns the description of the failure + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other Evaluated value or object. + * + * @return string + */ + protected function failureDescription($other) + { + return sprintf( + 'directory "%s" exists', + $other + ); + } + + /** + * Returns a string representation of the constraint. + * + * @return string + */ + public function toString() + { + return 'directory exists'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/Exception.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/Exception.php new file mode 100644 index 0000000..7dc798c --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/Exception.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +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 + ); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/ExceptionCode.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/ExceptionCode.php new file mode 100644 index 0000000..e66c7ac --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/ExceptionCode.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +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 '; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/ExceptionMessage.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/ExceptionMessage.php new file mode 100644 index 0000000..d2047e9 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/ExceptionMessage.php @@ -0,0 +1,81 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +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) + { + if ($this->expectedMessage === '') { + return $other->getMessage() === ''; + } + + 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) + { + if ($this->expectedMessage === '') { + return sprintf( + "exception message is empty but is '%s'", + $other->getMessage() + ); + } + + return sprintf( + "exception message '%s' contains '%s'", + $other->getMessage(), + $this->expectedMessage + ); + } + + /** + * @return string + */ + public function toString() + { + if ($this->expectedMessage === '') { + return 'exception message is empty'; + } + + return 'exception message contains '; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/ExceptionMessageRegExp.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/ExceptionMessageRegExp.php new file mode 100644 index 0000000..ea4d4b2 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/ExceptionMessageRegExp.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +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 '; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/FileExists.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/FileExists.php new file mode 100644 index 0000000..d477c6b --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/FileExists.php @@ -0,0 +1,58 @@ + + * + * 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(). + */ +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'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/GreaterThan.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/GreaterThan.php new file mode 100644 index 0000000..d7ecdc4 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/GreaterThan.php @@ -0,0 +1,53 @@ + + * + * 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. + */ +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); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/IsAnything.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsAnything.php new file mode 100644 index 0000000..baa4cd9 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsAnything.php @@ -0,0 +1,58 @@ + + * + * 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. + */ +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 + */ + public function count() + { + return 0; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/IsEmpty.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsEmpty.php new file mode 100644 index 0000000..39ce565 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsEmpty.php @@ -0,0 +1,64 @@ + + * + * 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(). + */ +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() + ); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/IsEqual.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsEqual.php new file mode 100644 index 0000000..91758a4 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsEqual.php @@ -0,0 +1,177 @@ + + * + * 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. + */ +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 + ); + } + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/IsFalse.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsFalse.php new file mode 100644 index 0000000..391e72a --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsFalse.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Constraint that accepts false. + */ +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'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/IsFinite.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsFinite.php new file mode 100644 index 0000000..a32fa6e --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsFinite.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Constraint that accepts finite. + */ +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'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/IsIdentical.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsIdentical.php new file mode 100644 index 0000000..f214bc6 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsIdentical.php @@ -0,0 +1,130 @@ + + * + * 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. + */ +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_float($this->value) && is_float($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); + } + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/IsInfinite.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsInfinite.php new file mode 100644 index 0000000..24f924f --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsInfinite.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Constraint that accepts infinite. + */ +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'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/IsInstanceOf.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsInstanceOf.php new file mode 100644 index 0000000..5c380a3 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsInstanceOf.php @@ -0,0 +1,92 @@ + + * + * 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. + */ +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'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/IsJson.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsJson.php new file mode 100644 index 0000000..315e378 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsJson.php @@ -0,0 +1,75 @@ + + * + * 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. + */ +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'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/IsNan.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsNan.php new file mode 100644 index 0000000..58c167f --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsNan.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Constraint that accepts nan. + */ +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'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/IsNull.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsNull.php new file mode 100644 index 0000000..856d4aa --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsNull.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Constraint that accepts null. + */ +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'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/IsReadable.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsReadable.php new file mode 100644 index 0000000..403405e --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsReadable.php @@ -0,0 +1,58 @@ + + * + * 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/dir(name) that it is evaluated for is readable. + * + * The file path to check is passed as $other in evaluate(). + */ +class PHPUnit_Framework_Constraint_IsReadable 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_readable($other); + } + + /** + * Returns the description of the failure + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other Evaluated value or object. + * + * @return string + */ + protected function failureDescription($other) + { + return sprintf( + '"%s" is readable', + $other + ); + } + + /** + * Returns a string representation of the constraint. + * + * @return string + */ + public function toString() + { + return 'is readable'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/IsTrue.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsTrue.php new file mode 100644 index 0000000..d71a722 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsTrue.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Constraint that accepts true. + */ +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'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/IsType.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsType.php new file mode 100644 index 0000000..a2b218d --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsType.php @@ -0,0 +1,141 @@ + + * + * 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. + */ +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_int($other); + + case 'double': + case 'float': + case 'real': + return is_float($other); + + case 'string': + return is_string($other); + + case 'boolean': + case 'bool': + return is_bool($other); + + case 'null': + return 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 + ); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/IsWritable.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsWritable.php new file mode 100644 index 0000000..b82d86e --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/IsWritable.php @@ -0,0 +1,58 @@ + + * + * 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/dir(name) that it is evaluated for is writable. + * + * The file path to check is passed as $other in evaluate(). + */ +class PHPUnit_Framework_Constraint_IsWritable 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_writable($other); + } + + /** + * Returns the description of the failure + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other Evaluated value or object. + * + * @return string + */ + protected function failureDescription($other) + { + return sprintf( + '"%s" is writable', + $other + ); + } + + /** + * Returns a string representation of the constraint. + * + * @return string + */ + public function toString() + { + return 'is writable'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/JsonMatches.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/JsonMatches.php new file mode 100644 index 0000000..02b8767 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/JsonMatches.php @@ -0,0 +1,69 @@ + + * + * 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. + */ +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 + ); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/JsonMatches/ErrorMessageProvider.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/JsonMatches/ErrorMessageProvider.php new file mode 100644 index 0000000..76cc0e7 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/JsonMatches/ErrorMessageProvider.php @@ -0,0 +1,67 @@ + + * + * 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. + */ +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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/LessThan.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/LessThan.php new file mode 100644 index 0000000..256edc9 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/LessThan.php @@ -0,0 +1,53 @@ + + * + * 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. + */ +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); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/Not.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/Not.php new file mode 100644 index 0000000..8b93f77 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/Not.php @@ -0,0 +1,156 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Logical NOT. + */ +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 + */ + public function count() + { + return count($this->constraint); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/ObjectHasAttribute.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/ObjectHasAttribute.php new file mode 100644 index 0000000..3c99b31 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/ObjectHasAttribute.php @@ -0,0 +1,33 @@ + + * + * 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. + */ +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); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/Or.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/Or.php new file mode 100644 index 0000000..af739aa --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/Or.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Logical OR. + */ +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 + */ + public function count() + { + $count = 0; + + foreach ($this->constraints as $constraint) { + $count += count($constraint); + } + + return $count; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/PCREMatch.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/PCREMatch.php new file mode 100644 index 0000000..c4ea9c8 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/PCREMatch.php @@ -0,0 +1,61 @@ + + * + * 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. + */ +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 + ); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/SameSize.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/SameSize.php new file mode 100644 index 0000000..336566a --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/SameSize.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +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)); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/StringContains.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/StringContains.php new file mode 100644 index 0000000..7c84743 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/StringContains.php @@ -0,0 +1,79 @@ + + * + * 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 mb_strpos() to find the position of the string in the input, if not + * found the evaluation fails. + * + * The sub-string is passed in the constructor. + */ +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 mb_stripos($other, $this->string) !== false; + } else { + return mb_strpos($other, $this->string) !== false; + } + } + + /** + * Returns a string representation of the constraint. + * + * @return string + */ + public function toString() + { + if ($this->ignoreCase) { + $string = mb_strtolower($this->string); + } else { + $string = $this->string; + } + + return sprintf( + 'contains "%s"', + $string + ); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/StringEndsWith.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/StringEndsWith.php new file mode 100644 index 0000000..c70c86a --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/StringEndsWith.php @@ -0,0 +1,53 @@ + + * + * 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. + */ +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 . '"'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/StringMatches.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/StringMatches.php new file mode 100644 index 0000000..6027fb6 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/StringMatches.php @@ -0,0 +1,99 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use SebastianBergmann\Diff\Differ; + +/** + * ... + */ +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'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/StringStartsWith.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/StringStartsWith.php new file mode 100644 index 0000000..b1f05b5 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/StringStartsWith.php @@ -0,0 +1,53 @@ + + * + * 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. + */ +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 . '"'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/TraversableContains.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/TraversableContains.php new file mode 100644 index 0000000..6d28133 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/TraversableContains.php @@ -0,0 +1,123 @@ + + * + * 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. + */ +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) { + return true; + } elseif (!$this->checkForObjectIdentity && $element == $this->value) { + return true; + } + } + } else { + foreach ($other as $element) { + if ($this->checkForNonObjectIdentity && $element === $this->value) { + return true; + } elseif (!$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() + ); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/TraversableContainsOnly.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/TraversableContainsOnly.php new file mode 100644 index 0000000..30eddf2 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/TraversableContainsOnly.php @@ -0,0 +1,93 @@ + + * + * 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. + */ +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 . '"'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Constraint/Xor.php b/.phpunit/phpunit-5.7/src/Framework/Constraint/Xor.php new file mode 100644 index 0000000..2214ecd --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Constraint/Xor.php @@ -0,0 +1,118 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Logical XOR. + */ +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 + */ + public function count() + { + $count = 0; + + foreach ($this->constraints as $constraint) { + $count += count($constraint); + } + + return $count; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/CoveredCodeNotExecutedException.php b/.phpunit/phpunit-5.7/src/Framework/CoveredCodeNotExecutedException.php new file mode 100644 index 0000000..c29a1a5 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/CoveredCodeNotExecutedException.php @@ -0,0 +1,17 @@ + + * + * 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 does not execute the code it wants to cover. + */ +class PHPUnit_Framework_CoveredCodeNotExecutedException extends PHPUnit_Framework_RiskyTestError +{ +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Error.php b/.phpunit/phpunit-5.7/src/Framework/Error.php new file mode 100644 index 0000000..0844007 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Error.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Wrapper for PHP errors. + */ +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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Error/Deprecated.php b/.phpunit/phpunit-5.7/src/Framework/Error/Deprecated.php new file mode 100644 index 0000000..94f64fa --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Error/Deprecated.php @@ -0,0 +1,22 @@ + + * + * 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; + * + */ +class PHPUnit_Framework_Error_Deprecated extends PHPUnit_Framework_Error +{ + public static $enabled = true; +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Error/Notice.php b/.phpunit/phpunit-5.7/src/Framework/Error/Notice.php new file mode 100644 index 0000000..25a4164 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Error/Notice.php @@ -0,0 +1,22 @@ + + * + * 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; + * + */ +class PHPUnit_Framework_Error_Notice extends PHPUnit_Framework_Error +{ + public static $enabled = true; +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Error/Warning.php b/.phpunit/phpunit-5.7/src/Framework/Error/Warning.php new file mode 100644 index 0000000..55f1692 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Error/Warning.php @@ -0,0 +1,22 @@ + + * + * 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; + * + */ +class PHPUnit_Framework_Error_Warning extends PHPUnit_Framework_Error +{ + public static $enabled = true; +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Exception.php b/.phpunit/phpunit-5.7/src/Framework/Exception.php new file mode 100644 index 0000000..6188617 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Exception.php @@ -0,0 +1,76 @@ + + * + * 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 + */ +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)); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/ExceptionWrapper.php b/.phpunit/phpunit-5.7/src/Framework/ExceptionWrapper.php new file mode 100644 index 0000000..558932a --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/ExceptionWrapper.php @@ -0,0 +1,89 @@ + + * + * 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. + */ +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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/ExpectationFailedException.php b/.phpunit/phpunit-5.7/src/Framework/ExpectationFailedException.php new file mode 100644 index 0000000..67d30ef --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/ExpectationFailedException.php @@ -0,0 +1,39 @@ + + * + * 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. + */ +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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/IncompleteTest.php b/.phpunit/phpunit-5.7/src/Framework/IncompleteTest.php new file mode 100644 index 0000000..6ce0a8a --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/IncompleteTest.php @@ -0,0 +1,17 @@ + + * + * 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. + */ +interface PHPUnit_Framework_IncompleteTest +{ +} diff --git a/.phpunit/phpunit-5.7/src/Framework/IncompleteTestCase.php b/.phpunit/phpunit-5.7/src/Framework/IncompleteTestCase.php new file mode 100644 index 0000000..7b5179c --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/IncompleteTestCase.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * An incomplete test case + */ +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(); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/IncompleteTestError.php b/.phpunit/phpunit-5.7/src/Framework/IncompleteTestError.php new file mode 100644 index 0000000..e056c93 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/IncompleteTestError.php @@ -0,0 +1,17 @@ + + * + * 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. + */ +class PHPUnit_Framework_IncompleteTestError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_IncompleteTest +{ +} diff --git a/.phpunit/phpunit-5.7/src/Framework/InvalidCoversTargetException.php b/.phpunit/phpunit-5.7/src/Framework/InvalidCoversTargetException.php new file mode 100644 index 0000000..8efa6e7 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/InvalidCoversTargetException.php @@ -0,0 +1,13 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +class PHPUnit_Framework_InvalidCoversTargetException extends PHPUnit_Framework_CodeCoverageException +{ +} diff --git a/.phpunit/phpunit-5.7/src/Framework/MissingCoversAnnotationException.php b/.phpunit/phpunit-5.7/src/Framework/MissingCoversAnnotationException.php new file mode 100644 index 0000000..7d0565c --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/MissingCoversAnnotationException.php @@ -0,0 +1,17 @@ + + * + * 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 a test as risky + * when it does not have a @covers annotation but is expected to have one. + */ +class PHPUnit_Framework_MissingCoversAnnotationException extends PHPUnit_Framework_RiskyTestError +{ +} diff --git a/.phpunit/phpunit-5.7/src/Framework/OutputError.php b/.phpunit/phpunit-5.7/src/Framework/OutputError.php new file mode 100644 index 0000000..86c0444 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/OutputError.php @@ -0,0 +1,17 @@ + + * + * 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. + */ +class PHPUnit_Framework_OutputError extends PHPUnit_Framework_AssertionFailedError +{ +} diff --git a/.phpunit/phpunit-5.7/src/Framework/RiskyTest.php b/.phpunit/phpunit-5.7/src/Framework/RiskyTest.php new file mode 100644 index 0000000..6aa56e1 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/RiskyTest.php @@ -0,0 +1,17 @@ + + * + * 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. + */ +interface PHPUnit_Framework_RiskyTest +{ +} diff --git a/.phpunit/phpunit-5.7/src/Framework/RiskyTestError.php b/.phpunit/phpunit-5.7/src/Framework/RiskyTestError.php new file mode 100644 index 0000000..e7b6c0f --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/RiskyTestError.php @@ -0,0 +1,17 @@ + + * + * 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. + */ +class PHPUnit_Framework_RiskyTestError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_RiskyTest +{ +} diff --git a/.phpunit/phpunit-5.7/src/Framework/SelfDescribing.php b/.phpunit/phpunit-5.7/src/Framework/SelfDescribing.php new file mode 100644 index 0000000..a328628 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/SelfDescribing.php @@ -0,0 +1,22 @@ + + * + * 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. + */ +interface PHPUnit_Framework_SelfDescribing +{ + /** + * Returns a string representation of the object. + * + * @return string + */ + public function toString(); +} diff --git a/.phpunit/phpunit-5.7/src/Framework/SkippedTest.php b/.phpunit/phpunit-5.7/src/Framework/SkippedTest.php new file mode 100644 index 0000000..14c9cd0 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/SkippedTest.php @@ -0,0 +1,16 @@ + + * + * 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. + */ +interface PHPUnit_Framework_SkippedTest +{ +} diff --git a/.phpunit/phpunit-5.7/src/Framework/SkippedTestCase.php b/.phpunit/phpunit-5.7/src/Framework/SkippedTestCase.php new file mode 100644 index 0000000..5b6cdf8 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/SkippedTestCase.php @@ -0,0 +1,80 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * A skipped test case + */ +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(); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/SkippedTestError.php b/.phpunit/phpunit-5.7/src/Framework/SkippedTestError.php new file mode 100644 index 0000000..7b19cca --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/SkippedTestError.php @@ -0,0 +1,17 @@ + + * + * 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. + */ +class PHPUnit_Framework_SkippedTestError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_SkippedTest +{ +} diff --git a/.phpunit/phpunit-5.7/src/Framework/SkippedTestSuiteError.php b/.phpunit/phpunit-5.7/src/Framework/SkippedTestSuiteError.php new file mode 100644 index 0000000..e5588bd --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/SkippedTestSuiteError.php @@ -0,0 +1,17 @@ + + * + * 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. + */ +class PHPUnit_Framework_SkippedTestSuiteError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_SkippedTest +{ +} diff --git a/.phpunit/phpunit-5.7/src/Framework/SyntheticError.php b/.phpunit/phpunit-5.7/src/Framework/SyntheticError.php new file mode 100644 index 0000000..d7637ee --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/SyntheticError.php @@ -0,0 +1,78 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Creates a synthetic failed assertion. + */ +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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Test.php b/.phpunit/phpunit-5.7/src/Framework/Test.php new file mode 100644 index 0000000..d488c17 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Test.php @@ -0,0 +1,24 @@ + + * + * 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. + */ +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); +} diff --git a/.phpunit/phpunit-5.7/src/Framework/TestCase.php b/.phpunit/phpunit-5.7/src/Framework/TestCase.php new file mode 100644 index 0000000..bb3e870 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/TestCase.php @@ -0,0 +1,2491 @@ + + * + * 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 SebastianBergmann\ObjectEnumerator\Enumerator; +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); + * } + * ?> + * + */ +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 string + */ + private $expectedException = null; + + /** + * The message of the expected Exception. + * + * @var string + */ + private $expectedExceptionMessage = null; + + /** + * The regex pattern to validate the expected Exception message. + * + * @var string + */ + private $expectedExceptionMessageRegExp = null; + + /** + * The code of the expected Exception. + * + * @var int|string + */ + private $expectedExceptionCode = null; + + /** + * 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 MockGenerator + */ + 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; + + /** + * @var bool + */ + private $registerMockObjectsFromTestArgumentsRecursively = false; + + /** + * @var string[] + */ + private $warnings = []; + + /** + * @var array + */ + private $groups = []; + + /** + * @var bool + */ + private $doesNotPerformAssertions = 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; + } + + public function getGroups() + { + return $this->groups; + } + + /** + * @param array $groups + */ + public function setGroups(array $groups) + { + $this->groups = $groups; + } + + /** + * Returns the annotations for this test. + * + * @return array + */ + 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 + */ + public function getSize() + { + return PHPUnit_Util_Test::getSize( + get_class($this), + $this->getName(false) + ); + } + + /** + * @return bool + */ + public function hasSize() + { + return $this->getSize() !== PHPUnit_Util_Test::UNKNOWN; + } + + /** + * @return bool + */ + public function isSmall() + { + return $this->getSize() === PHPUnit_Util_Test::SMALL; + } + + /** + * @return bool + */ + public function isMedium() + { + return $this->getSize() === PHPUnit_Util_Test::MEDIUM; + } + + /** + * @return bool + */ + public function isLarge() + { + return $this->getSize() === PHPUnit_Util_Test::LARGE; + } + + /** + * @return string + */ + public function getActualOutput() + { + if (!$this->outputBufferingActive) { + return $this->output; + } else { + return ob_get_contents(); + } + } + + /** + * @return bool + */ + public function hasOutput() + { + if (strlen($this->output) === 0) { + return false; + } + + if ($this->hasExpectationOnOutput()) { + return false; + } + + return true; + } + + /** + * @return bool + */ + public function doesNotPerformAssertions() + { + return $this->doesNotPerformAssertions; + } + + /** + * @param string $expectedRegex + * + * @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 + */ + 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 + * + * @deprecated Use hasExpectationOnOutput() instead + */ + public function hasPerformedExpectationsOnOutput() + { + return $this->hasExpectationOnOutput(); + } + + /** + * @return bool + */ + public function hasExpectationOnOutput() + { + return is_string($this->outputExpectedString) || is_string($this->outputExpectedRegex); + } + + /** + * @return string + */ + public function getExpectedException() + { + return $this->expectedException; + } + + /** + * @param mixed $exception + * @param string $message Null means we do not check message at all, string (even empty) means we do. Default: null. + * @param int|string $code Null means we do not check code at all, non-null means we do. + * + * @throws PHPUnit_Framework_Exception + * + * @deprecated Method deprecated since Release 5.2.0; use expectException() instead + */ + public function setExpectedException($exception, $message = '', $code = null) + { + if (null !== $message && !is_string($message)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); + } + + if (func_num_args() < 2) { + $message = null; + } + + $this->expectedException = $exception; + + if ($message !== null) { + $this->expectExceptionMessage($message); + } + + if ($code !== null) { + $this->expectExceptionCode($code); + } + } + + /** + * @param mixed $exception + * @param string $messageRegExp + * @param int $code + * + * @throws PHPUnit_Framework_Exception + * + * @deprecated Method deprecated since Release 5.6.0; use expectExceptionMessageRegExp() instead + */ + public function setExpectedExceptionRegExp($exception, $messageRegExp = '', $code = null) + { + if (!is_string($messageRegExp)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); + } + + $this->expectedException = $exception; + $this->expectedExceptionMessageRegExp = $messageRegExp; + + if ($code !== null) { + $this->expectExceptionCode($code); + } + } + + /** + * @param string $exception + */ + public function expectException($exception) + { + if (!is_string($exception)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); + } + + $this->expectedException = $exception; + } + + /** + * @param int|string $code + * + * @throws PHPUnit_Framework_Exception + */ + public function expectExceptionCode($code) + { + if (!$this->expectedException) { + $this->expectedException = \Exception::class; + } + + if (!is_int($code) && !is_string($code)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer or string'); + } + + $this->expectedExceptionCode = $code; + } + + /** + * @param string $message + * + * @throws PHPUnit_Framework_Exception + */ + public function expectExceptionMessage($message) + { + if (!$this->expectedException) { + $this->expectedException = \Exception::class; + } + + if (!is_string($message)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); + } + + $this->expectedExceptionMessage = $message; + } + + /** + * @param string $messageRegExp + * + * @throws PHPUnit_Framework_Exception + */ + public function expectExceptionMessageRegExp($messageRegExp) + { + if (!is_string($messageRegExp)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); + } + + $this->expectedExceptionMessageRegExp = $messageRegExp; + } + + /** + * @param bool $flag + */ + public function setRegisterMockObjectsFromTestArgumentsRecursively($flag) + { + if (!is_bool($flag)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); + } + + $this->registerMockObjectsFromTestArgumentsRecursively = $flag; + } + + protected function setExpectedExceptionFromAnnotation() + { + try { + $expectedException = PHPUnit_Util_Test::getExpectedException( + get_class($this), + $this->name + ); + + if ($expectedException !== false) { + $this->expectException($expectedException['class']); + + if ($expectedException['code'] !== null) { + $this->expectExceptionCode($expectedException['code']); + } + + if ($expectedException['message'] !== '') { + $this->expectExceptionMessage($expectedException['message']); + } elseif ($expectedException['message_regex'] !== '') { + $this->expectExceptionMessageRegExp($expectedException['message_regex']); + } + } + } catch (ReflectionException $e) { + } + } + + /** + * @param bool $useErrorHandler + */ + public function setUseErrorHandler($useErrorHandler) + { + $this->useErrorHandler = $useErrorHandler; + } + + protected function setUseErrorHandlerFromAnnotation() + { + try { + $useErrorHandler = PHPUnit_Util_Test::getErrorHandlerSettings( + get_class($this), + $this->name + ); + + if ($useErrorHandler !== null) { + $this->setUseErrorHandler($useErrorHandler); + } + } catch (ReflectionException $e) { + } + } + + 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 + */ + public function getStatus() + { + return $this->status; + } + + public function markAsRisky() + { + $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_RISKY; + } + + /** + * Returns the status message of this test. + * + * @return string + */ + public function getStatusMessage() + { + return $this->statusMessage; + } + + /** + * Returns whether or not this test has failed. + * + * @return bool + */ + 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 instanceof PHPUnit_Framework_SkippedTestCase && + !$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 (isset($oldErrorHandlerSetting)) { + $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(); + $this->setDoesNotPerformAssertionsFromAnnotation(); + + foreach ($hookMethods['before'] as $method) { + $this->$method(); + } + + $this->assertPreConditions(); + $this->testResult = $this->runTest(); + $this->verifyMockObjects(); + $this->assertPostConditions(); + + if (!empty($this->warnings)) { + throw new PHPUnit_Framework_Warning( + implode( + "\n", + array_unique($this->warnings) + ) + ); + } + + $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; + } + + // 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; + } + } + + if (isset($_e)) { + $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_ERROR; + $this->statusMessage = $_e->getMessage(); + } + + 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 (!($e instanceof PHPUnit_Framework_SkippedTestError) && 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' || + $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 ($this->expectedExceptionMessage !== null) { + $this->assertThat( + $e, + new PHPUnit_Framework_Constraint_ExceptionMessage( + $this->expectedExceptionMessage + ) + ); + } + + if ($this->expectedExceptionMessageRegExp !== null) { + $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. + */ + 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 $t) { + /* 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($t)) { + throw $t; + } + } + } + + /** + * Sets the name of a TestCase. + * + * @param string + */ + public function setName($name) + { + $this->name = $name; + } + + /** + * Sets the dependencies of a TestCase. + * + * @param array $dependencies + */ + public function setDependencies(array $dependencies) + { + $this->dependencies = $dependencies; + } + + /** + * Returns true if the tests has dependencies + * + * @return bool + */ + public function hasDependencies() + { + return count($this->dependencies) > 0; + } + + /** + * Sets + * + * @param array $dependencyInput + */ + public function setDependencyInput(array $dependencyInput) + { + $this->dependencyInput = $dependencyInput; + } + + /** + * @param bool $beStrictAboutChangesToGlobalState + */ + public function setBeStrictAboutChangesToGlobalState($beStrictAboutChangesToGlobalState) + { + $this->beStrictAboutChangesToGlobalState = $beStrictAboutChangesToGlobalState; + } + + /** + * Calling this method in setUp() has no effect! + * + * @param bool $backupGlobals + */ + 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 + */ + public function setBackupStaticAttributes($backupStaticAttributes) + { + if (is_null($this->backupStaticAttributes) && + is_bool($backupStaticAttributes)) { + $this->backupStaticAttributes = $backupStaticAttributes; + } + } + + /** + * @param bool $runTestInSeparateProcess + * + * @throws PHPUnit_Framework_Exception + */ + 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 + */ + 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 + */ + public function setInIsolation($inIsolation) + { + if (is_bool($inIsolation)) { + $this->inIsolation = $inIsolation; + } else { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); + } + } + + /** + * @return bool + */ + public function isInIsolation() + { + return $this->inIsolation; + } + + /** + * @return mixed + */ + public function getResult() + { + return $this->testResult; + } + + /** + * @param mixed $result + */ + public function setResult($result) + { + $this->testResult = $result; + } + + /** + * @param callable $callback + * + * @throws PHPUnit_Framework_Exception + */ + public function setOutputCallback($callback) + { + if (!is_callable($callback)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'callback'); + } + + $this->outputCallback = $callback; + } + + /** + * @return PHPUnit_Framework_TestResult + */ + public function getTestResultObject() + { + return $this->result; + } + + /** + * @param PHPUnit_Framework_TestResult $result + */ + public function setTestResultObject(PHPUnit_Framework_TestResult $result) + { + $this->result = $result; + } + + /** + * @param PHPUnit_Framework_MockObject_MockObject $mockObject + */ + public function registerMockObject(PHPUnit_Framework_MockObject_MockObject $mockObject) + { + $this->mockObjects[] = $mockObject; + } + + /** + * 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 + */ + 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 + */ + 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, 0); + + $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 builder object to create mock objects using a fluent interface. + * + * @param string|string[] $className + * + * @return PHPUnit_Framework_MockObject_MockBuilder + */ + public function getMockBuilder($className) + { + return new PHPUnit_Framework_MockObject_MockBuilder($this, $className); + } + + /** + * Returns a test double for the specified class. + * + * @param string $originalClassName + * + * @return PHPUnit_Framework_MockObject_MockObject + * + * @throws PHPUnit_Framework_Exception + */ + protected function createMock($originalClassName) + { + return $this->getMockBuilder($originalClassName) + ->disableOriginalConstructor() + ->disableOriginalClone() + ->disableArgumentCloning() + ->disallowMockingUnknownTypes() + ->getMock(); + } + + /** + * Returns a configured test double for the specified class. + * + * @param string $originalClassName + * @param array $configuration + * + * @return PHPUnit_Framework_MockObject_MockObject + * + * @throws PHPUnit_Framework_Exception + */ + protected function createConfiguredMock($originalClassName, array $configuration) + { + $o = $this->createMock($originalClassName); + + foreach ($configuration as $method => $return) { + $o->method($method)->willReturn($return); + } + + return $o; + } + + /** + * Returns a partial test double for the specified class. + * + * @param string $originalClassName + * @param array $methods + * + * @return PHPUnit_Framework_MockObject_MockObject + * + * @throws PHPUnit_Framework_Exception + */ + protected function createPartialMock($originalClassName, array $methods) + { + return $this->getMockBuilder($originalClassName) + ->disableOriginalConstructor() + ->disableOriginalClone() + ->disableArgumentCloning() + ->disallowMockingUnknownTypes() + ->setMethods(empty($methods) ? null : $methods) + ->getMock(); + } + + /** + * 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 + * @param object $proxyTarget + * + * @return PHPUnit_Framework_MockObject_MockObject + * + * @throws PHPUnit_Framework_Exception + * + * @deprecated Method deprecated since Release 5.4.0; use createMock() or getMockBuilder() instead + */ + protected function getMock($originalClassName, $methods = [], array $arguments = [], $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false, $callOriginalMethods = false, $proxyTarget = null) + { + $this->warnings[] = 'PHPUnit_Framework_TestCase::getMock() is deprecated, use PHPUnit_Framework_TestCase::createMock() or PHPUnit_Framework_TestCase::getMockBuilder() instead'; + + $mockObject = $this->getMockObjectGenerator()->getMock( + $originalClassName, + $methods, + $arguments, + $mockClassName, + $callOriginalConstructor, + $callOriginalClone, + $callAutoload, + $cloneArguments, + $callOriginalMethods, + $proxyTarget + ); + + $this->registerMockObject($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 + * + * @deprecated Method deprecated since Release 5.4.0; use createMock() instead + */ + protected function getMockWithoutInvokingTheOriginalConstructor($originalClassName) + { + $this->warnings[] = 'PHPUnit_Framework_TestCase::getMockWithoutInvokingTheOriginalConstructor() is deprecated, use PHPUnit_Framework_TestCase::createMock() instead'; + + return $this->getMockBuilder($originalClassName) + ->disableOriginalConstructor() + ->getMock(); + } + + /** + * 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 + */ + protected function getMockClass($originalClassName, $methods = [], array $arguments = [], $mockClassName = '', $callOriginalConstructor = false, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false) + { + $mock = $this->getMockObjectGenerator()->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 + * + * @throws PHPUnit_Framework_Exception + */ + protected 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->registerMockObject($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 + */ + protected function getMockFromWsdl($wsdlFile, $originalClassName = '', $mockClassName = '', array $methods = [], $callOriginalConstructor = true, array $options = []) + { + if ($originalClassName === '') { + $originalClassName = pathinfo(basename(parse_url($wsdlFile)['path']), PATHINFO_FILENAME); + } + + if (!class_exists($originalClassName)) { + eval( + $this->getMockObjectGenerator()->generateClassFromWsdl( + $wsdlFile, + $originalClassName, + $methods, + $options + ) + ); + } + + $mockObject = $this->getMockObjectGenerator()->getMock( + $originalClassName, + $methods, + ['', $options], + $mockClassName, + $callOriginalConstructor, + false, + false + ); + + $this->registerMockObject($mockObject); + + return $mockObject; + } + + /** + * 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 + * + * @throws PHPUnit_Framework_Exception + */ + protected 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->registerMockObject($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 + * + * @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 + */ + protected function prophesize($classOrInterface = null) + { + return $this->getProphet()->prophesize($classOrInterface); + } + + /** + * Adds a value to the assertion counter. + * + * @param int $count + */ + public function addToAssertionCount($count) + { + $this->numAssertions += $count; + } + + /** + * Returns the number of assertions performed by this test. + * + * @return int + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + public static function at($index) + { + return new PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex($index); + } + + /** + * @param mixed $value + * + * @return PHPUnit_Framework_MockObject_Stub_Return + */ + public static function returnValue($value) + { + return new PHPUnit_Framework_MockObject_Stub_Return($value); + } + + /** + * @param array $valueMap + * + * @return PHPUnit_Framework_MockObject_Stub_ReturnValueMap + */ + public static function returnValueMap(array $valueMap) + { + return new PHPUnit_Framework_MockObject_Stub_ReturnValueMap($valueMap); + } + + /** + * @param int $argumentIndex + * + * @return PHPUnit_Framework_MockObject_Stub_ReturnArgument + */ + public static function returnArgument($argumentIndex) + { + return new PHPUnit_Framework_MockObject_Stub_ReturnArgument( + $argumentIndex + ); + } + + /** + * @param mixed $callback + * + * @return PHPUnit_Framework_MockObject_Stub_ReturnCallback + */ + 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 + */ + public static function returnSelf() + { + return new PHPUnit_Framework_MockObject_Stub_ReturnSelf(); + } + + /** + * @param Throwable|Exception $exception + * + * @return PHPUnit_Framework_MockObject_Stub_Exception + * + * @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 + */ + public static function onConsecutiveCalls() + { + $args = func_get_args(); + + return new PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls($args); + } + + /** + * @return bool + */ + public function usesDataProvider() + { + return !empty($this->data); + } + + /** + * @return string + */ + public function dataDescription() + { + return is_string($this->dataName) ? $this->dataName : ''; + } + + /** + * Gets the data set description of a TestCase. + * + * @param bool $includeData + * + * @return string + */ + 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; + } + + /** + * Gets the data set of a TestCase. + * + * @return array + */ + protected function getProvidedData() + { + return $this->data; + } + + /** + * Creates a default TestResult object. + * + * @return PHPUnit_Framework_TestResult + */ + protected function createResult() + { + return new PHPUnit_Framework_TestResult; + } + + 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->startTest($this); + $this->result->addError( + $this, + new PHPUnit_Framework_SkippedTestError( + sprintf( + 'This test depends on "%s" to pass.', + $dependency + ) + ), + 0 + ); + $this->result->endTest($this, 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. + */ + 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. + */ + protected function assertPreConditions() + { + } + + /** + * Performs assertions shared by all tests of a test case. + * + * This method is called after the execution of a test ends + * and before tearDown() is called. + */ + 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. + */ + public static function tearDownAfterClass() + { + } + + /** + * This method is called when a test method did not execute successfully. + * + * @param Exception|Throwable $e + * + * @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 + */ + 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; + } + + private function startOutputBuffering() + { + ob_start(); + + $this->outputBufferingActive = true; + $this->outputBufferingLevel = ob_get_level(); + } + + private function stopOutputBuffering() + { + if (ob_get_level() != $this->outputBufferingLevel) { + while (ob_get_level() >= $this->outputBufferingLevel) { + 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('SebastianBergmann\CodeCoverage'); + $blacklist->addClassNamePrefix('PHP_Invoker'); + $blacklist->addClassNamePrefix('PHP_Timer'); + $blacklist->addClassNamePrefix('PHP_Token'); + $blacklist->addClassNamePrefix('Symfony'); + $blacklist->addClassNamePrefix('Text_Template'); + $blacklist->addClassNamePrefix('Doctrine\Instantiator'); + $blacklist->addClassNamePrefix('Prophecy'); + + foreach ($this->backupStaticAttributesBlacklist as $class => $attributes) { + foreach ($attributes as $attribute) { + $blacklist->addStaticAttribute($class, $attribute); + } + } + } + + return new Snapshot( + $blacklist, + $backupGlobals, + (bool) $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 + */ + private function getProphet() + { + if ($this->prophet === null) { + $this->prophet = new Prophet; + } + + return $this->prophet; + } + + /** + * @param PHPUnit_Framework_MockObject_MockObject $mock + * + * @return bool + */ + private function shouldInvocationMockerBeReset(PHPUnit_Framework_MockObject_MockObject $mock) + { + $enumerator = new Enumerator; + + foreach ($enumerator->enumerate($this->dependencyInput) as $object) { + if ($mock === $object) { + return false; + } + } + + if (!is_array($this->testResult) && !is_object($this->testResult)) { + return true; + } + + foreach ($enumerator->enumerate($this->testResult) as $object) { + if ($mock === $object) { + return false; + } + } + + return true; + } + + /** + * @param array $testArguments + * @param array $originalTestArguments + */ + private function registerMockObjectsFromTestArguments(array $testArguments, array &$visited = []) + { + if ($this->registerMockObjectsFromTestArgumentsRecursively) { + $enumerator = new Enumerator; + + foreach ($enumerator->enumerate($testArguments) as $object) { + if ($object instanceof PHPUnit_Framework_MockObject_MockObject) { + $this->registerMockObject($object); + } + } + } else { + foreach ($testArguments as $testArgument) { + if ($testArgument instanceof PHPUnit_Framework_MockObject_MockObject) { + if ($this->isCloneable($testArgument)) { + $testArgument = clone $testArgument; + } + + $this->registerMockObject($testArgument); + } elseif (is_array($testArgument) && !in_array($testArgument, $visited, true)) { + $visited[] = $testArgument; + + $this->registerMockObjectsFromTestArguments( + $testArgument, + $visited + ); + } + } + } + } + + private function setDoesNotPerformAssertionsFromAnnotation() + { + $annotations = $this->getAnnotations(); + + if (isset($annotations['method']['doesNotPerformAssertions'])) { + $this->doesNotPerformAssertions = true; + } + } + + /** + * @param PHPUnit_Framework_MockObject_MockObject $testArgument + * + * @return bool + */ + private function isCloneable(PHPUnit_Framework_MockObject_MockObject $testArgument) + { + $reflector = new ReflectionObject($testArgument); + + if (!$reflector->isCloneable()) { + return false; + } + + if ($reflector->hasMethod('__clone') && + $reflector->getMethod('__clone')->isPublic()) { + return true; + } + + return false; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/TestFailure.php b/.phpunit/phpunit-5.7/src/Framework/TestFailure.php new file mode 100644 index 0000000..a53e7e5 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/TestFailure.php @@ -0,0 +1,161 @@ + + * + * 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. + */ +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 + */ + public function getExceptionAsString() + { + return self::exceptionToString($this->thrownException); + } + + /** + * Returns a description for an exception. + * + * @param Exception $e + * + * @return string + */ + 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 + */ + 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); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/TestListener.php b/.phpunit/phpunit-5.7/src/Framework/TestListener.php new file mode 100644 index 0000000..1f46d22 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/TestListener.php @@ -0,0 +1,102 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * A Listener for test progress. + */ +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 + * + * @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 + */ + public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $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); + + /** + * A test suite started. + * + * @param PHPUnit_Framework_TestSuite $suite + */ + public function startTestSuite(PHPUnit_Framework_TestSuite $suite); + + /** + * A test suite ended. + * + * @param PHPUnit_Framework_TestSuite $suite + */ + 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); +} diff --git a/.phpunit/phpunit-5.7/src/Framework/TestResult.php b/.phpunit/phpunit-5.7/src/Framework/TestResult.php new file mode 100644 index 0000000..057973c --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/TestResult.php @@ -0,0 +1,1310 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use SebastianBergmann\CodeCoverage\CodeCoverage; +use SebastianBergmann\CodeCoverage\Exception as CodeCoverageException; +use SebastianBergmann\CodeCoverage\CoveredCodeNotExecutedException; +use SebastianBergmann\CodeCoverage\MissingCoversAnnotationException; +use SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException; +use SebastianBergmann\ResourceOperations\ResourceOperations; + +/** + * A TestResult collects the results of executing a test case. + */ +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 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; + + /** + * @var bool + */ + private $registerMockObjectsFromTestArgumentsRecursively = 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. + */ + 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 ($test instanceof PHPUnit_Framework_TestCase) { + $test->markAsRisky(); + } + + 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 + */ + 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 ($test instanceof PHPUnit_Framework_TestCase) { + $test->markAsRisky(); + } + + 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 + */ + 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 + */ + 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 + */ + public function allHarmless() + { + return $this->riskyCount() == 0; + } + + /** + * Gets the number of risky tests. + * + * @return int + */ + 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 + */ + 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 + */ + public function noneSkipped() + { + return $this->skippedCount() == 0; + } + + /** + * Gets the number of skipped tests. + * + * @return int + */ + public function skippedCount() + { + return count($this->skipped); + } + + /** + * Returns an Enumeration for the skipped tests. + * + * @return array + */ + 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 + */ + public function warningCount() + { + return count($this->warnings); + } + + /** + * Returns an Enumeration for the warnings. + * + * @return array + */ + public function warnings() + { + return $this->warnings; + } + + /** + * Returns the names of the tests that have passed. + * + * @return array + */ + public function passed() + { + return $this->passed; + } + + /** + * Returns the (top) test suite. + * + * @return PHPUnit_Framework_TestSuite + */ + public function topTestSuite() + { + return $this->topTestSuite; + } + + /** + * Returns whether code coverage information should be collected. + * + * @return bool If code coverage should be collected + */ + 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(); + + $coversNothing = false; + + if ($test instanceof PHPUnit_Framework_TestCase) { + $test->setRegisterMockObjectsFromTestArgumentsRecursively( + $this->registerMockObjectsFromTestArgumentsRecursively + ); + + $annotations = $test->getAnnotations(); + + if (isset($annotations['class']['coversNothing']) || isset($annotations['method']['coversNothing'])) { + $coversNothing = true; + } + } + + $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 && + !$coversNothing; + + 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 (PHP_Invoker_TimeoutException $e) { + $this->addFailure( + $test, + new PHPUnit_Framework_RiskyTestError( + $e->getMessage() + ), + $_timeout + ); + + $risky = true; + } catch (PHPUnit_Framework_MockObject_Exception $e) { + $e = new PHPUnit_Framework_Warning( + $e->getMessage() + ); + + $warning = true; + } 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) { + // @see https://github.com/sebastianbergmann/phpunit/issues/2394 + if (PHP_MAJOR_VERSION === 7 && $e instanceof \AssertionError) { + $test->addToAssertionCount(1); + + $failure = true; + $frame = $e->getTrace()[0]; + + $e = new PHPUnit_Framework_AssertionFailedError( + sprintf( + '%s in %s:%s', + $e->getMessage(), + $frame['file'], + $frame['line'] + ) + ); + } else { + $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) { + try { + $linesToBeCovered = PHPUnit_Util_Test::getLinesToBeCovered( + get_class($test), + $test->getName(false) + ); + + $linesToBeUsed = PHPUnit_Util_Test::getLinesToBeUsed( + get_class($test), + $test->getName(false) + ); + } catch (PHPUnit_Framework_InvalidCoversTargetException $cce) { + $this->addWarning( + $test, + new PHPUnit_Framework_Warning( + $cce->getMessage() + ), + $time + ); + } + } + + try { + $this->codeCoverage->stop( + $append, + $linesToBeCovered, + $linesToBeUsed + ); + } catch (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 (CoveredCodeNotExecutedException $cce) { + $this->addFailure( + $test, + new PHPUnit_Framework_CoveredCodeNotExecutedException( + 'This test did not execute all the code that is listed as code to be covered:' . + PHP_EOL . $cce->getMessage() + ), + $time + ); + } catch (MissingCoversAnnotationException $cce) { + if ($linesToBeCovered !== false) { + $this->addFailure( + $test, + new PHPUnit_Framework_MissingCoversAnnotationException( + 'This test does not have a @covers annotation but is expected to have one' + ), + $time + ); + } + } catch (CodeCoverageException $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->doesNotPerformAssertions() && + $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 code coverage object. + * + * @return CodeCoverage + */ + public function getCodeCoverage() + { + return $this->codeCoverage; + } + + /** + * Sets the code coverage object. + * + * @param CodeCoverage $codeCoverage + */ + public function setCodeCoverage(CodeCoverage $codeCoverage) + { + $this->codeCoverage = $codeCoverage; + } + + /** + * Enables or disables the error-to-exception conversion. + * + * @param bool $flag + * + * @throws PHPUnit_Framework_Exception + */ + 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 + */ + public function getConvertErrorsToExceptions() + { + return $this->convertErrorsToExceptions; + } + + /** + * Enables or disables the stopping when an error occurs. + * + * @param bool $flag + * + * @throws PHPUnit_Framework_Exception + */ + 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 + */ + 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 + */ + 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 + */ + public function beStrictAboutTestsThatDoNotTestAnything($flag) + { + if (!is_bool($flag)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); + } + + $this->beStrictAboutTestsThatDoNotTestAnything = $flag; + } + + /** + * @return bool + */ + public function isStrictAboutTestsThatDoNotTestAnything() + { + return $this->beStrictAboutTestsThatDoNotTestAnything; + } + + /** + * @param bool $flag + * + * @throws PHPUnit_Framework_Exception + */ + public function beStrictAboutOutputDuringTests($flag) + { + if (!is_bool($flag)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); + } + + $this->beStrictAboutOutputDuringTests = $flag; + } + + /** + * @return bool + */ + public function isStrictAboutOutputDuringTests() + { + return $this->beStrictAboutOutputDuringTests; + } + + /** + * @param bool $flag + * + * @throws PHPUnit_Framework_Exception + */ + public function beStrictAboutResourceUsageDuringSmallTests($flag) + { + if (!is_bool($flag)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); + } + + $this->beStrictAboutResourceUsageDuringSmallTests = $flag; + } + + /** + * @return bool + */ + public function isStrictAboutResourceUsageDuringSmallTests() + { + return $this->beStrictAboutResourceUsageDuringSmallTests; + } + + /** + * @param bool $flag + * + * @throws PHPUnit_Framework_Exception + */ + public function enforceTimeLimit($flag) + { + if (!is_bool($flag)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); + } + + $this->enforceTimeLimit = $flag; + } + + /** + * @return bool + */ + public function enforcesTimeLimit() + { + return $this->enforceTimeLimit; + } + + /** + * @param bool $flag + * + * @throws PHPUnit_Framework_Exception + */ + public function beStrictAboutTodoAnnotatedTests($flag) + { + if (!is_bool($flag)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); + } + + $this->beStrictAboutTodoAnnotatedTests = $flag; + } + + /** + * @return bool + */ + public function isStrictAboutTodoAnnotatedTests() + { + return $this->beStrictAboutTodoAnnotatedTests; + } + + /** + * Enables or disables the stopping for risky tests. + * + * @param bool $flag + * + * @throws PHPUnit_Framework_Exception + */ + 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 + */ + 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 + */ + 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. + * + * @param bool $includeWarnings + * + * @return bool + */ + public function wasSuccessful($includeWarnings = true) + { + if ($includeWarnings) { + return empty($this->errors) && empty($this->failures) && empty($this->warnings); + } else { + return empty($this->errors) && empty($this->failures); + } + } + + /** + * Sets the timeout for small tests. + * + * @param int $timeout + * + * @throws PHPUnit_Framework_Exception + */ + public function setTimeoutForSmallTests($timeout) + { + if (!is_int($timeout)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer'); + } + + $this->timeoutForSmallTests = $timeout; + } + + /** + * Sets the timeout for medium tests. + * + * @param int $timeout + * + * @throws PHPUnit_Framework_Exception + */ + public function setTimeoutForMediumTests($timeout) + { + if (!is_int($timeout)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer'); + } + + $this->timeoutForMediumTests = $timeout; + } + + /** + * Sets the timeout for large tests. + * + * @param int $timeout + * + * @throws PHPUnit_Framework_Exception + */ + public function setTimeoutForLargeTests($timeout) + { + if (!is_int($timeout)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer'); + } + + $this->timeoutForLargeTests = $timeout; + } + + /** + * Returns the set timeout for large tests. + * + * @return int + */ + public function getTimeoutForLargeTests() + { + return $this->timeoutForLargeTests; + } + + /** + * @param bool $flag + */ + public function setRegisterMockObjectsFromTestArgumentsRecursively($flag) + { + if (!is_bool($flag)) { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); + } + + $this->registerMockObjectsFromTestArgumentsRecursively = $flag; + } + + /** + * 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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/TestSuite.php b/.phpunit/phpunit-5.7/src/Framework/TestSuite.php new file mode 100644 index 0000000..0ed6be4 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/TestSuite.php @@ -0,0 +1,1000 @@ + + * + * 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. + */ +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; + + /** + * @var string[] + */ + private $declaredClasses; + + /** + * 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 = '') + { + $this->declaredClasses = get_declared_classes(); + + $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; + } + } + + if ($test instanceof PHPUnit_Framework_TestCase) { + $test->setGroups($groups); + } + } + } + + /** + * 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() && $testClass->isSubclassOf(PHPUnit_Framework_TestCase::class)) { + $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 + */ + 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. + $filename = PHPUnit_Util_Fileloader::checkAndLoad($filename); + $newClasses = array_diff(get_declared_classes(), $this->declaredClasses); + + // 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 (!empty($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); + $this->declaredClasses = get_declared_classes(); + } + + // 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) { + if (strpos($className, 'PHPUnit_Framework') === 0) { + continue; + } + + $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 + */ + 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 + */ + public function getGroups() + { + return array_keys($this->groups); + } + + public function getGroupDetails() + { + return $this->groups; + } + + /** + * Set tests groups of the test case + * + * @param array $groups + */ + 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++) { + if ($result->shouldStop()) { + break; + } + + $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 + */ + 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|false + * + * @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 + */ + public function setTests(array $tests) + { + $this->tests = $tests; + } + + /** + * Mark the test suite as skipped. + * + * @param string $message + * + * @throws PHPUnit_Framework_SkippedTestSuiteError + */ + 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() + $docComment = $method->getDocComment(); + + return strpos($docComment, '@test') !== false || + strpos($docComment, '@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 + */ + 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 + */ + protected static function incompleteTest($class, $methodName, $message) + { + return new PHPUnit_Framework_IncompleteTestCase($class, $methodName, $message); + } + + /** + * @param bool $beStrictAboutChangesToGlobalState + */ + public function setBeStrictAboutChangesToGlobalState($beStrictAboutChangesToGlobalState) + { + if (is_null($this->beStrictAboutChangesToGlobalState) && is_bool($beStrictAboutChangesToGlobalState)) { + $this->beStrictAboutChangesToGlobalState = $beStrictAboutChangesToGlobalState; + } + } + + /** + * @param bool $backupGlobals + */ + public function setBackupGlobals($backupGlobals) + { + if (is_null($this->backupGlobals) && is_bool($backupGlobals)) { + $this->backupGlobals = $backupGlobals; + } + } + + /** + * @param bool $backupStaticAttributes + */ + public function setBackupStaticAttributes($backupStaticAttributes) + { + if (is_null($this->backupStaticAttributes) && + is_bool($backupStaticAttributes)) { + $this->backupStaticAttributes = $backupStaticAttributes; + } + } + + /** + * Returns an iterator for this test suite. + * + * @return RecursiveIteratorIterator + */ + 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. + */ + protected function setUp() + { + } + + /** + * Template Method that is called after the tests + * of this test suite have finished running. + */ + protected function tearDown() + { + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/TestSuite/DataProvider.php b/.phpunit/phpunit-5.7/src/Framework/TestSuite/DataProvider.php new file mode 100644 index 0000000..2f4d748 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/TestSuite/DataProvider.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +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); + } + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/UnintentionallyCoveredCodeError.php b/.phpunit/phpunit-5.7/src/Framework/UnintentionallyCoveredCodeError.php new file mode 100644 index 0000000..8cdd7f8 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/UnintentionallyCoveredCodeError.php @@ -0,0 +1,17 @@ + + * + * 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 unintentionally covers code. + */ +class PHPUnit_Framework_UnintentionallyCoveredCodeError extends PHPUnit_Framework_RiskyTestError +{ +} diff --git a/.phpunit/phpunit-5.7/src/Framework/Warning.php b/.phpunit/phpunit-5.7/src/Framework/Warning.php new file mode 100644 index 0000000..70ccf9a --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/Warning.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Thrown when there is a warning. + */ +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(); + } +} diff --git a/.phpunit/phpunit-5.7/src/Framework/WarningTestCase.php b/.phpunit/phpunit-5.7/src/Framework/WarningTestCase.php new file mode 100644 index 0000000..8ba2cce --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Framework/WarningTestCase.php @@ -0,0 +1,75 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * A warning. + */ +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 + */ + public function getMessage() + { + return $this->message; + } + + /** + * Returns a string representation of the test case. + * + * @return string + */ + public function toString() + { + return 'Warning'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Runner/BaseTestRunner.php b/.phpunit/phpunit-5.7/src/Runner/BaseTestRunner.php new file mode 100644 index 0000000..789b90b --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Runner/BaseTestRunner.php @@ -0,0 +1,139 @@ + + * + * 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. + */ +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); +} diff --git a/.phpunit/phpunit-5.7/src/Runner/Exception.php b/.phpunit/phpunit-5.7/src/Runner/Exception.php new file mode 100644 index 0000000..9eef43f --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Runner/Exception.php @@ -0,0 +1,13 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +class PHPUnit_Runner_Exception extends RuntimeException implements PHPUnit_Exception +{ +} diff --git a/.phpunit/phpunit-5.7/src/Runner/Filter/Factory.php b/.phpunit/phpunit-5.7/src/Runner/Filter/Factory.php new file mode 100644 index 0000000..b841ac6 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Runner/Filter/Factory.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Runner/Filter/Group.php b/.phpunit/phpunit-5.7/src/Runner/Filter/Group.php new file mode 100644 index 0000000..23a8f86 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Runner/Filter/Group.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +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); +} diff --git a/.phpunit/phpunit-5.7/src/Runner/Filter/Group/Exclude.php b/.phpunit/phpunit-5.7/src/Runner/Filter/Group/Exclude.php new file mode 100644 index 0000000..e07a4f9 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Runner/Filter/Group/Exclude.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +class PHPUnit_Runner_Filter_Group_Exclude extends PHPUnit_Runner_Filter_GroupFilterIterator +{ + /** + * @param string $hash + * + * @return bool + */ + protected function doAccept($hash) + { + return !in_array($hash, $this->groupTests); + } +} diff --git a/.phpunit/phpunit-5.7/src/Runner/Filter/Group/Include.php b/.phpunit/phpunit-5.7/src/Runner/Filter/Group/Include.php new file mode 100644 index 0000000..3193842 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Runner/Filter/Group/Include.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +class PHPUnit_Runner_Filter_Group_Include extends PHPUnit_Runner_Filter_GroupFilterIterator +{ + /** + * @param string $hash + * + * @return bool + */ + protected function doAccept($hash) + { + return in_array($hash, $this->groupTests); + } +} diff --git a/.phpunit/phpunit-5.7/src/Runner/Filter/Test.php b/.phpunit/phpunit-5.7/src/Runner/Filter/Test.php new file mode 100644 index 0000000..99ceb76 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Runner/Filter/Test.php @@ -0,0 +1,117 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +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; + } + + if ($test instanceof PHPUnit_Framework_WarningTestCase) { + $name = $test->getMessage(); + } else { + $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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Runner/StandardTestSuiteLoader.php b/.phpunit/phpunit-5.7/src/Runner/StandardTestSuiteLoader.php new file mode 100644 index 0000000..79a9203 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Runner/StandardTestSuiteLoader.php @@ -0,0 +1,116 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * The standard test suite loader. + */ +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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Runner/TestSuiteLoader.php b/.phpunit/phpunit-5.7/src/Runner/TestSuiteLoader.php new file mode 100644 index 0000000..338486b --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Runner/TestSuiteLoader.php @@ -0,0 +1,30 @@ + + * + * 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. + */ +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); +} diff --git a/.phpunit/phpunit-5.7/src/Runner/Version.php b/.phpunit/phpunit-5.7/src/Runner/Version.php new file mode 100644 index 0000000..9fe325e --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Runner/Version.php @@ -0,0 +1,73 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use SebastianBergmann\Version; + +/** + * This class defines the current version of PHPUnit. + */ +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 Version('5.7.27', dirname(dirname(__DIR__))); + self::$version = $version->getVersion(); + } + + return self::$version; + } + + /** + * @return string + */ + public static function series() + { + if (strpos(self::id(), '-')) { + $version = explode('-', self::id())[0]; + } else { + $version = self::id(); + } + + return implode('.', array_slice(explode('.', $version), 0, 2)); + } + + /** + * @return string + */ + public static function getVersionString() + { + return 'PHPUnit ' . self::id() . ' by Sebastian Bergmann and contributors.'; + } + + /** + * @return string + */ + public static function getReleaseChannel() + { + if (strpos(self::$pharVersion, '-') !== false) { + return '-nightly'; + } + + return ''; + } +} diff --git a/.phpunit/phpunit-5.7/src/TextUI/Command.php b/.phpunit/phpunit-5.7/src/TextUI/Command.php new file mode 100644 index 0000000..1bed290 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/TextUI/Command.php @@ -0,0 +1,1172 @@ + + * + * 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. + */ +class PHPUnit_TextUI_Command +{ + /** + * @var array + */ + protected $arguments = [ + 'listGroups' => false, + 'listSuites' => false, + 'loader' => null, + 'useDefaultConfiguration' => true, + 'loadedExtensions' => [], + 'notLoadedExtensions' => [] + ]; + + /** + * @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, + 'generate-configuration' => null, + 'group=' => null, + 'help' => null, + 'include-path=' => null, + 'list-groups' => null, + 'list-suites' => null, + 'loader=' => null, + 'log-json=' => null, + 'log-junit=' => null, + 'log-tap=' => null, + 'log-teamcity=' => null, + 'no-configuration' => null, + 'no-coverage' => null, + 'no-extensions' => 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, + 'fail-on-warning' => null, + 'fail-on-risky' => null, + 'strict-coverage' => null, + 'disable-coverage-ignore' => null, + 'strict-global-state' => null, + 'tap' => null, + 'teamcity' => null, + 'testdox' => null, + 'testdox-group=' => null, + 'testdox-exclude-group=' => null, + 'testdox-html=' => null, + 'testdox-text=' => null, + 'testdox-xml=' => 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; + } + } + + if ($this->arguments['listSuites']) { + $this->printVersionString(); + + print "Available test suite(s):\n"; + + $configuration = PHPUnit_Util_Configuration::getInstance( + $this->arguments['configuration'] + ); + + $suiteNames = $configuration->getTestSuiteNames(); + foreach ($suiteNames as $suiteName) { + print " - $suiteName\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, $exit); + } catch (PHPUnit_Framework_Exception $e) { + print $e->getMessage() . "\n"; + } + + $return = PHPUnit_TextUI_TestRunner::FAILURE_EXIT; + + if (isset($result) && $result->wasSuccessful(false)) { + $return = PHPUnit_TextUI_TestRunner::SUCCESS_EXIT; + } elseif (!isset($result) || $result->errorCount() > 0) { + $return = PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT; + } + + if ($exit) { + exit($return); + } + + return $return; + } + + /** + * Create a TestRunner, override in subclasses. + * + * @return PHPUnit_TextUI_TestRunner + */ + 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 '--generate-configuration': + $this->printVersionString(); + + printf( + "Generating phpunit.xml in %s\n\n", + getcwd() + ); + + print 'Bootstrap script (relative to path shown above; default: vendor/autoload.php): '; + $bootstrapScript = trim(fgets(STDIN)); + + print 'Tests directory (relative to path shown above; default: tests): '; + $testsDirectory = trim(fgets(STDIN)); + + print 'Source directory (relative to path shown above; default: src): '; + $src = trim(fgets(STDIN)); + + if ($bootstrapScript == '') { + $bootstrapScript = 'vendor/autoload.php'; + } + + if ($testsDirectory == '') { + $testsDirectory = 'tests'; + } + + if ($src == '') { + $src = 'src'; + } + + $generator = new PHPUnit_Util_ConfigurationGenerator; + + file_put_contents( + 'phpunit.xml', + $generator->generateDefaultConfiguration( + PHPUnit_Runner_Version::series(), + $bootstrapScript, + $testsDirectory, + $src + ) + ); + + printf( + "\nGenerated phpunit.xml in %s\n", + getcwd() + ); + + exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); + 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 '--list-suites': + $this->arguments['listSuites'] = 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 '--fail-on-warning': + $this->arguments['failOnWarning'] = true; + break; + + case '--fail-on-risky': + $this->arguments['failOnRisky'] = 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-group': + $this->arguments['testdoxGroups'] = explode( + ',', + $option[1] + ); + break; + + case '--testdox-exclude-group': + $this->arguments['testdoxExcludeGroups'] = explode( + ',', + $option[1] + ); + break; + + case '--testdox-html': + $this->arguments['testdoxHTMLFile'] = $option[1]; + break; + + case '--testdox-text': + $this->arguments['testdoxTextFile'] = $option[1]; + break; + + case '--testdox-xml': + $this->arguments['testdoxXMLFile'] = $option[1]; + break; + + case '--no-configuration': + $this->arguments['useDefaultConfiguration'] = false; + break; + + case '--no-extensions': + $this->arguments['noExtensions'] = true; + 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 '--disable-coverage-ignore': + $this->arguments['disableCodeCoverageIgnore'] = 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]); + + $handler = null; + 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['extensionsDirectory']) && !isset($this->arguments['noExtensions']) && extension_loaded('phar')) { + $this->handleExtensions($phpunitConfiguration['extensionsDirectory']); + } + + 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|string + */ + 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()); + } + } + + protected function handleSelfUpdate($upgrade = false) + { + $this->printVersionString(); + + if ($upgrade) { + print "Warning: Deprecated --self-upgrade used\n\n"; + } else { + print "Warning: Deprecated --self-update used\n\n"; + } + + $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); + } + + 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. + --disable-coverage-ignore Disable annotations for ignoring code coverage. + +Logging Options: + + --log-junit Log test execution in JUnit XML format to file. + --log-teamcity Log test execution in TeamCity format to file. + --testdox-html Write agile documentation in HTML format to file. + --testdox-text Write agile documentation in Text format to file. + --testdox-xml Write agile documentation in XML 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. + --list-suites List available test suites. + --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 @covers annotation usage. + --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. + --fail-on-warning Treat tests with warnings as failures. + --fail-on-risky Treat risky tests as failures. + -v|--verbose Output more verbose information. + --debug Display debugging information during test execution. + + --loader TestSuiteLoader implementation to use. + --repeat Runs the test(s) repeatedly. + --teamcity Report test execution progress in TeamCity format. + --testdox Report test execution progress in TestDox format. + --testdox-group Only include tests from the specified group(s). + --testdox-exclude-group Exclude tests from the specified group(s). + --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. + --no-extensions Do not load PHPUnit extensions. + --include-path Prepend PHP's include_path with given path(s). + -d key[=value] Sets a php.ini value. + --generate-configuration Generate configuration file with suggested settings. + +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."; + } + } + + /** + * 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; + } + + /** + * @param string $message + */ + private function showError($message) + { + $this->printVersionString(); + + print $message . "\n"; + + exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT); + } + + /** + * @param string $directory + */ + private function handleExtensions($directory) + { + $facade = new File_Iterator_Facade; + + foreach ($facade->getFilesAsArray($directory, '.phar') as $file) { + require $file; + + $this->arguments['loadedExtensions'][] = $file; + } + } +} diff --git a/.phpunit/phpunit-5.7/src/TextUI/ResultPrinter.php b/.phpunit/phpunit-5.7/src/TextUI/ResultPrinter.php new file mode 100644 index 0000000..b279993 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/TextUI/ResultPrinter.php @@ -0,0 +1,680 @@ + + * + * 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. + */ +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; + + /** + * @var bool + */ + private $defectListPrinted = 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 + */ + 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); + $this->printWarnings($result); + $this->printFailures($result); + + if ($this->verbose) { + $this->printRisky($result); + $this->printIncompletes($result); + $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; + } + + if ($this->defectListPrinted) { + $this->write("\n--\n\n"); + } + + $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++); + } + + $this->defectListPrinted = true; + } + + /** + * @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 + */ + protected function printRisky(PHPUnit_Framework_TestResult $result) + { + $this->printDefects($result->risky(), 'risky test'); + } + + /** + * @param PHPUnit_Framework_TestResult $result + */ + 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!' + ); + + return; + } + + if ($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 { + $this->write("\n"); + + if ($result->errorCount()) { + $color = 'fg-white, bg-red'; + + $this->writeWithColor( + $color, + 'ERRORS!' + ); + } elseif ($result->failureCount()) { + $color = 'fg-white, bg-red'; + + $this->writeWithColor( + $color, + 'FAILURES!' + ); + } elseif ($result->warningCount()) { + $color = 'fg-black, bg-yellow'; + + $this->writeWithColor( + $color, + 'WARNINGS!' + ); + } + } + + $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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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; + } + } +} diff --git a/.phpunit/phpunit-5.7/src/TextUI/TestRunner.php b/.phpunit/phpunit-5.7/src/TextUI/TestRunner.php new file mode 100644 index 0000000..5e17a25 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/TextUI/TestRunner.php @@ -0,0 +1,1142 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use SebastianBergmann\CodeCoverage\CodeCoverage; +use SebastianBergmann\CodeCoverage\Exception as CodeCoverageException; +use SebastianBergmann\CodeCoverage\Filter as CodeCoverageFilter; +use SebastianBergmann\CodeCoverage\Report\Clover as CloverReport; +use SebastianBergmann\CodeCoverage\Report\Crap4j as Crap4jReport; +use SebastianBergmann\CodeCoverage\Report\Html\Facade as HtmlReport; +use SebastianBergmann\CodeCoverage\Report\PHP as PhpReport; +use SebastianBergmann\CodeCoverage\Report\Text as TextReport; +use SebastianBergmann\CodeCoverage\Report\Xml\Facade as XmlReport; +use SebastianBergmann\Environment\Runtime; + +/** + * A TestRunner for the Command Line Interface (CLI) + * PHP SAPI Module. + */ +class PHPUnit_TextUI_TestRunner extends PHPUnit_Runner_BaseTestRunner +{ + const SUCCESS_EXIT = 0; + const FAILURE_EXIT = 1; + const EXCEPTION_EXIT = 2; + + /** + * @var CodeCoverageFilter + */ + 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 CodeCoverageFilter $filter + */ + public function __construct(PHPUnit_Runner_TestSuiteLoader $loader = null, CodeCoverageFilter $filter = null) + { + if ($filter === null) { + $filter = new CodeCoverageFilter; + } + + $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; + } + + /** + * @param PHPUnit_Framework_TestSuite $suite + * @param array $arguments + */ + 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 + * @param bool $exit + * + * @return PHPUnit_Framework_TestResult + */ + public function doRun(PHPUnit_Framework_Test $suite, array $arguments = [], $exit = true) + { + 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_int($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 ($arguments['registerMockObjectsFromTestArgumentsRecursively']) { + $result->setRegisterMockObjectsFromTestArgumentsRecursively(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']) && $arguments['stderr'] === true) ? '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['loadedExtensions'] as $extension) { + $this->writeMessage( + 'Extension', + $extension + ); + } + + foreach ($arguments['notLoadedExtensions'] as $extension) { + $this->writeMessage( + 'Extension', + $extension + ); + } + } + + if (isset($arguments['deprecatedCheckForUnintentionallyCoveredCodeSettingUsed'])) { + $this->writeMessage('Warning', 'Deprecated configuration setting "checkForUnintentionallyCoveredCode" used'); + } + + if (isset($arguments['tapLogfile'])) { + $this->writeMessage('Warning', 'Deprecated TAP test listener used'); + } + + if (isset($arguments['jsonLogfile'])) { + $this->writeMessage('Warning', 'Deprecated JSON test listener used'); + } + } + + 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'], + $arguments['testdoxGroups'], + $arguments['testdoxExcludeGroups'] + ) + ); + } + + if (isset($arguments['testdoxTextFile'])) { + $result->addListener( + new PHPUnit_Util_TestDox_ResultPrinter_Text( + $arguments['testdoxTextFile'], + $arguments['testdoxGroups'], + $arguments['testdoxExcludeGroups'] + ) + ); + } + + if (isset($arguments['testdoxXMLFile'])) { + $result->addListener( + new PHPUnit_Util_TestDox_ResultPrinter_XML( + $arguments['testdoxXMLFile'] + ) + ); + } + + $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 && !$this->runtime->canCollectCodeCoverage()) { + $this->writeMessage('Error', 'No code coverage driver is available'); + + $codeCoverageReports = 0; + } + + if (!$this->printer instanceof PHPUnit_Util_Log_TAP) { + $this->printer->write("\n"); + } + + if ($codeCoverageReports > 0) { + $codeCoverage = new CodeCoverage( + null, + $this->codeCoverageFilter + ); + + $codeCoverage->setUnintentionallyCoveredSubclassesWhitelist( + [SebastianBergmann\Comparator\Comparator::class] + ); + + $codeCoverage->setCheckForUnintentionallyCoveredCode( + $arguments['strictCoverage'] + ); + + $codeCoverage->setCheckForMissingCoversAnnotation( + $arguments['strictCoverage'] + ); + + if (isset($arguments['forceCoversAnnotation'])) { + $codeCoverage->setForceCoversAnnotation( + $arguments['forceCoversAnnotation'] + ); + } + + if (isset($arguments['disableCodeCoverageIgnore'])) { + $codeCoverage->setDisableIgnoredLines(true); + } + + if (isset($arguments['whitelist'])) { + $this->codeCoverageFilter->addDirectoryToWhitelist($arguments['whitelist']); + } + + if (isset($arguments['configuration'])) { + $filterConfiguration = $arguments['configuration']->getFilterConfiguration(); + + $codeCoverage->setAddUncoveredFilesFromWhitelist( + $filterConfiguration['whitelist']['addUncoveredFilesFromWhitelist'] + ); + + $codeCoverage->setProcessUncoveredFilesFromWhitelist( + $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); + } + } + + if (!$this->codeCoverageFilter->hasWhitelist()) { + $this->writeMessage('Error', 'No whitelist configured, no code coverage will be generated'); + + $codeCoverageReports = 0; + + unset($codeCoverage); + } + } + + if (isset($codeCoverage)) { + $result->setCodeCoverage($codeCoverage); + + if ($codeCoverageReports > 1 && 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 CloverReport(); + $writer->process($codeCoverage, $arguments['coverageClover']); + + $this->printer->write(" done\n"); + unset($writer); + } catch (CodeCoverageException $e) { + $this->printer->write( + " failed\n" . $e->getMessage() . "\n" + ); + } + } + + if (isset($arguments['coverageCrap4J'])) { + $this->printer->write( + "\nGenerating Crap4J report XML file ..." + ); + + try { + $writer = new Crap4jReport($arguments['crap4jThreshold']); + $writer->process($codeCoverage, $arguments['coverageCrap4J']); + + $this->printer->write(" done\n"); + unset($writer); + } catch (CodeCoverageException $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 HtmlReport( + $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 (CodeCoverageException $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 PhpReport(); + $writer->process($codeCoverage, $arguments['coveragePHP']); + + $this->printer->write(" done\n"); + unset($writer); + } catch (CodeCoverageException $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 TextReport( + $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 XmlReport; + $writer->process($codeCoverage, $arguments['coverageXml']); + + $this->printer->write(" done\n"); + unset($writer); + } catch (CodeCoverageException $e) { + $this->printer->write( + " failed\n" . $e->getMessage() . "\n" + ); + } + } + } + + if ($exit) { + if ($result->wasSuccessful(false)) { + if ($arguments['failOnRisky'] && !$result->allHarmless()) { + exit(self::FAILURE_EXIT); + } + + if ($arguments['failOnWarning'] && $result->warningCount() > 0) { + exit(self::FAILURE_EXIT); + } + + exit(self::SUCCESS_EXIT); + } + + if ($result->errorCount() > 0) { + exit(self::EXCEPTION_EXIT); + } + + if ($result->failureCount() > 0) { + exit(self::FAILURE_EXIT); + } + } + + 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 + */ + protected function write($buffer) + { + if (PHP_SAPI != 'cli' && PHP_SAPI != 'phpdbg') { + $buffer = htmlspecialchars($buffer); + } + + if ($this->printer !== null) { + $this->printer->write($buffer); + } else { + print $buffer; + } + } + + /** + * Returns the loader to be used. + * + * @return PHPUnit_Runner_TestSuiteLoader + */ + public function getLoader() + { + if ($this->loader === null) { + $this->loader = new PHPUnit_Runner_StandardTestSuiteLoader; + } + + return $this->loader; + } + + /** + * @param array $arguments + */ + 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['deprecatedCheckForUnintentionallyCoveredCodeSettingUsed'])) { + $arguments['deprecatedCheckForUnintentionallyCoveredCodeSettingUsed'] = true; + } + + 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['failOnWarning']) && + !isset($arguments['failOnWarning'])) { + $arguments['failOnWarning'] = $phpunitConfiguration['failOnWarning']; + } + + if (isset($phpunitConfiguration['failOnRisky']) && + !isset($arguments['failOnRisky'])) { + $arguments['failOnRisky'] = $phpunitConfiguration['failOnRisky']; + } + + 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['disableCodeCoverageIgnore']) && + !isset($arguments['disableCodeCoverageIgnore'])) { + $arguments['disableCodeCoverageIgnore'] = $phpunitConfiguration['disableCodeCoverageIgnore']; + } + + if (isset($phpunitConfiguration['registerMockObjectsFromTestArgumentsRecursively']) && + !isset($arguments['registerMockObjectsFromTestArgumentsRecursively'])) { + $arguments['registerMockObjectsFromTestArgumentsRecursively'] = $phpunitConfiguration['registerMockObjectsFromTestArgumentsRecursively']; + } + + $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'])) { + throw new PHPUnit_Framework_Exception( + sprintf( + 'Class "%s" does not exist', + $listener['class'] + ) + ); + } + + $listenerClass = new ReflectionClass($listener['class']); + + if (!$listenerClass->implementsInterface(PHPUnit_Framework_TestListener::class)) { + throw new PHPUnit_Framework_Exception( + sprintf( + 'Class "%s" does not implement the PHPUnit_Framework_TestListener interface', + $listener['class'] + ) + ); + } + + if (count($listener['arguments']) == 0) { + $listener = new $listener['class']; + } else { + $listener = $listenerClass->newInstanceArgs( + $listener['arguments'] + ); + } + + $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($loggingConfiguration['testdox-xml']) && + !isset($arguments['testdoxXMLFile'])) { + $arguments['testdoxXMLFile'] = $loggingConfiguration['testdox-xml']; + } + + $testdoxGroupConfiguration = $arguments['configuration']->getTestdoxGroupConfiguration(); + + if (isset($testdoxGroupConfiguration['include']) && + !isset($arguments['testdoxGroups'])) { + $arguments['testdoxGroups'] = $testdoxGroupConfiguration['include']; + } + + if (isset($testdoxGroupConfiguration['exclude']) && + !isset($arguments['testdoxExcludeGroups'])) { + $arguments['testdoxExcludeGroups'] = $testdoxGroupConfiguration['exclude']; + } + } + + $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['failOnWarning'] = isset($arguments['failOnWarning']) ? $arguments['failOnWarning'] : false; + $arguments['failOnRisky'] = isset($arguments['failOnRisky']) ? $arguments['failOnRisky'] : 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['registerMockObjectsFromTestArgumentsRecursively'] = isset($arguments['registerMockObjectsFromTestArgumentsRecursively']) ? $arguments['registerMockObjectsFromTestArgumentsRecursively'] : false; + $arguments['verbose'] = isset($arguments['verbose']) ? $arguments['verbose'] : false; + $arguments['testdoxExcludeGroups'] = isset($arguments['testdoxExcludeGroups']) ? $arguments['testdoxExcludeGroups'] : []; + $arguments['testdoxGroups'] = isset($arguments['testdoxGroups']) ? $arguments['testdoxGroups'] : []; + } + + /** + * @param string $type + * @param string $message + */ + private function writeMessage($type, $message) + { + if (!$this->messagePrinted) { + $this->write("\n"); + } + + $this->write( + sprintf( + "%-15s%s\n", + $type . ':', + $message + ) + ); + + $this->messagePrinted = true; + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/Blacklist.php b/.phpunit/phpunit-5.7/src/Util/Blacklist.php new file mode 100644 index 0000000..a140917 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/Blacklist.php @@ -0,0 +1,111 @@ + + * + * 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. + */ +class PHPUnit_Util_Blacklist +{ + /** + * @var array + */ + public static $blacklistedClassNames = [ + 'File_Iterator' => 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\CodeCoverage\CodeCoverage' => 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 + */ + 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'; + } + } + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/Configuration.php b/.phpunit/phpunit-5.7/src/Util/Configuration.php new file mode 100644 index 0000000..d91825d --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/Configuration.php @@ -0,0 +1,1135 @@ + + * + * 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 + * + * + * + * + * + * name + * + * + * name + * + * + * + * + * + * /path/to/files + * /path/to/file + * + * /path/to/files + * /path/to/file + * + * + * + * + * + * + * + * + * + * Sebastian + * + * + * 22 + * April + * 19.78 + * + * + * MyRelativeFile.php + * MyRelativeDir + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * . + * + * + * + * + * + * + * + * + * + * + * + * + * + */ +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); + } + + final private function __clone() + { + } + + /** + * Returns a PHPUnit configuration object. + * + * @param string $filename + * + * @return PHPUnit_Util_Configuration + */ + 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 + */ + public function getFilename() + { + return $this->filename; + } + + /** + * Returns the configuration for SUT filtering. + * + * @return array + */ + 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 + */ + public function getGroupConfiguration() + { + return $this->parseGroupConfiguration('groups'); + } + + /** + * Returns the configuration for testdox groups. + * + * @return array + */ + public function getTestdoxGroupConfiguration() + { + return $this->parseGroupConfiguration('testdoxGroups'); + } + + /** + * @param string $root + * + * @return array + */ + private function parseGroupConfiguration($root) + { + $groups = [ + 'include' => [], + 'exclude' => [] + ]; + + foreach ($this->xpath->query($root . '/include/group') as $group) { + $groups['include'][] = (string) $group->textContent; + } + + foreach ($this->xpath->query($root . '/exclude/group') as $group) { + $groups['exclude'][] = (string) $group->textContent; + } + + return $groups; + } + + /** + * Returns the configuration for listeners. + * + * @return array + */ + 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 + */ + 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. + */ + 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 + */ + 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('disableCodeCoverageIgnore')) { + $result['disableCodeCoverageIgnore'] = $this->getBoolean( + (string) $root->getAttribute('disableCodeCoverageIgnore'), + 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('failOnWarning')) { + $result['failOnWarning'] = $this->getBoolean( + (string) $root->getAttribute('failOnWarning'), + false + ); + } + + if ($root->hasAttribute('failOnRisky')) { + $result['failOnRisky'] = $this->getBoolean( + (string) $root->getAttribute('failOnRisky'), + 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('beStrictAboutCoversAnnotation')) { + $result['strictCoverage'] = $this->getBoolean( + (string) $root->getAttribute('beStrictAboutCoversAnnotation'), + false + ); + } elseif ($root->hasAttribute('checkForUnintentionallyCoveredCode')) { + $result['strictCoverage'] = $this->getBoolean( + (string) $root->getAttribute('checkForUnintentionallyCoveredCode'), + false + ); + + $result['deprecatedCheckForUnintentionallyCoveredCodeSettingUsed'] = true; + } + + 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 + ); + } + + if ($root->hasAttribute('registerMockObjectsFromTestArgumentsRecursively')) { + $result['registerMockObjectsFromTestArgumentsRecursively'] = $this->getBoolean( + (string) $root->getAttribute('registerMockObjectsFromTestArgumentsRecursively'), + false + ); + } + + if ($root->hasAttribute('extensionsDirectory')) { + $result['extensionsDirectory'] = $this->toAbsolutePath( + (string) $root->getAttribute( + 'extensionsDirectory' + ) + ); + } + + return $result; + } + + /** + * Returns the test suite configuration. + * + * @return PHPUnit_Framework_TestSuite + */ + 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; + } + } + + /** + * Returns the test suite names from the configuration. + * + * @return array + */ + public function getTestSuiteNames() + { + $names = []; + $nodes = $this->xpath->query('*/testsuite'); + foreach ($nodes as $node) { + $names[] = $node->getAttribute('name'); + } + + return $names; + } + + /** + * @param DOMElement $testSuiteNode + * + * @return PHPUnit_Framework_TestSuite + */ + 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 + */ + 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 + */ + protected function getInteger($value, $default) + { + if (is_numeric($value)) { + return (int) $value; + } + + return $default; + } + + /** + * @param string $query + * + * @return array + */ + 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 + */ + 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 + */ + protected function toAbsolutePath($path, $useIncludePath = false) + { + $path = trim($path); + + 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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/ConfigurationGenerator.php b/.phpunit/phpunit-5.7/src/Util/ConfigurationGenerator.php new file mode 100644 index 0000000..e1d9572 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/ConfigurationGenerator.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +class PHPUnit_Util_ConfigurationGenerator +{ + /** + * @var string + */ + private $defaultTemplate = << + + + {tests_directory} + + + + + {src_directory} + + + + +EOT; + + /** + * @param string $phpunitVersion + * @param string $bootstrapScript + * @param string $testsDirectory + * @param string $srcDirectory + * + * @return string + */ + public function generateDefaultConfiguration($phpunitVersion, $bootstrapScript, $testsDirectory, $srcDirectory) + { + return str_replace( + [ + '{phpunit_version}', + '{bootstrap_script}', + '{tests_directory}', + '{src_directory}' + ], + [ + $phpunitVersion, + $bootstrapScript, + $testsDirectory, + $srcDirectory + ], + $this->defaultTemplate + ); + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/ErrorHandler.php b/.phpunit/phpunit-5.7/src/Util/ErrorHandler.php new file mode 100644 index 0000000..f62b110 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/ErrorHandler.php @@ -0,0 +1,115 @@ + + * + * 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. + */ +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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/Fileloader.php b/.phpunit/phpunit-5.7/src/Util/Fileloader.php new file mode 100644 index 0000000..14b048c --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/Fileloader.php @@ -0,0 +1,68 @@ + + * + * 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. + */ +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 + */ + 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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/Filesystem.php b/.phpunit/phpunit-5.7/src/Util/Filesystem.php new file mode 100644 index 0000000..168c153 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/Filesystem.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Filesystem helpers. + */ +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 + */ + public static function classNameToFilename($className) + { + return str_replace( + ['_', '\\'], + DIRECTORY_SEPARATOR, + $className + ) . '.php'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/Filter.php b/.phpunit/phpunit-5.7/src/Util/Filter.php new file mode 100644 index 0000000..9b7d55e --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/Filter.php @@ -0,0 +1,103 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Utility class for code filtering. + */ +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 + */ + 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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/Getopt.php b/.phpunit/phpunit-5.7/src/Util/Getopt.php new file mode 100644 index 0000000..894778d --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/Getopt.php @@ -0,0 +1,164 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Command-line options parsing class. + */ +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); + + $args = array_map('trim', $args); + + while (false !== $arg = current($args)) { + $i = key($args); + next($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 ($i + 1 < $argLen) { + $opts[] = [$opt, substr($arg, $i + 1)]; + + break; + } + if (!(strlen($spec) > 2 && $spec[2] == ':')) { + if (false === $opt_arg = current($args)) { + throw new PHPUnit_Framework_Exception( + "option requires an argument -- $opt" + ); + } + next($args); + } + } + + $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)) { + if (false === $opt_arg = current($args)) { + throw new PHPUnit_Framework_Exception( + "option --$opt requires an argument" + ); + } + next($args); + } + } + } 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"); + } +} + diff --git a/.phpunit/phpunit-5.7/src/Util/GlobalState.php b/.phpunit/phpunit-5.7/src/Util/GlobalState.php new file mode 100644 index 0000000..7235823 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/GlobalState.php @@ -0,0 +1,214 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +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' + ]; + + /** + * @return string + */ + public static function getIncludedFilesAsString() + { + return static::processIncludedFilesAsString(get_included_files()); + } + + /** + * @param array $files + * + * @return string + */ + 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; + } + + /** + * @return string + */ + 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; + } + + /** + * @return string + */ + 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; + } + + /** + * @return string + */ + 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; + } + + /** + * @return array + */ + 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) . + ')'; + } + + /** + * @param array $array + * + * @return bool + */ + 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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/InvalidArgumentHelper.php b/.phpunit/phpunit-5.7/src/Util/InvalidArgumentHelper.php new file mode 100644 index 0000000..b7a8511 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/InvalidArgumentHelper.php @@ -0,0 +1,39 @@ + + * + * 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. + */ +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 + ) + ); + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/Log/JSON.php b/.phpunit/phpunit-5.7/src/Util/Log/JSON.php new file mode 100644 index 0000000..7576993 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/Log/JSON.php @@ -0,0 +1,254 @@ + + * + * 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. + */ +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), + PHPUnit_Framework_TestFailure::exceptionToString($e), + $test + ); + + $this->currentTestPass = false; + } + + /** + * A warning occurred. + * + * @param PHPUnit_Framework_Test $test + * @param PHPUnit_Framework_Warning $e + * @param float $time + */ + public function addWarning(PHPUnit_Framework_Test $test, PHPUnit_Framework_Warning $e, $time) + { + $this->writeCase( + 'warning', + $time, + PHPUnit_Util_Filter::getFilteredStacktrace($e, false), + PHPUnit_Framework_TestFailure::exceptionToString($e), + $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), + PHPUnit_Framework_TestFailure::exceptionToString($e), + $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 + */ + 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)); + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/Log/JUnit.php b/.phpunit/phpunit-5.7/src/Util/Log/JUnit.php new file mode 100644 index 0000000..2beda32 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/Log/JUnit.php @@ -0,0 +1,450 @@ + + * + * 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. + */ +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 + */ + public function addWarning(PHPUnit_Framework_Test $test, PHPUnit_Framework_Warning $e, $time) + { + if (!$this->logIncompleteSkipped) { + return; + } + + $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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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() . PHP_EOL; + } else { + $buffer = ''; + } + + $buffer .= PHPUnit_Framework_TestFailure::exceptionToString($e) . PHP_EOL . + PHPUnit_Util_Filter::getFilteredStacktrace($e); + + $fault = $this->document->createElement( + $type, + PHPUnit_Util_XML::prepareString($buffer) + ); + + if ($e instanceof PHPUnit_Framework_ExceptionWrapper) { + $fault->setAttribute('type', $e->getClassName()); + } else { + $fault->setAttribute('type', get_class($e)); + } + + $this->currentTestCase->appendChild($fault); + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/Log/TAP.php b/.phpunit/phpunit-5.7/src/Util/Log/TAP.php new file mode 100644 index 0000000..72161af --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/Log/TAP.php @@ -0,0 +1,261 @@ + + * + * 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). + */ +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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + ) + ); + } + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/Log/TeamCity.php b/.phpunit/phpunit-5.7/src/Util/Log/TeamCity.php new file mode 100644 index 0000000..399efb9 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/Log/TeamCity.php @@ -0,0 +1,406 @@ + + * + * 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). + */ +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 + */ + 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['type'] = 'comparisonFailure'; + $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_ExceptionWrapper) { + if (strlen($e->getClassName()) != 0) { + $message = $message . $e->getClassName(); + } + + 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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/PHP.php b/.phpunit/phpunit-5.7/src/Util/PHP.php new file mode 100644 index 0000000..47d6347 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/PHP.php @@ -0,0 +1,410 @@ + + * + * 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. + */ +abstract class PHPUnit_Util_PHP +{ + /** + * @var Runtime + */ + protected $runtime; + + /** + * @var bool + */ + protected $stderrRedirection = false; + + /** + * @var string + */ + protected $stdin = ''; + + /** + * @var string + */ + protected $args = ''; + + /** + * @var array + */ + protected $env = []; + + /** + * @var int + */ + protected $timeout = 0; + + /** + * 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; + } + + /** + * Sets the input string to be sent via STDIN + * + * @param string $stdin + */ + public function setStdin($stdin) + { + $this->stdin = (string) $stdin; + } + + /** + * Returns the input string to be sent via STDIN + * + * @return string + */ + public function getStdin() + { + return $this->stdin; + } + + /** + * Sets the string of arguments to pass to the php job + * + * @param string $args + */ + public function setArgs($args) + { + $this->args = (string) $args; + } + + /** + * Returns the string of arguments to pass to the php job + * + * @retrun string + */ + public function getArgs() + { + return $this->args; + } + + /** + * Sets the array of environment variables to start the child process with + * + * @param array $env + */ + public function setEnv(array $env) + { + $this->env = $env; + } + + /** + * Returns the array of environment variables to start the child process with + * + * @return array + */ + public function getEnv() + { + return $this->env; + } + + /** + * Sets the amount of seconds to wait before timing out + * + * @param int $timeout + */ + public function setTimeout($timeout) + { + $this->timeout = (int) $timeout; + } + + /** + * Returns the amount of seconds to wait before timing out + * + * @return int + */ + public function getTimeout() + { + return $this->timeout; + } + + /** + * @return PHPUnit_Util_PHP + */ + 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 + * @param string|null $file + * + * @return string + */ + public function getCommand(array $settings, $file = null) + { + $command = $this->runtime->getBinary(); + $command .= $this->settingsToParameters($settings); + + if ('phpdbg' === PHP_SAPI) { + $command .= ' -qrr '; + + if ($file) { + $command .= '-e ' . escapeshellarg($file); + } else { + $command .= escapeshellarg(__DIR__ . '/PHP/eval-stdin.php'); + } + } elseif ($file) { + $command .= ' -f ' . escapeshellarg($file); + } + + if ($this->args) { + $command .= ' -- ' . $this->args; + } + + 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 + */ + 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 + */ + 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']; + /* @var $childResult PHPUnit_Framework_TestResult */ + + if ($result->getCollectCodeCoverageInformation()) { + $result->getCodeCoverage()->merge( + $childResult->getCodeCoverage() + ); + } + + $time = $childResult->time(); + $notImplemented = $childResult->notImplemented(); + $risky = $childResult->risky(); + $skipped = $childResult->skipped(); + $errors = $childResult->errors(); + $warnings = $childResult->warnings(); + $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($warnings)) { + $result->addWarning( + $test, + $this->getException($warnings[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 + * + * @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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/PHP/Default.php b/.phpunit/phpunit-5.7/src/Util/PHP/Default.php new file mode 100644 index 0000000..152daf6 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/PHP/Default.php @@ -0,0 +1,208 @@ + + * + * 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. + */ +class PHPUnit_Util_PHP_Default extends PHPUnit_Util_PHP +{ + /** + * @var string + */ + protected $tempFile; + + /** + * @var bool + */ + protected $useTempFile = false; + + /** + * 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 = []) + { + if ($this->useTempFile || $this->stdin) { + 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' + ); + } + + $job = $this->stdin; + } + + return $this->runProcess($job, $settings); + } + + /** + * Returns an array of file handles to be used in place of pipes + * + * @return array + */ + protected function getHandles() + { + return []; + } + + /** + * Handles creating the child process and returning the STDOUT and STDERR + * + * @param string $job + * @param array $settings + * + * @return array + * + * @throws PHPUnit_Framework_Exception + */ + protected function runProcess($job, $settings) + { + $handles = $this->getHandles(); + + $env = null; + if ($this->env) { + $env = isset($_SERVER) ? $_SERVER : []; + unset($env['argv'], $env['argc']); + $env = array_merge($env, $this->env); + + foreach ($env as $envKey => $envVar) { + if (is_array($envVar)) { + unset($env[$envKey]); + } + } + } + + $pipeSpec = [ + 0 => isset($handles[0]) ? $handles[0] : ['pipe', 'r'], + 1 => isset($handles[1]) ? $handles[1] : ['pipe', 'w'], + 2 => isset($handles[2]) ? $handles[2] : ['pipe', 'w'], + ]; + $process = proc_open( + $this->getCommand($settings, $this->tempFile), + $pipeSpec, + $pipes, + null, + $env + ); + + if (!is_resource($process)) { + throw new PHPUnit_Framework_Exception( + 'Unable to spawn worker process' + ); + } + + if ($job) { + $this->process($pipes[0], $job); + } + fclose($pipes[0]); + + if ($this->timeout) { + $stderr = $stdout = ''; + unset($pipes[0]); + + while (true) { + $r = $pipes; + $w = null; + $e = null; + + $n = @stream_select($r, $w, $e, $this->timeout); + + if ($n === false) { + break; + } elseif ($n === 0) { + proc_terminate($process, 9); + throw new PHPUnit_Framework_Exception(sprintf('Job execution aborted after %d seconds', $this->timeout)); + } elseif ($n > 0) { + foreach ($r as $pipe) { + $pipeOffset = 0; + foreach ($pipes as $i => $origPipe) { + if ($pipe == $origPipe) { + $pipeOffset = $i; + break; + } + } + + if (!$pipeOffset) { + break; + } + + $line = fread($pipe, 8192); + if (strlen($line) == 0) { + fclose($pipes[$pipeOffset]); + unset($pipes[$pipeOffset]); + } else { + if ($pipeOffset == 1) { + $stdout .= $line; + } else { + $stderr .= $line; + } + } + } + + if (empty($pipes)) { + break; + } + } + } + } else { + if (isset($pipes[1])) { + $stdout = stream_get_contents($pipes[1]); + fclose($pipes[1]); + } + + if (isset($pipes[2])) { + $stderr = stream_get_contents($pipes[2]); + fclose($pipes[2]); + } + } + + if (isset($handles[1])) { + rewind($handles[1]); + $stdout = stream_get_contents($handles[1]); + fclose($handles[1]); + } + + if (isset($handles[2])) { + rewind($handles[2]); + $stderr = stream_get_contents($handles[2]); + fclose($handles[2]); + } + + proc_close($process); + $this->cleanup(); + + return ['stdout' => $stdout, 'stderr' => $stderr]; + } + + /** + * @param resource $pipe + * @param string $job + * + * @throws PHPUnit_Framework_Exception + */ + protected function process($pipe, $job) + { + fwrite($pipe, $job); + } + + protected function cleanup() + { + if ($this->tempFile) { + unlink($this->tempFile); + } + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/PHP/Template/TestCaseMethod.tpl.dist b/.phpunit/phpunit-5.7/src/Util/PHP/Template/TestCaseMethod.tpl.dist new file mode 100644 index 0000000..c7172b9 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/PHP/Template/TestCaseMethod.tpl.dist @@ -0,0 +1,102 @@ +setCodeCoverage( + new 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); /* @ as not every STDOUT target stream is rewindable */ + 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(); + unset($configuration); +} + +function __phpunit_error_handler($errno, $errstr, $errfile, $errline, $errcontext) +{ + return true; +} + +set_error_handler("__phpunit_error_handler"); + +{constants} +{included_files} +{globals} + +restore_error_handler(); + +if (isset($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { + require_once $GLOBALS['__PHPUNIT_BOOTSTRAP']; + unset($GLOBALS['__PHPUNIT_BOOTSTRAP']); +} + +__phpunit_run_isolated_test(); diff --git a/.phpunit/phpunit-5.7/src/Util/PHP/Windows.php b/.phpunit/phpunit-5.7/src/Util/PHP/Windows.php new file mode 100644 index 0000000..cc25e45 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/PHP/Windows.php @@ -0,0 +1,40 @@ + + * + * 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. + * + * Reading from STDOUT or STDERR hangs forever on Windows if the output is + * too large. + * + * @see https://bugs.php.net/bug.php?id=51800 + */ +class PHPUnit_Util_PHP_Windows extends PHPUnit_Util_PHP_Default +{ + protected $useTempFile = true; + + protected function getHandles() + { + 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' + ); + } + + return [ + 1 => $stdout_handle + ]; + } + + public function getCommand(array $settings, $file = null) + { + return '"' . parent::getCommand($settings, $file) . '"'; + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/PHP/eval-stdin.php b/.phpunit/phpunit-5.7/src/Util/PHP/eval-stdin.php new file mode 100644 index 0000000..ccf8271 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/PHP/eval-stdin.php @@ -0,0 +1,10 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +eval('?>' . file_get_contents('php://stdin')); diff --git a/.phpunit/phpunit-5.7/src/Util/Printer.php b/.phpunit/phpunit-5.7/src/Util/Printer.php new file mode 100644 index 0000000..e40f34c --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/Printer.php @@ -0,0 +1,144 @@ + + * + * 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. + */ +class PHPUnit_Util_Printer +{ + /** + * If true, flush output after every write. + * + * @var bool + */ + protected $autoFlush = false; + + /** + * @var resource + */ + protected $out; + + /** + * @var string + */ + protected $outTarget; + + /** + * 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 (count($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 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); + } + } + + /** + * 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. + */ + 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' && PHP_SAPI != 'phpdbg') { + $buffer = htmlspecialchars($buffer, ENT_SUBSTITUTE); + } + + print $buffer; + + if ($this->autoFlush) { + $this->incrementalFlush(); + } + } + } + + /** + * Check auto-flush mode. + * + * @return bool + */ + 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 + */ + public function setAutoFlush($autoFlush) + { + if (is_bool($autoFlush)) { + $this->autoFlush = $autoFlush; + } else { + throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); + } + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/Regex.php b/.phpunit/phpunit-5.7/src/Util/Regex.php new file mode 100644 index 0000000..c154901 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/Regex.php @@ -0,0 +1,33 @@ + + * + * 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. + */ +class PHPUnit_Util_Regex +{ + /** + * @param string $pattern + * @param string $subject + * @param null $matches + * @param int $flags + * @param int $offset + * + * @return int + */ + 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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/String.php b/.phpunit/phpunit-5.7/src/Util/String.php new file mode 100644 index 0000000..16621b8 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/String.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * String helpers. + */ +class PHPUnit_Util_String +{ + /** + * Converts a string to UTF-8 encoding. + * + * @param string $string + * + * @return string + */ + public static function convertToUtf8($string) + { + return mb_convert_encoding($string, 'UTF-8'); + } + + /** + * 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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/Test.php b/.phpunit/phpunit-5.7/src/Util/Test.php new file mode 100644 index 0000000..6bf1786 --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/Test.php @@ -0,0 +1,1099 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Test helpers. + */ +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[<>=!]{0,2})\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([^ ]+?))\s*(?P[<>=!]{0,2})\s*(?P[\d\.-]+[\d\.]?)?[ \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 + */ + 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 + */ + 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 + */ + 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 + */ + 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]] = [ + 'version' => $matches['version'][$i], + 'operator' => $matches['operator'][$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]; + if (empty($matches['version'][$i]) || $name != 'extensions') { + continue; + } + $requires['extension_versions'][$matches['value'][$i]] = [ + 'version' => $matches['version'][$i], + 'operator' => $matches['operator'][$i] + ]; + } + } + + return $requires; + } + + /** + * Returns the missing requirements for a test. + * + * @param string $className + * @param string $methodName + * + * @return array + */ + public static function getMissingRequirements($className, $methodName) + { + $required = static::getRequirements($className, $methodName); + $missing = []; + + $operator = empty($required['PHP']['operator']) ? '>=' : $required['PHP']['operator']; + if (!empty($required['PHP']) && !version_compare(PHP_VERSION, $required['PHP']['version'], $operator)) { + $missing[] = sprintf('PHP %s %s is required.', $operator, $required['PHP']['version']); + } + + if (!empty($required['PHPUnit'])) { + $phpunitVersion = PHPUnit_Runner_Version::id(); + + $operator = empty($required['PHPUnit']['operator']) ? '>=' : $required['PHPUnit']['operator']; + if (!version_compare($phpunitVersion, $required['PHPUnit']['version'], $operator)) { + $missing[] = sprintf('PHPUnit %s %s is required.', $operator, $required['PHPUnit']['version']); + } + } + + 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 (isset($required['extension_versions'][$extension])) { + continue; + } + if (!extension_loaded($extension)) { + $missing[] = sprintf('Extension %s is required.', $extension); + } + } + } + + if (!empty($required['extension_versions'])) { + foreach ($required['extension_versions'] as $extension => $required) { + $actualVersion = phpversion($extension); + + $operator = empty($required['operator']) ? '>=' : $required['operator']; + if (false === $actualVersion || !version_compare($actualVersion, $required['version'], $operator)) { + $missing[] = sprintf('Extension %s %s %s is required.', $extension, $operator, $required['version']); + } + } + } + + return $missing; + } + + /** + * Returns the expected exception for a test. + * + * @param string $className + * @param string $methodName + * + * @return array + */ + 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 When a data provider is specified and exists + * null When no data provider is specified + * + * @throws PHPUnit_Framework_Exception + */ + public static function getProvidedData($className, $methodName) + { + $reflector = new ReflectionMethod($className, $methodName); + $docComment = $reflector->getDocComment(); + + $data = self::getDataFromDataProviderAnnotation($docComment, $className, $methodName); + + if ($data === null) { + $data = self::getDataFromTestWithAnnotation($docComment); + } + + if (is_array($data) && empty($data)) { + throw new PHPUnit_Framework_SkippedTestError; + } + + if ($data !== null) { + 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_all(self::REGEX_DATA_PROVIDER, $docComment, $matches)) { + $result = []; + + foreach ($matches[1] as $match) { + $dataProviderMethodNameNamespace = explode('\\', $match); + $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); + } + + if ($data instanceof Iterator) { + $data = iterator_to_array($data); + } + + if (is_array($data)) { + $result = array_merge($result, $data); + } + } + + return $result; + } + } + + /** + * @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); + + if ($candidateRow[0] !== '[') { + break; + } + + $dataSet = json_decode($candidateRow, true); + + if (json_last_error() != JSON_ERROR_NONE) { + throw new PHPUnit_Framework_Exception( + 'The dataset for the @testWith annotation cannot be parsed: ' . json_last_error_msg() + ); + } + + $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 = str_replace("\r\n", "\n", $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 + */ + 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 $className + * @param string $methodName + * + * @return array + */ + public static function getInlineAnnotations($className, $methodName) + { + $method = new ReflectionMethod($className, $methodName); + $code = file($method->getFileName()); + $lineNumber = $method->getStartLine(); + $startLine = $method->getStartLine() - 1; + $endLine = $method->getEndLine() - 1; + $methodLines = array_slice($code, $startLine, $endLine - $startLine + 1); + $annotations = []; + + foreach ($methodLines as $line) { + if (preg_match('#/\*\*?\s*@(?P[A-Za-z_-]+)(?:[ \t]+(?P.*?))?[ \t]*\r?\*/$#m', $line, $matches)) { + $annotations[strtolower($matches['name'])] = [ + 'line' => $lineNumber, + 'value' => $matches['value'] + ]; + } + + $lineNumber++; + } + + return $annotations; + } + + /** + * @param string $docblock + * + * @return array + */ + 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]][] = (string) $matches['value'][$i]; + } + } + + return $annotations; + } + + /** + * Returns the backup settings for a test. + * + * @param string $className + * @param string $methodName + * + * @return array + */ + 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 + */ + 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 + */ + 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 + */ + 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; + } + } + } + + return array_unique($groups); + } + + /** + * Returns the size of the test. + * + * @param string $className + * @param string $methodName + * + * @return int + */ + 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 + */ + 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 + */ + 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 + */ + public static function getPreserveGlobalStateSettings($className, $methodName) + { + return self::getBooleanAnnotationSetting( + $className, + $methodName, + 'preserveGlobalState' + ); + } + + /** + * @param string $className + * + * @return array + */ + 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 + */ + private static function emptyHookMethodsArray() + { + return [ + 'beforeClass' => ['setUpBeforeClass'], + 'before' => ['setUp'], + 'after' => ['tearDown'], + 'afterClass' => ['tearDownAfterClass'] + ]; + } + + /** + * @param string $className + * @param string $methodName + * @param string $settingName + * + * @return bool + */ + 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 + */ + 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_merge( + $result[$filename], + range($reflector->getStartLine(), $reflector->getEndLine()) + ); + } + + foreach ($result as $filename => $lineNumbers) { + $result[$filename] = array_keys(array_flip($lineNumbers)); + } + + return $result; + } + + /** + * @param ReflectionMethod $method + * + * @return bool + */ + private static function isBeforeClassMethod(ReflectionMethod $method) + { + return $method->isStatic() && strpos($method->getDocComment(), '@beforeClass') !== false; + } + + /** + * @param ReflectionMethod $method + * + * @return bool + */ + private static function isBeforeMethod(ReflectionMethod $method) + { + return preg_match('/@before\b/', $method->getDocComment()); + } + + /** + * @param ReflectionMethod $method + * + * @return bool + */ + private static function isAfterClassMethod(ReflectionMethod $method) + { + return $method->isStatic() && strpos($method->getDocComment(), '@afterClass') !== false; + } + + /** + * @param ReflectionMethod $method + * + * @return bool + */ + private static function isAfterMethod(ReflectionMethod $method) + { + return preg_match('/@after\b/', $method->getDocComment()); + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/TestDox/NamePrettifier.php b/.phpunit/phpunit-5.7/src/Util/TestDox/NamePrettifier.php new file mode 100644 index 0000000..76a139b --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/TestDox/NamePrettifier.php @@ -0,0 +1,142 @@ + + * + * 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. + */ +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 (substr($name, 0, 4) == 'test') { + $name = substr($name, 4); + } + + if (strlen($name) == 0) { + return $buffer; + } + + $name[0] = strtoupper($name[0]); + + if (strpos($name, '_') !== false) { + return trim(str_replace('_', ' ', $name)); + } + + $max = strlen($name); + $wasNumeric = false; + + for ($i = 0; $i < $max; $i++) { + if ($i > 0 && + 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; + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/TestDox/ResultPrinter.php b/.phpunit/phpunit-5.7/src/Util/TestDox/ResultPrinter.php new file mode 100644 index 0000000..d83998e --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/TestDox/ResultPrinter.php @@ -0,0 +1,399 @@ + + * + * 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. + */ +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; + + /** + * @var array + */ + private $groups; + + /** + * @var array + */ + private $excludeGroups; + + /** + * @param resource $out + * @param array $groups + * @param array $excludeGroups + */ + public function __construct($out = null, array $groups = [], array $excludeGroups = []) + { + parent::__construct($out); + + $this->groups = $groups; + $this->excludeGroups = $excludeGroups; + + $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 + */ + 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 + */ + 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 + */ + 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 + */ + public function startTestSuite(PHPUnit_Framework_TestSuite $suite) + { + } + + /** + * A testsuite ended. + * + * @param PHPUnit_Framework_TestSuite $suite + */ + 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)); + } + + if ($test instanceof PHPUnit_Framework_TestCase && $test->usesDataProvider()) { + $this->currentTestMethodPrettified .= ' ' . $test->dataDescription(); + } + + $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; + } + + 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() + { + } + + /** + * @param PHPUnit_Framework_Test $test + * + * @return bool + */ + private function isOfInterest(PHPUnit_Framework_Test $test) + { + if (!$test instanceof PHPUnit_Framework_TestCase) { + return false; + } + + if ($test instanceof PHPUnit_Framework_WarningTestCase) { + return false; + } + + if (!empty($this->groups)) { + foreach ($test->getGroups() as $group) { + if (in_array($group, $this->groups)) { + return true; + } + } + + return false; + } + + if (!empty($this->excludeGroups)) { + foreach ($test->getGroups() as $group) { + if (in_array($group, $this->excludeGroups)) { + return false; + } + } + + return true; + } + + return true; + } +} diff --git a/.phpunit/phpunit-5.7/src/Util/TestDox/ResultPrinter/HTML.php b/.phpunit/phpunit-5.7/src/Util/TestDox/ResultPrinter/HTML.php new file mode 100644 index 0000000..b46a02e --- /dev/null +++ b/.phpunit/phpunit-5.7/src/Util/TestDox/ResultPrinter/HTML.php @@ -0,0 +1,137 @@ + + * + * 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. + */ +class PHPUnit_Util_TestDox_ResultPrinter_HTML extends PHPUnit_Util_TestDox_ResultPrinter +{ + /** + * @var string + */ + private $pageHeader = << + + + + Test Documentation + + + +EOT; + + /** + * @var string + */ + private $classHeader = <<%s +