/**
  * Validates a single argument.
  * Validates a single argument. Uses a specified ValidatorRule object for validation.
  * @param ref mixed $argument The argument to be validated.
  * @param ref object ValidatorRule $rule The rule to use for validation.
  * @param optional boolean $isFatal If TRUE, upon validation failure, a fatal error
  * will be thrown. Default: FALSE.
  * @access public
  * @return boolean If validation is successful, returns TRUE. If validation
  * fails and $isFatal is FALSE, returns FALSE. If $isFatal is TRUE, then
  * if validation fails, the script would halt and nothing would ever be
  * returned.
  * @static
  **/
 static function validate($argument, ValidatorRuleInterface $rule, $isFatal = true)
 {
     if (defined('DISABLE_VALIDATION') && DISABLE_VALIDATION) {
         return true;
     }
     // now try to validate the argument
     // if argument is invalid
     if (!$rule->check($argument)) {
         // then throw an error
         $description = "";
         $description .= "Argument validation failed in ";
         // get information abour the function that called the ArgumentValidator
         $debugBacktrace = debug_backtrace();
         $class = $debugBacktrace[1]["class"];
         $function = $debugBacktrace[1]["function"];
         if (isset($debugBacktrace[1]["args"])) {
             $arguments = $debugBacktrace[1]["args"];
         } else {
             $arguments = array();
         }
         $description .= "<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;" . $class . "::" . $function;
         // print the arguments using the ArgumentRenderer
         $description .= "(";
         $description .= ArgumentRenderer::renderManyArguments($arguments, false, false);
         $description .= ");";
         $description .= "<br/><br/>Argument '";
         $description .= ArgumentRenderer::renderOneArgument($argument, false, false);
         $description .= "' could not be validated using a/an ";
         $description .= get_class($rule);
         $description .= ".";
         // now create the error
         throw new InvalidArgumentException($description);
     }
     // validation is successful
     return true;
 }
 /**
  * Renders many arguments.
  * Renders many arguments by printing their types and values and comma delimiting them.
  * In 'detailed' mode, includes some additional information (i.e., for arrays, 
  * prints all elements of the array; for objects, prints the object structure).
  * @param array $arguments The arguments to render.
  * @param boolean $isDetailed If TRUE, will print additional details.
  * @param boolean $shouldPrint If TRUE, will print on screen; If FALSE, will not
  * print, but just return the result as a string.
  * @return string The output of the method. This will be output to the browser
  * if $shouldPrint is set to TRUE. Returns FALSE, if something goes wrong.
  * @access public
  **/
 function renderManyArguments($arguments, $isDetailed = false, $shouldPrint = false)
 {
     // see if $arguments is an array
     if (!is_array($arguments)) {
         return false;
     }
     // make sure $arguments is not empty
     if (count($arguments) == 0) {
         return false;
     }
     // render each element of $arguments
     $resultArray = array();
     foreach (array_keys($arguments) as $i => $key) {
         $resultArray[] = ArgumentRenderer::renderOneArgument($arguments[$key], $isDetailed, false);
     }
     $glue = $isDetailed ? ",\n" : ", ";
     $result = implode($glue, $resultArray);
     // print if necessary
     if ($shouldPrint) {
         echo $result;
     }
     return $result;
 }
 /**
  *    Renders all types of arguments, in detailed mode.
  */
 function test_All_Types_Of_Arguments_In_Detailed_Mode()
 {
     // test a boolean
     $arg = true;
     $resultFromRenderer = ArgumentRenderer::renderOneArgument($arg, true, true);
     $resultAssumed = "Boolean: true";
     $this->assertEqual($resultFromRenderer, $resultAssumed);
     // test an integer
     $arg = 15;
     $resultFromRenderer = ArgumentRenderer::renderOneArgument($arg, true, true);
     $resultAssumed = "Integer: 15";
     $this->assertEqual($resultFromRenderer, $resultAssumed);
     // test a floating point number
     $arg = 15.25;
     $resultFromRenderer = ArgumentRenderer::renderOneArgument($arg, true, true);
     $resultAssumed = "Float: 15.25";
     $this->assertEqual($resultFromRenderer, $resultAssumed);
     // test a string
     $arg = "Muhaha";
     $resultFromRenderer = ArgumentRenderer::renderOneArgument($arg, true, true);
     $resultAssumed = "String: \"Muhaha\" (length = 6)";
     $this->assertEqual($resultFromRenderer, $resultAssumed);
     // test an array
     $arg = array("one", "two");
     $resultFromRenderer = ArgumentRenderer::renderOneArgument($arg, true, true);
     $this->assertTrue($resultFromRenderer);
     // test an object
     $arg = new ArgumentRenderer();
     $arg->temp = 1;
     $resultFromRenderer = ArgumentRenderer::renderOneArgument($arg, true, true);
     $this->assertTrue($resultFromRenderer);
     // test a resource
     $arg = mysql_connect("devo.middlebury.edu", "test", "test");
     $resultFromRenderer = ArgumentRenderer::renderOneArgument($arg, true, true);
     $resultAssumed = "Resource: mysql link";
     $this->assertEqual($resultFromRenderer, $resultAssumed);
     // test NULL
     $arg = NULL;
     $resultFromRenderer = ArgumentRenderer::renderOneArgument($arg, true, true);
     $resultAssumed = "NULL";
     $this->assertEqual($resultFromRenderer, $resultAssumed);
 }