Merge "SpecialStatsAddExtra: Format column label with msg"
[lhc/web/wiklou.git] / tests / phpunit / includes / api / format / ApiFormatXmlTest.php
1 <?php
2
3 /**
4 * @group API
5 * @group Database
6 * @covers ApiFormatXml
7 */
8 class ApiFormatXmlTest extends ApiFormatTestBase {
9
10 protected $printerName = 'xml';
11
12 public static function setUpBeforeClass() {
13 parent::setUpBeforeClass();
14 $page = WikiPage::factory( Title::newFromText( 'MediaWiki:ApiFormatXmlTest.xsl' ) );
15 $page->doEditContent( new WikitextContent(
16 '<?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" />'
17 ), 'Summary' );
18 $page = WikiPage::factory( Title::newFromText( 'MediaWiki:ApiFormatXmlTest' ) );
19 $page->doEditContent( new WikitextContent( 'Bogus' ), 'Summary' );
20 $page = WikiPage::factory( Title::newFromText( 'ApiFormatXmlTest' ) );
21 $page->doEditContent( new WikitextContent( 'Bogus' ), 'Summary' );
22 }
23
24 public static function provideGeneralEncoding() {
25 return array(
26 // Basic types
27 array( array( null, 'a' => null ), '<?xml version="1.0"?><api><_v _idx="0" /></api>' ),
28 array( array( true, 'a' => true ), '<?xml version="1.0"?><api a=""><_v _idx="0">true</_v></api>' ),
29 array( array( false, 'a' => false ), '<?xml version="1.0"?><api><_v _idx="0">false</_v></api>' ),
30 array( array( true, 'a' => true, ApiResult::META_BC_BOOLS => array( 0, 'a' ) ),
31 '<?xml version="1.0"?><api a=""><_v _idx="0">1</_v></api>' ),
32 array( array( false, 'a' => false, ApiResult::META_BC_BOOLS => array( 0, 'a' ) ),
33 '<?xml version="1.0"?><api><_v _idx="0"></_v></api>' ),
34 array( array( 42, 'a' => 42 ), '<?xml version="1.0"?><api a="42"><_v _idx="0">42</_v></api>' ),
35 array( array( 42.5, 'a' => 42.5 ), '<?xml version="1.0"?><api a="42.5"><_v _idx="0">42.5</_v></api>' ),
36 array( array( 1e42, 'a' => 1e42 ), '<?xml version="1.0"?><api a="1.0E+42"><_v _idx="0">1.0E+42</_v></api>' ),
37 array( array( 'foo', 'a' => 'foo' ), '<?xml version="1.0"?><api a="foo"><_v _idx="0">foo</_v></api>' ),
38 array( array( 'fóo', 'a' => 'fóo' ), '<?xml version="1.0"?><api a="fóo"><_v _idx="0">fóo</_v></api>' ),
39
40 // Arrays and objects
41 array( array( array() ), '<?xml version="1.0"?><api><_v /></api>' ),
42 array( array( array( 'x' => 1 ) ), '<?xml version="1.0"?><api><_v x="1" /></api>' ),
43 array( array( array( 2 => 1 ) ), '<?xml version="1.0"?><api><_v><_v _idx="2">1</_v></_v></api>' ),
44 array( array( (object)array() ), '<?xml version="1.0"?><api><_v /></api>' ),
45 array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), '<?xml version="1.0"?><api><_v><_v _idx="0">1</_v></_v></api>' ),
46 array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), '<?xml version="1.0"?><api><_v><_v>1</_v></_v></api>' ),
47 array( array( array( 'x' => 1, 'y' => array( 'z' => 1 ), ApiResult::META_TYPE => 'kvp' ) ),
48 '<?xml version="1.0"?><api><_v><_v _name="x" xml:space="preserve">1</_v><_v _name="y"><z xml:space="preserve">1</z></_v></_v></api>' ),
49 array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp', ApiResult::META_INDEXED_TAG_NAME => 'i', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
50 '<?xml version="1.0"?><api><_v><i key="x" xml:space="preserve">1</i></_v></api>' ),
51 array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
52 '<?xml version="1.0"?><api><_v><_v key="x" xml:space="preserve">1</_v></_v></api>' ),
53 array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), '<?xml version="1.0"?><api><_v x="1" /></api>' ),
54 array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), '<?xml version="1.0"?><api><_v><_v _idx="0">a</_v><_v _idx="1">b</_v></_v></api>' ),
55
56 // Content
57 array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
58 '<?xml version="1.0"?><api xml:space="preserve">foo</api>' ),
59
60 // Specified element name
61 array( array( 'foo', 'bar', ApiResult::META_INDEXED_TAG_NAME => 'itn' ),
62 '<?xml version="1.0"?><api><itn>foo</itn><itn>bar</itn></api>' ),
63
64 // Subelements
65 array( array( 'a' => 1, 's' => 1, '_subelements' => array( 's' ) ),
66 '<?xml version="1.0"?><api a="1"><s xml:space="preserve">1</s></api>' ),
67
68 // Content and subelement
69 array( array( 'a' => 1, 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
70 '<?xml version="1.0"?><api a="1" xml:space="preserve">foo</api>' ),
71 array( array( 's' => array(), 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
72 '<?xml version="1.0"?><api><s /><content xml:space="preserve">foo</content></api>' ),
73 array(
74 array(
75 's' => 1,
76 'content' => 'foo',
77 ApiResult::META_CONTENT => 'content',
78 ApiResult::META_SUBELEMENTS => array( 's' )
79 ),
80 '<?xml version="1.0"?><api><s xml:space="preserve">1</s><content xml:space="preserve">foo</content></api>'
81 ),
82
83 // BC Subelements
84 array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ),
85 '<?xml version="1.0"?><api><foo xml:space="preserve">foo</foo></api>' ),
86
87 // Name mangling
88 array( array( 'foo.bar' => 1 ), '<?xml version="1.0"?><api foo.bar="1" />' ),
89 array( array( '' => 1 ), '<?xml version="1.0"?><api _="1" />' ),
90 array( array( 'foo bar' => 1 ), '<?xml version="1.0"?><api _foo.20.bar="1" />' ),
91 array( array( 'foo:bar' => 1 ), '<?xml version="1.0"?><api _foo.3A.bar="1" />' ),
92 array( array( 'foo%.bar' => 1 ), '<?xml version="1.0"?><api _foo.25..2E.bar="1" />' ),
93 array( array( '4foo' => 1, 'foo4' => 1 ), '<?xml version="1.0"?><api _4foo="1" foo4="1" />' ),
94 array( array( "foo\xe3\x80\x80bar" => 1 ), '<?xml version="1.0"?><api _foo.3000.bar="1" />' ),
95 array( array( 'foo:bar' => 1, ApiResult::META_PRESERVE_KEYS => array( 'foo:bar' ) ),
96 '<?xml version="1.0"?><api foo:bar="1" />' ),
97 array( array( 'a', 'b', ApiResult::META_INDEXED_TAG_NAME => 'foo bar' ),
98 '<?xml version="1.0"?><api><_foo.20.bar>a</_foo.20.bar><_foo.20.bar>b</_foo.20.bar></api>' ),
99
100 // includenamespace param
101 array( array( 'x' => 'foo' ), '<?xml version="1.0"?><api x="foo" xmlns="http://www.mediawiki.org/xml/api/" />',
102 array( 'includexmlnamespace' => 1 ) ),
103
104 // xslt param
105 array( array(), '<?xml version="1.0"?><api><warnings><xml xml:space="preserve">Invalid or non-existent stylesheet specified</xml></warnings></api>',
106 array( 'xslt' => 'DoesNotExist' ) ),
107 array( array(), '<?xml version="1.0"?><api><warnings><xml xml:space="preserve">Stylesheet should be in the MediaWiki namespace.</xml></warnings></api>',
108 array( 'xslt' => 'ApiFormatXmlTest' ) ),
109 array( array(), '<?xml version="1.0"?><api><warnings><xml xml:space="preserve">Stylesheet should have .xsl extension.</xml></warnings></api>',
110 array( 'xslt' => 'MediaWiki:ApiFormatXmlTest' ) ),
111 array( array(),
112 '<?xml version="1.0"?><?xml-stylesheet href="' .
113 htmlspecialchars( Title::newFromText( 'MediaWiki:ApiFormatXmlTest.xsl' )->getLocalURL( 'action=raw' ) ) .
114 '" type="text/xsl" ?><api />',
115 array( 'xslt' => 'MediaWiki:ApiFormatXmlTest.xsl' ) ),
116 );
117 }
118
119 }