From 1ccb9c89ae65910f521f094c3cd1d3c3a0336e42 Mon Sep 17 00:00:00 2001 From: Ulrik Johansson Date: Sat, 3 May 2014 23:00:00 +0100 Subject: [PATCH 1/4] Add Swedish locale --- readme.md | 12 ++ src/Faker/Provider/sv_SE/Address.php | 150 ++++++++++++++++++ src/Faker/Provider/sv_SE/Company.php | 19 +++ src/Faker/Provider/sv_SE/Person.php | 185 +++++++++++++++++++++++ src/Faker/Provider/sv_SE/PhoneNumber.php | 37 +++++ test/Faker/Provider/sv_SE/PersonTest.php | 58 +++++++ 6 files changed, 461 insertions(+) create mode 100644 src/Faker/Provider/sv_SE/Address.php create mode 100644 src/Faker/Provider/sv_SE/Company.php create mode 100644 src/Faker/Provider/sv_SE/Person.php create mode 100644 src/Faker/Provider/sv_SE/PhoneNumber.php create mode 100644 test/Faker/Provider/sv_SE/PersonTest.php diff --git a/readme.md b/readme.md index 2004432565..10535fc39c 100644 --- a/readme.md +++ b/readme.md @@ -856,6 +856,18 @@ echo $faker->tollFreeNumber; // "0800 123 456" echo $faker->areaCode; // "03" ``` +### `Faker\Provider\sv_SE\Person` +```php +personalIdentityNumber() // '950910-0799' + +//Since the numbers are different for male and female persons, optionally you can specify gender. +echo $faker->personalIdentityNumber('female') // '950910-0781' + +``` + ## License Faker is released under the MIT Licence. See the bundled LICENSE file for details. diff --git a/src/Faker/Provider/sv_SE/Address.php b/src/Faker/Provider/sv_SE/Address.php new file mode 100644 index 0000000000..577139b5ae --- /dev/null +++ b/src/Faker/Provider/sv_SE/Address.php @@ -0,0 +1,150 @@ +format('ymd'); + + if ($gender && $gender == static::GENDER_MALE) { + $randomDigits = (string)static::numerify('##') . static::randomElement(array(1,3,5,7,9)); + } elseif ($gender && $gender == static::GENDER_FEMALE) { + $randomDigits = (string)static::numerify('##') . static::randomElement(array(0,2,4,6,8)); + } else { + $randomDigits = (string)static::numerify('###'); + } + + + $checksum = $this->calculateChecksum($datePart . $randomDigits); + + return $datePart . '-' . $randomDigits . $checksum; + } + + /** + * Luhn algorithm + * @link + * @param string $input + * @return int checksum + */ + protected function calculateChecksum($input) + { + $multiplied = implode( + array_map( + function ($first, $second) { + return $first * $second; + }, + str_split($input), + array(2, 1, 2, 1, 2, 1, 2, 1, 2) + ) + ); + + $summed = (int)array_reduce( + str_split($multiplied), + function ($carry, $item) { + return (int)($carry + $item); + } + ); + + $checksum = 10 - ($summed%10); + return $checksum; + } +} diff --git a/src/Faker/Provider/sv_SE/PhoneNumber.php b/src/Faker/Provider/sv_SE/PhoneNumber.php new file mode 100644 index 0000000000..d15e5dd6f3 --- /dev/null +++ b/src/Faker/Provider/sv_SE/PhoneNumber.php @@ -0,0 +1,37 @@ +addProvider(new Person($faker)); + $this->faker = $faker; + } + + public function provideSeedAndExpectedReturn() + { + return array( + array(1, '950910-0799'), + array(2, '950214-8993'), + array(3, '900107-9715'), + array(4, '710730-9515'), + array(5, '040503-0115') + ); + } + + /** + * @dataProvider provideSeedAndExpectedReturn + */ + public function testPersonalIdentityNumber($seed, $expected) + { + $faker = $this->faker; + $faker->seed($seed); + + $this->assertEquals($expected, $faker->personalIdentityNumber()); + } + + public function testUsesOddValuesForMales() + { + $faker = $this->faker; + $faker->seed(1); + + $this->assertEquals('950910-0799', $faker->personalIdentityNumber('male')); + } + + public function testUsesEvenValuesForFemales() + { + $faker = $this->faker; + $faker->seed(1); + + $this->assertEquals('950910-0781', $faker->personalIdentityNumber('female')); + + } +} From 7f5e164d5a6b8a14c1853ac5da740b2ffec074d8 Mon Sep 17 00:00:00 2001 From: Ulrik Johansson Date: Wed, 7 May 2014 13:34:22 +0200 Subject: [PATCH 2/4] Remove unneeded method overrides, fix bug in checksum generator --- src/Faker/Provider/sv_SE/Person.php | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/src/Faker/Provider/sv_SE/Person.php b/src/Faker/Provider/sv_SE/Person.php index dc1bfcacc3..088ae9e38b 100644 --- a/src/Faker/Provider/sv_SE/Person.php +++ b/src/Faker/Provider/sv_SE/Person.php @@ -111,24 +111,6 @@ class Person extends \Faker\Provider\Person 'Öberg' ); - public function firstName($gender = null) - { - if ($gender == static::GENDER_MALE) { - - } - return mt_rand(1, 100) <= 50 ? static::firstNameMale() : static::firstNameFemale(); - } - - public static function firstNameMale() - { - return static::randomElement(static::$firstNameMale); - } - - public static function firstNameFemale() - { - return static::randomElement(static::$firstNameFemale); - } - /** * National Personal Identity number (personnummer) * @link http://en.wikipedia.org/wiki/Personal_identity_number_(Sweden) @@ -156,7 +138,11 @@ public function personalIdentityNumber($gender = null) /** * Luhn algorithm - * @link + * + * This is a naive implementation that only works + * specifically for numbered strings of size 9 + * + * @link http://en.wikipedia.org/wiki/Luhn_algorithm * @param string $input * @return int checksum */ @@ -180,6 +166,6 @@ function ($carry, $item) { ); $checksum = 10 - ($summed%10); - return $checksum; + return $checksum == 10 ? 0 : $checksum; } } From a3460de3b2896198141bbc0dc588aceeb25f9f87 Mon Sep 17 00:00:00 2001 From: Ulrik Johansson Date: Sun, 17 Aug 2014 19:05:35 +0200 Subject: [PATCH 3/4] Use date formatter so personal numbers use seed provided --- src/Faker/Provider/sv_SE/Person.php | 2 +- test/Faker/Provider/sv_SE/PersonTest.php | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Faker/Provider/sv_SE/Person.php b/src/Faker/Provider/sv_SE/Person.php index 088ae9e38b..d03576536c 100644 --- a/src/Faker/Provider/sv_SE/Person.php +++ b/src/Faker/Provider/sv_SE/Person.php @@ -119,7 +119,7 @@ class Person extends \Faker\Provider\Person */ public function personalIdentityNumber($gender = null) { - $birthdate = new \DateTime('@' . mt_rand(0, time())); + $birthdate = \Faker\Provider\DateTime::dateTimeThisCentury(); $datePart = $birthdate->format('ymd'); if ($gender && $gender == static::GENDER_MALE) { diff --git a/test/Faker/Provider/sv_SE/PersonTest.php b/test/Faker/Provider/sv_SE/PersonTest.php index 049ec6456e..6ff8a52531 100644 --- a/test/Faker/Provider/sv_SE/PersonTest.php +++ b/test/Faker/Provider/sv_SE/PersonTest.php @@ -20,11 +20,11 @@ public function setUp() public function provideSeedAndExpectedReturn() { return array( - array(1, '950910-0799'), - array(2, '950214-8993'), - array(3, '900107-9715'), - array(4, '710730-9515'), - array(5, '040503-0115') + array(1, '720727-0070'), + array(2, '710414-8205'), + array(3, '591012-9245'), + array(4, '180307-9001'), + array(5, '820904-0552') ); } @@ -44,7 +44,7 @@ public function testUsesOddValuesForMales() $faker = $this->faker; $faker->seed(1); - $this->assertEquals('950910-0799', $faker->personalIdentityNumber('male')); + $this->assertEquals('720727-0070', $faker->personalIdentityNumber('male')); } public function testUsesEvenValuesForFemales() @@ -52,7 +52,7 @@ public function testUsesEvenValuesForFemales() $faker = $this->faker; $faker->seed(1); - $this->assertEquals('950910-0781', $faker->personalIdentityNumber('female')); + $this->assertEquals('720727-0062', $faker->personalIdentityNumber('female')); } } From 7ab37ba73f303d9803cc9ab9d462583402ce0ed6 Mon Sep 17 00:00:00 2001 From: Ulrik Johansson Date: Sun, 17 Aug 2014 20:37:42 +0200 Subject: [PATCH 4/4] Fix date problem that wasn't fixed in last commit --- src/Faker/Provider/sv_SE/Person.php | 9 +++++--- test/Faker/Provider/sv_SE/PersonTest.php | 27 ++++++++++++++++-------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/Faker/Provider/sv_SE/Person.php b/src/Faker/Provider/sv_SE/Person.php index d03576536c..57051f231a 100644 --- a/src/Faker/Provider/sv_SE/Person.php +++ b/src/Faker/Provider/sv_SE/Person.php @@ -114,12 +114,15 @@ class Person extends \Faker\Provider\Person /** * National Personal Identity number (personnummer) * @link http://en.wikipedia.org/wiki/Personal_identity_number_(Sweden) + * @param \DateTime $birthdate * @param string $gender Person::GENDER_MALE || Person::GENDER_FEMALE - * @return string 3 letters and 6 digits, like ABA300000 + * @return string on format XXXXXX-XXXX */ - public function personalIdentityNumber($gender = null) + public function personalIdentityNumber(\DateTime $birthdate = null, $gender = null) { - $birthdate = \Faker\Provider\DateTime::dateTimeThisCentury(); + if (!$birthdate) { + $birthdate = \Faker\Provider\DateTime::dateTimeThisCentury(); + } $datePart = $birthdate->format('ymd'); if ($gender && $gender == static::GENDER_MALE) { diff --git a/test/Faker/Provider/sv_SE/PersonTest.php b/test/Faker/Provider/sv_SE/PersonTest.php index 6ff8a52531..6f56f52a2c 100644 --- a/test/Faker/Provider/sv_SE/PersonTest.php +++ b/test/Faker/Provider/sv_SE/PersonTest.php @@ -20,23 +20,26 @@ public function setUp() public function provideSeedAndExpectedReturn() { return array( - array(1, '720727-0070'), - array(2, '710414-8205'), - array(3, '591012-9245'), - array(4, '180307-9001'), - array(5, '820904-0552') + array(1, '720727', '720727-5798'), + array(2, '710414', '710414-5664'), + array(3, '591012', '591012-4519'), + array(4, '180307', '180307-0356'), + array(5, '820904', '820904-7748') ); } /** * @dataProvider provideSeedAndExpectedReturn */ - public function testPersonalIdentityNumber($seed, $expected) + public function testPersonalIdentityNumber($seed, $birthdate, $expected) { $faker = $this->faker; $faker->seed($seed); - $this->assertEquals($expected, $faker->personalIdentityNumber()); + $this->assertEquals( + $expected, + $faker->personalIdentityNumber(\DateTime::createFromFormat('ymd', $birthdate)) + ); } public function testUsesOddValuesForMales() @@ -44,7 +47,10 @@ public function testUsesOddValuesForMales() $faker = $this->faker; $faker->seed(1); - $this->assertEquals('720727-0070', $faker->personalIdentityNumber('male')); + $this->assertEquals( + '720727-5715', + $faker->personalIdentityNumber(\DateTime::createFromFormat('ymd', '720727'), 'male') + ); } public function testUsesEvenValuesForFemales() @@ -52,7 +58,10 @@ public function testUsesEvenValuesForFemales() $faker = $this->faker; $faker->seed(1); - $this->assertEquals('720727-0062', $faker->personalIdentityNumber('female')); + $this->assertEquals( + '720727-5707', + $faker->personalIdentityNumber(\DateTime::createFromFormat('ymd', '720727'), 'female') + ); } }