function test_depth()
 {
     $pagelist = new PluginSonotsPagelist($this->pages);
     $pagelist->gen_metas('depth');
     $depths = $pagelist->get_metas('depth');
     $truth = array(0 => 1, 1 => 2, 2 => 3, 3 => 4, 4 => 4, 5 => 4);
     $this->assertTrue($depths, $truth);
     // do not use negative interval for depth
     $depth = PluginSonotsOption::parse_interval('2:3');
     list($offset, $length) = $depth;
     list($min, $max) = PluginSonotsOption::conv_interval(array($offset, $length), array(1, PHP_INT_MAX));
     $pagelist->grep_by('depth', 'ge', $min);
     $pagelist->grep_by('depth', 'le', $max);
     $pages = $pagelist->get_metas('page');
     $truth = array(1 => 'test/a', 2 => 'test/a/aa');
     $this->assertTrue($pages, $truth);
     // depth measures relname
     $pagelist = new PluginSonotsPagelist($this->pages);
     $prefix = 'test/a/';
     $pagelist->grep_by('page', 'prefix', $prefix);
     $pagelist->gen_metas('relname', array(sonots::get_dirname($prefix)));
     $pagelist->gen_metas('depth');
     $depths = $pagelist->get_metas('depth');
     $truth = array(2 => 1, 3 => 2, 4 => 2);
     $this->assertTrue($depths, $truth);
 }
 function test_parse_interval()
 {
     $this->assertEqual(PluginSonotsOption::parse_interval('1:5', 1), array(0, 5));
     $this->assertEqual(PluginSonotsOption::parse_interval('1:5', 0), array(1, 5));
     $this->assertEqual(PluginSonotsOption::parse_interval('0:4', 0), array(0, 5));
     $this->assertEqual(PluginSonotsOption::parse_interval('0:4', 1), array(0, 5));
     // may change behavior
     $this->assertEqual(PluginSonotsOption::parse_interval('2:3'), array(1, 2));
     $this->assertEqual(PluginSonotsOption::parse_interval('2:'), array(1, null));
     $this->assertEqual(PluginSonotsOption::parse_interval(':3'), array(0, 3));
     $this->assertEqual(PluginSonotsOption::parse_interval('4'), array(3, 1));
     $this->assertEqual(PluginSonotsOption::parse_interval('-5:', 0), array(-5, null));
     $this->assertEqual(PluginSonotsOption::parse_interval('-5:', 1), array(-5, null));
     $this->assertEqual(PluginSonotsOption::parse_interval(':-5'), array(0, -4));
     $this->assertEqual(PluginSonotsOption::parse_interval('1+2'), array(0, 3));
 }
Пример #3
0
 /**
  * Evaluate an option
  *
  * Lists of Supported Types)
  * - bool      : boolean true or false
  * - string    : string
  * - array     : array
  * - enum      : take only one element of possible values
  * - enumarray : take only elements in possible values
  * - number    : number
  * - interval  : interval string. See parse_interval for details
  * - options   : options
  *
  * @access private
  * @static
  * @param mixed $val option value. 
  * @param string $type option type
  * @param mixed $conf config. See evaluate_options. 
  * @return array array(evaluated value, invalid value)
  * @uses parse_interval
  * @uses evaluate_options
  * @version $Id: v 1.7 2008-07-30 11:14:46 sonots $
  * @since   v 1.0
  */
 function evaluate_option($val, $type, $conf = null)
 {
     if (is_null($val)) {
         return array(null, null);
     }
     $retval = $unknown = null;
     switch ($type) {
         case 'bool':
             if ($val === true && is_bool($conf)) {
                 $retval = $conf;
                 break;
             }
             if ($val === false || $val === '0' || $val === 'off' || $val === 'false' || $val === 'FALSE') {
                 $retval = false;
             } elseif ($val === true || $val === '' || $val === '1' || $val === 'on' || $val === 'true' || $val === 'TRUE') {
                 $retval = true;
             } else {
                 $unknown = $val;
             }
             break;
         case 'string':
             if ($val === true) {
                 // no "=value" option is set to true at parse_option_line
                 $retval = is_string($conf) ? $conf : null;
                 break;
             }
             if (is_string($val)) {
                 $retval = $val;
             } else {
                 $unknown = $val;
             }
             break;
         case 'array':
             if ($val === true) {
                 // no "=value" option is set to true at parse_option_line
                 $retval = is_array($conf) ? $conf : null;
                 break;
             }
             $retval = PluginSonotsOption::boolean_to_numeric((array) $val);
             break;
         case 'enum':
             if ($val === true) {
                 $retval = is_array($conf) ? reset($conf) : null;
                 break;
             }
             if (in_array($val, $conf)) {
                 $retval = $val;
             } else {
                 $unknown = $val;
             }
             break;
         case 'enumarray':
             // special array type
             if ($val === true) {
                 $retval = is_array($conf) ? $conf : null;
                 break;
             }
             $retval = array();
             $unknown = array();
             $val = PluginSonotsOption::boolean_to_numeric((array) $val);
             foreach ($val as $elem) {
                 if (in_array($elem, $conf)) {
                     $retval[] = $elem;
                 } else {
                     $unknown[] = $elem;
                 }
             }
             if (empty($retval)) {
                 $retval = null;
             }
             if (empty($unknown)) {
                 $unknown = null;
             }
             break;
         case 'options':
             if ($val === true) {
                 $val = array();
             }
             list($retval, $unknown) = PluginSonotsOption::evaluate_options($val, $conf);
             if (empty($retval)) {
                 $retval = null;
             }
             if (empty($unknown)) {
                 $unknown = null;
             }
             break;
         case 'number':
             if ($val === true) {
                 $retval = is_int($conf) || is_float($conf) ? $conf : null;
                 break;
             }
             if (is_numeric($val)) {
                 $retval = $val;
             } else {
                 $unknown = $val;
             }
             break;
         case 'interval':
             // $conf is default2 or array(default2, start)
             if ($val === true) {
                 $val = is_array($conf) ? $conf[0] : $conf;
             }
             $start = is_array($conf) ? $conf[1] : 1;
             $retval = PluginSonotsOption::parse_interval($val, $start);
             if (is_null($retval)) {
                 $unknown = $val;
             }
             break;
         default:
             $unknown = $val;
             break;
     }
     return array($retval, $unknown);
 }