Chris@14
|
1 <?php
|
Chris@14
|
2 /*
|
Chris@14
|
3 * This file is part of the phpunit-mock-objects package.
|
Chris@14
|
4 *
|
Chris@14
|
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
|
Chris@14
|
6 *
|
Chris@14
|
7 * For the full copyright and license information, please view the LICENSE
|
Chris@14
|
8 * file that was distributed with this source code.
|
Chris@14
|
9 */
|
Chris@14
|
10 namespace PHPUnit\Framework\MockObject\Matcher;
|
Chris@14
|
11
|
Chris@14
|
12 use PHPUnit\Framework\Constraint\Constraint;
|
Chris@14
|
13 use PHPUnit\Framework\Constraint\IsEqual;
|
Chris@14
|
14 use PHPUnit\Framework\ExpectationFailedException;
|
Chris@14
|
15 use PHPUnit\Framework\MockObject\Invocation as BaseInvocation;
|
Chris@14
|
16
|
Chris@14
|
17 /**
|
Chris@14
|
18 * Invocation matcher which looks for sets of specific parameters in the invocations.
|
Chris@14
|
19 *
|
Chris@14
|
20 * Checks the parameters of the incoming invocations, the parameter list is
|
Chris@14
|
21 * checked against the defined constraints in $parameters. If the constraint
|
Chris@14
|
22 * is met it will return true in matches().
|
Chris@14
|
23 *
|
Chris@14
|
24 * It takes a list of match groups and and increases a call index after each invocation.
|
Chris@14
|
25 * So the first invocation uses the first group of constraints, the second the next and so on.
|
Chris@14
|
26 */
|
Chris@14
|
27 class ConsecutiveParameters extends StatelessInvocation
|
Chris@14
|
28 {
|
Chris@14
|
29 /**
|
Chris@14
|
30 * @var array
|
Chris@14
|
31 */
|
Chris@14
|
32 private $parameterGroups = [];
|
Chris@14
|
33
|
Chris@14
|
34 /**
|
Chris@14
|
35 * @var array
|
Chris@14
|
36 */
|
Chris@14
|
37 private $invocations = [];
|
Chris@14
|
38
|
Chris@14
|
39 /**
|
Chris@14
|
40 * @param array $parameterGroups
|
Chris@14
|
41 *
|
Chris@14
|
42 * @throws \PHPUnit\Framework\Exception
|
Chris@14
|
43 */
|
Chris@14
|
44 public function __construct(array $parameterGroups)
|
Chris@14
|
45 {
|
Chris@14
|
46 foreach ($parameterGroups as $index => $parameters) {
|
Chris@14
|
47 foreach ($parameters as $parameter) {
|
Chris@14
|
48 if (!$parameter instanceof Constraint) {
|
Chris@14
|
49 $parameter = new IsEqual($parameter);
|
Chris@14
|
50 }
|
Chris@14
|
51
|
Chris@14
|
52 $this->parameterGroups[$index][] = $parameter;
|
Chris@14
|
53 }
|
Chris@14
|
54 }
|
Chris@14
|
55 }
|
Chris@14
|
56
|
Chris@14
|
57 /**
|
Chris@14
|
58 * @return string
|
Chris@14
|
59 */
|
Chris@14
|
60 public function toString()
|
Chris@14
|
61 {
|
Chris@14
|
62 return 'with consecutive parameters';
|
Chris@14
|
63 }
|
Chris@14
|
64
|
Chris@14
|
65 /**
|
Chris@14
|
66 * @param BaseInvocation $invocation
|
Chris@14
|
67 *
|
Chris@14
|
68 * @return bool
|
Chris@14
|
69 *
|
Chris@14
|
70 * @throws \PHPUnit\Framework\ExpectationFailedException
|
Chris@14
|
71 */
|
Chris@14
|
72 public function matches(BaseInvocation $invocation)
|
Chris@14
|
73 {
|
Chris@14
|
74 $this->invocations[] = $invocation;
|
Chris@14
|
75 $callIndex = \count($this->invocations) - 1;
|
Chris@14
|
76
|
Chris@14
|
77 $this->verifyInvocation($invocation, $callIndex);
|
Chris@14
|
78
|
Chris@14
|
79 return false;
|
Chris@14
|
80 }
|
Chris@14
|
81
|
Chris@14
|
82 public function verify()
|
Chris@14
|
83 {
|
Chris@14
|
84 foreach ($this->invocations as $callIndex => $invocation) {
|
Chris@14
|
85 $this->verifyInvocation($invocation, $callIndex);
|
Chris@14
|
86 }
|
Chris@14
|
87 }
|
Chris@14
|
88
|
Chris@14
|
89 /**
|
Chris@14
|
90 * Verify a single invocation
|
Chris@14
|
91 *
|
Chris@14
|
92 * @param BaseInvocation $invocation
|
Chris@14
|
93 * @param int $callIndex
|
Chris@14
|
94 *
|
Chris@14
|
95 * @throws ExpectationFailedException
|
Chris@14
|
96 */
|
Chris@14
|
97 private function verifyInvocation(BaseInvocation $invocation, $callIndex)
|
Chris@14
|
98 {
|
Chris@14
|
99 if (isset($this->parameterGroups[$callIndex])) {
|
Chris@14
|
100 $parameters = $this->parameterGroups[$callIndex];
|
Chris@14
|
101 } else {
|
Chris@14
|
102 // no parameter assertion for this call index
|
Chris@14
|
103 return;
|
Chris@14
|
104 }
|
Chris@14
|
105
|
Chris@14
|
106 if ($invocation === null) {
|
Chris@14
|
107 throw new ExpectationFailedException(
|
Chris@14
|
108 'Mocked method does not exist.'
|
Chris@14
|
109 );
|
Chris@14
|
110 }
|
Chris@14
|
111
|
Chris@14
|
112 if (\count($invocation->getParameters()) < \count($parameters)) {
|
Chris@14
|
113 throw new ExpectationFailedException(
|
Chris@14
|
114 \sprintf(
|
Chris@14
|
115 'Parameter count for invocation %s is too low.',
|
Chris@14
|
116 $invocation->toString()
|
Chris@14
|
117 )
|
Chris@14
|
118 );
|
Chris@14
|
119 }
|
Chris@14
|
120
|
Chris@14
|
121 foreach ($parameters as $i => $parameter) {
|
Chris@14
|
122 $parameter->evaluate(
|
Chris@14
|
123 $invocation->getParameters()[$i],
|
Chris@14
|
124 \sprintf(
|
Chris@14
|
125 'Parameter %s for invocation #%d %s does not match expected ' .
|
Chris@14
|
126 'value.',
|
Chris@14
|
127 $i,
|
Chris@14
|
128 $callIndex,
|
Chris@14
|
129 $invocation->toString()
|
Chris@14
|
130 )
|
Chris@14
|
131 );
|
Chris@14
|
132 }
|
Chris@14
|
133 }
|
Chris@14
|
134 }
|