Apply contribution guidelines to "Cnh" rule

Co-Authored-By: Henrique Moody <henriquemoody@gmail.com>
This commit is contained in:
William Espindola 2018-06-10 13:48:03 -03:00 committed by Henrique Moody
parent 8272f43207
commit b507d928c1
No known key found for this signature in database
GPG key ID: 221E9281655813A6
5 changed files with 183 additions and 166 deletions

View file

@ -2,7 +2,7 @@
- `Cnh()`
Validates a Brazillian driver's license.
Validates a Brazilian driver's license.
```php
v::cnh()->validate('02650306461'); // true

View file

@ -13,8 +13,15 @@ declare(strict_types=1);
namespace Respect\Validation\Exceptions;
class CnhException extends ValidationException
/**
* @author Henrique Moody <henriquemoody@gmail.com>
* @author Kinn Coelho Julião <kinncj@gmail.com>
*/
final class CnhException extends ValidationException
{
/**
* {@inheritdoc}
*/
public static $defaultTemplates = [
self::MODE_DEFAULT => [
self::STANDARD => '{{name}} must be a valid CNH number',

View file

@ -13,8 +13,23 @@ declare(strict_types=1);
namespace Respect\Validation\Rules;
class Cnh extends AbstractRule
use function is_scalar;
use function mb_strlen;
use function preg_replace;
/**
* Validates a Brazilian driver's license.
*
* @author Gabriel Pedro <gpedro@users.noreply.github.com>
* @author Henrique Moody <henriquemoody@gmail.com>
* @author Kinn Coelho Julião <kinncj@gmail.com>
* @author William Espindola <oi@williamespindola.com.br>
*/
final class Cnh extends AbstractRule
{
/**
* {@inheritdoc}
*/
public function validate($input): bool
{
if (!is_scalar($input)) {
@ -25,14 +40,14 @@ class Cnh extends AbstractRule
$input = preg_replace('{\D}', '', (string) $input);
// Validate length and invalid numbers
if ((11 != mb_strlen($input)) || (0 == intval($input))) {
if ((11 != mb_strlen($input)) || (0 === (int) $input)) {
return false;
}
// Validate check digits using a modulus 11 algorithm
for ($c = $s1 = $s2 = 0, $p = 9; $c < 9; $c++, $p--) {
$s1 += intval($input[$c]) * $p;
$s2 += intval($input[$c]) * (10 - $p);
$s1 += (int) $input[$c] * $p;
$s2 += (int) $input[$c] * (10 - $p);
}
if ($input[9] != (($dv1 = $s1 % 11) > 9) ? 0 : $dv1) {

View file

@ -0,0 +1,37 @@
--FILE--
<?php
require 'vendor/autoload.php';
use Respect\Validation\Exceptions\CnhException;
use Respect\Validation\Exceptions\NestedValidationException;
use Respect\Validation\Validator as v;
try {
v::cnh()->check('batman');
} catch (CnhException $e) {
echo $e->getMessage().PHP_EOL;
}
try {
v::not(v::cnh())->check('02650306461');
} catch (CnhException $e) {
echo $e->getMessage().PHP_EOL;
}
try {
v::cnh()->assert('bruce wayne');
} catch (NestedValidationException $e) {
echo $e->getFullMessage().PHP_EOL;
}
try {
v::not(v::cnh())->assert('02650306461');
} catch (NestedValidationException $e) {
echo $e->getFullMessage().PHP_EOL;
}
?>
--EXPECTF--
"batman" must be a valid CNH number
"02650306461" must not be a valid CNH number
- "bruce wayne" must be a valid CNH number
- "02650306461" must not be a valid CNH number

View file

@ -13,182 +13,140 @@ declare(strict_types=1);
namespace Respect\Validation\Rules;
use PHPUnit\Framework\TestCase;
use Respect\Validation\Test\RuleTestCase;
/**
* @group rule
* @group rule
*
* @covers \Respect\Validation\Rules\Cnh
* @covers \Respect\Validation\Exceptions\CnhException
*
* @author Gabriel Caruso <carusogabriel34@gmail.com>
* @author Gabriel Pedro <gpedro@users.noreply.github.com>
* @author Henrique Moody <henriquemoody@gmail.com>
* @author Kinn Coelho Julião <kinncj@gmail.com>
* @author Pascal Borreli <pascal@borreli.com>
* @author William Espindola <oi@williamespindola.com.br>
*/
class CnhTest extends TestCase
final class CnhTest extends RuleTestCase
{
protected $cnhValidator;
protected function setUp(): void
{
$this->cnhValidator = new Cnh();
}
/**
* @dataProvider validCnhProvider
* {@inheritdoc}
*/
public function testValidCnh($cnh): void
public function providerForValidInput(): array
{
$this->cnhValidator->assert($cnh);
self::assertTrue($this->cnhValidator->__invoke($cnh));
$this->cnhValidator->check($cnh);
}
$rule = new Cnh();
/**
* @dataProvider invalidCnhProvider
* @expectedException \Respect\Validation\Exceptions\CnhException
*/
public function testInvalidCnh($cnh): void
{
$expectedInvalid = $this->cnhValidator->assert($cnh);
self::assertFalse($expectedInvalid);
}
/**
* @dataProvider notIntegerCnhProvider
* @expectedException \Respect\Validation\Exceptions\CnhException
*/
public function testNotIntegerCnh($cnh): void
{
$expectedInvalid = $this->cnhValidator->assert($cnh);
self::assertFalse($expectedInvalid);
}
/**
* @dataProvider invalidCnhLengthProvider
* @expectedException \Respect\Validation\Exceptions\CnhException
*/
public function testInvalidLengthCnh($cnh): void
{
$expectedInvalid = $this->cnhValidator->assert($cnh);
self::assertFalse($expectedInvalid);
}
public function validCnhProvider()
{
return [
['02650306461'],
['04397322870'],
['04375701302'],
['02996843266'],
['04375700501'],
['02605113410'],
['03247061306'],
['01258750259'],
['00739751580'],
['03375637504'],
['02542551342'],
['01708111400'],
['00836510948'],
['04365445978'],
['04324384302'],
['04339482949'],
['01036520050'],
['01612581027'],
['00603454740'],
['04129251992'],
['03401740201'],
['03417248301'],
['00670431345'],
['03292694405'],
[$rule, '02650306461'],
[$rule, '04397322870'],
[$rule, '04375701302'],
[$rule, '02996843266'],
[$rule, '04375700501'],
[$rule, '02605113410'],
[$rule, '03247061306'],
[$rule, '01258750259'],
[$rule, '00739751580'],
[$rule, '03375637504'],
[$rule, '02542551342'],
[$rule, '01708111400'],
[$rule, '00836510948'],
[$rule, '04365445978'],
[$rule, '04324384302'],
[$rule, '04339482949'],
[$rule, '01036520050'],
[$rule, '01612581027'],
[$rule, '00603454740'],
[$rule, '04129251992'],
[$rule, '03401740201'],
[$rule, '03417248301'],
[$rule, '00670431345'],
[$rule, '03292694405'],
];
}
public function invalidCnhProvider()
/**
* {@inheritdoc}
*/
public function providerForInvalidInput(): array
{
return [
[[]],
[new \stdClass()],
['0265131640'],
['0439732280'],
['0437571130'],
['0299684320'],
['0437571150'],
['0261511340'],
['0324716130'],
['0125875120'],
['0173975150'],
['0337563750'],
['0254255130'],
['0171811140'],
['0183651190'],
['0436544590'],
['0432438430'],
['0433948290'],
['0113652110'],
['0161258110'],
['0161345470'],
['0412925190'],
['0341174120'],
['0341724830'],
['0167143130'],
['0329269440'],
];
}
$rule = new Cnh();
public function notIntegerCnhProvider()
{
return [
[''],
['F265F3F6461'],
['F439732287F'],
['F43757F13F2'],
['F2996843266'],
['F43757FF5F1'],
['F26F511341F'],
['F3247F613F6'],
['F125875F259'],
['FF73975158F'],
['F33756375F4'],
['F2542551342'],
['F17F81114FF'],
['FF83651F948'],
['F4365445978'],
['F43243843F2'],
['F4339482949'],
['F1F3652FF5F'],
['F1612581F27'],
['FF6F345474F'],
['F4129251992'],
['F34F174F2F1'],
['F34172483F1'],
['FF67F431345'],
['F32926944F5'],
];
}
public function invalidCnhLengthProvider()
{
return [
['00265003006461'],
['0043973228700'],
['00437570013002'],
['002996843266'],
['004375700005001'],
['00260051134100'],
['00324700613006'],
['0012587500259'],
['00007397515800'],
['0033756375004'],
['002542551342'],
['001700811140000'],
['00008365100948'],
['004365445978'],
['0043243843002'],
['004339482949'],
['0010036520000500'],
['0016125810027'],
['000060034547400'],
['004129251992'],
['003400174002001'],
['0034172483001'],
['00006700431345'],
['0032926944005'],
[$rule, []],
[$rule, new \stdClass()],
[$rule, '0265131640'],
[$rule, '0439732280'],
[$rule, '0437571130'],
[$rule, '0299684320'],
[$rule, '0437571150'],
[$rule, '0261511340'],
[$rule, '0324716130'],
[$rule, '0125875120'],
[$rule, '0173975150'],
[$rule, '0337563750'],
[$rule, '0254255130'],
[$rule, '0171811140'],
[$rule, '0183651190'],
[$rule, '0436544590'],
[$rule, '0432438430'],
[$rule, '0433948290'],
[$rule, '0113652110'],
[$rule, '0161258110'],
[$rule, '0161345470'],
[$rule, '0412925190'],
[$rule, '0341174120'],
[$rule, '0341724830'],
[$rule, '0167143130'],
[$rule, '0329269440'],
[$rule, ''],
[$rule, 'F265F3F6461'],
[$rule, 'F439732287F'],
[$rule, 'F43757F13F2'],
[$rule, 'F2996843266'],
[$rule, 'F43757FF5F1'],
[$rule, 'F26F511341F'],
[$rule, 'F3247F613F6'],
[$rule, 'F125875F259'],
[$rule, 'FF73975158F'],
[$rule, 'F33756375F4'],
[$rule, 'F2542551342'],
[$rule, 'F17F81114FF'],
[$rule, 'FF83651F948'],
[$rule, 'F4365445978'],
[$rule, 'F43243843F2'],
[$rule, 'F4339482949'],
[$rule, 'F1F3652FF5F'],
[$rule, 'F1612581F27'],
[$rule, 'FF6F345474F'],
[$rule, 'F4129251992'],
[$rule, 'F34F174F2F1'],
[$rule, 'F34172483F1'],
[$rule, 'FF67F431345'],
[$rule, 'F32926944F5'],
[$rule, '00265003006461'],
[$rule, '0043973228700'],
[$rule, '00437570013002'],
[$rule, '002996843266'],
[$rule, '004375700005001'],
[$rule, '00260051134100'],
[$rule, '00324700613006'],
[$rule, '0012587500259'],
[$rule, '00007397515800'],
[$rule, '0033756375004'],
[$rule, '002542551342'],
[$rule, '001700811140000'],
[$rule, '00008365100948'],
[$rule, '004365445978'],
[$rule, '0043243843002'],
[$rule, '004339482949'],
[$rule, '0010036520000500'],
[$rule, '0016125810027'],
[$rule, '000060034547400'],
[$rule, '004129251992'],
[$rule, '003400174002001'],
[$rule, '0034172483001'],
[$rule, '00006700431345'],
[$rule, '0032926944005'],
];
}
}