From f735772deb3464cad3d4704fe64b9feffdf720dd Mon Sep 17 00:00:00 2001 From: Mark van der Velden Date: Sat, 18 May 2013 23:53:34 +0200 Subject: [PATCH 1/5] Added the common denominator test --- test/Faker/Provider/ProviderOverrideTest.php | 178 +++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 test/Faker/Provider/ProviderOverrideTest.php diff --git a/test/Faker/Provider/ProviderOverrideTest.php b/test/Faker/Provider/ProviderOverrideTest.php new file mode 100644 index 00000000..414cf994 --- /dev/null +++ b/test/Faker/Provider/ProviderOverrideTest.php @@ -0,0 +1,178 @@ + + */ + +namespace Faker\Test\Provider; + +/** + * Class ProviderOverrideTest + * + * @package Faker\Test\Provider + * + * This class tests a large portion of all locale specific providers. It does not test the entire stack, because each + * locale specific provider (can) has specific implementations. The goal of this test is to test the common denominator + * and to try to catch possible invalid multi-byte sequences. + */ +class ProviderOverrideTest extends \PHPUnit_Framework_TestCase +{ + public function setUp() + { + $faker = new \Faker\Generator(); + } + + + /** + * @dataProvider localeDataProvider + * @param string $locale + */ + public function testAddress($locale = null) + { + $faker = \Faker\Factory::create($locale); + + $this->assertRegExp('/.+/u', $faker->city); + $this->assertRegExp('/.+/u', $faker->postcode); + $this->assertRegExp('/.+/u', $faker->address); + $this->assertRegExp('/.+/u', $faker->country); + } + + + /** + * @dataProvider localeDataProvider + * @param string $locale + */ + public function testCompany($locale = null) + { + $faker = \Faker\Factory::create($locale); + + $this->assertRegExp('/.+/u', $faker->company); + } + + + /** + * @dataProvider localeDataProvider + * @param string $locale + */ + public function testDateTime($locale = null) + { + $faker = \Faker\Factory::create($locale); + + $this->assertRegExp('/.+/u', $faker->century); + $this->assertRegExp('/.+/u', $faker->timezone); + } + + + /** + * @dataProvider localeDataProvider + * @param string $locale + */ + public function testInternet($locale = null) + { + $faker = \Faker\Factory::create($locale); + + $this->assertRegExp('/.+/u', $faker->userName); + + $emailRegex = '/^(.+)@(.+)$/ui'; + $this->assertRegExp($emailRegex, $faker->email); + $this->assertRegExp($emailRegex, $faker->safeEmail); + $this->assertRegExp($emailRegex, $faker->freeEmail); + $this->assertRegExp($emailRegex, $faker->companyEmail); + } + + + /** + * @dataProvider localeDataProvider + * @param string $locale + */ + public function testPerson($locale = null) + { + $faker = \Faker\Factory::create($locale); + + $this->assertRegExp('/.+/u', $faker->name); + } + + + /** + * @dataProvider localeDataProvider + * @param string $locale + */ + public function testPhoneNumber($locale = null) + { + $faker = \Faker\Factory::create($locale); + + $this->assertRegExp('/.+/u', $faker->phoneNumber); + } + + + /** + * @dataProvider localeDataProvider + * @param string $locale + */ + public function testUserAgent($locale = null) + { + $faker = \Faker\Factory::create($locale); + + $this->assertRegExp('/.+/u', $faker->userAgent); + } + + + /** + * @dataProvider localeDataProvider + * + * @param null $locale + * @param string $locale + */ + public function testUuid($locale = null) + { + $faker = \Faker\Factory::create($locale); + + $this->assertRegExp('/.+/u', $faker->uuid); + } + + + /** + * @return array + */ + public function localeDataProvider() + { + $locales = $this->getAllLocales(); + $data = array(); + + foreach ($locales as $locale) { + $data[] = array( + $locale + ); + } + + return $data; + } + + + /** + * Returns all locales as array values + * + * @return array + */ + private function getAllLocales() + { + static $files = array(); + + if ( ! empty($files)) { + return $files; + } + + // Finding all PHP files in the xx_XX directories + $providerDir = __DIR__ .'/../../../src/Faker/Provider'; + foreach (glob($providerDir .'/*_*/*.php') as $file) { + $localisation = basename(dirname($file)); + + if (isset($files[ $localisation ])) { + continue; + } + + $files[ $localisation ] = $localisation; + } + + return $files; + } +} From a9d87ecf722745e5322b6faea6d57a3f87996b17 Mon Sep 17 00:00:00 2001 From: Mark van der Velden Date: Sat, 18 May 2013 23:54:46 +0200 Subject: [PATCH 2/5] Added some multi-byte related fixes. --- src/Faker/Generator.php | 2 +- src/Faker/Provider/Base.php | 6 +++--- src/Faker/Provider/Internet.php | 10 +++++----- src/Faker/Provider/bg_BG/Internet.php | 2 +- src/Faker/Provider/da_DK/Internet.php | 2 +- src/Faker/Provider/de_DE/Internet.php | 2 +- src/Faker/Provider/en_CA/Address.php | 4 ++-- src/Faker/Provider/fr_FR/Internet.php | 2 +- src/Faker/Provider/is_IS/Internet.php | 2 +- src/Faker/Provider/nl_BE/Internet.php | 2 +- src/Faker/Provider/ru_RU/Internet.php | 2 +- 11 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/Faker/Generator.php b/src/Faker/Generator.php index 1097683f..3401089d 100644 --- a/src/Faker/Generator.php +++ b/src/Faker/Generator.php @@ -53,7 +53,7 @@ class Generator */ public function parse($string) { - return preg_replace_callback('/\{\{\s?(\w+)\s?\}\}/', array($this, 'callFormatWithMatches'), $string); + return preg_replace_callback('/\{\{\s?(\w+)\s?\}\}/u', array($this, 'callFormatWithMatches'), $string); } protected function callFormatWithMatches($matches) diff --git a/src/Faker/Provider/Base.php b/src/Faker/Provider/Base.php index 16b74993..a8fd712b 100644 --- a/src/Faker/Provider/Base.php +++ b/src/Faker/Provider/Base.php @@ -136,8 +136,8 @@ class Base */ public static function numerify($string = '###') { - $string = preg_replace_callback('/\#/', 'static::randomDigit', $string); - $string = preg_replace_callback('/\%/', 'static::randomDigitNotNull', $string); + $string = preg_replace_callback('/\#/u', 'static::randomDigit', $string); + $string = preg_replace_callback('/\%/u', 'static::randomDigitNotNull', $string); return $string; } @@ -150,7 +150,7 @@ class Base */ public static function lexify($string = '????') { - return preg_replace_callback('/\?/', 'static::randomLetter', $string); + return preg_replace_callback('/\?/u', 'static::randomLetter', $string); } /** diff --git a/src/Faker/Provider/Internet.php b/src/Faker/Provider/Internet.php index 227a24ca..0ba80f90 100644 --- a/src/Faker/Provider/Internet.php +++ b/src/Faker/Provider/Internet.php @@ -29,7 +29,7 @@ class Internet extends \Faker\Provider\Base { $format = static::randomElement(static::$emailFormats); - return preg_replace('/\s/', '', $this->generator->parse($format)); + return preg_replace('/\s/u', '', $this->generator->parse($format)); } /** @@ -37,7 +37,7 @@ class Internet extends \Faker\Provider\Base */ public final function safeEmail() { - return preg_replace('/\s/', '', $this->userName() . '@' . static::safeEmailDomain()); + return preg_replace('/\s/u', '', $this->userName() . '@' . static::safeEmailDomain()); } /** @@ -45,7 +45,7 @@ class Internet extends \Faker\Provider\Base */ public function freeEmail() { - return preg_replace('/\s/', '', $this->userName() . '@' . static::freeEmailDomain()); + return preg_replace('/\s/u', '', $this->userName() . '@' . static::freeEmailDomain()); } /** @@ -53,7 +53,7 @@ class Internet extends \Faker\Provider\Base */ public function companyEmail() { - return preg_replace('/\s/', '', $this->userName() . '@' . $this->domainName()); + return preg_replace('/\s/u', '', $this->userName() . '@' . $this->domainName()); } /** @@ -103,7 +103,7 @@ class Internet extends \Faker\Provider\Base $company = $this->generator->format('company'); $companyElements = explode(' ', $company); $company = $companyElements[0]; - $company = preg_replace('/\W/', '', $company); + $company = preg_replace('/\W/u', '', $company); return static::toLower($company); } diff --git a/src/Faker/Provider/bg_BG/Internet.php b/src/Faker/Provider/bg_BG/Internet.php index 4c43a31f..04f8fba3 100644 --- a/src/Faker/Provider/bg_BG/Internet.php +++ b/src/Faker/Provider/bg_BG/Internet.php @@ -25,7 +25,7 @@ class Internet extends \Faker\Provider\Internet $company = $this->generator->format('company'); $companyElements = explode(' ', $company); $company = $companyElements[0]; - $company = preg_replace('/\W/', '', $company); + $company = preg_replace('/\W/u', '', $company); return $company; } diff --git a/src/Faker/Provider/da_DK/Internet.php b/src/Faker/Provider/da_DK/Internet.php index 093320eb..2d1e9307 100644 --- a/src/Faker/Provider/da_DK/Internet.php +++ b/src/Faker/Provider/da_DK/Internet.php @@ -61,7 +61,7 @@ class Internet extends \Faker\Provider\Internet $company = $this->generator->format('company'); $companyElements = explode(' ', $company); $company = $companyElements[0]; - $company = preg_replace('/\W/', '', $company); + $company = preg_replace('/\W/u', '', $company); return static::toLower(static::toAscii($company)); } diff --git a/src/Faker/Provider/de_DE/Internet.php b/src/Faker/Provider/de_DE/Internet.php index dec56605..52c420af 100644 --- a/src/Faker/Provider/de_DE/Internet.php +++ b/src/Faker/Provider/de_DE/Internet.php @@ -38,7 +38,7 @@ class Internet extends \Faker\Provider\Internet $company = $this->generator->format('company'); $companyElements = explode(' ', $company); $company = $companyElements[0]; - $company = preg_replace('/\W/', '', $company); + $company = preg_replace('/\W/u', '', $company); return static::toLower(static::toAscii($company)); } diff --git a/src/Faker/Provider/en_CA/Address.php b/src/Faker/Provider/en_CA/Address.php index 97816441..3dbb8487 100644 --- a/src/Faker/Provider/en_CA/Address.php +++ b/src/Faker/Provider/en_CA/Address.php @@ -58,8 +58,8 @@ class Address extends \Faker\Provider\en_US\Address { $string = static::randomElement(static::$postcode); - $string = preg_replace_callback('/\#/', 'static::randomDigit', $string); - $string = preg_replace_callback('/\?/', 'static::randomPostcodeLetter', $string); + $string = preg_replace_callback('/\#/u', 'static::randomDigit', $string); + $string = preg_replace_callback('/\?/u', 'static::randomPostcodeLetter', $string); return static::toUpper($string); } diff --git a/src/Faker/Provider/fr_FR/Internet.php b/src/Faker/Provider/fr_FR/Internet.php index bc661f32..3f483d27 100644 --- a/src/Faker/Provider/fr_FR/Internet.php +++ b/src/Faker/Provider/fr_FR/Internet.php @@ -38,7 +38,7 @@ class Internet extends \Faker\Provider\Internet $company = $this->generator->format('company'); $companyElements = explode(' ', $company); $company = $companyElements[0]; - $company = preg_replace('/\W/', '', $company); + $company = preg_replace('/\W/u', '', $company); return static::toLower(static::toAscii($company)); } diff --git a/src/Faker/Provider/is_IS/Internet.php b/src/Faker/Provider/is_IS/Internet.php index cc8be915..14715aa8 100644 --- a/src/Faker/Provider/is_IS/Internet.php +++ b/src/Faker/Provider/is_IS/Internet.php @@ -54,7 +54,7 @@ class Internet extends \Faker\Provider\Internet $company = $this->generator->format('company'); $companyElements = explode(' ', $company); $company = $companyElements[0]; - $company = preg_replace('/\W/', '', $company); + $company = preg_replace('/\W/u', '', $company); return static::toLower(static::toAscii($company)); } diff --git a/src/Faker/Provider/nl_BE/Internet.php b/src/Faker/Provider/nl_BE/Internet.php index af12dbcb..aa9119d6 100644 --- a/src/Faker/Provider/nl_BE/Internet.php +++ b/src/Faker/Provider/nl_BE/Internet.php @@ -38,7 +38,7 @@ class Internet extends \Faker\Provider\Internet $company = $this->generator->format('company'); $companyElements = explode(' ', $company); $company = $companyElements[0]; - $company = preg_replace('/\W/', '', $company); + $company = preg_replace('/\W/u', '', $company); return static::toLower(static::toAscii($company)); } diff --git a/src/Faker/Provider/ru_RU/Internet.php b/src/Faker/Provider/ru_RU/Internet.php index 35320f9d..56d72d65 100644 --- a/src/Faker/Provider/ru_RU/Internet.php +++ b/src/Faker/Provider/ru_RU/Internet.php @@ -24,7 +24,7 @@ class Internet extends \Faker\Provider\Internet $company = $this->generator->format('company'); $companyElements = explode(' ', $company); $company = $companyElements[0]; - $company = preg_replace('/,/', '', $company); + $company = preg_replace('/,/u', '', $company); return $company; } From d7cf342982f6b46c4e4ff7452942241c2c182d07 Mon Sep 17 00:00:00 2001 From: Mark van der Velden Date: Sat, 18 May 2013 23:56:04 +0200 Subject: [PATCH 3/5] Ignoring composer related files. --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..7579f743 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +vendor +composer.lock From 7c1a1b90c29d21299fc44d17954333e4fe7d6412 Mon Sep 17 00:00:00 2001 From: Mark van der Velden Date: Sun, 19 May 2013 12:04:25 +0200 Subject: [PATCH 4/5] Cleaning up and adding some documentation about the test procedure. --- test/Faker/Provider/ProviderOverrideTest.php | 78 +++++++++++--------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/test/Faker/Provider/ProviderOverrideTest.php b/test/Faker/Provider/ProviderOverrideTest.php index 414cf994..68e30c45 100644 --- a/test/Faker/Provider/ProviderOverrideTest.php +++ b/test/Faker/Provider/ProviderOverrideTest.php @@ -5,6 +5,8 @@ namespace Faker\Test\Provider; +use Faker; + /** * Class ProviderOverrideTest * @@ -16,11 +18,18 @@ namespace Faker\Test\Provider; */ class ProviderOverrideTest extends \PHPUnit_Framework_TestCase { - public function setUp() - { - $faker = new \Faker\Generator(); - } + /** + * Constants with regular expression patterns for testing the output. + * + * Regular expressions are sensitive for malformed strings (e.g.: strings with incorrect encodings) so by using + * PCRE for the tests, even though they seem fairly pointless, we test for incorrect encodings also. + */ + const TEST_STRING_REGEX = '/.+/u'; + /** + * Slightly more specific for e-mail, the point isn't to properly validate e-mails. + */ + const TEST_EMAIL_REGEX = '/^(.+)@(.+)$/ui'; /** * @dataProvider localeDataProvider @@ -28,12 +37,12 @@ class ProviderOverrideTest extends \PHPUnit_Framework_TestCase */ public function testAddress($locale = null) { - $faker = \Faker\Factory::create($locale); + $faker = Faker\Factory::create($locale); - $this->assertRegExp('/.+/u', $faker->city); - $this->assertRegExp('/.+/u', $faker->postcode); - $this->assertRegExp('/.+/u', $faker->address); - $this->assertRegExp('/.+/u', $faker->country); + $this->assertRegExp(static::TEST_STRING_REGEX, $faker->city); + $this->assertRegExp(static::TEST_STRING_REGEX, $faker->postcode); + $this->assertRegExp(static::TEST_STRING_REGEX, $faker->address); + $this->assertRegExp(static::TEST_STRING_REGEX, $faker->country); } @@ -43,9 +52,9 @@ class ProviderOverrideTest extends \PHPUnit_Framework_TestCase */ public function testCompany($locale = null) { - $faker = \Faker\Factory::create($locale); + $faker = Faker\Factory::create($locale); - $this->assertRegExp('/.+/u', $faker->company); + $this->assertRegExp(static::TEST_STRING_REGEX, $faker->company); } @@ -55,10 +64,10 @@ class ProviderOverrideTest extends \PHPUnit_Framework_TestCase */ public function testDateTime($locale = null) { - $faker = \Faker\Factory::create($locale); + $faker = Faker\Factory::create($locale); - $this->assertRegExp('/.+/u', $faker->century); - $this->assertRegExp('/.+/u', $faker->timezone); + $this->assertRegExp(static::TEST_STRING_REGEX, $faker->century); + $this->assertRegExp(static::TEST_STRING_REGEX, $faker->timezone); } @@ -68,15 +77,14 @@ class ProviderOverrideTest extends \PHPUnit_Framework_TestCase */ public function testInternet($locale = null) { - $faker = \Faker\Factory::create($locale); + $faker = Faker\Factory::create($locale); - $this->assertRegExp('/.+/u', $faker->userName); + $this->assertRegExp(static::TEST_STRING_REGEX, $faker->userName); - $emailRegex = '/^(.+)@(.+)$/ui'; - $this->assertRegExp($emailRegex, $faker->email); - $this->assertRegExp($emailRegex, $faker->safeEmail); - $this->assertRegExp($emailRegex, $faker->freeEmail); - $this->assertRegExp($emailRegex, $faker->companyEmail); + $this->assertRegExp(static::TEST_EMAIL_REGEX, $faker->email); + $this->assertRegExp(static::TEST_EMAIL_REGEX, $faker->safeEmail); + $this->assertRegExp(static::TEST_EMAIL_REGEX, $faker->freeEmail); + $this->assertRegExp(static::TEST_EMAIL_REGEX, $faker->companyEmail); } @@ -86,9 +94,9 @@ class ProviderOverrideTest extends \PHPUnit_Framework_TestCase */ public function testPerson($locale = null) { - $faker = \Faker\Factory::create($locale); + $faker = Faker\Factory::create($locale); - $this->assertRegExp('/.+/u', $faker->name); + $this->assertRegExp(static::TEST_STRING_REGEX, $faker->name); } @@ -98,9 +106,9 @@ class ProviderOverrideTest extends \PHPUnit_Framework_TestCase */ public function testPhoneNumber($locale = null) { - $faker = \Faker\Factory::create($locale); + $faker = Faker\Factory::create($locale); - $this->assertRegExp('/.+/u', $faker->phoneNumber); + $this->assertRegExp(static::TEST_STRING_REGEX, $faker->phoneNumber); } @@ -110,9 +118,9 @@ class ProviderOverrideTest extends \PHPUnit_Framework_TestCase */ public function testUserAgent($locale = null) { - $faker = \Faker\Factory::create($locale); + $faker = Faker\Factory::create($locale); - $this->assertRegExp('/.+/u', $faker->userAgent); + $this->assertRegExp(static::TEST_STRING_REGEX, $faker->userAgent); } @@ -124,9 +132,9 @@ class ProviderOverrideTest extends \PHPUnit_Framework_TestCase */ public function testUuid($locale = null) { - $faker = \Faker\Factory::create($locale); + $faker = Faker\Factory::create($locale); - $this->assertRegExp('/.+/u', $faker->uuid); + $this->assertRegExp(static::TEST_STRING_REGEX, $faker->uuid); } @@ -155,10 +163,10 @@ class ProviderOverrideTest extends \PHPUnit_Framework_TestCase */ private function getAllLocales() { - static $files = array(); + static $locales = array(); - if ( ! empty($files)) { - return $files; + if ( ! empty($locales)) { + return $locales; } // Finding all PHP files in the xx_XX directories @@ -166,13 +174,13 @@ class ProviderOverrideTest extends \PHPUnit_Framework_TestCase foreach (glob($providerDir .'/*_*/*.php') as $file) { $localisation = basename(dirname($file)); - if (isset($files[ $localisation ])) { + if (isset($locales[ $localisation ])) { continue; } - $files[ $localisation ] = $localisation; + $locales[ $localisation ] = $localisation; } - return $files; + return $locales; } } From 8c93e70cc0febd8f9ef6d5dd274a9f732eb0cdd9 Mon Sep 17 00:00:00 2001 From: Mark van der Velden Date: Sun, 19 May 2013 12:09:13 +0200 Subject: [PATCH 5/5] Including PHP 5.4 in the test-runs. --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4b5b1b6b..357ecd96 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,5 @@ language: php -php: 5.3 +php: + - 5.3 + - 5.4 script: phpunit