WordPress.org

Make WordPress Core

Ticket #11867: 11867.patch

File 11867.patch, 14.6 KB (added by hakre, 5 years ago)
  • wp-testlib/getopt.php

     
     1<?php 
     2/** 
     3 * getopt relacement / extenstion 
     4 *  
     5 *  prior to PHP 5.3 getopt is not supported on the windows plattform 
     6 *  and it does not support long options on other plattforms as well. 
     7 *   
     8 *  this file offers a _getopt() function as a replacement. via the   
     9 *  php.net manual page for getop(). 
     10 *   
     11 *  original author is 可愛柚爸 / uberlinuxguy at tulg dot org 
     12 *   
     13 *  the function has been taken from that website, and refactored 
     14 *  into a helper class to increase the protability 
     15 * 
     16 * @version 1.0 hakre-1 
     17 * 
     18 *  CHANGELOG: 
     19 *   
     20 *   - refactored the functions into a class (better portability) 
     21 *   - reformatted the code (copy & paste issues) 
     22 *   - removed eval calls (commented)    
     23 *   - smarter quoting 
     24 *   - indentation on tab and cleanup of whitespaces 
     25 *   - deprecated string access ({}) fixed with []. 
     26 *   
     27 *  TODO: 
     28 *   (empty)  
     29 *   
     30 *   
     31 *  @link http://www.ntu.beautifulworldco.com/weblog/?p=526 
     32 *  @link http://www.php.net/getopt 
     33 */ 
     34 
     35/** 
     36 * getoptParser 
     37 *  
     38 * getopt() compatible argv parsing. 
     39 *  
     40 * @see getoptParser::getopt() 
     41 * @see getoptParser::split_para() 
     42 */ 
     43class getoptParser { 
     44        /** 
     45         * getopt()        
     46         *  
     47         * Usage: _getopt ( [$flag,] $short_option [, $long_option] ); 
     48         *  
     49         * Note that another function split_para() is required, which can be  
     50         * found in the same page. 
     51         *  
     52         * _getopt() fully simulates getopt() which is described at  
     53         * (@see http://us.php.net/manual/en/function.getopt.php} , including long  
     54         * options for PHP version under 5.3.0. (Prior to 5.3.0, long options was  
     55         * only available on few systems) 
     56         *  
     57         * Besides legacy usage of getopt(), I also added a new option to manipulate  
     58         * your own argument lists instead of those from command lines. This new  
     59         * option can be a string or an array such as 
     60         *  
     61         *  $flag = "-f value_f -ab --required 9 --optional=PK --option -v test -k"; 
     62         *   
     63         *  or 
     64         *   
     65         *  $flag = array ( "-f", "value_f", "-ab", "--required", "9", "--optional=PK", "--option" ); 
     66         *   
     67         *  So there are four ways to work with _getopt(), 
     68         *   
     69         *  1. _getopt ( $short_option ); 
     70         *      it's a legacy usage, same as getopt ( $short_option ). 
     71         *       
     72         *  2. _getopt ( $short_option, $long_option ); 
     73         *      it's a legacy usage, same as getopt ( $short_option, $long_option ). 
     74         *       
     75         *  3. _getopt ( $flag, $short_option ); 
     76         *      use your own argument lists instead of command line arguments. 
     77         *       
     78         *  4. _getopt ( $flag, $short_option, $long_option ); 
     79         *      use your own argument lists instead of command line arguments.  
     80         *  
     81         * @version 1.3 
     82         * @date 2009/05/30 (taken from the website 2010-01-11) 
     83         * @author 可愛柚爸 / uberlinuxguy at tulg dot org 
     84         * @see http://www.ntu.beautifulworldco.com/weblog/?p=526 
     85         *  
     86         * @params mixed 
     87         * @return array 
     88         */ 
     89        static function getopt() { 
     90         
     91                if ( func_num_args() == 1 ) { 
     92                        $flag =  $flag_array = $GLOBALS['argv']; 
     93                        $short_option = func_get_arg ( 0 ); 
     94                        $long_option = array (); 
     95                } elseif ( func_num_args() == 2 ) { 
     96                        if ( is_array ( func_get_arg ( 1 ) ) ) { 
     97                        $flag = $GLOBALS['argv']; 
     98                        $short_option = func_get_arg ( 0 ); 
     99                        $long_option = func_get_arg ( 1 ); 
     100                        } else { 
     101                        $flag = func_get_arg ( 0 ); 
     102                        $short_option = func_get_arg ( 1 ); 
     103                        $long_option = array (); 
     104                        } 
     105                } elseif ( func_num_args() == 3 ) { 
     106                        $flag = func_get_arg ( 0 ); 
     107                        $short_option = func_get_arg ( 1 ); 
     108                        $long_option = func_get_arg ( 2 ); 
     109                } else { 
     110                        exit ( "wrong options\n" ); 
     111                } 
     112         
     113                $short_option         = trim($short_option); 
     114                $short_no_value       = array(); 
     115                $short_required_value = array(); 
     116                $short_optional_value = array(); 
     117                $long_no_value        = array(); 
     118                $long_required_value  = array(); 
     119                $long_optional_value  = array(); 
     120                $options              = array(); 
     121         
     122                for ( $i = 0; $i < strlen ( $short_option ); ) { 
     123                        if ( $short_option[$i] != ':' ) { 
     124                                if ( $i == strlen ( $short_option ) - 1 ) { 
     125                                        $short_no_value[] = $short_option[$i]; 
     126                                        break; 
     127                                } elseif ( $short_option[$i+1] != ':' ) { 
     128                                        $short_no_value[] = $short_option[$i]; 
     129                                        $i++; 
     130                                        continue; 
     131                                } elseif ( $short_option[$i+1] == ':' && $short_option[$i+2] != ':' ) { 
     132                                        $short_required_value[] = $short_option[$i]; 
     133                                        $i += 2; 
     134                                        continue; 
     135                                } elseif ( $short_option[$i+1] == ':' && $short_option[$i+2] == ':' ) { 
     136                                        $short_optional_value[] = $short_option[$i]; 
     137                                        $i += 3; 
     138                                        continue; 
     139                                } 
     140                        } else { 
     141                                continue; 
     142                        } 
     143                } 
     144         
     145                foreach ( $long_option as $a ) { 
     146                        if ( substr( $a, -2 ) == '::' ) { 
     147                                $long_optional_value[] = substr($a, 0, -2); 
     148                        } elseif ( substr($a, -1) == ':' ) { 
     149                                $long_required_value[] = substr($a, 0, -1); 
     150                        } else { 
     151                                $long_no_value[] = $a; 
     152                        } 
     153                } 
     154         
     155                if ( is_array ( $flag ) ) { 
     156                        $flag_array = $flag; 
     157                } else { 
     158                        $flag = "- $flag"; 
     159                        $flag_array = self::_split_para($flag); 
     160                } 
     161         
     162                for ( $i = 0; $i < count($flag_array); ) { 
     163         
     164                        if ( !$flag_array[$i] || ( '-' == $flag_array[$i] ) ) { 
     165                                $i++; 
     166                                continue; 
     167                        } elseif ( '-' != $flag_array[$i][0] ) { 
     168                                $i++; 
     169                                continue; 
     170                        } 
     171         
     172                        if ( substr($flag_array[$i], 0, 2) == '--' ) { 
     173                                if (strpos($flag_array[$i], '=') != false) { 
     174                                        list($key, $value) = explode('=', substr($flag_array[$i], 2), 2); 
     175                                        if ( in_array($key, $long_required_value ) || in_array($key, $long_optional_value ) ) 
     176                                                $options[$key][] = $value; 
     177                                        $i++; 
     178                                        continue; 
     179                                } elseif (strpos($flag_array[$i], '=') == false) { 
     180                                        $key = substr($flag_array[$i], 2); 
     181                                        if ( in_array(substr( $flag_array[$i], 2 ), $long_required_value ) ) { 
     182                                                $options[$key][] = $flag_array[$i+1]; 
     183                                                $i++; 
     184                                        } elseif ( in_array(substr( $flag_array[$i], 2 ), $long_optional_value ) ) { 
     185                                                if ( $flag_array[$i+1] != '' && $flag_array[$i+1][0] != '-' ) { 
     186                                                        $options[$key][] = $flag_array[$i+1]; 
     187                                                        $i++; 
     188                                                } else { 
     189                                                        $options[$key][] = FALSE;                                                
     190                                                } 
     191                                        } elseif ( in_array(substr( $flag_array[$i], 2 ), $long_no_value ) ) { 
     192                                                $options[$key][] = FALSE; 
     193                                        } 
     194                                        $i++; 
     195                                        continue;                                
     196                                } 
     197                        } elseif ( $flag_array[$i][0] == '-' && $flag_array[$i][1] != '-' ) { 
     198                                for ( $j=1; $j < strlen($flag_array[$i]); $j++ ) { 
     199                                        if ( in_array($flag_array[$i][$j], $short_required_value ) || in_array($flag_array[$i][$j], $short_optional_value )) { 
     200                                                if ( $j == strlen($flag_array[$i]) - 1  ) { 
     201                                                        if ( in_array($flag_array[$i][$j], $short_required_value ) ) { 
     202                                                                if (isset($flag_array[$i+1])) 
     203                                                                        $options[$flag_array[$i][$j]][] = $flag_array[$i+1]; 
     204                                                                $i++; 
     205                                                        } elseif ( in_array($flag_array[$i][$j], $short_optional_value ) && $flag_array[$i+1] != '' && $flag_array[$i+1][0] != '-' ) { 
     206                                                                $options[$flag_array[$i][$j]][] = $flag_array[$i+1]; 
     207                                                                $i++; 
     208                                                        } else { 
     209                                                                $options[$flag_array[$i][$j]][] = FALSE;                                                                 
     210                                                        }                                                        
     211                                                } else { 
     212                                                        $options[$flag_array[$i][$j]][] = substr ( $flag_array[$i], $j + 1 ); 
     213                                                } 
     214                                                $plus_i = 0; 
     215                                                $i++;                                                    
     216                                                break; 
     217                                        } elseif ( in_array($flag_array[$i][$j], $short_no_value ) ) { 
     218                                                $options[$flag_array[$i][$j]][] = FALSE; 
     219                                                $plus_i = 1; 
     220                                                continue; 
     221                                        } else { 
     222                                                $plus_i = 1; 
     223                                                break; 
     224                                        } 
     225                                } 
     226                                $i += $plus_i; 
     227                                continue; 
     228                        } // if 
     229                        $i++; 
     230                } // for 
     231         
     232                // reduce options array depth if possible 
     233                foreach ( $options as $key => $value ) { 
     234                        if ( count($value) == 1 ) 
     235                                $options[$key] = $value[0]; 
     236                } 
     237         
     238                return $options; 
     239         
     240        } 
     241 
     242        /** 
     243         * split parameters 
     244         *  
     245         * static helper function 
     246         *  
     247         * @version 1.0 
     248         * @date    2008/08/19 
     249         * @see     http://www.ntu.beautifulworldco.com/weblog/?p=526 
     250         *  
     251         * This function is to parse parameters and split them into smaller pieces. 
     252         * preg_split() does similar thing but in our function, besides "space", we 
     253         * also take the three symbols " (double quote), '(single quote), 
     254         * and \ (backslash) into consideration because things in a pair of " or ' 
     255         * should be grouped together. 
     256         *  
     257         * As an example, this parameter list 
     258         *  
     259         * -f "test 2" -ab --required "t\"est 1" --optional="te'st 3" --option -v 'test 4' 
     260         *  
     261         * will be splited into 
     262         *  
     263         * -f; test 2; -ab; --required; t"est 1; --optional=te'st 3; --option; -v; test 4 
     264         *  
     265         * see the code below: 
     266         *  
     267         * <code>  
     268         *      $pattern = "-f \"test 2\" -ab --required \"t\\\"est 1\" --optional=\"te'st 3\" --option -v 'test 4'";  
     269         *      $result = getoptParser::split_para($pattern); 
     270         *      echo "ORIGINAL PATTERN: $pattern\n\n"; 
     271         *      var_dump($result); 
     272         * </code> 
     273         *  
     274         * @param string $pattern 
     275         * @return array 
     276         */ 
     277        public static function split_para($pattern) { 
     278                $begin      = 0; 
     279                $backslash  = 0; 
     280                $quote      = ''; 
     281                $quote_mark = array(); 
     282                $result     = array(); 
     283                $pattern        = trim($pattern); 
     284                $cand1      = ''; 
     285 
     286                for ( $end = 0; $end < strlen($pattern); ) { 
     287                        if ( !in_array($pattern[$end], array(' ', '"', "'", "\\")) ) { 
     288                                $backslash = 0; 
     289                                $end++; 
     290                                continue; 
     291                        } 
     292                        if ( $pattern[$end] == "\\" ) { 
     293                                $backslash++; 
     294                                $end++; 
     295                                continue; 
     296                        } elseif ( $pattern[$end] == '"' ) { 
     297                                if ( $backslash % 2 == 1 || $quote == "'" ) { 
     298                                        $backslash = 0; 
     299                                        $end++; 
     300                                        continue; 
     301                                } 
     302                                if ( $quote == '' ) { 
     303                                        $quote_mark[] = $end - $begin; 
     304                                        $quote = '"'; 
     305                                } elseif ( $quote == '"' ) { 
     306                                        $quote_mark[] = $end - $begin; 
     307                                        $quote = ''; 
     308                                } 
     309 
     310                                $backslash = 0; 
     311                                $end++; 
     312                                continue; 
     313                        } elseif ( $pattern[$end] == "'" ) { 
     314                                if ( $backslash % 2 == 1 || $quote == '"' ) { 
     315                                        $backslash = 0; 
     316                                        $end++; 
     317                                        continue; 
     318                                } 
     319                                if ( $quote == '' ) { 
     320                                        $quote_mark[] = $end - $begin; 
     321                                        $quote = "'"; 
     322                                } elseif ( $quote == "'" ) { 
     323                                        $quote_mark[] = $end - $begin; 
     324                                        $quote = ''; 
     325                                } 
     326 
     327                                $backslash = 0; 
     328                                $end++; 
     329                                continue; 
     330                        } elseif ( $pattern[$end] == ' ' ) { 
     331                                if ( $quote != '' ) { 
     332                                        $backslash = 0; 
     333                                        $end++; 
     334                                        continue; 
     335                                } else { 
     336                                        $backslash = 0; 
     337                                        $cand = substr($pattern, $begin, $end-$begin); 
     338                                        for ( $j = 0; $j < strlen($cand); $j++ ) { 
     339                                                if ( in_array($j, $quote_mark) ) 
     340                                                        continue; 
     341 
     342                                        $cand1 .= $cand[$j]; 
     343                                } 
     344                                if ( $cand1 ) { 
     345                                        // commented and replaced: 
     346                                        // eval( "\$cand1 = \"$cand1\";" ); 
     347                                        $result[] = (string) $cand1; 
     348                                } 
     349                                $quote_mark = array(); 
     350                                $cand1 = ''; 
     351                                $begin =++$end; 
     352                                continue; 
     353                                } 
     354                        } 
     355                } 
     356 
     357                $cand = substr($pattern, $begin, $end-$begin); 
     358                for ( $j = 0; $j < strlen($cand); $j++ ) { 
     359                        if ( in_array($j, $quote_mark ) ) 
     360                                continue; 
     361                        $cand1 .= $cand[$j]; 
     362                } 
     363 
     364                // commented and replaced: 
     365                // eval( "\$cand1 = \"$cand1\";" ); 
     366                $cand1 = (string) $cand1; 
     367 
     368                if ( $cand1 ) 
     369                        $result[] = $cand1; 
     370 
     371                return $result; 
     372        }        
     373} 
     374 No newline at end of file 
  • README.txt

     
    11The short version: 
    22 
    3 1. Create a clean MySQL database and user.  DO NOT USE AN EXISTING DATABASE or you will lose data, guaranteed. 
     31. Ensure you got: PHP, PEAR, XDEBUG and PHPUNIT. 
    44 
    5 2. Copy wp-config-sample.php to wp-config.php, edit it and include your database name/user/password. 
     52. Create a clean MySQL database and user.  DO NOT USE AN EXISTING DATABASE  
     6   or you will lose data, guaranteed. 
    67 
    7 3. $ svn up 
     83. Copy wp-config-sample.php to wp-config.php, edit it and include your  
     9   database name/user/password. 
    810 
    9 4. $ php wp-test.php 
     114. $ svn up 
    1012 
     135. $ php wp-test.php 
     14 
     15Command Line Parameters: 
     16 
     17 -l        list all testcases. 
     18 -n        do not drop database tables after tests were run. 
     19 -r [dir]  uses [dir] as wordpress directory 
     20 -t [case] run individual testcase. 
     21 -v mu     uses wordpress-mu instead of worpdress directory and sets 
     22           TEST_MU constant. 
     23  
    1124Notes: 
    1225 
    13 Test cases live in the 'wp-testcase' subdirectory.  All files in that directory will be included by default.  Extend the WPTestCase class to ensure your test is run. 
     26Test cases live in the 'wp-testcase' subdirectory.  All files in that  
     27directory will be included by default.  Extend the WPTestCase class to  
     28ensure your test is run. 
    1429 
    15 wp-test.php will initialize and install a (more or less) complete running copy of Wordpress each time it is run.  This makes it possible to run functional interface and module tests against a fully working database and codebase, as opposed to pure unit tests with mock objects and stubs.  Pure unit tests may be used also, of course. 
     30wp-test.php will initialize and install a (more or less) complete running  
     31copy of Wordpress each time it is run.  This makes it possible to run  
     32functional interface and module tests against a fully working database and  
     33codebase, as opposed to pure unit tests with mock objects and stubs.  Pure  
     34unit tests may be used also, of course. 
    1635 
    17 The test database will be wiped clean with DROP TABLE statements once tests are finished, to ensure a clean start next time the tests are run. 
     36The test database will be wiped clean with DROP TABLE statements once tests  
     37are finished, to ensure a clean start next time the tests are run. 
    1838 
    1939wp-test.php is intended to run at the command line, not via a web server. 
    2040 
    21 The wordpress and wordpress-mu trunks are included as svn externals.  By default wp-test.php will run tests against the wordpress branch.  To run the same tests against the wordpress-mu branch instead: 
     41The wordpress and wordpress-mu trunks are included as svn externals.  By  
     42default wp-test.php will run tests against the wordpress branch.  To run  
     43the same tests against the wordpress-mu branch instead: 
    2244 
    2345        $ php wp-test.php -v mu 
  • wp-test.php

     
    11<?php 
     2/** 
     3 * wp-test.php 
     4 *  
     5 * WordPress Testrunner 
     6 *  
     7 * Example: 
     8 *  
     9 * # php wp-test.php -l 
     10 *  
     11 */ 
    212 
    3 $opts = getopt('v:t:r:sfln'); 
     13// parse options 
     14$options = 'v:t:r:sfln'; 
     15if (is_callable('getopt')) { 
     16        $opts = getopt($options); 
     17} else {         
     18        include( dirname(__FILE__) . '/wp-testlib/getopt.php' ); 
     19        $opts = getoptParser::getopt($options); 
     20} 
    421 
    522define('DIR_TESTROOT', realpath(dirname(__FILE__))); 
    623if (!defined('DIR_TESTCASE')) { 
     
    8198} 
    8299 
    83100// needed for jacob's tests 
    84 ini_set('include_path', ini_get('include_path') . ':'.ABSPATH.'/wp-includes'); 
     101ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . ABSPATH . '/wp-includes'); 
    85102define('PHPUnit_MAIN_METHOD', false); 
    86103$original_wpdb = $GLOBALS['wpdb']; 
    87104