PortableInfobox/tests/phpunit/XmlParserTest.php

189 lines
4.3 KiB
PHP
Raw Normal View History

<?php
2018-08-08 09:42:22 +00:00
/**
* @group PortableInfobox
* @covers PortableInfobox\Parser\XmlParser
2018-08-08 09:42:22 +00:00
*/
class XmlParserTest extends MediaWikiTestCase {
/** @dataProvider contentTagsDataProvider */
public function testXHTMLParsing( $tag, $content ) {
$markup = "<data source=\"asdfd\"><{$tag}>{$content}</{$tag}></data>";
$result = PortableInfobox\Parser\XmlParser::parseXmlString( $markup );
2015-05-20 10:15:22 +00:00
$this->assertEquals( $content, (string)$result->{$tag} );
}
2015-05-19 14:01:53 +00:00
public function contentTagsDataProvider() {
return [
[ 'default', 'sadf <br> sakdjfl' ],
[ 'format', '<>' ],
[ 'label', '' ]
];
2015-05-19 14:01:53 +00:00
}
/** @dataProvider errorHandlingDataProvider */
public function testErrorHandling( $markup, $expectedErrors ) {
$errors = [];
try {
$data = PortableInfobox\Parser\XmlParser::parseXmlString( $markup, $errors );
} catch ( PortableInfobox\Parser\XmlMarkupParseErrorException $e ) {
// parseXmlString should throw an exception, but we want to proceed in order to check errors
}
$this->assertEquals( $expectedErrors, array_map(
function ( LibXMLError $error ) {
return [
'level' => $error->level,
'code' => $error->code,
'msg' => trim( $error->message )
];
},
$errors
) );
}
2015-05-19 14:01:53 +00:00
public function errorHandlingDataProvider() {
2015-05-19 14:43:55 +00:00
/*
* Error codes are defined on official xml API documentation:
* http://www.xmlsoft.org/html/libxml-xmlerror.html
*/
2015-05-19 14:01:53 +00:00
return [
2015-06-11 16:38:08 +00:00
[
'<data>d</dat/a>',
[
[
'level' => LIBXML_ERR_FATAL,
'code' => 73,
'msg' => "expected '>'"
],
[
'level' => LIBXML_ERR_FATAL,
'code' => 76,
'msg' => "Opening and ending tag mismatch: data line 1 and dat"
],
[
'level' => LIBXML_ERR_FATAL,
'code' => 5,
'msg' => "Extra content at the end of the document"
]
2015-06-11 16:38:08 +00:00
]
],
[
'<data> x </data></data>',
2015-05-19 14:01:53 +00:00
[
[
'level' => LIBXML_ERR_FATAL,
'code' => 5,
'msg' => "Extra content at the end of the document"
]
]
],
[
'<data> > ddd < a ></data>',
2015-05-19 14:01:53 +00:00
[
[
'level' => LIBXML_ERR_FATAL,
'code' => 68,
'msg' => "StartTag: invalid element name"
]
]
],
[
'<data>',
2015-05-19 14:01:53 +00:00
[
[
'level' => LIBXML_ERR_FATAL,
'code' => 77,
'msg' => "Premature end of data in tag data line 1"
]
]
],
[
'<infobox><data source=caption></infobox>',
2015-05-19 14:01:53 +00:00
[
[
'level' => LIBXML_ERR_FATAL,
'code' => 39,
'msg' => "AttValue: \" or ' expected"
],
[
'level' => LIBXML_ERR_FATAL,
'code' => 65,
'msg' => "attributes construct error"
],
[
'level' => LIBXML_ERR_FATAL,
'code' => 73,
'msg' => "Couldn't find end of Start Tag data line 1"
]
]
],
[
'<infobox><data source="caption"></infobox>',
2015-05-19 14:01:53 +00:00
[
[
'level' => LIBXML_ERR_FATAL,
'code' => 76,
'msg' => "Opening and ending tag mismatch: data line 1 and infobox"
],
[
'level' => LIBXML_ERR_FATAL,
'code' => 77,
'msg' => "Premature end of data in tag infobox line 1"
]
]
],
[
'<infobox><data source="caption></data></infobox>',
2015-05-19 14:01:53 +00:00
[
[
'level' => LIBXML_ERR_FATAL,
'code' => 38,
'msg' => "Unescaped '<' not allowed in attributes values"
],
[
'level' => LIBXML_ERR_FATAL,
'code' => 65,
'msg' => "attributes construct error"
],
[
'level' => LIBXML_ERR_FATAL,
'code' => 73,
'msg' => "Couldn't find end of Start Tag data line 1"
],
[
'level' => LIBXML_ERR_FATAL,
'code' => 76,
'msg' => "Opening and ending tag mismatch: infobox line 1 and data"
],
[
'level' => LIBXML_ERR_FATAL,
'code' => 5,
'msg' => "Extra content at the end of the document"
]
2015-05-19 14:01:53 +00:00
]
]
2015-05-19 14:01:53 +00:00
];
}
/**
* @dataProvider entitiesTestDataProvider
*/
public function testHTMLEntities( $markup, $expectedResult ) {
$result = PortableInfobox\Parser\XmlParser::parseXmlString( $markup );
2018-08-16 09:25:53 +00:00
$this->assertEquals( $expectedResult, $result[0] );
}
public function entitiesTestDataProvider() {
return [
[ '<data></data>', '' ],
[ '<data>&aksjdf;</data>', '&aksjdf;' ],
[ '<data>&amp;</data>', '&' ],
2015-07-07 07:06:37 +00:00
[ '<data>&middot;</data>', '·' ],
[ '<data>&Uuml;</data>', 'Ü' ],
[ '<data>&Delta;</data>', 'Δ' ],
[ '<data>&amp;amp;</data>', '&amp;' ],
[ '<data>&amp</data>', '&amp' ]
];
}
}