Merge "Drop zh-tw message "saveprefs""
[lhc/web/wiklou.git] / tests / phpunit / includes / resourceloader / ResourceLoaderTest.php
1 <?php
2
3 class ResourceLoaderTest extends ResourceLoaderTestCase {
4
5 protected function setUp() {
6 parent::setUp();
7
8 $this->setMwGlobals( array(
9 'wgResourceLoaderLESSImportPaths' => array(
10 dirname( dirname( __DIR__ ) ) . '/data/less/common',
11 ),
12 'wgResourceLoaderLESSVars' => array(
13 'foo' => '2px',
14 'Foo' => '#eeeeee',
15 'bar' => 5,
16 ),
17 ) );
18 }
19
20 public static function provideValidModules() {
21 return array(
22 array( 'TEST.validModule1', new ResourceLoaderTestModule() ),
23 );
24 }
25
26 /**
27 * Ensures that the ResourceLoaderRegisterModules hook is called when a new
28 * ResourceLoader object is constructed.
29 * @covers ResourceLoader::__construct
30 */
31 public function testCreatingNewResourceLoaderCallsRegistrationHook() {
32 $resourceLoaderRegisterModulesHook = false;
33
34 $this->setMwGlobals( 'wgHooks', array(
35 'ResourceLoaderRegisterModules' => array(
36 function ( &$resourceLoader ) use ( &$resourceLoaderRegisterModulesHook ) {
37 $resourceLoaderRegisterModulesHook = true;
38 }
39 )
40 ) );
41
42 $resourceLoader = new ResourceLoader();
43 $this->assertTrue(
44 $resourceLoaderRegisterModulesHook,
45 'Hook ResourceLoaderRegisterModules called'
46 );
47
48 return $resourceLoader;
49 }
50
51 /**
52 * @dataProvider provideValidModules
53 * @depends testCreatingNewResourceLoaderCallsRegistrationHook
54 * @covers ResourceLoader::register
55 * @covers ResourceLoader::getModule
56 */
57 public function testRegisteredValidModulesAreAccessible(
58 $name, ResourceLoaderModule $module, ResourceLoader $resourceLoader
59 ) {
60 $resourceLoader->register( $name, $module );
61 $this->assertEquals( $module, $resourceLoader->getModule( $name ) );
62 }
63
64 /**
65 * @covers ResourceLoaderFileModule::compileLessFile
66 */
67 public function testLessFileCompilation() {
68 $context = $this->getResourceLoaderContext();
69 $basePath = __DIR__ . '/../../data/less/module';
70 $module = new ResourceLoaderFileModule( array(
71 'localBasePath' => $basePath,
72 'styles' => array( 'styles.less' ),
73 ) );
74 $module->setName( 'test.less' );
75 $styles = $module->getStyles( $context );
76 $this->assertStringEqualsFile( $basePath . '/styles.css', $styles['all'] );
77 }
78
79 /**
80 * Strip @noflip annotations from CSS code.
81 * @param string $css
82 * @return string
83 */
84 private static function stripNoflip( $css ) {
85 return str_replace( '/*@noflip*/ ', '', $css );
86 }
87
88 /**
89 * @dataProvider providePackedModules
90 * @covers ResourceLoader::makePackedModulesString
91 */
92 public function testMakePackedModulesString( $desc, $modules, $packed ) {
93 $this->assertEquals( $packed, ResourceLoader::makePackedModulesString( $modules ), $desc );
94 }
95
96 /**
97 * @dataProvider providePackedModules
98 * @covers ResourceLoaderContext::expandModuleNames
99 */
100 public function testexpandModuleNames( $desc, $modules, $packed ) {
101 $this->assertEquals( $modules, ResourceLoaderContext::expandModuleNames( $packed ), $desc );
102 }
103
104 public static function providePackedModules() {
105 return array(
106 array(
107 'Example from makePackedModulesString doc comment',
108 array( 'foo.bar', 'foo.baz', 'bar.baz', 'bar.quux' ),
109 'foo.bar,baz|bar.baz,quux',
110 ),
111 array(
112 'Example from expandModuleNames doc comment',
113 array( 'jquery.foo', 'jquery.bar', 'jquery.ui.baz', 'jquery.ui.quux' ),
114 'jquery.foo,bar|jquery.ui.baz,quux',
115 ),
116 array(
117 'Regression fixed in r88706 with dotless names',
118 array( 'foo', 'bar', 'baz' ),
119 'foo,bar,baz',
120 ),
121 array(
122 'Prefixless modules after a prefixed module',
123 array( 'single.module', 'foobar', 'foobaz' ),
124 'single.module|foobar,foobaz',
125 ),
126 );
127 }
128
129 public static function provideAddSource() {
130 return array(
131 array( 'examplewiki', '//example.org/w/load.php', 'examplewiki' ),
132 array( 'example2wiki', array( 'loadScript' => '//example.com/w/load.php' ), 'example2wiki' ),
133 array(
134 array( 'foowiki' => '//foo.org/w/load.php', 'bazwiki' => '//baz.org/w/load.php' ),
135 null,
136 array( 'foowiki', 'bazwiki' )
137 ),
138 array(
139 array( 'foowiki' => '//foo.org/w/load.php' ),
140 null,
141 false,
142 ),
143 );
144 }
145
146 /**
147 * @dataProvider provideAddSource
148 * @covers ResourceLoader::addSource
149 * @covers ResourceLoader::getSources
150 */
151 public function testAddSource( $name, $info, $expected ) {
152 $rl = new ResourceLoader;
153 if ( $expected === false ) {
154 $this->setExpectedException( 'MWException', 'ResourceLoader duplicate source addition error' );
155 $rl->addSource( $name, $info );
156 }
157 $rl->addSource( $name, $info );
158 if ( is_array( $expected ) ) {
159 foreach ( $expected as $source ) {
160 $this->assertArrayHasKey( $source, $rl->getSources() );
161 }
162 } else {
163 $this->assertArrayHasKey( $expected, $rl->getSources() );
164 }
165 }
166
167 public static function fakeSources() {
168 return array(
169 'examplewiki' => array(
170 'loadScript' => '//example.org/w/load.php',
171 'apiScript' => '//example.org/w/api.php',
172 ),
173 'example2wiki' => array(
174 'loadScript' => '//example.com/w/load.php',
175 'apiScript' => '//example.com/w/api.php',
176 ),
177 );
178 }
179
180 public static function provideLoaderImplement() {
181 return array(
182 array( array(
183 'title' => 'Implement scripts, styles and messages',
184
185 'name' => 'test.example',
186 'scripts' => 'mw.example();',
187 'styles' => array( 'css' => array( '.mw-example {}' ) ),
188 'messages' => array( 'example' => '' ),
189 'templates' => array(),
190
191 'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery ) {
192 mw.example();
193 }, {
194 "css": [
195 ".mw-example {}"
196 ]
197 }, {
198 "example": ""
199 } );',
200 ) ),
201 array( array(
202 'title' => 'Implement scripts',
203
204 'name' => 'test.example',
205 'scripts' => 'mw.example();',
206 'styles' => array(),
207 'messages' => new XmlJsCode( '{}' ),
208 'templates' => array(),
209 'title' => 'scripts, styles and messags',
210
211 'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery ) {
212 mw.example();
213 } );',
214 ) ),
215 array( array(
216 'title' => 'Implement styles',
217
218 'name' => 'test.example',
219 'scripts' => array(),
220 'styles' => array( 'css' => array( '.mw-example {}' ) ),
221 'messages' => new XmlJsCode( '{}' ),
222 'templates' => array(),
223
224 'expected' => 'mw.loader.implement( "test.example", [], {
225 "css": [
226 ".mw-example {}"
227 ]
228 } );',
229 ) ),
230 array( array(
231 'title' => 'Implement scripts and messages',
232
233 'name' => 'test.example',
234 'scripts' => 'mw.example();',
235 'styles' => array(),
236 'messages' => array( 'example' => '' ),
237 'templates' => array(),
238
239 'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery ) {
240 mw.example();
241 }, {}, {
242 "example": ""
243 } );',
244 ) ),
245 array( array(
246 'title' => 'Implement scripts and templates',
247
248 'name' => 'test.example',
249 'scripts' => 'mw.example();',
250 'styles' => array(),
251 'messages' => new XmlJsCode( '{}' ),
252 'templates' => array( 'example.html' => '' ),
253
254 'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery ) {
255 mw.example();
256 }, {}, {}, {
257 "example.html": ""
258 } );',
259 ) ),
260 );
261 }
262
263 /**
264 * @dataProvider provideLoaderImplement
265 * @covers ResourceLoader::makeLoaderImplementScript
266 */
267 public function testMakeLoaderImplementScript( $case ) {
268 $this->assertEquals(
269 $case['expected'],
270 ResourceLoader::makeLoaderImplementScript(
271 $case['name'],
272 $case['scripts'],
273 $case['styles'],
274 $case['messages'],
275 $case['templates']
276 )
277 );
278 }
279
280 /**
281 * @covers ResourceLoader::getLoadScript
282 */
283 public function testGetLoadScript() {
284 $this->setMwGlobals( 'wgResourceLoaderSources', array() );
285 $rl = new ResourceLoader();
286 $sources = self::fakeSources();
287 $rl->addSource( $sources );
288 foreach ( array( 'examplewiki', 'example2wiki' ) as $name ) {
289 $this->assertEquals( $rl->getLoadScript( $name ), $sources[$name]['loadScript'] );
290 }
291
292 try {
293 $rl->getLoadScript( 'thiswasneverreigstered' );
294 $this->assertTrue( false, 'ResourceLoader::getLoadScript should have thrown an exception' );
295 } catch ( MWException $e ) {
296 $this->assertTrue( true );
297 }
298 }
299
300 /**
301 * @covers ResourceLoader::isModuleRegistered
302 */
303 public function testIsModuleRegistered() {
304 $rl = new ResourceLoader();
305 $rl->register( 'test.module', new ResourceLoaderTestModule() );
306 $this->assertTrue( $rl->isModuleRegistered( 'test.module' ) );
307 $this->assertFalse( $rl->isModuleRegistered( 'test.modulenotregistered' ) );
308 }
309 }