diff --git a/.gitignore b/.gitignore index 4a38432..a2330fd 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ composer.phar composer.lock vendor +.idea/ diff --git a/.travis.yml b/.travis.yml index a941551..e2c0986 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,21 +1,27 @@ # see http://about.travis-ci.org/docs/user/languages/php/ for more hints language: php -dist: precise # list any PHP version you want to test against php: - - 5.3 - 5.4 - 5.5 - 5.6 + - 7.0 + - 7.1 + - 7.2 + - nightly - hhvm matrix: allow_failures: - php: hhvm + - php: nightly + include: + - php: 5.3 + dist: precise before_script: - composer install # Script to run tests -script: ./vendor/bin/phpunit +script: composer test diff --git a/README.md b/README.md index c684bc5..0f7a8fc 100644 --- a/README.md +++ b/README.md @@ -133,12 +133,15 @@ V::lang('ar'); * `in` - Performs in_array check on given array values * `notIn` - Negation of `in` rule (not in array of values) * `ip` - Valid IP address + * `ipv4` - Valid IP v4 address + * `ipv6` - Valid IP v6 address * `email` - Valid email address * `emailDNS` - Valid email address with active DNS record * `url` - Valid URL * `urlActive` - Valid URL with active DNS record * `alpha` - Alphabetic characters only * `alphaNum` - Alphabetic and numeric characters only + * `ascii` - ASCII characters only * `slug` - URL slug characters (a-z, 0-9, -, \_) * `regex` - Field matches given regex pattern * `date` - Field is a valid date diff --git a/composer.json b/composer.json index 066dda7..30e5c96 100644 --- a/composer.json +++ b/composer.json @@ -16,11 +16,19 @@ "php": ">=5.3.2" }, "require-dev": { - "phpunit/phpunit": "~4.8.35" + "phpunit/phpunit": "^4.8.35 || ^5.5 || ^6.5" + }, + "suggest": { + "ext-mbstring": "It can support the multiple bytes string length." }, "autoload": { - "psr-0": { - "Valitron": "src/" + "psr-4": { + "Valitron\\": "src/Valitron" + } + }, + "autoload-dev": { + "psr-4": { + "Valitron\\": "tests/Valitron" } }, "scripts": { diff --git a/lang/ko.php b/lang/ko.php new file mode 100644 index 0000000..6b9ce78 --- /dev/null +++ b/lang/ko.php @@ -0,0 +1,34 @@ + "을(를) 입력해야 합니다.", + 'equals' => "은(는) '%s'와(과) 같아야 합니다.", + 'different' => "은(는) '%s'와(과) 달라야 합니다.", + 'accepted' => "을(를) 동의해야 합니다.", + 'numeric' => "은(는) 숫자여야 합니다.", + 'integer' => "은(는) 정수여야 합니다.", + 'length' => "의 길이는 %d 이어야 합니다.", + 'min' => "은(는) %s 이상이어야 합니다.", + 'max' => "은(는) %s 이하여야 합니다.", + 'in' => "은(는) 올바르지 않은 값을 포함하고 있습니다.", + 'notIn' => "은(는) 올바르지 않은 값을 포함하고 있습니다.", + 'ip' => "은(는) 올바르지 않은 IP입니다.", + 'email' => "은(는) 올바르지 않은 email입니다.", + 'url' => "은(는) 올바르지 않은 URL입니다.", + 'urlActive' => "은(는) 접속 가능한 도메인이어야 합니다.", + 'alpha' => "은(는) 영문자(a-z)로만 이루어져야 합니다.", + 'alphaNum' => "은(는) 영문자(a-z)와 숫자(0-9)로만 이루어져야 합니다.", + 'slug' => "은(는) 영문자(a-z)와 숫자(0-9), 특수문자 -와 _로만 이루어져야 합니다.", + 'regex' => "은(는) 올바르지 않은 문자를 포함하고 있습니다.", + 'date' => "은(는) 올바르지 않은 날짜입니다.", + 'dateFormat' => "은(는) '%s' 형태의 날짜여야 합니다.", + 'dateBefore' => "은(는) '%s' 보다 이전이어야 합니다.", + 'dateAfter' => "은(는) '%s' 보다 이후여야 합니다.", + 'contains' => "은(는) '%s'을(를) 포함해야 합니다.", + 'boolean' => "은(는) boolean이어야 합니다.", + 'lengthBetween' => "의 길이는 %d에서 %d 사이여야 합니다.", + 'creditCard' => "은(는) 올바른 신용카드 번호가 아닙니다.", + 'lengthMin' => "의 길이는 %d 이상이어야 합니다.", + 'lengthMax' => "의 길이는 %d을(를) 넘을 수 없습니다.", + 'instanceOf' => "는 '%s'의 객체여야 합니다." +); diff --git a/phpunit.xml b/phpunit.xml index 5693a09..f23518b 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -15,4 +15,12 @@ tests/Valitron + + + src/ + + + vendor/ + + diff --git a/src/Valitron/Validator.php b/src/Valitron/Validator.php index 79c4236..45c229d 100644 --- a/src/Valitron/Validator.php +++ b/src/Valitron/Validator.php @@ -1,4 +1,5 @@ 9) { @@ -777,7 +824,7 @@ class Validator $sum += $sub_total; } if ($sum > 0 && $sum % 10 == 0) { - return true; + return true; } return false; @@ -788,11 +835,11 @@ class Validator return true; } else { $cardRegex = array( - 'visa' => '#^4[0-9]{12}(?:[0-9]{3})?$#', - 'mastercard' => '#^(5[1-5]|2[2-7])[0-9]{14}$#', - 'amex' => '#^3[47][0-9]{13}$#', - 'dinersclub' => '#^3(?:0[0-5]|[68][0-9])[0-9]{11}$#', - 'discover' => '#^6(?:011|5[0-9]{2})[0-9]{12}$#', + 'visa' => '#^4[0-9]{12}(?:[0-9]{3})?$#', + 'mastercard' => '#^(5[1-5]|2[2-7])[0-9]{14}$#', + 'amex' => '#^3[47][0-9]{13}$#', + 'dinersclub' => '#^3(?:0[0-5]|[68][0-9])[0-9]{11}$#', + 'discover' => '#^6(?:011|5[0-9]{2})[0-9]{12}$#', ); if (isset($cardType)) { @@ -973,16 +1020,14 @@ class Validator return array(null, array_key_exists($identifier, $data)); } return array(null, false); - } - // Match array element + } // Match array element elseif (count($identifiers) === 0) { - if ($allow_empty){ + if ($allow_empty) { //when empty values are allowed, we only care if the key exists return array(null, array_key_exists($identifier, $data)); } - return array($data[$identifier], false); - } - // We need to go deeper + return array($data[$identifier], $allow_empty); + } // We need to go deeper else { return $this->getPart($data[$identifier], $identifiers, $allow_empty); } @@ -995,9 +1040,10 @@ class Validator */ public function validate() { + $set_to_break = false; foreach ($this->_validations as $v) { foreach ($v['fields'] as $field) { - list($values, $multiple) = $this->getPart($this->_fields, explode('.', $field)); + list($values, $multiple) = $this->getPart($this->_fields, explode('.', $field), false); // Don't validate if the field is not required and the value is empty if ($this->hasRule('optional', $field) && isset($values)) { @@ -1005,7 +1051,7 @@ class Validator } elseif ( $v['rule'] !== 'required' && !$this->hasRule('required', $field) && $v['rule'] !== 'accepted' && - (! isset($values) || $values === '' || ($multiple && count($values) == 0)) + (!isset($values) || $values === '' || ($multiple && count($values) == 0)) ) { continue; } @@ -1020,6 +1066,8 @@ class Validator if (!$multiple) { $values = array($values); + } else if (! $this->hasRule('required', $field)){ + $values = array_filter($values); } $result = true; @@ -1029,13 +1077,27 @@ class Validator if (!$result) { $this->error($field, $v['message'], $v['params']); + if ($this->stop_on_first_fail) { + $set_to_break = true; + break; + } } } + if ($set_to_break) break; } return count($this->errors()) === 0; } + /** + * Should the validation stop a rule is failed + * @param bool $stop + */ + public function stopOnFirstFail($stop = true) + { + $this->stop_on_first_fail = (bool)$stop; + } + /** * Returns all rule callbacks, the static and instance ones. * @@ -1169,7 +1231,8 @@ class Validator // Get any other arguments passed to function $params = array_slice(func_get_args(), 2); - if (is_callable($rule) && !(is_string($rule) && $this->hasValidator($rule))) { + if (is_callable($rule) + && !(is_string($rule) && $this->hasValidator($rule))) { $name = $this->getUniqueRuleName($fields); $message = isset($params[0]) ? $params[0] : null; $this->addInstanceRule($name, $rule, $message); @@ -1330,7 +1393,7 @@ class Validator if (!empty($message)) { $added->message($message); } - }, (array) $rules); + }, (array)$rules); } /** diff --git a/tests/Valitron/StopOnFirstFailTest.php b/tests/Valitron/StopOnFirstFailTest.php new file mode 100644 index 0000000..656427d --- /dev/null +++ b/tests/Valitron/StopOnFirstFailTest.php @@ -0,0 +1,28 @@ + array( + array('lengthMin', 5, 'message'=>'myField1 must be 5 characters minimum'), + array('url', 'message' => 'myField1 is not a valid url'), + array('urlActive', 'message' => 'myField1 is not an active url') + ) + ); + + $v = new Validator(array( + 'myField1' => 'myVal' + )); + + $v->mapFieldsRules($rules); + $v->stopOnFirstFail(true); + $this->assertFalse($v->validate()); + + $errors = $v->errors(); + $this->assertCount(1, $errors['myField1']); + } + +} diff --git a/tests/Valitron/ValidateTest.php b/tests/Valitron/ValidateTest.php index 469cef3..c74697f 100644 --- a/tests/Valitron/ValidateTest.php +++ b/tests/Valitron/ValidateTest.php @@ -1,4 +1,5 @@ assertEquals($v->data(), array('foo' => 'bar')); } - public function testAccurateErrorCount() + public function testAccurateErrorShouldReturnFalse() { $v = new Validator(array('name' => 'Chester Tester')); $v->rule('required', 'name'); - $this->assertSame(1, count($v->errors('name'))); + $this->assertFalse($v->errors('name')); } + public function testArrayOfFieldsToValidate() { $v = new Validator(array('name' => 'Chester Tester', 'email' => 'chester@tester.com')); @@ -158,7 +160,8 @@ class ValidateTest extends BaseTestCase $this->assertFalse($v->validate()); } - public function testAcceptedNotSet(){ + public function testAcceptedNotSet() + { $v = new Validator(); $v->rule('accepted', 'agree'); $this->assertFalse($v->validate()); @@ -189,25 +192,52 @@ class ValidateTest extends BaseTestCase $this->assertTrue($v->validate()); } - public function testIntegerStrict(){ + public function testIntegerStrict() + { $v = new Validator(array('num' => ' 41243')); $v->rule('integer', 'num'); $this->assertTrue($v->validate()); $v = new Validator(array('num' => ' 41243')); - $v->rule('integer', 'num', true); + $v->rule('integer', 'num', true); $this->assertFalse($v->validate()); $v = new Validator(array('num' => '+41243')); $v->rule('integer', 'num'); $this->assertTrue($v->validate()); - $v = new Validator(array('num' => '+41243')); $v->rule('integer', 'num', true); $this->assertFalse($v->validate()); + $v = new Validator(array('num' => '-1')); + $v->rule('integer', 'num', true); + $this->assertTrue($v->validate()); + + $v = new Validator(array('num' => '-0')); + $v->rule('integer', 'num', true); + $this->assertFalse($v->validate()); + + $v = new Validator(array('num' => '0')); + $v->rule('integer', 'num', true); + $this->assertTrue($v->validate()); + + $v = new Validator(array('num' => '+0')); + $v->rule('integer', 'num', true); + $this->assertFalse($v->validate()); + + $v = new Validator(array('num' => '+1')); + $v->rule('integer', 'num', true); + $this->assertFalse($v->validate()); + + $v = new Validator(array('num' => '0123')); + $v->rule('integer', 'num', true); + $this->assertFalse($v->validate()); + + $v = new Validator(array('num' => '-0123')); + $v->rule('integer', 'num', true); + $this->assertFalse($v->validate()); } public function testIntegerInvalid() @@ -216,7 +246,6 @@ class ValidateTest extends BaseTestCase $v->rule('integer', 'num'); $this->assertFalse($v->validate()); - $v = new Validator(array('num' => '--1231')); $v->rule('integer', 'num'); $this->assertFalse($v->validate()); @@ -592,6 +621,20 @@ class ValidateTest extends BaseTestCase $this->assertFalse($v->validate()); } + public function testAsciiValid() + { + $v = new Validator(array('text' => '12345 abcde')); + $v->rule('ascii', 'text'); + $this->assertTrue($v->validate()); + } + + public function testAsciiInvalid() + { + $v = new Validator(array('text' => '12345 abcdé')); + $v->rule('ascii', 'text'); + $this->assertFalse($v->validate()); + } + public function testIpValid() { $v = new Validator(array('ip' => '127.0.0.1')); @@ -606,6 +649,34 @@ class ValidateTest extends BaseTestCase $this->assertFalse($v->validate()); } + public function testIpv4Valid() + { + $v = new Validator(array('ip' => '127.0.0.1')); + $v->rule('ipv4', 'ip'); + $this->assertTrue($v->validate()); + } + + public function testIpv4Invalid() + { + $v = new Validator(array('ip' => 'FE80::0202:B3FF:FE1E:8329')); + $v->rule('ipv4', 'ip'); + $this->assertFalse($v->validate()); + } + + public function testIpv6Valid() + { + $v = new Validator(array('ip' => 'FE80::0202:B3FF:FE1E:8329')); + $v->rule('ipv6', 'ip'); + $this->assertTrue($v->validate()); + } + + public function testIpv6Invalid() + { + $v = new Validator(array('ip' => '127.0.0.1')); + $v->rule('ipv6', 'ip'); + $this->assertFalse($v->validate()); + } + public function testEmailValid() { $v = new Validator(array('name' => 'Chester Tester', 'email' => 'chester@tester.com')); @@ -620,13 +691,15 @@ class ValidateTest extends BaseTestCase $this->assertFalse($v->validate()); } - public function testEmailDnsValid(){ + public function testEmailDnsValid() + { $v = new Validator(array('name' => 'Chester Tester', 'email' => 'chester@tester.com')); $v->rule('emailDNS', 'email'); $this->assertTrue($v->validate()); } - public function testEmailDnsInvalid(){ + public function testEmailDnsInvalid() + { $v = new Validator(array('name' => 'Chester Tester', 'email' => 'chester@tester.zyx')); $v->rule('emailDNS', 'email'); $this->assertFalse($v->validate()); @@ -793,7 +866,7 @@ class ValidateTest extends BaseTestCase $v->rule( 'dateBefore', 'endDate', - new DateTime('2013-04-08') + new DateTime('2013-04-08') )->label('End date')->message('{field} must be before the end of the fiscal year, %s.'); $v->rule( @@ -955,7 +1028,7 @@ class ValidateTest extends BaseTestCase $rules = array( 'required' => 'nonexistent_field', 'accepted' => 'foo', - 'integer' => 'foo' + 'integer' => 'foo' ); $v1 = new Validator(array('foo' => 'bar', 'bar' => 'baz')); @@ -1001,7 +1074,7 @@ class ValidateTest extends BaseTestCase public function testAcceptBulkRulesWithNestedRules() { $rules = array( - 'length' => array( + 'length' => array( array('foo', 5), array('bar', 5) ) @@ -1022,7 +1095,7 @@ class ValidateTest extends BaseTestCase public function testAcceptBulkRulesWithNestedRulesAndMultipleFields() { $rules = array( - 'length' => array( + 'length' => array( array(array('foo', 'bar'), 5), array('baz', 5) ) @@ -1043,7 +1116,7 @@ class ValidateTest extends BaseTestCase public function testAcceptBulkRulesWithMultipleArrayParams() { $rules = array( - 'in' => array( + 'in' => array( array(array('foo', 'bar'), array('x', 'y')) ) ); @@ -1059,15 +1132,16 @@ class ValidateTest extends BaseTestCase $this->assertEquals($v1->errors(), $v2->errors()); } - public function testMalformedBulkRules(){ - $v = new Validator(); - $v->rules( - array( - 'required'=>array('foo', 'bar') - ) - ); + public function testMalformedBulkRules() + { + $v = new Validator(); + $v->rules( + array( + 'required' => array('foo', 'bar') + ) + ); - $this->assertFalse($v->validate()); + $this->assertFalse($v->validate()); } public function testCustomLabelInMessage() @@ -1083,30 +1157,30 @@ class ValidateTest extends BaseTestCase $v = new Valitron\Validator(array()); $v->rule('required', array('name', 'email'))->message('{field} is required'); $v->labels(array( - 'name' => 'Name', - 'email' => 'Email address' + 'name' => 'Name', + 'email' => 'Email address' )); $v->validate(); $this->assertEquals(array( - 'name' => array('Name is required'), - 'email' => array('Email address is required') + 'name' => array('Name is required'), + 'email' => array('Email address is required') ), $v->errors()); } public function testCustomLabelArrayWithoutMessage() { $v = new Valitron\Validator(array( - 'password' => 'foo', - 'passwordConfirm' => 'bar' + 'password' => 'foo', + 'passwordConfirm' => 'bar' )); $v->rule('equals', 'password', 'passwordConfirm'); $v->labels(array( - 'password' => 'Password', - 'passwordConfirm' => 'Password Confirm' + 'password' => 'Password', + 'passwordConfirm' => 'Password Confirm' )); $v->validate(); $this->assertEquals(array( - 'password' => array("Password must be the same as 'Password Confirm'"), + 'password' => array("Password must be the same as 'Password Confirm'"), ), $v->errors()); } @@ -1117,7 +1191,9 @@ class ValidateTest extends BaseTestCase public function testAddRuleClosure() { $v = new Validator(array('name' => 'Chester Tester')); - $v->addRule('testRule', function() { return true; }); + $v->addRule('testRule', function () { + return true; + }); $v->rule('testRule', 'name'); $this->assertTrue($v->validate()); } @@ -1125,7 +1201,9 @@ class ValidateTest extends BaseTestCase public function testAddRuleClosureReturnsFalse() { $v = new Validator(array('name' => 'Chester Tester')); - $v->addRule('testRule', function() { return false; }); + $v->addRule('testRule', function () { + return false; + }); $v->rule('testRule', 'name'); $this->assertFalse($v->validate()); } @@ -1133,7 +1211,9 @@ class ValidateTest extends BaseTestCase public function testAddRuleClosureWithFieldArray() { $v = new Validator(array('name' => 'Chester Tester', 'email' => 'foo@example.com')); - $v->addRule('testRule', function() { return true; }); + $v->addRule('testRule', function () { + return true; + }); $v->rule('testRule', array('name', 'email')); $this->assertTrue($v->validate()); } @@ -1141,7 +1221,9 @@ class ValidateTest extends BaseTestCase public function testAddRuleClosureWithArrayAsExtraParameter() { $v = new Validator(array('name' => 'Chester Tester')); - $v->addRule('testRule', function() { return true; }); + $v->addRule('testRule', function () { + return true; + }); $v->rule('testRule', 'name', array('foo', 'bar')); $this->assertTrue($v->validate()); } @@ -1154,8 +1236,16 @@ class ValidateTest extends BaseTestCase $this->assertTrue($v->validate()); } - public function sampleObjectCallback() { return true; } - public function sampleObjectCallbackFalse() { return false; } + public function sampleObjectCallback() + { + return true; + } + + public function sampleObjectCallbackFalse() + { + return false; + } + public function testAddRuleCallbackArray() { $v = new Validator(array('name' => 'Chester Tester')); @@ -1219,14 +1309,14 @@ class ValidateTest extends BaseTestCase public function testCreditCardValid() { - $visa = array(4539511619543489, 4532949059629052, 4024007171194938, 4929646403373269, 4539135861690622); - $mastercard = array(5162057048081965, 5382687859049349, 5484388880142230, 5464941521226434, 5473481232685965, 2223000048400011, 2223520043560014); - $amex = array(371442067262027, 340743030537918, 345509167493596, 343665795576848, 346087552944316); - $dinersclub = array(30363194756249, 30160097740704, 38186521192206, 38977384214552, 38563220301454); - $discover = array(6011712400392605, 6011536340491809, 6011785775263015, 6011984124619056, 6011320958064251); + $visa = array(4539511619543489, 4532949059629052, 4024007171194938, 4929646403373269, 4539135861690622); + $mastercard = array(5162057048081965, 5382687859049349, 5484388880142230, 5464941521226434, 5473481232685965, 2223000048400011, 2223520043560014); + $amex = array(371442067262027, 340743030537918, 345509167493596, 343665795576848, 346087552944316); + $dinersclub = array(30363194756249, 30160097740704, 38186521192206, 38977384214552, 38563220301454); + $discover = array(6011712400392605, 6011536340491809, 6011785775263015, 6011984124619056, 6011320958064251); foreach (compact('visa', 'mastercard', 'amex', 'dinersclub', 'discover') as $type => $numbers) { - foreach($numbers as $number) { + foreach ($numbers as $number) { $v = new Validator(array('test' => $number)); $v->rule('creditCard', 'test'); $this->assertTrue($v->validate()); @@ -1243,14 +1333,14 @@ class ValidateTest extends BaseTestCase public function testCreditCardInvalid() { - $visa = array(3539511619543489, 3532949059629052, 3024007171194938, 3929646403373269, 3539135861690622); - $mastercard = array(4162057048081965, 4382687859049349, 4484388880142230, 4464941521226434, 4473481232685965); - $amex = array(271442067262027, 240743030537918, 245509167493596, 243665795576848, 246087552944316); - $dinersclub = array(20363194756249, 20160097740704, 28186521192206, 28977384214552, 28563220301454); - $discover = array(5011712400392605, 5011536340491809, 5011785775263015, 5011984124619056, 5011320958064251); + $visa = array(3539511619543489, 3532949059629052, 3024007171194938, 3929646403373269, 3539135861690622); + $mastercard = array(4162057048081965, 4382687859049349, 4484388880142230, 4464941521226434, 4473481232685965); + $amex = array(271442067262027, 240743030537918, 245509167493596, 243665795576848, 246087552944316); + $dinersclub = array(20363194756249, 20160097740704, 28186521192206, 28977384214552, 28563220301454); + $discover = array(5011712400392605, 5011536340491809, 5011785775263015, 5011984124619056, 5011320958064251); foreach (compact('visa', 'mastercard', 'amex', 'dinersclub', 'discover') as $type => $numbers) { - foreach($numbers as $number) { + foreach ($numbers as $number) { $v = new Validator(array('test' => $number)); $v->rule('creditCard', 'test'); $this->assertFalse($v->validate()); @@ -1349,29 +1439,29 @@ class ValidateTest extends BaseTestCase return array( array( 'expected' => 'Test must be at least 140 long', - 'input' => 'tweeet', - 'test' => array(140), - 'message' => '{field} must be at least %d long', + 'input' => 'tweeet', + 'test' => array(140), + 'message' => '{field} must be at least %d long', ), array( 'expected' => 'Test must be between 1 and 140 characters', - 'input' => array(1, 2, 3), - 'test' => array(1, 140), - 'message' => 'Test must be between %d and %d characters', + 'input' => array(1, 2, 3), + 'test' => array(1, 140), + 'message' => 'Test must be between %d and %d characters', ), ); } public function testOptionalProvidedValid() { - $v = new Validator(array('address' => 'user@example.com')); + $v = new Validator(array('address' => 'user@example.com')); $v->rule('optional', 'address')->rule('email', 'address'); $this->assertTrue($v->validate()); } public function testOptionalProvidedInvalid() { - $v = new Validator(array('address' => 'userexample.com')); + $v = new Validator(array('address' => 'userexample.com')); $v->rule('optional', 'address')->rule('email', 'address'); $this->assertFalse($v->validate()); } @@ -1522,6 +1612,38 @@ class ValidateTest extends BaseTestCase $this->assertFalse($v->validate()); } + /** + * @see https://github.com/vlucas/valitron/issues/262 + */ + public function testOptionalArrayPartsAreIgnored() + { + $v = new Validator(array( + 'data' => array( + array('foo' => '2018-01-01'), + array('bar' => 1) + ) + ) + ); + $v->rule('date', 'data.*.foo'); + $this->assertTrue($v->validate()); + } + + /** + * @see https://github.com/vlucas/valitron/issues/262 + */ + public function testRequiredArrayPartsAreNotIgnored() + { + $v = new Validator(array( + 'data' => array( + array('foo' => '2018-01-01'), + array('bar' => 1) + ) + ) + ); + $v->rule('required', 'data.*.foo'); + $v->rule('date', 'data.*.foo'); + $this->assertFalse($v->validate()); + } } function sampleFunctionCallback($field, $value, array $params) diff --git a/tests/bootstrap.php b/tests/bootstrap.php index b4dcfb1..e33ce82 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -16,4 +16,4 @@ if($vendorPos !== false) { $loader = require __DIR__.'/../vendor/autoload.php'; } -require_once __DIR__ . '/Valitron/BaseTestCase.php'; \ No newline at end of file +require_once __DIR__ . '/Valitron/BaseTestCase.php';