] );
}
- public static function provideValidModules() {
- return [
- [ 'TEST.validModule1', new ResourceLoaderTestModule() ],
- ];
- }
-
/**
- * Ensures that the ResourceLoaderRegisterModules hook is called when a new
- * ResourceLoader object is constructed.
+ * Ensure the ResourceLoaderRegisterModules hook is called.
+ *
* @covers ResourceLoader::__construct
*/
- public function testCreatingNewResourceLoaderCallsRegistrationHook() {
+ public function testConstructRegistrationHook() {
$resourceLoaderRegisterModulesHook = false;
$this->setMwGlobals( 'wgHooks', [
]
] );
- $resourceLoader = new ResourceLoader();
+ $unused = new ResourceLoader();
$this->assertTrue(
$resourceLoaderRegisterModulesHook,
'Hook ResourceLoaderRegisterModules called'
);
-
- return $resourceLoader;
}
/**
- * @dataProvider provideValidModules
- * @depends testCreatingNewResourceLoaderCallsRegistrationHook
* @covers ResourceLoader::register
* @covers ResourceLoader::getModule
*/
- public function testRegisteredValidModulesAreAccessible(
- $name, ResourceLoaderModule $module, ResourceLoader $resourceLoader
- ) {
- $resourceLoader->register( $name, $module );
- $this->assertEquals( $module, $resourceLoader->getModule( $name ) );
+ public function testRegisterValid() {
+ $module = new ResourceLoaderTestModule();
+ $resourceLoader = new EmptyResourceLoader();
+ $resourceLoader->register( 'test', $module );
+ $this->assertEquals( $module, $resourceLoader->getModule( 'test' ) );
}
/**
- * @covers ResourceLoaderFileModule::compileLessFile
+ * @covers ResourceLoader::register
*/
- public function testLessFileCompilation() {
- $context = $this->getResourceLoaderContext();
- $basePath = __DIR__ . '/../../data/less/module';
- $module = new ResourceLoaderFileModule( [
- 'localBasePath' => $basePath,
- 'styles' => [ 'styles.less' ],
- ] );
- $module->setName( 'test.less' );
- $styles = $module->getStyles( $context );
- $this->assertStringEqualsFile( $basePath . '/styles.css', $styles['all'] );
+ public function testRegisterInvalidName() {
+ $resourceLoader = new EmptyResourceLoader();
+ $this->setExpectedException( 'MWException', "name 'test!invalid' is invalid" );
+ $resourceLoader->register( 'test!invalid', new ResourceLoaderTestModule() );
}
/**
- * Strip @noflip annotations from CSS code.
- * @param string $css
- * @return string
+ * @covers ResourceLoader::register
*/
- private static function stripNoflip( $css ) {
- return str_replace( '/*@noflip*/ ', '', $css );
+ public function testRegisterInvalidType() {
+ $resourceLoader = new EmptyResourceLoader();
+ $this->setExpectedException( 'MWException', 'ResourceLoader module info type error' );
+ $resourceLoader->register( 'test', new stdClass() );
}
/**
- * @dataProvider providePackedModules
- * @covers ResourceLoader::makePackedModulesString
+ * @covers ResourceLoader::getModuleNames
*/
- public function testMakePackedModulesString( $desc, $modules, $packed ) {
- $this->assertEquals( $packed, ResourceLoader::makePackedModulesString( $modules ), $desc );
+ public function testGetModuleNames() {
+ // Use an empty one so that core and extension modules don't get in.
+ $resourceLoader = new EmptyResourceLoader();
+ $resourceLoader->register( 'test.foo', new ResourceLoaderTestModule() );
+ $resourceLoader->register( 'test.bar', new ResourceLoaderTestModule() );
+ $this->assertEquals(
+ [ 'test.foo', 'test.bar' ],
+ $resourceLoader->getModuleNames()
+ );
}
/**
- * @dataProvider providePackedModules
- * @covers ResourceLoaderContext::expandModuleNames
+ * @covers ResourceLoader::isModuleRegistered
*/
- public function testexpandModuleNames( $desc, $modules, $packed ) {
- $this->assertEquals( $modules, ResourceLoaderContext::expandModuleNames( $packed ), $desc );
+ public function testIsModuleRegistered() {
+ $rl = new EmptyResourceLoader();
+ $rl->register( 'test', new ResourceLoaderTestModule() );
+ $this->assertTrue( $rl->isModuleRegistered( 'test' ) );
+ $this->assertFalse( $rl->isModuleRegistered( 'test.unknown' ) );
+ }
+
+ /**
+ * @covers ResourceLoader::getModule
+ */
+ public function testGetModuleUnknown() {
+ $rl = new EmptyResourceLoader();
+ $this->assertSame( null, $rl->getModule( 'test' ) );
+ }
+
+ /**
+ * @covers ResourceLoader::getModule
+ */
+ public function testGetModuleClass() {
+ $rl = new EmptyResourceLoader();
+ $rl->register( 'test', [ 'class' => ResourceLoaderTestModule::class ] );
+ $this->assertInstanceOf(
+ ResourceLoaderTestModule::class,
+ $rl->getModule( 'test' )
+ );
+ }
+
+ /**
+ * @covers ResourceLoader::getModule
+ */
+ public function testGetModuleClassDefault() {
+ $rl = new EmptyResourceLoader();
+ $rl->register( 'test', [] );
+ $this->assertInstanceOf(
+ ResourceLoaderFileModule::class,
+ $rl->getModule( 'test' ),
+ 'Array-style module registrations default to FileModule'
+ );
+ }
+
+ /**
+ * @covers ResourceLoaderFileModule::compileLessFile
+ */
+ public function testLessFileCompilation() {
+ $context = $this->getResourceLoaderContext();
+ $basePath = __DIR__ . '/../../data/less/module';
+ $module = new ResourceLoaderFileModule( [
+ 'localBasePath' => $basePath,
+ 'styles' => [ 'styles.less' ],
+ ] );
+ $module->setName( 'test.less' );
+ $styles = $module->getStyles( $context );
+ $this->assertStringEqualsFile( $basePath . '/styles.css', $styles['all'] );
}
public static function providePackedModules() {
];
}
+ /**
+ * @dataProvider providePackedModules
+ * @covers ResourceLoader::makePackedModulesString
+ */
+ public function testMakePackedModulesString( $desc, $modules, $packed ) {
+ $this->assertEquals( $packed, ResourceLoader::makePackedModulesString( $modules ), $desc );
+ }
+
+ /**
+ * @dataProvider providePackedModules
+ * @covers ResourceLoaderContext::expandModuleNames
+ */
+ public function testexpandModuleNames( $desc, $modules, $packed ) {
+ $this->assertEquals( $modules, ResourceLoaderContext::expandModuleNames( $packed ), $desc );
+ }
+
public static function provideAddSource() {
return [
- [ 'examplewiki', '//example.org/w/load.php', 'examplewiki' ],
- [ 'example2wiki', [ 'loadScript' => '//example.com/w/load.php' ], 'example2wiki' ],
+ [ 'foowiki', 'https://example.org/w/load.php', 'foowiki' ],
+ [ 'foowiki', [ 'loadScript' => 'https://example.org/w/load.php' ], 'foowiki' ],
[
- [ 'foowiki' => '//foo.org/w/load.php', 'bazwiki' => '//baz.org/w/load.php' ],
+ [
+ 'foowiki' => 'https://example.org/w/load.php',
+ 'bazwiki' => 'https://example.com/w/load.php',
+ ],
null,
[ 'foowiki', 'bazwiki' ]
- ],
- [
- [ 'foowiki' => '//foo.org/w/load.php' ],
- null,
- false,
- ],
+ ]
];
}
*/
public function testAddSource( $name, $info, $expected ) {
$rl = new ResourceLoader;
- if ( $expected === false ) {
- $this->setExpectedException( 'MWException', 'ResourceLoader duplicate source addition error' );
- $rl->addSource( $name, $info );
- }
$rl->addSource( $name, $info );
if ( is_array( $expected ) ) {
foreach ( $expected as $source ) {
}
}
- public static function fakeSources() {
- return [
- 'examplewiki' => [
- 'loadScript' => '//example.org/w/load.php',
- 'apiScript' => '//example.org/w/api.php',
- ],
- 'example2wiki' => [
- 'loadScript' => '//example.com/w/load.php',
- 'apiScript' => '//example.com/w/api.php',
- ],
- ];
+ /**
+ * @covers ResourceLoader::addSource
+ */
+ public function testAddSourceDupe() {
+ $rl = new ResourceLoader;
+ $this->setExpectedException( 'MWException', 'ResourceLoader duplicate source addition error' );
+ $rl->addSource( 'foo', 'https://example.org/w/load.php' );
+ $rl->addSource( 'foo', 'https://example.com/w/load.php' );
+ }
+
+ /**
+ * @covers ResourceLoader::addSource
+ */
+ public function testAddSourceInvalid() {
+ $rl = new ResourceLoader;
+ $this->setExpectedException( 'MWException', 'with no "loadScript" key' );
+ $rl->addSource( 'foo', [ 'x' => 'https://example.org/w/load.php' ] );
}
public static function provideLoaderImplement() {
'name' => 'test.example',
'scripts' => 'mw.example();',
'styles' => [],
- 'messages' => new XmlJsCode( '{}' ),
- 'templates' => [],
'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery, require, module ) {
mw.example();
'scripts' => [],
'styles' => [ 'css' => [ '.mw-example {}' ] ],
'messages' => new XmlJsCode( '{}' ),
- 'templates' => [],
'expected' => 'mw.loader.implement( "test.example", [], {
"css": [
'name' => 'test.example',
'scripts' => 'mw.example();',
- 'styles' => [],
'messages' => [ 'example' => '' ],
- 'templates' => [],
'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery, require, module ) {
mw.example();
'name' => 'test.example',
'scripts' => 'mw.example();',
- 'styles' => [],
- 'messages' => new XmlJsCode( '{}' ),
'templates' => [ 'example.html' => '' ],
'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery, require, module ) {
"example.html": ""
} );',
] ],
+ [ [
+ 'title' => 'Implement unwrapped user script',
+
+ 'name' => 'user',
+ 'scripts' => 'mw.example( 1 );',
+
+ 'expected' => 'mw.loader.implement( "user", "mw.example( 1 );" );',
+ ] ],
+ [ [
+ 'title' => 'Implement unwrapped user script',
+ 'debug' => false,
+
+ 'name' => 'user',
+ 'scripts' => 'mw.example( 1 );',
+
+ 'expected' => 'mw.loader.implement("user","mw.example(1);");',
+ ] ],
];
}
/**
* @dataProvider provideLoaderImplement
* @covers ResourceLoader::makeLoaderImplementScript
+ * @covers ResourceLoader::trimArray
*/
public function testMakeLoaderImplementScript( $case ) {
+ $case += [
+ 'styles' => [], 'templates' => [], 'messages' => new XmlJsCode( '{}' ),
+ 'debug' => true
+ ];
+ ResourceLoader::clearCache();
+ $this->setMwGlobals( 'wgResourceLoaderDebug', $case['debug'] );
+
$this->assertEquals(
$case['expected'],
ResourceLoader::makeLoaderImplementScript(
);
}
+ /**
+ * @covers ResourceLoader::makeLoaderImplementScript
+ */
+ public function testMakeLoaderImplementScriptInvalid() {
+ $this->setExpectedException( 'MWException', 'Invalid scripts error' );
+ ResourceLoader::makeLoaderImplementScript(
+ 'test', // name
+ 123, // scripts
+ null, // styles
+ null, // messages
+ null // templates
+ );
+ }
+
+ /**
+ * @covers ResourceLoader::makeLoaderSourcesScript
+ */
+ public function testMakeLoaderSourcesScript() {
+ $this->assertEquals(
+ 'mw.loader.addSource( "local", "/w/load.php" );',
+ ResourceLoader::makeLoaderSourcesScript( 'local', '/w/load.php' )
+ );
+ $this->assertEquals(
+ 'mw.loader.addSource( {
+ "local": "/w/load.php"
+} );',
+ ResourceLoader::makeLoaderSourcesScript( [ 'local' => '/w/load.php' ] )
+ );
+ $this->assertEquals(
+ 'mw.loader.addSource( {
+ "local": "/w/load.php",
+ "example": "https://example.org/w/load.php"
+} );',
+ ResourceLoader::makeLoaderSourcesScript( [
+ 'local' => '/w/load.php',
+ 'example' => 'https://example.org/w/load.php'
+ ] )
+ );
+ $this->assertEquals(
+ 'mw.loader.addSource( [] );',
+ ResourceLoader::makeLoaderSourcesScript( [] )
+ );
+ }
+
+ private static function fakeSources() {
+ return [
+ 'examplewiki' => [
+ 'loadScript' => '//example.org/w/load.php',
+ 'apiScript' => '//example.org/w/api.php',
+ ],
+ 'example2wiki' => [
+ 'loadScript' => '//example.com/w/load.php',
+ 'apiScript' => '//example.com/w/api.php',
+ ],
+ ];
+ }
+
/**
* @covers ResourceLoader::getLoadScript
*/
$this->assertTrue( true );
}
}
-
- /**
- * @covers ResourceLoader::isModuleRegistered
- */
- public function testIsModuleRegistered() {
- $rl = new ResourceLoader();
- $rl->register( 'test.module', new ResourceLoaderTestModule() );
- $this->assertTrue( $rl->isModuleRegistered( 'test.module' ) );
- $this->assertFalse( $rl->isModuleRegistered( 'test.modulenotregistered' ) );
- }
}