mageekguy\atoum\asserters\phpClass: lines coverage

94% of 657

OPs

93% of 106

Lines

70% of 97

Branches

69% of 39

Paths
Method OPs OPs % Lines Line % Branches Branches % Paths Path %
mageekguy\atoum\asserters\phpClass::__get() 43 60% 8 63% 12 58% 4 75%
mageekguy\atoum\asserters\phpClass::__call() 56 66% 8 63% 9 33% 3 67%
mageekguy\atoum\asserters\phpClass::__toString() 10 100% 1 100% 1 100% 1 100%
mageekguy\atoum\asserters\phpClass::getReflectionClass() 43 98% 12 100% 7 86% 3 100%
mageekguy\atoum\asserters\phpClass::setReflectionClassInjector() 34 97% 7 100% 4 75% 2 100%
mageekguy\atoum\asserters\phpClass::getClass() 18 100% 1 100% 5 100% 2 100%
mageekguy\atoum\asserters\phpClass::setWith() 41 100% 7 100% 5 60% 2 50%
mageekguy\atoum\asserters\phpClass::hasParent() 60 100% 7 100% 8 75% 4 25%
mageekguy\atoum\asserters\phpClass::hasNoParent() 41 100% 7 100% 5 80% 2 50%
mageekguy\atoum\asserters\phpClass::isSubClassOf() 58 100% 10 100% 9 67% 3 67%
mageekguy\atoum\asserters\phpClass::hasInterface() 58 100% 10 100% 9 67% 3 67%
mageekguy\atoum\asserters\phpClass::isAbstract() 39 100% 6 100% 5 80% 2 50%
mageekguy\atoum\asserters\phpClass::isFinal() 39 100% 6 100% 5 80% 2 50%
mageekguy\atoum\asserters\phpClass::hasMethod() 42 100% 6 100% 5 80% 2 50%
mageekguy\atoum\asserters\phpClass::hasConstant() 56 98% 6 83% 4 75% 2 100%
mageekguy\atoum\asserters\phpClass::classIsSet() 19 95% 4 100% 4 75% 2 100%
#
1
<?php
2

                    
3
namespace mageekguy\atoum\asserters;
4

                    
5
use
6
	mageekguy\atoum,
7
	mageekguy\atoum\exceptions
8
;
9

                    
10
class phpClass extends atoum\asserter
11
{
12
	protected $class = null;
13
	protected $reflectionClassInjector = null;
14

                    
15
	public function __get($property)63%
16
	{
17
		switch (strtolower($property))
18
		{
19
			case 'isabstract':
20
			case 'isfinal':
21
			case 'hasnoparent':
22
				return $this->{$property}();
23

                    
24
			default:
25
				return parent::__get($property);
26
		}
27
	}
28

                    
29
	public function __call($method, $arguments)63%
30
	{
31
		switch (strtolower($method))
32
		{
33
			case 'extends':
34
				return call_user_func_array(array($this, 'isSubClassOf'), $arguments);
35

                    
36
			case 'implements':
37
				return call_user_func_array(array($this, 'hasInterface'), $arguments);
38

                    
39
			default:
40
				return parent::__call($method, $arguments);
41
		}
42
	}
43

                    
44
	public function __toString()100%
45
	{
46
		return (string) $this->getClass();
47
	}
48

                    
49
	public function getReflectionClass($class)100%
50
	{
51
		if ($this->reflectionClassInjector === null)
52
		{
53
			$reflectionClass = new \reflectionClass($class);
54
		}
55
		else
56
		{
57
			$reflectionClass = $this->reflectionClassInjector->__invoke($class);
58

                    
59
			if ($reflectionClass instanceof \reflectionClass === false)
60
			{
61
				throw new exceptions\runtime\unexpectedValue('Reflection class injector must return a \reflectionClass instance');
62
			}
63
		}
64

                    
65
		return $reflectionClass;
66
	}
67

                    
68
	public function setReflectionClassInjector(\closure $reflectionClassInjector)100%
69
	{
70
		$closure = new \reflectionMethod($reflectionClassInjector, '__invoke');
71

                    
72
		if ($closure->getNumberOfParameters() != 1)
73
		{
74
			throw new exceptions\logic\invalidArgument('Reflection class injector must take one argument');
75
		}
76

                    
77
		$this->reflectionClassInjector = $reflectionClassInjector;
78

                    
79
		return $this;
80
	}
81

                    
82
	public function getClass()100%
83
	{
84
		return ($this->class === null ? null : $this->class->getName());
85
	}
86

                    
87
	public function setWith($class)100%
88
	{
89
		parent::setWith($class);
90

                    
91
		try
92
		{
93
			$this->class = $this->getReflectionClass($class);
94
		}
95
		catch (\exception $exception)
96
		{
97
			$this->fail($this->_('Class \'%s\' does not exist', $class));
98
		}
99

                    
100
		$this->pass();
101

                    
102
		return $this;
103
	}
104

                    
105
	public function hasParent($parent, $failMessage = null)100%
106
	{
107
		$parentClass = $this->classIsSet()->class->getParentClass();
108

                    
109
		if ($parentClass !== false && strtolower($parentClass->getName()) == strtolower($parent))
110
		{
111
			$this->pass();
112
		}
113
		else
114
		{
115
			$this->fail($failMessage ?: $this->_('%s is not the parent of class %s', $parent, $this));
116
		}
117

                    
118
		return $this;
119
	}
120

                    
121
	public function hasNoParent($failMessage = null)100%
122
	{
123
		if (($parentClass = $this->classIsSet()->class->getParentClass()) === false)
124
		{
125
			$this->pass();
126
		}
127
		else
128
		{
129
			$this->fail($failMessage ?: $this->_('%s has parent %s', $this, $parentClass));
130
		}
131

                    
132
		return $this;
133
	}
134

                    
135
	public function isSubClassOf($parent, $failMessage = null)100%
136
	{
137
		try
138
		{
139
			if ($this->classIsSet()->class->isSubClassOf($parent) == true)
140
			{
141
				$this->pass();
142
			}
143
			else
144
			{
145
				$this->fail($failMessage ?: $this->_('%s does not extend %s', $this, $parent));
146
			}
147
		}
148
		catch (\reflectionException $exception)
149
		{
150
			throw new exceptions\logic('Argument of ' . __METHOD__ . '() must be a class name', null, $exception);
151
		}
152

                    
153
		return $this;
154
	}
155

                    
156
	public function hasInterface($interface, $failMessage = null)100%
157
	{
158
		try
159
		{
160
			if ($this->classIsSet()->class->implementsInterface($interface) === true)
161
			{
162
				$this->pass();
163
			}
164
			else
165
			{
166
				$this->fail($failMessage ?: $this->_('%s does not implement %s', $this, $interface));
167
			}
168
		}
169
		catch (\reflectionException $exception)
170
		{
171
			throw new exceptions\logic('Argument of ' . __METHOD__ . '() must be an interface name', null, $exception);
172
		}
173

                    
174
		return $this;
175
	}
176

                    
177
	public function isAbstract($failMessage = null)100%
178
	{
179
		if ($this->classIsSet()->class->isAbstract() === true)
180
		{
181
			$this->pass();
182
		}
183
		else
184
		{
185
			$this->fail($failMessage ?: $this->_('%s is not abstract', $this));
186
		}
187

                    
188
		return $this;
189
	}
190

                    
191
	public function isFinal($failMessage = null)100%
192
	{
193
		if ($this->classIsSet()->class->isFinal() === true)
194
		{
195
			$this->pass();
196
		}
197
		else
198
		{
199
			$this->fail($failMessage ?: $this->_('%s is not final', $this));
200
		}
201

                    
202
		return $this;
203
	}
204

                    
205
	public function hasMethod($method, $failMessage = null)100%
206
	{
207
		if ($this->classIsSet()->class->hasMethod($method) === true)
208
		{
209
			$this->pass();
210
		}
211
		else
212
		{
213
			$this->fail($failMessage ?: $this->_('%s::%s() does not exist', $this, $method));
214
		}
215

                    
216
		return $this;
217
	}
218

                    
219
	public function hasConstant($constant, $failMessage = null)83%
220
	{
221
		if ($this->classIsSet()->class->hasConstant($constant) === false)
222
		{
223
			$this->fail($failMessage ?: $this->_('%s::%s does not exist', $this, $constant));
224

                    
225
			return $this;
226
		}
227
		else
228
		{
229
			$this->pass();
230

                    
231
			return $this->generator->constant($this->class->getConstant($constant));
232
		}
233

                    
234
	}
235

                    
236
	protected function classIsSet()100%
237
	{
238
		if ($this->class === null)
239
		{
240
			throw new exceptions\logic('Class is undefined');
241
		}
242

                    
243
		return $this;
244
	}
245
}