<?php
  
require('lang.base.php');
  
uses('util.profiling.Timer');
  
  class 
KeyNextStrategy extends Object {

    function 
execute($a) {
      if (!
is_array($a)) return FALSE;
      
$i0;
      do {
        if (
key($a) !== $i++) return FALSE;
      } while (
FALSE !== next($a));
      return 
TRUE;
    }
  }

  class 
ForLoopStrategy extends Object {

    function 
execute($a) {
      if (!
is_array($a)) return FALSE;
      for (
$karray_keys($a), $ssizeof($k), $i0$i $s$i++) {
        if (
$k[$i] !== $i) return FALSE;
      }
      return 
TRUE;
    }
  }

  class 
ListEachStrategy extends Object {

    function 
execute($a) {
      if (!
is_array($a)) return FALSE;
      
$i0;
      while (list(
$key, )= each($a)) {
        if (
$key !== $i++) return FALSE;
      }
      return 
TRUE;
    }
  }
  
  class 
KeyRangeStrategy extends Object {

    function 
execute($a) {
      return 
is_array($a) && (array_keys($a) === range(0sizeof($a)- 1));
    }
  }
  
  class 
ForeachStrategy extends Object {

    function 
execute($a) {
      if (!
is_array($a)) return FALSE;
      
$i0;
      foreach (
array_keys($a) as $k) {
        if (
$k !== $i++) return FALSE;
      }
      return 
TRUE;
    }
  }

  
// {{{ main
  
try(); {
    
$class= &XPClass::forName($argv[1].'Strategy');
  } if (catch(
'ClassNotFoundException'$e)) {
    
$e->printStackTrace();
    exit();
  }
  
$strategy= &$class->newInstance();

  
$tests= array(
    
'T:numeric'         => array(01246),
    
'T:range[0..1000]'  => range(11000),
    
'T:strings'         => array('Timm''Jan'),
    
'F:wrongkey'        => array(12=> 1046),
    
'F:hash'            => array('name' => __FILE__),
  );
  
  
$t= &new Timer();
  foreach (
$tests as $name => $test) {
    
$expect$name{0} == 'T';
    
printf(
      
"* %s: expect = %s, result = %s\n",
      
substr($name2),
      
var_export($expect1),
      
var_export($strategy->execute($test), 1)
    );

    
with ($t->start()); {
      for (
$i0$i 10000$i++) {
        if (
$expect !== $strategy->execute($test)) {
          
xp::error(xp::stringOf(new Error('Run #'.$i.' expectancy error')));
        }
      }
    } 
    
$t->stop();
  
    
printf(
      
"  %s strategy, %d runs: %.3f seconds\n\n"
      
$strategy->getClassName(), 
      
$i
      
$t->elapsedTime()
    );
  }
  
// }}}
?>