Вход Регистрация
Файл: symfony-2.7/src/Symfony/Component/Intl/Tests/NumberFormatter/AbstractNumberFormatterTest.php
Строк: 677
<?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 SymfonyComponentIntlTestsNumberFormatter;

use 
SymfonyComponentIntlGlobalsIntlGlobals;
use 
SymfonyComponentIntlLocale;
use 
SymfonyComponentIntlNumberFormatterNumberFormatter;
use 
SymfonyComponentIntlUtilIntlTestHelper;

/**
 * Note that there are some values written like -2147483647 - 1. This is the lower 32bit int max and is a known
 * behavior of PHP.
 */
abstract class AbstractNumberFormatterTest extends PHPUnit_Framework_TestCase
{
    
/**
     * @dataProvider formatCurrencyWithDecimalStyleProvider
     */
    
public function testFormatCurrencyWithDecimalStyle($value$currency$expected)
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$this->assertEquals($expected$formatter->formatCurrency($value$currency));
    }

    public function 
formatCurrencyWithDecimalStyleProvider()
    {
        return array(
            array(
100'ALL''100'),
            array(
100'BRL''100.00'),
            array(
100'CRC''100'),
            array(
100'JPY''100'),
            array(
100'CHF''100'),
            array(-
100'ALL''-100'),
            array(-
100'BRL''-100'),
            array(-
100'CRC''-100'),
            array(-
100'JPY''-100'),
            array(-
100'CHF''-100'),
            array(
1000.12'ALL''1,000.12'),
            array(
1000.12'BRL''1,000.12'),
            array(
1000.12'CRC''1,000.12'),
            array(
1000.12'JPY''1,000.12'),
            array(
1000.12'CHF''1,000.12'),
        );
    }

    
/**
     * @dataProvider formatCurrencyWithCurrencyStyleProvider
     */
    
public function testFormatCurrencyWithCurrencyStyle($value$currency$expected)
    {
        
IntlTestHelper::requireFullIntl($this);

        
$formatter $this->getNumberFormatter('en'NumberFormatter::CURRENCY);
        
$this->assertEquals($expected$formatter->formatCurrency($value$currency));
    }

    public function 
formatCurrencyWithCurrencyStyleProvider()
    {
        return array(
            array(
100'ALL''ALL100'),
            array(-
100'ALL''(ALL100)'),
            array(
1000.12'ALL''ALL1,000'),

            array(
100'JPY''¥100'),
            array(-
100'JPY''(¥100)'),
            array(
1000.12'JPY''¥1,000'),

            array(
100'EUR''€100.00'),
            array(-
100'EUR''(€100.00)'),
            array(
1000.12'EUR''€1,000.12'),
        );
    }

    
/**
     * @dataProvider formatCurrencyWithCurrencyStyleCostaRicanColonsRoundingProvider
     */
    
public function testFormatCurrencyWithCurrencyStyleCostaRicanColonsRounding($value$currency$symbol$expected)
    {
        
IntlTestHelper::requireFullIntl($this);

        
$formatter $this->getNumberFormatter('en'NumberFormatter::CURRENCY);
        
$this->assertEquals(sprintf($expected$symbol), $formatter->formatCurrency($value$currency));
    }

    public function 
formatCurrencyWithCurrencyStyleCostaRicanColonsRoundingProvider()
    {
        return array(
            array(
100'CRC''CRC''%s100'),
            array(-
100'CRC''CRC''(%s100)'),
            array(
1000.12'CRC''CRC''%s1,000'),
        );
    }

    
/**
     * @dataProvider formatCurrencyWithCurrencyStyleBrazilianRealRoundingProvider
     */
    
public function testFormatCurrencyWithCurrencyStyleBrazilianRealRounding($value$currency$symbol$expected)
    {
        
IntlTestHelper::requireFullIntl($this);

        
$formatter $this->getNumberFormatter('en'NumberFormatter::CURRENCY);
        
$this->assertEquals(sprintf($expected$symbol), $formatter->formatCurrency($value$currency));
    }

    public function 
formatCurrencyWithCurrencyStyleBrazilianRealRoundingProvider()
    {
        return array(
            array(
100'BRL''R''%s$100.00'),
            array(-
100'BRL''R''(%s$100.00)'),
            array(
1000.12'BRL''R''%s$1,000.12'),

            
// Rounding checks
            
array(1000.121'BRL''R''%s$1,000.12'),
            array(
1000.123'BRL''R''%s$1,000.12'),
            array(
1000.125'BRL''R''%s$1,000.12'),
            array(
1000.127'BRL''R''%s$1,000.13'),
            array(
1000.129'BRL''R''%s$1,000.13'),
            array(
11.50999'BRL''R''%s$11.51'),
            array(
11.9999464'BRL''R''%s$12.00'),
        );
    }

    
/**
     * @dataProvider formatCurrencyWithCurrencyStyleSwissRoundingProvider
     */
    
public function testFormatCurrencyWithCurrencyStyleSwissRounding($value$currency$symbol$expected)
    {
        
IntlTestHelper::requireFullIntl($this);

        
$formatter $this->getNumberFormatter('en'NumberFormatter::CURRENCY);
        
$this->assertEquals(sprintf($expected$symbol), $formatter->formatCurrency($value$currency));
    }

    public function 
formatCurrencyWithCurrencyStyleSwissRoundingProvider()
    {
        return array(
            array(
100'CHF''CHF''%s100.00'),
            array(-
100'CHF''CHF''(%s100.00)'),
            array(
1000.12'CHF''CHF''%s1,000.12'),
            array(
'1000.12''CHF''CHF''%s1,000.12'),

            
// Rounding checks
            
array(1000.121'CHF''CHF''%s1,000.12'),
            array(
1000.123'CHF''CHF''%s1,000.12'),
            array(
1000.125'CHF''CHF''%s1,000.12'),
            array(
1000.127'CHF''CHF''%s1,000.13'),
            array(
1000.129'CHF''CHF''%s1,000.13'),

            array(
1200000.00'CHF''CHF''%s1,200,000.00'),
            array(
1200000.1'CHF''CHF''%s1,200,000.10'),
            array(
1200000.10'CHF''CHF''%s1,200,000.10'),
            array(
1200000.101'CHF''CHF''%s1,200,000.10'),
        );
    }

    public function 
testFormat()
    {
        
$errorCode IntlGlobals::U_ZERO_ERROR;
        
$errorMessage 'U_ZERO_ERROR';

        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$this->assertSame('9.555'$formatter->format(9.555));

        
$this->assertSame($errorMessage$this->getIntlErrorMessage());
        
$this->assertSame($errorCode$this->getIntlErrorCode());
        
$this->assertFalse($this->isIntlFailure($this->getIntlErrorCode()));
        
$this->assertSame($errorMessage$formatter->getErrorMessage());
        
$this->assertSame($errorCode$formatter->getErrorCode());
        
$this->assertFalse($this->isIntlFailure($formatter->getErrorCode()));
    }

    public function 
testFormatWithCurrencyStyle()
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::CURRENCY);
        
$this->assertEquals('¤1.00'$formatter->format(1));
    }

    
/**
     * @dataProvider formatTypeInt32Provider
     */
    
public function testFormatTypeInt32($formatter$value$expected$message '')
    {
        
$formattedValue $formatter->format($valueNumberFormatter::TYPE_INT32);
        
$this->assertEquals($expected$formattedValue$message);
    }

    public function 
formatTypeInt32Provider()
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);

        
$message '->format() TYPE_INT32 formats inconsistently an integer if out of the 32 bit range.';

        return array(
            array(
$formatter1'1'),
            array(
$formatter1.1'1'),
            array(
$formatter2147483648'-2,147,483,648'$message),
            array(
$formatter, -2147483649'2,147,483,647'$message),
        );
    }

    
/**
     * @dataProvider formatTypeInt32WithCurrencyStyleProvider
     */
    
public function testFormatTypeInt32WithCurrencyStyle($formatter$value$expected$message '')
    {
        
$formattedValue $formatter->format($valueNumberFormatter::TYPE_INT32);
        
$this->assertEquals($expected$formattedValue$message);
    }

    public function 
formatTypeInt32WithCurrencyStyleProvider()
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::CURRENCY);

        
$message '->format() TYPE_INT32 formats inconsistently an integer if out of the 32 bit range.';

        return array(
            array(
$formatter1'¤1.00'),
            array(
$formatter1.1'¤1.00'),
            array(
$formatter2147483648'(¤2,147,483,648.00)'$message),
            array(
$formatter, -2147483649'¤2,147,483,647.00'$message),
        );
    }

    
/**
     * The parse() method works differently with integer out of the 32 bit range. format() works fine.
     *
     * @dataProvider formatTypeInt64Provider
     */
    
public function testFormatTypeInt64($formatter$value$expected)
    {
        
$formattedValue $formatter->format($valueNumberFormatter::TYPE_INT64);
        
$this->assertEquals($expected$formattedValue);
    }

    public function 
formatTypeInt64Provider()
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);

        return array(
            array(
$formatter1'1'),
            array(
$formatter1.1'1'),
            array(
$formatter2147483648'2,147,483,648'),
            array(
$formatter, -2147483649'-2,147,483,649'),
        );
    }

    
/**
     * @dataProvider formatTypeInt64WithCurrencyStyleProvider
     */
    
public function testFormatTypeInt64WithCurrencyStyle($formatter$value$expected)
    {
        
$formattedValue $formatter->format($valueNumberFormatter::TYPE_INT64);
        
$this->assertEquals($expected$formattedValue);
    }

    public function 
formatTypeInt64WithCurrencyStyleProvider()
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::CURRENCY);

        return array(
            array(
$formatter1'¤1.00'),
            array(
$formatter1.1'¤1.00'),
            array(
$formatter2147483648'¤2,147,483,648.00'),
            array(
$formatter, -2147483649'(¤2,147,483,649.00)'),
        );
    }

    
/**
     * @dataProvider formatTypeDoubleProvider
     */
    
public function testFormatTypeDouble($formatter$value$expected)
    {
        
$formattedValue $formatter->format($valueNumberFormatter::TYPE_DOUBLE);
        
$this->assertEquals($expected$formattedValue);
    }

    public function 
formatTypeDoubleProvider()
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);

        return array(
            array(
$formatter1'1'),
            array(
$formatter1.1'1.1'),
        );
    }

    
/**
     * @dataProvider formatTypeDoubleWithCurrencyStyleProvider
     */
    
public function testFormatTypeDoubleWithCurrencyStyle($formatter$value$expected)
    {
        
$formattedValue $formatter->format($valueNumberFormatter::TYPE_DOUBLE);
        
$this->assertEquals($expected$formattedValue);
    }

    public function 
formatTypeDoubleWithCurrencyStyleProvider()
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::CURRENCY);

        return array(
            array(
$formatter1'¤1.00'),
            array(
$formatter1.1'¤1.10'),
        );
    }

    
/**
     * @dataProvider formatTypeCurrencyProvider
     * @expectedException PHPUnit_Framework_Error_Warning
     */
    
public function testFormatTypeCurrency($formatter$value)
    {
        
$formatter->format($valueNumberFormatter::TYPE_CURRENCY);
    }

    
/**
     * @dataProvider formatTypeCurrencyProvider
     */
    
public function testFormatTypeCurrencyReturn($formatter$value)
    {
        
$this->assertFalse(@$formatter->format($valueNumberFormatter::TYPE_CURRENCY));
    }

    public function 
formatTypeCurrencyProvider()
    {
        
$df $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$cf $this->getNumberFormatter('en'NumberFormatter::CURRENCY);

        return array(
            array(
$df1),
            array(
$cf1),
        );
    }

    
/**
     * @dataProvider formatFractionDigitsProvider
     */
    
public function testFormatFractionDigits($value$expected$fractionDigits null$expectedFractionDigits 1)
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);

        
$attributeRet null;
        if (
null !== $fractionDigits) {
            
$attributeRet $formatter->setAttribute(NumberFormatter::FRACTION_DIGITS$fractionDigits);
        }

        
$formattedValue $formatter->format($value);
        
$this->assertSame($expected$formattedValue);
        
$this->assertSame($expectedFractionDigits$formatter->getAttribute(NumberFormatter::FRACTION_DIGITS));

        if (
null !== $attributeRet) {
            
$this->assertTrue($attributeRet);
        }
    }

    public function 
formatFractionDigitsProvider()
    {
        return array(
            array(
1.123'1.123'null0),
            array(
1.123'1'00),
            array(
1.123'1.1'11),
            array(
1.123'1.12'22),
            array(
1.123'1', -10),
            array(
1.123'1''abc'0),
        );
    }

    
/**
     * @dataProvider formatGroupingUsedProvider
     */
    
public function testFormatGroupingUsed($value$expected$groupingUsed null$expectedGroupingUsed 1)
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);

        
$attributeRet null;
        if (
null !== $groupingUsed) {
            
$attributeRet $formatter->setAttribute(NumberFormatter::GROUPING_USED$groupingUsed);
        }

        
$formattedValue $formatter->format($value);
        
$this->assertSame($expected$formattedValue);
        
$this->assertSame($expectedGroupingUsed$formatter->getAttribute(NumberFormatter::GROUPING_USED));

        if (
null !== $attributeRet) {
            
$this->assertTrue($attributeRet);
        }
    }

    public function 
formatGroupingUsedProvider()
    {
        return array(
            array(
1000'1,000'null1),
            array(
1000'1000'00),
            array(
1000'1,000'11),
            array(
1000'1,000'21),
            array(
1000'1000''abc'0),
            array(
1000'1,000', -11),
        );
    }

    
/**
     * @dataProvider formatRoundingModeRoundHalfUpProvider
     */
    
public function testFormatRoundingModeHalfUp($value$expected)
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS2);

        
$formatter->setAttribute(NumberFormatter::ROUNDING_MODENumberFormatter::ROUND_HALFUP);
        
$this->assertSame($expected$formatter->format($value), '->format() with ROUND_HALFUP rounding mode.');
    }

    public function 
formatRoundingModeRoundHalfUpProvider()
    {
        
// The commented value is differently rounded by intl's NumberFormatter in 32 and 64 bit architectures
        
return array(
            array(
1.121'1.12'),
            array(
1.123'1.12'),
            
// array(1.125, '1.13'),
            
array(1.127'1.13'),
            array(
1.129'1.13'),
        );
    }

    
/**
     * @dataProvider formatRoundingModeRoundHalfDownProvider
     */
    
public function testFormatRoundingModeHalfDown($value$expected)
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS2);

        
$formatter->setAttribute(NumberFormatter::ROUNDING_MODENumberFormatter::ROUND_HALFDOWN);
        
$this->assertSame($expected$formatter->format($value), '->format() with ROUND_HALFDOWN rounding mode.');
    }

    public function 
formatRoundingModeRoundHalfDownProvider()
    {
        return array(
            array(
1.121'1.12'),
            array(
1.123'1.12'),
            array(
1.125'1.12'),
            array(
1.127'1.13'),
            array(
1.129'1.13'),
        );
    }

    
/**
     * @dataProvider formatRoundingModeRoundHalfEvenProvider
     */
    
public function testFormatRoundingModeHalfEven($value$expected)
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS2);

        
$formatter->setAttribute(NumberFormatter::ROUNDING_MODENumberFormatter::ROUND_HALFEVEN);
        
$this->assertSame($expected$formatter->format($value), '->format() with ROUND_HALFEVEN rounding mode.');
    }

    public function 
formatRoundingModeRoundHalfEvenProvider()
    {
        return array(
            array(
1.121'1.12'),
            array(
1.123'1.12'),
            array(
1.125'1.12'),
            array(
1.127'1.13'),
            array(
1.129'1.13'),
        );
    }

    
/**
     * @dataProvider formatRoundingModeRoundCeilingProvider
     */
    
public function testFormatRoundingModeCeiling($value$expected)
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS2);

        
$formatter->setAttribute(NumberFormatter::ROUNDING_MODENumberFormatter::ROUND_CEILING);
        
$this->assertSame($expected$formatter->format($value), '->format() with ROUND_CEILING rounding mode.');
    }

    public function 
formatRoundingModeRoundCeilingProvider()
    {
        return array(
            array(
1.123'1.13'),
            array(
1.125'1.13'),
            array(
1.127'1.13'),
            array(-
1.123'-1.12'),
            array(-
1.125'-1.12'),
            array(-
1.127'-1.12'),
        );
    }

    
/**
     * @dataProvider formatRoundingModeRoundFloorProvider
     */
    
public function testFormatRoundingModeFloor($value$expected)
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS2);

        
$formatter->setAttribute(NumberFormatter::ROUNDING_MODENumberFormatter::ROUND_FLOOR);
        
$this->assertSame($expected$formatter->format($value), '->format() with ROUND_FLOOR rounding mode.');
    }

    public function 
formatRoundingModeRoundFloorProvider()
    {
        return array(
            array(
1.123'1.12'),
            array(
1.125'1.12'),
            array(
1.127'1.12'),
            array(-
1.123'-1.13'),
            array(-
1.125'-1.13'),
            array(-
1.127'-1.13'),
        );
    }

    
/**
     * @dataProvider formatRoundingModeRoundDownProvider
     */
    
public function testFormatRoundingModeDown($value$expected)
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS2);

        
$formatter->setAttribute(NumberFormatter::ROUNDING_MODENumberFormatter::ROUND_DOWN);
        
$this->assertSame($expected$formatter->format($value), '->format() with ROUND_DOWN rounding mode.');
    }

    public function 
formatRoundingModeRoundDownProvider()
    {
        return array(
            array(
1.123'1.12'),
            array(
1.125'1.12'),
            array(
1.127'1.12'),
            array(-
1.123'-1.12'),
            array(-
1.125'-1.12'),
            array(-
1.127'-1.12'),
        );
    }

    
/**
     * @dataProvider formatRoundingModeRoundUpProvider
     */
    
public function testFormatRoundingModeUp($value$expected)
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS2);

        
$formatter->setAttribute(NumberFormatter::ROUNDING_MODENumberFormatter::ROUND_UP);
        
$this->assertSame($expected$formatter->format($value), '->format() with ROUND_UP rounding mode.');
    }

    public function 
formatRoundingModeRoundUpProvider()
    {
        return array(
            array(
1.123'1.13'),
            array(
1.125'1.13'),
            array(
1.127'1.13'),
            array(-
1.123'-1.13'),
            array(-
1.125'-1.13'),
            array(-
1.127'-1.13'),
        );
    }

    public function 
testGetLocale()
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$this->assertEquals('en'$formatter->getLocale());
    }

    public function 
testGetSymbol()
    {
        
$decimalFormatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$currencyFormatter $this->getNumberFormatter('en'NumberFormatter::CURRENCY);

        
$r = new ReflectionProperty('SymfonyComponentIntlNumberFormatterNumberFormatter''enSymbols');
        
$r->setAccessible(true);
        
$expected $r->getValue('SymfonyComponentIntlNumberFormatterNumberFormatter');

        for (
$i 0$i <= 17$i++) {
            
$this->assertSame($expected[1][$i], $decimalFormatter->getSymbol($i));
            
$this->assertSame($expected[2][$i], $currencyFormatter->getSymbol($i));
        }
    }

    public function 
testGetTextAttribute()
    {
        
$decimalFormatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$currencyFormatter $this->getNumberFormatter('en'NumberFormatter::CURRENCY);

        
$r = new ReflectionProperty('SymfonyComponentIntlNumberFormatterNumberFormatter''enTextAttributes');
        
$r->setAccessible(true);
        
$expected $r->getValue('SymfonyComponentIntlNumberFormatterNumberFormatter');

        for (
$i 0$i <= 5$i++) {
            
$this->assertSame($expected[1][$i], $decimalFormatter->getTextAttribute($i));
            
$this->assertSame($expected[2][$i], $currencyFormatter->getTextAttribute($i));
        }
    }

    
/**
     * @dataProvider parseProvider
     */
    
public function testParse($value$expected$message$expectedPosition)
    {
        
$position 0;
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$parsedValue $formatter->parse($valueNumberFormatter::TYPE_DOUBLE$position);
        
$this->assertSame($expected$parsedValue$message);
        
$this->assertSame($expectedPosition$position$message);

        if (
$expected === false) {
            
$errorCode IntlGlobals::U_PARSE_ERROR;
            
$errorMessage 'Number parsing failed: U_PARSE_ERROR';
        } else {
            
$errorCode IntlGlobals::U_ZERO_ERROR;
            
$errorMessage 'U_ZERO_ERROR';
        }

        
$this->assertSame($errorMessage$this->getIntlErrorMessage());
        
$this->assertSame($errorCode$this->getIntlErrorCode());
        
$this->assertSame($errorCode !== 0$this->isIntlFailure($this->getIntlErrorCode()));
        
$this->assertSame($errorMessage$formatter->getErrorMessage());
        
$this->assertSame($errorCode$formatter->getErrorCode());
        
$this->assertSame($errorCode !== 0$this->isIntlFailure($formatter->getErrorCode()));
    }

    public function 
parseProvider()
    {
        return array(
            array(
'prefix1'false'->parse() does not parse a number with a string prefix.'0),
            array(
'1.4suffix', (float) 1.4'->parse() parses a number with a string suffix.'3),
        );
    }

    
/**
     * @expectedException PHPUnit_Framework_Error_Warning
     */
    
public function testParseTypeDefault()
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$formatter->parse('1'NumberFormatter::TYPE_DEFAULT);
    }

    
/**
     * @dataProvider parseTypeInt32Provider
     */
    
public function testParseTypeInt32($value$expected$message '')
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$parsedValue $formatter->parse($valueNumberFormatter::TYPE_INT32);
        
$this->assertSame($expected$parsedValue);
    }

    public function 
parseTypeInt32Provider()
    {
        return array(
            array(
'1'1),
            array(
'1.1'1),
            array(
'.1'0),
            array(
'2,147,483,647'2147483647),
            array(
'-2,147,483,648', -2147483647 1),
            array(
'2,147,483,648'false'->parse() TYPE_INT32 returns false when the number is greater than the integer positive range.'),
            array(
'-2,147,483,649'false'->parse() TYPE_INT32 returns false when the number is greater than the integer negative range.'),
        );
    }

    public function 
testParseTypeInt64With32BitIntegerInPhp32Bit()
    {
        
IntlTestHelper::require32Bit($this);

        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);

        
$parsedValue $formatter->parse('2,147,483,647'NumberFormatter::TYPE_INT64);
        
$this->assertInternalType('integer'$parsedValue);
        
$this->assertEquals(2147483647$parsedValue);

        
$parsedValue $formatter->parse('-2,147,483,648'NumberFormatter::TYPE_INT64);

        
// Bug #59597 was fixed on PHP 5.3.14 and 5.4.4
        // The negative PHP_INT_MAX was being converted to float
        
if ((PHP_VERSION_ID 50400 && PHP_VERSION_ID >= 50314) || PHP_VERSION_ID >= 50404) {
            
$this->assertInternalType('int'$parsedValue);
        } else {
            
$this->assertInternalType('float'$parsedValue);
        }

        
$this->assertEquals(-2147483648$parsedValue);
    }

    public function 
testParseTypeInt64With32BitIntegerInPhp64Bit()
    {
        
IntlTestHelper::require64Bit($this);

        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);

        
$parsedValue $formatter->parse('2,147,483,647'NumberFormatter::TYPE_INT64);
        
$this->assertInternalType('integer'$parsedValue);
        
$this->assertEquals(2147483647$parsedValue);

        
$parsedValue $formatter->parse('-2,147,483,648'NumberFormatter::TYPE_INT64);
        
$this->assertInternalType('integer'$parsedValue);
        
$this->assertEquals(-2147483647 1$parsedValue);
    }

    
/**
     * If PHP is compiled in 32bit mode, the returned value for a 64bit integer are float numbers.
     */
    
public function testParseTypeInt64With64BitIntegerInPhp32Bit()
    {
        
IntlTestHelper::require32Bit($this);

        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);

        
// int 64 using only 32 bit range strangeness
        
$parsedValue $formatter->parse('2,147,483,648'NumberFormatter::TYPE_INT64);
        
$this->assertInternalType('float'$parsedValue);
        
$this->assertEquals(2147483648$parsedValue'->parse() TYPE_INT64 does not use true 64 bit integers, using only the 32 bit range.');

        
$parsedValue $formatter->parse('-2,147,483,649'NumberFormatter::TYPE_INT64);
        
$this->assertInternalType('float'$parsedValue);
        
$this->assertEquals(-2147483649$parsedValue'->parse() TYPE_INT64 does not use true 64 bit integers, using only the 32 bit range.');
    }

    
/**
     * If PHP is compiled in 64bit mode, the returned value for a 64bit integer are 32bit integer numbers.
     */
    
public function testParseTypeInt64With64BitIntegerInPhp64Bit()
    {
        
IntlTestHelper::require64Bit($this);

        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);

        
$parsedValue $formatter->parse('2,147,483,648'NumberFormatter::TYPE_INT64);
        
$this->assertInternalType('integer'$parsedValue);

        
// Bug #59597 was fixed on PHP 5.3.14 and 5.4.4
        // A 32 bit integer was being generated instead of a 64 bit integer
        
if (PHP_VERSION_ID 50314 || (PHP_VERSION_ID >= 50400 && PHP_VERSION_ID 50404)) {
            
$this->assertEquals(-2147483648$parsedValue'->parse() TYPE_INT64 does not use true 64 bit integers, using only the 32 bit range (PHP < 5.3.14 and PHP < 5.4.4).');
        } else {
            
$this->assertEquals(2147483648$parsedValue'->parse() TYPE_INT64 uses true 64 bit integers (PHP >= 5.3.14 and PHP >= 5.4.4).');
        }

        
$parsedValue $formatter->parse('-2,147,483,649'NumberFormatter::TYPE_INT64);
        
$this->assertInternalType('integer'$parsedValue);

        
// Bug #59597 was fixed on PHP 5.3.14 and 5.4.4
        // A 32 bit integer was being generated instead of a 64 bit integer
        
if (PHP_VERSION_ID 50314 || (PHP_VERSION_ID >= 50400 && PHP_VERSION_ID 50404)) {
            
$this->assertEquals(2147483647$parsedValue'->parse() TYPE_INT64 does not use true 64 bit integers, using only the 32 bit range  (PHP < 5.3.14 and PHP < 5.4.4).');
        } else {
            
$this->assertEquals(-2147483649$parsedValue'->parse() TYPE_INT64 uses true 64 bit integers (PHP >= 5.3.14 and PHP >= 5.4.4).');
        }
    }

    
/**
     * @dataProvider parseTypeDoubleProvider
     */
    
public function testParseTypeDouble($value$expectedValue)
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$parsedValue $formatter->parse($valueNumberFormatter::TYPE_DOUBLE);
        
$this->assertEquals($expectedValue$parsedValue''0.001);
    }

    public function 
parseTypeDoubleProvider()
    {
        return array(
            array(
'1', (float) 1),
            array(
'1.1'1.1),
            array(
'9,223,372,036,854,775,808'9223372036854775808),
            array(
'-9,223,372,036,854,775,809', -9223372036854775809),
        );
    }

    
/**
     * @expectedException PHPUnit_Framework_Error_Warning
     */
    
public function testParseTypeCurrency()
    {
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$formatter->parse('1'NumberFormatter::TYPE_CURRENCY);
    }

    public function 
testParseWithNotNullPositionValue()
    {
        
$position 1;
        
$formatter $this->getNumberFormatter('en'NumberFormatter::DECIMAL);
        
$formatter->parse('123'NumberFormatter::TYPE_DOUBLE$position);
        
$this->assertEquals(3$position);
    }

    
/**
     * @param string $locale
     * @param null   $style
     * @param null   $pattern
     *
     * @return NumberFormatter
     */
    
abstract protected function getNumberFormatter($locale 'en'$style null$pattern null);

    
/**
     * @return string
     */
    
abstract protected function getIntlErrorMessage();

    
/**
     * @return int
     */
    
abstract protected function getIntlErrorCode();

    
/**
     * @param int $errorCode
     *
     * @return bool
     */
    
abstract protected function isIntlFailure($errorCode);
}
Онлайн: 0
Реклама