Вход Регистрация
Файл: symfony-2.7/src/Symfony/Component/Config/Tests/Util/XmlUtilsTest.php
Строк: 159
<?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 SymfonyComponentConfigTestsLoader;

use 
SymfonyComponentConfigUtilXmlUtils;

class 
XmlUtilsTest extends PHPUnit_Framework_TestCase
{
    public function 
testLoadFile()
    {
        
$fixtures = __DIR__.'/../Fixtures/Util/';

        try {
            
XmlUtils::loadFile($fixtures.'invalid.xml');
            
$this->fail();
        } catch (
InvalidArgumentException $e) {
            
$this->assertContains('ERROR 77', $e->getMessage());
        }

        try {
            
XmlUtils::loadFile($fixtures.'document_type.xml');
            
$this->fail();
        } catch (
InvalidArgumentException $e) {
            
$this->assertContains('Document types are not allowed', $e->getMessage());
        }

        try {
            
XmlUtils::loadFile($fixtures.'invalid_schema.xml', $fixtures.'schema.xsd');
            
$this->fail();
        } catch (
InvalidArgumentException $e) {
            
$this->assertContains('ERROR 1845', $e->getMessage());
        }

        try {
            
XmlUtils::loadFile($fixtures.'invalid_schema.xml', 'invalid_callback_or_file');
            
$this->fail();
        } catch (
InvalidArgumentException $e) {
            
$this->assertContains('XSD file or callable', $e->getMessage());
        }

        
$mock = $this->getMock(__NAMESPACE__.'Validator');
        
$mock->expects($this->exactly(2))->method('validate')->will($this->onConsecutiveCalls(false, true));

        try {
            
XmlUtils::loadFile($fixtures.'valid.xml', array($mock, 'validate'));
            
$this->fail();
        } catch (
InvalidArgumentException $e) {
            
$this->assertContains('is not valid', $e->getMessage());
        }

        
$this->assertInstanceOf('DOMDocument', XmlUtils::loadFile($fixtures.'valid.xml', array($mock, 'validate')));
        
$this->assertSame(array(), libxml_get_errors());
    }

    public function 
testLoadFileWithInternalErrorsEnabled()
    {
        
libxml_use_internal_errors(true);

        
$this->assertSame(array(), libxml_get_errors());
        
$this->assertInstanceOf('DOMDocument', XmlUtils::loadFile(__DIR__.'/../Fixtures/Util/invalid_schema.xml'));
        
$this->assertSame(array(), libxml_get_errors());
    }

    
/**
     * @dataProvider getDataForConvertDomToArray
     */
    
public function testConvertDomToArray($expected, $xml, $root = false, $checkPrefix = true)
    {
        
$dom = new DOMDocument();
        
$dom->loadXML($root ? $xml : '<root>'.$xml.'</root>');

        
$this->assertSame($expected, XmlUtils::convertDomElementToArray($dom->documentElement, $checkPrefix));
    }

    public function 
getDataForConvertDomToArray()
    {
        return array(
            array(
null, ''),
            array(
'bar', 'bar'),
            array(array(
'bar' => 'foobar'), '<foo bar="foobar" />', true),
            array(array(
'foo' => null), '<foo />'),
            array(array(
'foo' => 'bar'), '<foo>bar</foo>'),
            array(array(
'foo' => array('foo' => 'bar')), '<foo foo="bar"/>'),
            array(array(
'foo' => array('foo' => 0)), '<foo><foo>0</foo></foo>'),
            array(array(
'foo' => array('foo' => 'bar')), '<foo><foo>bar</foo></foo>'),
            array(array(
'foo' => array('foo' => 'bar', 'value' => 'text')), '<foo foo="bar">text</foo>'),
            array(array(
'foo' => array('attr' => 'bar', 'foo' => 'text')), '<foo attr="bar"><foo>text</foo></foo>'),
            array(array(
'foo' => array('bar', 'text')), '<foo>bar</foo><foo>text</foo>'),
            array(array(
'foo' => array(array('foo' => 'bar'), array('foo' => 'text'))), '<foo foo="bar"/><foo foo="text" />'),
            array(array(
'foo' => array('foo' => array('bar', 'text'))), '<foo foo="bar"><foo>text</foo></foo>'),
            array(array(
'foo' => 'bar'), '<foo><!-- Comment -->bar</foo>'),
            array(array(
'foo' => 'text'), '<foo xmlns:h="http://www.example.org/bar" h:bar="bar">text</foo>'),
            array(array(
'foo' => array('bar' => 'bar', 'value' => 'text')), '<foo xmlns:h="http://www.example.org/bar" h:bar="bar">text</foo>', false, false),
            array(array(
'attr' => 1, 'b' => 'hello'), '<foo:a xmlns:foo="http://www.example.org/foo" xmlns:h="http://www.example.org/bar" attr="1" h:bar="bar"><foo:b>hello</foo:b><h:c>2</h:c></foo:a>', true),
        );
    }

    
/**
     * @dataProvider getDataForPhpize
     */
    
public function testPhpize($expected, $value)
    {
        
$this->assertSame($expected, XmlUtils::phpize($value));
    }

    public function 
getDataForPhpize()
    {
        return array(
            array(
'', ''),
            array(
null, 'null'),
            array(
true, 'true'),
            array(
false, 'false'),
            array(
null, 'Null'),
            array(
true, 'True'),
            array(
false, 'False'),
            array(
0, '0'),
            array(
1, '1'),
            array(-
1, '-1'),
            array(
0777, '0777'),
            array(
255, '0xFF'),
            array(
100.0, '1e2'),
            array(-
120.0, '-1.2E2'),
            array(-
10100.1, '-10100.1'),
            array(
'-10,100.1', '-10,100.1'),
            array(
'1234 5678 9101 1121 3141', '1234 5678 9101 1121 3141'),
            array(
'1,2,3,4', '1,2,3,4'),
            array(
'11,22,33,44', '11,22,33,44'),
            array(
'11,222,333,4', '11,222,333,4'),
            array(
'1,222,333,444', '1,222,333,444'),
            array(
'11,222,333,444', '11,222,333,444'),
            array(
'111,222,333,444', '111,222,333,444'),
            array(
'1111,2222,3333,4444,5555', '1111,2222,3333,4444,5555'),
            array(
'foo', 'foo'),
            array(
6, '0b0110'),
        );
    }

    public function 
testLoadEmptyXmlFile()
    {
        
$file = __DIR__.'/../Fixtures/foo.xml';
        
$this->setExpectedException('InvalidArgumentException', 'File '.$file.' does not contain valid XML, it is empty.');
        
XmlUtils::loadFile($file);
    }

    
// test for issue https://github.com/symfony/symfony/issues/9731
    
public function testLoadWrongEmptyXMLWithErrorHandler()
    {
        
$originalDisableEntities = libxml_disable_entity_loader(false);
        
$errorReporting = error_reporting(-1);

        
set_error_handler(function ($errno, $errstr) {
            throw new 
Exception($errstr, $errno);
        });

        
$file = __DIR__.'/../Fixtures/foo.xml';
        try {
            try {
                
XmlUtils::loadFile($file);
                
$this->fail('An exception should have been raised');
            } catch (
InvalidArgumentException $e) {
                
$this->assertEquals(sprintf('File %s does not contain valid XML, it is empty.', $file), $e->getMessage());
            }
        } catch (
Exception $e) {
            
restore_error_handler();
            
error_reporting($errorReporting);

            throw 
$e;
        }

        
restore_error_handler();
        
error_reporting($errorReporting);

        
$disableEntities = libxml_disable_entity_loader(true);
        
libxml_disable_entity_loader($disableEntities);

        
libxml_disable_entity_loader($originalDisableEntities);

        
$this->assertFalse($disableEntities);

        
// should not throw an exception
        
XmlUtils::loadFile(__DIR__.'/../Fixtures/Util/valid.xml', __DIR__.'/../Fixtures/Util/schema.xsd');
    }
}

interface 
Validator
{
    public function 
validate();
}
Онлайн: 2
Реклама