[Intl] Simplified tests

This commit is contained in:
Bernhard Schussek 2013-03-16 00:38:59 +01:00
parent c55c4a26fe
commit 9d9c38996c
13 changed files with 103 additions and 88 deletions

View File

@ -13,14 +13,13 @@ namespace Symfony\Component\Intl\Tests\Collator;
use Symfony\Component\Intl\Collator\StubCollator; use Symfony\Component\Intl\Collator\StubCollator;
use Symfony\Component\Intl\Locale; use Symfony\Component\Intl\Locale;
use Symfony\Component\Intl\Tests\IntlTestCase;
/** /**
* Test case for Collator implementations. * Test case for Collator implementations.
* *
* @author Bernhard Schussek <bschussek@gmail.com> * @author Bernhard Schussek <bschussek@gmail.com>
*/ */
abstract class AbstractCollatorTest extends IntlTestCase abstract class AbstractCollatorTest extends \PHPUnit_Framework_TestCase
{ {
/** /**
* @dataProvider asortProvider * @dataProvider asortProvider

View File

@ -13,6 +13,7 @@ namespace Symfony\Component\Intl\Tests\Collator\Verification;
use Symfony\Component\Intl\Locale; use Symfony\Component\Intl\Locale;
use Symfony\Component\Intl\Tests\Collator\AbstractCollatorTest; use Symfony\Component\Intl\Tests\Collator\AbstractCollatorTest;
use Symfony\Component\Intl\Util\IntlTestHelper;
/** /**
* Verifies that {@link AbstractCollatorTest} matches the behavior of the * Verifies that {@link AbstractCollatorTest} matches the behavior of the
@ -24,7 +25,7 @@ class CollatorTest extends AbstractCollatorTest
{ {
protected function setUp() protected function setUp()
{ {
$this->skipIfIntlExtensionNotLoaded(); IntlTestHelper::requireFullIntl($this);
parent::setUp(); parent::setUp();
} }

View File

@ -14,7 +14,6 @@ namespace Symfony\Component\Intl\Tests\DateFormatter;
use Symfony\Component\Intl\DateFormatter\StubIntlDateFormatter; use Symfony\Component\Intl\DateFormatter\StubIntlDateFormatter;
use Symfony\Component\Intl\Globals\StubIntlGlobals; use Symfony\Component\Intl\Globals\StubIntlGlobals;
use Symfony\Component\Intl\Intl; use Symfony\Component\Intl\Intl;
use Symfony\Component\Intl\Tests\IntlTestCase;
use Symfony\Component\Intl\Util\IcuVersion; use Symfony\Component\Intl\Util\IcuVersion;
use Symfony\Component\Intl\Util\Version; use Symfony\Component\Intl\Util\Version;
@ -23,7 +22,7 @@ use Symfony\Component\Intl\Util\Version;
* *
* @author Bernhard Schussek <bschussek@gmail.com> * @author Bernhard Schussek <bschussek@gmail.com>
*/ */
abstract class AbstractIntlDateFormatterTest extends IntlTestCase abstract class AbstractIntlDateFormatterTest extends \PHPUnit_Framework_TestCase
{ {
/** /**
* When a time zone is not specified, it uses the system default however it returns null in the getter method * When a time zone is not specified, it uses the system default however it returns null in the getter method

View File

@ -13,6 +13,7 @@ namespace Symfony\Component\Intl\Tests\DateFormatter\Verification;
use Symfony\Component\Intl\DateFormatter\StubIntlDateFormatter; use Symfony\Component\Intl\DateFormatter\StubIntlDateFormatter;
use Symfony\Component\Intl\Tests\DateFormatter\AbstractIntlDateFormatterTest; use Symfony\Component\Intl\Tests\DateFormatter\AbstractIntlDateFormatterTest;
use Symfony\Component\Intl\Util\IntlTestHelper;
/** /**
* Verifies that {@link AbstractIntlDateFormatterTest} matches the behavior of * Verifies that {@link AbstractIntlDateFormatterTest} matches the behavior of
@ -24,7 +25,7 @@ class IntlDateFormatterTest extends AbstractIntlDateFormatterTest
{ {
protected function setUp() protected function setUp()
{ {
$this->skipIfIntlExtensionNotLoaded(); IntlTestHelper::requireFullIntl($this);
parent::setUp(); parent::setUp();
} }

View File

@ -11,14 +11,13 @@
namespace Symfony\Component\Intl\Tests\Globals; namespace Symfony\Component\Intl\Tests\Globals;
use Symfony\Component\Intl\Tests\IntlTestCase;
/** /**
* Test case for intl function implementations. * Test case for intl function implementations.
* *
* @author Bernhard Schussek <bschussek@gmail.com> * @author Bernhard Schussek <bschussek@gmail.com>
*/ */
abstract class AbstractIntlGlobalsTest extends IntlTestCase abstract class AbstractIntlGlobalsTest extends \PHPUnit_Framework_TestCase
{ {
public function errorNameProvider() public function errorNameProvider()
{ {

View File

@ -12,6 +12,7 @@
namespace Symfony\Component\Intl\Tests\Globals\Verification; namespace Symfony\Component\Intl\Tests\Globals\Verification;
use Symfony\Component\Intl\Tests\Globals\AbstractIntlGlobalsTest; use Symfony\Component\Intl\Tests\Globals\AbstractIntlGlobalsTest;
use Symfony\Component\Intl\Util\IntlTestHelper;
/** /**
* Verifies that {@link AbstractIntlGlobalsTest} matches the behavior of the * Verifies that {@link AbstractIntlGlobalsTest} matches the behavior of the
@ -23,7 +24,7 @@ class IntlGlobalsTest extends AbstractIntlGlobalsTest
{ {
protected function setUp() protected function setUp()
{ {
$this->skipIfIntlExtensionNotLoaded(); IntlTestHelper::requireFullIntl($this);
parent::setUp(); parent::setUp();
} }

View File

@ -1,59 +0,0 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests;
use Symfony\Component\Intl\Intl;
use Symfony\Component\Intl\Util\IcuVersion;
use Symfony\Component\Intl\Util\Version;
/**
* Base test case for the Intl component.
*
* @author Bernhard Schussek <bschussek@gmail.com>
*/
abstract class IntlTestCase extends \PHPUnit_Framework_TestCase
{
protected function is32Bit()
{
return PHP_INT_SIZE == 4;
}
protected function is64Bit()
{
return PHP_INT_SIZE == 8;
}
protected function skipIfIntlExtensionNotLoaded()
{
if (!Intl::isExtensionLoaded()) {
$this->markTestSkipped('The intl extension is not available.');
}
if (IcuVersion::compare(Intl::getIcuVersion(), Intl::getIcuStubVersion(), '!=', $precision = 1)) {
$this->markTestSkipped('Please change ICU version to ' . Intl::getIcuStubVersion());
}
}
protected function skipIfNot32Bit()
{
if (!$this->is32Bit()) {
$this->markTestSkipped('PHP must be compiled in 32 bit mode to run this test');
}
}
protected function skipIfNot64Bit()
{
if (!$this->is64Bit()) {
$this->markTestSkipped('PHP must be compiled in 64 bit mode to run this test');
}
}
}

View File

@ -12,14 +12,13 @@
namespace Symfony\Component\Intl\Tests\Locale; namespace Symfony\Component\Intl\Tests\Locale;
use Symfony\Component\Intl\Stub\StubLocale; use Symfony\Component\Intl\Stub\StubLocale;
use Symfony\Component\Intl\Tests\IntlTestCase;
/** /**
* Test case for Locale implementations. * Test case for Locale implementations.
* *
* @author Bernhard Schussek <bschussek@gmail.com> * @author Bernhard Schussek <bschussek@gmail.com>
*/ */
abstract class AbstractLocaleTest extends IntlTestCase abstract class AbstractLocaleTest extends \PHPUnit_Framework_TestCase
{ {
public function testSetDefault() public function testSetDefault()
{ {

View File

@ -12,6 +12,7 @@
namespace Symfony\Component\Intl\Tests\Locale\Verification; namespace Symfony\Component\Intl\Tests\Locale\Verification;
use Symfony\Component\Intl\Tests\Locale\AbstractLocaleTest; use Symfony\Component\Intl\Tests\Locale\AbstractLocaleTest;
use Symfony\Component\Intl\Util\IntlTestHelper;
/** /**
* Verifies that {@link AbstractLocaleTest} matches the behavior of the * Verifies that {@link AbstractLocaleTest} matches the behavior of the
@ -23,7 +24,7 @@ class LocaleTest extends AbstractLocaleTest
{ {
protected function setUp() protected function setUp()
{ {
$this->skipIfIntlExtensionNotLoaded(); IntlTestHelper::requireFullIntl($this);
parent::setUp(); parent::setUp();
} }

View File

@ -15,14 +15,14 @@ use Symfony\Component\Intl\Globals\StubIntlGlobals;
use Symfony\Component\Intl\Intl; use Symfony\Component\Intl\Intl;
use Symfony\Component\Intl\Locale; use Symfony\Component\Intl\Locale;
use Symfony\Component\Intl\NumberFormatter\StubNumberFormatter; use Symfony\Component\Intl\NumberFormatter\StubNumberFormatter;
use Symfony\Component\Intl\Tests\IntlTestCase;
use Symfony\Component\Intl\Util\IcuVersion; use Symfony\Component\Intl\Util\IcuVersion;
use Symfony\Component\Intl\Util\IntlTestHelper;
/** /**
* Note that there are some values written like -2147483647 - 1. This is the lower 32bit int max and is a known * Note that there are some values written like -2147483647 - 1. This is the lower 32bit int max and is a known
* behavior of PHP. * behavior of PHP.
*/ */
abstract class AbstractNumberFormatterTest extends IntlTestCase abstract class AbstractNumberFormatterTest extends \PHPUnit_Framework_TestCase
{ {
/** /**
* @dataProvider formatCurrencyWithDecimalStyleProvider * @dataProvider formatCurrencyWithDecimalStyleProvider
@ -547,7 +547,7 @@ abstract class AbstractNumberFormatterTest extends IntlTestCase
public function testParseTypeInt64With32BitIntegerInPhp32Bit() public function testParseTypeInt64With32BitIntegerInPhp32Bit()
{ {
$this->skipIfNot32Bit(); IntlTestHelper::require32Bit($this);
$formatter = $this->getNumberFormatter('en', StubNumberFormatter::DECIMAL); $formatter = $this->getNumberFormatter('en', StubNumberFormatter::DECIMAL);
@ -573,7 +573,7 @@ abstract class AbstractNumberFormatterTest extends IntlTestCase
public function testParseTypeInt64With32BitIntegerInPhp64Bit() public function testParseTypeInt64With32BitIntegerInPhp64Bit()
{ {
$this->skipIfNot64Bit(); IntlTestHelper::require64Bit($this);
$formatter = $this->getNumberFormatter('en', StubNumberFormatter::DECIMAL); $formatter = $this->getNumberFormatter('en', StubNumberFormatter::DECIMAL);
@ -591,7 +591,7 @@ abstract class AbstractNumberFormatterTest extends IntlTestCase
*/ */
public function testParseTypeInt64With64BitIntegerInPhp32Bit() public function testParseTypeInt64With64BitIntegerInPhp32Bit()
{ {
$this->skipIfNot32Bit(); IntlTestHelper::require32Bit($this);
$formatter = $this->getNumberFormatter('en', StubNumberFormatter::DECIMAL); $formatter = $this->getNumberFormatter('en', StubNumberFormatter::DECIMAL);
@ -610,7 +610,7 @@ abstract class AbstractNumberFormatterTest extends IntlTestCase
*/ */
public function testParseTypeInt64With64BitIntegerInPhp64Bit() public function testParseTypeInt64With64BitIntegerInPhp64Bit()
{ {
$this->skipIfNot64Bit(); IntlTestHelper::require64Bit($this);
$formatter = $this->getNumberFormatter('en', StubNumberFormatter::DECIMAL); $formatter = $this->getNumberFormatter('en', StubNumberFormatter::DECIMAL);

View File

@ -12,6 +12,7 @@
namespace Symfony\Component\Intl\Tests\NumberFormatter\Verification; namespace Symfony\Component\Intl\Tests\NumberFormatter\Verification;
use Symfony\Component\Intl\Tests\NumberFormatter\AbstractNumberFormatterTest; use Symfony\Component\Intl\Tests\NumberFormatter\AbstractNumberFormatterTest;
use Symfony\Component\Intl\Util\IntlTestHelper;
/** /**
* Note that there are some values written like -2147483647 - 1. This is the lower 32bit int max and is a known * Note that there are some values written like -2147483647 - 1. This is the lower 32bit int max and is a known
@ -21,7 +22,7 @@ class NumberFormatterTest extends AbstractNumberFormatterTest
{ {
protected function setUp() protected function setUp()
{ {
$this->skipIfIntlExtensionNotLoaded(); IntlTestHelper::requireFullIntl($this);
parent::setUp(); parent::setUp();
} }

View File

@ -12,12 +12,12 @@
namespace Symfony\Component\Intl\Tests\ResourceBundle\Reader; namespace Symfony\Component\Intl\Tests\ResourceBundle\Reader;
use Symfony\Component\Intl\ResourceBundle\Reader\BinaryBundleReader; use Symfony\Component\Intl\ResourceBundle\Reader\BinaryBundleReader;
use Symfony\Component\Intl\Tests\IntlTestCase; use Symfony\Component\Intl\Util\IntlTestHelper;
/** /**
* @author Bernhard Schussek <bschussek@gmail.com> * @author Bernhard Schussek <bschussek@gmail.com>
*/ */
class BinaryBundleReaderTest extends IntlTestCase class BinaryBundleReaderTest extends \PHPUnit_Framework_TestCase
{ {
/** /**
* @var BinaryBundleReader * @var BinaryBundleReader
@ -26,7 +26,7 @@ class BinaryBundleReaderTest extends IntlTestCase
protected function setUp() protected function setUp()
{ {
$this->skipIfIntlExtensionNotLoaded(); IntlTestHelper::requireFullIntl($this);
$this->reader = new BinaryBundleReader(); $this->reader = new BinaryBundleReader();
} }

View File

@ -16,29 +16,102 @@ use Symfony\Component\Intl\Intl;
/** /**
* Helper class for preparing test cases that rely on the Intl component. * Helper class for preparing test cases that rely on the Intl component.
* *
* Any test that tests functionality relying on either the intl classes or
* the resource bundle data should call either of the methods
* {@link requireIntl()} or {@link requireFullIntl()}. Calling
* {@link requireFullIntl()} is only necessary if you use functionality in the
* test that is not provided by the stub intl implementation.
*
* @author Bernhard Schussek <bschussek@gmail.com> * @author Bernhard Schussek <bschussek@gmail.com>
*/ */
class IntlTestHelper class IntlTestHelper
{ {
/** /**
* Prepares the given test case to use the Intl component. * Should be called before tests that work fine with the stub implementation.
* *
* @param \PhpUnit_Framework_TestCase $testCase * @param \PhpUnit_Framework_TestCase $testCase
*/ */
public static function setUp(\PhpUnit_Framework_TestCase $testCase) public static function requireIntl(\PhpUnit_Framework_TestCase $testCase)
{ {
if (!Intl::isExtensionLoaded()) { // We only run tests if the version is *one specific version*.
$testCase->markTestSkipped('The intl extension is not available.'); // This condition is satisfied if
} //
// * the intl extension is loaded with version Intl::getIcuStubVersion()
// * the intl extension is not loaded
if (IcuVersion::compare(Intl::getIcuVersion(), Intl::getIcuStubVersion(), '!=', $precision = 1)) { if (IcuVersion::compare(Intl::getIcuVersion(), Intl::getIcuStubVersion(), '!=', $precision = 1)) {
$testCase->markTestSkipped('Please change ICU version to ' . Intl::getIcuStubVersion()); $testCase->markTestSkipped('Please change ICU version to ' . Intl::getIcuStubVersion());
} }
Intl::setDataSource(Intl::STUB); // Normalize the default locale in case this is not done explicitly
// in the test
\Locale::setDefault('en'); \Locale::setDefault('en');
// Consequently, tests will
//
// * run only for one ICU version (see Intl::getIcuStubVersion())
// there is no need to add control structures to your tests that
// change the test depending on the ICU version.
//
// Tests should only rely on functionality that is implemented in the
// stub classes.
} }
/**
* Should be called before tests that require a feature-complete intl
* implementation.
*
* @param \PhpUnit_Framework_TestCase $testCase
*/
public static function requireFullIntl(\PhpUnit_Framework_TestCase $testCase)
{
// We only run tests if the intl extension is loaded...
if (!Intl::isExtensionLoaded()) {
$testCase->markTestSkipped('The intl extension is not available.');
}
// ... and only if the version is *one specific version*.
if (IcuVersion::compare(Intl::getIcuVersion(), Intl::getIcuStubVersion(), '!=', $precision = 1)) {
$testCase->markTestSkipped('Please change ICU version to ' . Intl::getIcuStubVersion());
}
// Normalize the default locale in case this is not done explicitly
// in the test
\Locale::setDefault('en');
// Consequently, tests will
//
// * run only for one ICU version (see Intl::getIcuStubVersion())
// there is no need to add control structures to your tests that
// change the test depending on the ICU version.
// * always use the C intl classes
// * always use the binary resource bundles (any locale is allowed)
}
/**
* Skips the test unless the current system has a 32bit architecture.
*
* @param \PhpUnit_Framework_TestCase $testCase
*/
public static function require32Bit(\PhpUnit_Framework_TestCase $testCase)
{
if (4 !== PHP_INT_SIZE) {
$testCase->markTestSkipped('PHP must be compiled in 32 bit mode to run this test');
}
}
/**
* Skips the test unless the current system has a 64bit architecture.
*
* @param \PhpUnit_Framework_TestCase $testCase
*/
public static function require64Bit(\PhpUnit_Framework_TestCase $testCase)
{
if (8 !== PHP_INT_SIZE) {
$testCase->markTestSkipped('PHP must be compiled in 64 bit mode to run this test');
}
}
/** /**
* Must not be instantiated. * Must not be instantiated.
*/ */