summaryrefslogtreecommitdiff
path: root/tests/phpunit/includes/MWNamespaceTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/phpunit/includes/MWNamespaceTest.php')
-rw-r--r--tests/phpunit/includes/MWNamespaceTest.php460
1 files changed, 460 insertions, 0 deletions
diff --git a/tests/phpunit/includes/MWNamespaceTest.php b/tests/phpunit/includes/MWNamespaceTest.php
new file mode 100644
index 00000000..462afc24
--- /dev/null
+++ b/tests/phpunit/includes/MWNamespaceTest.php
@@ -0,0 +1,460 @@
+<?php
+/**
+ * @author Ashar Voultoiz
+ * @copyright Copyright © 2011, Ashar Voultoiz
+ * @file
+ */
+
+/**
+ * Test class for MWNamespace.
+ * Generated by PHPUnit on 2011-02-20 at 21:01:55.
+ *
+ */
+class MWNamespaceTest extends MediaWikiTestCase {
+ /**
+ * Sets up the fixture, for example, opens a network connection.
+ * This method is called before a test is executed.
+ */
+ protected function setUp() {
+ }
+
+ /**
+ * Tears down the fixture, for example, closes a network connection.
+ * This method is called after a test is executed.
+ */
+ protected function tearDown() {
+ }
+
+
+#### START OF TESTS #########################################################
+
+ /**
+ * @todo Write more texts, handle $wgAllowImageMoving setting
+ */
+ public function testIsMovable() {
+ $this->assertFalse( MWNamespace::isMovable( NS_CATEGORY ) );
+ # @todo FIXME: Write more tests!!
+ }
+
+ /**
+ * Please make sure to change testIsTalk() if you change the assertions below
+ */
+ public function testIsMain() {
+ // Special namespaces
+ $this->assertTrue( MWNamespace::isMain( NS_MEDIA ) );
+ $this->assertTrue( MWNamespace::isMain( NS_SPECIAL ) );
+
+ // Subject pages
+ $this->assertTrue( MWNamespace::isMain( NS_MAIN ) );
+ $this->assertTrue( MWNamespace::isMain( NS_USER ) );
+ $this->assertTrue( MWNamespace::isMain( 100 ) ); # user defined
+
+ // Talk pages
+ $this->assertFalse( MWNamespace::isMain( NS_TALK ) );
+ $this->assertFalse( MWNamespace::isMain( NS_USER_TALK ) );
+ $this->assertFalse( MWNamespace::isMain( 101 ) ); # user defined
+ }
+
+ /**
+ * Reverse of testIsMain().
+ * Please update testIsMain() if you change assertions below
+ */
+ public function testIsTalk() {
+ // Special namespaces
+ $this->assertFalse( MWNamespace::isTalk( NS_MEDIA ) );
+ $this->assertFalse( MWNamespace::isTalk( NS_SPECIAL ) );
+
+ // Subject pages
+ $this->assertFalse( MWNamespace::isTalk( NS_MAIN ) );
+ $this->assertFalse( MWNamespace::isTalk( NS_USER ) );
+ $this->assertFalse( MWNamespace::isTalk( 100 ) ); # user defined
+
+ // Talk pages
+ $this->assertTrue( MWNamespace::isTalk( NS_TALK ) );
+ $this->assertTrue( MWNamespace::isTalk( NS_USER_TALK ) );
+ $this->assertTrue( MWNamespace::isTalk( 101 ) ); # user defined
+ }
+
+ /**
+ * Regular getTalk() calls
+ * Namespaces without a talk page (NS_MEDIA, NS_SPECIAL) are tested in
+ * the function testGetTalkExceptions()
+ */
+ public function testGetTalk() {
+ $this->assertEquals( NS_TALK, MWNamespace::getTalk( NS_MAIN ) );
+ }
+
+ /**
+ * Exceptions with getTalk()
+ * NS_MEDIA does not have talk pages. MediaWiki raise an exception for them.
+ * @expectedException MWException
+ */
+ public function testGetTalkExceptionsForNsMedia() {
+ $this->assertNull( MWNamespace::getTalk( NS_MEDIA ) );
+ }
+
+ /**
+ * Exceptions with getTalk()
+ * NS_SPECIAL does not have talk pages. MediaWiki raise an exception for them.
+ * @expectedException MWException
+ */
+ public function testGetTalkExceptionsForNsSpecial() {
+ $this->assertNull( MWNamespace::getTalk( NS_SPECIAL ) );
+ }
+
+ /**
+ * Regular getAssociated() calls
+ * Namespaces without an associated page (NS_MEDIA, NS_SPECIAL) are tested in
+ * the function testGetAssociatedExceptions()
+ */
+ public function testGetAssociated() {
+ $this->assertEquals( NS_TALK, MWNamespace::getAssociated( NS_MAIN ) );
+ $this->assertEquals( NS_MAIN, MWNamespace::getAssociated( NS_TALK ) );
+
+ }
+
+ ### Exceptions with getAssociated()
+ ### NS_MEDIA and NS_SPECIAL do not have talk pages. MediaWiki raises
+ ### an exception for them.
+ /**
+ * @expectedException MWException
+ */
+ public function testGetAssociatedExceptionsForNsMedia() {
+ $this->assertNull( MWNamespace::getAssociated( NS_MEDIA ) );
+ }
+
+ /**
+ * @expectedException MWException
+ */
+ public function testGetAssociatedExceptionsForNsSpecial() {
+ $this->assertNull( MWNamespace::getAssociated( NS_SPECIAL ) );
+ }
+
+ /**
+ */
+ public function testGetSubject() {
+ // Special namespaces are their own subjects
+ $this->assertEquals( NS_MEDIA, MWNamespace::getSubject( NS_MEDIA ) );
+ $this->assertEquals( NS_SPECIAL, MWNamespace::getSubject( NS_SPECIAL ) );
+
+ $this->assertEquals( NS_MAIN, MWNamespace::getSubject( NS_TALK ) );
+ $this->assertEquals( NS_USER, MWNamespace::getSubject( NS_USER_TALK ) );
+ }
+
+ /**
+ * @todo Implement testExists().
+ */
+ public function testExists() {
+ // Remove the following lines when you implement this test.
+ $this->markTestIncomplete(
+ 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+ );
+ }
+
+ /**
+ * @todo Implement testGetCanonicalNamespaces().
+ */
+ public function testGetCanonicalNamespaces() {
+ // Remove the following lines when you implement this test.
+ $this->markTestIncomplete(
+ 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+ );
+ }
+
+ /**
+ * @todo Implement testGetCanonicalName().
+ */
+ public function testGetCanonicalName() {
+ // Remove the following lines when you implement this test.
+ $this->markTestIncomplete(
+ 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+ );
+ }
+
+ /**
+ * @todo Implement testGetCanonicalIndex().
+ */
+ public function testGetCanonicalIndex() {
+ // Remove the following lines when you implement this test.
+ $this->markTestIncomplete(
+ 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+ );
+ }
+
+ /**
+ * @todo Implement testGetValidNamespaces().
+ */
+ public function testGetValidNamespaces() {
+ // Remove the following lines when you implement this test.
+ $this->markTestIncomplete(
+ 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+ );
+ }
+
+ /**
+ */
+ public function testCanTalk() {
+ $this->assertFalse( MWNamespace::canTalk( NS_MEDIA ) );
+ $this->assertFalse( MWNamespace::canTalk( NS_SPECIAL ) );
+
+ $this->assertTrue( MWNamespace::canTalk( NS_MAIN ) );
+ $this->assertTrue( MWNamespace::canTalk( NS_TALK ) );
+ $this->assertTrue( MWNamespace::canTalk( NS_USER ) );
+ $this->assertTrue( MWNamespace::canTalk( NS_USER_TALK ) );
+
+ // User defined namespaces
+ $this->assertTrue( MWNamespace::canTalk( 100 ) );
+ $this->assertTrue( MWNamespace::canTalk( 101 ) );
+ }
+
+ /**
+ */
+ public function testIsContent() {
+ // NS_MAIN is a content namespace per DefaultSettings.php
+ // and per function definition.
+ $this->assertTrue( MWNamespace::isContent( NS_MAIN ) );
+
+ // Other namespaces which are not expected to be content
+ $this->assertFalse( MWNamespace::isContent( NS_MEDIA ) );
+ $this->assertFalse( MWNamespace::isContent( NS_SPECIAL ) );
+ $this->assertFalse( MWNamespace::isContent( NS_TALK ) );
+ $this->assertFalse( MWNamespace::isContent( NS_USER ) );
+ $this->assertFalse( MWNamespace::isContent( NS_CATEGORY ) );
+ // User defined namespace:
+ $this->assertFalse( MWNamespace::isContent( 100 ) );
+ }
+
+ /**
+ * Similar to testIsContent() but alters the $wgContentNamespaces
+ * global variable.
+ */
+ public function testIsContentWithAdditionsInWgContentNamespaces() {
+ // NS_MAIN is a content namespace per DefaultSettings.php
+ // and per function definition.
+ $this->assertTrue( MWNamespace::isContent( NS_MAIN ) );
+
+ // Tests that user defined namespace #252 is not content:
+ $this->assertFalse( MWNamespace::isContent( 252 ) );
+
+ # @todo FIXME: Is global saving really required for PHPUnit?
+ // Bless namespace # 252 as a content namespace
+ global $wgContentNamespaces;
+ $savedGlobal = $wgContentNamespaces;
+ $wgContentNamespaces[] = 252;
+ $this->assertTrue( MWNamespace::isContent( 252 ) );
+
+ // Makes sure NS_MAIN was not impacted
+ $this->assertTrue( MWNamespace::isContent( NS_MAIN ) );
+
+ // Restore global
+ $wgContentNamespaces = $savedGlobal;
+
+ // Verify namespaces after global restauration
+ $this->assertTrue( MWNamespace::isContent( NS_MAIN ) );
+ $this->assertFalse( MWNamespace::isContent( 252 ) );
+ }
+
+ public function testIsWatchable() {
+ // Specials namespaces are not watchable
+ $this->assertFalse( MWNamespace::isWatchable( NS_MEDIA ) );
+ $this->assertFalse( MWNamespace::isWatchable( NS_SPECIAL ) );
+
+ // Core defined namespaces are watchables
+ $this->assertTrue( MWNamespace::isWatchable( NS_MAIN ) );
+ $this->assertTrue( MWNamespace::isWatchable( NS_TALK ) );
+
+ // Additional, user defined namespaces are watchables
+ $this->assertTrue( MWNamespace::isWatchable( 100 ) );
+ $this->assertTrue( MWNamespace::isWatchable( 101 ) );
+ }
+
+ public function testHasSubpages() {
+ // Special namespaces:
+ $this->assertFalse( MWNamespace::hasSubpages( NS_MEDIA ) );
+ $this->assertFalse( MWNamespace::hasSubpages( NS_SPECIAL ) );
+
+ // namespaces without subpages
+ # save up global
+ global $wgNamespacesWithSubpages;
+ $saved = null;
+ if( array_key_exists( NS_MAIN, $wgNamespacesWithSubpages ) ) {
+ $saved = $wgNamespacesWithSubpages[NS_MAIN];
+ unset( $wgNamespacesWithSubpages[NS_MAIN] );
+ }
+
+ $this->assertFalse( MWNamespace::hasSubpages( NS_MAIN ) );
+
+ $wgNamespacesWithSubpages[NS_MAIN] = true;
+ $this->assertTrue( MWNamespace::hasSubpages( NS_MAIN ) );
+ $wgNamespacesWithSubpages[NS_MAIN] = false;
+ $this->assertFalse( MWNamespace::hasSubpages( NS_MAIN ) );
+
+ # restore global
+ if( $saved !== null ) {
+ $wgNamespacesWithSubpages[NS_MAIN] = $saved;
+ }
+
+ // Some namespaces with subpages
+ $this->assertTrue( MWNamespace::hasSubpages( NS_TALK ) );
+ $this->assertTrue( MWNamespace::hasSubpages( NS_USER ) );
+ $this->assertTrue( MWNamespace::hasSubpages( NS_USER_TALK ) );
+ }
+
+ /**
+ */
+ public function testGetContentNamespaces() {
+ $this->assertEquals(
+ array( NS_MAIN ),
+ MWNamespace::getcontentNamespaces(),
+ '$wgContentNamespaces is an array with only NS_MAIN by default'
+ );
+
+ global $wgContentNamespaces;
+
+ # test !is_array( $wgcontentNamespaces )
+ $wgContentNamespaces = '';
+ $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+ $wgContentNamespaces = false;
+ $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+ $wgContentNamespaces = null;
+ $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+ $wgContentNamespaces = 5;
+ $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+
+ # test $wgContentNamespaces === array()
+ $wgContentNamespaces = array();
+ $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+
+ # test !in_array( NS_MAIN, $wgContentNamespaces )
+ $wgContentNamespaces = array( NS_USER, NS_CATEGORY );
+ $this->assertEquals(
+ array( NS_MAIN, NS_USER, NS_CATEGORY ),
+ MWNamespace::getcontentNamespaces(),
+ 'NS_MAIN is forced in wgContentNamespaces even if unwanted'
+ );
+
+ # test other cases, return $wgcontentNamespaces as is
+ $wgContentNamespaces = array( NS_MAIN );
+ $this->assertEquals(
+ array( NS_MAIN ),
+ MWNamespace::getcontentNamespaces()
+ );
+
+ $wgContentNamespaces = array( NS_MAIN, NS_USER, NS_CATEGORY );
+ $this->assertEquals(
+ array( NS_MAIN, NS_USER, NS_CATEGORY ),
+ MWNamespace::getcontentNamespaces()
+ );
+
+ }
+
+ /**
+ * Some namespaces are always capitalized per code definition
+ * in MWNamespace::$alwaysCapitalizedNamespaces
+ */
+ public function testIsCapitalizedHardcodedAssertions() {
+ // NS_MEDIA and NS_FILE are treated the same
+ $this->assertEquals(
+ MWNamespace::isCapitalized( NS_MEDIA ),
+ MWNamespace::isCapitalized( NS_FILE ),
+ 'NS_MEDIA and NS_FILE have same capitalization rendering'
+ );
+
+ // Boths are capitalized by default
+ $this->assertTrue( MWNamespace::isCapitalized( NS_MEDIA ) );
+ $this->assertTrue( MWNamespace::isCapitalized( NS_FILE ) );
+
+ // Always capitalized namespaces
+ // @see MWNamespace::$alwaysCapitalizedNamespaces
+ $this->assertTrue( MWNamespace::isCapitalized( NS_SPECIAL ) );
+ $this->assertTrue( MWNamespace::isCapitalized( NS_USER ) );
+ $this->assertTrue( MWNamespace::isCapitalized( NS_MEDIAWIKI ) );
+ }
+
+ /**
+ * Follows up for testIsCapitalizedHardcodedAssertions() but alter the
+ * global $wgCapitalLink setting to have extended coverage.
+ *
+ * MWNamespace::isCapitalized() rely on two global settings:
+ * $wgCapitalLinkOverrides = array(); by default
+ * $wgCapitalLinks = true; by default
+ * This function test $wgCapitalLinks
+ *
+ * Global setting correctness is tested against the NS_PROJECT and
+ * NS_PROJECT_TALK namespaces since they are not hardcoded nor specials
+ */
+ public function testIsCapitalizedWithWgCapitalLinks() {
+ global $wgCapitalLinks;
+ // Save the global to easily reset to MediaWiki default settings
+ $savedGlobal = $wgCapitalLinks;
+
+ $wgCapitalLinks = true;
+ $this->assertTrue( MWNamespace::isCapitalized( NS_PROJECT ) );
+ $this->assertTrue( MWNamespace::isCapitalized( NS_PROJECT_TALK ) );
+
+ $wgCapitalLinks = false;
+ // hardcoded namespaces (see above function) are still capitalized:
+ $this->assertTrue( MWNamespace::isCapitalized( NS_SPECIAL ) );
+ $this->assertTrue( MWNamespace::isCapitalized( NS_USER ) );
+ $this->assertTrue( MWNamespace::isCapitalized( NS_MEDIAWIKI ) );
+ // setting is correctly applied
+ $this->assertFalse( MWNamespace::isCapitalized( NS_PROJECT ) );
+ $this->assertFalse( MWNamespace::isCapitalized( NS_PROJECT_TALK ) );
+
+ // reset global state:
+ $wgCapitalLinks = $savedGlobal;
+ }
+
+ /**
+ * Counter part for MWNamespace::testIsCapitalizedWithWgCapitalLinks() now
+ * testing the $wgCapitalLinkOverrides global.
+ *
+ * @todo split groups of assertions in autonomous testing functions
+ */
+ public function testIsCapitalizedWithWgCapitalLinkOverrides() {
+ global $wgCapitalLinkOverrides;
+ // Save the global to easily reset to MediaWiki default settings
+ $savedGlobal = $wgCapitalLinkOverrides;
+
+ // Test default settings
+ $this->assertTrue( MWNamespace::isCapitalized( NS_PROJECT ) );
+ $this->assertTrue( MWNamespace::isCapitalized( NS_PROJECT_TALK ) );
+ // hardcoded namespaces (see above function) are capitalized:
+ $this->assertTrue( MWNamespace::isCapitalized( NS_SPECIAL ) );
+ $this->assertTrue( MWNamespace::isCapitalized( NS_USER ) );
+ $this->assertTrue( MWNamespace::isCapitalized( NS_MEDIAWIKI ) );
+
+ // Hardcoded namespaces remains capitalized
+ $wgCapitalLinkOverrides[NS_SPECIAL] = false;
+ $wgCapitalLinkOverrides[NS_USER] = false;
+ $wgCapitalLinkOverrides[NS_MEDIAWIKI] = false;
+ $this->assertTrue( MWNamespace::isCapitalized( NS_SPECIAL ) );
+ $this->assertTrue( MWNamespace::isCapitalized( NS_USER ) );
+ $this->assertTrue( MWNamespace::isCapitalized( NS_MEDIAWIKI ) );
+
+ $wgCapitalLinkOverrides = $savedGlobal;
+ $wgCapitalLinkOverrides[NS_PROJECT] = false;
+ $this->assertFalse( MWNamespace::isCapitalized( NS_PROJECT ) );
+ $wgCapitalLinkOverrides[NS_PROJECT] = true ;
+ $this->assertTrue( MWNamespace::isCapitalized( NS_PROJECT ) );
+ unset( $wgCapitalLinkOverrides[NS_PROJECT] );
+ $this->assertTrue( MWNamespace::isCapitalized( NS_PROJECT ) );
+
+ // reset global state:
+ $wgCapitalLinkOverrides = $savedGlobal;
+ }
+
+ public function testHasGenderDistinction() {
+ // Namespaces with gender distinctions
+ $this->assertTrue( MWNamespace::hasGenderDistinction( NS_USER ) );
+ $this->assertTrue( MWNamespace::hasGenderDistinction( NS_USER_TALK ) );
+
+ // Other ones, "genderless"
+ $this->assertFalse( MWNamespace::hasGenderDistinction( NS_MEDIA ) );
+ $this->assertFalse( MWNamespace::hasGenderDistinction( NS_SPECIAL ) );
+ $this->assertFalse( MWNamespace::hasGenderDistinction( NS_MAIN ) );
+ $this->assertFalse( MWNamespace::hasGenderDistinction( NS_TALK ) );
+
+ }
+}
+