Chris@0: shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface'); Chris@0: } Chris@0: Chris@0: function it_supports_anything(ClassNode $node) Chris@0: { Chris@0: $this->supports($node)->shouldReturn(true); Chris@0: } Chris@0: Chris@0: function it_discovers_api_using_phpdoc(ClassNode $node) Chris@0: { Chris@0: $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApi'); Chris@0: $node->getInterfaces()->willReturn(array()); Chris@0: Chris@0: $node->addMethod(new MethodNode('undefinedMethod'))->shouldBeCalled(); Chris@0: Chris@0: $this->apply($node); Chris@0: } Chris@0: Chris@0: function it_ignores_existing_methods(ClassNode $node) Chris@0: { Chris@0: $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiExtended'); Chris@0: $node->getInterfaces()->willReturn(array()); Chris@0: Chris@0: $node->addMethod(new MethodNode('undefinedMethod'))->shouldBeCalled(); Chris@0: $node->addMethod(new MethodNode('definedMethod'))->shouldNotBeCalled(); Chris@0: Chris@0: $this->apply($node); Chris@0: } Chris@0: Chris@0: function it_ignores_empty_methods_from_phpdoc(ClassNode $node) Chris@0: { Chris@0: $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiInvalidMethodDefinition'); Chris@0: $node->getInterfaces()->willReturn(array()); Chris@0: Chris@0: $node->addMethod(new MethodNode(''))->shouldNotBeCalled(); Chris@0: Chris@0: $this->apply($node); Chris@0: } Chris@0: Chris@0: function it_discovers_api_using_phpdoc_from_implemented_interfaces(ClassNode $node) Chris@0: { Chris@0: $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiImplemented'); Chris@0: $node->getInterfaces()->willReturn(array()); Chris@0: Chris@0: $node->addMethod(new MethodNode('implementedMethod'))->shouldBeCalled(); Chris@0: Chris@0: $this->apply($node); Chris@0: } Chris@0: Chris@0: function it_discovers_api_using_phpdoc_from_own_interfaces(ClassNode $node) Chris@0: { Chris@0: $node->getParentClass()->willReturn('stdClass'); Chris@0: $node->getInterfaces()->willReturn(array('spec\Prophecy\Doubler\ClassPatch\MagicalApiImplemented')); Chris@0: Chris@0: $node->addMethod(new MethodNode('implementedMethod'))->shouldBeCalled(); Chris@0: Chris@0: $this->apply($node); Chris@0: } Chris@0: Chris@0: function it_discovers_api_using_phpdoc_from_extended_parent_interfaces(ClassNode $node) Chris@0: { Chris@0: $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiImplementedExtended'); Chris@0: $node->getInterfaces()->willReturn(array()); Chris@0: Chris@0: $node->addMethod(new MethodNode('implementedMethod'))->shouldBeCalled(); Chris@0: Chris@0: $this->apply($node); Chris@0: } Chris@0: Chris@0: function it_has_50_priority() Chris@0: { Chris@0: $this->getPriority()->shouldReturn(50); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * @method void undefinedMethod() Chris@0: */ Chris@0: class MagicalApi Chris@0: { Chris@0: /** Chris@0: * @return void Chris@0: */ Chris@0: public function definedMethod() Chris@0: { Chris@0: Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * @method void invalidMethodDefinition Chris@0: * @method void Chris@0: * @method Chris@0: */ Chris@0: class MagicalApiInvalidMethodDefinition Chris@0: { Chris@0: } Chris@0: Chris@0: /** Chris@0: * @method void undefinedMethod() Chris@0: * @method void definedMethod() Chris@0: */ Chris@0: class MagicalApiExtended extends MagicalApi Chris@0: { Chris@0: Chris@0: } Chris@0: Chris@0: /** Chris@0: */ Chris@0: class MagicalApiImplemented implements MagicalApiInterface Chris@0: { Chris@0: Chris@0: } Chris@0: Chris@0: /** Chris@0: */ Chris@0: class MagicalApiImplementedExtended extends MagicalApiImplemented Chris@0: { Chris@0: } Chris@0: Chris@0: /** Chris@0: * @method void implementedMethod() Chris@0: */ Chris@0: interface MagicalApiInterface Chris@0: { Chris@0: Chris@0: }