ValidatorTest.php 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226
  1. <?php
  2. /**
  3. * Lithium: the most rad php framework
  4. *
  5. * @copyright Copyright 2013, Union of RAD (http://union-of-rad.org)
  6. * @license http://opensource.org/licenses/bsd-license.php The BSD License
  7. */
  8. namespace lithium\tests\cases\util;
  9. use lithium\util\Validator;
  10. class ValidatorTest extends \lithium\test\Unit {
  11. public function setUp() {
  12. Validator::__init();
  13. }
  14. /**
  15. * Tests static method call routing to enable patterns defined in Validator::$_rules to be
  16. * called as methods.
  17. */
  18. public function testCustomMethodDispatching() {
  19. $this->assertTrue(Validator::isRegex('/^abc$/'));
  20. $this->assertTrue(Validator::isPhone('800-999-5555'));
  21. $this->assertTrue(Validator::isUrl('http://example.com'));
  22. }
  23. public function testFieldOption() {
  24. Validator::add('isInArray', function($data, $params, $options) {
  25. $existing = array(
  26. 'number' => array('one', 'two', 'three'),
  27. 'name' => array('bob', 'bill')
  28. );
  29. $isSet = isset($existing[$options['field']]);
  30. $inArray = in_array($data,$existing[$options['field']]);
  31. return isset($options['field']) && $isSet && $inArray;
  32. });
  33. $fieldValidationRules = array(
  34. 'number' => array('rule' => array('isInArray')),
  35. 'name' => array('rule' => array('isInArray'))
  36. );
  37. $result = Validator::check(
  38. array('number' => 'one', 'name' => 'bob'),
  39. $fieldValidationRules
  40. );
  41. $this->assertTrue(empty($result));
  42. $result = Validator::check(
  43. array('number' => 'four', 'name' => 'bob'),
  44. $fieldValidationRules
  45. );
  46. $this->assertFalse(empty($result));
  47. $result = Validator::check(
  48. array('number' => 'one', 'name' => 'rex'),
  49. $fieldValidationRules
  50. );
  51. $this->assertFalse(empty($result));
  52. }
  53. /**
  54. * Tests that new methods can be called on Validator by adding rules using Validator::add().
  55. */
  56. public function testAddCustomRegexMethods() {
  57. $this->assertNull(Validator::rules('foo'));
  58. Validator::add('foo', '/^foo$/');
  59. $this->assertTrue(Validator::isFoo('foo'));
  60. $this->assertFalse(Validator::isFoo('bar'));
  61. $this->assertTrue(in_array('foo', Validator::rules()));
  62. $this->assertEqual('/^foo$/', Validator::rules('foo'));
  63. $this->expectException("Rule `bar` is not a validation rule.");
  64. $this->assertNull(Validator::isBar('foo'));
  65. }
  66. /**
  67. * Tests that the rules state is reset when calling `Validator::__init()`.
  68. */
  69. public function testStateReset() {
  70. $this->assertNull(Validator::rules('foo'));
  71. Validator::add('foo', '/foo/');
  72. $this->assertEqual('/foo/', Validator::rules('foo'));
  73. Validator::__init();
  74. $this->assertNull(Validator::rules('foo'));
  75. }
  76. /**
  77. * Tests that valid and invalid UUIDs are properly detected.
  78. */
  79. public function testUuid() {
  80. $this->assertTrue(Validator::isUuid('1c0a5830-6025-11de-8a39-0800200c9a66'));
  81. $this->assertTrue(Validator::isUuid('1c0a5831-6025-11de-8a39-0800200c9a66'));
  82. $this->assertTrue(Validator::isUuid('1c0a5832-6025-11de-8a39-0800200c9a66'));
  83. $this->assertFalse(Validator::isUuid('zc0a5832-6025-11de-8a39-0800200c9a66'));
  84. $this->assertFalse(Validator::isUuid('1-1c0a5832-6025-11de-8a39-0800200c9a66'));
  85. }
  86. public function testCustomWithFormat() {
  87. $rFormat = null;
  88. $function = function(&$value, $format = null, array $options = array()) use (&$rFormat) {
  89. $rFormat = $format;
  90. if ($format === 'string') {
  91. return true;
  92. }
  93. };
  94. Validator::add('test', $function);
  95. $validations = array(
  96. 'inputName' => array( array( 'test', 'message' => 'foobar', 'format' => 'string' ) )
  97. );
  98. $values = array(
  99. 'inputName' => 'blah'
  100. );
  101. $this->assertFalse((boolean) Validator::check($values, $validations));
  102. $this->assertEqual($rFormat, 'string');
  103. }
  104. /**
  105. * Tests that new formats can be added to existing regex methods using Validator::add().
  106. */
  107. public function testAddCustomRegexFormats() {
  108. $this->assertTrue(Validator::isPhone('1234567890'));
  109. $this->assertTrue(Validator::isPhone('+1234567890'));
  110. $this->assertFalse(Validator::isPhone('0800-LITHIUM'));
  111. Validator::add(array('phone' => array('foo' => '/^0800-[A-Z]+$/')));
  112. $this->assertTrue(Validator::isPhone('0800-LITHIUM'));
  113. $this->assertTrue(Validator::isPhone('0800-LITHIUM', 'foo'));
  114. $this->assertTrue(Validator::isPhone('0800-LITHIUM', 'any'));
  115. }
  116. /**
  117. * Tests that setting the `'contain'` rule option to false correctly requires a string to be
  118. * an exact match of the regex, with no additional characters outside.
  119. */
  120. public function testRegexContainment() {
  121. $this->assertTrue(Validator::isIp('127.0.0.1', null, array('contains' => false)));
  122. Validator::add('foo', '/foo/', array('contains' => true));
  123. $this->assertTrue(Validator::isFoo('foobar'));
  124. Validator::add('foo', 'foo', array('contains' => false));
  125. $this->assertFalse(Validator::isFoo('foobar'));
  126. $this->assertTrue(Validator::isFoo('foo'));
  127. }
  128. /**
  129. * Tests the regular expression validation for various regex delimiters
  130. *
  131. * @link http://www.php.net/manual/en/regexp.reference.delimiters.php Regex Delimiters
  132. */
  133. public function testIsRegex() {
  134. $this->assertTrue(Validator::isRegex('/^123$/'));
  135. $this->assertTrue(Validator::isRegex('/^abc$/'));
  136. $this->assertTrue(Validator::isRegex('/^abc123$/'));
  137. $this->assertTrue(Validator::isRegex('@^abc$@'));
  138. $this->assertTrue(Validator::isRegex('#^abc$#'));
  139. $this->assertFalse(Validator::isRegex('d^abc$d'));
  140. $this->assertTrue(Validator::isRegex('(^abc$)'));
  141. $this->assertTrue(Validator::isRegex('{^abc$}'));
  142. $this->assertTrue(Validator::isRegex('[^abc$]'));
  143. $this->assertTrue(Validator::isRegex('<^abc$>'));
  144. $this->assertTrue(Validator::isRegex(')^abc$)'));
  145. $this->assertTrue(Validator::isRegex('}^abc$}'));
  146. $this->assertTrue(Validator::isRegex(']^abc$]'));
  147. $this->assertTrue(Validator::isRegex('>^abc$>'));
  148. $this->assertFalse(Validator::isRegex('\\^abc$\\'));
  149. $this->assertFalse(Validator::isRegex('(^abc$('));
  150. $this->assertFalse(Validator::isRegex('{^abc${'));
  151. $this->assertFalse(Validator::isRegex('[^abc$['));
  152. $this->assertFalse(Validator::isRegex('<^abc$<'));
  153. }
  154. public function testPrefilterMethodAccess() {
  155. $this->assertTrue(Validator::isNotEmpty('0'));
  156. $this->assertFalse(Validator::isNotEmpty(''));
  157. $this->assertFalse(Validator::isNotEmpty(null));
  158. }
  159. /**
  160. * Tests that the 'notEmpty' rule validates correct values
  161. */
  162. public function testNotEmptyRule() {
  163. $this->assertTrue(Validator::isNotEmpty('abcdefg'));
  164. $this->assertTrue(Validator::isNotEmpty('fasdf '));
  165. $this->assertTrue(Validator::isNotEmpty('fooo' . chr(243) . 'blabla'));
  166. $this->assertTrue(Validator::isNotEmpty('abçďĕʑʘπй'));
  167. $this->assertTrue(Validator::isNotEmpty('José'));
  168. $this->assertTrue(Validator::isNotEmpty('é'));
  169. $this->assertTrue(Validator::isNotEmpty('π'));
  170. $this->assertFalse(Validator::isNotEmpty("\t "));
  171. $this->assertFalse(Validator::isNotEmpty(""));
  172. }
  173. /**
  174. * Tests the the 'alphaNumeric' rule validates correct values.
  175. */
  176. public function testAlphaNumeric() {
  177. $this->assertTrue(Validator::isAlphaNumeric('frferrf'));
  178. $this->assertTrue(Validator::isAlphaNumeric('12234'));
  179. $this->assertTrue(Validator::isAlphaNumeric('1w2e2r3t4y'));
  180. $this->assertTrue(Validator::isAlphaNumeric('0'));
  181. $this->assertTrue(Validator::isAlphaNumeric('abçďĕʑʘπй'));
  182. $this->assertTrue(Validator::isAlphaNumeric('ˇˆๆゞ'));
  183. $this->assertTrue(Validator::isAlphaNumeric('אกあアꀀ豈'));
  184. $this->assertTrue(Validator::isAlphaNumeric('Džᾈᾨ'));
  185. $this->assertTrue(Validator::isAlphaNumeric('ÆΔΩЖÇ'));
  186. $this->assertTrue(Validator::isAlphaNumeric('日本語でも'));
  187. $this->assertTrue(Validator::isAlphaNumeric('をありがとうございました'));
  188. $this->assertFalse(Validator::isAlphaNumeric('12 234'));
  189. $this->assertFalse(Validator::isAlphaNumeric('dfd 234'));
  190. $this->assertFalse(Validator::isAlphaNumeric('こんにちは!'));
  191. $this->assertFalse(Validator::isAlphaNumeric("\n"));
  192. $this->assertFalse(Validator::isAlphaNumeric("\t"));
  193. $this->assertFalse(Validator::isAlphaNumeric("\r"));
  194. $this->assertFalse(Validator::isAlphaNumeric(' '));
  195. $this->assertFalse(Validator::isAlphaNumeric(''));
  196. }
  197. /**
  198. * Tests the the 'lengthBetween' rule validates correct values.
  199. */
  200. public function testIsLengthBetweenRule() {
  201. $this->assertTrue(Validator::isLengthBetween('abcde', null, array('min' => 1, 'max' => 7)));
  202. $this->assertTrue(Validator::isLengthBetween('', null, array('min' => 0, 'max' => 7)));
  203. $this->assertFalse(Validator::isLengthBetween('abcd', null, array('min' => 1, 'max' => 3)));
  204. }
  205. public function testIsNumericRule() {
  206. $this->assertTrue(Validator::isNumeric(0));
  207. $this->assertTrue(Validator::isNumeric('0'));
  208. $this->assertTrue(Validator::isNumeric('-0'));
  209. $this->assertFalse(Validator::isNumeric('-'));
  210. }
  211. public function testBooleanValidation() {
  212. $this->assertTrue(Validator::isBoolean(true));
  213. $this->assertTrue(Validator::isBoolean(false));
  214. $this->assertTrue(Validator::isBoolean('true'));
  215. $this->assertTrue(Validator::isBoolean('false'));
  216. $this->assertTrue(Validator::isBoolean(0));
  217. $this->assertTrue(Validator::isBoolean(1));
  218. $this->assertTrue(Validator::isBoolean('0'));
  219. $this->assertTrue(Validator::isBoolean('1'));
  220. $this->assertTrue(Validator::isBoolean('on'));
  221. $this->assertTrue(Validator::isBoolean('off'));
  222. $this->assertTrue(Validator::isBoolean('yes'));
  223. $this->assertTrue(Validator::isBoolean('no'));
  224. $this->assertTrue(Validator::isBoolean(''));
  225. $this->assertFalse(Validator::isBoolean('11'));
  226. $this->assertFalse(Validator::isBoolean('-1'));
  227. $this->assertFalse(Validator::isBoolean(-1));
  228. $this->assertFalse(Validator::isBoolean(11));
  229. $this->assertFalse(Validator::isBoolean(null));
  230. $this->assertFalse(Validator::isBoolean('test'));
  231. }
  232. /**
  233. * Test basic decimal number validation.
  234. */
  235. public function testDecimal() {
  236. $this->assertTrue(Validator::isDecimal('0.0'));
  237. $this->assertTrue(Validator::isDecimal('0.000'));
  238. $this->assertTrue(Validator::isDecimal('1.1'));
  239. $this->assertTrue(Validator::isDecimal('11.11'));
  240. $this->assertTrue(Validator::isDecimal('+0'));
  241. $this->assertTrue(Validator::isDecimal('-0'));
  242. $this->assertTrue(Validator::isDecimal('+1234.54321'));
  243. $this->assertTrue(Validator::isDecimal('-1234.54321'));
  244. $this->assertTrue(Validator::isDecimal('1234.54321'));
  245. $this->assertTrue(Validator::isDecimal('+0123.45e6'));
  246. $this->assertTrue(Validator::isDecimal('-0123.45e6'));
  247. $this->assertTrue(Validator::isDecimal('0123.45e6'));
  248. $this->assertTrue(Validator::isDecimal('1234'));
  249. $this->assertTrue(Validator::isDecimal('-1234'));
  250. $this->assertTrue(Validator::isDecimal('+1234'));
  251. $this->assertFalse(Validator::isDecimal('string'));
  252. }
  253. /**
  254. * Test decimal validation with precision specified.
  255. */
  256. public function testDecimalWithPlaces() {
  257. $this->assertTrue(Validator::isDecimal('.27', null, array('precision' => '2')));
  258. $this->assertTrue(Validator::isDecimal(.27, null, array('precision' => 2)));
  259. $this->assertTrue(Validator::isDecimal(-.27, null, array('precision' => 2)));
  260. $this->assertTrue(Validator::isDecimal(+.27, null, array('precision' => 2)));
  261. $this->assertTrue(Validator::isDecimal('.277', null, array('precision' => '3')));
  262. $this->assertTrue(Validator::isDecimal(.277, null, array('precision' => 3)));
  263. $this->assertTrue(Validator::isDecimal(-.277, null, array('precision' => 3)));
  264. $this->assertTrue(Validator::isDecimal(+.277, null, array('precision' => 3)));
  265. $this->assertTrue(Validator::isDecimal('1234.5678', null, array('precision' => '4')));
  266. $this->assertTrue(Validator::isDecimal(1234.5678, null, array('precision' => 4)));
  267. $this->assertTrue(Validator::isDecimal(-1234.5678, null, array('precision' => 4)));
  268. $this->assertTrue(Validator::isDecimal(+1234.5678, null, array('precision' => 4)));
  269. $this->assertFalse(Validator::isDecimal('1234.5678', null, array('precision' => '3')));
  270. $this->assertFalse(Validator::isDecimal(1234.5678, null, array('precision' => 3)));
  271. $this->assertFalse(Validator::isDecimal(-1234.5678, null, array('precision' => 3)));
  272. $this->assertFalse(Validator::isDecimal(+1234.5678, null, array('precision' => 3)));
  273. }
  274. public function testEmailValidation() {
  275. $this->assertTrue(Validator::isEmail('[email protected]'));
  276. $this->assertTrue(Validator::isEmail('[email protected]'));
  277. $this->assertTrue(Validator::isEmail('[email protected]'));
  278. $this->assertTrue(Validator::isEmail('[email protected]'));
  279. $this->assertTrue(Validator::isEmail('[email protected]'));
  280. $this->assertTrue(Validator::isEmail('[email protected]'));
  281. $this->assertTrue(Validator::isEmail("p.o'[email protected]"));
  282. $this->assertTrue(Validator::isEmail('[email protected]'));
  283. $this->assertTrue(Validator::isEmail('abc&[email protected]'));
  284. $this->assertTrue(Validator::isEmail('[email protected]'));
  285. $this->assertTrue(Validator::isEmail('[email protected]'));
  286. $this->assertTrue(Validator::isEmail('[email protected]'));
  287. $this->assertTrue(Validator::isEmail('[email protected]'));
  288. $this->assertTrue(Validator::isEmail('[email protected]'));
  289. $this->assertTrue(Validator::isEmail('[email protected]'));
  290. /**
  291. * All ICANN TLDs
  292. */
  293. $this->assertTrue(Validator::isEmail('[email protected]'));
  294. $this->assertTrue(Validator::isEmail('[email protected]'));
  295. $this->assertTrue(Validator::isEmail('[email protected]'));
  296. $this->assertTrue(Validator::isEmail('[email protected]'));
  297. $this->assertTrue(Validator::isEmail('[email protected]'));
  298. $this->assertTrue(Validator::isEmail('[email protected]'));
  299. $this->assertTrue(Validator::isEmail('[email protected]'));
  300. $this->assertTrue(Validator::isEmail('[email protected]'));
  301. $this->assertTrue(Validator::isEmail('[email protected]'));
  302. $this->assertTrue(Validator::isEmail('[email protected]'));
  303. $this->assertTrue(Validator::isEmail('[email protected]'));
  304. $this->assertTrue(Validator::isEmail('[email protected]'));
  305. $this->assertTrue(Validator::isEmail('[email protected]'));
  306. $this->assertTrue(Validator::isEmail('[email protected]'));
  307. $this->assertTrue(Validator::isEmail('[email protected]'));
  308. $this->assertTrue(Validator::isEmail('[email protected]'));
  309. $this->assertTrue(Validator::isEmail('[email protected]'));
  310. $this->assertTrue(Validator::isEmail('[email protected]'));
  311. $this->assertTrue(Validator::isEmail('[email protected]'));
  312. $this->assertTrue(Validator::isEmail('[email protected]'));
  313. $this->assertTrue(Validator::isEmail('[email protected]'));
  314. /**
  315. * Strange, but valid addresses
  316. */
  317. $this->assertTrue(Validator::isEmail('[email protected]'));
  318. $this->assertTrue(Validator::isEmail('[email protected]'));
  319. $this->assertTrue(Validator::isEmail('[email protected]'));
  320. $this->assertTrue(Validator::isEmail('[email protected]'));
  321. /**
  322. * Addresses which are invalid, but not caught until PHP 5.3.3.
  323. */
  324. $this->assertFalse(
  325. Validator::isEmail('abc@example'),
  326. 'Invalid email address passed validation. Please update to PHP 5.3.3 ' .
  327. 'or higher to correct this.'
  328. );
  329. $this->assertFalse(
  330. Validator::isEmail('[email protected]'),
  331. 'Invalid email address passed validation. Please update to PHP 5.3.3 ' .
  332. 'or higher to correct this.'
  333. );
  334. /**
  335. * Invalid addresses
  336. */
  337. $this->assertFalse(Validator::isEmail('[email protected].'));
  338. $this->assertFalse(Validator::isEmail('[email protected]'));
  339. $this->assertFalse(Validator::isEmail('abc;@example.com'));
  340. $this->assertFalse(Validator::isEmail('[email protected];'));
  341. $this->assertFalse(Validator::isEmail('abc@[email protected]'));
  342. $this->assertFalse(Validator::isEmail('abc@@example.com'));
  343. $this->assertFalse(Validator::isEmail('abc [email protected]'));
  344. $this->assertFalse(Validator::isEmail('abc,[email protected]'));
  345. $this->assertFalse(Validator::isEmail('abc@sub,example.com'));
  346. $this->assertFalse(Validator::isEmail("abc@sub'example.com"));
  347. $this->assertFalse(Validator::isEmail('abc@sub/example.com'));
  348. $this->assertFalse(Validator::isEmail('abc@yahoo!.com'));
  349. $this->assertFalse(Validator::isEmail("Nyré[email protected]"));
  350. $this->assertFalse(Validator::isEmail('abc@example_underscored.com'));
  351. $this->assertFalse(Validator::isEmail('[email protected]'));
  352. }
  353. /**
  354. * Tests email address validation, with additional hostname lookup
  355. */
  356. public function testEmailDomainCheck() {
  357. $message = "No internet connection established.";
  358. $this->skipIf(!$this->_hasNetwork(), $message);
  359. $this->assertTrue(Validator::isEmail('[email protected]', null, array('deep' => true)));
  360. $this->assertFalse(Validator::isEmail('[email protected]', null, array(
  361. 'deep' => true
  362. )));
  363. $this->assertFalse(Validator::isEmail('[email protected]', null, array('deep' => true)));
  364. }
  365. /**
  366. * Tests 'inList' validation.
  367. */
  368. public function testInList() {
  369. $this->assertTrue(Validator::isInList('one', null, array('list' => array('one', 'two'))));
  370. $this->assertTrue(Validator::isInList('two', null, array('list' => array('one', 'two'))));
  371. $this->assertFalse(Validator::isInList('3', null, array('list' => array('one', 'two'))));
  372. $this->assertFalse(Validator::isInList('', null, array('list' => array('0', '1'))));
  373. $this->assertFalse(Validator::isInList(null, null, array('list' => array('0', '1'))));
  374. $this->assertFalse(Validator::isInList(false, null, array('list' => array('0', '1'))));
  375. $this->assertFalse(Validator::isInList(true, null, array('list' => array('0', '1'))));
  376. $this->assertFalse(Validator::isInList('', null, array('list' => array(0, 1))));
  377. $this->assertFalse(Validator::isInList(null, null, array('list' => array(0, 1))));
  378. $this->assertFalse(Validator::isInList(false, null, array('list' => array(0, 1))));
  379. $this->assertFalse(Validator::isInList(true, null, array('list' => array(0, 1))));
  380. $this->assertTrue(Validator::isInList(0, null, array('list' => array(0, 1))));
  381. $this->assertTrue(Validator::isInList(1, null, array('list' => array(0, 1))));
  382. $this->assertFalse(Validator::isInList(2, null, array('list' => array(0, 1))));
  383. $this->assertTrue(Validator::isInList(0, null, array('list' => array('0', '1'))));
  384. $this->assertTrue(Validator::isInList('1', null, array('list' => array('0', '1'))));
  385. $this->assertTrue(Validator::isInList(1, null, array('list' => array('0', '1'))));
  386. $this->assertTrue(Validator::isInList('1', null, array('list' => array('0', '1'))));
  387. $this->assertFalse(Validator::isInList(2, null, array('list' => array('0', '1'))));
  388. $this->assertFalse(Validator::isInList('2', null, array('list' => array('0', '1'))));
  389. }
  390. /**
  391. * Tests credit card validation for numbers in various vendors' formats.
  392. */
  393. public function testCreditCardValidation() {
  394. /**
  395. * American Express
  396. */
  397. $this->assertTrue(Validator::isCreditCard('370482756063980', 'amex'));
  398. $this->assertTrue(Validator::isCreditCard('3491-0643-3773-483', 'amex'));
  399. $this->assertTrue(Validator::isCreditCard('344671486204764', 'amex'));
  400. $this->assertTrue(Validator::isCreditCard('344042544509943', 'amex'));
  401. $this->assertTrue(Validator::isCreditCard('377147515754475', 'amex'));
  402. $this->assertTrue(Validator::isCreditCard('375239372816422', 'amex'));
  403. $this->assertTrue(Validator::isCreditCard('376294341957707', 'amex'));
  404. $this->assertTrue(Validator::isCreditCard('341779292230411', 'amex'));
  405. $this->assertTrue(Validator::isCreditCard('341646919853372', 'amex'));
  406. $this->assertTrue(Validator::isCreditCard('348498616319346', 'amex', array(
  407. 'deep' => true
  408. )));
  409. $this->assertFalse(Validator::isCreditCard('5610376649499352', 'amex'));
  410. /**
  411. * BankCard
  412. */
  413. $this->assertTrue(Validator::isCreditCard('5610 7458 6741 3420', 'bankcard'));
  414. $this->assertTrue(Validator::isCreditCard('5610376649499352', 'bankcard'));
  415. $this->assertTrue(Validator::isCreditCard('5610091936000694', 'bankcard'));
  416. $this->assertTrue(Validator::isCreditCard('5602248780118788', 'bankcard'));
  417. $this->assertTrue(Validator::isCreditCard('5610631567676765', 'bankcard'));
  418. $this->assertTrue(Validator::isCreditCard('5602238211270795', 'bankcard'));
  419. $this->assertTrue(Validator::isCreditCard('5610173951215470', 'bankcard'));
  420. $this->assertTrue(Validator::isCreditCard('5610139705753702', 'bankcard'));
  421. $this->assertTrue(Validator::isCreditCard('5602226032150551', 'bankcard'));
  422. $this->assertTrue(Validator::isCreditCard('5602223993735777', 'bankcard'));
  423. $this->assertFalse(Validator::isCreditCard('30155483651028', 'bankcard'));
  424. /**
  425. * Diners Club 14
  426. */
  427. $this->assertTrue(Validator::isCreditCard('30155483651028', 'diners'));
  428. $this->assertTrue(Validator::isCreditCard('36371312803821', 'diners'));
  429. $this->assertTrue(Validator::isCreditCard('38801277489875', 'diners'));
  430. $this->assertTrue(Validator::isCreditCard('30348560464296', 'diners'));
  431. $this->assertTrue(Validator::isCreditCard('30349040317708', 'diners'));
  432. $this->assertTrue(Validator::isCreditCard('36567413559978', 'diners'));
  433. $this->assertTrue(Validator::isCreditCard('36051554732702', 'diners'));
  434. $this->assertTrue(Validator::isCreditCard('30391842198191', 'diners'));
  435. $this->assertTrue(Validator::isCreditCard('30172682197745', 'diners'));
  436. $this->assertTrue(Validator::isCreditCard('30162056566641', 'diners'));
  437. $this->assertTrue(Validator::isCreditCard('30085066927745', 'diners'));
  438. $this->assertTrue(Validator::isCreditCard('36519025221976', 'diners'));
  439. $this->assertTrue(Validator::isCreditCard('30372679371044', 'diners'));
  440. $this->assertTrue(Validator::isCreditCard('38913939150124', 'diners'));
  441. $this->assertTrue(Validator::isCreditCard('36852899094637', 'diners'));
  442. $this->assertTrue(Validator::isCreditCard('30138041971120', 'diners'));
  443. $this->assertTrue(Validator::isCreditCard('36184047836838', 'diners'));
  444. $this->assertTrue(Validator::isCreditCard('30057460264462', 'diners'));
  445. $this->assertTrue(Validator::isCreditCard('38980165212050', 'diners'));
  446. $this->assertTrue(Validator::isCreditCard('30356516881240', 'diners'));
  447. $this->assertTrue(Validator::isCreditCard('38744810033182', 'diners'));
  448. $this->assertTrue(Validator::isCreditCard('30173638706621', 'diners'));
  449. $this->assertTrue(Validator::isCreditCard('30158334709185', 'diners'));
  450. $this->assertTrue(Validator::isCreditCard('30195413721186', 'diners'));
  451. $this->assertTrue(Validator::isCreditCard('38863347694793', 'diners'));
  452. $this->assertTrue(Validator::isCreditCard('30275627009113', 'diners'));
  453. $this->assertTrue(Validator::isCreditCard('30242860404971', 'diners'));
  454. $this->assertTrue(Validator::isCreditCard('30081877595151', 'diners'));
  455. $this->assertTrue(Validator::isCreditCard('38053196067461', 'diners'));
  456. $this->assertTrue(Validator::isCreditCard('36520379984870', 'diners'));
  457. /**
  458. * 2004 MasterCard/Diners Club Alliance International 14
  459. */
  460. $this->assertTrue(Validator::isCreditCard('36747701998969', 'diners'));
  461. $this->assertTrue(Validator::isCreditCard('36427861123159', 'diners'));
  462. $this->assertTrue(Validator::isCreditCard('36150537602386', 'diners'));
  463. $this->assertTrue(Validator::isCreditCard('36582388820610', 'diners'));
  464. $this->assertTrue(Validator::isCreditCard('36729045250216', 'diners'));
  465. /**
  466. * 2004 MasterCard/Diners Club Alliance US & Canada 16
  467. */
  468. $this->assertTrue(Validator::isCreditCard('5597511346169950', 'diners'));
  469. $this->assertTrue(Validator::isCreditCard('5526443162217562', 'diners'));
  470. $this->assertTrue(Validator::isCreditCard('5577265786122391', 'diners'));
  471. $this->assertTrue(Validator::isCreditCard('5534061404676989', 'diners'));
  472. $this->assertTrue(Validator::isCreditCard('5545313588374502', 'diners'));
  473. $this->assertFalse(Validator::isCreditCard('6011802876467237', 'diners'));
  474. /**
  475. * Discover
  476. */
  477. $this->assertTrue(Validator::isCreditCard('6011802876467237', 'disc'));
  478. $this->assertTrue(Validator::isCreditCard('6506432777720955', 'disc'));
  479. $this->assertTrue(Validator::isCreditCard('6011126265283942', 'disc'));
  480. $this->assertTrue(Validator::isCreditCard('6502187151579252', 'disc'));
  481. $this->assertTrue(Validator::isCreditCard('6506600836002298', 'disc'));
  482. $this->assertTrue(Validator::isCreditCard('6504376463615189', 'disc'));
  483. $this->assertTrue(Validator::isCreditCard('6011440907005377', 'disc'));
  484. $this->assertTrue(Validator::isCreditCard('6509735979634270', 'disc'));
  485. $this->assertTrue(Validator::isCreditCard('6011422366775856', 'disc'));
  486. $this->assertTrue(Validator::isCreditCard('6500976374623323', 'disc'));
  487. $this->assertFalse(Validator::isCreditCard('201496944158937', 'disc'));
  488. /**
  489. * enRoute
  490. */
  491. $this->assertTrue(Validator::isCreditCard('201496944158937', 'enroute'));
  492. $this->assertTrue(Validator::isCreditCard('214945833739665', 'enroute'));
  493. $this->assertTrue(Validator::isCreditCard('214982692491187', 'enroute'));
  494. $this->assertTrue(Validator::isCreditCard('214901395949424', 'enroute'));
  495. $this->assertTrue(Validator::isCreditCard('201480676269187', 'enroute'));
  496. $this->assertTrue(Validator::isCreditCard('214911922887807', 'enroute'));
  497. $this->assertTrue(Validator::isCreditCard('201485025457250', 'enroute'));
  498. $this->assertTrue(Validator::isCreditCard('201402662758866', 'enroute'));
  499. $this->assertTrue(Validator::isCreditCard('214981579370225', 'enroute'));
  500. $this->assertTrue(Validator::isCreditCard('201447595859877', 'enroute'));
  501. $this->assertFalse(Validator::isCreditCard('210034762247893', 'enroute'));
  502. /**
  503. * JCB 15 digit
  504. */
  505. $this->assertTrue(Validator::isCreditCard('210034762247893', 'jcb'));
  506. $this->assertTrue(Validator::isCreditCard('180078671678892', 'jcb'));
  507. $this->assertTrue(Validator::isCreditCard('180010559353736', 'jcb'));
  508. $this->assertTrue(Validator::isCreditCard('210095474464258', 'jcb'));
  509. $this->assertTrue(Validator::isCreditCard('210006675562188', 'jcb'));
  510. $this->assertTrue(Validator::isCreditCard('210063299662662', 'jcb'));
  511. $this->assertTrue(Validator::isCreditCard('180032506857825', 'jcb'));
  512. $this->assertTrue(Validator::isCreditCard('210057919192738', 'jcb'));
  513. $this->assertTrue(Validator::isCreditCard('180031358949367', 'jcb'));
  514. $this->assertTrue(Validator::isCreditCard('180033802147846', 'jcb'));
  515. /**
  516. * JCB 16 digit
  517. */
  518. $this->assertTrue(Validator::isCreditCard('3096806857839939', 'jcb'));
  519. $this->assertTrue(Validator::isCreditCard('3158699503187091', 'jcb'));
  520. $this->assertTrue(Validator::isCreditCard('3112549607186579', 'jcb'));
  521. $this->assertTrue(Validator::isCreditCard('3112332922425604', 'jcb'));
  522. $this->assertTrue(Validator::isCreditCard('3112001541159239', 'jcb'));
  523. $this->assertTrue(Validator::isCreditCard('3112162495317841', 'jcb'));
  524. $this->assertTrue(Validator::isCreditCard('3337562627732768', 'jcb'));
  525. $this->assertTrue(Validator::isCreditCard('3337107161330775', 'jcb'));
  526. $this->assertTrue(Validator::isCreditCard('3528053736003621', 'jcb'));
  527. $this->assertTrue(Validator::isCreditCard('3528915255020360', 'jcb'));
  528. $this->assertTrue(Validator::isCreditCard('3096786059660921', 'jcb'));
  529. $this->assertTrue(Validator::isCreditCard('3528264799292320', 'jcb'));
  530. $this->assertTrue(Validator::isCreditCard('3096469164130136', 'jcb'));
  531. $this->assertTrue(Validator::isCreditCard('3112127443822853', 'jcb'));
  532. $this->assertTrue(Validator::isCreditCard('3096849995802328', 'jcb'));
  533. $this->assertTrue(Validator::isCreditCard('3528090735127407', 'jcb'));
  534. $this->assertTrue(Validator::isCreditCard('3112101006819234', 'jcb'));
  535. $this->assertTrue(Validator::isCreditCard('3337444428040784', 'jcb'));
  536. $this->assertTrue(Validator::isCreditCard('3088043154151061', 'jcb'));
  537. $this->assertTrue(Validator::isCreditCard('3088295969414866', 'jcb'));
  538. $this->assertTrue(Validator::isCreditCard('3158748843158575', 'jcb'));
  539. $this->assertTrue(Validator::isCreditCard('3158709206148538', 'jcb'));
  540. $this->assertTrue(Validator::isCreditCard('3158365159575324', 'jcb'));
  541. $this->assertTrue(Validator::isCreditCard('3158671691305165', 'jcb'));
  542. $this->assertTrue(Validator::isCreditCard('3528523028771093', 'jcb'));
  543. $this->assertTrue(Validator::isCreditCard('3096057126267870', 'jcb'));
  544. $this->assertTrue(Validator::isCreditCard('3158514047166834', 'jcb'));
  545. $this->assertTrue(Validator::isCreditCard('3528274546125962', 'jcb'));
  546. $this->assertTrue(Validator::isCreditCard('3528890967705733', 'jcb'));
  547. $this->assertTrue(Validator::isCreditCard('3337198811307545', 'jcb'));
  548. $this->assertFalse(Validator::isCreditCard('5020147409985219', 'jcb'));
  549. /**
  550. * Maestro (debit card)
  551. */
  552. $this->assertTrue(Validator::isCreditCard('5020147409985219', 'maestro'));
  553. $this->assertTrue(Validator::isCreditCard('5020931809905616', 'maestro'));
  554. $this->assertTrue(Validator::isCreditCard('5020412965470224', 'maestro'));
  555. $this->assertTrue(Validator::isCreditCard('5020129740944022', 'maestro'));
  556. $this->assertTrue(Validator::isCreditCard('5020024696747943', 'maestro'));
  557. $this->assertTrue(Validator::isCreditCard('5020581514636509', 'maestro'));
  558. $this->assertTrue(Validator::isCreditCard('5020695008411987', 'maestro'));
  559. $this->assertTrue(Validator::isCreditCard('5020565359718977', 'maestro'));
  560. $this->assertTrue(Validator::isCreditCard('6339931536544062', 'maestro'));
  561. $this->assertTrue(Validator::isCreditCard('6465028615704406', 'maestro'));
  562. $this->assertFalse(Validator::isCreditCard('5580424361774366', 'maestro'));
  563. /**
  564. * MasterCard
  565. */
  566. $this->assertTrue(Validator::isCreditCard('5580424361774366', 'mc'));
  567. $this->assertTrue(Validator::isCreditCard('5589563059318282', 'mc'));
  568. $this->assertTrue(Validator::isCreditCard('5387558333690047', 'mc'));
  569. $this->assertTrue(Validator::isCreditCard('5163919215247175', 'mc'));
  570. $this->assertTrue(Validator::isCreditCard('5386742685055055', 'mc'));
  571. $this->assertTrue(Validator::isCreditCard('5102303335960674', 'mc'));
  572. $this->assertTrue(Validator::isCreditCard('5526543403964565', 'mc'));
  573. $this->assertTrue(Validator::isCreditCard('5538725892618432', 'mc'));
  574. $this->assertTrue(Validator::isCreditCard('5119543573129778', 'mc'));
  575. $this->assertTrue(Validator::isCreditCard('5391174753915767', 'mc'));
  576. $this->assertTrue(Validator::isCreditCard('5510994113980714', 'mc'));
  577. $this->assertTrue(Validator::isCreditCard('5183720260418091', 'mc'));
  578. $this->assertTrue(Validator::isCreditCard('5488082196086704', 'mc'));
  579. $this->assertTrue(Validator::isCreditCard('5484645164161834', 'mc'));
  580. $this->assertTrue(Validator::isCreditCard('5171254350337031', 'mc'));
  581. $this->assertTrue(Validator::isCreditCard('5526987528136452', 'mc'));
  582. $this->assertTrue(Validator::isCreditCard('5504148941409358', 'mc'));
  583. $this->assertTrue(Validator::isCreditCard('5240793507243615', 'mc'));
  584. $this->assertTrue(Validator::isCreditCard('5162114693017107', 'mc'));
  585. $this->assertTrue(Validator::isCreditCard('5163104807404753', 'mc'));
  586. $this->assertTrue(Validator::isCreditCard('5590136167248365', 'mc'));
  587. $this->assertTrue(Validator::isCreditCard('5565816281038948', 'mc'));
  588. $this->assertTrue(Validator::isCreditCard('5467639122779531', 'mc'));
  589. $this->assertTrue(Validator::isCreditCard('5297350261550024', 'mc'));
  590. $this->assertTrue(Validator::isCreditCard('5162739131368058', 'mc'));
  591. $this->assertFalse(Validator::isCreditCard('6767432107064987', 'mc'));
  592. /**
  593. * Solo 16
  594. */
  595. $this->assertTrue(Validator::isCreditCard('6767432107064987', 'solo'));
  596. $this->assertTrue(Validator::isCreditCard('6334667758225411', 'solo'));
  597. $this->assertTrue(Validator::isCreditCard('6767037421954068', 'solo'));
  598. $this->assertTrue(Validator::isCreditCard('6767823306394854', 'solo'));
  599. $this->assertTrue(Validator::isCreditCard('6334768185398134', 'solo'));
  600. $this->assertTrue(Validator::isCreditCard('6767286729498589', 'solo'));
  601. $this->assertTrue(Validator::isCreditCard('6334972104431261', 'solo'));
  602. $this->assertTrue(Validator::isCreditCard('6334843427400616', 'solo'));
  603. $this->assertTrue(Validator::isCreditCard('6767493947881311', 'solo'));
  604. $this->assertTrue(Validator::isCreditCard('6767194235798817', 'solo'));
  605. /**
  606. * Solo 18
  607. */
  608. $this->assertTrue(Validator::isCreditCard('676714834398858593', 'solo'));
  609. $this->assertTrue(Validator::isCreditCard('676751666435130857', 'solo'));
  610. $this->assertTrue(Validator::isCreditCard('676781908573924236', 'solo'));
  611. $this->assertTrue(Validator::isCreditCard('633488724644003240', 'solo'));
  612. $this->assertTrue(Validator::isCreditCard('676732252338067316', 'solo'));
  613. $this->assertTrue(Validator::isCreditCard('676747520084495821', 'solo'));
  614. $this->assertTrue(Validator::isCreditCard('633465488901381957', 'solo'));
  615. $this->assertTrue(Validator::isCreditCard('633487484858610484', 'solo'));
  616. $this->assertTrue(Validator::isCreditCard('633453764680740694', 'solo'));
  617. $this->assertTrue(Validator::isCreditCard('676768613295414451', 'solo'));
  618. /**
  619. * Solo 19
  620. */
  621. $this->assertTrue(Validator::isCreditCard('6767838565218340113', 'solo'));
  622. $this->assertTrue(Validator::isCreditCard('6767760119829705181', 'solo'));
  623. $this->assertTrue(Validator::isCreditCard('6767265917091593668', 'solo'));
  624. $this->assertTrue(Validator::isCreditCard('6767938856947440111', 'solo'));
  625. $this->assertTrue(Validator::isCreditCard('6767501945697390076', 'solo'));
  626. $this->assertTrue(Validator::isCreditCard('6334902868716257379', 'solo'));
  627. $this->assertTrue(Validator::isCreditCard('6334922127686425532', 'solo'));
  628. $this->assertTrue(Validator::isCreditCard('6334933119080706440', 'solo'));
  629. $this->assertTrue(Validator::isCreditCard('6334647959628261714', 'solo'));
  630. $this->assertTrue(Validator::isCreditCard('6334527312384101382', 'solo'));
  631. $this->assertFalse(Validator::isCreditCard('5641829171515733', 'solo'));
  632. /**
  633. * Switch 16
  634. */
  635. $this->assertTrue(Validator::isCreditCard('5641829171515733', 'switch'));
  636. $this->assertTrue(Validator::isCreditCard('5641824852820809', 'switch'));
  637. $this->assertTrue(Validator::isCreditCard('6759129648956909', 'switch'));
  638. $this->assertTrue(Validator::isCreditCard('6759626072268156', 'switch'));
  639. $this->assertTrue(Validator::isCreditCard('5641822698388957', 'switch'));
  640. $this->assertTrue(Validator::isCreditCard('5641827123105470', 'switch'));
  641. $this->assertTrue(Validator::isCreditCard('5641823755819553', 'switch'));
  642. $this->assertTrue(Validator::isCreditCard('5641821939587682', 'switch'));
  643. $this->assertTrue(Validator::isCreditCard('4936097148079186', 'switch'));
  644. $this->assertTrue(Validator::isCreditCard('5641829739125009', 'switch'));
  645. $this->assertTrue(Validator::isCreditCard('5641822860725507', 'switch'));
  646. $this->assertTrue(Validator::isCreditCard('4936717688865831', 'switch'));
  647. $this->assertTrue(Validator::isCreditCard('6759487613615441', 'switch'));
  648. $this->assertTrue(Validator::isCreditCard('5641821346840617', 'switch'));
  649. $this->assertTrue(Validator::isCreditCard('5641825793417126', 'switch'));
  650. $this->assertTrue(Validator::isCreditCard('5641821302759595', 'switch'));
  651. $this->assertTrue(Validator::isCreditCard('6759784969918837', 'switch'));
  652. $this->assertTrue(Validator::isCreditCard('5641824910667036', 'switch'));
  653. $this->assertTrue(Validator::isCreditCard('6759139909636173', 'switch'));
  654. $this->assertTrue(Validator::isCreditCard('6333425070638022', 'switch'));
  655. $this->assertTrue(Validator::isCreditCard('5641823910382067', 'switch'));
  656. $this->assertTrue(Validator::isCreditCard('4936295218139423', 'switch'));
  657. $this->assertTrue(Validator::isCreditCard('6333031811316199', 'switch'));
  658. $this->assertTrue(Validator::isCreditCard('4936912044763198', 'switch'));
  659. $this->assertTrue(Validator::isCreditCard('4936387053303824', 'switch'));
  660. $this->assertTrue(Validator::isCreditCard('6759535838760523', 'switch'));
  661. $this->assertTrue(Validator::isCreditCard('6333427174594051', 'switch'));
  662. $this->assertTrue(Validator::isCreditCard('5641829037102700', 'switch'));
  663. $this->assertTrue(Validator::isCreditCard('5641826495463046', 'switch'));
  664. $this->assertTrue(Validator::isCreditCard('6333480852979946', 'switch'));
  665. $this->assertTrue(Validator::isCreditCard('5641827761302876', 'switch'));
  666. $this->assertTrue(Validator::isCreditCard('5641825083505317', 'switch'));
  667. $this->assertTrue(Validator::isCreditCard('6759298096003991', 'switch'));
  668. $this->assertTrue(Validator::isCreditCard('4936119165483420', 'switch'));
  669. $this->assertTrue(Validator::isCreditCard('4936190990500993', 'switch'));
  670. $this->assertTrue(Validator::isCreditCard('4903356467384927', 'switch'));
  671. $this->assertTrue(Validator::isCreditCard('6333372765092554', 'switch'));
  672. $this->assertTrue(Validator::isCreditCard('5641821330950570', 'switch'));
  673. $this->assertTrue(Validator::isCreditCard('6759841558826118', 'switch'));
  674. $this->assertTrue(Validator::isCreditCard('4936164540922452', 'switch'));
  675. /**
  676. * Switch 18
  677. */
  678. $this->assertTrue(Validator::isCreditCard('493622764224625174', 'switch'));
  679. $this->assertTrue(Validator::isCreditCard('564182823396913535', 'switch'));
  680. $this->assertTrue(Validator::isCreditCard('675917308304801234', 'switch'));
  681. $this->assertTrue(Validator::isCreditCard('675919890024220298', 'switch'));
  682. $this->assertTrue(Validator::isCreditCard('633308376862556751', 'switch'));
  683. $this->assertTrue(Validator::isCreditCard('564182377633208779', 'switch'));
  684. $this->assertTrue(Validator::isCreditCard('564182870014926787', 'switch'));
  685. $this->assertTrue(Validator::isCreditCard('675979788553829819', 'switch'));
  686. $this->assertTrue(Validator::isCreditCard('493668394358130935', 'switch'));
  687. $this->assertTrue(Validator::isCreditCard('493637431790930965', 'switch'));
  688. $this->assertTrue(Validator::isCreditCard('633321438601941513', 'switch'));
  689. $this->assertTrue(Validator::isCreditCard('675913800898840986', 'switch'));
  690. $this->assertTrue(Validator::isCreditCard('564182592016841547', 'switch'));
  691. $this->assertTrue(Validator::isCreditCard('564182428380440899', 'switch'));
  692. $this->assertTrue(Validator::isCreditCard('493696376827623463', 'switch'));
  693. $this->assertTrue(Validator::isCreditCard('675977939286485757', 'switch'));
  694. $this->assertTrue(Validator::isCreditCard('490302699502091579', 'switch'));
  695. $this->assertTrue(Validator::isCreditCard('564182085013662230', 'switch'));
  696. $this->assertTrue(Validator::isCreditCard('493693054263310167', 'switch'));
  697. $this->assertTrue(Validator::isCreditCard('633321755966697525', 'switch'));
  698. $this->assertTrue(Validator::isCreditCard('675996851719732811', 'switch'));
  699. $this->assertTrue(Validator::isCreditCard('493699211208281028', 'switch'));
  700. $this->assertTrue(Validator::isCreditCard('493697817378356614', 'switch'));
  701. $this->assertTrue(Validator::isCreditCard('675968224161768150', 'switch'));
  702. $this->assertTrue(Validator::isCreditCard('493669416873337627', 'switch'));
  703. $this->assertTrue(Validator::isCreditCard('564182439172549714', 'switch'));
  704. $this->assertTrue(Validator::isCreditCard('675926914467673598', 'switch'));
  705. $this->assertTrue(Validator::isCreditCard('564182565231977809', 'switch'));
  706. $this->assertTrue(Validator::isCreditCard('675966282607849002', 'switch'));
  707. $this->assertTrue(Validator::isCreditCard('493691609704348548', 'switch'));
  708. $this->assertTrue(Validator::isCreditCard('675933118546065120', 'switch'));
  709. $this->assertTrue(Validator::isCreditCard('493631116677238592', 'switch'));
  710. $this->assertTrue(Validator::isCreditCard('675921142812825938', 'switch'));
  711. $this->assertTrue(Validator::isCreditCard('633338311815675113', 'switch'));
  712. $this->assertTrue(Validator::isCreditCard('633323539867338621', 'switch'));
  713. $this->assertTrue(Validator::isCreditCard('675964912740845663', 'switch'));
  714. $this->assertTrue(Validator::isCreditCard('633334008833727504', 'switch'));
  715. $this->assertTrue(Validator::isCreditCard('493631941273687169', 'switch'));
  716. $this->assertTrue(Validator::isCreditCard('564182971729706785', 'switch'));
  717. $this->assertTrue(Validator::isCreditCard('633303461188963496', 'switch'));
  718. /**
  719. * Switch 19
  720. */
  721. $this->assertTrue(Validator::isCreditCard('6759603460617628716', 'switch'));
  722. $this->assertTrue(Validator::isCreditCard('4936705825268647681', 'switch'));
  723. $this->assertTrue(Validator::isCreditCard('5641829846600479183', 'switch'));
  724. $this->assertTrue(Validator::isCreditCard('6759389846573792530', 'switch'));
  725. $this->assertTrue(Validator::isCreditCard('4936189558712637603', 'switch'));
  726. $this->assertTrue(Validator::isCreditCard('5641822217393868189', 'switch'));
  727. $this->assertTrue(Validator::isCreditCard('4903075563780057152', 'switch'));
  728. $this->assertTrue(Validator::isCreditCard('4936510653566569547', 'switch'));
  729. $this->assertTrue(Validator::isCreditCard('4936503083627303364', 'switch'));
  730. $this->assertTrue(Validator::isCreditCard('4936777334398116272', 'switch'));
  731. $this->assertTrue(Validator::isCreditCard('5641823876900554860', 'switch'));
  732. $this->assertTrue(Validator::isCreditCard('6759619236903407276', 'switch'));
  733. $this->assertTrue(Validator::isCreditCard('6759011470269978117', 'switch'));
  734. $this->assertTrue(Validator::isCreditCard('6333175833997062502', 'switch'));
  735. $this->assertTrue(Validator::isCreditCard('6759498728789080439', 'switch'));
  736. $this->assertTrue(Validator::isCreditCard('4903020404168157841', 'switch'));
  737. $this->assertTrue(Validator::isCreditCard('6759354334874804313', 'switch'));
  738. $this->assertTrue(Validator::isCreditCard('6759900856420875115', 'switch'));
  739. $this->assertTrue(Validator::isCreditCard('5641827269346868860', 'switch'));
  740. $this->assertTrue(Validator::isCreditCard('5641828995047453870', 'switch'));
  741. $this->assertTrue(Validator::isCreditCard('6333321884754806543', 'switch'));
  742. $this->assertTrue(Validator::isCreditCard('6333108246283715901', 'switch'));
  743. $this->assertTrue(Validator::isCreditCard('6759572372800700102', 'switch'));
  744. $this->assertTrue(Validator::isCreditCard('4903095096797974933', 'switch'));
  745. $this->assertTrue(Validator::isCreditCard('6333354315797920215', 'switch'));
  746. $this->assertTrue(Validator::isCreditCard('6759163746089433755', 'switch'));
  747. $this->assertTrue(Validator::isCreditCard('6759871666634807647', 'switch'));
  748. $this->assertTrue(Validator::isCreditCard('5641827883728575248', 'switch'));
  749. $this->assertTrue(Validator::isCreditCard('4936527975051407847', 'switch'));
  750. $this->assertTrue(Validator::isCreditCard('5641823318396882141', 'switch'));
  751. $this->assertTrue(Validator::isCreditCard('6759123772311123708', 'switch'));
  752. $this->assertTrue(Validator::isCreditCard('4903054736148271088', 'switch'));
  753. $this->assertTrue(Validator::isCreditCard('4936477526808883952', 'switch'));
  754. $this->assertTrue(Validator::isCreditCard('4936433964890967966', 'switch'));
  755. $this->assertTrue(Validator::isCreditCard('6333245128906049344', 'switch'));
  756. $this->assertTrue(Validator::isCreditCard('4936321036970553134', 'switch'));
  757. $this->assertTrue(Validator::isCreditCard('4936111816358702773', 'switch'));
  758. $this->assertTrue(Validator::isCreditCard('4936196077254804290', 'switch'));
  759. $this->assertTrue(Validator::isCreditCard('6759558831206830183', 'switch'));
  760. $this->assertTrue(Validator::isCreditCard('5641827998830403137', 'switch'));
  761. $this->assertFalse(Validator::isCreditCard('4024007174754', 'switch'));
  762. /**
  763. * Visa 13 digit
  764. */
  765. $this->assertTrue(Validator::isCreditCard('4024007174754', 'visa'));
  766. $this->assertTrue(Validator::isCreditCard('4104816460717', 'visa'));
  767. $this->assertTrue(Validator::isCreditCard('4716229700437', 'visa'));
  768. $this->assertTrue(Validator::isCreditCard('4539305400213', 'visa'));
  769. $this->assertTrue(Validator::isCreditCard('4728260558665', 'visa'));
  770. $this->assertTrue(Validator::isCreditCard('4929100131792', 'visa'));
  771. $this->assertTrue(Validator::isCreditCard('4024007117308', 'visa'));
  772. $this->assertTrue(Validator::isCreditCard('4539915491024', 'visa'));
  773. $this->assertTrue(Validator::isCreditCard('4539790901139', 'visa'));
  774. $this->assertTrue(Validator::isCreditCard('4485284914909', 'visa'));
  775. $this->assertTrue(Validator::isCreditCard('4782793022350', 'visa'));
  776. $this->assertTrue(Validator::isCreditCard('4556899290685', 'visa'));
  777. $this->assertTrue(Validator::isCreditCard('4024007134774', 'visa'));
  778. $this->assertTrue(Validator::isCreditCard('4333412341316', 'visa'));
  779. $this->assertTrue(Validator::isCreditCard('4539534204543', 'visa'));
  780. $this->assertTrue(Validator::isCreditCard('4485640373626', 'visa'));
  781. $this->assertTrue(Validator::isCreditCard('4929911445746', 'visa'));
  782. $this->assertTrue(Validator::isCreditCard('4539292550806', 'visa'));
  783. $this->assertTrue(Validator::isCreditCard('4716523014030', 'visa'));
  784. $this->assertTrue(Validator::isCreditCard('4024007125152', 'visa'));
  785. $this->assertTrue(Validator::isCreditCard('4539758883311', 'visa'));
  786. $this->assertTrue(Validator::isCreditCard('4024007103258', 'visa'));
  787. $this->assertTrue(Validator::isCreditCard('4916933155767', 'visa'));
  788. $this->assertTrue(Validator::isCreditCard('4024007159672', 'visa'));
  789. $this->assertTrue(Validator::isCreditCard('4716935544871', 'visa'));
  790. $this->assertTrue(Validator::isCreditCard('4929415177779', 'visa'));
  791. $this->assertTrue(Validator::isCreditCard('4929748547896', 'visa'));
  792. $this->assertTrue(Validator::isCreditCard('4929153468612', 'visa'));
  793. $this->assertTrue(Validator::isCreditCard('4539397132104', 'visa'));
  794. $this->assertTrue(Validator::isCreditCard('4485293435540', 'visa'));
  795. $this->assertTrue(Validator::isCreditCard('4485799412720', 'visa'));
  796. $this->assertTrue(Validator::isCreditCard('4916744757686', 'visa'));
  797. $this->assertTrue(Validator::isCreditCard('4556475655426', 'visa'));
  798. $this->assertTrue(Validator::isCreditCard('4539400441625', 'visa'));
  799. $this->assertTrue(Validator::isCreditCard('4485437129173', 'visa'));
  800. $this->assertTrue(Validator::isCreditCard('4716253605320', 'visa'));
  801. $this->assertTrue(Validator::isCreditCard('4539366156589', 'visa'));
  802. $this->assertTrue(Validator::isCreditCard('4916498061392', 'visa'));
  803. $this->assertTrue(Validator::isCreditCard('4716127163779', 'visa'));
  804. $this->assertTrue(Validator::isCreditCard('4024007183078', 'visa'));
  805. $this->assertTrue(Validator::isCreditCard('4041553279654', 'visa'));
  806. $this->assertTrue(Validator::isCreditCard('4532380121960', 'visa'));
  807. $this->assertTrue(Validator::isCreditCard('4485906062491', 'visa'));
  808. $this->assertTrue(Validator::isCreditCard('4539365115149', 'visa'));
  809. $this->assertTrue(Validator::isCreditCard('4485146516702', 'visa'));
  810. /**
  811. * Visa 16 digit
  812. */
  813. $this->assertTrue(Validator::isCreditCard('4916375389940009', 'visa'));
  814. $this->assertTrue(Validator::isCreditCard('4929167481032610', 'visa'));
  815. $this->assertTrue(Validator::isCreditCard('4485029969061519', 'visa'));
  816. $this->assertTrue(Validator::isCreditCard('4485573845281759', 'visa'));
  817. $this->assertTrue(Validator::isCreditCard('4485669810383529', 'visa'));
  818. $this->assertTrue(Validator::isCreditCard('4929615806560327', 'visa'));
  819. $this->assertTrue(Validator::isCreditCard('4556807505609535', 'visa'));
  820. $this->assertTrue(Validator::isCreditCard('4532611336232890', 'visa'));
  821. $this->assertTrue(Validator::isCreditCard('4532201952422387', 'visa'));
  822. $this->assertTrue(Validator::isCreditCard('4485073797976290', 'visa'));
  823. $this->assertTrue(Validator::isCreditCard('4024007157580969', 'visa'));
  824. $this->assertTrue(Validator::isCreditCard('4053740470212274', 'visa'));
  825. $this->assertTrue(Validator::isCreditCard('4716265831525676', 'visa'));
  826. $this->assertTrue(Validator::isCreditCard('4024007100222966', 'visa'));
  827. $this->assertTrue(Validator::isCreditCard('4539556148303244', 'visa'));
  828. $this->assertTrue(Validator::isCreditCard('4532449879689709', 'visa'));
  829. $this->assertTrue(Validator::isCreditCard('4916805467840986', 'visa'));
  830. $this->assertTrue(Validator::isCreditCard('4532155644440233', 'visa'));
  831. $this->assertTrue(Validator::isCreditCard('4467977802223781', 'visa'));
  832. $this->assertTrue(Validator::isCreditCard('4539224637000686', 'visa'));
  833. $this->assertTrue(Validator::isCreditCard('4556629187064965', 'visa'));
  834. $this->assertTrue(Validator::isCreditCard('4532970205932943', 'visa'));
  835. $this->assertTrue(Validator::isCreditCard('4821470132041850', 'visa'));
  836. $this->assertTrue(Validator::isCreditCard('4916214267894485', 'visa'));
  837. $this->assertTrue(Validator::isCreditCard('4024007169073284', 'visa'));
  838. $this->assertTrue(Validator::isCreditCard('4716783351296122', 'visa'));
  839. $this->assertTrue(Validator::isCreditCard('4556480171913795', 'visa'));
  840. $this->assertTrue(Validator::isCreditCard('4929678411034997', 'visa'));
  841. $this->assertTrue(Validator::isCreditCard('4682061913519392', 'visa'));
  842. $this->assertTrue(Validator::isCreditCard('4916495481746474', 'visa'));
  843. $this->assertTrue(Validator::isCreditCard('4929007108460499', 'visa'));
  844. $this->assertTrue(Validator::isCreditCard('4539951357838586', 'visa'));
  845. $this->assertTrue(Validator::isCreditCard('4716482691051558', 'visa'));
  846. $this->assertTrue(Validator::isCreditCard('4916385069917516', 'visa'));
  847. $this->assertTrue(Validator::isCreditCard('4929020289494641', 'visa'));
  848. $this->assertTrue(Validator::isCreditCard('4532176245263774', 'visa'));
  849. $this->assertTrue(Validator::isCreditCard('4556242273553949', 'visa'));
  850. $this->assertTrue(Validator::isCreditCard('4481007485188614', 'visa'));
  851. $this->assertTrue(Validator::isCreditCard('4716533372139623', 'visa'));
  852. $this->assertTrue(Validator::isCreditCard('4929152038152632', 'visa'));
  853. $this->assertTrue(Validator::isCreditCard('4539404037310550', 'visa'));
  854. $this->assertTrue(Validator::isCreditCard('4532800925229140', 'visa'));
  855. $this->assertTrue(Validator::isCreditCard('4916845885268360', 'visa'));
  856. $this->assertTrue(Validator::isCreditCard('4394514669078434', 'visa'));
  857. $this->assertTrue(Validator::isCreditCard('4485611378115042', 'visa'));
  858. $this->assertFalse(Validator::isCreditCard('869940697287073', 'visa'));
  859. /**
  860. * Visa Electron
  861. */
  862. $this->assertTrue(Validator::isCreditCard('4175003346287100', 'electron'));
  863. $this->assertTrue(Validator::isCreditCard('4913042516577228', 'electron'));
  864. $this->assertTrue(Validator::isCreditCard('4917592325659381', 'electron'));
  865. $this->assertTrue(Validator::isCreditCard('4917084924450511', 'electron'));
  866. $this->assertTrue(Validator::isCreditCard('4917994610643999', 'electron'));
  867. $this->assertTrue(Validator::isCreditCard('4175005933743585', 'electron'));
  868. $this->assertTrue(Validator::isCreditCard('4175008373425044', 'electron'));
  869. $this->assertTrue(Validator::isCreditCard('4913119763664154', 'electron'));
  870. $this->assertTrue(Validator::isCreditCard('4913189017481812', 'electron'));
  871. $this->assertTrue(Validator::isCreditCard('4913085104968622', 'electron'));
  872. $this->assertTrue(Validator::isCreditCard('4175008803122021', 'electron'));
  873. $this->assertTrue(Validator::isCreditCard('4913294453962489', 'electron'));
  874. $this->assertTrue(Validator::isCreditCard('4175009797419290', 'electron'));
  875. $this->assertTrue(Validator::isCreditCard('4175005028142917', 'electron'));
  876. $this->assertTrue(Validator::isCreditCard('4913940802385364', 'electron'));
  877. $this->assertFalse(Validator::isCreditCard('869940697287073', 'electron'));
  878. /**
  879. * Voyager
  880. */
  881. $this->assertTrue(Validator::isCreditCard('869940697287073', 'voyager'));
  882. $this->assertTrue(Validator::isCreditCard('869934523596112', 'voyager'));
  883. $this->assertTrue(Validator::isCreditCard('869958670174621', 'voyager'));
  884. $this->assertTrue(Validator::isCreditCard('869921250068209', 'voyager'));
  885. $this->assertTrue(Validator::isCreditCard('869972521242198', 'voyager'));
  886. $this->assertFalse(Validator::isCreditCard('370482756063980', 'voyager'));
  887. $this->assertTrue(Validator::isLuhn('869972521242198'));
  888. $this->assertFalse(Validator::isLuhn(false));
  889. $this->assertFalse(Validator::isLuhn(null));
  890. $this->assertFalse(Validator::isLuhn(''));
  891. $this->assertFalse(Validator::isLuhn(true));
  892. }
  893. public function testCheckHasErrors() {
  894. $rules = array('title' => array('please enter a title'));
  895. $result = Validator::check(array(), $rules);
  896. $this->assertFalse(empty($result));
  897. $expected = array('title' => array('please enter a title'));
  898. $this->assertEqual($expected, $result);
  899. }
  900. public function testCheckPasses() {
  901. $rules = array('title' => 'please enter a title');
  902. $data = array('title' => 'new title');
  903. $result = Validator::check($data, $rules);
  904. $this->assertTrue(empty($result));
  905. }
  906. public function testCheckSkipEmpty() {
  907. $rules = array(
  908. 'email' => array('email', 'skipEmpty' => true, 'message' => 'email is not valid')
  909. );
  910. // empty string should pass
  911. $data = array('email' => '');
  912. $result = Validator::check($data, $rules);
  913. $this->assertTrue(empty($result));
  914. // null value should pass
  915. $data = array('email' => null);
  916. $result = Validator::check($data, $rules);
  917. $this->assertTrue(empty($result));
  918. // string with spaces should NOT pass
  919. $data = array('email' => ' ');
  920. $result = Validator::check($data, $rules);
  921. $this->assertFalse(empty($result));
  922. }
  923. public function testCheckMultipleHasErrors() {
  924. $rules = array(
  925. 'title' => 'please enter a title',
  926. 'email' => array(
  927. array('notEmpty', 'message' => 'email is empty'),
  928. array('email', 'message' => 'email is not valid')
  929. )
  930. );
  931. $result = Validator::check(array(), $rules);
  932. $this->assertFalse(empty($result));
  933. $expected = array(
  934. 'title' => array('please enter a title'),
  935. 'email' => array('email is empty', 'email is not valid')
  936. );
  937. $this->assertEqual($expected, $result);
  938. }
  939. public function testCheckWithLastRule() {
  940. $rules = array(
  941. 'title' => array('please enter a title'),
  942. 'email' => array(
  943. array('notEmpty', 'message' => 'email is empty', 'last' => true),
  944. array('email', 'message' => 'email is invalid')
  945. )
  946. );
  947. $result = Validator::check(array(), $rules);
  948. $this->assertFalse(empty($result));
  949. $expected = array(
  950. 'title' => array('title is empty'),
  951. 'email' => array('email is empty')
  952. );
  953. $this->assertEqual($expected, $result);
  954. }
  955. public function testCheckMultipleHasFirstError() {
  956. $rules = array(
  957. 'title' => 'please enter a title',
  958. 'email' => array(
  959. array('notEmpty', 'message' => 'email is empty'),
  960. array('email', 'message' => 'email is not valid')
  961. )
  962. );
  963. $data = array('email' => 'something');
  964. $result = Validator::check($data, $rules);
  965. // result:
  966. $errors = array(
  967. 'title' => array('please enter a title'),
  968. 'email' => array('email is not valid')
  969. );
  970. $this->assertFalse(empty($result));
  971. $this->assertEqual($errors, $result);
  972. }
  973. public function testCheckMultipleHasOneError() {
  974. $rules = array(
  975. 'title' => 'please enter a title',
  976. 'email' => array(
  977. array('notEmpty', 'message' => 'email is empty'),
  978. array('email', 'message' => 'email is not valid')
  979. )
  980. );
  981. $data = array('title' => 'new title', 'email' => 'something');
  982. $result = Validator::check($data, $rules);
  983. $this->assertFalse(empty($result));
  984. $expected = array('email' => array('email is not valid'));
  985. $this->assertEqual($expected, $result);
  986. }
  987. public function testCheckMultiplePasses() {
  988. $rules = array(
  989. 'title' => 'please enter a title',
  990. 'email' => array(
  991. array('notEmpty', 'message' => 'email is empty'),
  992. array('email', 'message' => 'email is not valid')
  993. )
  994. );
  995. $data = array('title' => 'new title', 'email' => '[email protected]');
  996. $result = Validator::check($data, $rules);
  997. $this->assertTrue(empty($result));
  998. $expected = array();
  999. $this->assertEqual($expected, $result);
  1000. }
  1001. public function testIsInRange() {
  1002. $lower = 1;
  1003. $upper = 10;
  1004. $value = 0;
  1005. $result = Validator::isInRange($value, null, compact('lower', 'upper'));
  1006. $this->assertFalse($result);
  1007. $value = 1;
  1008. $result = Validator::isInRange($value, null, compact('lower', 'upper'));
  1009. $this->assertTrue($result);
  1010. $value = 5;
  1011. $result = Validator::isInRange($value, null, compact('lower', 'upper'));
  1012. $this->assertTrue($result);
  1013. $value = 10;
  1014. $result = Validator::isInRange($value, null, compact('lower', 'upper'));
  1015. $this->assertTrue($result);
  1016. $value = 11;
  1017. $result = Validator::isInRange($value, null, compact('lower', 'upper'));
  1018. $this->assertFalse($result);
  1019. $result = Validator::isInRange(-1, null, array('upper' => 1));
  1020. $this->assertTrue($result);
  1021. $result = Validator::isInRange(1, null, array('upper' => 1));
  1022. $this->assertTrue($result);
  1023. $result = Validator::isInRange(2, null, array('upper' => 1));
  1024. $this->assertFalse($result);
  1025. $result = Validator::isInRange(2, null, array('lower' => 1));
  1026. $this->assertTrue($result);
  1027. $result = Validator::isInRange(1, null, array('lower' => 1));
  1028. $this->assertTrue($result);
  1029. $result = Validator::isInRange(0, null, array('lower' => 1));
  1030. $this->assertFalse($result);
  1031. $this->assertTrue(Validator::isInRange(0));
  1032. }
  1033. public function testValidationWithContextData() {
  1034. Validator::add('someModelRule', function($value, $format, $options) {
  1035. return $value === 'Title' && $options['values']['body'] === 'Body';
  1036. });
  1037. $result = Validator::check(
  1038. array('title' => 'Title', 'body' => 'Body'),
  1039. array('title' => array('someModelRule'))
  1040. );
  1041. $this->assertIdentical(array(), $result);
  1042. $result = Validator::check(
  1043. array('title' => 'Title', 'body' => 'Not Body'),
  1044. array('title' => array('someModelRule'))
  1045. );
  1046. $this->assertIdentical(array('title' => array(0)), $result);
  1047. }
  1048. /**
  1049. * Tests that event flags applied to rules only trigger when the corresponding event is passed
  1050. * in the `$options` parameter of `check()`.
  1051. */
  1052. public function testEvents() {
  1053. $rules = array('number' => array('numeric', 'message' => 'Badness!'));
  1054. $expected = array('number' => array('Badness!'));
  1055. $result = Validator::check(array('number' => 'o'), $rules);
  1056. $this->assertEqual($expected, $result);
  1057. $rules['number']['on'] = 'foo';
  1058. $result = Validator::check(array('number' => 'o'), $rules, array('events' => 'foo'));
  1059. $this->assertEqual($expected, $result);
  1060. $result = Validator::check(array('number' => 'o'), $rules, array('events' => 'bar'));
  1061. $this->assertEqual(array(), $result);
  1062. $result = Validator::check(array('number' => 'o'), $rules, array(
  1063. 'events' => array('foo', 'bar')
  1064. ));
  1065. $this->assertEqual($expected, $result);
  1066. $result = Validator::check(array('number' => 'o'), $rules, array(
  1067. 'events' => array('bar', 'baz')
  1068. ));
  1069. $this->assertEqual(array(), $result);
  1070. unset($rules['number']['on']);
  1071. $result = Validator::check(array('number' => 'o'), $rules, array('events' => 'foo'));
  1072. $this->assertEqual($expected, $result);
  1073. }
  1074. /**
  1075. * Tests validating nested fields using dot-separated paths.
  1076. */
  1077. public function testNestedFields() {
  1078. $rules = array(
  1079. 'id' => array('numeric', 'message' => 'Bad ID'),
  1080. 'profile.name' => "Can't be empty",
  1081. 'profile.email' => array('email', 'message' => 'Must be a valid email')
  1082. );
  1083. $data = array('id' => 1, 'profile' => array('email' => 'foo'));
  1084. $result = Validator::check($data, $rules);
  1085. $expected = array(
  1086. 'profile.name' => array("Can't be empty"),
  1087. 'profile.email' => array('Must be a valid email')
  1088. );
  1089. $this->assertEqual($expected, $result);
  1090. $data = array('id' => '.', 'profile' => array('email' => '[email protected]', 'name' => 'Bob'));
  1091. $result = Validator::check($data, $rules);
  1092. $this->assertEqual(array('id' => array('Bad ID')), $result);
  1093. }
  1094. public function testRespondsToParentCall() {
  1095. $this->assertTrue(Validator::respondsTo('applyFilter'));
  1096. $this->assertFalse(Validator::respondsTo('fooBarBaz'));
  1097. }
  1098. public function testRespondsToMagic() {
  1099. $this->assertTrue(Validator::respondsTo('isAlphaNumeric'));
  1100. $this->assertTrue(Validator::respondsTo('isCreditCard'));
  1101. $this->assertFalse(Validator::respondsTo('isFoobar'));
  1102. }
  1103. }
  1104. ?>