Chris@0
|
1 <?php
|
Chris@0
|
2 /*
|
Chris@0
|
3 * This file is part of the GlobalState package.
|
Chris@0
|
4 *
|
Chris@0
|
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
|
Chris@0
|
6 *
|
Chris@0
|
7 * For the full copyright and license information, please view the LICENSE
|
Chris@0
|
8 * file that was distributed with this source code.
|
Chris@0
|
9 */
|
Chris@0
|
10
|
Chris@0
|
11 namespace SebastianBergmann\GlobalState;
|
Chris@0
|
12
|
Chris@0
|
13 use ReflectionClass;
|
Chris@0
|
14
|
Chris@0
|
15 /**
|
Chris@0
|
16 * A blacklist for global state elements that should not be snapshotted.
|
Chris@0
|
17 */
|
Chris@0
|
18 class Blacklist
|
Chris@0
|
19 {
|
Chris@0
|
20 /**
|
Chris@0
|
21 * @var array
|
Chris@0
|
22 */
|
Chris@0
|
23 private $globalVariables = array();
|
Chris@0
|
24
|
Chris@0
|
25 /**
|
Chris@0
|
26 * @var array
|
Chris@0
|
27 */
|
Chris@0
|
28 private $classes = array();
|
Chris@0
|
29
|
Chris@0
|
30 /**
|
Chris@0
|
31 * @var array
|
Chris@0
|
32 */
|
Chris@0
|
33 private $classNamePrefixes = array();
|
Chris@0
|
34
|
Chris@0
|
35 /**
|
Chris@0
|
36 * @var array
|
Chris@0
|
37 */
|
Chris@0
|
38 private $parentClasses = array();
|
Chris@0
|
39
|
Chris@0
|
40 /**
|
Chris@0
|
41 * @var array
|
Chris@0
|
42 */
|
Chris@0
|
43 private $interfaces = array();
|
Chris@0
|
44
|
Chris@0
|
45 /**
|
Chris@0
|
46 * @var array
|
Chris@0
|
47 */
|
Chris@0
|
48 private $staticAttributes = array();
|
Chris@0
|
49
|
Chris@0
|
50 /**
|
Chris@0
|
51 * @param string $variableName
|
Chris@0
|
52 */
|
Chris@0
|
53 public function addGlobalVariable($variableName)
|
Chris@0
|
54 {
|
Chris@0
|
55 $this->globalVariables[$variableName] = true;
|
Chris@0
|
56 }
|
Chris@0
|
57
|
Chris@0
|
58 /**
|
Chris@0
|
59 * @param string $className
|
Chris@0
|
60 */
|
Chris@0
|
61 public function addClass($className)
|
Chris@0
|
62 {
|
Chris@0
|
63 $this->classes[] = $className;
|
Chris@0
|
64 }
|
Chris@0
|
65
|
Chris@0
|
66 /**
|
Chris@0
|
67 * @param string $className
|
Chris@0
|
68 */
|
Chris@0
|
69 public function addSubclassesOf($className)
|
Chris@0
|
70 {
|
Chris@0
|
71 $this->parentClasses[] = $className;
|
Chris@0
|
72 }
|
Chris@0
|
73
|
Chris@0
|
74 /**
|
Chris@0
|
75 * @param string $interfaceName
|
Chris@0
|
76 */
|
Chris@0
|
77 public function addImplementorsOf($interfaceName)
|
Chris@0
|
78 {
|
Chris@0
|
79 $this->interfaces[] = $interfaceName;
|
Chris@0
|
80 }
|
Chris@0
|
81
|
Chris@0
|
82 /**
|
Chris@0
|
83 * @param string $classNamePrefix
|
Chris@0
|
84 */
|
Chris@0
|
85 public function addClassNamePrefix($classNamePrefix)
|
Chris@0
|
86 {
|
Chris@0
|
87 $this->classNamePrefixes[] = $classNamePrefix;
|
Chris@0
|
88 }
|
Chris@0
|
89
|
Chris@0
|
90 /**
|
Chris@0
|
91 * @param string $className
|
Chris@0
|
92 * @param string $attributeName
|
Chris@0
|
93 */
|
Chris@0
|
94 public function addStaticAttribute($className, $attributeName)
|
Chris@0
|
95 {
|
Chris@0
|
96 if (!isset($this->staticAttributes[$className])) {
|
Chris@0
|
97 $this->staticAttributes[$className] = array();
|
Chris@0
|
98 }
|
Chris@0
|
99
|
Chris@0
|
100 $this->staticAttributes[$className][$attributeName] = true;
|
Chris@0
|
101 }
|
Chris@0
|
102
|
Chris@0
|
103 /**
|
Chris@0
|
104 * @param string $variableName
|
Chris@0
|
105 * @return bool
|
Chris@0
|
106 */
|
Chris@0
|
107 public function isGlobalVariableBlacklisted($variableName)
|
Chris@0
|
108 {
|
Chris@0
|
109 return isset($this->globalVariables[$variableName]);
|
Chris@0
|
110 }
|
Chris@0
|
111
|
Chris@0
|
112 /**
|
Chris@0
|
113 * @param string $className
|
Chris@0
|
114 * @param string $attributeName
|
Chris@0
|
115 * @return bool
|
Chris@0
|
116 */
|
Chris@0
|
117 public function isStaticAttributeBlacklisted($className, $attributeName)
|
Chris@0
|
118 {
|
Chris@0
|
119 if (in_array($className, $this->classes)) {
|
Chris@0
|
120 return true;
|
Chris@0
|
121 }
|
Chris@0
|
122
|
Chris@0
|
123 foreach ($this->classNamePrefixes as $prefix) {
|
Chris@0
|
124 if (strpos($className, $prefix) === 0) {
|
Chris@0
|
125 return true;
|
Chris@0
|
126 }
|
Chris@0
|
127 }
|
Chris@0
|
128
|
Chris@0
|
129 $class = new ReflectionClass($className);
|
Chris@0
|
130
|
Chris@0
|
131 foreach ($this->parentClasses as $type) {
|
Chris@0
|
132 if ($class->isSubclassOf($type)) {
|
Chris@0
|
133 return true;
|
Chris@0
|
134 }
|
Chris@0
|
135 }
|
Chris@0
|
136
|
Chris@0
|
137 foreach ($this->interfaces as $type) {
|
Chris@0
|
138 if ($class->implementsInterface($type)) {
|
Chris@0
|
139 return true;
|
Chris@0
|
140 }
|
Chris@0
|
141 }
|
Chris@0
|
142
|
Chris@0
|
143 if (isset($this->staticAttributes[$className][$attributeName])) {
|
Chris@0
|
144 return true;
|
Chris@0
|
145 }
|
Chris@0
|
146
|
Chris@0
|
147 return false;
|
Chris@0
|
148 }
|
Chris@0
|
149 }
|