text: <?php
  
  namespace spec\Prophecy\Doubler\ClassPatch;
  
  use PhpSpec\ObjectBehavior;
  use Prophecy\Argument;
  use Prophecy\Doubler\Generator\Node\ArgumentNode;
  use Prophecy\Doubler\Generator\Node\ClassNode;
  use Prophecy\Doubler\Generator\Node\MethodNode;
  
  class DisableConstructorPatchSpec extends ObjectBehavior
  {
      function it_is_a_patch()
      {
          $this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
      }
  
      function its_priority_is_100()
      {
          $this->getPriority()->shouldReturn(100);
      }
  
      function it_supports_anything(ClassNode $node)
      {
          $this->supports($node)->shouldReturn(true);
      }
  
      function it_makes_all_constructor_arguments_optional(
          ClassNode $class,
          MethodNode $method,
          ArgumentNode $arg1,
          ArgumentNode $arg2
      ) {
          $class->hasMethod('__construct')->willReturn(true);
          $class->getMethod('__construct')->willReturn($method);
          $method->getArguments()->willReturn(array($arg1, $arg2));
  
          $arg1->setDefault(null)->shouldBeCalled();
          $arg2->setDefault(null)->shouldBeCalled();
  
          $method->setCode(Argument::type('string'))->shouldBeCalled();
  
          $this->apply($class);
      }
  
      function it_creates_new_constructor_if_object_has_none(ClassNode $class)
      {
          $class->hasMethod('__construct')->willReturn(false);
          $class->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))
              ->shouldBeCalled();
  
          $this->apply($class);
      }
  }
  