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

use 
SymfonyComponentIntlExceptionResourceBundleNotFoundException;
use 
SymfonyComponentIntlDataBundleReaderBundleEntryReader;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class BundleEntryReaderTest extends PHPUnit_Framework_TestCase
{
    const 
RES_DIR '/res/dir';

    
/**
     * @var BundleEntryReader
     */
    
private $reader;

    
/**
     * @var PHPUnit_Framework_MockObject_MockObject
     */
    
private $readerImpl;

    private static 
$data = array(
        
'Entries' => array(
            
'Foo' => 'Bar',
            
'Bar' => 'Baz',
        ),
        
'Foo' => 'Bar',
        
'Version' => '2.0',
    );

    private static 
$fallbackData = array(
        
'Entries' => array(
            
'Foo' => 'Foo',
            
'Bam' => 'Lah',
        ),
        
'Baz' => 'Foo',
        
'Version' => '1.0',
    );

    private static 
$mergedData = array(
        
// no recursive merging -> too complicated
        
'Entries' => array(
            
'Foo' => 'Bar',
            
'Bar' => 'Baz',
        ),
        
'Baz' => 'Foo',
        
'Version' => '2.0',
        
'Foo' => 'Bar',
    );

    protected function 
setUp()
    {
        
$this->readerImpl $this->getMock('SymfonyComponentIntlDataBundleReaderBundleEntryReaderInterface');
        
$this->reader = new BundleEntryReader($this->readerImpl);
    }

    public function 
testForwardCallToRead()
    {
        
$this->readerImpl->expects($this->once())
            ->
method('read')
            ->
with(self::RES_DIR'root')
            ->
will($this->returnValue(self::$data));

        
$this->assertSame(self::$data$this->reader->read(self::RES_DIR'root'));
    }

    public function 
testReadEntireDataFileIfNoIndicesGiven()
    {
        
$this->readerImpl->expects($this->at(0))
            ->
method('read')
            ->
with(self::RES_DIR'en')
            ->
will($this->returnValue(self::$data));

        
$this->readerImpl->expects($this->at(1))
            ->
method('read')
            ->
with(self::RES_DIR'root')
            ->
will($this->returnValue(self::$fallbackData));

        
$this->assertSame(self::$mergedData$this->reader->readEntry(self::RES_DIR'en', array()));
    }

    public function 
testReadExistingEntry()
    {
        
$this->readerImpl->expects($this->once())
            ->
method('read')
            ->
with(self::RES_DIR'root')
            ->
will($this->returnValue(self::$data));

        
$this->assertSame('Bar'$this->reader->readEntry(self::RES_DIR'root', array('Entries''Foo')));
    }

    
/**
     * @expectedException SymfonyComponentIntlExceptionMissingResourceException
     */
    
public function testReadNonExistingEntry()
    {
        
$this->readerImpl->expects($this->once())
            ->
method('read')
            ->
with(self::RES_DIR'root')
            ->
will($this->returnValue(self::$data));

        
$this->reader->readEntry(self::RES_DIR'root', array('Entries''NonExisting'));
    }

    public function 
testFallbackIfEntryDoesNotExist()
    {
        
$this->readerImpl->expects($this->at(0))
            ->
method('read')
            ->
with(self::RES_DIR'en_GB')
            ->
will($this->returnValue(self::$data));

        
$this->readerImpl->expects($this->at(1))
            ->
method('read')
            ->
with(self::RES_DIR'en')
            ->
will($this->returnValue(self::$fallbackData));

        
$this->assertSame('Lah'$this->reader->readEntry(self::RES_DIR'en_GB', array('Entries''Bam')));
    }

    
/**
     * @expectedException SymfonyComponentIntlExceptionMissingResourceException
     */
    
public function testDontFallbackIfEntryDoesNotExistAndFallbackDisabled()
    {
        
$this->readerImpl->expects($this->once())
            ->
method('read')
            ->
with(self::RES_DIR'en_GB')
            ->
will($this->returnValue(self::$data));

        
$this->reader->readEntry(self::RES_DIR'en_GB', array('Entries''Bam'), false);
    }

    public function 
testFallbackIfLocaleDoesNotExist()
    {
        
$this->readerImpl->expects($this->at(0))
            ->
method('read')
            ->
with(self::RES_DIR'en_GB')
            ->
will($this->throwException(new ResourceBundleNotFoundException()));

        
$this->readerImpl->expects($this->at(1))
            ->
method('read')
            ->
with(self::RES_DIR'en')
            ->
will($this->returnValue(self::$fallbackData));

        
$this->assertSame('Lah'$this->reader->readEntry(self::RES_DIR'en_GB', array('Entries''Bam')));
    }

    
/**
     * @expectedException SymfonyComponentIntlExceptionMissingResourceException
     */
    
public function testDontFallbackIfLocaleDoesNotExistAndFallbackDisabled()
    {
        
$this->readerImpl->expects($this->once())
            ->
method('read')
            ->
with(self::RES_DIR'en_GB')
            ->
will($this->throwException(new ResourceBundleNotFoundException()));

        
$this->reader->readEntry(self::RES_DIR'en_GB', array('Entries''Bam'), false);
    }

    public function 
provideMergeableValues()
    {
        return array(
            array(
'foo'null'foo'),
            array(
null'foo''foo'),
            array(array(
'foo''bar'), null, array('foo''bar')),
            array(array(
'foo''bar'), array(), array('foo''bar')),
            array(
null, array('baz'), array('baz')),
            array(array(), array(
'baz'), array('baz')),
            array(array(
'foo''bar'), array('baz'), array('baz''foo''bar')),
        );
    }

    
/**
     * @dataProvider provideMergeableValues
     */
    
public function testMergeDataWithFallbackData($childData$parentData$result)
    {
        if (
null === $childData || is_array($childData)) {
            
$this->readerImpl->expects($this->at(0))
                ->
method('read')
                ->
with(self::RES_DIR'en')
                ->
will($this->returnValue($childData));

            
$this->readerImpl->expects($this->at(1))
                ->
method('read')
                ->
with(self::RES_DIR'root')
                ->
will($this->returnValue($parentData));
        } else {
            
$this->readerImpl->expects($this->once())
                ->
method('read')
                ->
with(self::RES_DIR'en')
                ->
will($this->returnValue($childData));
        }

        
$this->assertSame($result$this->reader->readEntry(self::RES_DIR'en', array(), true));
    }

    
/**
     * @dataProvider provideMergeableValues
     */
    
public function testDontMergeDataIfFallbackDisabled($childData$parentData$result)
    {
        
$this->readerImpl->expects($this->once())
            ->
method('read')
            ->
with(self::RES_DIR'en_GB')
            ->
will($this->returnValue($childData));

        
$this->assertSame($childData$this->reader->readEntry(self::RES_DIR'en_GB', array(), false));
    }

    
/**
     * @dataProvider provideMergeableValues
     */
    
public function testMergeExistingEntryWithExistingFallbackEntry($childData$parentData$result)
    {
        if (
null === $childData || is_array($childData)) {
            
$this->readerImpl->expects($this->at(0))
                ->
method('read')
                ->
with(self::RES_DIR'en')
                ->
will($this->returnValue(array('Foo' => array('Bar' => $childData))));

            
$this->readerImpl->expects($this->at(1))
                ->
method('read')
                ->
with(self::RES_DIR'root')
                ->
will($this->returnValue(array('Foo' => array('Bar' => $parentData))));
        } else {
            
$this->readerImpl->expects($this->once())
                ->
method('read')
                ->
with(self::RES_DIR'en')
                ->
will($this->returnValue(array('Foo' => array('Bar' => $childData))));
        }

        
$this->assertSame($result$this->reader->readEntry(self::RES_DIR'en', array('Foo''Bar'), true));
    }

    
/**
     * @dataProvider provideMergeableValues
     */
    
public function testMergeNonExistingEntryWithExistingFallbackEntry($childData$parentData$result)
    {
        
$this->readerImpl->expects($this->at(0))
            ->
method('read')
            ->
with(self::RES_DIR'en_GB')
            ->
will($this->returnValue(array('Foo' => 'Baz')));

        
$this->readerImpl->expects($this->at(1))
            ->
method('read')
            ->
with(self::RES_DIR'en')
            ->
will($this->returnValue(array('Foo' => array('Bar' => $parentData))));

        
$this->assertSame($parentData$this->reader->readEntry(self::RES_DIR'en_GB', array('Foo''Bar'), true));
    }

    
/**
     * @dataProvider provideMergeableValues
     */
    
public function testMergeExistingEntryWithNonExistingFallbackEntry($childData$parentData$result)
    {
        if (
null === $childData || is_array($childData)) {
            
$this->readerImpl->expects($this->at(0))
                ->
method('read')
                ->
with(self::RES_DIR'en_GB')
                ->
will($this->returnValue(array('Foo' => array('Bar' => $childData))));

            
$this->readerImpl->expects($this->at(1))
                ->
method('read')
                ->
with(self::RES_DIR'en')
                ->
will($this->returnValue(array('Foo' => 'Bar')));
        } else {
            
$this->readerImpl->expects($this->once())
                ->
method('read')
                ->
with(self::RES_DIR'en_GB')
                ->
will($this->returnValue(array('Foo' => array('Bar' => $childData))));
        }

        
$this->assertSame($childData$this->reader->readEntry(self::RES_DIR'en_GB', array('Foo''Bar'), true));
    }

    
/**
     * @expectedException SymfonyComponentIntlExceptionMissingResourceException
     */
    
public function testFailIfEntryFoundNeitherInParentNorChild()
    {
        
$this->readerImpl->expects($this->at(0))
            ->
method('read')
            ->
with(self::RES_DIR'en_GB')
            ->
will($this->returnValue(array('Foo' => 'Baz')));

        
$this->readerImpl->expects($this->at(1))
            ->
method('read')
            ->
with(self::RES_DIR'en')
            ->
will($this->returnValue(array('Foo' => 'Bar')));

        
$this->reader->readEntry(self::RES_DIR'en_GB', array('Foo''Bar'), true);
    }

    
/**
     * @dataProvider provideMergeableValues
     */
    
public function testMergeTraversables($childData$parentData$result)
    {
        
$parentData is_array($parentData) ? new ArrayObject($parentData) : $parentData;
        
$childData is_array($childData) ? new ArrayObject($childData) : $childData;

        if (
null === $childData || $childData instanceof ArrayObject) {
            
$this->readerImpl->expects($this->at(0))
                ->
method('read')
                ->
with(self::RES_DIR'en_GB')
                ->
will($this->returnValue(array('Foo' => array('Bar' => $childData))));

            
$this->readerImpl->expects($this->at(1))
                ->
method('read')
                ->
with(self::RES_DIR'en')
                ->
will($this->returnValue(array('Foo' => array('Bar' => $parentData))));
        } else {
            
$this->readerImpl->expects($this->once())
                ->
method('read')
                ->
with(self::RES_DIR'en_GB')
                ->
will($this->returnValue(array('Foo' => array('Bar' => $childData))));
        }

        
$this->assertSame($result$this->reader->readEntry(self::RES_DIR'en_GB', array('Foo''Bar'), true));
    }

    
/**
     * @dataProvider provideMergeableValues
     */
    
public function testFollowLocaleAliases($childData$parentData$result)
    {
        
$this->reader->setLocaleAliases(array('mo' => 'ro_MD'));

        if (
null === $childData || is_array($childData)) {
            
$this->readerImpl->expects($this->at(0))
                ->
method('read')
                ->
with(self::RES_DIR'ro_MD')
                ->
will($this->returnValue(array('Foo' => array('Bar' => $childData))));

            
// Read fallback locale of aliased locale ("ro_MD" -> "ro")
            
$this->readerImpl->expects($this->at(1))
                ->
method('read')
                ->
with(self::RES_DIR'ro')
                ->
will($this->returnValue(array('Foo' => array('Bar' => $parentData))));
        } else {
            
$this->readerImpl->expects($this->once())
                ->
method('read')
                ->
with(self::RES_DIR'ro_MD')
                ->
will($this->returnValue(array('Foo' => array('Bar' => $childData))));
        }

        
$this->assertSame($result$this->reader->readEntry(self::RES_DIR'mo', array('Foo''Bar'), true));
    }
}
Онлайн: 1
Реклама