MediaWiki
REL1_23
|
00001 <?php 00017 class ResourcesTest extends MediaWikiTestCase { 00018 00022 public function testFileExistence( $filename, $module, $resource ) { 00023 $this->assertFileExists( $filename, 00024 "File '$resource' referenced by '$module' must exist." 00025 ); 00026 } 00027 00031 public function testStyleMedia( $moduleName, $media, $filename, $css ) { 00032 $cssText = CSSMin::minify( $css->cssText ); 00033 00034 $this->assertTrue( strpos( $cssText, '@media' ) === false, 'Stylesheets should not both specify "media" and contain @media' ); 00035 } 00036 00037 public function testDependencies() { 00038 $data = self::getAllModules(); 00039 $illegalDeps = array( 'jquery', 'mediawiki' ); 00040 00041 foreach ( $data['modules'] as $moduleName => $module ) { 00042 foreach ( $illegalDeps as $illegalDep ) { 00043 $this->assertNotContains( 00044 $illegalDep, 00045 $module->getDependencies(), 00046 "Module '$moduleName' must not depend on '$illegalDep'" 00047 ); 00048 } 00049 } 00050 } 00051 00055 protected static function getAllModules() { 00056 global $wgEnableJavaScriptTest; 00057 00058 // Test existance of test suite files as well 00059 // (can't use setUp or setMwGlobals because providers are static) 00060 $org_wgEnableJavaScriptTest = $wgEnableJavaScriptTest; 00061 $wgEnableJavaScriptTest = true; 00062 00063 // Initialize ResourceLoader 00064 $rl = new ResourceLoader(); 00065 00066 $modules = array(); 00067 00068 foreach ( $rl->getModuleNames() as $moduleName ) { 00069 $modules[$moduleName] = $rl->getModule( $moduleName ); 00070 } 00071 00072 // Restore settings 00073 $wgEnableJavaScriptTest = $org_wgEnableJavaScriptTest; 00074 00075 return array( 00076 'modules' => $modules, 00077 'resourceloader' => $rl, 00078 'context' => new ResourceLoaderContext( $rl, new FauxRequest() ) 00079 ); 00080 } 00081 00086 public static function provideMediaStylesheets() { 00087 $data = self::getAllModules(); 00088 $cases = array(); 00089 00090 foreach ( $data['modules'] as $moduleName => $module ) { 00091 if ( !$module instanceof ResourceLoaderFileModule ) { 00092 continue; 00093 } 00094 00095 $reflectedModule = new ReflectionObject( $module ); 00096 00097 $getStyleFiles = $reflectedModule->getMethod( 'getStyleFiles' ); 00098 $getStyleFiles->setAccessible( true ); 00099 00100 $readStyleFile = $reflectedModule->getMethod( 'readStyleFile' ); 00101 $readStyleFile->setAccessible( true ); 00102 00103 $styleFiles = $getStyleFiles->invoke( $module, $data['context'] ); 00104 00105 $flip = $module->getFlip( $data['context'] ); 00106 00107 foreach ( $styleFiles as $media => $files ) { 00108 if ( $media && $media !== 'all' ) { 00109 foreach ( $files as $file ) { 00110 $cases[] = array( 00111 $moduleName, 00112 $media, 00113 $file, 00114 // XXX: Wrapped in an object to keep it out of PHPUnit output 00115 (object) array( 'cssText' => $readStyleFile->invoke( $module, $file, $flip ) ), 00116 ); 00117 } 00118 } 00119 } 00120 } 00121 00122 return $cases; 00123 } 00124 00132 public static function provideResourceFiles() { 00133 $data = self::getAllModules(); 00134 $cases = array(); 00135 00136 // See also ResourceLoaderFileModule::__construct 00137 $filePathProps = array( 00138 // Lists of file paths 00139 'lists' => array( 00140 'scripts', 00141 'debugScripts', 00142 'loaderScripts', 00143 'styles', 00144 ), 00145 00146 // Collated lists of file paths 00147 'nested-lists' => array( 00148 'languageScripts', 00149 'skinScripts', 00150 'skinStyles', 00151 ), 00152 ); 00153 00154 foreach ( $data['modules'] as $moduleName => $module ) { 00155 if ( !$module instanceof ResourceLoaderFileModule ) { 00156 continue; 00157 } 00158 00159 $reflectedModule = new ReflectionObject( $module ); 00160 00161 $files = array(); 00162 00163 foreach ( $filePathProps['lists'] as $propName ) { 00164 $property = $reflectedModule->getProperty( $propName ); 00165 $property->setAccessible( true ); 00166 $list = $property->getValue( $module ); 00167 foreach ( $list as $key => $value ) { 00168 // 'scripts' are numeral arrays. 00169 // 'styles' can be numeral or associative. 00170 // In case of associative the key is the file path 00171 // and the value is the 'media' attribute. 00172 if ( is_int( $key ) ) { 00173 $files[] = $value; 00174 } else { 00175 $files[] = $key; 00176 } 00177 } 00178 } 00179 00180 foreach ( $filePathProps['nested-lists'] as $propName ) { 00181 $property = $reflectedModule->getProperty( $propName ); 00182 $property->setAccessible( true ); 00183 $lists = $property->getValue( $module ); 00184 foreach ( $lists as $list ) { 00185 foreach ( $list as $key => $value ) { 00186 // We need the same filter as for 'lists', 00187 // due to 'skinStyles'. 00188 if ( is_int( $key ) ) { 00189 $files[] = $value; 00190 } else { 00191 $files[] = $key; 00192 } 00193 } 00194 } 00195 } 00196 00197 // Get method for resolving the paths to full paths 00198 $method = $reflectedModule->getMethod( 'getLocalPath' ); 00199 $method->setAccessible( true ); 00200 00201 // Populate cases 00202 foreach ( $files as $file ) { 00203 $cases[] = array( 00204 $method->invoke( $module, $file ), 00205 $moduleName, 00206 $file, 00207 ); 00208 } 00209 } 00210 00211 return $cases; 00212 } 00213 }