first commit
This commit is contained in:
248
vendor/phpspec/prophecy/CHANGES.md
vendored
Normal file
248
vendor/phpspec/prophecy/CHANGES.md
vendored
Normal file
@ -0,0 +1,248 @@
|
||||
1.10.3 / 2020/03/05
|
||||
===================
|
||||
|
||||
* [fixed] removed fatal error when phpdocumentor/reflection-docblock 5 parses an invalid `@method` tag (@stof)
|
||||
|
||||
1.10.2 / 2020/01/20
|
||||
===================
|
||||
|
||||
* [added] support for new versions of `sebastian/comparator` and `sebastian/recursion-context` (@sebastianbergmann)
|
||||
|
||||
1.10.1 / 2019/12/22
|
||||
===================
|
||||
|
||||
* [fixed] identical callables no longer match as arguments (@ciaranmcnulty)
|
||||
|
||||
1.10.0 / 2019/12/17
|
||||
===================
|
||||
|
||||
* [added] shouldHaveBeenCalled evaluation happens later so un-stubbed calls don't throw (@elvetemedve)
|
||||
* [added] methods can now be doubled case-insensitively to match PHP semantics (@michalbundyra)
|
||||
* [fixed] reduced memory usage by optimising CachedDoubler (@DonCallisto)
|
||||
* [fixed] removed fatal error nesting level when comparing large objects (@scroach)
|
||||
|
||||
1.9.0 / 2019/10/03
|
||||
==================
|
||||
|
||||
* [added] Add willYield feature to Method Prophecy(@tkotosz)
|
||||
* [fixed] Allow `MethodProphecy::willThrow()` to accept Throwable as string (@timoschinkel )
|
||||
* [fixed] Allow new version of phpdocumentor/reflection-docblock (@ricpelo)
|
||||
|
||||
1.8.1 / 2019/06/13
|
||||
==================
|
||||
|
||||
* [fixed] Don't try to patch final constructors (@NiR)
|
||||
|
||||
1.8.0 / 2018/08/05
|
||||
==================
|
||||
|
||||
* Support for void return types without explicit will (@crellbar)
|
||||
* Clearer error message for unexpected method calls (@meridius)
|
||||
* Clearer error message for aggregate exceptions (@meridius)
|
||||
* More verbose `shouldBeCalledOnce` expectation (@olvlvl)
|
||||
* Ability to double Throwable, or methods that extend it (@ciaranmcnulty)
|
||||
* [fixed] Doubling methods where class has additional arguments to interface (@webimpress)
|
||||
* [fixed] Doubling methods where arguments are nullable but default is not null (@webimpress)
|
||||
* [fixed] Doubling magic methods on parent class (@dsnopek)
|
||||
* [fixed] Check method predictions only once (@dontub)
|
||||
* [fixed] Argument::containingString throwing error when called with non-string (@dcabrejas)
|
||||
|
||||
1.7.6 / 2018/04/18
|
||||
==================
|
||||
|
||||
* Allow sebastian/comparator ^3.0 (@sebastianbergmann)
|
||||
|
||||
1.7.5 / 2018/02/11
|
||||
==================
|
||||
|
||||
* Support for object return type hints (thanks @greg0ire)
|
||||
|
||||
1.7.4 / 2018/02/11
|
||||
==================
|
||||
|
||||
* Fix issues with PHP 7.2 (thanks @greg0ire)
|
||||
* Support object type hints in PHP 7.2 (thanks @@jansvoboda11)
|
||||
|
||||
1.7.3 / 2017/11/24
|
||||
==================
|
||||
|
||||
* Fix SplInfo ClassPatch to work with Symfony 4 (Thanks @gnugat)
|
||||
|
||||
1.7.2 / 2017-10-04
|
||||
==================
|
||||
|
||||
* Reverted "check method predictions only once" due to it breaking Spies
|
||||
|
||||
1.7.1 / 2017-10-03
|
||||
==================
|
||||
|
||||
* Allow PHP5 keywords methods generation on PHP7 (thanks @bycosta)
|
||||
* Allow reflection-docblock v4 (thanks @GrahamCampbell)
|
||||
* Check method predictions only once (thanks @dontub)
|
||||
* Escape file path sent to \SplFileObjectConstructor when running on Windows (thanks @danmartin-epiphany)
|
||||
|
||||
1.7.0 / 2017-03-02
|
||||
==================
|
||||
|
||||
* Add full PHP 7.1 Support (thanks @prolic)
|
||||
* Allow `sebastian/comparator ^2.0` (thanks @sebastianbergmann)
|
||||
* Allow `sebastian/recursion-context ^3.0` (thanks @sebastianbergmann)
|
||||
* Allow `\Error` instances in `ThrowPromise` (thanks @jameshalsall)
|
||||
* Support `phpspec/phpspect ^3.2` (thanks @Sam-Burns)
|
||||
* Fix failing builds (thanks @Sam-Burns)
|
||||
|
||||
1.6.2 / 2016-11-21
|
||||
==================
|
||||
|
||||
* Added support for detecting @method on interfaces that the class itself implements, or when the stubbed class is an interface itself (thanks @Seldaek)
|
||||
* Added support for sebastian/recursion-context 2 (thanks @sebastianbergmann)
|
||||
* Added testing on PHP 7.1 on Travis (thanks @danizord)
|
||||
* Fixed the usage of the phpunit comparator (thanks @Anyqax)
|
||||
|
||||
1.6.1 / 2016-06-07
|
||||
==================
|
||||
|
||||
* Ignored empty method names in invalid `@method` phpdoc
|
||||
* Fixed the mocking of SplFileObject
|
||||
* Added compatibility with phpdocumentor/reflection-docblock 3
|
||||
|
||||
1.6.0 / 2016-02-15
|
||||
==================
|
||||
|
||||
* Add Variadics support (thanks @pamil)
|
||||
* Add ProphecyComparator for comparing objects that need revealing (thanks @jon-acker)
|
||||
* Add ApproximateValueToken (thanks @dantleech)
|
||||
* Add support for 'self' and 'parent' return type (thanks @bendavies)
|
||||
* Add __invoke to allowed reflectable methods list (thanks @ftrrtf)
|
||||
* Updated ExportUtil to reflect the latest changes by Sebastian (thanks @jakari)
|
||||
* Specify the required php version for composer (thanks @jakzal)
|
||||
* Exclude 'args' in the generated backtrace (thanks @oradwell)
|
||||
* Fix code generation for scalar parameters (thanks @trowski)
|
||||
* Fix missing sprintf in InvalidArgumentException __construct call (thanks @emmanuelballery)
|
||||
* Fix phpdoc for magic methods (thanks @Tobion)
|
||||
* Fix PhpDoc for interfaces usage (thanks @ImmRanneft)
|
||||
* Prevent final methods from being manually extended (thanks @kamioftea)
|
||||
* Enhance exception for invalid argument to ThrowPromise (thanks @Tobion)
|
||||
|
||||
1.5.0 / 2015-04-27
|
||||
==================
|
||||
|
||||
* Add support for PHP7 scalar type hints (thanks @trowski)
|
||||
* Add support for PHP7 return types (thanks @trowski)
|
||||
* Update internal test suite to support PHP7
|
||||
|
||||
1.4.1 / 2015-04-27
|
||||
==================
|
||||
|
||||
* Fixed bug in closure-based argument tokens (#181)
|
||||
|
||||
1.4.0 / 2015-03-27
|
||||
==================
|
||||
|
||||
* Fixed errors in return type phpdocs (thanks @sobit)
|
||||
* Fixed stringifying of hash containing one value (thanks @avant1)
|
||||
* Improved clarity of method call expectation exception (thanks @dantleech)
|
||||
* Add ability to specify which argument is returned in willReturnArgument (thanks @coderbyheart)
|
||||
* Add more information to MethodNotFound exceptions (thanks @ciaranmcnulty)
|
||||
* Support for mocking classes with methods that return references (thanks @edsonmedina)
|
||||
* Improved object comparison (thanks @whatthejeff)
|
||||
* Adopted '^' in composer dependencies (thanks @GrahamCampbell)
|
||||
* Fixed non-typehinted arguments being treated as optional (thanks @whatthejeff)
|
||||
* Magic methods are now filtered for keywords (thanks @seagoj)
|
||||
* More readable errors for failure when expecting single calls (thanks @dantleech)
|
||||
|
||||
1.3.1 / 2014-11-17
|
||||
==================
|
||||
|
||||
* Fix the edge case when failed predictions weren't recorded for `getCheckedPredictions()`
|
||||
|
||||
1.3.0 / 2014-11-14
|
||||
==================
|
||||
|
||||
* Add a way to get checked predictions with `MethodProphecy::getCheckedPredictions()`
|
||||
* Fix HHVM compatibility
|
||||
* Remove dead code (thanks @stof)
|
||||
* Add support for DirectoryIterators (thanks @shanethehat)
|
||||
|
||||
1.2.0 / 2014-07-18
|
||||
==================
|
||||
|
||||
* Added support for doubling magic methods documented in the class phpdoc (thanks @armetiz)
|
||||
* Fixed a segfault appearing in some cases (thanks @dmoreaulf)
|
||||
* Fixed the doubling of methods with typehints on non-existent classes (thanks @gquemener)
|
||||
* Added support for internal classes using keywords as method names (thanks @milan)
|
||||
* Added IdenticalValueToken and Argument::is (thanks @florianv)
|
||||
* Removed the usage of scalar typehints in HHVM as HHVM 3 does not support them anymore in PHP code (thanks @whatthejeff)
|
||||
|
||||
1.1.2 / 2014-01-24
|
||||
==================
|
||||
|
||||
* Spy automatically promotes spied method call to an expected one
|
||||
|
||||
1.1.1 / 2014-01-15
|
||||
==================
|
||||
|
||||
* Added support for HHVM
|
||||
|
||||
1.1.0 / 2014-01-01
|
||||
==================
|
||||
|
||||
* Changed the generated class names to use a static counter instead of a random number
|
||||
* Added a clss patch for ReflectionClass::newInstance to make its argument optional consistently (thanks @docteurklein)
|
||||
* Fixed mirroring of classes with typehints on non-existent classes (thanks @docteurklein)
|
||||
* Fixed the support of array callables in CallbackPromise and CallbackPrediction (thanks @ciaranmcnulty)
|
||||
* Added support for properties in ObjectStateToken (thanks @adrienbrault)
|
||||
* Added support for mocking classes with a final constructor (thanks @ciaranmcnulty)
|
||||
* Added ArrayEveryEntryToken and Argument::withEveryEntry() (thanks @adrienbrault)
|
||||
* Added an exception when trying to prophesize on a final method instead of ignoring silently (thanks @docteurklein)
|
||||
* Added StringContainToken and Argument::containingString() (thanks @peterjmit)
|
||||
* Added ``shouldNotHaveBeenCalled`` on the MethodProphecy (thanks @ciaranmcnulty)
|
||||
* Fixed the comparison of objects in ExactValuetoken (thanks @sstok)
|
||||
* Deprecated ``shouldNotBeenCalled`` in favor of ``shouldNotHaveBeenCalled``
|
||||
|
||||
1.0.4 / 2013-08-10
|
||||
==================
|
||||
|
||||
* Better randomness for generated class names (thanks @sstok)
|
||||
* Add support for interfaces into TypeToken and Argument::type() (thanks @sstok)
|
||||
* Add support for old-style (method name === class name) constructors (thanks @l310 for report)
|
||||
|
||||
1.0.3 / 2013-07-04
|
||||
==================
|
||||
|
||||
* Support callable typehints (thanks @stof)
|
||||
* Do not attempt to autoload arrays when generating code (thanks @MarcoDeBortoli)
|
||||
* New ArrayEntryToken (thanks @kagux)
|
||||
|
||||
1.0.2 / 2013-05-19
|
||||
==================
|
||||
|
||||
* Logical `AND` token added (thanks @kagux)
|
||||
* Logical `NOT` token added (thanks @kagux)
|
||||
* Add support for setting custom constructor arguments
|
||||
* Properly stringify hashes
|
||||
* Record calls that throw exceptions
|
||||
* Migrate spec suite to PhpSpec 2.0
|
||||
|
||||
1.0.1 / 2013-04-30
|
||||
==================
|
||||
|
||||
* Fix broken UnexpectedCallException message
|
||||
* Trim AggregateException message
|
||||
|
||||
1.0.0 / 2013-04-29
|
||||
==================
|
||||
|
||||
* Improve exception messages
|
||||
|
||||
1.0.0-BETA2 / 2013-04-03
|
||||
========================
|
||||
|
||||
* Add more debug information to CallTimes and Call prediction exception messages
|
||||
* Fix MethodNotFoundException wrong namespace (thanks @gunnarlium)
|
||||
* Fix some typos in the exception messages (thanks @pborreli)
|
||||
|
||||
1.0.0-BETA1 / 2013-03-25
|
||||
========================
|
||||
|
||||
* Initial release
|
23
vendor/phpspec/prophecy/LICENSE
vendored
Normal file
23
vendor/phpspec/prophecy/LICENSE
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
Copyright (c) 2013 Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
Marcello Duarte <marcello.duarte@gmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
402
vendor/phpspec/prophecy/README.md
vendored
Normal file
402
vendor/phpspec/prophecy/README.md
vendored
Normal file
@ -0,0 +1,402 @@
|
||||
# Prophecy
|
||||
|
||||
[](https://packagist.org/packages/phpspec/prophecy)
|
||||
[](https://travis-ci.org/phpspec/prophecy)
|
||||
|
||||
Prophecy is a highly opinionated yet very powerful and flexible PHP object mocking
|
||||
framework. Though initially it was created to fulfil phpspec2 needs, it is flexible
|
||||
enough to be used inside any testing framework out there with minimal effort.
|
||||
|
||||
## A simple example
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
class UserTest extends PHPUnit\Framework\TestCase
|
||||
{
|
||||
private $prophet;
|
||||
|
||||
public function testPasswordHashing()
|
||||
{
|
||||
$hasher = $this->prophet->prophesize('App\Security\Hasher');
|
||||
$user = new App\Entity\User($hasher->reveal());
|
||||
|
||||
$hasher->generateHash($user, 'qwerty')->willReturn('hashed_pass');
|
||||
|
||||
$user->setPassword('qwerty');
|
||||
|
||||
$this->assertEquals('hashed_pass', $user->getPassword());
|
||||
}
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
$this->prophet = new \Prophecy\Prophet;
|
||||
}
|
||||
|
||||
protected function tearDown()
|
||||
{
|
||||
$this->prophet->checkPredictions();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Installation
|
||||
|
||||
### Prerequisites
|
||||
|
||||
Prophecy requires PHP 5.3.3 or greater.
|
||||
|
||||
### Setup through composer
|
||||
|
||||
First, add Prophecy to the list of dependencies inside your `composer.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"require-dev": {
|
||||
"phpspec/prophecy": "~1.0"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Then simply install it with composer:
|
||||
|
||||
```bash
|
||||
$> composer install --prefer-dist
|
||||
```
|
||||
|
||||
You can read more about Composer on its [official webpage](http://getcomposer.org).
|
||||
|
||||
## How to use it
|
||||
|
||||
First of all, in Prophecy every word has a logical meaning, even the name of the library
|
||||
itself (Prophecy). When you start feeling that, you'll become very fluid with this
|
||||
tool.
|
||||
|
||||
For example, Prophecy has been named that way because it concentrates on describing the future
|
||||
behavior of objects with very limited knowledge about them. But as with any other prophecy,
|
||||
those object prophecies can't create themselves - there should be a Prophet:
|
||||
|
||||
```php
|
||||
$prophet = new Prophecy\Prophet;
|
||||
```
|
||||
|
||||
The Prophet creates prophecies by *prophesizing* them:
|
||||
|
||||
```php
|
||||
$prophecy = $prophet->prophesize();
|
||||
```
|
||||
|
||||
The result of the `prophesize()` method call is a new object of class `ObjectProphecy`. Yes,
|
||||
that's your specific object prophecy, which describes how your object would behave
|
||||
in the near future. But first, you need to specify which object you're talking about,
|
||||
right?
|
||||
|
||||
```php
|
||||
$prophecy->willExtend('stdClass');
|
||||
$prophecy->willImplement('SessionHandlerInterface');
|
||||
```
|
||||
|
||||
There are 2 interesting calls - `willExtend` and `willImplement`. The first one tells
|
||||
object prophecy that our object should extend specific class, the second one says that
|
||||
it should implement some interface. Obviously, objects in PHP can implement multiple
|
||||
interfaces, but extend only one parent class.
|
||||
|
||||
### Dummies
|
||||
|
||||
Ok, now we have our object prophecy. What can we do with it? First of all, we can get
|
||||
our object *dummy* by revealing its prophecy:
|
||||
|
||||
```php
|
||||
$dummy = $prophecy->reveal();
|
||||
```
|
||||
|
||||
The `$dummy` variable now holds a special dummy object. Dummy objects are objects that extend
|
||||
and/or implement preset classes/interfaces by overriding all their public methods. The key
|
||||
point about dummies is that they do not hold any logic - they just do nothing. Any method
|
||||
of the dummy will always return `null` and the dummy will never throw any exceptions.
|
||||
Dummy is your friend if you don't care about the actual behavior of this double and just need
|
||||
a token object to satisfy a method typehint.
|
||||
|
||||
You need to understand one thing - a dummy is not a prophecy. Your object prophecy is still
|
||||
assigned to `$prophecy` variable and in order to manipulate with your expectations, you
|
||||
should work with it. `$dummy` is a dummy - a simple php object that tries to fulfil your
|
||||
prophecy.
|
||||
|
||||
### Stubs
|
||||
|
||||
Ok, now we know how to create basic prophecies and reveal dummies from them. That's
|
||||
awesome if we don't care about our _doubles_ (objects that reflect originals)
|
||||
interactions. If we do, we need to use *stubs* or *mocks*.
|
||||
|
||||
A stub is an object double, which doesn't have any expectations about the object behavior,
|
||||
but when put in specific environment, behaves in specific way. Ok, I know, it's cryptic,
|
||||
but bear with me for a minute. Simply put, a stub is a dummy, which depending on the called
|
||||
method signature does different things (has logic). To create stubs in Prophecy:
|
||||
|
||||
```php
|
||||
$prophecy->read('123')->willReturn('value');
|
||||
```
|
||||
|
||||
Oh wow. We've just made an arbitrary call on the object prophecy? Yes, we did. And this
|
||||
call returned us a new object instance of class `MethodProphecy`. Yep, that's a specific
|
||||
method with arguments prophecy. Method prophecies give you the ability to create method
|
||||
promises or predictions. We'll talk about method predictions later in the _Mocks_ section.
|
||||
|
||||
#### Promises
|
||||
|
||||
Promises are logical blocks, that represent your fictional methods in prophecy terms
|
||||
and they are handled by the `MethodProphecy::will(PromiseInterface $promise)` method.
|
||||
As a matter of fact, the call that we made earlier (`willReturn('value')`) is a simple
|
||||
shortcut to:
|
||||
|
||||
```php
|
||||
$prophecy->read('123')->will(new Prophecy\Promise\ReturnPromise(array('value')));
|
||||
```
|
||||
|
||||
This promise will cause any call to our double's `read()` method with exactly one
|
||||
argument - `'123'` to always return `'value'`. But that's only for this
|
||||
promise, there's plenty others you can use:
|
||||
|
||||
- `ReturnPromise` or `->willReturn(1)` - returns a value from a method call
|
||||
- `ReturnArgumentPromise` or `->willReturnArgument($index)` - returns the nth method argument from call
|
||||
- `ThrowPromise` or `->willThrow($exception)` - causes the method to throw specific exception
|
||||
- `CallbackPromise` or `->will($callback)` - gives you a quick way to define your own custom logic
|
||||
|
||||
Keep in mind, that you can always add even more promises by implementing
|
||||
`Prophecy\Promise\PromiseInterface`.
|
||||
|
||||
#### Method prophecies idempotency
|
||||
|
||||
Prophecy enforces same method prophecies and, as a consequence, same promises and
|
||||
predictions for the same method calls with the same arguments. This means:
|
||||
|
||||
```php
|
||||
$methodProphecy1 = $prophecy->read('123');
|
||||
$methodProphecy2 = $prophecy->read('123');
|
||||
$methodProphecy3 = $prophecy->read('321');
|
||||
|
||||
$methodProphecy1 === $methodProphecy2;
|
||||
$methodProphecy1 !== $methodProphecy3;
|
||||
```
|
||||
|
||||
That's interesting, right? Now you might ask me how would you define more complex
|
||||
behaviors where some method call changes behavior of others. In PHPUnit or Mockery
|
||||
you do that by predicting how many times your method will be called. In Prophecy,
|
||||
you'll use promises for that:
|
||||
|
||||
```php
|
||||
$user->getName()->willReturn(null);
|
||||
|
||||
// For PHP 5.4
|
||||
$user->setName('everzet')->will(function () {
|
||||
$this->getName()->willReturn('everzet');
|
||||
});
|
||||
|
||||
// For PHP 5.3
|
||||
$user->setName('everzet')->will(function ($args, $user) {
|
||||
$user->getName()->willReturn('everzet');
|
||||
});
|
||||
|
||||
// Or
|
||||
$user->setName('everzet')->will(function ($args) use ($user) {
|
||||
$user->getName()->willReturn('everzet');
|
||||
});
|
||||
```
|
||||
|
||||
And now it doesn't matter how many times or in which order your methods are called.
|
||||
What matters is their behaviors and how well you faked it.
|
||||
|
||||
Note: If the method is called several times, you can use the following syntax to return different
|
||||
values for each call:
|
||||
|
||||
```php
|
||||
$prophecy->read('123')->willReturn(1, 2, 3);
|
||||
```
|
||||
|
||||
This feature is actually not recommended for most cases. Relying on the order of
|
||||
calls for the same arguments tends to make test fragile, as adding one more call
|
||||
can break everything.
|
||||
|
||||
#### Arguments wildcarding
|
||||
|
||||
The previous example is awesome (at least I hope it is for you), but that's not
|
||||
optimal enough. We hardcoded `'everzet'` in our expectation. Isn't there a better
|
||||
way? In fact there is, but it involves understanding what this `'everzet'`
|
||||
actually is.
|
||||
|
||||
You see, even if method arguments used during method prophecy creation look
|
||||
like simple method arguments, in reality they are not. They are argument token
|
||||
wildcards. As a matter of fact, `->setName('everzet')` looks like a simple call just
|
||||
because Prophecy automatically transforms it under the hood into:
|
||||
|
||||
```php
|
||||
$user->setName(new Prophecy\Argument\Token\ExactValueToken('everzet'));
|
||||
```
|
||||
|
||||
Those argument tokens are simple PHP classes, that implement
|
||||
`Prophecy\Argument\Token\TokenInterface` and tell Prophecy how to compare real arguments
|
||||
with your expectations. And yes, those classnames are damn big. That's why there's a
|
||||
shortcut class `Prophecy\Argument`, which you can use to create tokens like that:
|
||||
|
||||
```php
|
||||
use Prophecy\Argument;
|
||||
|
||||
$user->setName(Argument::exact('everzet'));
|
||||
```
|
||||
|
||||
`ExactValueToken` is not very useful in our case as it forced us to hardcode the username.
|
||||
That's why Prophecy comes bundled with a bunch of other tokens:
|
||||
|
||||
- `IdenticalValueToken` or `Argument::is($value)` - checks that the argument is identical to a specific value
|
||||
- `ExactValueToken` or `Argument::exact($value)` - checks that the argument matches a specific value
|
||||
- `TypeToken` or `Argument::type($typeOrClass)` - checks that the argument matches a specific type or
|
||||
classname
|
||||
- `ObjectStateToken` or `Argument::which($method, $value)` - checks that the argument method returns
|
||||
a specific value
|
||||
- `CallbackToken` or `Argument::that(callback)` - checks that the argument matches a custom callback
|
||||
- `AnyValueToken` or `Argument::any()` - matches any argument
|
||||
- `AnyValuesToken` or `Argument::cetera()` - matches any arguments to the rest of the signature
|
||||
- `StringContainsToken` or `Argument::containingString($value)` - checks that the argument contains a specific string value
|
||||
|
||||
And you can add even more by implementing `TokenInterface` with your own custom classes.
|
||||
|
||||
So, let's refactor our initial `{set,get}Name()` logic with argument tokens:
|
||||
|
||||
```php
|
||||
use Prophecy\Argument;
|
||||
|
||||
$user->getName()->willReturn(null);
|
||||
|
||||
// For PHP 5.4
|
||||
$user->setName(Argument::type('string'))->will(function ($args) {
|
||||
$this->getName()->willReturn($args[0]);
|
||||
});
|
||||
|
||||
// For PHP 5.3
|
||||
$user->setName(Argument::type('string'))->will(function ($args, $user) {
|
||||
$user->getName()->willReturn($args[0]);
|
||||
});
|
||||
|
||||
// Or
|
||||
$user->setName(Argument::type('string'))->will(function ($args) use ($user) {
|
||||
$user->getName()->willReturn($args[0]);
|
||||
});
|
||||
```
|
||||
|
||||
That's it. Now our `{set,get}Name()` prophecy will work with any string argument provided to it.
|
||||
We've just described how our stub object should behave, even though the original object could have
|
||||
no behavior whatsoever.
|
||||
|
||||
One last bit about arguments now. You might ask, what happens in case of:
|
||||
|
||||
```php
|
||||
use Prophecy\Argument;
|
||||
|
||||
$user->getName()->willReturn(null);
|
||||
|
||||
// For PHP 5.4
|
||||
$user->setName(Argument::type('string'))->will(function ($args) {
|
||||
$this->getName()->willReturn($args[0]);
|
||||
});
|
||||
|
||||
// For PHP 5.3
|
||||
$user->setName(Argument::type('string'))->will(function ($args, $user) {
|
||||
$user->getName()->willReturn($args[0]);
|
||||
});
|
||||
|
||||
// Or
|
||||
$user->setName(Argument::type('string'))->will(function ($args) use ($user) {
|
||||
$user->getName()->willReturn($args[0]);
|
||||
});
|
||||
|
||||
$user->setName(Argument::any())->will(function () {
|
||||
});
|
||||
```
|
||||
|
||||
Nothing. Your stub will continue behaving the way it did before. That's because of how
|
||||
arguments wildcarding works. Every argument token type has a different score level, which
|
||||
wildcard then uses to calculate the final arguments match score and use the method prophecy
|
||||
promise that has the highest score. In this case, `Argument::type()` in case of success
|
||||
scores `5` and `Argument::any()` scores `3`. So the type token wins, as does the first
|
||||
`setName()` method prophecy and its promise. The simple rule of thumb - more precise token
|
||||
always wins.
|
||||
|
||||
#### Getting stub objects
|
||||
|
||||
Ok, now we know how to define our prophecy method promises, let's get our stub from
|
||||
it:
|
||||
|
||||
```php
|
||||
$stub = $prophecy->reveal();
|
||||
```
|
||||
|
||||
As you might see, the only difference between how we get dummies and stubs is that with
|
||||
stubs we describe every object conversation instead of just agreeing with `null` returns
|
||||
(object being *dummy*). As a matter of fact, after you define your first promise
|
||||
(method call), Prophecy will force you to define all the communications - it throws
|
||||
the `UnexpectedCallException` for any call you didn't describe with object prophecy before
|
||||
calling it on a stub.
|
||||
|
||||
### Mocks
|
||||
|
||||
Now we know how to define doubles without behavior (dummies) and doubles with behavior, but
|
||||
no expectations (stubs). What's left is doubles for which we have some expectations. These
|
||||
are called mocks and in Prophecy they look almost exactly the same as stubs, except that
|
||||
they define *predictions* instead of *promises* on method prophecies:
|
||||
|
||||
```php
|
||||
$entityManager->flush()->shouldBeCalled();
|
||||
```
|
||||
|
||||
#### Predictions
|
||||
|
||||
The `shouldBeCalled()` method here assigns `CallPrediction` to our method prophecy.
|
||||
Predictions are a delayed behavior check for your prophecies. You see, during the entire lifetime
|
||||
of your doubles, Prophecy records every single call you're making against it inside your
|
||||
code. After that, Prophecy can use this collected information to check if it matches defined
|
||||
predictions. You can assign predictions to method prophecies using the
|
||||
`MethodProphecy::should(PredictionInterface $prediction)` method. As a matter of fact,
|
||||
the `shouldBeCalled()` method we used earlier is just a shortcut to:
|
||||
|
||||
```php
|
||||
$entityManager->flush()->should(new Prophecy\Prediction\CallPrediction());
|
||||
```
|
||||
|
||||
It checks if your method of interest (that matches both the method name and the arguments wildcard)
|
||||
was called 1 or more times. If the prediction failed then it throws an exception. When does this
|
||||
check happen? Whenever you call `checkPredictions()` on the main Prophet object:
|
||||
|
||||
```php
|
||||
$prophet->checkPredictions();
|
||||
```
|
||||
|
||||
In PHPUnit, you would want to put this call into the `tearDown()` method. If no predictions
|
||||
are defined, it would do nothing. So it won't harm to call it after every test.
|
||||
|
||||
There are plenty more predictions you can play with:
|
||||
|
||||
- `CallPrediction` or `shouldBeCalled()` - checks that the method has been called 1 or more times
|
||||
- `NoCallsPrediction` or `shouldNotBeCalled()` - checks that the method has not been called
|
||||
- `CallTimesPrediction` or `shouldBeCalledTimes($count)` - checks that the method has been called
|
||||
`$count` times
|
||||
- `CallbackPrediction` or `should($callback)` - checks the method against your own custom callback
|
||||
|
||||
Of course, you can always create your own custom prediction any time by implementing
|
||||
`PredictionInterface`.
|
||||
|
||||
### Spies
|
||||
|
||||
The last bit of awesomeness in Prophecy is out-of-the-box spies support. As I said in the previous
|
||||
section, Prophecy records every call made during the double's entire lifetime. This means
|
||||
you don't need to record predictions in order to check them. You can also do it
|
||||
manually by using the `MethodProphecy::shouldHave(PredictionInterface $prediction)` method:
|
||||
|
||||
```php
|
||||
$em = $prophet->prophesize('Doctrine\ORM\EntityManager');
|
||||
|
||||
$controller->createUser($em->reveal());
|
||||
|
||||
$em->flush()->shouldHaveBeenCalled();
|
||||
```
|
||||
|
||||
Such manipulation with doubles is called spying. And with Prophecy it just works.
|
50
vendor/phpspec/prophecy/composer.json
vendored
Normal file
50
vendor/phpspec/prophecy/composer.json
vendored
Normal file
@ -0,0 +1,50 @@
|
||||
{
|
||||
"name": "phpspec/prophecy",
|
||||
"description": "Highly opinionated mocking framework for PHP 5.3+",
|
||||
"keywords": ["Mock", "Stub", "Dummy", "Double", "Fake", "Spy"],
|
||||
"homepage": "https://github.com/phpspec/prophecy",
|
||||
"type": "library",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Konstantin Kudryashov",
|
||||
"email": "ever.zet@gmail.com",
|
||||
"homepage": "http://everzet.com"
|
||||
},
|
||||
{
|
||||
"name": "Marcello Duarte",
|
||||
"email": "marcello.duarte@gmail.com"
|
||||
}
|
||||
],
|
||||
|
||||
"require": {
|
||||
"php": "^5.3|^7.0",
|
||||
"phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0",
|
||||
"sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0",
|
||||
"doctrine/instantiator": "^1.0.2",
|
||||
"sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0"
|
||||
},
|
||||
|
||||
"require-dev": {
|
||||
"phpspec/phpspec": "^2.5 || ^3.2",
|
||||
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
|
||||
},
|
||||
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Prophecy\\": "src/Prophecy"
|
||||
}
|
||||
},
|
||||
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Fixtures\\Prophecy\\": "fixtures"
|
||||
}
|
||||
},
|
||||
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.10.x-dev"
|
||||
}
|
||||
}
|
||||
}
|
212
vendor/phpspec/prophecy/src/Prophecy/Argument.php
vendored
Normal file
212
vendor/phpspec/prophecy/src/Prophecy/Argument.php
vendored
Normal file
@ -0,0 +1,212 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy;
|
||||
|
||||
use Prophecy\Argument\Token;
|
||||
|
||||
/**
|
||||
* Argument tokens shortcuts.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class Argument
|
||||
{
|
||||
/**
|
||||
* Checks that argument is exact value or object.
|
||||
*
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return Token\ExactValueToken
|
||||
*/
|
||||
public static function exact($value)
|
||||
{
|
||||
return new Token\ExactValueToken($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that argument is of specific type or instance of specific class.
|
||||
*
|
||||
* @param string $type Type name (`integer`, `string`) or full class name
|
||||
*
|
||||
* @return Token\TypeToken
|
||||
*/
|
||||
public static function type($type)
|
||||
{
|
||||
return new Token\TypeToken($type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that argument object has specific state.
|
||||
*
|
||||
* @param string $methodName
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return Token\ObjectStateToken
|
||||
*/
|
||||
public static function which($methodName, $value)
|
||||
{
|
||||
return new Token\ObjectStateToken($methodName, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that argument matches provided callback.
|
||||
*
|
||||
* @param callable $callback
|
||||
*
|
||||
* @return Token\CallbackToken
|
||||
*/
|
||||
public static function that($callback)
|
||||
{
|
||||
return new Token\CallbackToken($callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Matches any single value.
|
||||
*
|
||||
* @return Token\AnyValueToken
|
||||
*/
|
||||
public static function any()
|
||||
{
|
||||
return new Token\AnyValueToken;
|
||||
}
|
||||
|
||||
/**
|
||||
* Matches all values to the rest of the signature.
|
||||
*
|
||||
* @return Token\AnyValuesToken
|
||||
*/
|
||||
public static function cetera()
|
||||
{
|
||||
return new Token\AnyValuesToken;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that argument matches all tokens
|
||||
*
|
||||
* @param mixed ... a list of tokens
|
||||
*
|
||||
* @return Token\LogicalAndToken
|
||||
*/
|
||||
public static function allOf()
|
||||
{
|
||||
return new Token\LogicalAndToken(func_get_args());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that argument array or countable object has exact number of elements.
|
||||
*
|
||||
* @param integer $value array elements count
|
||||
*
|
||||
* @return Token\ArrayCountToken
|
||||
*/
|
||||
public static function size($value)
|
||||
{
|
||||
return new Token\ArrayCountToken($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that argument array contains (key, value) pair
|
||||
*
|
||||
* @param mixed $key exact value or token
|
||||
* @param mixed $value exact value or token
|
||||
*
|
||||
* @return Token\ArrayEntryToken
|
||||
*/
|
||||
public static function withEntry($key, $value)
|
||||
{
|
||||
return new Token\ArrayEntryToken($key, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that arguments array entries all match value
|
||||
*
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return Token\ArrayEveryEntryToken
|
||||
*/
|
||||
public static function withEveryEntry($value)
|
||||
{
|
||||
return new Token\ArrayEveryEntryToken($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that argument array contains value
|
||||
*
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return Token\ArrayEntryToken
|
||||
*/
|
||||
public static function containing($value)
|
||||
{
|
||||
return new Token\ArrayEntryToken(self::any(), $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that argument array has key
|
||||
*
|
||||
* @param mixed $key exact value or token
|
||||
*
|
||||
* @return Token\ArrayEntryToken
|
||||
*/
|
||||
public static function withKey($key)
|
||||
{
|
||||
return new Token\ArrayEntryToken($key, self::any());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that argument does not match the value|token.
|
||||
*
|
||||
* @param mixed $value either exact value or argument token
|
||||
*
|
||||
* @return Token\LogicalNotToken
|
||||
*/
|
||||
public static function not($value)
|
||||
{
|
||||
return new Token\LogicalNotToken($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $value
|
||||
*
|
||||
* @return Token\StringContainsToken
|
||||
*/
|
||||
public static function containingString($value)
|
||||
{
|
||||
return new Token\StringContainsToken($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that argument is identical value.
|
||||
*
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return Token\IdenticalValueToken
|
||||
*/
|
||||
public static function is($value)
|
||||
{
|
||||
return new Token\IdenticalValueToken($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check that argument is same value when rounding to the
|
||||
* given precision.
|
||||
*
|
||||
* @param float $value
|
||||
* @param float $precision
|
||||
*
|
||||
* @return Token\ApproximateValueToken
|
||||
*/
|
||||
public static function approximate($value, $precision = 0)
|
||||
{
|
||||
return new Token\ApproximateValueToken($value, $precision);
|
||||
}
|
||||
}
|
101
vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php
vendored
Normal file
101
vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php
vendored
Normal file
@ -0,0 +1,101 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Argument;
|
||||
|
||||
/**
|
||||
* Arguments wildcarding.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class ArgumentsWildcard
|
||||
{
|
||||
/**
|
||||
* @var Token\TokenInterface[]
|
||||
*/
|
||||
private $tokens = array();
|
||||
private $string;
|
||||
|
||||
/**
|
||||
* Initializes wildcard.
|
||||
*
|
||||
* @param array $arguments Array of argument tokens or values
|
||||
*/
|
||||
public function __construct(array $arguments)
|
||||
{
|
||||
foreach ($arguments as $argument) {
|
||||
if (!$argument instanceof Token\TokenInterface) {
|
||||
$argument = new Token\ExactValueToken($argument);
|
||||
}
|
||||
|
||||
$this->tokens[] = $argument;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates wildcard match score for provided arguments.
|
||||
*
|
||||
* @param array $arguments
|
||||
*
|
||||
* @return false|int False OR integer score (higher - better)
|
||||
*/
|
||||
public function scoreArguments(array $arguments)
|
||||
{
|
||||
if (0 == count($arguments) && 0 == count($this->tokens)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
$arguments = array_values($arguments);
|
||||
$totalScore = 0;
|
||||
foreach ($this->tokens as $i => $token) {
|
||||
$argument = isset($arguments[$i]) ? $arguments[$i] : null;
|
||||
if (1 >= $score = $token->scoreArgument($argument)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$totalScore += $score;
|
||||
|
||||
if (true === $token->isLast()) {
|
||||
return $totalScore;
|
||||
}
|
||||
}
|
||||
|
||||
if (count($arguments) > count($this->tokens)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $totalScore;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation for wildcard.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
if (null === $this->string) {
|
||||
$this->string = implode(', ', array_map(function ($token) {
|
||||
return (string) $token;
|
||||
}, $this->tokens));
|
||||
}
|
||||
|
||||
return $this->string;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getTokens()
|
||||
{
|
||||
return $this->tokens;
|
||||
}
|
||||
}
|
52
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php
vendored
Normal file
52
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php
vendored
Normal file
@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Argument\Token;
|
||||
|
||||
/**
|
||||
* Any single value token.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class AnyValueToken implements TokenInterface
|
||||
{
|
||||
/**
|
||||
* Always scores 3 for any argument.
|
||||
*
|
||||
* @param $argument
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function scoreArgument($argument)
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns false.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isLast()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation for token.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return '*';
|
||||
}
|
||||
}
|
52
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php
vendored
Normal file
52
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php
vendored
Normal file
@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Argument\Token;
|
||||
|
||||
/**
|
||||
* Any values token.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class AnyValuesToken implements TokenInterface
|
||||
{
|
||||
/**
|
||||
* Always scores 2 for any argument.
|
||||
*
|
||||
* @param $argument
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function scoreArgument($argument)
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true to stop wildcard from processing other tokens.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isLast()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation for token.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return '* [, ...]';
|
||||
}
|
||||
}
|
55
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php
vendored
Normal file
55
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php
vendored
Normal file
@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Argument\Token;
|
||||
|
||||
/**
|
||||
* Approximate value token
|
||||
*
|
||||
* @author Daniel Leech <daniel@dantleech.com>
|
||||
*/
|
||||
class ApproximateValueToken implements TokenInterface
|
||||
{
|
||||
private $value;
|
||||
private $precision;
|
||||
|
||||
public function __construct($value, $precision = 0)
|
||||
{
|
||||
$this->value = $value;
|
||||
$this->precision = $precision;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function scoreArgument($argument)
|
||||
{
|
||||
return round($argument, $this->precision) === round($this->value, $this->precision) ? 10 : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function isLast()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation for token.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return sprintf('≅%s', round($this->value, $this->precision));
|
||||
}
|
||||
}
|
86
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php
vendored
Normal file
86
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php
vendored
Normal file
@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Argument\Token;
|
||||
|
||||
/**
|
||||
* Array elements count token.
|
||||
*
|
||||
* @author Boris Mikhaylov <kaguxmail@gmail.com>
|
||||
*/
|
||||
|
||||
class ArrayCountToken implements TokenInterface
|
||||
{
|
||||
private $count;
|
||||
|
||||
/**
|
||||
* @param integer $value
|
||||
*/
|
||||
public function __construct($value)
|
||||
{
|
||||
$this->count = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Scores 6 when argument has preset number of elements.
|
||||
*
|
||||
* @param $argument
|
||||
*
|
||||
* @return bool|int
|
||||
*/
|
||||
public function scoreArgument($argument)
|
||||
{
|
||||
return $this->isCountable($argument) && $this->hasProperCount($argument) ? 6 : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns false.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isLast()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation for token.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return sprintf('count(%s)', $this->count);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if object is either array or instance of \Countable
|
||||
*
|
||||
* @param $argument
|
||||
* @return bool
|
||||
*/
|
||||
private function isCountable($argument)
|
||||
{
|
||||
return (is_array($argument) || $argument instanceof \Countable);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if $argument has expected number of elements
|
||||
*
|
||||
* @param array|\Countable $argument
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function hasProperCount($argument)
|
||||
{
|
||||
return $this->count === count($argument);
|
||||
}
|
||||
}
|
143
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php
vendored
Normal file
143
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php
vendored
Normal file
@ -0,0 +1,143 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Argument\Token;
|
||||
|
||||
use Prophecy\Exception\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* Array entry token.
|
||||
*
|
||||
* @author Boris Mikhaylov <kaguxmail@gmail.com>
|
||||
*/
|
||||
class ArrayEntryToken implements TokenInterface
|
||||
{
|
||||
/** @var \Prophecy\Argument\Token\TokenInterface */
|
||||
private $key;
|
||||
/** @var \Prophecy\Argument\Token\TokenInterface */
|
||||
private $value;
|
||||
|
||||
/**
|
||||
* @param mixed $key exact value or token
|
||||
* @param mixed $value exact value or token
|
||||
*/
|
||||
public function __construct($key, $value)
|
||||
{
|
||||
$this->key = $this->wrapIntoExactValueToken($key);
|
||||
$this->value = $this->wrapIntoExactValueToken($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Scores half of combined scores from key and value tokens for same entry. Capped at 8.
|
||||
* If argument implements \ArrayAccess without \Traversable, then key token is restricted to ExactValueToken.
|
||||
*
|
||||
* @param array|\ArrayAccess|\Traversable $argument
|
||||
*
|
||||
* @throws \Prophecy\Exception\InvalidArgumentException
|
||||
* @return bool|int
|
||||
*/
|
||||
public function scoreArgument($argument)
|
||||
{
|
||||
if ($argument instanceof \Traversable) {
|
||||
$argument = iterator_to_array($argument);
|
||||
}
|
||||
|
||||
if ($argument instanceof \ArrayAccess) {
|
||||
$argument = $this->convertArrayAccessToEntry($argument);
|
||||
}
|
||||
|
||||
if (!is_array($argument) || empty($argument)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$keyScores = array_map(array($this->key,'scoreArgument'), array_keys($argument));
|
||||
$valueScores = array_map(array($this->value,'scoreArgument'), $argument);
|
||||
$scoreEntry = function ($value, $key) {
|
||||
return $value && $key ? min(8, ($key + $value) / 2) : false;
|
||||
};
|
||||
|
||||
return max(array_map($scoreEntry, $valueScores, $keyScores));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns false.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isLast()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation for token.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return sprintf('[..., %s => %s, ...]', $this->key, $this->value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns key
|
||||
*
|
||||
* @return TokenInterface
|
||||
*/
|
||||
public function getKey()
|
||||
{
|
||||
return $this->key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns value
|
||||
*
|
||||
* @return TokenInterface
|
||||
*/
|
||||
public function getValue()
|
||||
{
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wraps non token $value into ExactValueToken
|
||||
*
|
||||
* @param $value
|
||||
* @return TokenInterface
|
||||
*/
|
||||
private function wrapIntoExactValueToken($value)
|
||||
{
|
||||
return $value instanceof TokenInterface ? $value : new ExactValueToken($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts instance of \ArrayAccess to key => value array entry
|
||||
*
|
||||
* @param \ArrayAccess $object
|
||||
*
|
||||
* @return array|null
|
||||
* @throws \Prophecy\Exception\InvalidArgumentException
|
||||
*/
|
||||
private function convertArrayAccessToEntry(\ArrayAccess $object)
|
||||
{
|
||||
if (!$this->key instanceof ExactValueToken) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'You can only use exact value tokens to match key of ArrayAccess object'.PHP_EOL.
|
||||
'But you used `%s`.',
|
||||
$this->key
|
||||
));
|
||||
}
|
||||
|
||||
$key = $this->key->getValue();
|
||||
|
||||
return $object->offsetExists($key) ? array($key => $object[$key]) : array();
|
||||
}
|
||||
}
|
82
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php
vendored
Normal file
82
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php
vendored
Normal file
@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Argument\Token;
|
||||
|
||||
/**
|
||||
* Array every entry token.
|
||||
*
|
||||
* @author Adrien Brault <adrien.brault@gmail.com>
|
||||
*/
|
||||
class ArrayEveryEntryToken implements TokenInterface
|
||||
{
|
||||
/**
|
||||
* @var TokenInterface
|
||||
*/
|
||||
private $value;
|
||||
|
||||
/**
|
||||
* @param mixed $value exact value or token
|
||||
*/
|
||||
public function __construct($value)
|
||||
{
|
||||
if (!$value instanceof TokenInterface) {
|
||||
$value = new ExactValueToken($value);
|
||||
}
|
||||
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function scoreArgument($argument)
|
||||
{
|
||||
if (!$argument instanceof \Traversable && !is_array($argument)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$scores = array();
|
||||
foreach ($argument as $key => $argumentEntry) {
|
||||
$scores[] = $this->value->scoreArgument($argumentEntry);
|
||||
}
|
||||
|
||||
if (empty($scores) || in_array(false, $scores, true)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return array_sum($scores) / count($scores);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function isLast()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return sprintf('[%s, ..., %s]', $this->value, $this->value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return TokenInterface
|
||||
*/
|
||||
public function getValue()
|
||||
{
|
||||
return $this->value;
|
||||
}
|
||||
}
|
75
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php
vendored
Normal file
75
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php
vendored
Normal file
@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Argument\Token;
|
||||
|
||||
use Prophecy\Exception\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* Callback-verified token.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class CallbackToken implements TokenInterface
|
||||
{
|
||||
private $callback;
|
||||
|
||||
/**
|
||||
* Initializes token.
|
||||
*
|
||||
* @param callable $callback
|
||||
*
|
||||
* @throws \Prophecy\Exception\InvalidArgumentException
|
||||
*/
|
||||
public function __construct($callback)
|
||||
{
|
||||
if (!is_callable($callback)) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'Callable expected as an argument to CallbackToken, but got %s.',
|
||||
gettype($callback)
|
||||
));
|
||||
}
|
||||
|
||||
$this->callback = $callback;
|
||||
}
|
||||
|
||||
/**
|
||||
* Scores 7 if callback returns true, false otherwise.
|
||||
*
|
||||
* @param $argument
|
||||
*
|
||||
* @return bool|int
|
||||
*/
|
||||
public function scoreArgument($argument)
|
||||
{
|
||||
return call_user_func($this->callback, $argument) ? 7 : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns false.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isLast()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation for token.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return 'callback()';
|
||||
}
|
||||
}
|
118
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php
vendored
Normal file
118
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php
vendored
Normal file
@ -0,0 +1,118 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Argument\Token;
|
||||
|
||||
use SebastianBergmann\Comparator\ComparisonFailure;
|
||||
use Prophecy\Comparator\Factory as ComparatorFactory;
|
||||
use Prophecy\Util\StringUtil;
|
||||
|
||||
/**
|
||||
* Exact value token.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class ExactValueToken implements TokenInterface
|
||||
{
|
||||
private $value;
|
||||
private $string;
|
||||
private $util;
|
||||
private $comparatorFactory;
|
||||
|
||||
/**
|
||||
* Initializes token.
|
||||
*
|
||||
* @param mixed $value
|
||||
* @param StringUtil $util
|
||||
* @param ComparatorFactory $comparatorFactory
|
||||
*/
|
||||
public function __construct($value, StringUtil $util = null, ComparatorFactory $comparatorFactory = null)
|
||||
{
|
||||
$this->value = $value;
|
||||
$this->util = $util ?: new StringUtil();
|
||||
|
||||
$this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
* Scores 10 if argument matches preset value.
|
||||
*
|
||||
* @param $argument
|
||||
*
|
||||
* @return bool|int
|
||||
*/
|
||||
public function scoreArgument($argument)
|
||||
{
|
||||
if (is_object($argument) && is_object($this->value)) {
|
||||
$comparator = $this->comparatorFactory->getComparatorFor(
|
||||
$argument, $this->value
|
||||
);
|
||||
|
||||
try {
|
||||
$comparator->assertEquals($argument, $this->value);
|
||||
return 10;
|
||||
} catch (ComparisonFailure $failure) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// If either one is an object it should be castable to a string
|
||||
if (is_object($argument) xor is_object($this->value)) {
|
||||
if (is_object($argument) && !method_exists($argument, '__toString')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (is_object($this->value) && !method_exists($this->value, '__toString')) {
|
||||
return false;
|
||||
}
|
||||
} elseif (is_numeric($argument) && is_numeric($this->value)) {
|
||||
// noop
|
||||
} elseif (gettype($argument) !== gettype($this->value)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $argument == $this->value ? 10 : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns preset value against which token checks arguments.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getValue()
|
||||
{
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns false.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isLast()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation for token.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
if (null === $this->string) {
|
||||
$this->string = sprintf('exact(%s)', $this->util->stringify($this->value));
|
||||
}
|
||||
|
||||
return $this->string;
|
||||
}
|
||||
}
|
74
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php
vendored
Normal file
74
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php
vendored
Normal file
@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Argument\Token;
|
||||
|
||||
use Prophecy\Util\StringUtil;
|
||||
|
||||
/**
|
||||
* Identical value token.
|
||||
*
|
||||
* @author Florian Voutzinos <florian@voutzinos.com>
|
||||
*/
|
||||
class IdenticalValueToken implements TokenInterface
|
||||
{
|
||||
private $value;
|
||||
private $string;
|
||||
private $util;
|
||||
|
||||
/**
|
||||
* Initializes token.
|
||||
*
|
||||
* @param mixed $value
|
||||
* @param StringUtil $util
|
||||
*/
|
||||
public function __construct($value, StringUtil $util = null)
|
||||
{
|
||||
$this->value = $value;
|
||||
$this->util = $util ?: new StringUtil();
|
||||
}
|
||||
|
||||
/**
|
||||
* Scores 11 if argument matches preset value.
|
||||
*
|
||||
* @param $argument
|
||||
*
|
||||
* @return bool|int
|
||||
*/
|
||||
public function scoreArgument($argument)
|
||||
{
|
||||
return $argument === $this->value ? 11 : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns false.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isLast()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation for token.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
if (null === $this->string) {
|
||||
$this->string = sprintf('identical(%s)', $this->util->stringify($this->value));
|
||||
}
|
||||
|
||||
return $this->string;
|
||||
}
|
||||
}
|
80
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php
vendored
Normal file
80
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php
vendored
Normal file
@ -0,0 +1,80 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Argument\Token;
|
||||
|
||||
/**
|
||||
* Logical AND token.
|
||||
*
|
||||
* @author Boris Mikhaylov <kaguxmail@gmail.com>
|
||||
*/
|
||||
class LogicalAndToken implements TokenInterface
|
||||
{
|
||||
private $tokens = array();
|
||||
|
||||
/**
|
||||
* @param array $arguments exact values or tokens
|
||||
*/
|
||||
public function __construct(array $arguments)
|
||||
{
|
||||
foreach ($arguments as $argument) {
|
||||
if (!$argument instanceof TokenInterface) {
|
||||
$argument = new ExactValueToken($argument);
|
||||
}
|
||||
$this->tokens[] = $argument;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Scores maximum score from scores returned by tokens for this argument if all of them score.
|
||||
*
|
||||
* @param $argument
|
||||
*
|
||||
* @return bool|int
|
||||
*/
|
||||
public function scoreArgument($argument)
|
||||
{
|
||||
if (0 === count($this->tokens)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$maxScore = 0;
|
||||
foreach ($this->tokens as $token) {
|
||||
$score = $token->scoreArgument($argument);
|
||||
if (false === $score) {
|
||||
return false;
|
||||
}
|
||||
$maxScore = max($score, $maxScore);
|
||||
}
|
||||
|
||||
return $maxScore;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns false.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isLast()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation for token.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return sprintf('bool(%s)', implode(' AND ', $this->tokens));
|
||||
}
|
||||
}
|
73
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php
vendored
Normal file
73
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php
vendored
Normal file
@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Argument\Token;
|
||||
|
||||
/**
|
||||
* Logical NOT token.
|
||||
*
|
||||
* @author Boris Mikhaylov <kaguxmail@gmail.com>
|
||||
*/
|
||||
class LogicalNotToken implements TokenInterface
|
||||
{
|
||||
/** @var \Prophecy\Argument\Token\TokenInterface */
|
||||
private $token;
|
||||
|
||||
/**
|
||||
* @param mixed $value exact value or token
|
||||
*/
|
||||
public function __construct($value)
|
||||
{
|
||||
$this->token = $value instanceof TokenInterface? $value : new ExactValueToken($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Scores 4 when preset token does not match the argument.
|
||||
*
|
||||
* @param $argument
|
||||
*
|
||||
* @return bool|int
|
||||
*/
|
||||
public function scoreArgument($argument)
|
||||
{
|
||||
return false === $this->token->scoreArgument($argument) ? 4 : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if preset token is last.
|
||||
*
|
||||
* @return bool|int
|
||||
*/
|
||||
public function isLast()
|
||||
{
|
||||
return $this->token->isLast();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns originating token.
|
||||
*
|
||||
* @return TokenInterface
|
||||
*/
|
||||
public function getOriginatingToken()
|
||||
{
|
||||
return $this->token;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation for token.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return sprintf('not(%s)', $this->token);
|
||||
}
|
||||
}
|
104
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php
vendored
Normal file
104
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php
vendored
Normal file
@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Argument\Token;
|
||||
|
||||
use SebastianBergmann\Comparator\ComparisonFailure;
|
||||
use Prophecy\Comparator\Factory as ComparatorFactory;
|
||||
use Prophecy\Util\StringUtil;
|
||||
|
||||
/**
|
||||
* Object state-checker token.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class ObjectStateToken implements TokenInterface
|
||||
{
|
||||
private $name;
|
||||
private $value;
|
||||
private $util;
|
||||
private $comparatorFactory;
|
||||
|
||||
/**
|
||||
* Initializes token.
|
||||
*
|
||||
* @param string $methodName
|
||||
* @param mixed $value Expected return value
|
||||
* @param null|StringUtil $util
|
||||
* @param ComparatorFactory $comparatorFactory
|
||||
*/
|
||||
public function __construct(
|
||||
$methodName,
|
||||
$value,
|
||||
StringUtil $util = null,
|
||||
ComparatorFactory $comparatorFactory = null
|
||||
) {
|
||||
$this->name = $methodName;
|
||||
$this->value = $value;
|
||||
$this->util = $util ?: new StringUtil;
|
||||
|
||||
$this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
* Scores 8 if argument is an object, which method returns expected value.
|
||||
*
|
||||
* @param mixed $argument
|
||||
*
|
||||
* @return bool|int
|
||||
*/
|
||||
public function scoreArgument($argument)
|
||||
{
|
||||
if (is_object($argument) && method_exists($argument, $this->name)) {
|
||||
$actual = call_user_func(array($argument, $this->name));
|
||||
|
||||
$comparator = $this->comparatorFactory->getComparatorFor(
|
||||
$this->value, $actual
|
||||
);
|
||||
|
||||
try {
|
||||
$comparator->assertEquals($this->value, $actual);
|
||||
return 8;
|
||||
} catch (ComparisonFailure $failure) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (is_object($argument) && property_exists($argument, $this->name)) {
|
||||
return $argument->{$this->name} === $this->value ? 8 : false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns false.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isLast()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation for token.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return sprintf('state(%s(), %s)',
|
||||
$this->name,
|
||||
$this->util->stringify($this->value)
|
||||
);
|
||||
}
|
||||
}
|
67
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php
vendored
Normal file
67
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php
vendored
Normal file
@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Argument\Token;
|
||||
|
||||
/**
|
||||
* String contains token.
|
||||
*
|
||||
* @author Peter Mitchell <pete@peterjmit.com>
|
||||
*/
|
||||
class StringContainsToken implements TokenInterface
|
||||
{
|
||||
private $value;
|
||||
|
||||
/**
|
||||
* Initializes token.
|
||||
*
|
||||
* @param string $value
|
||||
*/
|
||||
public function __construct($value)
|
||||
{
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
public function scoreArgument($argument)
|
||||
{
|
||||
return is_string($argument) && strpos($argument, $this->value) !== false ? 6 : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns preset value against which token checks arguments.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getValue()
|
||||
{
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns false.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isLast()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation for token.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return sprintf('contains("%s")', $this->value);
|
||||
}
|
||||
}
|
43
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php
vendored
Normal file
43
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php
vendored
Normal file
@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Argument\Token;
|
||||
|
||||
/**
|
||||
* Argument token interface.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
interface TokenInterface
|
||||
{
|
||||
/**
|
||||
* Calculates token match score for provided argument.
|
||||
*
|
||||
* @param $argument
|
||||
*
|
||||
* @return bool|int
|
||||
*/
|
||||
public function scoreArgument($argument);
|
||||
|
||||
/**
|
||||
* Returns true if this token prevents check of other tokens (is last one).
|
||||
*
|
||||
* @return bool|int
|
||||
*/
|
||||
public function isLast();
|
||||
|
||||
/**
|
||||
* Returns string representation for token.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString();
|
||||
}
|
76
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php
vendored
Normal file
76
vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php
vendored
Normal file
@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Argument\Token;
|
||||
|
||||
use Prophecy\Exception\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* Value type token.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class TypeToken implements TokenInterface
|
||||
{
|
||||
private $type;
|
||||
|
||||
/**
|
||||
* @param string $type
|
||||
*/
|
||||
public function __construct($type)
|
||||
{
|
||||
$checker = "is_{$type}";
|
||||
if (!function_exists($checker) && !interface_exists($type) && !class_exists($type)) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'Type or class name expected as an argument to TypeToken, but got %s.', $type
|
||||
));
|
||||
}
|
||||
|
||||
$this->type = $type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Scores 5 if argument has the same type this token was constructed with.
|
||||
*
|
||||
* @param $argument
|
||||
*
|
||||
* @return bool|int
|
||||
*/
|
||||
public function scoreArgument($argument)
|
||||
{
|
||||
$checker = "is_{$this->type}";
|
||||
if (function_exists($checker)) {
|
||||
return call_user_func($checker, $argument) ? 5 : false;
|
||||
}
|
||||
|
||||
return $argument instanceof $this->type ? 5 : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns false.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isLast()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation for token.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return sprintf('type(%s)', $this->type);
|
||||
}
|
||||
}
|
162
vendor/phpspec/prophecy/src/Prophecy/Call/Call.php
vendored
Normal file
162
vendor/phpspec/prophecy/src/Prophecy/Call/Call.php
vendored
Normal file
@ -0,0 +1,162 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Call;
|
||||
|
||||
use Exception;
|
||||
use Prophecy\Argument\ArgumentsWildcard;
|
||||
|
||||
/**
|
||||
* Call object.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class Call
|
||||
{
|
||||
private $methodName;
|
||||
private $arguments;
|
||||
private $returnValue;
|
||||
private $exception;
|
||||
private $file;
|
||||
private $line;
|
||||
private $scores;
|
||||
|
||||
/**
|
||||
* Initializes call.
|
||||
*
|
||||
* @param string $methodName
|
||||
* @param array $arguments
|
||||
* @param mixed $returnValue
|
||||
* @param Exception $exception
|
||||
* @param null|string $file
|
||||
* @param null|int $line
|
||||
*/
|
||||
public function __construct($methodName, array $arguments, $returnValue,
|
||||
Exception $exception = null, $file, $line)
|
||||
{
|
||||
$this->methodName = $methodName;
|
||||
$this->arguments = $arguments;
|
||||
$this->returnValue = $returnValue;
|
||||
$this->exception = $exception;
|
||||
$this->scores = new \SplObjectStorage();
|
||||
|
||||
if ($file) {
|
||||
$this->file = $file;
|
||||
$this->line = intval($line);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns called method name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getMethodName()
|
||||
{
|
||||
return $this->methodName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns called method arguments.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getArguments()
|
||||
{
|
||||
return $this->arguments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns called method return value.
|
||||
*
|
||||
* @return null|mixed
|
||||
*/
|
||||
public function getReturnValue()
|
||||
{
|
||||
return $this->returnValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns exception that call thrown.
|
||||
*
|
||||
* @return null|Exception
|
||||
*/
|
||||
public function getException()
|
||||
{
|
||||
return $this->exception;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns callee filename.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getFile()
|
||||
{
|
||||
return $this->file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns callee line number.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getLine()
|
||||
{
|
||||
return $this->line;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns short notation for callee place.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getCallPlace()
|
||||
{
|
||||
if (null === $this->file) {
|
||||
return 'unknown';
|
||||
}
|
||||
|
||||
return sprintf('%s:%d', $this->file, $this->line);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the wildcard match score for the provided wildcard.
|
||||
*
|
||||
* @param ArgumentsWildcard $wildcard
|
||||
* @param false|int $score
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function addScore(ArgumentsWildcard $wildcard, $score)
|
||||
{
|
||||
$this->scores[$wildcard] = $score;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns wildcard match score for the provided wildcard. The score is
|
||||
* calculated if not already done.
|
||||
*
|
||||
* @param ArgumentsWildcard $wildcard
|
||||
*
|
||||
* @return false|int False OR integer score (higher - better)
|
||||
*/
|
||||
public function getScore(ArgumentsWildcard $wildcard)
|
||||
{
|
||||
if (isset($this->scores[$wildcard])) {
|
||||
return $this->scores[$wildcard];
|
||||
}
|
||||
|
||||
return $this->scores[$wildcard] = $wildcard->scoreArguments($this->getArguments());
|
||||
}
|
||||
}
|
248
vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php
vendored
Normal file
248
vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php
vendored
Normal file
@ -0,0 +1,248 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Call;
|
||||
|
||||
use Prophecy\Exception\Prophecy\MethodProphecyException;
|
||||
use Prophecy\Prophecy\ObjectProphecy;
|
||||
use Prophecy\Argument\ArgumentsWildcard;
|
||||
use Prophecy\Util\StringUtil;
|
||||
use Prophecy\Exception\Call\UnexpectedCallException;
|
||||
use SplObjectStorage;
|
||||
|
||||
/**
|
||||
* Calls receiver & manager.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class CallCenter
|
||||
{
|
||||
private $util;
|
||||
|
||||
/**
|
||||
* @var Call[]
|
||||
*/
|
||||
private $recordedCalls = array();
|
||||
|
||||
/**
|
||||
* @var SplObjectStorage
|
||||
*/
|
||||
private $unexpectedCalls;
|
||||
|
||||
/**
|
||||
* Initializes call center.
|
||||
*
|
||||
* @param StringUtil $util
|
||||
*/
|
||||
public function __construct(StringUtil $util = null)
|
||||
{
|
||||
$this->util = $util ?: new StringUtil;
|
||||
$this->unexpectedCalls = new SplObjectStorage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes and records specific method call for object prophecy.
|
||||
*
|
||||
* @param ObjectProphecy $prophecy
|
||||
* @param string $methodName
|
||||
* @param array $arguments
|
||||
*
|
||||
* @return mixed Returns null if no promise for prophecy found or promise return value.
|
||||
*
|
||||
* @throws \Prophecy\Exception\Call\UnexpectedCallException If no appropriate method prophecy found
|
||||
*/
|
||||
public function makeCall(ObjectProphecy $prophecy, $methodName, array $arguments)
|
||||
{
|
||||
// For efficiency exclude 'args' from the generated backtrace
|
||||
if (PHP_VERSION_ID >= 50400) {
|
||||
// Limit backtrace to last 3 calls as we don't use the rest
|
||||
// Limit argument was introduced in PHP 5.4.0
|
||||
$backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3);
|
||||
} elseif (defined('DEBUG_BACKTRACE_IGNORE_ARGS')) {
|
||||
// DEBUG_BACKTRACE_IGNORE_ARGS was introduced in PHP 5.3.6
|
||||
$backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
|
||||
} else {
|
||||
$backtrace = debug_backtrace();
|
||||
}
|
||||
|
||||
$file = $line = null;
|
||||
if (isset($backtrace[2]) && isset($backtrace[2]['file'])) {
|
||||
$file = $backtrace[2]['file'];
|
||||
$line = $backtrace[2]['line'];
|
||||
}
|
||||
|
||||
// If no method prophecies defined, then it's a dummy, so we'll just return null
|
||||
if ('__destruct' === strtolower($methodName) || 0 == count($prophecy->getMethodProphecies())) {
|
||||
$this->recordedCalls[] = new Call($methodName, $arguments, null, null, $file, $line);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// There are method prophecies, so it's a fake/stub. Searching prophecy for this call
|
||||
$matches = $this->findMethodProphecies($prophecy, $methodName, $arguments);
|
||||
|
||||
// If fake/stub doesn't have method prophecy for this call - throw exception
|
||||
if (!count($matches)) {
|
||||
$this->unexpectedCalls->attach(new Call($methodName, $arguments, null, null, $file, $line), $prophecy);
|
||||
$this->recordedCalls[] = new Call($methodName, $arguments, null, null, $file, $line);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// Sort matches by their score value
|
||||
@usort($matches, function ($match1, $match2) { return $match2[0] - $match1[0]; });
|
||||
|
||||
$score = $matches[0][0];
|
||||
// If Highest rated method prophecy has a promise - execute it or return null instead
|
||||
$methodProphecy = $matches[0][1];
|
||||
$returnValue = null;
|
||||
$exception = null;
|
||||
if ($promise = $methodProphecy->getPromise()) {
|
||||
try {
|
||||
$returnValue = $promise->execute($arguments, $prophecy, $methodProphecy);
|
||||
} catch (\Exception $e) {
|
||||
$exception = $e;
|
||||
}
|
||||
}
|
||||
|
||||
if ($methodProphecy->hasReturnVoid() && $returnValue !== null) {
|
||||
throw new MethodProphecyException(
|
||||
"The method \"$methodName\" has a void return type, but the promise returned a value",
|
||||
$methodProphecy
|
||||
);
|
||||
}
|
||||
|
||||
$this->recordedCalls[] = $call = new Call(
|
||||
$methodName, $arguments, $returnValue, $exception, $file, $line
|
||||
);
|
||||
$call->addScore($methodProphecy->getArgumentsWildcard(), $score);
|
||||
|
||||
if (null !== $exception) {
|
||||
throw $exception;
|
||||
}
|
||||
|
||||
return $returnValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Searches for calls by method name & arguments wildcard.
|
||||
*
|
||||
* @param string $methodName
|
||||
* @param ArgumentsWildcard $wildcard
|
||||
*
|
||||
* @return Call[]
|
||||
*/
|
||||
public function findCalls($methodName, ArgumentsWildcard $wildcard)
|
||||
{
|
||||
$methodName = strtolower($methodName);
|
||||
|
||||
return array_values(
|
||||
array_filter($this->recordedCalls, function (Call $call) use ($methodName, $wildcard) {
|
||||
return $methodName === strtolower($call->getMethodName())
|
||||
&& 0 < $call->getScore($wildcard)
|
||||
;
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws UnexpectedCallException
|
||||
*/
|
||||
public function checkUnexpectedCalls()
|
||||
{
|
||||
/** @var Call $call */
|
||||
foreach ($this->unexpectedCalls as $call) {
|
||||
$prophecy = $this->unexpectedCalls[$call];
|
||||
|
||||
// If fake/stub doesn't have method prophecy for this call - throw exception
|
||||
if (!count($this->findMethodProphecies($prophecy, $call->getMethodName(), $call->getArguments()))) {
|
||||
throw $this->createUnexpectedCallException($prophecy, $call->getMethodName(), $call->getArguments());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function createUnexpectedCallException(ObjectProphecy $prophecy, $methodName,
|
||||
array $arguments)
|
||||
{
|
||||
$classname = get_class($prophecy->reveal());
|
||||
$indentationLength = 8; // looks good
|
||||
$argstring = implode(
|
||||
",\n",
|
||||
$this->indentArguments(
|
||||
array_map(array($this->util, 'stringify'), $arguments),
|
||||
$indentationLength
|
||||
)
|
||||
);
|
||||
|
||||
$expected = array();
|
||||
|
||||
foreach (call_user_func_array('array_merge', $prophecy->getMethodProphecies()) as $methodProphecy) {
|
||||
$expected[] = sprintf(
|
||||
" - %s(\n" .
|
||||
"%s\n" .
|
||||
" )",
|
||||
$methodProphecy->getMethodName(),
|
||||
implode(
|
||||
",\n",
|
||||
$this->indentArguments(
|
||||
array_map('strval', $methodProphecy->getArgumentsWildcard()->getTokens()),
|
||||
$indentationLength
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return new UnexpectedCallException(
|
||||
sprintf(
|
||||
"Unexpected method call on %s:\n".
|
||||
" - %s(\n".
|
||||
"%s\n".
|
||||
" )\n".
|
||||
"expected calls were:\n".
|
||||
"%s",
|
||||
|
||||
$classname, $methodName, $argstring, implode("\n", $expected)
|
||||
),
|
||||
$prophecy, $methodName, $arguments
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
private function indentArguments(array $arguments, $indentationLength)
|
||||
{
|
||||
return preg_replace_callback(
|
||||
'/^/m',
|
||||
function () use ($indentationLength) {
|
||||
return str_repeat(' ', $indentationLength);
|
||||
},
|
||||
$arguments
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ObjectProphecy $prophecy
|
||||
* @param string $methodName
|
||||
* @param array $arguments
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function findMethodProphecies(ObjectProphecy $prophecy, $methodName, array $arguments)
|
||||
{
|
||||
$matches = array();
|
||||
foreach ($prophecy->getMethodProphecies($methodName) as $methodProphecy) {
|
||||
if (0 < $score = $methodProphecy->getArgumentsWildcard()->scoreArguments($arguments)) {
|
||||
$matches[] = array($score, $methodProphecy);
|
||||
}
|
||||
}
|
||||
|
||||
return $matches;
|
||||
}
|
||||
}
|
44
vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php
vendored
Normal file
44
vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php
vendored
Normal file
@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Comparator;
|
||||
|
||||
use SebastianBergmann\Comparator\Comparator;
|
||||
use SebastianBergmann\Comparator\ComparisonFailure;
|
||||
|
||||
/**
|
||||
* Closure comparator.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
final class ClosureComparator extends Comparator
|
||||
{
|
||||
public function accepts($expected, $actual)
|
||||
{
|
||||
return is_object($expected) && $expected instanceof \Closure
|
||||
&& is_object($actual) && $actual instanceof \Closure;
|
||||
}
|
||||
|
||||
public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array())
|
||||
{
|
||||
if ($expected !== $actual) {
|
||||
throw new ComparisonFailure(
|
||||
$expected,
|
||||
$actual,
|
||||
// we don't need a diff
|
||||
'',
|
||||
'',
|
||||
false,
|
||||
'all closures are different if not identical'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
47
vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php
vendored
Normal file
47
vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php
vendored
Normal file
@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Comparator;
|
||||
|
||||
use SebastianBergmann\Comparator\Factory as BaseFactory;
|
||||
|
||||
/**
|
||||
* Prophecy comparator factory.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
final class Factory extends BaseFactory
|
||||
{
|
||||
/**
|
||||
* @var Factory
|
||||
*/
|
||||
private static $instance;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->register(new ClosureComparator());
|
||||
$this->register(new ProphecyComparator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Factory
|
||||
*/
|
||||
public static function getInstance()
|
||||
{
|
||||
if (self::$instance === null) {
|
||||
self::$instance = new Factory;
|
||||
}
|
||||
|
||||
return self::$instance;
|
||||
}
|
||||
}
|
28
vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php
vendored
Normal file
28
vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Comparator;
|
||||
|
||||
use Prophecy\Prophecy\ProphecyInterface;
|
||||
use SebastianBergmann\Comparator\ObjectComparator;
|
||||
|
||||
class ProphecyComparator extends ObjectComparator
|
||||
{
|
||||
public function accepts($expected, $actual)
|
||||
{
|
||||
return is_object($expected) && is_object($actual) && $actual instanceof ProphecyInterface;
|
||||
}
|
||||
|
||||
public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array())
|
||||
{
|
||||
parent::assertEquals($expected, $actual->reveal(), $delta, $canonicalize, $ignoreCase, $processed);
|
||||
}
|
||||
}
|
66
vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php
vendored
Normal file
66
vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php
vendored
Normal file
@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler;
|
||||
|
||||
use ReflectionClass;
|
||||
|
||||
/**
|
||||
* Cached class doubler.
|
||||
* Prevents mirroring/creation of the same structure twice.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class CachedDoubler extends Doubler
|
||||
{
|
||||
private static $classes = array();
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function createDoubleClass(ReflectionClass $class = null, array $interfaces)
|
||||
{
|
||||
$classId = $this->generateClassId($class, $interfaces);
|
||||
if (isset(self::$classes[$classId])) {
|
||||
return self::$classes[$classId];
|
||||
}
|
||||
|
||||
return self::$classes[$classId] = parent::createDoubleClass($class, $interfaces);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ReflectionClass $class
|
||||
* @param ReflectionClass[] $interfaces
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function generateClassId(ReflectionClass $class = null, array $interfaces)
|
||||
{
|
||||
$parts = array();
|
||||
if (null !== $class) {
|
||||
$parts[] = $class->getName();
|
||||
}
|
||||
foreach ($interfaces as $interface) {
|
||||
$parts[] = $interface->getName();
|
||||
}
|
||||
foreach ($this->getClassPatches() as $patch) {
|
||||
$parts[] = get_class($patch);
|
||||
}
|
||||
sort($parts);
|
||||
|
||||
return md5(implode('', $parts));
|
||||
}
|
||||
|
||||
public function resetCache()
|
||||
{
|
||||
self::$classes = array();
|
||||
}
|
||||
}
|
48
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php
vendored
Normal file
48
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php
vendored
Normal file
@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler\ClassPatch;
|
||||
|
||||
use Prophecy\Doubler\Generator\Node\ClassNode;
|
||||
|
||||
/**
|
||||
* Class patch interface.
|
||||
* Class patches extend doubles functionality or help
|
||||
* Prophecy to avoid some internal PHP bugs.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
interface ClassPatchInterface
|
||||
{
|
||||
/**
|
||||
* Checks if patch supports specific class node.
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function supports(ClassNode $node);
|
||||
|
||||
/**
|
||||
* Applies patch to the specific class node.
|
||||
*
|
||||
* @param ClassNode $node
|
||||
* @return void
|
||||
*/
|
||||
public function apply(ClassNode $node);
|
||||
|
||||
/**
|
||||
* Returns patch priority, which determines when patch will be applied.
|
||||
*
|
||||
* @return int Priority number (higher - earlier)
|
||||
*/
|
||||
public function getPriority();
|
||||
}
|
76
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php
vendored
Normal file
76
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php
vendored
Normal file
@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler\ClassPatch;
|
||||
|
||||
use Prophecy\Doubler\Generator\Node\ClassNode;
|
||||
use Prophecy\Doubler\Generator\Node\MethodNode;
|
||||
|
||||
/**
|
||||
* Disable constructor.
|
||||
* Makes all constructor arguments optional.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class DisableConstructorPatch implements ClassPatchInterface
|
||||
{
|
||||
/**
|
||||
* Checks if class has `__construct` method.
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function supports(ClassNode $node)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes all class constructor arguments optional.
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*/
|
||||
public function apply(ClassNode $node)
|
||||
{
|
||||
if (!$node->isExtendable('__construct')) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$node->hasMethod('__construct')) {
|
||||
$node->addMethod(new MethodNode('__construct', ''));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$constructor = $node->getMethod('__construct');
|
||||
foreach ($constructor->getArguments() as $argument) {
|
||||
$argument->setDefault(null);
|
||||
}
|
||||
|
||||
$constructor->setCode(<<<PHP
|
||||
if (0 < func_num_args()) {
|
||||
call_user_func_array(array('parent', '__construct'), func_get_args());
|
||||
}
|
||||
PHP
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns patch priority, which determines when patch will be applied.
|
||||
*
|
||||
* @return int Priority number (higher - earlier)
|
||||
*/
|
||||
public function getPriority()
|
||||
{
|
||||
return 100;
|
||||
}
|
||||
}
|
63
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.php
vendored
Normal file
63
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.php
vendored
Normal file
@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler\ClassPatch;
|
||||
|
||||
use Prophecy\Doubler\Generator\Node\ClassNode;
|
||||
|
||||
/**
|
||||
* Exception patch for HHVM to remove the stubs from special methods
|
||||
*
|
||||
* @author Christophe Coevoet <stof@notk.org>
|
||||
*/
|
||||
class HhvmExceptionPatch implements ClassPatchInterface
|
||||
{
|
||||
/**
|
||||
* Supports exceptions on HHVM.
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function supports(ClassNode $node)
|
||||
{
|
||||
if (!defined('HHVM_VERSION')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return 'Exception' === $node->getParentClass() || is_subclass_of($node->getParentClass(), 'Exception');
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes special exception static methods from the doubled methods.
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function apply(ClassNode $node)
|
||||
{
|
||||
if ($node->hasMethod('setTraceOptions')) {
|
||||
$node->getMethod('setTraceOptions')->useParentCode();
|
||||
}
|
||||
if ($node->hasMethod('getTraceOptions')) {
|
||||
$node->getMethod('getTraceOptions')->useParentCode();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getPriority()
|
||||
{
|
||||
return -50;
|
||||
}
|
||||
}
|
140
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php
vendored
Normal file
140
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php
vendored
Normal file
@ -0,0 +1,140 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler\ClassPatch;
|
||||
|
||||
use Prophecy\Doubler\Generator\Node\ClassNode;
|
||||
|
||||
/**
|
||||
* Remove method functionality from the double which will clash with php keywords.
|
||||
*
|
||||
* @author Milan Magudia <milan@magudia.com>
|
||||
*/
|
||||
class KeywordPatch implements ClassPatchInterface
|
||||
{
|
||||
/**
|
||||
* Support any class
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function supports(ClassNode $node)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove methods that clash with php keywords
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*/
|
||||
public function apply(ClassNode $node)
|
||||
{
|
||||
$methodNames = array_keys($node->getMethods());
|
||||
$methodsToRemove = array_intersect($methodNames, $this->getKeywords());
|
||||
foreach ($methodsToRemove as $methodName) {
|
||||
$node->removeMethod($methodName);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns patch priority, which determines when patch will be applied.
|
||||
*
|
||||
* @return int Priority number (higher - earlier)
|
||||
*/
|
||||
public function getPriority()
|
||||
{
|
||||
return 49;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns array of php keywords.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function getKeywords()
|
||||
{
|
||||
if (\PHP_VERSION_ID >= 70000) {
|
||||
return array('__halt_compiler');
|
||||
}
|
||||
|
||||
return array(
|
||||
'__halt_compiler',
|
||||
'abstract',
|
||||
'and',
|
||||
'array',
|
||||
'as',
|
||||
'break',
|
||||
'callable',
|
||||
'case',
|
||||
'catch',
|
||||
'class',
|
||||
'clone',
|
||||
'const',
|
||||
'continue',
|
||||
'declare',
|
||||
'default',
|
||||
'die',
|
||||
'do',
|
||||
'echo',
|
||||
'else',
|
||||
'elseif',
|
||||
'empty',
|
||||
'enddeclare',
|
||||
'endfor',
|
||||
'endforeach',
|
||||
'endif',
|
||||
'endswitch',
|
||||
'endwhile',
|
||||
'eval',
|
||||
'exit',
|
||||
'extends',
|
||||
'final',
|
||||
'finally',
|
||||
'for',
|
||||
'foreach',
|
||||
'function',
|
||||
'global',
|
||||
'goto',
|
||||
'if',
|
||||
'implements',
|
||||
'include',
|
||||
'include_once',
|
||||
'instanceof',
|
||||
'insteadof',
|
||||
'interface',
|
||||
'isset',
|
||||
'list',
|
||||
'namespace',
|
||||
'new',
|
||||
'or',
|
||||
'print',
|
||||
'private',
|
||||
'protected',
|
||||
'public',
|
||||
'require',
|
||||
'require_once',
|
||||
'return',
|
||||
'static',
|
||||
'switch',
|
||||
'throw',
|
||||
'trait',
|
||||
'try',
|
||||
'unset',
|
||||
'use',
|
||||
'var',
|
||||
'while',
|
||||
'xor',
|
||||
'yield',
|
||||
);
|
||||
}
|
||||
}
|
94
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php
vendored
Normal file
94
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php
vendored
Normal file
@ -0,0 +1,94 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler\ClassPatch;
|
||||
|
||||
use Prophecy\Doubler\Generator\Node\ClassNode;
|
||||
use Prophecy\Doubler\Generator\Node\MethodNode;
|
||||
use Prophecy\PhpDocumentor\ClassAndInterfaceTagRetriever;
|
||||
use Prophecy\PhpDocumentor\MethodTagRetrieverInterface;
|
||||
|
||||
/**
|
||||
* Discover Magical API using "@method" PHPDoc format.
|
||||
*
|
||||
* @author Thomas Tourlourat <thomas@tourlourat.com>
|
||||
* @author Kévin Dunglas <dunglas@gmail.com>
|
||||
* @author Théo FIDRY <theo.fidry@gmail.com>
|
||||
*/
|
||||
class MagicCallPatch implements ClassPatchInterface
|
||||
{
|
||||
private $tagRetriever;
|
||||
|
||||
public function __construct(MethodTagRetrieverInterface $tagRetriever = null)
|
||||
{
|
||||
$this->tagRetriever = null === $tagRetriever ? new ClassAndInterfaceTagRetriever() : $tagRetriever;
|
||||
}
|
||||
|
||||
/**
|
||||
* Support any class
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function supports(ClassNode $node)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Discover Magical API
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*/
|
||||
public function apply(ClassNode $node)
|
||||
{
|
||||
$types = array_filter($node->getInterfaces(), function ($interface) {
|
||||
return 0 !== strpos($interface, 'Prophecy\\');
|
||||
});
|
||||
$types[] = $node->getParentClass();
|
||||
|
||||
foreach ($types as $type) {
|
||||
$reflectionClass = new \ReflectionClass($type);
|
||||
|
||||
while ($reflectionClass) {
|
||||
$tagList = $this->tagRetriever->getTagList($reflectionClass);
|
||||
|
||||
foreach ($tagList as $tag) {
|
||||
$methodName = $tag->getMethodName();
|
||||
|
||||
if (empty($methodName)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!$reflectionClass->hasMethod($methodName)) {
|
||||
$methodNode = new MethodNode($methodName);
|
||||
$methodNode->setStatic($tag->isStatic());
|
||||
$node->addMethod($methodNode);
|
||||
}
|
||||
}
|
||||
|
||||
$reflectionClass = $reflectionClass->getParentClass();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns patch priority, which determines when patch will be applied.
|
||||
*
|
||||
* @return integer Priority number (higher - earlier)
|
||||
*/
|
||||
public function getPriority()
|
||||
{
|
||||
return 50;
|
||||
}
|
||||
}
|
||||
|
104
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php
vendored
Normal file
104
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php
vendored
Normal file
@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler\ClassPatch;
|
||||
|
||||
use Prophecy\Doubler\Generator\Node\ClassNode;
|
||||
use Prophecy\Doubler\Generator\Node\MethodNode;
|
||||
use Prophecy\Doubler\Generator\Node\ArgumentNode;
|
||||
|
||||
/**
|
||||
* Add Prophecy functionality to the double.
|
||||
* This is a core class patch for Prophecy.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class ProphecySubjectPatch implements ClassPatchInterface
|
||||
{
|
||||
/**
|
||||
* Always returns true.
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function supports(ClassNode $node)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply Prophecy functionality to class node.
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*/
|
||||
public function apply(ClassNode $node)
|
||||
{
|
||||
$node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface');
|
||||
$node->addProperty('objectProphecyClosure', 'private');
|
||||
|
||||
foreach ($node->getMethods() as $name => $method) {
|
||||
if ('__construct' === strtolower($name)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($method->getReturnType() === 'void') {
|
||||
$method->setCode(
|
||||
'$this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());'
|
||||
);
|
||||
} else {
|
||||
$method->setCode(
|
||||
'return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$prophecySetter = new MethodNode('setProphecy');
|
||||
$prophecyArgument = new ArgumentNode('prophecy');
|
||||
$prophecyArgument->setTypeHint('Prophecy\Prophecy\ProphecyInterface');
|
||||
$prophecySetter->addArgument($prophecyArgument);
|
||||
$prophecySetter->setCode('$this->objectProphecyClosure = function () use ($prophecy) { return $prophecy; };');
|
||||
|
||||
$prophecyGetter = new MethodNode('getProphecy');
|
||||
$prophecyGetter->setCode('return call_user_func($this->objectProphecyClosure);');
|
||||
|
||||
if ($node->hasMethod('__call')) {
|
||||
$__call = $node->getMethod('__call');
|
||||
} else {
|
||||
$__call = new MethodNode('__call');
|
||||
$__call->addArgument(new ArgumentNode('name'));
|
||||
$__call->addArgument(new ArgumentNode('arguments'));
|
||||
|
||||
$node->addMethod($__call, true);
|
||||
}
|
||||
|
||||
$__call->setCode(<<<PHP
|
||||
throw new \Prophecy\Exception\Doubler\MethodNotFoundException(
|
||||
sprintf('Method `%s::%s()` not found.', get_class(\$this), func_get_arg(0)),
|
||||
\$this->getProphecy(), func_get_arg(0)
|
||||
);
|
||||
PHP
|
||||
);
|
||||
|
||||
$node->addMethod($prophecySetter, true);
|
||||
$node->addMethod($prophecyGetter, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns patch priority, which determines when patch will be applied.
|
||||
*
|
||||
* @return int Priority number (higher - earlier)
|
||||
*/
|
||||
public function getPriority()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
57
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php
vendored
Normal file
57
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php
vendored
Normal file
@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler\ClassPatch;
|
||||
|
||||
use Prophecy\Doubler\Generator\Node\ClassNode;
|
||||
|
||||
/**
|
||||
* ReflectionClass::newInstance patch.
|
||||
* Makes first argument of newInstance optional, since it works but signature is misleading
|
||||
*
|
||||
* @author Florian Klein <florian.klein@free.fr>
|
||||
*/
|
||||
class ReflectionClassNewInstancePatch implements ClassPatchInterface
|
||||
{
|
||||
/**
|
||||
* Supports ReflectionClass
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function supports(ClassNode $node)
|
||||
{
|
||||
return 'ReflectionClass' === $node->getParentClass();
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates newInstance's first argument to make it optional
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*/
|
||||
public function apply(ClassNode $node)
|
||||
{
|
||||
foreach ($node->getMethod('newInstance')->getArguments() as $argument) {
|
||||
$argument->setDefault(null);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns patch priority, which determines when patch will be applied.
|
||||
*
|
||||
* @return int Priority number (higher = earlier)
|
||||
*/
|
||||
public function getPriority()
|
||||
{
|
||||
return 50;
|
||||
}
|
||||
}
|
123
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php
vendored
Normal file
123
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php
vendored
Normal file
@ -0,0 +1,123 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler\ClassPatch;
|
||||
|
||||
use Prophecy\Doubler\Generator\Node\ClassNode;
|
||||
use Prophecy\Doubler\Generator\Node\MethodNode;
|
||||
|
||||
/**
|
||||
* SplFileInfo patch.
|
||||
* Makes SplFileInfo and derivative classes usable with Prophecy.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class SplFileInfoPatch implements ClassPatchInterface
|
||||
{
|
||||
/**
|
||||
* Supports everything that extends SplFileInfo.
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function supports(ClassNode $node)
|
||||
{
|
||||
if (null === $node->getParentClass()) {
|
||||
return false;
|
||||
}
|
||||
return 'SplFileInfo' === $node->getParentClass()
|
||||
|| is_subclass_of($node->getParentClass(), 'SplFileInfo')
|
||||
;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updated constructor code to call parent one with dummy file argument.
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*/
|
||||
public function apply(ClassNode $node)
|
||||
{
|
||||
if ($node->hasMethod('__construct')) {
|
||||
$constructor = $node->getMethod('__construct');
|
||||
} else {
|
||||
$constructor = new MethodNode('__construct');
|
||||
$node->addMethod($constructor);
|
||||
}
|
||||
|
||||
if ($this->nodeIsDirectoryIterator($node)) {
|
||||
$constructor->setCode('return parent::__construct("' . __DIR__ . '");');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->nodeIsSplFileObject($node)) {
|
||||
$filePath = str_replace('\\','\\\\',__FILE__);
|
||||
$constructor->setCode('return parent::__construct("' . $filePath .'");');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->nodeIsSymfonySplFileInfo($node)) {
|
||||
$filePath = str_replace('\\','\\\\',__FILE__);
|
||||
$constructor->setCode('return parent::__construct("' . $filePath .'", "", "");');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$constructor->useParentCode();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns patch priority, which determines when patch will be applied.
|
||||
*
|
||||
* @return int Priority number (higher - earlier)
|
||||
*/
|
||||
public function getPriority()
|
||||
{
|
||||
return 50;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ClassNode $node
|
||||
* @return boolean
|
||||
*/
|
||||
private function nodeIsDirectoryIterator(ClassNode $node)
|
||||
{
|
||||
$parent = $node->getParentClass();
|
||||
|
||||
return 'DirectoryIterator' === $parent
|
||||
|| is_subclass_of($parent, 'DirectoryIterator');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ClassNode $node
|
||||
* @return boolean
|
||||
*/
|
||||
private function nodeIsSplFileObject(ClassNode $node)
|
||||
{
|
||||
$parent = $node->getParentClass();
|
||||
|
||||
return 'SplFileObject' === $parent
|
||||
|| is_subclass_of($parent, 'SplFileObject');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ClassNode $node
|
||||
* @return boolean
|
||||
*/
|
||||
private function nodeIsSymfonySplFileInfo(ClassNode $node)
|
||||
{
|
||||
$parent = $node->getParentClass();
|
||||
|
||||
return 'Symfony\\Component\\Finder\\SplFileInfo' === $parent;
|
||||
}
|
||||
}
|
95
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php
vendored
Normal file
95
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php
vendored
Normal file
@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
namespace Prophecy\Doubler\ClassPatch;
|
||||
|
||||
use Prophecy\Doubler\Generator\Node\ClassNode;
|
||||
use Prophecy\Exception\Doubler\ClassCreatorException;
|
||||
|
||||
class ThrowablePatch implements ClassPatchInterface
|
||||
{
|
||||
/**
|
||||
* Checks if patch supports specific class node.
|
||||
*
|
||||
* @param ClassNode $node
|
||||
* @return bool
|
||||
*/
|
||||
public function supports(ClassNode $node)
|
||||
{
|
||||
return $this->implementsAThrowableInterface($node) && $this->doesNotExtendAThrowableClass($node);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ClassNode $node
|
||||
* @return bool
|
||||
*/
|
||||
private function implementsAThrowableInterface(ClassNode $node)
|
||||
{
|
||||
foreach ($node->getInterfaces() as $type) {
|
||||
if (is_a($type, 'Throwable', true)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ClassNode $node
|
||||
* @return bool
|
||||
*/
|
||||
private function doesNotExtendAThrowableClass(ClassNode $node)
|
||||
{
|
||||
return !is_a($node->getParentClass(), 'Throwable', true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies patch to the specific class node.
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function apply(ClassNode $node)
|
||||
{
|
||||
$this->checkItCanBeDoubled($node);
|
||||
$this->setParentClassToException($node);
|
||||
}
|
||||
|
||||
private function checkItCanBeDoubled(ClassNode $node)
|
||||
{
|
||||
$className = $node->getParentClass();
|
||||
if ($className !== 'stdClass') {
|
||||
throw new ClassCreatorException(
|
||||
sprintf(
|
||||
'Cannot double concrete class %s as well as implement Traversable',
|
||||
$className
|
||||
),
|
||||
$node
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private function setParentClassToException(ClassNode $node)
|
||||
{
|
||||
$node->setParentClass('Exception');
|
||||
|
||||
$node->removeMethod('getMessage');
|
||||
$node->removeMethod('getCode');
|
||||
$node->removeMethod('getFile');
|
||||
$node->removeMethod('getLine');
|
||||
$node->removeMethod('getTrace');
|
||||
$node->removeMethod('getPrevious');
|
||||
$node->removeMethod('getNext');
|
||||
$node->removeMethod('getTraceAsString');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns patch priority, which determines when patch will be applied.
|
||||
*
|
||||
* @return int Priority number (higher - earlier)
|
||||
*/
|
||||
public function getPriority()
|
||||
{
|
||||
return 100;
|
||||
}
|
||||
}
|
83
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php
vendored
Normal file
83
vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php
vendored
Normal file
@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler\ClassPatch;
|
||||
|
||||
use Prophecy\Doubler\Generator\Node\ClassNode;
|
||||
use Prophecy\Doubler\Generator\Node\MethodNode;
|
||||
|
||||
/**
|
||||
* Traversable interface patch.
|
||||
* Forces classes that implement interfaces, that extend Traversable to also implement Iterator.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class TraversablePatch implements ClassPatchInterface
|
||||
{
|
||||
/**
|
||||
* Supports nodetree, that implement Traversable, but not Iterator or IteratorAggregate.
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function supports(ClassNode $node)
|
||||
{
|
||||
if (in_array('Iterator', $node->getInterfaces())) {
|
||||
return false;
|
||||
}
|
||||
if (in_array('IteratorAggregate', $node->getInterfaces())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach ($node->getInterfaces() as $interface) {
|
||||
if ('Traversable' !== $interface && !is_subclass_of($interface, 'Traversable')) {
|
||||
continue;
|
||||
}
|
||||
if ('Iterator' === $interface || is_subclass_of($interface, 'Iterator')) {
|
||||
continue;
|
||||
}
|
||||
if ('IteratorAggregate' === $interface || is_subclass_of($interface, 'IteratorAggregate')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Forces class to implement Iterator interface.
|
||||
*
|
||||
* @param ClassNode $node
|
||||
*/
|
||||
public function apply(ClassNode $node)
|
||||
{
|
||||
$node->addInterface('Iterator');
|
||||
|
||||
$node->addMethod(new MethodNode('current'));
|
||||
$node->addMethod(new MethodNode('key'));
|
||||
$node->addMethod(new MethodNode('next'));
|
||||
$node->addMethod(new MethodNode('rewind'));
|
||||
$node->addMethod(new MethodNode('valid'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns patch priority, which determines when patch will be applied.
|
||||
*
|
||||
* @return int Priority number (higher - earlier)
|
||||
*/
|
||||
public function getPriority()
|
||||
{
|
||||
return 100;
|
||||
}
|
||||
}
|
22
vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php
vendored
Normal file
22
vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler;
|
||||
|
||||
/**
|
||||
* Core double interface.
|
||||
* All doubled classes will implement this one.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
interface DoubleInterface
|
||||
{
|
||||
}
|
146
vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php
vendored
Normal file
146
vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php
vendored
Normal file
@ -0,0 +1,146 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler;
|
||||
|
||||
use Doctrine\Instantiator\Instantiator;
|
||||
use Prophecy\Doubler\ClassPatch\ClassPatchInterface;
|
||||
use Prophecy\Doubler\Generator\ClassMirror;
|
||||
use Prophecy\Doubler\Generator\ClassCreator;
|
||||
use Prophecy\Exception\InvalidArgumentException;
|
||||
use ReflectionClass;
|
||||
|
||||
/**
|
||||
* Cached class doubler.
|
||||
* Prevents mirroring/creation of the same structure twice.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class Doubler
|
||||
{
|
||||
private $mirror;
|
||||
private $creator;
|
||||
private $namer;
|
||||
|
||||
/**
|
||||
* @var ClassPatchInterface[]
|
||||
*/
|
||||
private $patches = array();
|
||||
|
||||
/**
|
||||
* @var \Doctrine\Instantiator\Instantiator
|
||||
*/
|
||||
private $instantiator;
|
||||
|
||||
/**
|
||||
* Initializes doubler.
|
||||
*
|
||||
* @param ClassMirror $mirror
|
||||
* @param ClassCreator $creator
|
||||
* @param NameGenerator $namer
|
||||
*/
|
||||
public function __construct(ClassMirror $mirror = null, ClassCreator $creator = null,
|
||||
NameGenerator $namer = null)
|
||||
{
|
||||
$this->mirror = $mirror ?: new ClassMirror;
|
||||
$this->creator = $creator ?: new ClassCreator;
|
||||
$this->namer = $namer ?: new NameGenerator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns list of registered class patches.
|
||||
*
|
||||
* @return ClassPatchInterface[]
|
||||
*/
|
||||
public function getClassPatches()
|
||||
{
|
||||
return $this->patches;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers new class patch.
|
||||
*
|
||||
* @param ClassPatchInterface $patch
|
||||
*/
|
||||
public function registerClassPatch(ClassPatchInterface $patch)
|
||||
{
|
||||
$this->patches[] = $patch;
|
||||
|
||||
@usort($this->patches, function (ClassPatchInterface $patch1, ClassPatchInterface $patch2) {
|
||||
return $patch2->getPriority() - $patch1->getPriority();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates double from specific class or/and list of interfaces.
|
||||
*
|
||||
* @param ReflectionClass $class
|
||||
* @param ReflectionClass[] $interfaces Array of ReflectionClass instances
|
||||
* @param array $args Constructor arguments
|
||||
*
|
||||
* @return DoubleInterface
|
||||
*
|
||||
* @throws \Prophecy\Exception\InvalidArgumentException
|
||||
*/
|
||||
public function double(ReflectionClass $class = null, array $interfaces, array $args = null)
|
||||
{
|
||||
foreach ($interfaces as $interface) {
|
||||
if (!$interface instanceof ReflectionClass) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
"[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n".
|
||||
"a second argument to `Doubler::double(...)`, but got %s.",
|
||||
is_object($interface) ? get_class($interface).' class' : gettype($interface)
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
$classname = $this->createDoubleClass($class, $interfaces);
|
||||
$reflection = new ReflectionClass($classname);
|
||||
|
||||
if (null !== $args) {
|
||||
return $reflection->newInstanceArgs($args);
|
||||
}
|
||||
if ((null === $constructor = $reflection->getConstructor())
|
||||
|| ($constructor->isPublic() && !$constructor->isFinal())) {
|
||||
return $reflection->newInstance();
|
||||
}
|
||||
|
||||
if (!$this->instantiator) {
|
||||
$this->instantiator = new Instantiator();
|
||||
}
|
||||
|
||||
return $this->instantiator->instantiate($classname);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates double class and returns its FQN.
|
||||
*
|
||||
* @param ReflectionClass $class
|
||||
* @param ReflectionClass[] $interfaces
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function createDoubleClass(ReflectionClass $class = null, array $interfaces)
|
||||
{
|
||||
$name = $this->namer->name($class, $interfaces);
|
||||
$node = $this->mirror->reflect($class, $interfaces);
|
||||
|
||||
foreach ($this->patches as $patch) {
|
||||
if ($patch->supports($node)) {
|
||||
$patch->apply($node);
|
||||
}
|
||||
}
|
||||
|
||||
$this->creator->create($name, $node);
|
||||
|
||||
return $name;
|
||||
}
|
||||
}
|
129
vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php
vendored
Normal file
129
vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php
vendored
Normal file
@ -0,0 +1,129 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler\Generator;
|
||||
|
||||
/**
|
||||
* Class code creator.
|
||||
* Generates PHP code for specific class node tree.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class ClassCodeGenerator
|
||||
{
|
||||
/**
|
||||
* @var TypeHintReference
|
||||
*/
|
||||
private $typeHintReference;
|
||||
|
||||
public function __construct(TypeHintReference $typeHintReference = null)
|
||||
{
|
||||
$this->typeHintReference = $typeHintReference ?: new TypeHintReference();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates PHP code for class node.
|
||||
*
|
||||
* @param string $classname
|
||||
* @param Node\ClassNode $class
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function generate($classname, Node\ClassNode $class)
|
||||
{
|
||||
$parts = explode('\\', $classname);
|
||||
$classname = array_pop($parts);
|
||||
$namespace = implode('\\', $parts);
|
||||
|
||||
$code = sprintf("class %s extends \%s implements %s {\n",
|
||||
$classname, $class->getParentClass(), implode(', ',
|
||||
array_map(function ($interface) {return '\\'.$interface;}, $class->getInterfaces())
|
||||
)
|
||||
);
|
||||
|
||||
foreach ($class->getProperties() as $name => $visibility) {
|
||||
$code .= sprintf("%s \$%s;\n", $visibility, $name);
|
||||
}
|
||||
$code .= "\n";
|
||||
|
||||
foreach ($class->getMethods() as $method) {
|
||||
$code .= $this->generateMethod($method)."\n";
|
||||
}
|
||||
$code .= "\n}";
|
||||
|
||||
return sprintf("namespace %s {\n%s\n}", $namespace, $code);
|
||||
}
|
||||
|
||||
private function generateMethod(Node\MethodNode $method)
|
||||
{
|
||||
$php = sprintf("%s %s function %s%s(%s)%s {\n",
|
||||
$method->getVisibility(),
|
||||
$method->isStatic() ? 'static' : '',
|
||||
$method->returnsReference() ? '&':'',
|
||||
$method->getName(),
|
||||
implode(', ', $this->generateArguments($method->getArguments())),
|
||||
$this->getReturnType($method)
|
||||
);
|
||||
$php .= $method->getCode()."\n";
|
||||
|
||||
return $php.'}';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
private function getReturnType(Node\MethodNode $method)
|
||||
{
|
||||
if (version_compare(PHP_VERSION, '7.1', '>=')) {
|
||||
if ($method->hasReturnType()) {
|
||||
return $method->hasNullableReturnType()
|
||||
? sprintf(': ?%s', $method->getReturnType())
|
||||
: sprintf(': %s', $method->getReturnType());
|
||||
}
|
||||
}
|
||||
|
||||
if (version_compare(PHP_VERSION, '7.0', '>=')) {
|
||||
return $method->hasReturnType() && $method->getReturnType() !== 'void'
|
||||
? sprintf(': %s', $method->getReturnType())
|
||||
: '';
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
private function generateArguments(array $arguments)
|
||||
{
|
||||
$typeHintReference = $this->typeHintReference;
|
||||
return array_map(function (Node\ArgumentNode $argument) use ($typeHintReference) {
|
||||
$php = '';
|
||||
|
||||
if (version_compare(PHP_VERSION, '7.1', '>=')) {
|
||||
$php .= $argument->isNullable() ? '?' : '';
|
||||
}
|
||||
|
||||
if ($hint = $argument->getTypeHint()) {
|
||||
$php .= $typeHintReference->isBuiltInParamTypeHint($hint) ? $hint : '\\'.$hint;
|
||||
}
|
||||
|
||||
$php .= ' '.($argument->isPassedByReference() ? '&' : '');
|
||||
|
||||
$php .= $argument->isVariadic() ? '...' : '';
|
||||
|
||||
$php .= '$'.$argument->getName();
|
||||
|
||||
if ($argument->isOptional() && !$argument->isVariadic()) {
|
||||
$php .= ' = '.var_export($argument->getDefault(), true);
|
||||
}
|
||||
|
||||
return $php;
|
||||
}, $arguments);
|
||||
}
|
||||
}
|
67
vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php
vendored
Normal file
67
vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php
vendored
Normal file
@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler\Generator;
|
||||
|
||||
use Prophecy\Exception\Doubler\ClassCreatorException;
|
||||
|
||||
/**
|
||||
* Class creator.
|
||||
* Creates specific class in current environment.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class ClassCreator
|
||||
{
|
||||
private $generator;
|
||||
|
||||
/**
|
||||
* Initializes creator.
|
||||
*
|
||||
* @param ClassCodeGenerator $generator
|
||||
*/
|
||||
public function __construct(ClassCodeGenerator $generator = null)
|
||||
{
|
||||
$this->generator = $generator ?: new ClassCodeGenerator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates class.
|
||||
*
|
||||
* @param string $classname
|
||||
* @param Node\ClassNode $class
|
||||
*
|
||||
* @return mixed
|
||||
*
|
||||
* @throws \Prophecy\Exception\Doubler\ClassCreatorException
|
||||
*/
|
||||
public function create($classname, Node\ClassNode $class)
|
||||
{
|
||||
$code = $this->generator->generate($classname, $class);
|
||||
$return = eval($code);
|
||||
|
||||
if (!class_exists($classname, false)) {
|
||||
if (count($class->getInterfaces())) {
|
||||
throw new ClassCreatorException(sprintf(
|
||||
'Could not double `%s` and implement interfaces: [%s].',
|
||||
$class->getParentClass(), implode(', ', $class->getInterfaces())
|
||||
), $class);
|
||||
}
|
||||
|
||||
throw new ClassCreatorException(
|
||||
sprintf('Could not double `%s`.', $class->getParentClass()),
|
||||
$class
|
||||
);
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
}
|
260
vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php
vendored
Normal file
260
vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php
vendored
Normal file
@ -0,0 +1,260 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler\Generator;
|
||||
|
||||
use Prophecy\Exception\InvalidArgumentException;
|
||||
use Prophecy\Exception\Doubler\ClassMirrorException;
|
||||
use ReflectionClass;
|
||||
use ReflectionMethod;
|
||||
use ReflectionParameter;
|
||||
|
||||
/**
|
||||
* Class mirror.
|
||||
* Core doubler class. Mirrors specific class and/or interfaces into class node tree.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class ClassMirror
|
||||
{
|
||||
private static $reflectableMethods = array(
|
||||
'__construct',
|
||||
'__destruct',
|
||||
'__sleep',
|
||||
'__wakeup',
|
||||
'__toString',
|
||||
'__call',
|
||||
'__invoke'
|
||||
);
|
||||
|
||||
/**
|
||||
* Reflects provided arguments into class node.
|
||||
*
|
||||
* @param ReflectionClass $class
|
||||
* @param ReflectionClass[] $interfaces
|
||||
*
|
||||
* @return Node\ClassNode
|
||||
*
|
||||
* @throws \Prophecy\Exception\InvalidArgumentException
|
||||
*/
|
||||
public function reflect(ReflectionClass $class = null, array $interfaces)
|
||||
{
|
||||
$node = new Node\ClassNode;
|
||||
|
||||
if (null !== $class) {
|
||||
if (true === $class->isInterface()) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
"Could not reflect %s as a class, because it\n".
|
||||
"is interface - use the second argument instead.",
|
||||
$class->getName()
|
||||
));
|
||||
}
|
||||
|
||||
$this->reflectClassToNode($class, $node);
|
||||
}
|
||||
|
||||
foreach ($interfaces as $interface) {
|
||||
if (!$interface instanceof ReflectionClass) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
"[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n".
|
||||
"a second argument to `ClassMirror::reflect(...)`, but got %s.",
|
||||
is_object($interface) ? get_class($interface).' class' : gettype($interface)
|
||||
));
|
||||
}
|
||||
if (false === $interface->isInterface()) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
"Could not reflect %s as an interface, because it\n".
|
||||
"is class - use the first argument instead.",
|
||||
$interface->getName()
|
||||
));
|
||||
}
|
||||
|
||||
$this->reflectInterfaceToNode($interface, $node);
|
||||
}
|
||||
|
||||
$node->addInterface('Prophecy\Doubler\Generator\ReflectionInterface');
|
||||
|
||||
return $node;
|
||||
}
|
||||
|
||||
private function reflectClassToNode(ReflectionClass $class, Node\ClassNode $node)
|
||||
{
|
||||
if (true === $class->isFinal()) {
|
||||
throw new ClassMirrorException(sprintf(
|
||||
'Could not reflect class %s as it is marked final.', $class->getName()
|
||||
), $class);
|
||||
}
|
||||
|
||||
$node->setParentClass($class->getName());
|
||||
|
||||
foreach ($class->getMethods(ReflectionMethod::IS_ABSTRACT) as $method) {
|
||||
if (false === $method->isProtected()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->reflectMethodToNode($method, $node);
|
||||
}
|
||||
|
||||
foreach ($class->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
|
||||
if (0 === strpos($method->getName(), '_')
|
||||
&& !in_array($method->getName(), self::$reflectableMethods)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (true === $method->isFinal()) {
|
||||
$node->addUnextendableMethod($method->getName());
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->reflectMethodToNode($method, $node);
|
||||
}
|
||||
}
|
||||
|
||||
private function reflectInterfaceToNode(ReflectionClass $interface, Node\ClassNode $node)
|
||||
{
|
||||
$node->addInterface($interface->getName());
|
||||
|
||||
foreach ($interface->getMethods() as $method) {
|
||||
$this->reflectMethodToNode($method, $node);
|
||||
}
|
||||
}
|
||||
|
||||
private function reflectMethodToNode(ReflectionMethod $method, Node\ClassNode $classNode)
|
||||
{
|
||||
$node = new Node\MethodNode($method->getName());
|
||||
|
||||
if (true === $method->isProtected()) {
|
||||
$node->setVisibility('protected');
|
||||
}
|
||||
|
||||
if (true === $method->isStatic()) {
|
||||
$node->setStatic();
|
||||
}
|
||||
|
||||
if (true === $method->returnsReference()) {
|
||||
$node->setReturnsReference();
|
||||
}
|
||||
|
||||
if (version_compare(PHP_VERSION, '7.0', '>=') && $method->hasReturnType()) {
|
||||
$returnType = PHP_VERSION_ID >= 70100 ? $method->getReturnType()->getName() : (string) $method->getReturnType();
|
||||
$returnTypeLower = strtolower($returnType);
|
||||
|
||||
if ('self' === $returnTypeLower) {
|
||||
$returnType = $method->getDeclaringClass()->getName();
|
||||
}
|
||||
if ('parent' === $returnTypeLower) {
|
||||
$returnType = $method->getDeclaringClass()->getParentClass()->getName();
|
||||
}
|
||||
|
||||
$node->setReturnType($returnType);
|
||||
|
||||
if (version_compare(PHP_VERSION, '7.1', '>=') && $method->getReturnType()->allowsNull()) {
|
||||
$node->setNullableReturnType(true);
|
||||
}
|
||||
}
|
||||
|
||||
if (is_array($params = $method->getParameters()) && count($params)) {
|
||||
foreach ($params as $param) {
|
||||
$this->reflectArgumentToNode($param, $node);
|
||||
}
|
||||
}
|
||||
|
||||
$classNode->addMethod($node);
|
||||
}
|
||||
|
||||
private function reflectArgumentToNode(ReflectionParameter $parameter, Node\MethodNode $methodNode)
|
||||
{
|
||||
$name = $parameter->getName() == '...' ? '__dot_dot_dot__' : $parameter->getName();
|
||||
$node = new Node\ArgumentNode($name);
|
||||
|
||||
$node->setTypeHint($this->getTypeHint($parameter));
|
||||
|
||||
if ($this->isVariadic($parameter)) {
|
||||
$node->setAsVariadic();
|
||||
}
|
||||
|
||||
if ($this->hasDefaultValue($parameter)) {
|
||||
$node->setDefault($this->getDefaultValue($parameter));
|
||||
}
|
||||
|
||||
if ($parameter->isPassedByReference()) {
|
||||
$node->setAsPassedByReference();
|
||||
}
|
||||
|
||||
$node->setAsNullable($this->isNullable($parameter));
|
||||
|
||||
$methodNode->addArgument($node);
|
||||
}
|
||||
|
||||
private function hasDefaultValue(ReflectionParameter $parameter)
|
||||
{
|
||||
if ($this->isVariadic($parameter)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($parameter->isDefaultValueAvailable()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return $parameter->isOptional() || $this->isNullable($parameter);
|
||||
}
|
||||
|
||||
private function getDefaultValue(ReflectionParameter $parameter)
|
||||
{
|
||||
if (!$parameter->isDefaultValueAvailable()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $parameter->getDefaultValue();
|
||||
}
|
||||
|
||||
private function getTypeHint(ReflectionParameter $parameter)
|
||||
{
|
||||
if (null !== $className = $this->getParameterClassName($parameter)) {
|
||||
return $className;
|
||||
}
|
||||
|
||||
if (true === $parameter->isArray()) {
|
||||
return 'array';
|
||||
}
|
||||
|
||||
if (version_compare(PHP_VERSION, '5.4', '>=') && true === $parameter->isCallable()) {
|
||||
return 'callable';
|
||||
}
|
||||
|
||||
if (version_compare(PHP_VERSION, '7.0', '>=') && true === $parameter->hasType()) {
|
||||
return PHP_VERSION_ID >= 70100 ? $parameter->getType()->getName() : (string) $parameter->getType();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private function isVariadic(ReflectionParameter $parameter)
|
||||
{
|
||||
return PHP_VERSION_ID >= 50600 && $parameter->isVariadic();
|
||||
}
|
||||
|
||||
private function isNullable(ReflectionParameter $parameter)
|
||||
{
|
||||
return $parameter->allowsNull() && null !== $this->getTypeHint($parameter);
|
||||
}
|
||||
|
||||
private function getParameterClassName(ReflectionParameter $parameter)
|
||||
{
|
||||
try {
|
||||
return $parameter->getClass() ? $parameter->getClass()->getName() : null;
|
||||
} catch (\ReflectionException $e) {
|
||||
preg_match('/\[\s\<\w+?>\s([\w,\\\]+)/s', $parameter, $matches);
|
||||
|
||||
return isset($matches[1]) ? $matches[1] : null;
|
||||
}
|
||||
}
|
||||
}
|
102
vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php
vendored
Normal file
102
vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php
vendored
Normal file
@ -0,0 +1,102 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler\Generator\Node;
|
||||
|
||||
/**
|
||||
* Argument node.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class ArgumentNode
|
||||
{
|
||||
private $name;
|
||||
private $typeHint;
|
||||
private $default;
|
||||
private $optional = false;
|
||||
private $byReference = false;
|
||||
private $isVariadic = false;
|
||||
private $isNullable = false;
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
*/
|
||||
public function __construct($name)
|
||||
{
|
||||
$this->name = $name;
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
public function getTypeHint()
|
||||
{
|
||||
return $this->typeHint;
|
||||
}
|
||||
|
||||
public function setTypeHint($typeHint = null)
|
||||
{
|
||||
$this->typeHint = $typeHint;
|
||||
}
|
||||
|
||||
public function hasDefault()
|
||||
{
|
||||
return $this->isOptional() && !$this->isVariadic();
|
||||
}
|
||||
|
||||
public function getDefault()
|
||||
{
|
||||
return $this->default;
|
||||
}
|
||||
|
||||
public function setDefault($default = null)
|
||||
{
|
||||
$this->optional = true;
|
||||
$this->default = $default;
|
||||
}
|
||||
|
||||
public function isOptional()
|
||||
{
|
||||
return $this->optional;
|
||||
}
|
||||
|
||||
public function setAsPassedByReference($byReference = true)
|
||||
{
|
||||
$this->byReference = $byReference;
|
||||
}
|
||||
|
||||
public function isPassedByReference()
|
||||
{
|
||||
return $this->byReference;
|
||||
}
|
||||
|
||||
public function setAsVariadic($isVariadic = true)
|
||||
{
|
||||
$this->isVariadic = $isVariadic;
|
||||
}
|
||||
|
||||
public function isVariadic()
|
||||
{
|
||||
return $this->isVariadic;
|
||||
}
|
||||
|
||||
public function isNullable()
|
||||
{
|
||||
return $this->isNullable;
|
||||
}
|
||||
|
||||
public function setAsNullable($isNullable = true)
|
||||
{
|
||||
$this->isNullable = $isNullable;
|
||||
}
|
||||
}
|
169
vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php
vendored
Normal file
169
vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php
vendored
Normal file
@ -0,0 +1,169 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler\Generator\Node;
|
||||
|
||||
use Prophecy\Exception\Doubler\MethodNotExtendableException;
|
||||
use Prophecy\Exception\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* Class node.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class ClassNode
|
||||
{
|
||||
private $parentClass = 'stdClass';
|
||||
private $interfaces = array();
|
||||
private $properties = array();
|
||||
private $unextendableMethods = array();
|
||||
|
||||
/**
|
||||
* @var MethodNode[]
|
||||
*/
|
||||
private $methods = array();
|
||||
|
||||
public function getParentClass()
|
||||
{
|
||||
return $this->parentClass;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $class
|
||||
*/
|
||||
public function setParentClass($class)
|
||||
{
|
||||
$this->parentClass = $class ?: 'stdClass';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
public function getInterfaces()
|
||||
{
|
||||
return $this->interfaces;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $interface
|
||||
*/
|
||||
public function addInterface($interface)
|
||||
{
|
||||
if ($this->hasInterface($interface)) {
|
||||
return;
|
||||
}
|
||||
|
||||
array_unshift($this->interfaces, $interface);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $interface
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function hasInterface($interface)
|
||||
{
|
||||
return in_array($interface, $this->interfaces);
|
||||
}
|
||||
|
||||
public function getProperties()
|
||||
{
|
||||
return $this->properties;
|
||||
}
|
||||
|
||||
public function addProperty($name, $visibility = 'public')
|
||||
{
|
||||
$visibility = strtolower($visibility);
|
||||
|
||||
if (!in_array($visibility, array('public', 'private', 'protected'))) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'`%s` property visibility is not supported.', $visibility
|
||||
));
|
||||
}
|
||||
|
||||
$this->properties[$name] = $visibility;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return MethodNode[]
|
||||
*/
|
||||
public function getMethods()
|
||||
{
|
||||
return $this->methods;
|
||||
}
|
||||
|
||||
public function addMethod(MethodNode $method, $force = false)
|
||||
{
|
||||
if (!$this->isExtendable($method->getName())){
|
||||
$message = sprintf(
|
||||
'Method `%s` is not extendable, so can not be added.', $method->getName()
|
||||
);
|
||||
throw new MethodNotExtendableException($message, $this->getParentClass(), $method->getName());
|
||||
}
|
||||
|
||||
if ($force || !isset($this->methods[$method->getName()])) {
|
||||
$this->methods[$method->getName()] = $method;
|
||||
}
|
||||
}
|
||||
|
||||
public function removeMethod($name)
|
||||
{
|
||||
unset($this->methods[$name]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
*
|
||||
* @return MethodNode|null
|
||||
*/
|
||||
public function getMethod($name)
|
||||
{
|
||||
return $this->hasMethod($name) ? $this->methods[$name] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function hasMethod($name)
|
||||
{
|
||||
return isset($this->methods[$name]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
public function getUnextendableMethods()
|
||||
{
|
||||
return $this->unextendableMethods;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $unextendableMethod
|
||||
*/
|
||||
public function addUnextendableMethod($unextendableMethod)
|
||||
{
|
||||
if (!$this->isExtendable($unextendableMethod)){
|
||||
return;
|
||||
}
|
||||
$this->unextendableMethods[] = $unextendableMethod;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $method
|
||||
* @return bool
|
||||
*/
|
||||
public function isExtendable($method)
|
||||
{
|
||||
return !in_array($method, $this->unextendableMethods);
|
||||
}
|
||||
}
|
198
vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php
vendored
Normal file
198
vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php
vendored
Normal file
@ -0,0 +1,198 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler\Generator\Node;
|
||||
|
||||
use Prophecy\Doubler\Generator\TypeHintReference;
|
||||
use Prophecy\Exception\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* Method node.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class MethodNode
|
||||
{
|
||||
private $name;
|
||||
private $code;
|
||||
private $visibility = 'public';
|
||||
private $static = false;
|
||||
private $returnsReference = false;
|
||||
private $returnType;
|
||||
private $nullableReturnType = false;
|
||||
|
||||
/**
|
||||
* @var ArgumentNode[]
|
||||
*/
|
||||
private $arguments = array();
|
||||
|
||||
/**
|
||||
* @var TypeHintReference
|
||||
*/
|
||||
private $typeHintReference;
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
* @param string $code
|
||||
*/
|
||||
public function __construct($name, $code = null, TypeHintReference $typeHintReference = null)
|
||||
{
|
||||
$this->name = $name;
|
||||
$this->code = $code;
|
||||
$this->typeHintReference = $typeHintReference ?: new TypeHintReference();
|
||||
}
|
||||
|
||||
public function getVisibility()
|
||||
{
|
||||
return $this->visibility;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $visibility
|
||||
*/
|
||||
public function setVisibility($visibility)
|
||||
{
|
||||
$visibility = strtolower($visibility);
|
||||
|
||||
if (!in_array($visibility, array('public', 'private', 'protected'))) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'`%s` method visibility is not supported.', $visibility
|
||||
));
|
||||
}
|
||||
|
||||
$this->visibility = $visibility;
|
||||
}
|
||||
|
||||
public function isStatic()
|
||||
{
|
||||
return $this->static;
|
||||
}
|
||||
|
||||
public function setStatic($static = true)
|
||||
{
|
||||
$this->static = (bool) $static;
|
||||
}
|
||||
|
||||
public function returnsReference()
|
||||
{
|
||||
return $this->returnsReference;
|
||||
}
|
||||
|
||||
public function setReturnsReference()
|
||||
{
|
||||
$this->returnsReference = true;
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
public function addArgument(ArgumentNode $argument)
|
||||
{
|
||||
$this->arguments[] = $argument;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ArgumentNode[]
|
||||
*/
|
||||
public function getArguments()
|
||||
{
|
||||
return $this->arguments;
|
||||
}
|
||||
|
||||
public function hasReturnType()
|
||||
{
|
||||
return null !== $this->returnType;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $type
|
||||
*/
|
||||
public function setReturnType($type = null)
|
||||
{
|
||||
if ($type === '' || $type === null) {
|
||||
$this->returnType = null;
|
||||
return;
|
||||
}
|
||||
$typeMap = array(
|
||||
'double' => 'float',
|
||||
'real' => 'float',
|
||||
'boolean' => 'bool',
|
||||
'integer' => 'int',
|
||||
);
|
||||
if (isset($typeMap[$type])) {
|
||||
$type = $typeMap[$type];
|
||||
}
|
||||
$this->returnType = $this->typeHintReference->isBuiltInReturnTypeHint($type) ?
|
||||
$type :
|
||||
'\\' . ltrim($type, '\\');
|
||||
}
|
||||
|
||||
public function getReturnType()
|
||||
{
|
||||
return $this->returnType;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $bool
|
||||
*/
|
||||
public function setNullableReturnType($bool = true)
|
||||
{
|
||||
$this->nullableReturnType = (bool) $bool;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function hasNullableReturnType()
|
||||
{
|
||||
return $this->nullableReturnType;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $code
|
||||
*/
|
||||
public function setCode($code)
|
||||
{
|
||||
$this->code = $code;
|
||||
}
|
||||
|
||||
public function getCode()
|
||||
{
|
||||
if ($this->returnsReference)
|
||||
{
|
||||
return "throw new \Prophecy\Exception\Doubler\ReturnByReferenceException('Returning by reference not supported', get_class(\$this), '{$this->name}');";
|
||||
}
|
||||
|
||||
return (string) $this->code;
|
||||
}
|
||||
|
||||
public function useParentCode()
|
||||
{
|
||||
$this->code = sprintf(
|
||||
'return parent::%s(%s);', $this->getName(), implode(', ',
|
||||
array_map(array($this, 'generateArgument'), $this->arguments)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
private function generateArgument(ArgumentNode $arg)
|
||||
{
|
||||
$argument = '$'.$arg->getName();
|
||||
|
||||
if ($arg->isVariadic()) {
|
||||
$argument = '...'.$argument;
|
||||
}
|
||||
|
||||
return $argument;
|
||||
}
|
||||
}
|
22
vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php
vendored
Normal file
22
vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler\Generator;
|
||||
|
||||
/**
|
||||
* Reflection interface.
|
||||
* All reflected classes implement this interface.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
interface ReflectionInterface
|
||||
{
|
||||
}
|
46
vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php
vendored
Normal file
46
vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php
vendored
Normal file
@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace Prophecy\Doubler\Generator;
|
||||
|
||||
/**
|
||||
* Tells whether a keyword refers to a class or to a built-in type for the
|
||||
* current version of php
|
||||
*/
|
||||
final class TypeHintReference
|
||||
{
|
||||
public function isBuiltInParamTypeHint($type)
|
||||
{
|
||||
switch ($type) {
|
||||
case 'self':
|
||||
case 'array':
|
||||
return true;
|
||||
|
||||
case 'callable':
|
||||
return PHP_VERSION_ID >= 50400;
|
||||
|
||||
case 'bool':
|
||||
case 'float':
|
||||
case 'int':
|
||||
case 'string':
|
||||
return PHP_VERSION_ID >= 70000;
|
||||
|
||||
case 'iterable':
|
||||
return PHP_VERSION_ID >= 70100;
|
||||
|
||||
case 'object':
|
||||
return PHP_VERSION_ID >= 70200;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function isBuiltInReturnTypeHint($type)
|
||||
{
|
||||
if ($type === 'void') {
|
||||
return PHP_VERSION_ID >= 70100;
|
||||
}
|
||||
|
||||
return $this->isBuiltInParamTypeHint($type);
|
||||
}
|
||||
}
|
127
vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php
vendored
Normal file
127
vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php
vendored
Normal file
@ -0,0 +1,127 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler;
|
||||
|
||||
use Prophecy\Exception\Doubler\DoubleException;
|
||||
use Prophecy\Exception\Doubler\ClassNotFoundException;
|
||||
use Prophecy\Exception\Doubler\InterfaceNotFoundException;
|
||||
use ReflectionClass;
|
||||
|
||||
/**
|
||||
* Lazy double.
|
||||
* Gives simple interface to describe double before creating it.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class LazyDouble
|
||||
{
|
||||
private $doubler;
|
||||
private $class;
|
||||
private $interfaces = array();
|
||||
private $arguments = null;
|
||||
private $double;
|
||||
|
||||
/**
|
||||
* Initializes lazy double.
|
||||
*
|
||||
* @param Doubler $doubler
|
||||
*/
|
||||
public function __construct(Doubler $doubler)
|
||||
{
|
||||
$this->doubler = $doubler;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tells doubler to use specific class as parent one for double.
|
||||
*
|
||||
* @param string|ReflectionClass $class
|
||||
*
|
||||
* @throws \Prophecy\Exception\Doubler\ClassNotFoundException
|
||||
* @throws \Prophecy\Exception\Doubler\DoubleException
|
||||
*/
|
||||
public function setParentClass($class)
|
||||
{
|
||||
if (null !== $this->double) {
|
||||
throw new DoubleException('Can not extend class with already instantiated double.');
|
||||
}
|
||||
|
||||
if (!$class instanceof ReflectionClass) {
|
||||
if (!class_exists($class)) {
|
||||
throw new ClassNotFoundException(sprintf('Class %s not found.', $class), $class);
|
||||
}
|
||||
|
||||
$class = new ReflectionClass($class);
|
||||
}
|
||||
|
||||
$this->class = $class;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tells doubler to implement specific interface with double.
|
||||
*
|
||||
* @param string|ReflectionClass $interface
|
||||
*
|
||||
* @throws \Prophecy\Exception\Doubler\InterfaceNotFoundException
|
||||
* @throws \Prophecy\Exception\Doubler\DoubleException
|
||||
*/
|
||||
public function addInterface($interface)
|
||||
{
|
||||
if (null !== $this->double) {
|
||||
throw new DoubleException(
|
||||
'Can not implement interface with already instantiated double.'
|
||||
);
|
||||
}
|
||||
|
||||
if (!$interface instanceof ReflectionClass) {
|
||||
if (!interface_exists($interface)) {
|
||||
throw new InterfaceNotFoundException(
|
||||
sprintf('Interface %s not found.', $interface),
|
||||
$interface
|
||||
);
|
||||
}
|
||||
|
||||
$interface = new ReflectionClass($interface);
|
||||
}
|
||||
|
||||
$this->interfaces[] = $interface;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets constructor arguments.
|
||||
*
|
||||
* @param array $arguments
|
||||
*/
|
||||
public function setArguments(array $arguments = null)
|
||||
{
|
||||
$this->arguments = $arguments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates double instance or returns already created one.
|
||||
*
|
||||
* @return DoubleInterface
|
||||
*/
|
||||
public function getInstance()
|
||||
{
|
||||
if (null === $this->double) {
|
||||
if (null !== $this->arguments) {
|
||||
return $this->double = $this->doubler->double(
|
||||
$this->class, $this->interfaces, $this->arguments
|
||||
);
|
||||
}
|
||||
|
||||
$this->double = $this->doubler->double($this->class, $this->interfaces);
|
||||
}
|
||||
|
||||
return $this->double;
|
||||
}
|
||||
}
|
52
vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php
vendored
Normal file
52
vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php
vendored
Normal file
@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Doubler;
|
||||
|
||||
use ReflectionClass;
|
||||
|
||||
/**
|
||||
* Name generator.
|
||||
* Generates classname for double.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class NameGenerator
|
||||
{
|
||||
private static $counter = 1;
|
||||
|
||||
/**
|
||||
* Generates name.
|
||||
*
|
||||
* @param ReflectionClass $class
|
||||
* @param ReflectionClass[] $interfaces
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function name(ReflectionClass $class = null, array $interfaces)
|
||||
{
|
||||
$parts = array();
|
||||
|
||||
if (null !== $class) {
|
||||
$parts[] = $class->getName();
|
||||
} else {
|
||||
foreach ($interfaces as $interface) {
|
||||
$parts[] = $interface->getShortName();
|
||||
}
|
||||
}
|
||||
|
||||
if (!count($parts)) {
|
||||
$parts[] = 'stdClass';
|
||||
}
|
||||
|
||||
return sprintf('Double\%s\P%d', implode('\\', $parts), self::$counter++);
|
||||
}
|
||||
}
|
40
vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php
vendored
Normal file
40
vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Call;
|
||||
|
||||
use Prophecy\Exception\Prophecy\ObjectProphecyException;
|
||||
use Prophecy\Prophecy\ObjectProphecy;
|
||||
|
||||
class UnexpectedCallException extends ObjectProphecyException
|
||||
{
|
||||
private $methodName;
|
||||
private $arguments;
|
||||
|
||||
public function __construct($message, ObjectProphecy $objectProphecy,
|
||||
$methodName, array $arguments)
|
||||
{
|
||||
parent::__construct($message, $objectProphecy);
|
||||
|
||||
$this->methodName = $methodName;
|
||||
$this->arguments = $arguments;
|
||||
}
|
||||
|
||||
public function getMethodName()
|
||||
{
|
||||
return $this->methodName;
|
||||
}
|
||||
|
||||
public function getArguments()
|
||||
{
|
||||
return $this->arguments;
|
||||
}
|
||||
}
|
31
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php
vendored
Normal file
31
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Doubler;
|
||||
|
||||
use Prophecy\Doubler\Generator\Node\ClassNode;
|
||||
|
||||
class ClassCreatorException extends \RuntimeException implements DoublerException
|
||||
{
|
||||
private $node;
|
||||
|
||||
public function __construct($message, ClassNode $node)
|
||||
{
|
||||
parent::__construct($message);
|
||||
|
||||
$this->node = $node;
|
||||
}
|
||||
|
||||
public function getClassNode()
|
||||
{
|
||||
return $this->node;
|
||||
}
|
||||
}
|
31
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php
vendored
Normal file
31
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Doubler;
|
||||
|
||||
use ReflectionClass;
|
||||
|
||||
class ClassMirrorException extends \RuntimeException implements DoublerException
|
||||
{
|
||||
private $class;
|
||||
|
||||
public function __construct($message, ReflectionClass $class)
|
||||
{
|
||||
parent::__construct($message);
|
||||
|
||||
$this->class = $class;
|
||||
}
|
||||
|
||||
public function getReflectedClass()
|
||||
{
|
||||
return $this->class;
|
||||
}
|
||||
}
|
33
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php
vendored
Normal file
33
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Doubler;
|
||||
|
||||
class ClassNotFoundException extends DoubleException
|
||||
{
|
||||
private $classname;
|
||||
|
||||
/**
|
||||
* @param string $message
|
||||
* @param string $classname
|
||||
*/
|
||||
public function __construct($message, $classname)
|
||||
{
|
||||
parent::__construct($message);
|
||||
|
||||
$this->classname = $classname;
|
||||
}
|
||||
|
||||
public function getClassname()
|
||||
{
|
||||
return $this->classname;
|
||||
}
|
||||
}
|
18
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php
vendored
Normal file
18
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Doubler;
|
||||
|
||||
use RuntimeException;
|
||||
|
||||
class DoubleException extends RuntimeException implements DoublerException
|
||||
{
|
||||
}
|
18
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php
vendored
Normal file
18
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Doubler;
|
||||
|
||||
use Prophecy\Exception\Exception;
|
||||
|
||||
interface DoublerException extends Exception
|
||||
{
|
||||
}
|
20
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php
vendored
Normal file
20
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Doubler;
|
||||
|
||||
class InterfaceNotFoundException extends ClassNotFoundException
|
||||
{
|
||||
public function getInterfaceName()
|
||||
{
|
||||
return $this->getClassname();
|
||||
}
|
||||
}
|
41
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php
vendored
Normal file
41
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace Prophecy\Exception\Doubler;
|
||||
|
||||
class MethodNotExtendableException extends DoubleException
|
||||
{
|
||||
private $methodName;
|
||||
|
||||
private $className;
|
||||
|
||||
/**
|
||||
* @param string $message
|
||||
* @param string $className
|
||||
* @param string $methodName
|
||||
*/
|
||||
public function __construct($message, $className, $methodName)
|
||||
{
|
||||
parent::__construct($message);
|
||||
|
||||
$this->methodName = $methodName;
|
||||
$this->className = $className;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getMethodName()
|
||||
{
|
||||
return $this->methodName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getClassName()
|
||||
{
|
||||
return $this->className;
|
||||
}
|
||||
|
||||
}
|
60
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php
vendored
Normal file
60
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php
vendored
Normal file
@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Doubler;
|
||||
|
||||
class MethodNotFoundException extends DoubleException
|
||||
{
|
||||
/**
|
||||
* @var string|object
|
||||
*/
|
||||
private $classname;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $methodName;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $arguments;
|
||||
|
||||
/**
|
||||
* @param string $message
|
||||
* @param string|object $classname
|
||||
* @param string $methodName
|
||||
* @param null|Argument\ArgumentsWildcard|array $arguments
|
||||
*/
|
||||
public function __construct($message, $classname, $methodName, $arguments = null)
|
||||
{
|
||||
parent::__construct($message);
|
||||
|
||||
$this->classname = $classname;
|
||||
$this->methodName = $methodName;
|
||||
$this->arguments = $arguments;
|
||||
}
|
||||
|
||||
public function getClassname()
|
||||
{
|
||||
return $this->classname;
|
||||
}
|
||||
|
||||
public function getMethodName()
|
||||
{
|
||||
return $this->methodName;
|
||||
}
|
||||
|
||||
public function getArguments()
|
||||
{
|
||||
return $this->arguments;
|
||||
}
|
||||
}
|
41
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php
vendored
Normal file
41
vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Doubler;
|
||||
|
||||
class ReturnByReferenceException extends DoubleException
|
||||
{
|
||||
private $classname;
|
||||
private $methodName;
|
||||
|
||||
/**
|
||||
* @param string $message
|
||||
* @param string $classname
|
||||
* @param string $methodName
|
||||
*/
|
||||
public function __construct($message, $classname, $methodName)
|
||||
{
|
||||
parent::__construct($message);
|
||||
|
||||
$this->classname = $classname;
|
||||
$this->methodName = $methodName;
|
||||
}
|
||||
|
||||
public function getClassname()
|
||||
{
|
||||
return $this->classname;
|
||||
}
|
||||
|
||||
public function getMethodName()
|
||||
{
|
||||
return $this->methodName;
|
||||
}
|
||||
}
|
26
vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php
vendored
Normal file
26
vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception;
|
||||
|
||||
/**
|
||||
* Core Prophecy exception interface.
|
||||
* All Prophecy exceptions implement it.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
interface Exception
|
||||
{
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getMessage();
|
||||
}
|
16
vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php
vendored
Normal file
16
vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception;
|
||||
|
||||
class InvalidArgumentException extends \InvalidArgumentException implements Exception
|
||||
{
|
||||
}
|
51
vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php
vendored
Normal file
51
vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Prediction;
|
||||
|
||||
use Prophecy\Prophecy\ObjectProphecy;
|
||||
|
||||
class AggregateException extends \RuntimeException implements PredictionException
|
||||
{
|
||||
private $exceptions = array();
|
||||
private $objectProphecy;
|
||||
|
||||
public function append(PredictionException $exception)
|
||||
{
|
||||
$message = $exception->getMessage();
|
||||
$message = strtr($message, array("\n" => "\n "))."\n";
|
||||
$message = empty($this->exceptions) ? $message : "\n" . $message;
|
||||
|
||||
$this->message = rtrim($this->message.$message);
|
||||
$this->exceptions[] = $exception;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return PredictionException[]
|
||||
*/
|
||||
public function getExceptions()
|
||||
{
|
||||
return $this->exceptions;
|
||||
}
|
||||
|
||||
public function setObjectProphecy(ObjectProphecy $objectProphecy)
|
||||
{
|
||||
$this->objectProphecy = $objectProphecy;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ObjectProphecy
|
||||
*/
|
||||
public function getObjectProphecy()
|
||||
{
|
||||
return $this->objectProphecy;
|
||||
}
|
||||
}
|
24
vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php
vendored
Normal file
24
vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Prediction;
|
||||
|
||||
use RuntimeException;
|
||||
|
||||
/**
|
||||
* Basic failed prediction exception.
|
||||
* Use it for custom prediction failures.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class FailedPredictionException extends RuntimeException implements PredictionException
|
||||
{
|
||||
}
|
18
vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php
vendored
Normal file
18
vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Prediction;
|
||||
|
||||
use Prophecy\Exception\Prophecy\MethodProphecyException;
|
||||
|
||||
class NoCallsException extends MethodProphecyException implements PredictionException
|
||||
{
|
||||
}
|
18
vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php
vendored
Normal file
18
vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Prediction;
|
||||
|
||||
use Prophecy\Exception\Exception;
|
||||
|
||||
interface PredictionException extends Exception
|
||||
{
|
||||
}
|
31
vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php
vendored
Normal file
31
vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Prediction;
|
||||
|
||||
use Prophecy\Prophecy\MethodProphecy;
|
||||
|
||||
class UnexpectedCallsCountException extends UnexpectedCallsException
|
||||
{
|
||||
private $expectedCount;
|
||||
|
||||
public function __construct($message, MethodProphecy $methodProphecy, $count, array $calls)
|
||||
{
|
||||
parent::__construct($message, $methodProphecy, $calls);
|
||||
|
||||
$this->expectedCount = intval($count);
|
||||
}
|
||||
|
||||
public function getExpectedCount()
|
||||
{
|
||||
return $this->expectedCount;
|
||||
}
|
||||
}
|
32
vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php
vendored
Normal file
32
vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php
vendored
Normal file
@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Prediction;
|
||||
|
||||
use Prophecy\Prophecy\MethodProphecy;
|
||||
use Prophecy\Exception\Prophecy\MethodProphecyException;
|
||||
|
||||
class UnexpectedCallsException extends MethodProphecyException implements PredictionException
|
||||
{
|
||||
private $calls = array();
|
||||
|
||||
public function __construct($message, MethodProphecy $methodProphecy, array $calls)
|
||||
{
|
||||
parent::__construct($message, $methodProphecy);
|
||||
|
||||
$this->calls = $calls;
|
||||
}
|
||||
|
||||
public function getCalls()
|
||||
{
|
||||
return $this->calls;
|
||||
}
|
||||
}
|
34
vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php
vendored
Normal file
34
vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Prophecy;
|
||||
|
||||
use Prophecy\Prophecy\MethodProphecy;
|
||||
|
||||
class MethodProphecyException extends ObjectProphecyException
|
||||
{
|
||||
private $methodProphecy;
|
||||
|
||||
public function __construct($message, MethodProphecy $methodProphecy)
|
||||
{
|
||||
parent::__construct($message, $methodProphecy->getObjectProphecy());
|
||||
|
||||
$this->methodProphecy = $methodProphecy;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return MethodProphecy
|
||||
*/
|
||||
public function getMethodProphecy()
|
||||
{
|
||||
return $this->methodProphecy;
|
||||
}
|
||||
}
|
34
vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php
vendored
Normal file
34
vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Prophecy;
|
||||
|
||||
use Prophecy\Prophecy\ObjectProphecy;
|
||||
|
||||
class ObjectProphecyException extends \RuntimeException implements ProphecyException
|
||||
{
|
||||
private $objectProphecy;
|
||||
|
||||
public function __construct($message, ObjectProphecy $objectProphecy)
|
||||
{
|
||||
parent::__construct($message);
|
||||
|
||||
$this->objectProphecy = $objectProphecy;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ObjectProphecy
|
||||
*/
|
||||
public function getObjectProphecy()
|
||||
{
|
||||
return $this->objectProphecy;
|
||||
}
|
||||
}
|
18
vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php
vendored
Normal file
18
vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Exception\Prophecy;
|
||||
|
||||
use Prophecy\Exception\Exception;
|
||||
|
||||
interface ProphecyException extends Exception
|
||||
{
|
||||
}
|
69
vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php
vendored
Normal file
69
vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php
vendored
Normal file
@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\PhpDocumentor;
|
||||
|
||||
use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag;
|
||||
use phpDocumentor\Reflection\DocBlock\Tags\Method;
|
||||
|
||||
/**
|
||||
* @author Théo FIDRY <theo.fidry@gmail.com>
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
final class ClassAndInterfaceTagRetriever implements MethodTagRetrieverInterface
|
||||
{
|
||||
private $classRetriever;
|
||||
|
||||
public function __construct(MethodTagRetrieverInterface $classRetriever = null)
|
||||
{
|
||||
if (null !== $classRetriever) {
|
||||
$this->classRetriever = $classRetriever;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$this->classRetriever = class_exists('phpDocumentor\Reflection\DocBlockFactory') && class_exists('phpDocumentor\Reflection\Types\ContextFactory')
|
||||
? new ClassTagRetriever()
|
||||
: new LegacyClassTagRetriever()
|
||||
;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \ReflectionClass $reflectionClass
|
||||
*
|
||||
* @return LegacyMethodTag[]|Method[]
|
||||
*/
|
||||
public function getTagList(\ReflectionClass $reflectionClass)
|
||||
{
|
||||
return array_merge(
|
||||
$this->classRetriever->getTagList($reflectionClass),
|
||||
$this->getInterfacesTagList($reflectionClass)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \ReflectionClass $reflectionClass
|
||||
*
|
||||
* @return LegacyMethodTag[]|Method[]
|
||||
*/
|
||||
private function getInterfacesTagList(\ReflectionClass $reflectionClass)
|
||||
{
|
||||
$interfaces = $reflectionClass->getInterfaces();
|
||||
$tagList = array();
|
||||
|
||||
foreach($interfaces as $interface) {
|
||||
$tagList = array_merge($tagList, $this->classRetriever->getTagList($interface));
|
||||
}
|
||||
|
||||
return $tagList;
|
||||
}
|
||||
}
|
60
vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php
vendored
Normal file
60
vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php
vendored
Normal file
@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\PhpDocumentor;
|
||||
|
||||
use phpDocumentor\Reflection\DocBlock\Tags\Method;
|
||||
use phpDocumentor\Reflection\DocBlockFactory;
|
||||
use phpDocumentor\Reflection\Types\ContextFactory;
|
||||
|
||||
/**
|
||||
* @author Théo FIDRY <theo.fidry@gmail.com>
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
final class ClassTagRetriever implements MethodTagRetrieverInterface
|
||||
{
|
||||
private $docBlockFactory;
|
||||
private $contextFactory;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->docBlockFactory = DocBlockFactory::createInstance();
|
||||
$this->contextFactory = new ContextFactory();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \ReflectionClass $reflectionClass
|
||||
*
|
||||
* @return Method[]
|
||||
*/
|
||||
public function getTagList(\ReflectionClass $reflectionClass)
|
||||
{
|
||||
try {
|
||||
$phpdoc = $this->docBlockFactory->create(
|
||||
$reflectionClass,
|
||||
$this->contextFactory->createFromReflector($reflectionClass)
|
||||
);
|
||||
|
||||
$methods = array();
|
||||
|
||||
foreach ($phpdoc->getTagsByName('method') as $tag) {
|
||||
if ($tag instanceof Method) {
|
||||
$methods[] = $tag;
|
||||
}
|
||||
}
|
||||
|
||||
return $methods;
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
return array();
|
||||
}
|
||||
}
|
||||
}
|
35
vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php
vendored
Normal file
35
vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\PhpDocumentor;
|
||||
|
||||
use phpDocumentor\Reflection\DocBlock;
|
||||
use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag;
|
||||
|
||||
/**
|
||||
* @author Théo FIDRY <theo.fidry@gmail.com>
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
final class LegacyClassTagRetriever implements MethodTagRetrieverInterface
|
||||
{
|
||||
/**
|
||||
* @param \ReflectionClass $reflectionClass
|
||||
*
|
||||
* @return LegacyMethodTag[]
|
||||
*/
|
||||
public function getTagList(\ReflectionClass $reflectionClass)
|
||||
{
|
||||
$phpdoc = new DocBlock($reflectionClass->getDocComment());
|
||||
|
||||
return $phpdoc->getTagsByName('method');
|
||||
}
|
||||
}
|
30
vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php
vendored
Normal file
30
vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\PhpDocumentor;
|
||||
|
||||
use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag;
|
||||
use phpDocumentor\Reflection\DocBlock\Tags\Method;
|
||||
|
||||
/**
|
||||
* @author Théo FIDRY <theo.fidry@gmail.com>
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
interface MethodTagRetrieverInterface
|
||||
{
|
||||
/**
|
||||
* @param \ReflectionClass $reflectionClass
|
||||
*
|
||||
* @return LegacyMethodTag[]|Method[]
|
||||
*/
|
||||
public function getTagList(\ReflectionClass $reflectionClass);
|
||||
}
|
86
vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php
vendored
Normal file
86
vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php
vendored
Normal file
@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Prediction;
|
||||
|
||||
use Prophecy\Call\Call;
|
||||
use Prophecy\Prophecy\ObjectProphecy;
|
||||
use Prophecy\Prophecy\MethodProphecy;
|
||||
use Prophecy\Argument\ArgumentsWildcard;
|
||||
use Prophecy\Argument\Token\AnyValuesToken;
|
||||
use Prophecy\Util\StringUtil;
|
||||
use Prophecy\Exception\Prediction\NoCallsException;
|
||||
|
||||
/**
|
||||
* Call prediction.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class CallPrediction implements PredictionInterface
|
||||
{
|
||||
private $util;
|
||||
|
||||
/**
|
||||
* Initializes prediction.
|
||||
*
|
||||
* @param StringUtil $util
|
||||
*/
|
||||
public function __construct(StringUtil $util = null)
|
||||
{
|
||||
$this->util = $util ?: new StringUtil;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that there was at least one call.
|
||||
*
|
||||
* @param Call[] $calls
|
||||
* @param ObjectProphecy $object
|
||||
* @param MethodProphecy $method
|
||||
*
|
||||
* @throws \Prophecy\Exception\Prediction\NoCallsException
|
||||
*/
|
||||
public function check(array $calls, ObjectProphecy $object, MethodProphecy $method)
|
||||
{
|
||||
if (count($calls)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$methodCalls = $object->findProphecyMethodCalls(
|
||||
$method->getMethodName(),
|
||||
new ArgumentsWildcard(array(new AnyValuesToken))
|
||||
);
|
||||
|
||||
if (count($methodCalls)) {
|
||||
throw new NoCallsException(sprintf(
|
||||
"No calls have been made that match:\n".
|
||||
" %s->%s(%s)\n".
|
||||
"but expected at least one.\n".
|
||||
"Recorded `%s(...)` calls:\n%s",
|
||||
|
||||
get_class($object->reveal()),
|
||||
$method->getMethodName(),
|
||||
$method->getArgumentsWildcard(),
|
||||
$method->getMethodName(),
|
||||
$this->util->stringifyCalls($methodCalls)
|
||||
), $method);
|
||||
}
|
||||
|
||||
throw new NoCallsException(sprintf(
|
||||
"No calls have been made that match:\n".
|
||||
" %s->%s(%s)\n".
|
||||
"but expected at least one.",
|
||||
|
||||
get_class($object->reveal()),
|
||||
$method->getMethodName(),
|
||||
$method->getArgumentsWildcard()
|
||||
), $method);
|
||||
}
|
||||
}
|
107
vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php
vendored
Normal file
107
vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php
vendored
Normal file
@ -0,0 +1,107 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Prediction;
|
||||
|
||||
use Prophecy\Call\Call;
|
||||
use Prophecy\Prophecy\ObjectProphecy;
|
||||
use Prophecy\Prophecy\MethodProphecy;
|
||||
use Prophecy\Argument\ArgumentsWildcard;
|
||||
use Prophecy\Argument\Token\AnyValuesToken;
|
||||
use Prophecy\Util\StringUtil;
|
||||
use Prophecy\Exception\Prediction\UnexpectedCallsCountException;
|
||||
|
||||
/**
|
||||
* Prediction interface.
|
||||
* Predictions are logical test blocks, tied to `should...` keyword.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class CallTimesPrediction implements PredictionInterface
|
||||
{
|
||||
private $times;
|
||||
private $util;
|
||||
|
||||
/**
|
||||
* Initializes prediction.
|
||||
*
|
||||
* @param int $times
|
||||
* @param StringUtil $util
|
||||
*/
|
||||
public function __construct($times, StringUtil $util = null)
|
||||
{
|
||||
$this->times = intval($times);
|
||||
$this->util = $util ?: new StringUtil;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that there was exact amount of calls made.
|
||||
*
|
||||
* @param Call[] $calls
|
||||
* @param ObjectProphecy $object
|
||||
* @param MethodProphecy $method
|
||||
*
|
||||
* @throws \Prophecy\Exception\Prediction\UnexpectedCallsCountException
|
||||
*/
|
||||
public function check(array $calls, ObjectProphecy $object, MethodProphecy $method)
|
||||
{
|
||||
if ($this->times == count($calls)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$methodCalls = $object->findProphecyMethodCalls(
|
||||
$method->getMethodName(),
|
||||
new ArgumentsWildcard(array(new AnyValuesToken))
|
||||
);
|
||||
|
||||
if (count($calls)) {
|
||||
$message = sprintf(
|
||||
"Expected exactly %d calls that match:\n".
|
||||
" %s->%s(%s)\n".
|
||||
"but %d were made:\n%s",
|
||||
|
||||
$this->times,
|
||||
get_class($object->reveal()),
|
||||
$method->getMethodName(),
|
||||
$method->getArgumentsWildcard(),
|
||||
count($calls),
|
||||
$this->util->stringifyCalls($calls)
|
||||
);
|
||||
} elseif (count($methodCalls)) {
|
||||
$message = sprintf(
|
||||
"Expected exactly %d calls that match:\n".
|
||||
" %s->%s(%s)\n".
|
||||
"but none were made.\n".
|
||||
"Recorded `%s(...)` calls:\n%s",
|
||||
|
||||
$this->times,
|
||||
get_class($object->reveal()),
|
||||
$method->getMethodName(),
|
||||
$method->getArgumentsWildcard(),
|
||||
$method->getMethodName(),
|
||||
$this->util->stringifyCalls($methodCalls)
|
||||
);
|
||||
} else {
|
||||
$message = sprintf(
|
||||
"Expected exactly %d calls that match:\n".
|
||||
" %s->%s(%s)\n".
|
||||
"but none were made.",
|
||||
|
||||
$this->times,
|
||||
get_class($object->reveal()),
|
||||
$method->getMethodName(),
|
||||
$method->getArgumentsWildcard()
|
||||
);
|
||||
}
|
||||
|
||||
throw new UnexpectedCallsCountException($message, $method, $this->times, $calls);
|
||||
}
|
||||
}
|
65
vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php
vendored
Normal file
65
vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php
vendored
Normal file
@ -0,0 +1,65 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Prediction;
|
||||
|
||||
use Prophecy\Call\Call;
|
||||
use Prophecy\Prophecy\ObjectProphecy;
|
||||
use Prophecy\Prophecy\MethodProphecy;
|
||||
use Prophecy\Exception\InvalidArgumentException;
|
||||
use Closure;
|
||||
|
||||
/**
|
||||
* Callback prediction.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class CallbackPrediction implements PredictionInterface
|
||||
{
|
||||
private $callback;
|
||||
|
||||
/**
|
||||
* Initializes callback prediction.
|
||||
*
|
||||
* @param callable $callback Custom callback
|
||||
*
|
||||
* @throws \Prophecy\Exception\InvalidArgumentException
|
||||
*/
|
||||
public function __construct($callback)
|
||||
{
|
||||
if (!is_callable($callback)) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'Callable expected as an argument to CallbackPrediction, but got %s.',
|
||||
gettype($callback)
|
||||
));
|
||||
}
|
||||
|
||||
$this->callback = $callback;
|
||||
}
|
||||
|
||||
/**
|
||||
* Executes preset callback.
|
||||
*
|
||||
* @param Call[] $calls
|
||||
* @param ObjectProphecy $object
|
||||
* @param MethodProphecy $method
|
||||
*/
|
||||
public function check(array $calls, ObjectProphecy $object, MethodProphecy $method)
|
||||
{
|
||||
$callback = $this->callback;
|
||||
|
||||
if ($callback instanceof Closure && method_exists('Closure', 'bind')) {
|
||||
$callback = Closure::bind($callback, $object);
|
||||
}
|
||||
|
||||
call_user_func($callback, $calls, $object, $method);
|
||||
}
|
||||
}
|
68
vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php
vendored
Normal file
68
vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php
vendored
Normal file
@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Prediction;
|
||||
|
||||
use Prophecy\Call\Call;
|
||||
use Prophecy\Prophecy\ObjectProphecy;
|
||||
use Prophecy\Prophecy\MethodProphecy;
|
||||
use Prophecy\Util\StringUtil;
|
||||
use Prophecy\Exception\Prediction\UnexpectedCallsException;
|
||||
|
||||
/**
|
||||
* No calls prediction.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class NoCallsPrediction implements PredictionInterface
|
||||
{
|
||||
private $util;
|
||||
|
||||
/**
|
||||
* Initializes prediction.
|
||||
*
|
||||
* @param null|StringUtil $util
|
||||
*/
|
||||
public function __construct(StringUtil $util = null)
|
||||
{
|
||||
$this->util = $util ?: new StringUtil;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that there were no calls made.
|
||||
*
|
||||
* @param Call[] $calls
|
||||
* @param ObjectProphecy $object
|
||||
* @param MethodProphecy $method
|
||||
*
|
||||
* @throws \Prophecy\Exception\Prediction\UnexpectedCallsException
|
||||
*/
|
||||
public function check(array $calls, ObjectProphecy $object, MethodProphecy $method)
|
||||
{
|
||||
if (!count($calls)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$verb = count($calls) === 1 ? 'was' : 'were';
|
||||
|
||||
throw new UnexpectedCallsException(sprintf(
|
||||
"No calls expected that match:\n".
|
||||
" %s->%s(%s)\n".
|
||||
"but %d %s made:\n%s",
|
||||
get_class($object->reveal()),
|
||||
$method->getMethodName(),
|
||||
$method->getArgumentsWildcard(),
|
||||
count($calls),
|
||||
$verb,
|
||||
$this->util->stringifyCalls($calls)
|
||||
), $method, $calls);
|
||||
}
|
||||
}
|
37
vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php
vendored
Normal file
37
vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Prediction;
|
||||
|
||||
use Prophecy\Call\Call;
|
||||
use Prophecy\Prophecy\ObjectProphecy;
|
||||
use Prophecy\Prophecy\MethodProphecy;
|
||||
|
||||
/**
|
||||
* Prediction interface.
|
||||
* Predictions are logical test blocks, tied to `should...` keyword.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
interface PredictionInterface
|
||||
{
|
||||
/**
|
||||
* Tests that double fulfilled prediction.
|
||||
*
|
||||
* @param Call[] $calls
|
||||
* @param ObjectProphecy $object
|
||||
* @param MethodProphecy $method
|
||||
*
|
||||
* @throws object
|
||||
* @return void
|
||||
*/
|
||||
public function check(array $calls, ObjectProphecy $object, MethodProphecy $method);
|
||||
}
|
66
vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php
vendored
Normal file
66
vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php
vendored
Normal file
@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Promise;
|
||||
|
||||
use Prophecy\Prophecy\ObjectProphecy;
|
||||
use Prophecy\Prophecy\MethodProphecy;
|
||||
use Prophecy\Exception\InvalidArgumentException;
|
||||
use Closure;
|
||||
|
||||
/**
|
||||
* Callback promise.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class CallbackPromise implements PromiseInterface
|
||||
{
|
||||
private $callback;
|
||||
|
||||
/**
|
||||
* Initializes callback promise.
|
||||
*
|
||||
* @param callable $callback Custom callback
|
||||
*
|
||||
* @throws \Prophecy\Exception\InvalidArgumentException
|
||||
*/
|
||||
public function __construct($callback)
|
||||
{
|
||||
if (!is_callable($callback)) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'Callable expected as an argument to CallbackPromise, but got %s.',
|
||||
gettype($callback)
|
||||
));
|
||||
}
|
||||
|
||||
$this->callback = $callback;
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates promise callback.
|
||||
*
|
||||
* @param array $args
|
||||
* @param ObjectProphecy $object
|
||||
* @param MethodProphecy $method
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function execute(array $args, ObjectProphecy $object, MethodProphecy $method)
|
||||
{
|
||||
$callback = $this->callback;
|
||||
|
||||
if ($callback instanceof Closure && method_exists('Closure', 'bind')) {
|
||||
$callback = Closure::bind($callback, $object);
|
||||
}
|
||||
|
||||
return call_user_func($callback, $args, $object, $method);
|
||||
}
|
||||
}
|
35
vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php
vendored
Normal file
35
vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Promise;
|
||||
|
||||
use Prophecy\Prophecy\ObjectProphecy;
|
||||
use Prophecy\Prophecy\MethodProphecy;
|
||||
|
||||
/**
|
||||
* Promise interface.
|
||||
* Promises are logical blocks, tied to `will...` keyword.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
interface PromiseInterface
|
||||
{
|
||||
/**
|
||||
* Evaluates promise.
|
||||
*
|
||||
* @param array $args
|
||||
* @param ObjectProphecy $object
|
||||
* @param MethodProphecy $method
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function execute(array $args, ObjectProphecy $object, MethodProphecy $method);
|
||||
}
|
61
vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php
vendored
Normal file
61
vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php
vendored
Normal file
@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Promise;
|
||||
|
||||
use Prophecy\Exception\InvalidArgumentException;
|
||||
use Prophecy\Prophecy\ObjectProphecy;
|
||||
use Prophecy\Prophecy\MethodProphecy;
|
||||
|
||||
/**
|
||||
* Return argument promise.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class ReturnArgumentPromise implements PromiseInterface
|
||||
{
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $index;
|
||||
|
||||
/**
|
||||
* Initializes callback promise.
|
||||
*
|
||||
* @param int $index The zero-indexed number of the argument to return
|
||||
*
|
||||
* @throws \Prophecy\Exception\InvalidArgumentException
|
||||
*/
|
||||
public function __construct($index = 0)
|
||||
{
|
||||
if (!is_int($index) || $index < 0) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'Zero-based index expected as argument to ReturnArgumentPromise, but got %s.',
|
||||
$index
|
||||
));
|
||||
}
|
||||
$this->index = $index;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns nth argument if has one, null otherwise.
|
||||
*
|
||||
* @param array $args
|
||||
* @param ObjectProphecy $object
|
||||
* @param MethodProphecy $method
|
||||
*
|
||||
* @return null|mixed
|
||||
*/
|
||||
public function execute(array $args, ObjectProphecy $object, MethodProphecy $method)
|
||||
{
|
||||
return count($args) > $this->index ? $args[$this->index] : null;
|
||||
}
|
||||
}
|
55
vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php
vendored
Normal file
55
vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php
vendored
Normal file
@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Promise;
|
||||
|
||||
use Prophecy\Prophecy\ObjectProphecy;
|
||||
use Prophecy\Prophecy\MethodProphecy;
|
||||
|
||||
/**
|
||||
* Return promise.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class ReturnPromise implements PromiseInterface
|
||||
{
|
||||
private $returnValues = array();
|
||||
|
||||
/**
|
||||
* Initializes promise.
|
||||
*
|
||||
* @param array $returnValues Array of values
|
||||
*/
|
||||
public function __construct(array $returnValues)
|
||||
{
|
||||
$this->returnValues = $returnValues;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns saved values one by one until last one, then continuously returns last value.
|
||||
*
|
||||
* @param array $args
|
||||
* @param ObjectProphecy $object
|
||||
* @param MethodProphecy $method
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function execute(array $args, ObjectProphecy $object, MethodProphecy $method)
|
||||
{
|
||||
$value = array_shift($this->returnValues);
|
||||
|
||||
if (!count($this->returnValues)) {
|
||||
$this->returnValues[] = $value;
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
}
|
100
vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php
vendored
Normal file
100
vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php
vendored
Normal file
@ -0,0 +1,100 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Promise;
|
||||
|
||||
use Doctrine\Instantiator\Instantiator;
|
||||
use Prophecy\Prophecy\ObjectProphecy;
|
||||
use Prophecy\Prophecy\MethodProphecy;
|
||||
use Prophecy\Exception\InvalidArgumentException;
|
||||
use ReflectionClass;
|
||||
|
||||
/**
|
||||
* Throw promise.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class ThrowPromise implements PromiseInterface
|
||||
{
|
||||
private $exception;
|
||||
|
||||
/**
|
||||
* @var \Doctrine\Instantiator\Instantiator
|
||||
*/
|
||||
private $instantiator;
|
||||
|
||||
/**
|
||||
* Initializes promise.
|
||||
*
|
||||
* @param string|\Exception|\Throwable $exception Exception class name or instance
|
||||
*
|
||||
* @throws \Prophecy\Exception\InvalidArgumentException
|
||||
*/
|
||||
public function __construct($exception)
|
||||
{
|
||||
if (is_string($exception)) {
|
||||
if ((!class_exists($exception) && !interface_exists($exception)) || !$this->isAValidThrowable($exception)) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'Exception / Throwable class or instance expected as argument to ThrowPromise, but got %s.',
|
||||
$exception
|
||||
));
|
||||
}
|
||||
} elseif (!$exception instanceof \Exception && !$exception instanceof \Throwable) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'Exception / Throwable class or instance expected as argument to ThrowPromise, but got %s.',
|
||||
is_object($exception) ? get_class($exception) : gettype($exception)
|
||||
));
|
||||
}
|
||||
|
||||
$this->exception = $exception;
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws predefined exception.
|
||||
*
|
||||
* @param array $args
|
||||
* @param ObjectProphecy $object
|
||||
* @param MethodProphecy $method
|
||||
*
|
||||
* @throws object
|
||||
*/
|
||||
public function execute(array $args, ObjectProphecy $object, MethodProphecy $method)
|
||||
{
|
||||
if (is_string($this->exception)) {
|
||||
$classname = $this->exception;
|
||||
$reflection = new ReflectionClass($classname);
|
||||
$constructor = $reflection->getConstructor();
|
||||
|
||||
if ($constructor->isPublic() && 0 == $constructor->getNumberOfRequiredParameters()) {
|
||||
throw $reflection->newInstance();
|
||||
}
|
||||
|
||||
if (!$this->instantiator) {
|
||||
$this->instantiator = new Instantiator();
|
||||
}
|
||||
|
||||
throw $this->instantiator->instantiate($classname);
|
||||
}
|
||||
|
||||
throw $this->exception;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $exception
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function isAValidThrowable($exception)
|
||||
{
|
||||
return is_a($exception, 'Exception', true)
|
||||
|| is_a($exception, 'Throwable', true);
|
||||
}
|
||||
}
|
522
vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php
vendored
Normal file
522
vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php
vendored
Normal file
@ -0,0 +1,522 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Prophecy;
|
||||
|
||||
use Prophecy\Argument;
|
||||
use Prophecy\Prophet;
|
||||
use Prophecy\Promise;
|
||||
use Prophecy\Prediction;
|
||||
use Prophecy\Exception\Doubler\MethodNotFoundException;
|
||||
use Prophecy\Exception\InvalidArgumentException;
|
||||
use Prophecy\Exception\Prophecy\MethodProphecyException;
|
||||
|
||||
/**
|
||||
* Method prophecy.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class MethodProphecy
|
||||
{
|
||||
private $objectProphecy;
|
||||
private $methodName;
|
||||
private $argumentsWildcard;
|
||||
private $promise;
|
||||
private $prediction;
|
||||
private $checkedPredictions = array();
|
||||
private $bound = false;
|
||||
private $voidReturnType = false;
|
||||
|
||||
/**
|
||||
* Initializes method prophecy.
|
||||
*
|
||||
* @param ObjectProphecy $objectProphecy
|
||||
* @param string $methodName
|
||||
* @param null|Argument\ArgumentsWildcard|array $arguments
|
||||
*
|
||||
* @throws \Prophecy\Exception\Doubler\MethodNotFoundException If method not found
|
||||
*/
|
||||
public function __construct(ObjectProphecy $objectProphecy, $methodName, $arguments = null)
|
||||
{
|
||||
$double = $objectProphecy->reveal();
|
||||
if (!method_exists($double, $methodName)) {
|
||||
throw new MethodNotFoundException(sprintf(
|
||||
'Method `%s::%s()` is not defined.', get_class($double), $methodName
|
||||
), get_class($double), $methodName, $arguments);
|
||||
}
|
||||
|
||||
$this->objectProphecy = $objectProphecy;
|
||||
$this->methodName = $methodName;
|
||||
|
||||
$reflectedMethod = new \ReflectionMethod($double, $methodName);
|
||||
if ($reflectedMethod->isFinal()) {
|
||||
throw new MethodProphecyException(sprintf(
|
||||
"Can not add prophecy for a method `%s::%s()`\n".
|
||||
"as it is a final method.",
|
||||
get_class($double),
|
||||
$methodName
|
||||
), $this);
|
||||
}
|
||||
|
||||
if (null !== $arguments) {
|
||||
$this->withArguments($arguments);
|
||||
}
|
||||
|
||||
if (version_compare(PHP_VERSION, '7.0', '>=') && true === $reflectedMethod->hasReturnType()) {
|
||||
$type = PHP_VERSION_ID >= 70100 ? $reflectedMethod->getReturnType()->getName() : (string) $reflectedMethod->getReturnType();
|
||||
|
||||
if ('void' === $type) {
|
||||
$this->voidReturnType = true;
|
||||
}
|
||||
|
||||
$this->will(function () use ($type) {
|
||||
switch ($type) {
|
||||
case 'void': return;
|
||||
case 'string': return '';
|
||||
case 'float': return 0.0;
|
||||
case 'int': return 0;
|
||||
case 'bool': return false;
|
||||
case 'array': return array();
|
||||
|
||||
case 'callable':
|
||||
case 'Closure':
|
||||
return function () {};
|
||||
|
||||
case 'Traversable':
|
||||
case 'Generator':
|
||||
// Remove eval() when minimum version >=5.5
|
||||
/** @var callable $generator */
|
||||
$generator = eval('return function () { yield; };');
|
||||
return $generator();
|
||||
|
||||
default:
|
||||
$prophet = new Prophet;
|
||||
return $prophet->prophesize($type)->reveal();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets argument wildcard.
|
||||
*
|
||||
* @param array|Argument\ArgumentsWildcard $arguments
|
||||
*
|
||||
* @return $this
|
||||
*
|
||||
* @throws \Prophecy\Exception\InvalidArgumentException
|
||||
*/
|
||||
public function withArguments($arguments)
|
||||
{
|
||||
if (is_array($arguments)) {
|
||||
$arguments = new Argument\ArgumentsWildcard($arguments);
|
||||
}
|
||||
|
||||
if (!$arguments instanceof Argument\ArgumentsWildcard) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
"Either an array or an instance of ArgumentsWildcard expected as\n".
|
||||
'a `MethodProphecy::withArguments()` argument, but got %s.',
|
||||
gettype($arguments)
|
||||
));
|
||||
}
|
||||
|
||||
$this->argumentsWildcard = $arguments;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets custom promise to the prophecy.
|
||||
*
|
||||
* @param callable|Promise\PromiseInterface $promise
|
||||
*
|
||||
* @return $this
|
||||
*
|
||||
* @throws \Prophecy\Exception\InvalidArgumentException
|
||||
*/
|
||||
public function will($promise)
|
||||
{
|
||||
if (is_callable($promise)) {
|
||||
$promise = new Promise\CallbackPromise($promise);
|
||||
}
|
||||
|
||||
if (!$promise instanceof Promise\PromiseInterface) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'Expected callable or instance of PromiseInterface, but got %s.',
|
||||
gettype($promise)
|
||||
));
|
||||
}
|
||||
|
||||
$this->bindToObjectProphecy();
|
||||
$this->promise = $promise;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets return promise to the prophecy.
|
||||
*
|
||||
* @see \Prophecy\Promise\ReturnPromise
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function willReturn()
|
||||
{
|
||||
if ($this->voidReturnType) {
|
||||
throw new MethodProphecyException(
|
||||
"The method \"$this->methodName\" has a void return type, and so cannot return anything",
|
||||
$this
|
||||
);
|
||||
}
|
||||
|
||||
return $this->will(new Promise\ReturnPromise(func_get_args()));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $items
|
||||
*
|
||||
* @return $this
|
||||
*
|
||||
* @throws \Prophecy\Exception\InvalidArgumentException
|
||||
*/
|
||||
public function willYield($items)
|
||||
{
|
||||
if ($this->voidReturnType) {
|
||||
throw new MethodProphecyException(
|
||||
"The method \"$this->methodName\" has a void return type, and so cannot yield anything",
|
||||
$this
|
||||
);
|
||||
}
|
||||
|
||||
if (!is_array($items)) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'Expected array, but got %s.',
|
||||
gettype($items)
|
||||
));
|
||||
}
|
||||
|
||||
// Remove eval() when minimum version >=5.5
|
||||
/** @var callable $generator */
|
||||
$generator = eval('return function() use ($items) {
|
||||
foreach ($items as $key => $value) {
|
||||
yield $key => $value;
|
||||
}
|
||||
};');
|
||||
|
||||
return $this->will($generator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets return argument promise to the prophecy.
|
||||
*
|
||||
* @param int $index The zero-indexed number of the argument to return
|
||||
*
|
||||
* @see \Prophecy\Promise\ReturnArgumentPromise
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function willReturnArgument($index = 0)
|
||||
{
|
||||
if ($this->voidReturnType) {
|
||||
throw new MethodProphecyException("The method \"$this->methodName\" has a void return type", $this);
|
||||
}
|
||||
|
||||
return $this->will(new Promise\ReturnArgumentPromise($index));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets throw promise to the prophecy.
|
||||
*
|
||||
* @see \Prophecy\Promise\ThrowPromise
|
||||
*
|
||||
* @param string|\Exception $exception Exception class or instance
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function willThrow($exception)
|
||||
{
|
||||
return $this->will(new Promise\ThrowPromise($exception));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets custom prediction to the prophecy.
|
||||
*
|
||||
* @param callable|Prediction\PredictionInterface $prediction
|
||||
*
|
||||
* @return $this
|
||||
*
|
||||
* @throws \Prophecy\Exception\InvalidArgumentException
|
||||
*/
|
||||
public function should($prediction)
|
||||
{
|
||||
if (is_callable($prediction)) {
|
||||
$prediction = new Prediction\CallbackPrediction($prediction);
|
||||
}
|
||||
|
||||
if (!$prediction instanceof Prediction\PredictionInterface) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'Expected callable or instance of PredictionInterface, but got %s.',
|
||||
gettype($prediction)
|
||||
));
|
||||
}
|
||||
|
||||
$this->bindToObjectProphecy();
|
||||
$this->prediction = $prediction;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets call prediction to the prophecy.
|
||||
*
|
||||
* @see \Prophecy\Prediction\CallPrediction
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function shouldBeCalled()
|
||||
{
|
||||
return $this->should(new Prediction\CallPrediction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets no calls prediction to the prophecy.
|
||||
*
|
||||
* @see \Prophecy\Prediction\NoCallsPrediction
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function shouldNotBeCalled()
|
||||
{
|
||||
return $this->should(new Prediction\NoCallsPrediction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets call times prediction to the prophecy.
|
||||
*
|
||||
* @see \Prophecy\Prediction\CallTimesPrediction
|
||||
*
|
||||
* @param $count
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function shouldBeCalledTimes($count)
|
||||
{
|
||||
return $this->should(new Prediction\CallTimesPrediction($count));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets call times prediction to the prophecy.
|
||||
*
|
||||
* @see \Prophecy\Prediction\CallTimesPrediction
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function shouldBeCalledOnce()
|
||||
{
|
||||
return $this->shouldBeCalledTimes(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks provided prediction immediately.
|
||||
*
|
||||
* @param callable|Prediction\PredictionInterface $prediction
|
||||
*
|
||||
* @return $this
|
||||
*
|
||||
* @throws \Prophecy\Exception\InvalidArgumentException
|
||||
*/
|
||||
public function shouldHave($prediction)
|
||||
{
|
||||
if (is_callable($prediction)) {
|
||||
$prediction = new Prediction\CallbackPrediction($prediction);
|
||||
}
|
||||
|
||||
if (!$prediction instanceof Prediction\PredictionInterface) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'Expected callable or instance of PredictionInterface, but got %s.',
|
||||
gettype($prediction)
|
||||
));
|
||||
}
|
||||
|
||||
if (null === $this->promise && !$this->voidReturnType) {
|
||||
$this->willReturn();
|
||||
}
|
||||
|
||||
$calls = $this->getObjectProphecy()->findProphecyMethodCalls(
|
||||
$this->getMethodName(),
|
||||
$this->getArgumentsWildcard()
|
||||
);
|
||||
|
||||
try {
|
||||
$prediction->check($calls, $this->getObjectProphecy(), $this);
|
||||
$this->checkedPredictions[] = $prediction;
|
||||
} catch (\Exception $e) {
|
||||
$this->checkedPredictions[] = $prediction;
|
||||
|
||||
throw $e;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks call prediction.
|
||||
*
|
||||
* @see \Prophecy\Prediction\CallPrediction
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function shouldHaveBeenCalled()
|
||||
{
|
||||
return $this->shouldHave(new Prediction\CallPrediction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks no calls prediction.
|
||||
*
|
||||
* @see \Prophecy\Prediction\NoCallsPrediction
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function shouldNotHaveBeenCalled()
|
||||
{
|
||||
return $this->shouldHave(new Prediction\NoCallsPrediction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks no calls prediction.
|
||||
*
|
||||
* @see \Prophecy\Prediction\NoCallsPrediction
|
||||
* @deprecated
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function shouldNotBeenCalled()
|
||||
{
|
||||
return $this->shouldNotHaveBeenCalled();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks call times prediction.
|
||||
*
|
||||
* @see \Prophecy\Prediction\CallTimesPrediction
|
||||
*
|
||||
* @param int $count
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function shouldHaveBeenCalledTimes($count)
|
||||
{
|
||||
return $this->shouldHave(new Prediction\CallTimesPrediction($count));
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks call times prediction.
|
||||
*
|
||||
* @see \Prophecy\Prediction\CallTimesPrediction
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function shouldHaveBeenCalledOnce()
|
||||
{
|
||||
return $this->shouldHaveBeenCalledTimes(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks currently registered [with should(...)] prediction.
|
||||
*/
|
||||
public function checkPrediction()
|
||||
{
|
||||
if (null === $this->prediction) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->shouldHave($this->prediction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns currently registered promise.
|
||||
*
|
||||
* @return null|Promise\PromiseInterface
|
||||
*/
|
||||
public function getPromise()
|
||||
{
|
||||
return $this->promise;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns currently registered prediction.
|
||||
*
|
||||
* @return null|Prediction\PredictionInterface
|
||||
*/
|
||||
public function getPrediction()
|
||||
{
|
||||
return $this->prediction;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns predictions that were checked on this object.
|
||||
*
|
||||
* @return Prediction\PredictionInterface[]
|
||||
*/
|
||||
public function getCheckedPredictions()
|
||||
{
|
||||
return $this->checkedPredictions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns object prophecy this method prophecy is tied to.
|
||||
*
|
||||
* @return ObjectProphecy
|
||||
*/
|
||||
public function getObjectProphecy()
|
||||
{
|
||||
return $this->objectProphecy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns method name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getMethodName()
|
||||
{
|
||||
return $this->methodName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns arguments wildcard.
|
||||
*
|
||||
* @return Argument\ArgumentsWildcard
|
||||
*/
|
||||
public function getArgumentsWildcard()
|
||||
{
|
||||
return $this->argumentsWildcard;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function hasReturnVoid()
|
||||
{
|
||||
return $this->voidReturnType;
|
||||
}
|
||||
|
||||
private function bindToObjectProphecy()
|
||||
{
|
||||
if ($this->bound) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->getObjectProphecy()->addMethodProphecy($this);
|
||||
$this->bound = true;
|
||||
}
|
||||
}
|
286
vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php
vendored
Normal file
286
vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php
vendored
Normal file
@ -0,0 +1,286 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Prophecy;
|
||||
|
||||
use SebastianBergmann\Comparator\ComparisonFailure;
|
||||
use Prophecy\Comparator\Factory as ComparatorFactory;
|
||||
use Prophecy\Call\Call;
|
||||
use Prophecy\Doubler\LazyDouble;
|
||||
use Prophecy\Argument\ArgumentsWildcard;
|
||||
use Prophecy\Call\CallCenter;
|
||||
use Prophecy\Exception\Prophecy\ObjectProphecyException;
|
||||
use Prophecy\Exception\Prophecy\MethodProphecyException;
|
||||
use Prophecy\Exception\Prediction\AggregateException;
|
||||
use Prophecy\Exception\Prediction\PredictionException;
|
||||
|
||||
/**
|
||||
* Object prophecy.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class ObjectProphecy implements ProphecyInterface
|
||||
{
|
||||
private $lazyDouble;
|
||||
private $callCenter;
|
||||
private $revealer;
|
||||
private $comparatorFactory;
|
||||
|
||||
/**
|
||||
* @var MethodProphecy[][]
|
||||
*/
|
||||
private $methodProphecies = array();
|
||||
|
||||
/**
|
||||
* Initializes object prophecy.
|
||||
*
|
||||
* @param LazyDouble $lazyDouble
|
||||
* @param CallCenter $callCenter
|
||||
* @param RevealerInterface $revealer
|
||||
* @param ComparatorFactory $comparatorFactory
|
||||
*/
|
||||
public function __construct(
|
||||
LazyDouble $lazyDouble,
|
||||
CallCenter $callCenter = null,
|
||||
RevealerInterface $revealer = null,
|
||||
ComparatorFactory $comparatorFactory = null
|
||||
) {
|
||||
$this->lazyDouble = $lazyDouble;
|
||||
$this->callCenter = $callCenter ?: new CallCenter;
|
||||
$this->revealer = $revealer ?: new Revealer;
|
||||
|
||||
$this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
* Forces double to extend specific class.
|
||||
*
|
||||
* @param string $class
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function willExtend($class)
|
||||
{
|
||||
$this->lazyDouble->setParentClass($class);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Forces double to implement specific interface.
|
||||
*
|
||||
* @param string $interface
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function willImplement($interface)
|
||||
{
|
||||
$this->lazyDouble->addInterface($interface);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets constructor arguments.
|
||||
*
|
||||
* @param array $arguments
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function willBeConstructedWith(array $arguments = null)
|
||||
{
|
||||
$this->lazyDouble->setArguments($arguments);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reveals double.
|
||||
*
|
||||
* @return object
|
||||
*
|
||||
* @throws \Prophecy\Exception\Prophecy\ObjectProphecyException If double doesn't implement needed interface
|
||||
*/
|
||||
public function reveal()
|
||||
{
|
||||
$double = $this->lazyDouble->getInstance();
|
||||
|
||||
if (null === $double || !$double instanceof ProphecySubjectInterface) {
|
||||
throw new ObjectProphecyException(
|
||||
"Generated double must implement ProphecySubjectInterface, but it does not.\n".
|
||||
'It seems you have wrongly configured doubler without required ClassPatch.',
|
||||
$this
|
||||
);
|
||||
}
|
||||
|
||||
$double->setProphecy($this);
|
||||
|
||||
return $double;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds method prophecy to object prophecy.
|
||||
*
|
||||
* @param MethodProphecy $methodProphecy
|
||||
*
|
||||
* @throws \Prophecy\Exception\Prophecy\MethodProphecyException If method prophecy doesn't
|
||||
* have arguments wildcard
|
||||
*/
|
||||
public function addMethodProphecy(MethodProphecy $methodProphecy)
|
||||
{
|
||||
$argumentsWildcard = $methodProphecy->getArgumentsWildcard();
|
||||
if (null === $argumentsWildcard) {
|
||||
throw new MethodProphecyException(sprintf(
|
||||
"Can not add prophecy for a method `%s::%s()`\n".
|
||||
"as you did not specify arguments wildcard for it.",
|
||||
get_class($this->reveal()),
|
||||
$methodProphecy->getMethodName()
|
||||
), $methodProphecy);
|
||||
}
|
||||
|
||||
$methodName = strtolower($methodProphecy->getMethodName());
|
||||
|
||||
if (!isset($this->methodProphecies[$methodName])) {
|
||||
$this->methodProphecies[$methodName] = array();
|
||||
}
|
||||
|
||||
$this->methodProphecies[$methodName][] = $methodProphecy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns either all or related to single method prophecies.
|
||||
*
|
||||
* @param null|string $methodName
|
||||
*
|
||||
* @return MethodProphecy[]
|
||||
*/
|
||||
public function getMethodProphecies($methodName = null)
|
||||
{
|
||||
if (null === $methodName) {
|
||||
return $this->methodProphecies;
|
||||
}
|
||||
|
||||
$methodName = strtolower($methodName);
|
||||
|
||||
if (!isset($this->methodProphecies[$methodName])) {
|
||||
return array();
|
||||
}
|
||||
|
||||
return $this->methodProphecies[$methodName];
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes specific method call.
|
||||
*
|
||||
* @param string $methodName
|
||||
* @param array $arguments
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function makeProphecyMethodCall($methodName, array $arguments)
|
||||
{
|
||||
$arguments = $this->revealer->reveal($arguments);
|
||||
$return = $this->callCenter->makeCall($this, $methodName, $arguments);
|
||||
|
||||
return $this->revealer->reveal($return);
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds calls by method name & arguments wildcard.
|
||||
*
|
||||
* @param string $methodName
|
||||
* @param ArgumentsWildcard $wildcard
|
||||
*
|
||||
* @return Call[]
|
||||
*/
|
||||
public function findProphecyMethodCalls($methodName, ArgumentsWildcard $wildcard)
|
||||
{
|
||||
return $this->callCenter->findCalls($methodName, $wildcard);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that registered method predictions do not fail.
|
||||
*
|
||||
* @throws \Prophecy\Exception\Prediction\AggregateException If any of registered predictions fail
|
||||
* @throws \Prophecy\Exception\Call\UnexpectedCallException
|
||||
*/
|
||||
public function checkProphecyMethodsPredictions()
|
||||
{
|
||||
$exception = new AggregateException(sprintf("%s:\n", get_class($this->reveal())));
|
||||
$exception->setObjectProphecy($this);
|
||||
|
||||
$this->callCenter->checkUnexpectedCalls();
|
||||
|
||||
foreach ($this->methodProphecies as $prophecies) {
|
||||
foreach ($prophecies as $prophecy) {
|
||||
try {
|
||||
$prophecy->checkPrediction();
|
||||
} catch (PredictionException $e) {
|
||||
$exception->append($e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (count($exception->getExceptions())) {
|
||||
throw $exception;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates new method prophecy using specified method name and arguments.
|
||||
*
|
||||
* @param string $methodName
|
||||
* @param array $arguments
|
||||
*
|
||||
* @return MethodProphecy
|
||||
*/
|
||||
public function __call($methodName, array $arguments)
|
||||
{
|
||||
$arguments = new ArgumentsWildcard($this->revealer->reveal($arguments));
|
||||
|
||||
foreach ($this->getMethodProphecies($methodName) as $prophecy) {
|
||||
$argumentsWildcard = $prophecy->getArgumentsWildcard();
|
||||
$comparator = $this->comparatorFactory->getComparatorFor(
|
||||
$argumentsWildcard, $arguments
|
||||
);
|
||||
|
||||
try {
|
||||
$comparator->assertEquals($argumentsWildcard, $arguments);
|
||||
return $prophecy;
|
||||
} catch (ComparisonFailure $failure) {}
|
||||
}
|
||||
|
||||
return new MethodProphecy($this, $methodName, $arguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tries to get property value from double.
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function __get($name)
|
||||
{
|
||||
return $this->reveal()->$name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tries to set property value to double.
|
||||
*
|
||||
* @param string $name
|
||||
* @param mixed $value
|
||||
*/
|
||||
public function __set($name, $value)
|
||||
{
|
||||
$this->reveal()->$name = $this->revealer->reveal($value);
|
||||
}
|
||||
}
|
27
vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php
vendored
Normal file
27
vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Prophecy;
|
||||
|
||||
/**
|
||||
* Core Prophecy interface.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
interface ProphecyInterface
|
||||
{
|
||||
/**
|
||||
* Reveals prophecy object (double) .
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
public function reveal();
|
||||
}
|
34
vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php
vendored
Normal file
34
vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Prophecy;
|
||||
|
||||
/**
|
||||
* Controllable doubles interface.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
interface ProphecySubjectInterface
|
||||
{
|
||||
/**
|
||||
* Sets subject prophecy.
|
||||
*
|
||||
* @param ProphecyInterface $prophecy
|
||||
*/
|
||||
public function setProphecy(ProphecyInterface $prophecy);
|
||||
|
||||
/**
|
||||
* Returns subject prophecy.
|
||||
*
|
||||
* @return ProphecyInterface
|
||||
*/
|
||||
public function getProphecy();
|
||||
}
|
44
vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php
vendored
Normal file
44
vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php
vendored
Normal file
@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Prophecy;
|
||||
|
||||
/**
|
||||
* Basic prophecies revealer.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class Revealer implements RevealerInterface
|
||||
{
|
||||
/**
|
||||
* Unwraps value(s).
|
||||
*
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function reveal($value)
|
||||
{
|
||||
if (is_array($value)) {
|
||||
return array_map(array($this, __FUNCTION__), $value);
|
||||
}
|
||||
|
||||
if (!is_object($value)) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
if ($value instanceof ProphecyInterface) {
|
||||
$value = $value->reveal();
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
}
|
29
vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php
vendored
Normal file
29
vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Prophecy;
|
||||
|
||||
/**
|
||||
* Prophecies revealer interface.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
interface RevealerInterface
|
||||
{
|
||||
/**
|
||||
* Unwraps value(s).
|
||||
*
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function reveal($value);
|
||||
}
|
138
vendor/phpspec/prophecy/src/Prophecy/Prophet.php
vendored
Normal file
138
vendor/phpspec/prophecy/src/Prophecy/Prophet.php
vendored
Normal file
@ -0,0 +1,138 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy;
|
||||
|
||||
use Prophecy\Doubler\CachedDoubler;
|
||||
use Prophecy\Doubler\Doubler;
|
||||
use Prophecy\Doubler\LazyDouble;
|
||||
use Prophecy\Doubler\ClassPatch;
|
||||
use Prophecy\Prophecy\ObjectProphecy;
|
||||
use Prophecy\Prophecy\RevealerInterface;
|
||||
use Prophecy\Prophecy\Revealer;
|
||||
use Prophecy\Call\CallCenter;
|
||||
use Prophecy\Util\StringUtil;
|
||||
use Prophecy\Exception\Prediction\PredictionException;
|
||||
use Prophecy\Exception\Prediction\AggregateException;
|
||||
|
||||
/**
|
||||
* Prophet creates prophecies.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class Prophet
|
||||
{
|
||||
private $doubler;
|
||||
private $revealer;
|
||||
private $util;
|
||||
|
||||
/**
|
||||
* @var ObjectProphecy[]
|
||||
*/
|
||||
private $prophecies = array();
|
||||
|
||||
/**
|
||||
* Initializes Prophet.
|
||||
*
|
||||
* @param null|Doubler $doubler
|
||||
* @param null|RevealerInterface $revealer
|
||||
* @param null|StringUtil $util
|
||||
*/
|
||||
public function __construct(
|
||||
Doubler $doubler = null,
|
||||
RevealerInterface $revealer = null,
|
||||
StringUtil $util = null
|
||||
) {
|
||||
if (null === $doubler) {
|
||||
$doubler = new CachedDoubler();
|
||||
$doubler->registerClassPatch(new ClassPatch\SplFileInfoPatch);
|
||||
$doubler->registerClassPatch(new ClassPatch\TraversablePatch);
|
||||
$doubler->registerClassPatch(new ClassPatch\ThrowablePatch);
|
||||
$doubler->registerClassPatch(new ClassPatch\DisableConstructorPatch);
|
||||
$doubler->registerClassPatch(new ClassPatch\ProphecySubjectPatch);
|
||||
$doubler->registerClassPatch(new ClassPatch\ReflectionClassNewInstancePatch);
|
||||
$doubler->registerClassPatch(new ClassPatch\HhvmExceptionPatch());
|
||||
$doubler->registerClassPatch(new ClassPatch\MagicCallPatch);
|
||||
$doubler->registerClassPatch(new ClassPatch\KeywordPatch);
|
||||
}
|
||||
|
||||
$this->doubler = $doubler;
|
||||
$this->revealer = $revealer ?: new Revealer;
|
||||
$this->util = $util ?: new StringUtil;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates new object prophecy.
|
||||
*
|
||||
* @param null|string $classOrInterface Class or interface name
|
||||
*
|
||||
* @return ObjectProphecy
|
||||
*/
|
||||
public function prophesize($classOrInterface = null)
|
||||
{
|
||||
$this->prophecies[] = $prophecy = new ObjectProphecy(
|
||||
new LazyDouble($this->doubler),
|
||||
new CallCenter($this->util),
|
||||
$this->revealer
|
||||
);
|
||||
|
||||
if ($classOrInterface && class_exists($classOrInterface)) {
|
||||
return $prophecy->willExtend($classOrInterface);
|
||||
}
|
||||
|
||||
if ($classOrInterface && interface_exists($classOrInterface)) {
|
||||
return $prophecy->willImplement($classOrInterface);
|
||||
}
|
||||
|
||||
return $prophecy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all created object prophecies.
|
||||
*
|
||||
* @return ObjectProphecy[]
|
||||
*/
|
||||
public function getProphecies()
|
||||
{
|
||||
return $this->prophecies;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns Doubler instance assigned to this Prophet.
|
||||
*
|
||||
* @return Doubler
|
||||
*/
|
||||
public function getDoubler()
|
||||
{
|
||||
return $this->doubler;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks all predictions defined by prophecies of this Prophet.
|
||||
*
|
||||
* @throws Exception\Prediction\AggregateException If any prediction fails
|
||||
*/
|
||||
public function checkPredictions()
|
||||
{
|
||||
$exception = new AggregateException("Some predictions failed:\n");
|
||||
foreach ($this->prophecies as $prophecy) {
|
||||
try {
|
||||
$prophecy->checkProphecyMethodsPredictions();
|
||||
} catch (PredictionException $e) {
|
||||
$exception->append($e);
|
||||
}
|
||||
}
|
||||
|
||||
if (count($exception->getExceptions())) {
|
||||
throw $exception;
|
||||
}
|
||||
}
|
||||
}
|
210
vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php
vendored
Normal file
210
vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php
vendored
Normal file
@ -0,0 +1,210 @@
|
||||
<?php
|
||||
|
||||
namespace Prophecy\Util;
|
||||
|
||||
use Prophecy\Prophecy\ProphecyInterface;
|
||||
use SebastianBergmann\RecursionContext\Context;
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
/**
|
||||
* This class is a modification from sebastianbergmann/exporter
|
||||
* @see https://github.com/sebastianbergmann/exporter
|
||||
*/
|
||||
class ExportUtil
|
||||
{
|
||||
/**
|
||||
* Exports a value as a string
|
||||
*
|
||||
* The output of this method is similar to the output of print_r(), but
|
||||
* improved in various aspects:
|
||||
*
|
||||
* - NULL is rendered as "null" (instead of "")
|
||||
* - TRUE is rendered as "true" (instead of "1")
|
||||
* - FALSE is rendered as "false" (instead of "")
|
||||
* - Strings are always quoted with single quotes
|
||||
* - Carriage returns and newlines are normalized to \n
|
||||
* - Recursion and repeated rendering is treated properly
|
||||
*
|
||||
* @param mixed $value
|
||||
* @param int $indentation The indentation level of the 2nd+ line
|
||||
* @return string
|
||||
*/
|
||||
public static function export($value, $indentation = 0)
|
||||
{
|
||||
return self::recursiveExport($value, $indentation);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts an object to an array containing all of its private, protected
|
||||
* and public properties.
|
||||
*
|
||||
* @param mixed $value
|
||||
* @return array
|
||||
*/
|
||||
public static function toArray($value)
|
||||
{
|
||||
if (!is_object($value)) {
|
||||
return (array) $value;
|
||||
}
|
||||
|
||||
$array = array();
|
||||
|
||||
foreach ((array) $value as $key => $val) {
|
||||
// properties are transformed to keys in the following way:
|
||||
// private $property => "\0Classname\0property"
|
||||
// protected $property => "\0*\0property"
|
||||
// public $property => "property"
|
||||
if (preg_match('/^\0.+\0(.+)$/', $key, $matches)) {
|
||||
$key = $matches[1];
|
||||
}
|
||||
|
||||
// See https://github.com/php/php-src/commit/5721132
|
||||
if ($key === "\0gcdata") {
|
||||
continue;
|
||||
}
|
||||
|
||||
$array[$key] = $val;
|
||||
}
|
||||
|
||||
// Some internal classes like SplObjectStorage don't work with the
|
||||
// above (fast) mechanism nor with reflection in Zend.
|
||||
// Format the output similarly to print_r() in this case
|
||||
if ($value instanceof \SplObjectStorage) {
|
||||
// However, the fast method does work in HHVM, and exposes the
|
||||
// internal implementation. Hide it again.
|
||||
if (property_exists('\SplObjectStorage', '__storage')) {
|
||||
unset($array['__storage']);
|
||||
} elseif (property_exists('\SplObjectStorage', 'storage')) {
|
||||
unset($array['storage']);
|
||||
}
|
||||
|
||||
if (property_exists('\SplObjectStorage', '__key')) {
|
||||
unset($array['__key']);
|
||||
}
|
||||
|
||||
foreach ($value as $key => $val) {
|
||||
$array[spl_object_hash($val)] = array(
|
||||
'obj' => $val,
|
||||
'inf' => $value->getInfo(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursive implementation of export
|
||||
*
|
||||
* @param mixed $value The value to export
|
||||
* @param int $indentation The indentation level of the 2nd+ line
|
||||
* @param \SebastianBergmann\RecursionContext\Context $processed Previously processed objects
|
||||
* @return string
|
||||
* @see SebastianBergmann\Exporter\Exporter::export
|
||||
*/
|
||||
protected static function recursiveExport(&$value, $indentation, $processed = null)
|
||||
{
|
||||
if ($value === null) {
|
||||
return 'null';
|
||||
}
|
||||
|
||||
if ($value === true) {
|
||||
return 'true';
|
||||
}
|
||||
|
||||
if ($value === false) {
|
||||
return 'false';
|
||||
}
|
||||
|
||||
if (is_float($value) && floatval(intval($value)) === $value) {
|
||||
return "$value.0";
|
||||
}
|
||||
|
||||
if (is_resource($value)) {
|
||||
return sprintf(
|
||||
'resource(%d) of type (%s)',
|
||||
$value,
|
||||
get_resource_type($value)
|
||||
);
|
||||
}
|
||||
|
||||
if (is_string($value)) {
|
||||
// Match for most non printable chars somewhat taking multibyte chars into account
|
||||
if (preg_match('/[^\x09-\x0d\x20-\xff]/', $value)) {
|
||||
return 'Binary String: 0x' . bin2hex($value);
|
||||
}
|
||||
|
||||
return "'" .
|
||||
str_replace(array("\r\n", "\n\r", "\r"), array("\n", "\n", "\n"), $value) .
|
||||
"'";
|
||||
}
|
||||
|
||||
$whitespace = str_repeat(' ', 4 * $indentation);
|
||||
|
||||
if (!$processed) {
|
||||
$processed = new Context;
|
||||
}
|
||||
|
||||
if (is_array($value)) {
|
||||
if (($key = $processed->contains($value)) !== false) {
|
||||
return 'Array &' . $key;
|
||||
}
|
||||
|
||||
$array = $value;
|
||||
$key = $processed->add($value);
|
||||
$values = '';
|
||||
|
||||
if (count($array) > 0) {
|
||||
foreach ($array as $k => $v) {
|
||||
$values .= sprintf(
|
||||
'%s %s => %s' . "\n",
|
||||
$whitespace,
|
||||
self::recursiveExport($k, $indentation),
|
||||
self::recursiveExport($value[$k], $indentation + 1, $processed)
|
||||
);
|
||||
}
|
||||
|
||||
$values = "\n" . $values . $whitespace;
|
||||
}
|
||||
|
||||
return sprintf('Array &%s (%s)', $key, $values);
|
||||
}
|
||||
|
||||
if (is_object($value)) {
|
||||
$class = get_class($value);
|
||||
|
||||
if ($hash = $processed->contains($value)) {
|
||||
return sprintf('%s:%s Object', $class, $hash);
|
||||
}
|
||||
|
||||
$hash = $processed->add($value);
|
||||
$values = '';
|
||||
$array = self::toArray($value);
|
||||
|
||||
if (count($array) > 0) {
|
||||
foreach ($array as $k => $v) {
|
||||
$values .= sprintf(
|
||||
'%s %s => %s' . "\n",
|
||||
$whitespace,
|
||||
self::recursiveExport($k, $indentation),
|
||||
self::recursiveExport($v, $indentation + 1, $processed)
|
||||
);
|
||||
}
|
||||
|
||||
$values = "\n" . $values . $whitespace;
|
||||
}
|
||||
|
||||
return sprintf('%s:%s Object (%s)', $class, $hash, $values);
|
||||
}
|
||||
|
||||
return var_export($value, true);
|
||||
}
|
||||
}
|
99
vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php
vendored
Normal file
99
vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php
vendored
Normal file
@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Prophecy.
|
||||
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
* Marcello Duarte <marcello.duarte@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Prophecy\Util;
|
||||
|
||||
use Prophecy\Call\Call;
|
||||
|
||||
/**
|
||||
* String utility.
|
||||
*
|
||||
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||
*/
|
||||
class StringUtil
|
||||
{
|
||||
private $verbose;
|
||||
|
||||
/**
|
||||
* @param bool $verbose
|
||||
*/
|
||||
public function __construct($verbose = true)
|
||||
{
|
||||
$this->verbose = $verbose;
|
||||
}
|
||||
|
||||
/**
|
||||
* Stringifies any provided value.
|
||||
*
|
||||
* @param mixed $value
|
||||
* @param boolean $exportObject
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function stringify($value, $exportObject = true)
|
||||
{
|
||||
if (is_array($value)) {
|
||||
if (range(0, count($value) - 1) === array_keys($value)) {
|
||||
return '['.implode(', ', array_map(array($this, __FUNCTION__), $value)).']';
|
||||
}
|
||||
|
||||
$stringify = array($this, __FUNCTION__);
|
||||
|
||||
return '['.implode(', ', array_map(function ($item, $key) use ($stringify) {
|
||||
return (is_integer($key) ? $key : '"'.$key.'"').
|
||||
' => '.call_user_func($stringify, $item);
|
||||
}, $value, array_keys($value))).']';
|
||||
}
|
||||
if (is_resource($value)) {
|
||||
return get_resource_type($value).':'.$value;
|
||||
}
|
||||
if (is_object($value)) {
|
||||
return $exportObject ? ExportUtil::export($value) : sprintf('%s:%s', get_class($value), spl_object_hash($value));
|
||||
}
|
||||
if (true === $value || false === $value) {
|
||||
return $value ? 'true' : 'false';
|
||||
}
|
||||
if (is_string($value)) {
|
||||
$str = sprintf('"%s"', str_replace("\n", '\\n', $value));
|
||||
|
||||
if (!$this->verbose && 50 <= strlen($str)) {
|
||||
return substr($str, 0, 50).'"...';
|
||||
}
|
||||
|
||||
return $str;
|
||||
}
|
||||
if (null === $value) {
|
||||
return 'null';
|
||||
}
|
||||
|
||||
return (string) $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Stringifies provided array of calls.
|
||||
*
|
||||
* @param Call[] $calls Array of Call instances
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function stringifyCalls(array $calls)
|
||||
{
|
||||
$self = $this;
|
||||
|
||||
return implode(PHP_EOL, array_map(function (Call $call) use ($self) {
|
||||
return sprintf(' - %s(%s) @ %s',
|
||||
$call->getMethodName(),
|
||||
implode(', ', array_map(array($self, 'stringify'), $call->getArguments())),
|
||||
str_replace(GETCWD().DIRECTORY_SEPARATOR, '', $call->getCallPlace())
|
||||
);
|
||||
}, $calls));
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user