320 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			320 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace spec\Prophecy\Prophecy;
 | |
| 
 | |
| use PhpSpec\ObjectBehavior;
 | |
| use Prophecy\Argument;
 | |
| 
 | |
| class ObjectProphecySpec extends ObjectBehavior
 | |
| {
 | |
|     /**
 | |
|      * @param \Prophecy\Doubler\LazyDouble                $lazyDouble
 | |
|      * @param \Prophecy\Prophecy\ProphecySubjectInterface $double
 | |
|      */
 | |
|     function let($lazyDouble, $double)
 | |
|     {
 | |
|         $this->beConstructedWith($lazyDouble);
 | |
| 
 | |
|         $lazyDouble->getInstance()->willReturn($double);
 | |
|     }
 | |
| 
 | |
|     function it_implements_ProphecyInterface()
 | |
|     {
 | |
|         $this->shouldBeAnInstanceOf('Prophecy\Prophecy\ProphecyInterface');
 | |
|     }
 | |
| 
 | |
|     function it_sets_parentClass_during_willExtend_call($lazyDouble)
 | |
|     {
 | |
|         $lazyDouble->setParentClass('123')->shouldBeCalled();
 | |
| 
 | |
|         $this->willExtend('123');
 | |
|     }
 | |
| 
 | |
|     function it_adds_interface_during_willImplement_call($lazyDouble)
 | |
|     {
 | |
|         $lazyDouble->addInterface('222')->shouldBeCalled();
 | |
| 
 | |
|         $this->willImplement('222');
 | |
|     }
 | |
| 
 | |
|     function it_sets_constructor_arguments_during_willBeConstructedWith_call($lazyDouble)
 | |
|     {
 | |
|         $lazyDouble->setArguments(array(1, 2, 5))->shouldBeCalled();
 | |
| 
 | |
|         $this->willBeConstructedWith(array(1, 2, 5));
 | |
|     }
 | |
| 
 | |
|     function it_does_not_have_method_prophecies_by_default()
 | |
|     {
 | |
|         $this->getMethodProphecies()->shouldHaveCount(0);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param \Prophecy\Prophecy\MethodProphecy    $method1
 | |
|      * @param \Prophecy\Prophecy\MethodProphecy    $method2
 | |
|      * @param \Prophecy\Argument\ArgumentsWildcard $arguments
 | |
|      */
 | |
|     function it_should_get_method_prophecies_by_method_name($method1, $method2, $arguments)
 | |
|     {
 | |
|         $method1->getMethodName()->willReturn('getName');
 | |
|         $method1->getArgumentsWildcard()->willReturn($arguments);
 | |
|         $method2->getMethodName()->willReturn('setName');
 | |
|         $method2->getArgumentsWildcard()->willReturn($arguments);
 | |
| 
 | |
|         $this->addMethodProphecy($method1);
 | |
|         $this->addMethodProphecy($method2);
 | |
| 
 | |
|         $methods = $this->getMethodProphecies('setName');
 | |
|         $methods->shouldHaveCount(1);
 | |
|         $methods[0]->getMethodName()->shouldReturn('setName');
 | |
|     }
 | |
| 
 | |
|     function it_should_return_empty_array_if_no_method_prophecies_found()
 | |
|     {
 | |
|         $methods = $this->getMethodProphecies('setName');
 | |
|         $methods->shouldHaveCount(0);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param \Prophecy\Call\CallCenter $callCenter
 | |
|      */
 | |
|     function it_should_proxy_makeProphecyMethodCall_to_CallCenter($lazyDouble, $callCenter)
 | |
|     {
 | |
|         $this->beConstructedWith($lazyDouble, $callCenter);
 | |
| 
 | |
|         $callCenter->makeCall($this->getWrappedObject(), 'setName', array('everzet'))->willReturn(42);
 | |
| 
 | |
|         $this->makeProphecyMethodCall('setName', array('everzet'))->shouldReturn(42);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param \Prophecy\Call\CallCenter            $callCenter
 | |
|      * @param \Prophecy\Prophecy\RevealerInterface $revealer
 | |
|      */
 | |
|     function it_should_reveal_arguments_and_return_values_from_callCenter(
 | |
|         $lazyDouble, $callCenter, $revealer
 | |
|     )
 | |
|     {
 | |
|         $this->beConstructedWith($lazyDouble, $callCenter, $revealer);
 | |
| 
 | |
|         $revealer->reveal(array('question'))->willReturn(array('life'));
 | |
|         $revealer->reveal('answer')->willReturn(42);
 | |
| 
 | |
|         $callCenter->makeCall($this->getWrappedObject(), 'setName', array('life'))->willReturn('answer');
 | |
| 
 | |
|         $this->makeProphecyMethodCall('setName', array('question'))->shouldReturn(42);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param \Prophecy\Call\CallCenter            $callCenter
 | |
|      * @param \Prophecy\Argument\ArgumentsWildcard $wildcard
 | |
|      * @param \Prophecy\Call\Call                  $call
 | |
|      */
 | |
|     function it_should_proxy_getProphecyMethodCalls_to_CallCenter(
 | |
|         $lazyDouble, $callCenter, $wildcard, $call
 | |
|     )
 | |
|     {
 | |
|         $this->beConstructedWith($lazyDouble, $callCenter);
 | |
| 
 | |
|         $callCenter->findCalls('setName', $wildcard)->willReturn(array($call));
 | |
| 
 | |
|         $this->findProphecyMethodCalls('setName', $wildcard)->shouldReturn(array($call));
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param \Prophecy\Prophecy\MethodProphecy    $methodProphecy
 | |
|      * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard
 | |
|      */
 | |
|     function its_addMethodProphecy_adds_method_prophecy(
 | |
|         $methodProphecy, $argumentsWildcard
 | |
|     )
 | |
|     {
 | |
|         $methodProphecy->getArgumentsWildcard()->willReturn($argumentsWildcard);
 | |
|         $methodProphecy->getMethodName()->willReturn('getUsername');
 | |
| 
 | |
|         $this->addMethodProphecy($methodProphecy);
 | |
| 
 | |
|         $this->getMethodProphecies()->shouldReturn(array(
 | |
|             'getUsername' => array($methodProphecy)
 | |
|         ));
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param \Prophecy\Prophecy\MethodProphecy    $methodProphecy1
 | |
|      * @param \Prophecy\Prophecy\MethodProphecy    $methodProphecy2
 | |
|      * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard1
 | |
|      * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard2
 | |
|      */
 | |
|     function its_addMethodProphecy_handles_prophecies_with_different_arguments(
 | |
|         $methodProphecy1, $methodProphecy2, $argumentsWildcard1, $argumentsWildcard2
 | |
|     )
 | |
|     {
 | |
|         $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1);
 | |
|         $methodProphecy1->getMethodName()->willReturn('getUsername');
 | |
| 
 | |
|         $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2);
 | |
|         $methodProphecy2->getMethodName()->willReturn('getUsername');
 | |
| 
 | |
|         $this->addMethodProphecy($methodProphecy1);
 | |
|         $this->addMethodProphecy($methodProphecy2);
 | |
| 
 | |
|         $this->getMethodProphecies()->shouldReturn(array(
 | |
|             'getUsername' => array(
 | |
|                 $methodProphecy1,
 | |
|                 $methodProphecy2,
 | |
|             )
 | |
|         ));
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param \Prophecy\Prophecy\MethodProphecy    $methodProphecy1
 | |
|      * @param \Prophecy\Prophecy\MethodProphecy    $methodProphecy2
 | |
|      * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard1
 | |
|      * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard2
 | |
|      */
 | |
|     function its_addMethodProphecy_handles_prophecies_for_different_methods(
 | |
|         $methodProphecy1, $methodProphecy2, $argumentsWildcard1, $argumentsWildcard2
 | |
|     )
 | |
|     {
 | |
|         $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1);
 | |
|         $methodProphecy1->getMethodName()->willReturn('getUsername');
 | |
| 
 | |
|         $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2);
 | |
|         $methodProphecy2->getMethodName()->willReturn('isUsername');
 | |
| 
 | |
|         $this->addMethodProphecy($methodProphecy1);
 | |
|         $this->addMethodProphecy($methodProphecy2);
 | |
| 
 | |
|         $this->getMethodProphecies()->shouldReturn(array(
 | |
|             'getUsername' => array(
 | |
|                 $methodProphecy1
 | |
|             ),
 | |
|             'isUsername' => array(
 | |
|                 $methodProphecy2
 | |
|             )
 | |
|         ));
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy
 | |
|      */
 | |
|     function its_addMethodProphecy_throws_exception_when_method_has_no_ArgumentsWildcard(
 | |
|         $methodProphecy
 | |
|     )
 | |
|     {
 | |
|         $methodProphecy->getArgumentsWildcard()->willReturn(null);
 | |
|         $methodProphecy->getObjectProphecy()->willReturn($this);
 | |
|         $methodProphecy->getMethodName()->willReturn('getTitle');
 | |
| 
 | |
|         $this->shouldThrow('Prophecy\Exception\Prophecy\MethodProphecyException')->duringAddMethodProphecy(
 | |
|             $methodProphecy
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     function it_returns_null_after_checkPredictions_call_if_there_is_no_method_prophecies()
 | |
|     {
 | |
|         $this->checkProphecyMethodsPredictions()->shouldReturn(null);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param \Prophecy\Prophecy\MethodProphecy    $methodProphecy1
 | |
|      * @param \Prophecy\Prophecy\MethodProphecy    $methodProphecy2
 | |
|      * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard1
 | |
|      * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard2
 | |
|      */
 | |
|     function it_throws_AggregateException_during_checkPredictions_if_predictions_fail(
 | |
|         $methodProphecy1, $methodProphecy2, $argumentsWildcard1, $argumentsWildcard2
 | |
|     )
 | |
|     {
 | |
|         $methodProphecy1->getMethodName()->willReturn('getName');
 | |
|         $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1);
 | |
|         $methodProphecy1->checkPrediction()
 | |
|             ->willThrow('Prophecy\Exception\Prediction\AggregateException');
 | |
| 
 | |
|         $methodProphecy2->getMethodName()->willReturn('setName');
 | |
|         $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2);
 | |
|         $methodProphecy2->checkPrediction()
 | |
|             ->willThrow('Prophecy\Exception\Prediction\AggregateException');
 | |
| 
 | |
|         $this->addMethodProphecy($methodProphecy1);
 | |
|         $this->addMethodProphecy($methodProphecy2);
 | |
| 
 | |
|         $this->shouldThrow('Prophecy\Exception\Prediction\AggregateException')
 | |
|             ->duringCheckProphecyMethodsPredictions();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param \Prophecy\Doubler\Doubler                   $doubler
 | |
|      * @param \Prophecy\Prophecy\ProphecySubjectInterface $reflection
 | |
|      */
 | |
|     function it_returns_new_MethodProphecy_instance_for_arbitrary_call($doubler, $reflection)
 | |
|     {
 | |
|         $doubler->double(Argument::any())->willReturn($reflection);
 | |
| 
 | |
|         $return = $this->getProphecy();
 | |
|         $return->shouldBeAnInstanceOf('Prophecy\Prophecy\MethodProphecy');
 | |
|         $return->getMethodName()->shouldReturn('getProphecy');
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param \Prophecy\Doubler\Doubler                   $doubler
 | |
|      * @param \Prophecy\Prophecy\ProphecySubjectInterface $reflection
 | |
|      */
 | |
|     function it_returns_same_MethodProphecy_for_same_registered_signature($doubler, $reflection)
 | |
|     {
 | |
|         $doubler->double(Argument::any())->willReturn($reflection);
 | |
| 
 | |
|         $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(1, 2, 3));
 | |
|         $methodProphecy2 = $this->getProphecy(1, 2, 3);
 | |
| 
 | |
|         $methodProphecy2->shouldBe($methodProphecy1);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param \Prophecy\Doubler\Doubler                   $doubler
 | |
|      * @param \Prophecy\Prophecy\ProphecySubjectInterface $reflection
 | |
|      */
 | |
|     function it_returns_new_MethodProphecy_for_different_signatures($doubler, $reflection)
 | |
|     {
 | |
|         $doubler->double(Argument::any())->willReturn($reflection);
 | |
| 
 | |
|         $value = new ObjectProphecySpecFixtureB('ABC');
 | |
|         $value2 = new ObjectProphecySpecFixtureB('CBA');
 | |
| 
 | |
|         $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(1, 2, 3, $value));
 | |
|         $methodProphecy2 = $this->getProphecy(1, 2, 3, $value2);
 | |
| 
 | |
|         $methodProphecy2->shouldNotBe($methodProphecy1);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param \Prophecy\Doubler\Doubler                   $doubler
 | |
|      * @param \Prophecy\Prophecy\ProphecySubjectInterface $reflection
 | |
|      */
 | |
|     function it_returns_new_MethodProphecy_for_all_callback_signatures($doubler, $reflection)
 | |
|     {
 | |
|         $doubler->double(Argument::any())->willReturn($reflection);
 | |
| 
 | |
|         $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(function(){}));
 | |
|         $methodProphecy2 = $this->getProphecy(function(){});
 | |
| 
 | |
|         $methodProphecy2->shouldNotBe($methodProphecy1);
 | |
|     }
 | |
| }
 | |
| 
 | |
| class ObjectProphecySpecFixtureA
 | |
| {
 | |
| 	public $errors;
 | |
| }
 | |
| 
 | |
| class ObjectProphecySpecFixtureB extends ObjectProphecySpecFixtureA
 | |
| {
 | |
|     public $errors;
 | |
|     public $value = null;
 | |
| 
 | |
|     public function __construct($value)
 | |
|     {
 | |
|         $this->value = $value;
 | |
|     }
 | |
| }
 | 
