Skip to content

Commit

Permalink
Fixed override for Decimal patterns in CLDR
Browse files Browse the repository at this point in the history
  • Loading branch information
Progi1984 committed Nov 17, 2020
1 parent c1b0103 commit 89c9f44
Show file tree
Hide file tree
Showing 2 changed files with 191 additions and 23 deletions.
52 changes: 29 additions & 23 deletions src/Core/Localization/CLDR/LocaleData.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,22 +39,22 @@ class LocaleData
* The locale code for this data (either language code or IETF tag).
* e.G.: 'fr', 'fr-FR'...
*
* @var string
* @var string|null
*/
protected $localeCode;

/**
* List of available numbering systems
* Array of strings (codes).
*
* @var string[]
* @var string[]|null
*/
protected $numberingSystems;

/**
* Default numbering system.
*
* @var string
* @var string|null
*/
protected $defaultNumberingSystem;

Expand All @@ -64,45 +64,45 @@ class LocaleData
* 1 -> grouping starts at 4 figures integers (1,000 and more)
* 2 -> grouping starts at 5 figures integers (10,000 and more)
*
* @var int
* @var int|null
*/
protected $minimumGroupingDigits;

/**
* Collection of all available symbols list (by numbering system).
*
* @var NumberSymbolsData[]
* @var NumberSymbolsData[]|null
*/
protected $numberSymbols;

/**
* Collection of all available decimal patterns (by numbering system)
* Array of strings (patterns).
*
* @var string[]
* @var string[]|null
*/
protected $decimalPatterns;

/**
* Collection of all available percent patterns (by numbering system)
* Array of strings (patterns).
*
* @var string[]
* @var string[]|null
*/
protected $percentPatterns;

/**
* Collection of all available currency patterns (by numbering system)
* Array of strings (patterns).
*
* @var string[]
* @var string[]|null
*/
protected $currencyPatterns;

/**
* All currencies, by ISO code.
*
* @var CurrencyData[]
* @var CurrencyData[]|null
*/
protected $currencies;

Expand All @@ -123,7 +123,7 @@ public function overrideWith(LocaleData $localeData)
if (null === $this->numberingSystems) {
$this->numberingSystems = [];
}
$this->numberingSystems = array_merge($this->numberingSystems, $localeData->getNumberingSystems());
$this->setNumberingSystems(array_merge($this->numberingSystems, $localeData->getNumberingSystems()));
}

if (null !== $localeData->getDefaultNumberingSystem()) {
Expand All @@ -146,18 +146,24 @@ public function overrideWith(LocaleData $localeData)
}

if (null !== $localeData->getDecimalPatterns()) {
$this->setDecimalPatterns($localeData->getDecimalPatterns());
if (null === $this->decimalPatterns) {
$this->decimalPatterns = [];
}
$this->setDecimalPatterns(array_merge($this->decimalPatterns, $localeData->getDecimalPatterns()));
}

if (null !== $localeData->getPercentPatterns()) {
$this->setPercentPatterns($localeData->getPercentPatterns());
if (null === $this->percentPatterns) {
$this->percentPatterns = [];
}
$this->setPercentPatterns(array_merge($this->numberingSystems, $localeData->getPercentPatterns()));
}

if (null !== $localeData->getCurrencyPatterns()) {
if (null === $this->currencyPatterns) {
$this->currencyPatterns = [];
}
$this->currencyPatterns = array_merge($this->currencyPatterns, $localeData->getCurrencyPatterns());
$this->setCurrencyPatterns(array_merge($this->currencyPatterns, $localeData->getCurrencyPatterns()));
}

if (null !== $localeData->getCurrencies()) {
Expand All @@ -174,7 +180,7 @@ public function overrideWith(LocaleData $localeData)
}

/**
* @return string
* @return string|null
*/
public function getLocaleCode()
{
Expand All @@ -194,7 +200,7 @@ public function setLocaleCode($localeCode)
}

/**
* @return string[]
* @return string[]|null
*/
public function getNumberingSystems()
{
Expand All @@ -214,7 +220,7 @@ public function setNumberingSystems($numberingSystems)
}

/**
* @return string
* @return string|null
*/
public function getDefaultNumberingSystem()
{
Expand All @@ -234,7 +240,7 @@ public function setDefaultNumberingSystem($defaultNumberingSystem)
}

/**
* @return int
* @return int|null
*/
public function getMinimumGroupingDigits()
{
Expand All @@ -254,15 +260,15 @@ public function setMinimumGroupingDigits($minimumGroupingDigits)
}

/**
* @return \PrestaShop\PrestaShop\Core\Localization\CLDR\NumberSymbolsData[]
* @return NumberSymbolsData[]|null
*/
public function getNumberSymbols()
{
return $this->numberSymbols;
}

/**
* @param \PrestaShop\PrestaShop\Core\Localization\CLDR\NumberSymbolsData[] $numberSymbols
* @param NumberSymbolsData[] $numberSymbols
*
* @return LocaleData
*/
Expand All @@ -274,7 +280,7 @@ public function setNumberSymbols($numberSymbols)
}

/**
* @return string[]
* @return string[]|null
*/
public function getDecimalPatterns()
{
Expand All @@ -294,7 +300,7 @@ public function setDecimalPatterns($decimalPatterns)
}

/**
* @return string[]
* @return string[]|null
*/
public function getPercentPatterns()
{
Expand All @@ -314,7 +320,7 @@ public function setPercentPatterns($percentPatterns)
}

/**
* @return string[]
* @return string[]|null
*/
public function getCurrencyPatterns()
{
Expand All @@ -334,7 +340,7 @@ public function setCurrencyPatterns($currencyPatterns)
}

/**
* @return CurrencyData[]
* @return CurrencyData[]|null
*/
public function getCurrencies()
{
Expand Down
162 changes: 162 additions & 0 deletions tests/Unit/Core/Localization/CLDR/LocaleDataTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
<?php
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/OSL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to [email protected] so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <[email protected]>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
*/

namespace Tests\Unit\Core\Localization\CLDR;

use PHPUnit\Framework\TestCase;
use PrestaShop\PrestaShop\Core\Localization\CLDR\LocaleData;

class LocaleDataTest extends TestCase
{
/**
* @var LocaleData
*/
private $localeData;

/**
* Setup tested dependency
*/
public function setUp()
{
$this->localeData = new LocaleData();
}

/**
* @param array|null $decimalPatternsInitial
* @param array|null $decimalPatternsOverride
* @param array|null $decimalPatternsExpected
*
* @dataProvider providerDecimalPatterns
*/
public function testOverrideWithDecimalPatterns(
?array $decimalPatternsInitial,
?array $decimalPatternsOverride,
?array $decimalPatternsExpected
) {
// Initial
$this->localeData->setDecimalPatterns($decimalPatternsInitial);

// Override
$localeData = new LocaleData();
if (null !== $decimalPatternsOverride) {
$localeData->setDecimalPatterns($decimalPatternsOverride);
}

// Result
$result = $this->localeData->overrideWith($localeData);
$this->assertInstanceOf(LocaleData::class, $result);
$this->assertEquals($decimalPatternsExpected, $result->getDecimalPatterns());
}

public function providerDecimalPatterns(): array
{
return [
[
null,
null,
null,
],
[
null,
['latn' => 'A'],
['latn' => 'A'],
],
[
['latn' => 'A'],
['latn' => 'B'],
['latn' => 'B'],
],
[
['arab' => 'A'],
['latn' => 'B'],
['arab' => 'A', 'latn' => 'B'],
],
[
['arab' => 'A', 'latn' => 'B'],
['latn' => 'C'],
['arab' => 'A', 'latn' => 'C'],
],
];
}

/**
* @param array|null $decimalPatternsInitial
* @param array|null $decimalPatternsOverride
* @param array|null $decimalPatternsExpected
*
* @dataProvider providerPercentPatterns
*/
public function testOverrideWithPercentPatterns(
?array $decimalPatternsInitial,
?array $decimalPatternsOverride,
?array $decimalPatternsExpected
) {
// Initial
$this->localeData->setDecimalPatterns($decimalPatternsInitial);

// Override
$localeData = new LocaleData();
if (null !== $decimalPatternsOverride) {
$localeData->setDecimalPatterns($decimalPatternsOverride);
}

// Result
$result = $this->localeData->overrideWith($localeData);
$this->assertInstanceOf(LocaleData::class, $result);
$this->assertEquals($decimalPatternsExpected, $result->getDecimalPatterns());
}

public function providerPercentPatterns(): array
{
return [
[
null,
null,
null,
],
[
null,
['latn' => 'A %'],
['latn' => 'A %'],
],
[
['latn' => 'A %'],
['latn' => 'B %'],
['latn' => 'B %'],
],
[
['arab' => 'A %'],
['latn' => 'B %'],
['arab' => 'A %', 'latn' => 'B %'],
],
[
['arab' => 'A %', 'latn' => 'B %'],
['latn' => 'C %'],
['arab' => 'A %', 'latn' => 'C %'],
],
];
}
}

0 comments on commit 89c9f44

Please sign in to comment.