diff --git a/core/NumberFormatter.php b/core/NumberFormatter.php index 64fb04b49f32c924d2bd9fbc76474cf3a8456fc4..2b8656b83a3697c02a294a88aa12c650cf7f3990 100644 --- a/core/NumberFormatter.php +++ b/core/NumberFormatter.php @@ -7,13 +7,15 @@ * */ namespace Piwik; +use Piwik\Container\StaticContainer; +use Piwik\Translation\Translator; /** * Class NumberFormatter * * Used to format numbers according to current language */ -class NumberFormatter extends Singleton +class NumberFormatter { /** @var string language specific patterns for numbers */ protected $patternNumber; @@ -51,18 +53,23 @@ class NumberFormatter extends Singleton /** * Loads all required data from Intl plugin * + * TODO: instead of going directly through Translator, there should be a specific class + * that gets needed characters (ie, NumberFormatSource). The default implementation + * can use the Translator. This will make it easier to unit test NumberFormatter, + * w/o needing the Piwik Environment. + * * @return NumberFormatter */ - public function __construct() + public function __construct(Translator $translator) { - $this->patternNumber = Piwik::translate('Intl_NumberFormatNumber'); - $this->patternCurrency = Piwik::translate('Intl_NumberFormatCurrency'); - $this->patternPercent = Piwik::translate('Intl_NumberFormatPercent'); - $this->symbolPlus = Piwik::translate('Intl_NumberSymbolPlus'); - $this->symbolMinus = Piwik::translate('Intl_NumberSymbolMinus'); - $this->symbolPercent = Piwik::translate('Intl_NumberSymbolPercent'); - $this->symbolGroup = Piwik::translate('Intl_NumberSymbolGroup'); - $this->symbolDecimal = Piwik::translate('Intl_NumberSymbolDecimal'); + $this->patternNumber = $translator->translate('Intl_NumberFormatNumber'); + $this->patternCurrency = $translator->translate('Intl_NumberFormatCurrency'); + $this->patternPercent = $translator->translate('Intl_NumberFormatPercent'); + $this->symbolPlus = $translator->translate('Intl_NumberSymbolPlus'); + $this->symbolMinus = $translator->translate('Intl_NumberSymbolMinus'); + $this->symbolPercent = $translator->translate('Intl_NumberSymbolPercent'); + $this->symbolGroup = $translator->translate('Intl_NumberSymbolGroup'); + $this->symbolDecimal = $translator->translate('Intl_NumberSymbolDecimal'); } /** @@ -306,4 +313,13 @@ class NumberFormatter extends Singleton { return $value < 0; } + + /** + * @deprecated + * @return self + */ + public static function getInstance() + { + return StaticContainer::get('Piwik\NumberFormatter'); + } } \ No newline at end of file diff --git a/tests/PHPUnit/Integration/NumberFormatterTest.php b/tests/PHPUnit/Integration/NumberFormatterTest.php index 981b289f2b29495dfc9ca54a1c8db586f3333f08..dc546ef9d87b6cd8670431c8ef0b35ebd91b5bf0 100644 --- a/tests/PHPUnit/Integration/NumberFormatterTest.php +++ b/tests/PHPUnit/Integration/NumberFormatterTest.php @@ -10,7 +10,7 @@ namespace Piwik\Tests\Integration; use Piwik\Container\StaticContainer; use Piwik\NumberFormatter; -use Piwik\Translate; +use Piwik\Translation\Translator; /** * @group Core @@ -18,15 +18,48 @@ use Piwik\Translate; */ class NumberFormatterTest extends \PHPUnit_Framework_TestCase { + /** + * @var Translator + */ + private $translator; + public function setUp() { - Translate::loadAllTranslations(); + \Piwik\Plugin\Manager::getInstance()->loadPluginTranslations(); + + $this->translator = StaticContainer::get('Piwik\Translation\Translator'); } public function tearDown() { - StaticContainer::get('Piwik\NumberFormatter')->unsetInstance(); - Translate::reset(); + $this->translator->reset(); + } + + /** + * @dataProvider getFormatMethodTestData + */ + public function test_format_CorrectlyFormatsValueAsNumberOrPercent( + $language, $value, $maximumFractionDigits, $minimumFractionDigits, $expected) + { + $this->translator->setCurrentLanguage($language); + $numberFormatter = new NumberFormatter($this->translator); + $this->assertEquals($expected, $numberFormatter->format($value, $maximumFractionDigits,$minimumFractionDigits)); + } + + public function getFormatMethodTestData() + { + return array( + // number formatting + array('en', 5, 0, 0, '5'), + array('en', -5, 0, 3, '-5'), + array('en', 5.299, 0, 0, '5'), + array('en', 5.299, 3, 0, '5.299'), + array('en', sqrt(33), 2, 0, '5.74'), + + // percent formatting + array('en', '5.299%', 0, 0, '5%'), + array('en', '5.299%', 3, 0, '5.299%'), + ); } /** @@ -34,9 +67,10 @@ class NumberFormatterTest extends \PHPUnit_Framework_TestCase */ public function testNumberFormatting($language, $value, $maximumFractionDigits, $minimumFractionDigits, $expected) { - StaticContainer::get('Piwik\Translation\Translator')->setCurrentLanguage($language); - $formatter = NumberFormatter::getInstance(); - $this->assertEquals($expected, $formatter->formatNumber($value, $maximumFractionDigits, $minimumFractionDigits)); + $this->translator->setCurrentLanguage($language); + $numberFormatter = new NumberFormatter($this->translator); + + $this->assertEquals($expected, $numberFormatter->formatNumber($value, $maximumFractionDigits, $minimumFractionDigits)); } public function getNumberFormattingTestData() @@ -67,9 +101,9 @@ class NumberFormatterTest extends \PHPUnit_Framework_TestCase */ public function testPercentNumberFormatting($language, $value, $maximumFractionDigits, $minimumFractionDigits, $expected) { - StaticContainer::get('Piwik\Translation\Translator')->setCurrentLanguage($language); - $formatter = NumberFormatter::getInstance(); - $this->assertEquals($expected, $formatter->formatPercent($value, $maximumFractionDigits, $minimumFractionDigits)); + $this->translator->setCurrentLanguage($language); + $numberFormatter = new NumberFormatter($this->translator); + $this->assertEquals($expected, $numberFormatter->formatPercent($value, $maximumFractionDigits, $minimumFractionDigits)); } public function getPercentNumberFormattingTestData() @@ -101,9 +135,9 @@ class NumberFormatterTest extends \PHPUnit_Framework_TestCase */ public function testPercentEvolutionNumberFormatting($language, $value, $expected) { - StaticContainer::get('Piwik\Translation\Translator')->setCurrentLanguage($language); - $formatter = NumberFormatter::getInstance(); - $this->assertEquals($expected, $formatter->formatPercentEvolution($value)); + $this->translator->setCurrentLanguage($language); + $numberFormatter = new NumberFormatter($this->translator); + $this->assertEquals($expected, $numberFormatter->formatPercentEvolution($value)); } public function getPercentNumberEvolutionFormattingTestData()