-
Notifications
You must be signed in to change notification settings - Fork 240
/
Copy pathTraversablePatchSpec.php
74 lines (57 loc) · 2.2 KB
/
TraversablePatchSpec.php
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
<?php
namespace spec\Prophecy\Doubler\ClassPatch;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use Prophecy\Doubler\Generator\Node\ClassNode;
use Prophecy\Doubler\Generator\Node\MethodNode;
class TraversablePatchSpec extends ObjectBehavior
{
function it_is_a_patch()
{
$this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
}
function it_supports_class_that_implements_only_Traversable(ClassNode $node)
{
$node->getInterfaces()->willReturn(array('Traversable'));
$this->supports($node)->shouldReturn(true);
}
function it_does_not_support_class_that_implements_Iterator(ClassNode $node)
{
$node->getInterfaces()->willReturn(array('Traversable', 'Iterator'));
$this->supports($node)->shouldReturn(false);
}
function it_does_not_support_class_that_implements_IteratorAggregate(ClassNode $node)
{
$node->getInterfaces()->willReturn(array('Traversable', 'IteratorAggregate'));
$this->supports($node)->shouldReturn(false);
}
function it_has_100_priority()
{
$this->getPriority()->shouldReturn(100);
}
function it_forces_node_to_implement_IteratorAggregate(ClassNode $node)
{
$node->addInterface('Iterator')->shouldBeCalled();
$node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
$this->apply($node);
}
function it_adds_methods_to_implement_iterator(ClassNode $node)
{
$node->addInterface('Iterator')->shouldBeCalled();
$methodReturnTypes = [
'current' => 'mixed',
'key' => 'mixed',
'next' => 'void',
'rewind' => 'void',
'valid' => 'bool',
];
foreach ($methodReturnTypes as $methodName => $returnType) {
$node->addMethod(Argument::that(static function ($value) use ($methodName, $returnType) {
return $value instanceof MethodNode
&& $value->getName() === $methodName
&& (\PHP_VERSION_ID < 80100 || $value->getReturnTypeNode()->getType() === [$returnType]);
}))->shouldBeCalled();
}
$this->apply($node);
}
}