1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?php
namespace spec\Prophecy\Doubler;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
class DoublerSpec extends ObjectBehavior
{
/**
* @param \Prophecy\Doubler\Generator\ClassMirror $mirror
* @param \Prophecy\Doubler\Generator\ClassCreator $creator
* @param \Prophecy\Doubler\NameGenerator $namer
*/
function let($mirror, $creator, $namer)
{
$this->beConstructedWith($mirror, $creator, $namer);
}
function it_does_not_have_patches_by_default()
{
$this->getClassPatches()->shouldHaveCount(0);
}
/**
* @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $patch
*/
function its_registerClassPatch_adds_a_patch_to_the_doubler($patch)
{
$this->registerClassPatch($patch);
$this->getClassPatches()->shouldReturn(array($patch));
}
/**
* @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt1
* @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt2
* @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt3
* @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt4
*/
function its_getClassPatches_sorts_patches_by_priority($alt1, $alt2, $alt3, $alt4)
{
$alt1->getPriority()->willReturn(2);
$alt2->getPriority()->willReturn(50);
$alt3->getPriority()->willReturn(10);
$alt4->getPriority()->willReturn(0);
$this->registerClassPatch($alt1);
$this->registerClassPatch($alt2);
$this->registerClassPatch($alt3);
$this->registerClassPatch($alt4);
$this->getClassPatches()->shouldReturn(array($alt2, $alt3, $alt1, $alt4));
}
/**
* @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt1
* @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt2
* @param \ReflectionClass $class
* @param \ReflectionClass $interface1
* @param \ReflectionClass $interface2
* @param \Prophecy\Doubler\Generator\Node\ClassNode $node
*/
function its_double_mirrors_alterates_and_instantiates_provided_class(
$mirror, $creator, $namer, $alt1, $alt2, $class, $interface1, $interface2, $node
)
{
$mirror->reflect($class, array($interface1, $interface2))->willReturn($node);
$alt1->supports($node)->willReturn(true);
$alt2->supports($node)->willReturn(false);
$alt1->getPriority()->willReturn(1);
$alt2->getPriority()->willReturn(2);
$namer->name($class, array($interface1, $interface2))->willReturn('SplStack');
$class->getName()->willReturn('stdClass');
$interface1->getName()->willReturn('ArrayAccess');
$interface2->getName()->willReturn('Iterator');
$alt1->apply($node)->shouldBeCalled();
$alt2->apply($node)->shouldNotBeCalled();
$creator->create('SplStack', $node)->shouldBeCalled();
$this->registerClassPatch($alt1);
$this->registerClassPatch($alt2);
$this->double($class, array($interface1, $interface2))
->shouldReturnAnInstanceOf('SplStack');
}
/**
* @param \ReflectionClass $class
* @param \Prophecy\Doubler\Generator\Node\ClassNode $node
*/
function it_double_instantiates_a_class_with_constructor_argument($mirror, $class, $node, $namer)
{
$class->getName()->willReturn('ReflectionClass');
$mirror->reflect($class, array())->willReturn($node);
$namer->name($class, array())->willReturn('ReflectionClass');
$double = $this->double($class, array(), array('stdClass'));
$double->shouldBeAnInstanceOf('ReflectionClass');
$double->getName()->shouldReturn('stdClass');
}
/**
* @param \ReflectionClass $class
* @param \Prophecy\Doubler\Generator\Node\ClassNode $node
*/
function it_can_instantiate_class_with_final_constructor($mirror, $class, $node, $namer)
{
$class->getName()->willReturn('spec\Prophecy\Doubler\WithFinalConstructor');
$mirror->reflect($class, array())->willReturn($node);
$namer->name($class, array())->willReturn('spec\Prophecy\Doubler\WithFinalConstructor');
$double = $this->double($class, array());
$double->shouldBeAnInstanceOf('spec\Prophecy\Doubler\WithFinalConstructor');
}
}
class WithFinalConstructor
{
final public function __construct() {}
}