2015-08-17 17:00:26 -07:00
< ? php
namespace spec\Prophecy\Call ;
use PhpSpec\ObjectBehavior ;
use Prophecy\Prophecy\ObjectProphecy ;
use Prophecy\Argument\ArgumentsWildcard ;
class CallCenterSpec extends ObjectBehavior
{
2015-10-08 11:40:12 -07:00
/**
* @ param \Prophecy\Prophecy\ObjectProphecy $objectProphecy
*/
function let ( $objectProphecy )
2015-08-17 17:00:26 -07:00
{
}
2015-10-08 11:40:12 -07:00
/**
* @ param \Prophecy\Prophecy\ObjectProphecy $objectProphecy
* @ param \Prophecy\Argument\ArgumentsWildcard $wildcard
*/
function it_records_calls_made_through_makeCall_method ( $objectProphecy , $wildcard )
2015-08-17 17:00:26 -07:00
{
$wildcard -> scoreArguments ( array ( 5 , 2 , 3 )) -> willReturn ( 10 );
$objectProphecy -> getMethodProphecies () -> willReturn ( array ());
$this -> makeCall ( $objectProphecy , 'setValues' , array ( 5 , 2 , 3 ));
$calls = $this -> findCalls ( 'setValues' , $wildcard );
$calls -> shouldHaveCount ( 1 );
$calls [ 0 ] -> shouldBeAnInstanceOf ( 'Prophecy\Call\Call' );
$calls [ 0 ] -> getMethodName () -> shouldReturn ( 'setValues' );
$calls [ 0 ] -> getArguments () -> shouldReturn ( array ( 5 , 2 , 3 ));
$calls [ 0 ] -> getReturnValue () -> shouldReturn ( null );
}
function it_returns_null_for_any_call_through_makeCall_if_no_method_prophecies_added (
$objectProphecy
)
{
$objectProphecy -> getMethodProphecies () -> willReturn ( array ());
$this -> makeCall ( $objectProphecy , 'setValues' , array ( 5 , 2 , 3 )) -> shouldReturn ( null );
}
/**
* @ param \Prophecy\Prophecy\MethodProphecy $method1
* @ param \Prophecy\Prophecy\MethodProphecy $method2
* @ param \Prophecy\Prophecy\MethodProphecy $method3
* @ param \Prophecy\Argument\ArgumentsWildcard $arguments1
* @ param \Prophecy\Argument\ArgumentsWildcard $arguments2
* @ param \Prophecy\Argument\ArgumentsWildcard $arguments3
* @ param \Prophecy\Promise\PromiseInterface $promise
*/
function it_executes_promise_of_method_prophecy_that_matches_signature_passed_to_makeCall (
$objectProphecy , $method1 , $method2 , $method3 , $arguments1 , $arguments2 , $arguments3 ,
$promise
)
{
$method1 -> getMethodName () -> willReturn ( 'getName' );
$method1 -> getArgumentsWildcard () -> willReturn ( $arguments1 );
$arguments1 -> scoreArguments ( array ( 'world' , 'everything' )) -> willReturn ( false );
$method2 -> getMethodName () -> willReturn ( 'setTitle' );
$method2 -> getArgumentsWildcard () -> willReturn ( $arguments2 );
$arguments2 -> scoreArguments ( array ( 'world' , 'everything' )) -> willReturn ( false );
$method3 -> getMethodName () -> willReturn ( 'getName' );
$method3 -> getArgumentsWildcard () -> willReturn ( $arguments3 );
$method3 -> getPromise () -> willReturn ( $promise );
$arguments3 -> scoreArguments ( array ( 'world' , 'everything' )) -> willReturn ( 200 );
$objectProphecy -> getMethodProphecies () -> willReturn ( array (
'method1' => array ( $method1 ),
'method2' => array ( $method2 , $method3 )
));
$objectProphecy -> getMethodProphecies ( 'getName' ) -> willReturn ( array ( $method1 , $method3 ));
$objectProphecy -> reveal () -> willReturn ( new \stdClass ());
$promise -> execute ( array ( 'world' , 'everything' ), $objectProphecy -> getWrappedObject (), $method3 ) -> willReturn ( 42 );
$this -> makeCall ( $objectProphecy , 'getName' , array ( 'world' , 'everything' )) -> shouldReturn ( 42 );
$calls = $this -> findCalls ( 'getName' , $arguments3 );
$calls -> shouldHaveCount ( 1 );
$calls [ 0 ] -> getReturnValue () -> shouldReturn ( 42 );
}
/**
* @ param \Prophecy\Prophecy\MethodProphecy $method1
* @ param \Prophecy\Prophecy\MethodProphecy $method2
* @ param \Prophecy\Prophecy\MethodProphecy $method3
* @ param \Prophecy\Argument\ArgumentsWildcard $arguments1
* @ param \Prophecy\Argument\ArgumentsWildcard $arguments2
* @ param \Prophecy\Argument\ArgumentsWildcard $arguments3
* @ param \Prophecy\Promise\PromiseInterface $promise
*/
function it_executes_promise_of_method_prophecy_that_matches_with_highest_score_to_makeCall (
$objectProphecy , $method1 , $method2 , $method3 , $arguments1 , $arguments2 , $arguments3 ,
$promise
)
{
$method1 -> getMethodName () -> willReturn ( 'getName' );
$method1 -> getArgumentsWildcard () -> willReturn ( $arguments1 );
$arguments1 -> scoreArguments ( array ( 'world' , 'everything' )) -> willReturn ( 50 );
$method2 -> getMethodName () -> willReturn ( 'getName' );
$method2 -> getArgumentsWildcard () -> willReturn ( $arguments2 );
$method2 -> getPromise () -> willReturn ( $promise );
$arguments2 -> scoreArguments ( array ( 'world' , 'everything' )) -> willReturn ( 300 );
$method3 -> getMethodName () -> willReturn ( 'getName' );
$method3 -> getArgumentsWildcard () -> willReturn ( $arguments3 );
$arguments3 -> scoreArguments ( array ( 'world' , 'everything' )) -> willReturn ( 200 );
$objectProphecy -> getMethodProphecies () -> willReturn ( array (
'method1' => array ( $method1 ),
'method2' => array ( $method2 , $method3 )
));
$objectProphecy -> getMethodProphecies ( 'getName' ) -> willReturn ( array (
$method1 , $method2 , $method3
));
$objectProphecy -> reveal () -> willReturn ( new \stdClass ());
$promise -> execute ( array ( 'world' , 'everything' ), $objectProphecy -> getWrappedObject (), $method2 )
-> willReturn ( 'second' );
$this -> makeCall ( $objectProphecy , 'getName' , array ( 'world' , 'everything' ))
-> shouldReturn ( 'second' );
}
/**
* @ param \Prophecy\Prophecy\MethodProphecy $method
* @ param \Prophecy\Argument\ArgumentsWildcard $arguments
*/
function it_throws_exception_if_call_does_not_match_any_of_defined_method_prophecies (
$objectProphecy , $method , $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' ));
}
/**
* @ param \Prophecy\Prophecy\MethodProphecy $method
* @ param \Prophecy\Argument\ArgumentsWildcard $arguments
*/
function it_returns_null_if_method_prophecy_that_matches_makeCall_arguments_has_no_promise (
$objectProphecy , $method , $arguments
)
{
$method -> getMethodName () -> willReturn ( 'getName' );
$method -> getArgumentsWildcard () -> willReturn ( $arguments );
$method -> getPromise () -> willReturn ( null );
$arguments -> scoreArguments ( array ( 'world' , 'everything' )) -> willReturn ( 100 );
$objectProphecy -> getMethodProphecies () -> willReturn ( array ( $method ));
$objectProphecy -> getMethodProphecies ( 'getName' ) -> willReturn ( array ( $method ));
$this -> makeCall ( $objectProphecy , 'getName' , array ( 'world' , 'everything' ))
-> shouldReturn ( null );
}
/**
* @ param \Prophecy\Argument\ArgumentsWildcard $wildcard
*/
function it_finds_recorded_calls_by_a_method_name_and_arguments_wildcard (
$objectProphecy , $wildcard
)
{
$objectProphecy -> getMethodProphecies () -> willReturn ( array ());
$this -> makeCall ( $objectProphecy , 'getName' , array ( 'world' ));
$this -> makeCall ( $objectProphecy , 'getName' , array ( 'everything' ));
$this -> makeCall ( $objectProphecy , 'setName' , array ( 42 ));
$wildcard -> scoreArguments ( array ( 'world' )) -> willReturn ( false );
$wildcard -> scoreArguments ( array ( 'everything' )) -> willReturn ( 10 );
$calls = $this -> findCalls ( 'getName' , $wildcard );
$calls -> shouldHaveCount ( 1 );
$calls [ 0 ] -> getMethodName () -> shouldReturn ( 'getName' );
$calls [ 0 ] -> getArguments () -> shouldReturn ( array ( 'everything' ));
}
}