AssertTest.php 19 KB

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