Pull merge.
[yaffs-website] / vendor / phpspec / prophecy / src / Prophecy / Argument / ArgumentsWildcard.php
1 <?php
2
3 /*
4  * This file is part of the Prophecy.
5  * (c) Konstantin Kudryashov <ever.zet@gmail.com>
6  *     Marcello Duarte <marcello.duarte@gmail.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Prophecy\Argument;
13
14 /**
15  * Arguments wildcarding.
16  *
17  * @author Konstantin Kudryashov <ever.zet@gmail.com>
18  */
19 class ArgumentsWildcard
20 {
21     /**
22      * @var Token\TokenInterface[]
23      */
24     private $tokens = array();
25     private $string;
26
27     /**
28      * Initializes wildcard.
29      *
30      * @param array $arguments Array of argument tokens or values
31      */
32     public function __construct(array $arguments)
33     {
34         foreach ($arguments as $argument) {
35             if (!$argument instanceof Token\TokenInterface) {
36                 $argument = new Token\ExactValueToken($argument);
37             }
38
39             $this->tokens[] = $argument;
40         }
41     }
42
43     /**
44      * Calculates wildcard match score for provided arguments.
45      *
46      * @param array $arguments
47      *
48      * @return false|int False OR integer score (higher - better)
49      */
50     public function scoreArguments(array $arguments)
51     {
52         if (0 == count($arguments) && 0 == count($this->tokens)) {
53             return 1;
54         }
55
56         $arguments  = array_values($arguments);
57         $totalScore = 0;
58         foreach ($this->tokens as $i => $token) {
59             $argument = isset($arguments[$i]) ? $arguments[$i] : null;
60             if (1 >= $score = $token->scoreArgument($argument)) {
61                 return false;
62             }
63
64             $totalScore += $score;
65
66             if (true === $token->isLast()) {
67                 return $totalScore;
68             }
69         }
70
71         if (count($arguments) > count($this->tokens)) {
72             return false;
73         }
74
75         return $totalScore;
76     }
77
78     /**
79      * Returns string representation for wildcard.
80      *
81      * @return string
82      */
83     public function __toString()
84     {
85         if (null === $this->string) {
86             $this->string = implode(', ', array_map(function ($token) {
87                 return (string) $token;
88             }, $this->tokens));
89         }
90
91         return $this->string;
92     }
93
94     /**
95      * @return array
96      */
97     public function getTokens()
98     {
99         return $this->tokens;
100     }
101 }