4 use Wikimedia\TestingAccessWrapper;
25 $this->assertFileExists( $filename,
26 "File '$resource' referenced by '$module' must exist."
34 $cssText = CSSMin::minify(
$css->cssText );
37 strpos( $cssText,
'@media' ) ===
false,
38 'Stylesheets should not both specify "media" and contain @media'
44 foreach (
$data[
'modules']
as $moduleName => $module ) {
45 $version = $module->getVersionHash(
$data[
'context'] );
46 $this->assertEquals( 7, strlen( $version ),
"$moduleName must use ResourceLoader::makeHash" );
63 foreach (
$data[
'modules']
as $moduleName => $module ) {
64 if ( $module->isRaw() ) {
65 $illegalDeps[] = $moduleName;
70 foreach (
$data[
'modules']
as $moduleName => $module ) {
71 foreach ( $illegalDeps
as $illegalDep ) {
72 $this->assertNotContains(
74 $module->getDependencies(
$data[
'context'] ),
75 "Module '$moduleName' must not depend on '$illegalDep'"
86 $validDeps = array_keys(
$data[
'modules'] );
89 foreach (
$data[
'modules']
as $moduleName => $module ) {
90 foreach ( $module->getDependencies(
$data[
'context'] )
as $dep ) {
91 $this->assertContains(
94 "The module '$dep' required by '$moduleName' must exist"
108 foreach (
$data[
'modules']
as $moduleName => $module ) {
109 foreach ( $module->getMessages()
as $msgKey ) {
111 wfMessage( $msgKey )->useDatabase(
false )->inLanguage(
$lang )->exists(),
112 "Message '$msgKey' required by '$moduleName' must exist"
129 foreach (
$data[
'modules']
as $moduleName => $module ) {
130 $moduleTargets = $module->getTargets();
131 foreach ( $module->getDependencies(
$data[
'context'] )
as $dep ) {
132 if ( !isset(
$data[
'modules'][$dep] ) ) {
136 $targets =
$data[
'modules'][$dep]->getTargets();
137 foreach ( $moduleTargets
as $moduleTarget ) {
138 $this->assertContains(
141 "The module '$moduleName' must not have target '$moduleTarget' "
142 .
"because its dependency '$dep' does not have it"
154 $basepath = __DIR__ .
'/../data/css/';
155 $css = file_get_contents( $basepath .
'comments.css' );
156 $files = CSSMin::getLocalFileReferences(
$css, $basepath );
157 $expected = [ $basepath .
'not-commented.gif' ];
161 'Url(...) expression in comment should be omitted.'
178 $rl = MediaWikiServices::getInstance()->getResourceLoader();
182 foreach ( $rl->getModuleNames()
as $moduleName ) {
183 $modules[$moduleName] = $rl->getModule( $moduleName );
191 'resourceloader' => $rl,
204 foreach (
$data[
'modules']
as $moduleName => $module ) {
209 $reflectedModule =
new ReflectionObject( $module );
211 $getStyleFiles = $reflectedModule->getMethod(
'getStyleFiles' );
212 $getStyleFiles->setAccessible(
true );
214 $readStyleFile = $reflectedModule->getMethod(
'readStyleFile' );
215 $readStyleFile->setAccessible(
true );
217 $styleFiles = $getStyleFiles->invoke( $module,
$data[
'context'] );
219 $flip = $module->getFlip(
$data[
'context'] );
221 foreach ( $styleFiles
as $media => $files ) {
222 if ( $media && $media !==
'all' ) {
230 'cssText' => $readStyleFile->invoke(
271 foreach (
$data[
'modules']
as $moduleName => $module ) {
276 $moduleProxy = TestingAccessWrapper::newFromObject( $module );
280 foreach ( $filePathProps[
'lists']
as $propName ) {
281 $list = $moduleProxy->$propName;
282 foreach ( $list
as $key =>
$value ) {
287 if ( is_int( $key ) ) {
295 foreach ( $filePathProps[
'nested-lists']
as $propName ) {
296 $lists = $moduleProxy->$propName;
297 foreach ( $lists
as $list ) {
298 foreach ( $list
as $key =>
$value ) {
301 if ( is_int( $key ) ) {
313 $moduleProxy->getLocalPath(
$file ),
320 $moduleProxy->readStyleFiles(
321 $module->getStyleFiles(
$data[
'context'] ),
322 $module->getFlip(
$data[
'context'] ),
326 $missingLocalFileRefs = $moduleProxy->missingLocalFileRefs;
328 foreach ( $missingLocalFileRefs
as $file ) {