MediaWiki  REL1_23
ResourcesTest.php
Go to the documentation of this file.
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 }