diff --git a/readme.md b/readme.md index 55c4d5bef9..843518451d 100644 --- a/readme.md +++ b/readme.md @@ -328,7 +328,7 @@ The populator uses name and column type guessers to populate each column with re ```php addEntity('Book', 5, array( - 'ISBN' => function() use ($generator) { return $generator->randomNumber(13); } + 'ISBN' => function() use ($generator) { return $generator->ean13(); } )); ``` diff --git a/src/Faker/Provider/Barcode.php b/src/Faker/Provider/Barcode.php index 62f676d46f..8fddf946a7 100644 --- a/src/Faker/Provider/Barcode.php +++ b/src/Faker/Provider/Barcode.php @@ -9,21 +9,22 @@ class Barcode extends \Faker\Provider\Base { private function ean($length = 13) { - $code = array(); - for ($i = 0; $i < $length - 1; $i++) { - $code[] = static::randomDigit(); - } + $code = $this->numerify(str_repeat('#', $length - 1)); - $sequence = $length == 8 ? array(3, 1) : array(1, 3); + return $code . static::eanChecksum($code); + } + /** + * Utility function for computing EAN checksums + */ + protected static function eanChecksum($input) + { + $sequence = (strlen($input) - 1) == 8 ? array(3, 1) : array(1, 3); $sums = 0; - foreach ($code as $n => $digit) { + foreach (str_split($input) as $n => $digit) { $sums += $digit * $sequence[$n % 2]; } - - $checksum = (10 - $sums % 10) % 10; - - return implode('', $code) . $checksum; + return (10 - $sums % 10) % 10; } /** diff --git a/test/Faker/Provider/BarcodeTest.php b/test/Faker/Provider/BarcodeTest.php index d3b6574599..a7ee6d98b5 100644 --- a/test/Faker/Provider/BarcodeTest.php +++ b/test/Faker/Provider/BarcodeTest.php @@ -7,20 +7,39 @@ class BarcodeTest extends \PHPUnit_Framework_TestCase { + private $faker; + public function setUp() { $faker = new Generator(); $faker->addProvider(new Barcode($faker)); + $faker->seed(0); $this->faker = $faker; } public function testEan8() { - $this->assertRegExp('/[\d]{8}/', $this->faker->ean8()); + $code = $this->faker->ean8(); + $this->assertRegExp('/^\d{8}$/i', $code); + $codeWitoutChecksum = substr($code, 0, -1); + $checksum = substr($code, -1); + $this->assertEquals(TestableBarcode::eanChecksum($codeWitoutChecksum), $checksum); } public function testEan13() { - $this->assertRegExp('/[\d]{13}/', $this->faker->ean13()); + $code = $this->faker->ean13(); + $this->assertRegExp('/^\d{13}$/i', $code); + $codeWitoutChecksum = substr($code, 0, -1); + $checksum = substr($code, -1); + $this->assertEquals(TestableBarcode::eanChecksum($codeWitoutChecksum), $checksum); + } +} + +class TestableBarcode extends Barcode +{ + public static function eanChecksum($input) + { + return parent::eanChecksum($input); } }