/** * 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/> " . $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); }