summaryrefslogtreecommitdiff
path: root/tests/phpunit/includes/cache/MessageCacheTest.php
blob: 5302b363a3b595e4b1b1a12cafce9cbb94315037 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<?php

/**
 * @group Database
 * @group Cache
 * @covers MessageCache
 */
class MessageCacheTest extends MediaWikiLangTestCase {

	protected function setUp() {
		parent::setUp();
		$this->configureLanguages();
		MessageCache::singleton()->enable();
	}

	/**
	 * Helper function -- setup site language for testing
	 */
	protected function configureLanguages() {
		// for the test, we need the content language to be anything but English,
		// let's choose e.g. German (de)
		$langCode = 'de';
		$langObj = Language::factory( $langCode );

		$this->setMwGlobals( array(
			'wgLanguageCode' => $langCode,
			'wgLang' => $langObj,
			'wgContLang' => $langObj,
		) );
	}

	function addDBData() {
		$this->configureLanguages();

		// Set up messages and fallbacks ab -> ru -> de
		$this->makePage( 'FallbackLanguageTest-Full', 'ab' );
		$this->makePage( 'FallbackLanguageTest-Full', 'ru' );
		$this->makePage( 'FallbackLanguageTest-Full', 'de' );

		// Fallbacks where ab does not exist
		$this->makePage( 'FallbackLanguageTest-Partial', 'ru' );
		$this->makePage( 'FallbackLanguageTest-Partial', 'de' );

		// Fallback to the content language
		$this->makePage( 'FallbackLanguageTest-ContLang', 'de' );

		// Add customizations for an existing message.
		$this->makePage( 'sunday', 'ru' );

		// Full key tests -- always want russian
		$this->makePage( 'MessageCacheTest-FullKeyTest', 'ab' );
		$this->makePage( 'MessageCacheTest-FullKeyTest', 'ru' );

		// In content language -- get base if no derivative
		$this->makePage( 'FallbackLanguageTest-NoDervContLang', 'de', 'de/none' );
	}

	/**
	 * Helper function for addDBData -- adds a simple page to the database
	 *
	 * @param string $title Title of page to be created
	 * @param string $lang Language and content of the created page
	 * @param string|null $content Content of the created page, or null for a generic string
	 */
	protected function makePage( $title, $lang, $content = null ) {
		global $wgContLang;

		if ( $content === null ) {
			$content = $lang;
		}
		if ( $lang !== $wgContLang->getCode() ) {
			$title = "$title/$lang";
		}

		$title = Title::newFromText( $title, NS_MEDIAWIKI );
		$wikiPage = new WikiPage( $title );
		$contentHandler = ContentHandler::makeContent( $content, $title );
		$wikiPage->doEditContent( $contentHandler, "$lang translation test case" );
	}

	/**
	 * Test message fallbacks, bug #1495
	 *
	 * @dataProvider provideMessagesForFallback
	 */
	public function testMessageFallbacks( $message, $lang, $expectedContent ) {
		$result = MessageCache::singleton()->get( $message, true, $lang );
		$this->assertEquals( $expectedContent, $result, "Message fallback failed." );
	}

	function provideMessagesForFallback() {
		return array(
			array( 'FallbackLanguageTest-Full', 'ab', 'ab' ),
			array( 'FallbackLanguageTest-Partial', 'ab', 'ru' ),
			array( 'FallbackLanguageTest-ContLang', 'ab', 'de' ),
			array( 'FallbackLanguageTest-None', 'ab', false ),

			// Existing message with customizations on the fallbacks
			array( 'sunday', 'ab', 'амҽыш' ),

			// bug 46579
			array( 'FallbackLanguageTest-NoDervContLang', 'de', 'de/none' ),
			// UI language different from content language should only use de/none as last option
			array( 'FallbackLanguageTest-NoDervContLang', 'fit', 'de/none' ),
		);
	}

	/**
	 * There's a fallback case where the message key is given as fully qualified -- this
	 * should ignore the passed $lang and use the language from the key
	 *
	 * @dataProvider provideMessagesForFullKeys
	 */
	public function testFullKeyBehaviour( $message, $lang, $expectedContent ) {
		$result = MessageCache::singleton()->get( $message, true, $lang, true );
		$this->assertEquals( $expectedContent, $result, "Full key message fallback failed." );
	}

	function provideMessagesForFullKeys() {
		return array(
			array( 'MessageCacheTest-FullKeyTest/ru', 'ru', 'ru' ),
			array( 'MessageCacheTest-FullKeyTest/ru', 'ab', 'ru' ),
			array( 'MessageCacheTest-FullKeyTest/ru/foo', 'ru', false ),
		);
	}

	/**
	 * @dataProvider provideNormalizeKey
	 */
	public function testNormalizeKey( $key, $expected ) {
		$actual = MessageCache::normalizeKey( $key );
		$this->assertEquals( $expected, $actual );
	}

	public function provideNormalizeKey() {
		return array(
			array( 'Foo', 'foo' ),
			array( 'foo', 'foo' ),
			array( 'fOo', 'fOo' ),
			array( 'FOO', 'fOO' ),
			array( 'Foo bar', 'foo_bar' ),
			array( 'Ćab', 'ćab' ),
			array( 'Ćab_e 3', 'ćab_e_3' ),
			array( 'ĆAB', 'ćAB' ),
			array( 'ćab', 'ćab' ),
			array( 'ćaB', 'ćaB' ),
		);
	}
}