<?php

define ('TEST_LOAD', 0);
define ('TEST_START', 1);
define ('TEST_IN', 2);

/**
 * on the first call, you pass in one argument, the test array.
 * On the second call, you pass in the function you want to call and the arguments.
 */
function test_clearinghouse(&$a0 = NULL, &$a1 = NULL, &$a2 = NULL, &$a3 = NULL, &$a4 = NULL, &$a5 = NULL, &$a6 = NULL, &$a7 = NULL, &$a8 = NULL, &$a9 = NULL) {
  static $state, $test;
  switch ($state) {
    case TEST_LOAD:
      $test = $a0;
      $state = TEST_START;
      break;
    case TEST_START:
      $state = TEST_IN;
      $function = 'original_'. $a0;
      $num_args = func_num_args();
      switch ($num_args - 1) {
        case 0: $return = $function();break
        case 1: $return = $function($a1); break;
        case 2: $return = $function($a1, $a2); break;
        case 3: $return = $function($a1, $a2, $a3); break;
        case 4: $return = $function($a1, $a2, $a3, $a4); break;
        case 5: $return = $function($a1, $a2, $a3, $a4, $a5); break;
        case 6: $return = $function($a1, $a2, $a3, $a4, $a5, $a6); break;
        case 7: $return = $function($a1, $a2, $a3, $a4, $a5, $a6, $a7); break;
        case 8: $return = $function($a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8); break;
        case 9: $return = $function($a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8, $a9); break;
      }
      $final_return = $test['final_return'];
      unset($test['final_return']);
      if (!$test && $return === $final_return) {
        $this->pass();
      }
      else {
        $this->fail();
      }
      $state = TEST_LOAD;
      break;
    case TEST_IN:
      $step = array_shift($test);
      $incoming = $step['incoming'];
      $num_args = func_num_args();
      for ($i = 0; $i < $num_args; $i++) {
        $variable_name = "$a$i";
        if ($incoming[$i] !== $$variable_name) {
          $this->fail();
        }
      }
      if (isset($step['references'])) {
        foreach ($step['references'] as $key => $value) {
          $variable_name = "$a$key";
          $$variable_name = $value;
        }
      }
      if (isset($step['return'])) {
        return $step['return'];
      }
  }
}

test_clearinghouse(
  array(
    array(
      'incoming' => array('cache_get', 'variables', 'cache'),
      'return' => FALSE,
    ),
    array(
      'incoming' => array('db_query', 'SELECT * FROM {variable}'),
      'return' => '__test_placeholder__',
    ),
    array(
      'incoming' => array('db_fetch_object', '__test_placeholder__'),
      'return' => (object) array('name '=> 'foo', 'value' => serialize('bar')),
    ),
    array(
      'incoming' => array('db_fetch_object', '__test_placeholder__'),
      'return' => FALSE,
    ),
    array(
      'incoming' => array('cache_set', 'variables', ),
    )
  );
);
test_clearinghouse('variable_init');
