4 * This file is part of the webmozart/assert package.
6 * (c) Bernhard Schussek <bschussek@gmail.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Webmozart\Assert\Tests;
18 use PHPUnit_Framework_TestCase;
21 use Webmozart\Assert\Assert;
26 * @author Bernhard Schussek <bschussek@gmail.com>
28 class AssertTest extends PHPUnit_Framework_TestCase
30 private static $resource;
32 public static function getResource()
34 if (!static::$resource) {
35 static::$resource = fopen(__FILE__, 'r');
38 return static::$resource;
41 public static function tearDownAfterClass()
43 @fclose(self::$resource);
46 public function getTests()
48 $resource = self::getResource();
51 array('string', array('value'), true),
52 array('string', array(''), true),
53 array('string', array(1234), false),
54 array('stringNotEmpty', array('value'), true),
55 array('stringNotEmpty', array(''), false),
56 array('stringNotEmpty', array(1234), false),
57 array('integer', array(123), true),
58 array('integer', array('123'), false),
59 array('integer', array(1.0), false),
60 array('integer', array(1.23), false),
61 array('integerish', array(1.0), true),
62 array('integerish', array(1.23), false),
63 array('integerish', array(123), true),
64 array('integerish', array('123'), true),
65 array('float', array(1.0), true),
66 array('float', array(1.23), true),
67 array('float', array(123), false),
68 array('float', array('123'), false),
69 array('numeric', array(1.0), true),
70 array('numeric', array(1.23), true),
71 array('numeric', array(123), true),
72 array('numeric', array('123'), true),
73 array('numeric', array('foo'), false),
74 array('boolean', array(true), true),
75 array('boolean', array(false), true),
76 array('boolean', array(1), false),
77 array('boolean', array('1'), false),
78 array('scalar', array('1'), true),
79 array('scalar', array(123), true),
80 array('scalar', array(true), true),
81 array('scalar', array(null), false),
82 array('scalar', array(array()), false),
83 array('scalar', array(new stdClass()), false),
84 array('object', array(new stdClass()), true),
85 array('object', array(new RuntimeException()), true),
86 array('object', array(null), false),
87 array('object', array(true), false),
88 array('object', array(1), false),
89 array('object', array(array()), false),
90 array('resource', array($resource), true),
91 array('resource', array($resource, 'stream'), true),
92 array('resource', array($resource, 'other'), false),
93 array('resource', array(1), false),
94 array('isCallable', array('strlen'), true),
95 array('isCallable', array(array($this, 'getTests')), true),
96 array('isCallable', array(function () {}), true),
97 array('isCallable', array(1234), false),
98 array('isCallable', array('foobar'), false),
99 array('isArray', array(array()), true),
100 array('isArray', array(array(1, 2, 3)), true),
101 array('isArray', array(new ArrayIterator(array())), false),
102 array('isArray', array(123), false),
103 array('isArray', array(new stdClass()), false),
104 array('isTraversable', array(array()), true),
105 array('isTraversable', array(array(1, 2, 3)), true),
106 array('isTraversable', array(new ArrayIterator(array())), true),
107 array('isTraversable', array(123), false),
108 array('isTraversable', array(new stdClass()), false),
109 array('isInstanceOf', array(new stdClass(), 'stdClass'), true),
110 array('isInstanceOf', array(new Exception(), 'stdClass'), false),
111 array('isInstanceOf', array(123, 'stdClass'), false),
112 array('isInstanceOf', array(array(), 'stdClass'), false),
113 array('notInstanceOf', array(new stdClass(), 'stdClass'), false),
114 array('notInstanceOf', array(new Exception(), 'stdClass'), true),
115 array('notInstanceOf', array(123, 'stdClass'), true),
116 array('notInstanceOf', array(array(), 'stdClass'), true),
117 array('true', array(true), true),
118 array('true', array(false), false),
119 array('true', array(1), false),
120 array('true', array(null), false),
121 array('false', array(false), true),
122 array('false', array(true), false),
123 array('false', array(1), false),
124 array('false', array(0), false),
125 array('false', array(null), false),
126 array('null', array(null), true),
127 array('null', array(false), false),
128 array('null', array(0), false),
129 array('notNull', array(false), true),
130 array('notNull', array(0), true),
131 array('notNull', array(null), false),
132 array('isEmpty', array(null), true),
133 array('isEmpty', array(false), true),
134 array('isEmpty', array(0), true),
135 array('isEmpty', array(''), true),
136 array('isEmpty', array(1), false),
137 array('isEmpty', array('a'), false),
138 array('notEmpty', array(1), true),
139 array('notEmpty', array('a'), true),
140 array('notEmpty', array(null), false),
141 array('notEmpty', array(false), false),
142 array('notEmpty', array(0), false),
143 array('notEmpty', array(''), false),
144 array('eq', array(1, 1), true),
145 array('eq', array(1, '1'), true),
146 array('eq', array(1, true), true),
147 array('eq', array(1, 0), false),
148 array('notEq', array(1, 0), true),
149 array('notEq', array(1, 1), false),
150 array('notEq', array(1, '1'), false),
151 array('notEq', array(1, true), false),
152 array('same', array(1, 1), true),
153 array('same', array(1, '1'), false),
154 array('same', array(1, true), false),
155 array('same', array(1, 0), false),
156 array('notSame', array(1, 0), true),
157 array('notSame', array(1, 1), false),
158 array('notSame', array(1, '1'), true),
159 array('notSame', array(1, true), true),
160 array('greaterThan', array(1, 0), true),
161 array('greaterThan', array(0, 0), false),
162 array('greaterThanEq', array(2, 1), true),
163 array('greaterThanEq', array(1, 1), true),
164 array('greaterThanEq', array(0, 1), false),
165 array('lessThan', array(0, 1), true),
166 array('lessThan', array(1, 1), false),
167 array('lessThanEq', array(0, 1), true),
168 array('lessThanEq', array(1, 1), true),
169 array('lessThanEq', array(2, 1), false),
170 array('range', array(1, 1, 2), true),
171 array('range', array(2, 1, 2), true),
172 array('range', array(0, 1, 2), false),
173 array('range', array(3, 1, 2), false),
174 array('oneOf', array(1, array(1, 2, 3)), true),
175 array('oneOf', array(1, array('1', '2', '3')), false),
176 array('contains', array('abcd', 'ab'), true),
177 array('contains', array('abcd', 'bc'), true),
178 array('contains', array('abcd', 'cd'), true),
179 array('contains', array('abcd', 'de'), false),
180 array('contains', array('', 'de'), false),
181 array('startsWith', array('abcd', 'ab'), true),
182 array('startsWith', array('abcd', 'bc'), false),
183 array('startsWith', array('', 'bc'), false),
184 array('startsWithLetter', array('abcd'), true),
185 array('startsWithLetter', array('1abcd'), false),
186 array('startsWithLetter', array(''), false),
187 array('endsWith', array('abcd', 'cd'), true),
188 array('endsWith', array('abcd', 'bc'), false),
189 array('endsWith', array('', 'bc'), false),
190 array('regex', array('abcd', '~^ab~'), true),
191 array('regex', array('abcd', '~^bc~'), false),
192 array('regex', array('', '~^bc~'), false),
193 array('alpha', array('abcd'), true),
194 array('alpha', array('ab1cd'), false),
195 array('alpha', array(''), false),
196 array('digits', array('1234'), true),
197 array('digits', array('12a34'), false),
198 array('digits', array(''), false),
199 array('alnum', array('ab12'), true),
200 array('alnum', array('ab12$'), false),
201 array('alnum', array(''), false),
202 array('lower', array('abcd'), true),
203 array('lower', array('abCd'), false),
204 array('lower', array('ab_d'), false),
205 array('lower', array(''), false),
206 array('upper', array('ABCD'), true),
207 array('upper', array('ABcD'), false),
208 array('upper', array('AB_D'), false),
209 array('upper', array(''), false),
210 array('length', array('abcd', 4), true),
211 array('length', array('abc', 4), false),
212 array('length', array('abcde', 4), false),
213 array('length', array('äbcd', 4), true, true),
214 array('length', array('äbc', 4), false, true),
215 array('length', array('äbcde', 4), false, true),
216 array('minLength', array('abcd', 4), true),
217 array('minLength', array('abcde', 4), true),
218 array('minLength', array('abc', 4), false),
219 array('minLength', array('äbcd', 4), true, true),
220 array('minLength', array('äbcde', 4), true, true),
221 array('minLength', array('äbc', 4), false, true),
222 array('maxLength', array('abcd', 4), true),
223 array('maxLength', array('abc', 4), true),
224 array('maxLength', array('abcde', 4), false),
225 array('maxLength', array('äbcd', 4), true, true),
226 array('maxLength', array('äbc', 4), true, true),
227 array('maxLength', array('äbcde', 4), false, true),
228 array('lengthBetween', array('abcd', 3, 5), true),
229 array('lengthBetween', array('abc', 3, 5), true),
230 array('lengthBetween', array('abcde', 3, 5), true),
231 array('lengthBetween', array('ab', 3, 5), false),
232 array('lengthBetween', array('abcdef', 3, 5), false),
233 array('lengthBetween', array('äbcd', 3, 5), true, true),
234 array('lengthBetween', array('äbc', 3, 5), true, true),
235 array('lengthBetween', array('äbcde', 3, 5), true, true),
236 array('lengthBetween', array('äb', 3, 5), false, true),
237 array('lengthBetween', array('äbcdef', 3, 5), false, true),
238 array('fileExists', array(__FILE__), true),
239 array('fileExists', array(__DIR__), true),
240 array('fileExists', array(__DIR__.'/foobar'), false),
241 array('file', array(__FILE__), true),
242 array('file', array(__DIR__), false),
243 array('file', array(__DIR__.'/foobar'), false),
244 array('directory', array(__DIR__), true),
245 array('directory', array(__FILE__), false),
246 array('directory', array(__DIR__.'/foobar'), false),
247 // no tests for readable()/writable() for now
248 array('classExists', array(__CLASS__), true),
249 array('classExists', array(__NAMESPACE__.'\Foobar'), false),
250 array('subclassOf', array(__CLASS__, 'PHPUnit_Framework_TestCase'), true),
251 array('subclassOf', array(__CLASS__, 'stdClass'), false),
252 array('implementsInterface', array('ArrayIterator', 'Traversable'), true),
253 array('implementsInterface', array(__CLASS__, 'Traversable'), false),
254 array('propertyExists', array((object) array('property' => 0), 'property'), true),
255 array('propertyExists', array((object) array('property' => null), 'property'), true),
256 array('propertyExists', array((object) array('property' => null), 'foo'), false),
257 array('propertyNotExists', array((object) array('property' => 0), 'property'), false),
258 array('propertyNotExists', array((object) array('property' => null), 'property'), false),
259 array('propertyNotExists', array((object) array('property' => null), 'foo'), true),
260 array('methodExists', array('RuntimeException', 'getMessage'), true),
261 array('methodExists', array(new RuntimeException(), 'getMessage'), true),
262 array('methodExists', array('stdClass', 'getMessage'), false),
263 array('methodExists', array(new stdClass(), 'getMessage'), false),
264 array('methodExists', array(null, 'getMessage'), false),
265 array('methodExists', array(true, 'getMessage'), false),
266 array('methodExists', array(1, 'getMessage'), false),
267 array('methodNotExists', array('RuntimeException', 'getMessage'), false),
268 array('methodNotExists', array(new RuntimeException(), 'getMessage'), false),
269 array('methodNotExists', array('stdClass', 'getMessage'), true),
270 array('methodNotExists', array(new stdClass(), 'getMessage'), true),
271 array('methodNotExists', array(null, 'getMessage'), true),
272 array('methodNotExists', array(true, 'getMessage'), true),
273 array('methodNotExists', array(1, 'getMessage'), true),
274 array('keyExists', array(array('key' => 0), 'key'), true),
275 array('keyExists', array(array('key' => null), 'key'), true),
276 array('keyExists', array(array('key' => null), 'foo'), false),
277 array('keyNotExists', array(array('key' => 0), 'key'), false),
278 array('keyNotExists', array(array('key' => null), 'key'), false),
279 array('keyNotExists', array(array('key' => null), 'foo'), true),
280 array('count', array(array(0, 1, 2), 3), true),
281 array('count', array(array(0, 1, 2), 2), false),
282 array('uuid', array('00000000-0000-0000-0000-000000000000'), true),
283 array('uuid', array('ff6f8cb0-c57d-21e1-9b21-0800200c9a66'), true),
284 array('uuid', array('ff6f8cb0-c57d-11e1-9b21-0800200c9a66'), true),
285 array('uuid', array('ff6f8cb0-c57d-31e1-9b21-0800200c9a66'), true),
286 array('uuid', array('ff6f8cb0-c57d-41e1-9b21-0800200c9a66'), true),
287 array('uuid', array('ff6f8cb0-c57d-51e1-9b21-0800200c9a66'), true),
288 array('uuid', array('FF6F8CB0-C57D-11E1-9B21-0800200C9A66'), true),
289 array('uuid', array('zf6f8cb0-c57d-11e1-9b21-0800200c9a66'), false),
290 array('uuid', array('af6f8cb0c57d11e19b210800200c9a66'), false),
291 array('uuid', array('ff6f8cb0-c57da-51e1-9b21-0800200c9a66'), false),
292 array('uuid', array('af6f8cb-c57d-11e1-9b21-0800200c9a66'), false),
293 array('uuid', array('3f6f8cb0-c57d-11e1-9b21-0800200c9a6'), false),
294 array('throws', array(function() { throw new LogicException('test'); }, 'LogicException'), true),
295 array('throws', array(function() { throw new LogicException('test'); }, 'IllogicException'), false),
296 array('throws', array(function() { throw new Exception('test'); }), true),
297 array('throws', array(function() { trigger_error('test'); }, 'Throwable'), true, false, 70000),
298 array('throws', array(function() { trigger_error('test'); }, 'Unthrowable'), false, false, 70000),
299 array('throws', array(function() { throw new Error(); }, 'Throwable'), true, true, 70000),
303 public function getMethods()
307 foreach ($this->getTests() as $params) {
308 $methods[$params[0]] = array($params[0]);
311 return array_values($methods);
315 * @dataProvider getTests
317 public function testAssert($method, $args, $success, $multibyte = false, $minVersion = null)
319 if ($minVersion && PHP_VERSION_ID < $minVersion) {
320 $this->markTestSkipped(sprintf('This test requires php %s or upper.', $minVersion));
324 if ($multibyte && !function_exists('mb_strlen')) {
325 $this->markTestSkipped('The function mb_strlen() is not available');
331 $this->setExpectedException('\InvalidArgumentException');
334 call_user_func_array(array('Webmozart\Assert\Assert', $method), $args);
338 * @dataProvider getTests
340 public function testNullOr($method, $args, $success, $multibyte = false, $minVersion = null)
342 if ($minVersion && PHP_VERSION_ID < $minVersion) {
343 $this->markTestSkipped(sprintf('This test requires php %s or upper.', $minVersion));
347 if ($multibyte && !function_exists('mb_strlen')) {
348 $this->markTestSkipped('The function mb_strlen() is not available');
353 if (!$success && null !== reset($args)) {
354 $this->setExpectedException('\InvalidArgumentException');
357 call_user_func_array(array('Webmozart\Assert\Assert', 'nullOr'.ucfirst($method)), $args);
361 * @dataProvider getMethods
363 public function testNullOrAcceptsNull($method)
365 call_user_func(array('Webmozart\Assert\Assert', 'nullOr'.ucfirst($method)), null);
369 * @dataProvider getTests
371 public function testAllArray($method, $args, $success, $multibyte = false, $minVersion = null)
373 if ($minVersion && PHP_VERSION_ID < $minVersion) {
374 $this->markTestSkipped(sprintf('This test requires php %s or upper.', $minVersion));
378 if ($multibyte && !function_exists('mb_strlen')) {
379 $this->markTestSkipped('The function mb_strlen() is not available');
385 $this->setExpectedException('\InvalidArgumentException');
388 $arg = array_shift($args);
389 array_unshift($args, array($arg));
391 call_user_func_array(array('Webmozart\Assert\Assert', 'all'.ucfirst($method)), $args);
395 * @dataProvider getTests
397 public function testAllTraversable($method, $args, $success, $multibyte = false, $minVersion = null)
399 if ($minVersion && PHP_VERSION_ID < $minVersion) {
400 $this->markTestSkipped(sprintf('This test requires php %s or upper.', $minVersion));
404 if ($multibyte && !function_exists('mb_strlen')) {
405 $this->markTestSkipped('The function mb_strlen() is not available');
411 $this->setExpectedException('\InvalidArgumentException');
414 $arg = array_shift($args);
415 array_unshift($args, new ArrayIterator(array($arg)));
417 call_user_func_array(array('Webmozart\Assert\Assert', 'all'.ucfirst($method)), $args);
420 public function getStringConversions()
423 array('integer', array('foobar'), 'Expected an integer. Got: string'),
424 array('string', array(1), 'Expected a string. Got: integer'),
425 array('string', array(true), 'Expected a string. Got: boolean'),
426 array('string', array(null), 'Expected a string. Got: NULL'),
427 array('string', array(array()), 'Expected a string. Got: array'),
428 array('string', array(new stdClass()), 'Expected a string. Got: stdClass'),
429 array('string', array(self::getResource()), 'Expected a string. Got: resource'),
431 array('eq', array('1', '2'), 'Expected a value equal to "2". Got: "1"'),
432 array('eq', array(1, 2), 'Expected a value equal to 2. Got: 1'),
433 array('eq', array(true, false), 'Expected a value equal to false. Got: true'),
434 array('eq', array(true, null), 'Expected a value equal to null. Got: true'),
435 array('eq', array(null, true), 'Expected a value equal to true. Got: null'),
436 array('eq', array(array(1), array(2)), 'Expected a value equal to array. Got: array'),
437 array('eq', array(new ArrayIterator(array()), new stdClass()), 'Expected a value equal to stdClass. Got: ArrayIterator'),
438 array('eq', array(1, self::getResource()), 'Expected a value equal to resource. Got: 1'),
443 * @dataProvider getStringConversions
445 public function testConvertValuesToStrings($method, $args, $exceptionMessage)
447 $this->setExpectedException('\InvalidArgumentException', $exceptionMessage);
449 call_user_func_array(array('Webmozart\Assert\Assert', $method), $args);