Make WordPress Core

Ticket #11867: 11867.patch

File 11867.patch, 14.6 KB (added by hakre, 15 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