seed(1); $faker->addProvider(new DateTime($faker)); $faker->addProvider(new Person($faker)); $this->faker = $faker; } public function testCnpReturnsValidCnp() { $cnp = $this->faker->cnp; $this->assertTrue($this->isValidCnp($cnp)); } public function testCnpReturnsMaleCnp() { $cnp = $this->faker->cnp('m'); $this->assertRegExp('/^[1357]\d{12}$/', $cnp); } public function testCnpReturnsFemaleCnp() { $cnp = $this->faker->cnp('f'); $this->assertRegExp('/^[2468]\d{12}$/', $cnp); } public function testCnpReturns1800sCnp() { $cnp = $this->faker->cnp(null, 1800); $this->assertRegExp('/^[34]\d{12}$/', $cnp); } public function testCnpReturns1900sCnp() { $cnp = $this->faker->cnp(null, 1900); $this->assertRegExp('/^[12]\d{12}$/', $cnp); } public function testCnpReturns2000sCnp() { $cnp = $this->faker->cnp(null, 2000); $this->assertRegExp('/^[56]\d{12}$/', $cnp); } public function testCnpReturnsBrasovCnp() { $cnp = $this->faker->cnp(null, null, 'BV'); $this->assertRegExp('/^\d{7}08\d{4}$/', $cnp); } public function testCnpReturns2000sClujFemaleCnp() { $cnp = $this->faker->cnp('f', 2000, 'CJ'); $this->assertRegExp('/^6\d{6}12\d{4}$/', $cnp); } protected function isValidCnp($cnp) { if ( is_string($cnp) && (bool) preg_match(static::TEST_CNP_REGEX, $cnp) && checkdate(substr($cnp, 3, 2), substr($cnp, 5, 2), substr($cnp, 1, 2)) ){ $checkNumber = 279146358279; $checksum = 0; foreach (range(0, 11) as $digit) { $checksum += substr($cnp, $digit, 1) * substr($checkNumber, $digit, 1); } $checksum = $checksum % 11; if ( ($checksum < 10 && $checksum == substr($cnp, -1)) || ($checksum == 10 && substr($cnp, -1) == 1) ){ return true; } } return false; } }