* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Webmozart\Assert\Tests; use ArrayIterator; use Exception; use Error; use LogicException; use PHPUnit_Framework_TestCase; use RuntimeException; use stdClass; use Webmozart\Assert\Assert; /** * @since 1.0 * * @author Bernhard Schussek */ class AssertTest extends PHPUnit_Framework_TestCase { private static $resource; public static function getResource() { if (!static::$resource) { static::$resource = fopen(__FILE__, 'r'); } return static::$resource; } public static function tearDownAfterClass() { @fclose(self::$resource); } public function getTests() { $resource = self::getResource(); return array( array('string', array('value'), true), array('string', array(''), true), array('string', array(1234), false), array('stringNotEmpty', array('value'), true), array('stringNotEmpty', array(''), false), array('stringNotEmpty', array(1234), false), array('integer', array(123), true), array('integer', array('123'), false), array('integer', array(1.0), false), array('integer', array(1.23), false), array('integerish', array(1.0), true), array('integerish', array(1.23), false), array('integerish', array(123), true), array('integerish', array('123'), true), array('float', array(1.0), true), array('float', array(1.23), true), array('float', array(123), false), array('float', array('123'), false), array('numeric', array(1.0), true), array('numeric', array(1.23), true), array('numeric', array(123), true), array('numeric', array('123'), true), array('numeric', array('foo'), false), array('boolean', array(true), true), array('boolean', array(false), true), array('boolean', array(1), false), array('boolean', array('1'), false), array('scalar', array('1'), true), array('scalar', array(123), true), array('scalar', array(true), true), array('scalar', array(null), false), array('scalar', array(array()), false), array('scalar', array(new stdClass()), false), array('object', array(new stdClass()), true), array('object', array(new RuntimeException()), true), array('object', array(null), false), array('object', array(true), false), array('object', array(1), false), array('object', array(array()), false), array('resource', array($resource), true), array('resource', array($resource, 'stream'), true), array('resource', array($resource, 'other'), false), array('resource', array(1), false), array('isCallable', array('strlen'), true), array('isCallable', array(array($this, 'getTests')), true), array('isCallable', array(function () {}), true), array('isCallable', array(1234), false), array('isCallable', array('foobar'), false), array('isArray', array(array()), true), array('isArray', array(array(1, 2, 3)), true), array('isArray', array(new ArrayIterator(array())), false), array('isArray', array(123), false), array('isArray', array(new stdClass()), false), array('isTraversable', array(array()), true), array('isTraversable', array(array(1, 2, 3)), true), array('isTraversable', array(new ArrayIterator(array())), true), array('isTraversable', array(123), false), array('isTraversable', array(new stdClass()), false), array('isInstanceOf', array(new stdClass(), 'stdClass'), true), array('isInstanceOf', array(new Exception(), 'stdClass'), false), array('isInstanceOf', array(123, 'stdClass'), false), array('isInstanceOf', array(array(), 'stdClass'), false), array('notInstanceOf', array(new stdClass(), 'stdClass'), false), array('notInstanceOf', array(new Exception(), 'stdClass'), true), array('notInstanceOf', array(123, 'stdClass'), true), array('notInstanceOf', array(array(), 'stdClass'), true), array('true', array(true), true), array('true', array(false), false), array('true', array(1), false), array('true', array(null), false), array('false', array(false), true), array('false', array(true), false), array('false', array(1), false), array('false', array(0), false), array('false', array(null), false), array('null', array(null), true), array('null', array(false), false), array('null', array(0), false), array('notNull', array(false), true), array('notNull', array(0), true), array('notNull', array(null), false), array('isEmpty', array(null), true), array('isEmpty', array(false), true), array('isEmpty', array(0), true), array('isEmpty', array(''), true), array('isEmpty', array(1), false), array('isEmpty', array('a'), false), array('notEmpty', array(1), true), array('notEmpty', array('a'), true), array('notEmpty', array(null), false), array('notEmpty', array(false), false), array('notEmpty', array(0), false), array('notEmpty', array(''), false), array('eq', array(1, 1), true), array('eq', array(1, '1'), true), array('eq', array(1, true), true), array('eq', array(1, 0), false), array('notEq', array(1, 0), true), array('notEq', array(1, 1), false), array('notEq', array(1, '1'), false), array('notEq', array(1, true), false), array('same', array(1, 1), true), array('same', array(1, '1'), false), array('same', array(1, true), false), array('same', array(1, 0), false), array('notSame', array(1, 0), true), array('notSame', array(1, 1), false), array('notSame', array(1, '1'), true), array('notSame', array(1, true), true), array('greaterThan', array(1, 0), true), array('greaterThan', array(0, 0), false), array('greaterThanEq', array(2, 1), true), array('greaterThanEq', array(1, 1), true), array('greaterThanEq', array(0, 1), false), array('lessThan', array(0, 1), true), array('lessThan', array(1, 1), false), array('lessThanEq', array(0, 1), true), array('lessThanEq', array(1, 1), true), array('lessThanEq', array(2, 1), false), array('range', array(1, 1, 2), true), array('range', array(2, 1, 2), true), array('range', array(0, 1, 2), false), array('range', array(3, 1, 2), false), array('oneOf', array(1, array(1, 2, 3)), true), array('oneOf', array(1, array('1', '2', '3')), false), array('contains', array('abcd', 'ab'), true), array('contains', array('abcd', 'bc'), true), array('contains', array('abcd', 'cd'), true), array('contains', array('abcd', 'de'), false), array('contains', array('', 'de'), false), array('startsWith', array('abcd', 'ab'), true), array('startsWith', array('abcd', 'bc'), false), array('startsWith', array('', 'bc'), false), array('startsWithLetter', array('abcd'), true), array('startsWithLetter', array('1abcd'), false), array('startsWithLetter', array(''), false), array('endsWith', array('abcd', 'cd'), true), array('endsWith', array('abcd', 'bc'), false), array('endsWith', array('', 'bc'), false), array('regex', array('abcd', '~^ab~'), true), array('regex', array('abcd', '~^bc~'), false), array('regex', array('', '~^bc~'), false), array('alpha', array('abcd'), true), array('alpha', array('ab1cd'), false), array('alpha', array(''), false), array('digits', array('1234'), true), array('digits', array('12a34'), false), array('digits', array(''), false), array('alnum', array('ab12'), true), array('alnum', array('ab12$'), false), array('alnum', array(''), false), array('lower', array('abcd'), true), array('lower', array('abCd'), false), array('lower', array('ab_d'), false), array('lower', array(''), false), array('upper', array('ABCD'), true), array('upper', array('ABcD'), false), array('upper', array('AB_D'), false), array('upper', array(''), false), array('length', array('abcd', 4), true), array('length', array('abc', 4), false), array('length', array('abcde', 4), false), array('length', array('äbcd', 4), true, true), array('length', array('äbc', 4), false, true), array('length', array('äbcde', 4), false, true), array('minLength', array('abcd', 4), true), array('minLength', array('abcde', 4), true), array('minLength', array('abc', 4), false), array('minLength', array('äbcd', 4), true, true), array('minLength', array('äbcde', 4), true, true), array('minLength', array('äbc', 4), false, true), array('maxLength', array('abcd', 4), true), array('maxLength', array('abc', 4), true), array('maxLength', array('abcde', 4), false), array('maxLength', array('äbcd', 4), true, true), array('maxLength', array('äbc', 4), true, true), array('maxLength', array('äbcde', 4), false, true), array('lengthBetween', array('abcd', 3, 5), true), array('lengthBetween', array('abc', 3, 5), true), array('lengthBetween', array('abcde', 3, 5), true), array('lengthBetween', array('ab', 3, 5), false), array('lengthBetween', array('abcdef', 3, 5), false), array('lengthBetween', array('äbcd', 3, 5), true, true), array('lengthBetween', array('äbc', 3, 5), true, true), array('lengthBetween', array('äbcde', 3, 5), true, true), array('lengthBetween', array('äb', 3, 5), false, true), array('lengthBetween', array('äbcdef', 3, 5), false, true), array('fileExists', array(__FILE__), true), array('fileExists', array(__DIR__), true), array('fileExists', array(__DIR__.'/foobar'), false), array('file', array(__FILE__), true), array('file', array(__DIR__), false), array('file', array(__DIR__.'/foobar'), false), array('directory', array(__DIR__), true), array('directory', array(__FILE__), false), array('directory', array(__DIR__.'/foobar'), false), // no tests for readable()/writable() for now array('classExists', array(__CLASS__), true), array('classExists', array(__NAMESPACE__.'\Foobar'), false), array('subclassOf', array(__CLASS__, 'PHPUnit_Framework_TestCase'), true), array('subclassOf', array(__CLASS__, 'stdClass'), false), array('implementsInterface', array('ArrayIterator', 'Traversable'), true), array('implementsInterface', array(__CLASS__, 'Traversable'), false), array('propertyExists', array((object) array('property' => 0), 'property'), true), array('propertyExists', array((object) array('property' => null), 'property'), true), array('propertyExists', array((object) array('property' => null), 'foo'), false), array('propertyNotExists', array((object) array('property' => 0), 'property'), false), array('propertyNotExists', array((object) array('property' => null), 'property'), false), array('propertyNotExists', array((object) array('property' => null), 'foo'), true), array('methodExists', array('RuntimeException', 'getMessage'), true), array('methodExists', array(new RuntimeException(), 'getMessage'), true), array('methodExists', array('stdClass', 'getMessage'), false), array('methodExists', array(new stdClass(), 'getMessage'), false), array('methodExists', array(null, 'getMessage'), false), array('methodExists', array(true, 'getMessage'), false), array('methodExists', array(1, 'getMessage'), false), array('methodNotExists', array('RuntimeException', 'getMessage'), false), array('methodNotExists', array(new RuntimeException(), 'getMessage'), false), array('methodNotExists', array('stdClass', 'getMessage'), true), array('methodNotExists', array(new stdClass(), 'getMessage'), true), array('methodNotExists', array(null, 'getMessage'), true), array('methodNotExists', array(true, 'getMessage'), true), array('methodNotExists', array(1, 'getMessage'), true), array('keyExists', array(array('key' => 0), 'key'), true), array('keyExists', array(array('key' => null), 'key'), true), array('keyExists', array(array('key' => null), 'foo'), false), array('keyNotExists', array(array('key' => 0), 'key'), false), array('keyNotExists', array(array('key' => null), 'key'), false), array('keyNotExists', array(array('key' => null), 'foo'), true), array('count', array(array(0, 1, 2), 3), true), array('count', array(array(0, 1, 2), 2), false), array('uuid', array('00000000-0000-0000-0000-000000000000'), true), array('uuid', array('ff6f8cb0-c57d-21e1-9b21-0800200c9a66'), true), array('uuid', array('ff6f8cb0-c57d-11e1-9b21-0800200c9a66'), true), array('uuid', array('ff6f8cb0-c57d-31e1-9b21-0800200c9a66'), true), array('uuid', array('ff6f8cb0-c57d-41e1-9b21-0800200c9a66'), true), array('uuid', array('ff6f8cb0-c57d-51e1-9b21-0800200c9a66'), true), array('uuid', array('FF6F8CB0-C57D-11E1-9B21-0800200C9A66'), true), array('uuid', array('zf6f8cb0-c57d-11e1-9b21-0800200c9a66'), false), array('uuid', array('af6f8cb0c57d11e19b210800200c9a66'), false), array('uuid', array('ff6f8cb0-c57da-51e1-9b21-0800200c9a66'), false), array('uuid', array('af6f8cb-c57d-11e1-9b21-0800200c9a66'), false), array('uuid', array('3f6f8cb0-c57d-11e1-9b21-0800200c9a6'), false), array('throws', array(function() { throw new LogicException('test'); }, 'LogicException'), true), array('throws', array(function() { throw new LogicException('test'); }, 'IllogicException'), false), array('throws', array(function() { throw new Exception('test'); }), true), array('throws', array(function() { trigger_error('test'); }, 'Throwable'), true, false, 70000), array('throws', array(function() { trigger_error('test'); }, 'Unthrowable'), false, false, 70000), array('throws', array(function() { throw new Error(); }, 'Throwable'), true, true, 70000), ); } public function getMethods() { $methods = array(); foreach ($this->getTests() as $params) { $methods[$params[0]] = array($params[0]); } return array_values($methods); } /** * @dataProvider getTests */ public function testAssert($method, $args, $success, $multibyte = false, $minVersion = null) { if ($minVersion && PHP_VERSION_ID < $minVersion) { $this->markTestSkipped(sprintf('This test requires php %s or upper.', $minVersion)); return; } if ($multibyte && !function_exists('mb_strlen')) { $this->markTestSkipped('The function mb_strlen() is not available'); return; } if (!$success) { $this->setExpectedException('\InvalidArgumentException'); } call_user_func_array(array('Webmozart\Assert\Assert', $method), $args); } /** * @dataProvider getTests */ public function testNullOr($method, $args, $success, $multibyte = false, $minVersion = null) { if ($minVersion && PHP_VERSION_ID < $minVersion) { $this->markTestSkipped(sprintf('This test requires php %s or upper.', $minVersion)); return; } if ($multibyte && !function_exists('mb_strlen')) { $this->markTestSkipped('The function mb_strlen() is not available'); return; } if (!$success && null !== reset($args)) { $this->setExpectedException('\InvalidArgumentException'); } call_user_func_array(array('Webmozart\Assert\Assert', 'nullOr'.ucfirst($method)), $args); } /** * @dataProvider getMethods */ public function testNullOrAcceptsNull($method) { call_user_func(array('Webmozart\Assert\Assert', 'nullOr'.ucfirst($method)), null); } /** * @dataProvider getTests */ public function testAllArray($method, $args, $success, $multibyte = false, $minVersion = null) { if ($minVersion && PHP_VERSION_ID < $minVersion) { $this->markTestSkipped(sprintf('This test requires php %s or upper.', $minVersion)); return; } if ($multibyte && !function_exists('mb_strlen')) { $this->markTestSkipped('The function mb_strlen() is not available'); return; } if (!$success) { $this->setExpectedException('\InvalidArgumentException'); } $arg = array_shift($args); array_unshift($args, array($arg)); call_user_func_array(array('Webmozart\Assert\Assert', 'all'.ucfirst($method)), $args); } /** * @dataProvider getTests */ public function testAllTraversable($method, $args, $success, $multibyte = false, $minVersion = null) { if ($minVersion && PHP_VERSION_ID < $minVersion) { $this->markTestSkipped(sprintf('This test requires php %s or upper.', $minVersion)); return; } if ($multibyte && !function_exists('mb_strlen')) { $this->markTestSkipped('The function mb_strlen() is not available'); return; } if (!$success) { $this->setExpectedException('\InvalidArgumentException'); } $arg = array_shift($args); array_unshift($args, new ArrayIterator(array($arg))); call_user_func_array(array('Webmozart\Assert\Assert', 'all'.ucfirst($method)), $args); } public function getStringConversions() { return array( array('integer', array('foobar'), 'Expected an integer. Got: string'), array('string', array(1), 'Expected a string. Got: integer'), array('string', array(true), 'Expected a string. Got: boolean'), array('string', array(null), 'Expected a string. Got: NULL'), array('string', array(array()), 'Expected a string. Got: array'), array('string', array(new stdClass()), 'Expected a string. Got: stdClass'), array('string', array(self::getResource()), 'Expected a string. Got: resource'), array('eq', array('1', '2'), 'Expected a value equal to "2". Got: "1"'), array('eq', array(1, 2), 'Expected a value equal to 2. Got: 1'), array('eq', array(true, false), 'Expected a value equal to false. Got: true'), array('eq', array(true, null), 'Expected a value equal to null. Got: true'), array('eq', array(null, true), 'Expected a value equal to true. Got: null'), array('eq', array(array(1), array(2)), 'Expected a value equal to array. Got: array'), array('eq', array(new ArrayIterator(array()), new stdClass()), 'Expected a value equal to stdClass. Got: ArrayIterator'), array('eq', array(1, self::getResource()), 'Expected a value equal to resource. Got: 1'), ); } /** * @dataProvider getStringConversions */ public function testConvertValuesToStrings($method, $args, $exceptionMessage) { $this->setExpectedException('\InvalidArgumentException', $exceptionMessage); call_user_func_array(array('Webmozart\Assert\Assert', $method), $args); } }