Skip to content
39 changes: 17 additions & 22 deletions spec/Prophecy/Call/CallCenterSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
namespace spec\Prophecy\Call;

use PhpSpec\ObjectBehavior;
use Prophecy\Exception\Call\UnexpectedCallException;
use Prophecy\Promise\PromiseInterface;
use Prophecy\Prophecy\MethodProphecy;
use Prophecy\Prophecy\ObjectProphecy;
Expand Down Expand Up @@ -121,6 +120,23 @@ function it_executes_promise_of_method_prophecy_that_matches_with_highest_score_
->shouldReturn('second');
}

function it_throws_exception_if_call_does_not_match_any_of_defined_method_prophecies(
$objectProphecy,
MethodProphecy $method,
ArgumentsWildcard $arguments
) {
$method->getMethodName()->willReturn('getName');
$method->getArgumentsWildcard()->willReturn($arguments);
$arguments->scoreArguments(array('world', 'everything'))->willReturn(false);
$arguments->__toString()->willReturn('arg1, arg2');

$objectProphecy->getMethodProphecies()->willReturn(array('method1' => array($method)));
$objectProphecy->getMethodProphecies('getName')->willReturn(array($method));

$this->shouldThrow('Prophecy\Exception\Call\UnexpectedCallException')
->duringMakeCall($objectProphecy, 'getName', array('world', 'everything'));
}

function it_returns_null_if_method_prophecy_that_matches_makeCall_arguments_has_no_promise(
$objectProphecy,
MethodProphecy $method,
Expand Down Expand Up @@ -158,25 +174,4 @@ function it_finds_recorded_calls_by_a_method_name_and_arguments_wildcard(
$calls[0]->getMethodName()->shouldReturn('getName');
$calls[0]->getArguments()->shouldReturn(array('everything'));
}

function it_records_the_error_when_stub_has_got_unexpected_method_calls(
$objectProphecy,
MethodProphecy $method,
ArgumentsWildcard $arguments
) {
$method->getMethodName()->willReturn('getName');
$method->getArgumentsWildcard()->willReturn($arguments);

$arguments->getTokens()->willReturn(array());

$objectProphecy->getMethodProphecies()->willReturn(array('getName' => array($method)));
$objectProphecy->getMethodProphecies('getName')->willReturn(array($method));
$objectProphecy->getMethodProphecies('method1')->willReturn(array());
$objectProphecy->reveal()->willReturn(new \stdClass());

$this->shouldNotThrow('Prophecy\Exception\Call\UnexpectedCallException')
->duringMakeCall($objectProphecy, 'method1', array());

$this->shouldThrow('Prophecy\Exception\Call\UnexpectedCallException')->duringCheckUnexpectedCalls();
}
}
1 change: 0 additions & 1 deletion spec/Prophecy/Prophecy/MethodProphecySpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,6 @@ function it_checks_prediction_via_shouldHave_method_call_with_callback(
Call $call1,
Call $call2
) {
$objectProphecy->addMethodProphecy($this)->willReturn(null);
$callback = function ($calls, $object, $method) {
throw new RuntimeException();
};
Expand Down
11 changes: 0 additions & 11 deletions spec/Prophecy/Prophecy/ObjectProphecySpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -276,17 +276,6 @@ function it_returns_new_MethodProphecy_for_all_callback_signatures(

$methodProphecy2->shouldNotBe($methodProphecy1);
}

function it_throws_UnexpectedCallException_during_checkPredictions_if_unexpected_method_was_called(
$lazyDouble, CallCenter $callCenter
) {
$this->beConstructedWith($lazyDouble, $callCenter);

$callCenter->checkUnexpectedCalls()->willThrow('Prophecy\Exception\Call\UnexpectedCallException');

$this->shouldThrow('Prophecy\Exception\Call\UnexpectedCallException')
->duringCheckProphecyMethodsPredictions();
}
}

class ObjectProphecySpecFixtureA
Expand Down
56 changes: 7 additions & 49 deletions src/Prophecy/Call/CallCenter.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
use Prophecy\Argument\ArgumentsWildcard;
use Prophecy\Util\StringUtil;
use Prophecy\Exception\Call\UnexpectedCallException;
use SplObjectStorage;

/**
* Calls receiver & manager.
Expand All @@ -33,11 +32,6 @@ class CallCenter
*/
private $recordedCalls = array();

/**
* @var SplObjectStorage<Call, ObjectProphecy<object>>
*/
private $unexpectedCalls;

/**
* Initializes call center.
*
Expand All @@ -46,7 +40,6 @@ class CallCenter
public function __construct(?StringUtil $util = null)
{
$this->util = $util ?: new StringUtil();
$this->unexpectedCalls = new SplObjectStorage();
}

/**
Expand Down Expand Up @@ -80,14 +73,16 @@ public function makeCall(ObjectProphecy $prophecy, $methodName, array $arguments
}

// There are method prophecies, so it's a fake/stub. Searching prophecy for this call
$matches = $this->findMethodProphecies($prophecy, $methodName, $arguments);
$matches = array();
foreach ($prophecy->getMethodProphecies($methodName) as $methodProphecy) {
if (0 < $score = $methodProphecy->getArgumentsWildcard()->scoreArguments($arguments)) {
$matches[] = array($score, $methodProphecy);
}
}

// If fake/stub doesn't have method prophecy for this call - throw exception
if (!count($matches)) {
$this->unexpectedCalls->offsetSet(new Call($methodName, $arguments, null, null, $file, $line), $prophecy);
$this->recordedCalls[] = new Call($methodName, $arguments, null, null, $file, $line);

return null;
throw $this->createUnexpectedCallException($prophecy, $methodName, $arguments);
}

// Sort matches by their score value
Expand Down Expand Up @@ -146,22 +141,6 @@ public function findCalls($methodName, ArgumentsWildcard $wildcard)
);
}

/**
* @return void
* @throws UnexpectedCallException
*/
public function checkUnexpectedCalls()
{
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());
}
}
}

/**
* @param ObjectProphecy<object> $prophecy
* @param string $methodName
Expand Down Expand Up @@ -232,25 +211,4 @@ function () use ($indentationLength) {
$arguments
);
}

/**
* @param ObjectProphecy<object> $prophecy
* @param string $methodName
* @param array<mixed> $arguments
*
* @return array
*
* @phpstan-return list<array{int, MethodProphecy}>
*/
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;
}
}
3 changes: 0 additions & 3 deletions src/Prophecy/Prophecy/ObjectProphecy.php
Original file line number Diff line number Diff line change
Expand Up @@ -214,15 +214,12 @@ public function findProphecyMethodCalls($methodName, ArgumentsWildcard $wildcard
* @return void
*
* @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 {
Expand Down
Loading