MediaWiki REL1_32
MWNamespaceTest.php
Go to the documentation of this file.
1<?php
9
10 protected function setUp() {
11 parent::setUp();
12
13 $this->setMwGlobals( [
14 'wgContentNamespaces' => [ NS_MAIN ],
15 'wgNamespacesWithSubpages' => [
16 NS_TALK => true,
17 NS_USER => true,
18 NS_USER_TALK => true,
19 ],
20 'wgCapitalLinks' => true,
21 'wgCapitalLinkOverrides' => [],
22 'wgNonincludableNamespaces' => [],
23 ] );
24 }
25
30 public function testIsMovable() {
31 $this->assertFalse( MWNamespace::isMovable( NS_SPECIAL ) );
32 }
33
34 private function assertIsSubject( $ns ) {
35 $this->assertTrue( MWNamespace::isSubject( $ns ) );
36 }
37
38 private function assertIsNotSubject( $ns ) {
39 $this->assertFalse( MWNamespace::isSubject( $ns ) );
40 }
41
46 public function testIsSubject() {
47 // Special namespaces
48 $this->assertIsSubject( NS_MEDIA );
50
51 // Subject pages
52 $this->assertIsSubject( NS_MAIN );
53 $this->assertIsSubject( NS_USER );
54 $this->assertIsSubject( 100 ); # user defined
55
56 // Talk pages
59 $this->assertIsNotSubject( 101 ); # user defined
60 }
61
62 private function assertIsTalk( $ns ) {
63 $this->assertTrue( MWNamespace::isTalk( $ns ) );
64 }
65
66 private function assertIsNotTalk( $ns ) {
67 $this->assertFalse( MWNamespace::isTalk( $ns ) );
68 }
69
75 public function testIsTalk() {
76 // Special namespaces
77 $this->assertIsNotTalk( NS_MEDIA );
79
80 // Subject pages
81 $this->assertIsNotTalk( NS_MAIN );
82 $this->assertIsNotTalk( NS_USER );
83 $this->assertIsNotTalk( 100 ); # user defined
84
85 // Talk pages
86 $this->assertIsTalk( NS_TALK );
87 $this->assertIsTalk( NS_USER_TALK );
88 $this->assertIsTalk( 101 ); # user defined
89 }
90
94 public function testGetSubject() {
95 // Special namespaces are their own subjects
96 $this->assertEquals( NS_MEDIA, MWNamespace::getSubject( NS_MEDIA ) );
97 $this->assertEquals( NS_SPECIAL, MWNamespace::getSubject( NS_SPECIAL ) );
98
99 $this->assertEquals( NS_MAIN, MWNamespace::getSubject( NS_TALK ) );
100 $this->assertEquals( NS_USER, MWNamespace::getSubject( NS_USER_TALK ) );
101 }
102
109 public function testGetTalk() {
110 $this->assertEquals( NS_TALK, MWNamespace::getTalk( NS_MAIN ) );
111 $this->assertEquals( NS_TALK, MWNamespace::getTalk( NS_TALK ) );
112 $this->assertEquals( NS_USER_TALK, MWNamespace::getTalk( NS_USER ) );
113 $this->assertEquals( NS_USER_TALK, MWNamespace::getTalk( NS_USER_TALK ) );
114 }
115
123 $this->assertNull( MWNamespace::getTalk( NS_MEDIA ) );
124 }
125
133 $this->assertNull( MWNamespace::getTalk( NS_SPECIAL ) );
134 }
135
142 public function testGetAssociated() {
143 $this->assertEquals( NS_TALK, MWNamespace::getAssociated( NS_MAIN ) );
144 $this->assertEquals( NS_MAIN, MWNamespace::getAssociated( NS_TALK ) );
145 }
146
147 # ## Exceptions with getAssociated()
148 # ## NS_MEDIA and NS_SPECIAL do not have talk pages. MediaWiki raises
149 # ## an exception for them.
155 $this->assertNull( MWNamespace::getAssociated( NS_MEDIA ) );
156 }
157
163 $this->assertNull( MWNamespace::getAssociated( NS_SPECIAL ) );
164 }
165
173 public function testEquals() {
174 $this->assertTrue( MWNamespace::equals( NS_MAIN, NS_MAIN ) );
175 $this->assertTrue( MWNamespace::equals( NS_MAIN, 0 ) ); // In case we make NS_MAIN 'MAIN'
176 $this->assertTrue( MWNamespace::equals( NS_USER, NS_USER ) );
177 $this->assertTrue( MWNamespace::equals( NS_USER, 2 ) );
178 $this->assertTrue( MWNamespace::equals( NS_USER_TALK, NS_USER_TALK ) );
179 $this->assertTrue( MWNamespace::equals( NS_SPECIAL, NS_SPECIAL ) );
180 $this->assertFalse( MWNamespace::equals( NS_MAIN, NS_TALK ) );
181 $this->assertFalse( MWNamespace::equals( NS_USER, NS_USER_TALK ) );
182 $this->assertFalse( MWNamespace::equals( NS_PROJECT, NS_TEMPLATE ) );
183 }
184
188 public function testSubjectEquals() {
190 $this->assertSameSubject( NS_MAIN, 0 ); // In case we make NS_MAIN 'MAIN'
191 $this->assertSameSubject( NS_USER, NS_USER );
192 $this->assertSameSubject( NS_USER, 2 );
196 $this->assertSameSubject( NS_USER, NS_USER_TALK );
197
200 }
201
208 "NS_MEDIA and NS_SPECIAL are different subject namespaces"
209 );
212 "NS_SPECIAL and NS_MEDIA are different subject namespaces"
213 );
214 }
215
216 public function provideHasTalkNamespace() {
217 return [
218 [ NS_MEDIA, false ],
219 [ NS_SPECIAL, false ],
220
221 [ NS_MAIN, true ],
222 [ NS_TALK, true ],
223 [ NS_USER, true ],
224 [ NS_USER_TALK, true ],
225
226 [ 100, true ],
227 [ 101, true ],
228 ];
229 }
230
238 public function testHasTalkNamespace( $index, $expected ) {
239 $actual = MWNamespace::hasTalkNamespace( $index );
240 $this->assertSame( $actual, $expected, "NS $index" );
241 }
242
250 public function testCanTalk( $index, $expected ) {
251 $actual = MWNamespace::canTalk( $index );
252 $this->assertSame( $actual, $expected, "NS $index" );
253 }
254
255 private function assertIsContent( $ns ) {
256 $this->assertTrue( MWNamespace::isContent( $ns ) );
257 }
258
259 private function assertIsNotContent( $ns ) {
260 $this->assertFalse( MWNamespace::isContent( $ns ) );
261 }
262
266 public function testIsContent() {
267 // NS_MAIN is a content namespace per DefaultSettings.php
268 // and per function definition.
269
270 $this->assertIsContent( NS_MAIN );
271
272 // Other namespaces which are not expected to be content
273
276 $this->assertIsNotContent( NS_TALK );
277 $this->assertIsNotContent( NS_USER );
279 $this->assertIsNotContent( 100 );
280 }
281
287 public function testIsContentAdvanced() {
289
290 // Test that user defined namespace #252 is not content
291 $this->assertIsNotContent( 252 );
292
293 // Bless namespace # 252 as a content namespace
294 $wgContentNamespaces[] = 252;
295
296 $this->assertIsContent( 252 );
297
298 // Makes sure NS_MAIN was not impacted
299 $this->assertIsContent( NS_MAIN );
300 }
301
302 private function assertIsWatchable( $ns ) {
303 $this->assertTrue( MWNamespace::isWatchable( $ns ) );
304 }
305
306 private function assertIsNotWatchable( $ns ) {
307 $this->assertFalse( MWNamespace::isWatchable( $ns ) );
308 }
309
313 public function testIsWatchable() {
314 // Specials namespaces are not watchable
317
318 // Core defined namespaces are watchables
319 $this->assertIsWatchable( NS_MAIN );
320 $this->assertIsWatchable( NS_TALK );
321
322 // Additional, user defined namespaces are watchables
323 $this->assertIsWatchable( 100 );
324 $this->assertIsWatchable( 101 );
325 }
326
327 private function assertHasSubpages( $ns ) {
328 $this->assertTrue( MWNamespace::hasSubpages( $ns ) );
329 }
330
331 private function assertHasNotSubpages( $ns ) {
332 $this->assertFalse( MWNamespace::hasSubpages( $ns ) );
333 }
334
338 public function testHasSubpages() {
340
341 // Special namespaces:
344
345 // Namespaces without subpages
347
348 $wgNamespacesWithSubpages[NS_MAIN] = true;
349 $this->assertHasSubpages( NS_MAIN );
350
351 $wgNamespacesWithSubpages[NS_MAIN] = false;
353
354 // Some namespaces with subpages
355 $this->assertHasSubpages( NS_TALK );
356 $this->assertHasSubpages( NS_USER );
358 }
359
363 public function testGetContentNamespaces() {
365
366 $this->assertEquals(
367 [ NS_MAIN ],
368 MWNamespace::getContentNamespaces(),
369 '$wgContentNamespaces is an array with only NS_MAIN by default'
370 );
371
372 # test !is_array( $wgcontentNamespaces )
374 $this->assertEquals( [ NS_MAIN ], MWNamespace::getContentNamespaces() );
375
376 $wgContentNamespaces = false;
377 $this->assertEquals( [ NS_MAIN ], MWNamespace::getContentNamespaces() );
378
380 $this->assertEquals( [ NS_MAIN ], MWNamespace::getContentNamespaces() );
381
383 $this->assertEquals( [ NS_MAIN ], MWNamespace::getContentNamespaces() );
384
385 # test $wgContentNamespaces === []
387 $this->assertEquals( [ NS_MAIN ], MWNamespace::getContentNamespaces() );
388
389 # test !in_array( NS_MAIN, $wgContentNamespaces )
391 $this->assertEquals(
392 [ NS_MAIN, NS_USER, NS_CATEGORY ],
393 MWNamespace::getContentNamespaces(),
394 'NS_MAIN is forced in $wgContentNamespaces even if unwanted'
395 );
396
397 # test other cases, return $wgcontentNamespaces as is
399 $this->assertEquals(
400 [ NS_MAIN ],
401 MWNamespace::getContentNamespaces()
402 );
403
405 $this->assertEquals(
406 [ NS_MAIN, NS_USER, NS_CATEGORY ],
407 MWNamespace::getContentNamespaces()
408 );
409 }
410
414 public function testGetSubjectNamespaces() {
415 $subjectsNS = MWNamespace::getSubjectNamespaces();
416 $this->assertContains( NS_MAIN, $subjectsNS,
417 "Talk namespaces should have NS_MAIN" );
418 $this->assertNotContains( NS_TALK, $subjectsNS,
419 "Talk namespaces should have NS_TALK" );
420
421 $this->assertNotContains( NS_MEDIA, $subjectsNS,
422 "Talk namespaces should not have NS_MEDIA" );
423 $this->assertNotContains( NS_SPECIAL, $subjectsNS,
424 "Talk namespaces should not have NS_SPECIAL" );
425 }
426
430 public function testGetTalkNamespaces() {
431 $talkNS = MWNamespace::getTalkNamespaces();
432 $this->assertContains( NS_TALK, $talkNS,
433 "Subject namespaces should have NS_TALK" );
434 $this->assertNotContains( NS_MAIN, $talkNS,
435 "Subject namespaces should not have NS_MAIN" );
436
437 $this->assertNotContains( NS_MEDIA, $talkNS,
438 "Subject namespaces should not have NS_MEDIA" );
439 $this->assertNotContains( NS_SPECIAL, $talkNS,
440 "Subject namespaces should not have NS_SPECIAL" );
441 }
442
443 private function assertIsCapitalized( $ns ) {
444 $this->assertTrue( MWNamespace::isCapitalized( $ns ) );
445 }
446
447 private function assertIsNotCapitalized( $ns ) {
448 $this->assertFalse( MWNamespace::isCapitalized( $ns ) );
449 }
450
457 // NS_MEDIA and NS_FILE are treated the same
458 $this->assertEquals(
459 MWNamespace::isCapitalized( NS_MEDIA ),
460 MWNamespace::isCapitalized( NS_FILE ),
461 'NS_MEDIA and NS_FILE have same capitalization rendering'
462 );
463
464 // Boths are capitalized by default
467
468 // Always capitalized namespaces
469 // @see MWNamespace::$alwaysCapitalizedNamespaces
471 $this->assertIsCapitalized( NS_USER );
472 $this->assertIsCapitalized( NS_MEDIAWIKI );
473 }
474
489 global $wgCapitalLinks;
490
493
494 $wgCapitalLinks = false;
495
496 // hardcoded namespaces (see above function) are still capitalized:
498 $this->assertIsCapitalized( NS_USER );
499 $this->assertIsCapitalized( NS_MEDIAWIKI );
500
501 // setting is correctly applied
504 }
505
515
516 // Test default settings
519
520 // hardcoded namespaces (see above function) are capitalized:
522 $this->assertIsCapitalized( NS_USER );
523 $this->assertIsCapitalized( NS_MEDIAWIKI );
524
525 // Hardcoded namespaces remains capitalized
529
531 $this->assertIsCapitalized( NS_USER );
532 $this->assertIsCapitalized( NS_MEDIAWIKI );
533
536
537 $wgCapitalLinkOverrides[NS_PROJECT] = true;
539
541 $this->assertIsCapitalized( NS_PROJECT );
542 }
543
547 public function testHasGenderDistinction() {
548 // Namespaces with gender distinctions
549 $this->assertTrue( MWNamespace::hasGenderDistinction( NS_USER ) );
550 $this->assertTrue( MWNamespace::hasGenderDistinction( NS_USER_TALK ) );
551
552 // Other ones, "genderless"
553 $this->assertFalse( MWNamespace::hasGenderDistinction( NS_MEDIA ) );
554 $this->assertFalse( MWNamespace::hasGenderDistinction( NS_SPECIAL ) );
555 $this->assertFalse( MWNamespace::hasGenderDistinction( NS_MAIN ) );
556 $this->assertFalse( MWNamespace::hasGenderDistinction( NS_TALK ) );
557 }
558
562 public function testIsNonincludable() {
564
566
567 $this->assertTrue( MWNamespace::isNonincludable( NS_USER ) );
568 $this->assertFalse( MWNamespace::isNonincludable( NS_TEMPLATE ) );
569 }
570
571 private function assertSameSubject( $ns1, $ns2, $msg = '' ) {
572 $this->assertTrue( MWNamespace::subjectEquals( $ns1, $ns2 ), $msg );
573 }
574
575 private function assertDifferentSubject( $ns1, $ns2, $msg = '' ) {
576 $this->assertFalse( MWNamespace::subjectEquals( $ns1, $ns2 ), $msg );
577 }
578
579 public function provideGetCategoryLinkType() {
580 return [
581 [ NS_MAIN, 'page' ],
582 [ NS_TALK, 'page' ],
583 [ NS_USER, 'page' ],
584 [ NS_USER_TALK, 'page' ],
585
586 [ NS_FILE, 'file' ],
587 [ NS_FILE_TALK, 'page' ],
588
589 [ NS_CATEGORY, 'subcat' ],
590 [ NS_CATEGORY_TALK, 'page' ],
591
592 [ 100, 'page' ],
593 [ 101, 'page' ],
594 ];
595 }
596
604 public function testGetCategoryLinkType( $index, $expected ) {
605 $actual = MWNamespace::getCategoryLinkType( $index );
606 $this->assertSame( $expected, $actual, "NS $index" );
607 }
608}
$wgNamespacesWithSubpages
Which namespaces should support subpages? See Language.php for a list of namespaces.
$wgCapitalLinks
Set this to false to avoid forcing the first letter of links to capitals.
$wgNonincludableNamespaces
Pages in namespaces in this array can not be used as templates.
$wgContentNamespaces
Array of namespaces which can be deemed to contain valid "content", as far as the site statistics are...
$wgCapitalLinkOverrides
testHasGenderDistinction()
MWNamespace::hasGenderDistinction.
testGetTalkNamespaces()
MWNamespace::getTalkNamespaces.
assertDifferentSubject( $ns1, $ns2, $msg='')
testGetAssociatedExceptionsForNsSpecial()
MWException MWNamespace::getAssociated.
testSubjectEquals()
MWNamespace::subjectEquals.
testGetTalk()
Regular getTalk() calls Namespaces without a talk page (NS_MEDIA, NS_SPECIAL) are tested in the funct...
testHasSubpages()
MWNamespace::hasSubpages.
testHasTalkNamespace( $index, $expected)
provideHasTalkNamespace MWNamespace::hasTalkNamespace
testIsWatchable()
MWNamespace::isWatchable.
testIsContentAdvanced()
Similar to testIsContent() but alters the $wgContentNamespaces global variable.
testGetContentNamespaces()
MWNamespace::getContentNamespaces.
testGetAssociated()
Regular getAssociated() calls Namespaces without an associated page (NS_MEDIA, NS_SPECIAL) are tested...
testIsCapitalizedWithWgCapitalLinks()
Follows up for testIsCapitalizedHardcodedAssertions() but alter the global $wgCapitalLink setting to ...
testGetTalkExceptionsForNsSpecial()
Exceptions with getTalk() NS_SPECIAL does not have talk pages.
testGetSubject()
MWNamespace::getSubject.
testIsCapitalizedHardcodedAssertions()
Some namespaces are always capitalized per code definition in MWNamespace::$alwaysCapitalizedNamespac...
testGetCategoryLinkType( $index, $expected)
provideGetCategoryLinkType MWNamespace::getCategoryLinkType
testGetAssociatedExceptionsForNsMedia()
MWException MWNamespace::getAssociated.
testEquals()
Test MWNamespace::equals Note if we add a namespace registration system with keys like 'MAIN' we shou...
testIsNonincludable()
MWNamespace::isNonincludable.
testGetSubjectNamespaces()
MWNamespace::getSubjectNamespaces.
testIsCapitalizedWithWgCapitalLinkOverrides()
Counter part for MWNamespace::testIsCapitalizedWithWgCapitalLinks() now testing the $wgCapitalLinkOve...
assertSameSubject( $ns1, $ns2, $msg='')
testIsTalk()
Reverse of testIsSubject().
testSpecialAndMediaAreDifferentSubjects()
MWNamespace::subjectEquals.
testCanTalk( $index, $expected)
provideHasTalkNamespace MWNamespace::canTalk
testGetTalkExceptionsForNsMedia()
Exceptions with getTalk() NS_MEDIA does not have talk pages.
testIsContent()
MWNamespace::isContent.
testIsSubject()
Please make sure to change testIsTalk() if you change the assertions below MWNamespace::isSubject.
setMwGlobals( $pairs, $value=null)
Sets a global, maintaining a stashed version of the previous global to be restored in tearDown.
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped noclasses just before the function returns a value If you return true
Definition hooks.txt:2055
processing should stop and the error should be shown to the user * false
Definition hooks.txt:187
const NS_USER
Definition Defines.php:66
const NS_FILE
Definition Defines.php:70
const NS_MAIN
Definition Defines.php:64
const NS_PROJECT_TALK
Definition Defines.php:69
const NS_MEDIAWIKI
Definition Defines.php:72
const NS_TEMPLATE
Definition Defines.php:74
const NS_SPECIAL
Definition Defines.php:53
const NS_FILE_TALK
Definition Defines.php:71
const NS_CATEGORY_TALK
Definition Defines.php:79
const NS_MEDIA
Definition Defines.php:52
const NS_TALK
Definition Defines.php:65
const NS_USER_TALK
Definition Defines.php:67
const NS_PROJECT
Definition Defines.php:68
const NS_CATEGORY
Definition Defines.php:78