-
Notifications
You must be signed in to change notification settings - Fork 48
/
Copy pathDefinitionEqualsServiceLocatorConstraint.php
102 lines (84 loc) · 3.08 KB
/
DefinitionEqualsServiceLocatorConstraint.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
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
<?php
namespace Matthias\SymfonyDependencyInjectionTest\PhpUnit;
use PHPUnit\Framework\Constraint\Constraint;
use PHPUnit\Framework\Constraint\IsEqual;
use PHPUnit\Util\Exporter;
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ServiceLocator;
final class DefinitionEqualsServiceLocatorConstraint extends Constraint
{
private $expectedValue;
public function __construct($expectedValue)
{
$this->expectedValue = array_map(
function ($serviceId) {
if (is_string($serviceId)) {
return new ServiceClosureArgument(new Reference($serviceId));
}
if (!$serviceId instanceof ServiceClosureArgument) {
return new ServiceClosureArgument($serviceId);
}
return $serviceId;
},
$expectedValue
);
}
public function toString(): string
{
return sprintf('service definition is a service locator');
}
public function evaluate($other, string $description = '', bool $returnResult = false): bool
{
if (!($other instanceof Definition)) {
throw new \InvalidArgumentException(
'Expected an instance of Symfony\Component\DependencyInjection\Definition'
);
}
return $this->evaluateServiceDefinition($other, $returnResult);
}
private function evaluateServiceDefinition(Definition $definition, bool $returnResult): bool
{
if (!$this->evaluateServiceDefinitionClass($definition, $returnResult)) {
return false;
}
return $this->evaluateArgumentIndex($definition, $returnResult);
}
private function evaluateServiceDefinitionClass(Definition $definition, bool $returnResult): bool
{
if (is_a($definition->getClass(), ServiceLocator::class, true)) {
return true;
}
if ($returnResult) {
return false;
}
$this->fail(
$definition,
sprintf(
'class %s was expected as service definition class, found %s instead',
Exporter::export(ServiceLocator::class),
Exporter::export($definition->getClass())
)
);
}
private function evaluateArgumentIndex(Definition $definition, bool $returnResult): bool
{
$actualValue = $definition->getArgument(0);
$constraint = new IsEqual($this->expectedValue);
if (!$constraint->evaluate($actualValue, '', true)) {
if ($returnResult) {
return false;
}
$this->fail(
$definition,
sprintf(
'The service-map %s does not equal to the expected service-map (%s)',
Exporter::export($actualValue),
Exporter::export($this->expectedValue)
)
);
}
return true;
}
}