From 9c16da05bc8588e271d9883b6d54b823a7d7f689 Mon Sep 17 00:00:00 2001 From: doctrine Date: Sun, 11 Jun 2006 12:02:05 +0000 Subject: [PATCH] Validator type bug fix --- Doctrine/Validator.php | 46 ++++++++++++++++++++++---- tests/ValidatorTestCase.php | 65 +++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 6 deletions(-) diff --git a/Doctrine/Validator.php b/Doctrine/Validator.php index 579563fdb..9df5d88dc 100644 --- a/Doctrine/Validator.php +++ b/Doctrine/Validator.php @@ -154,11 +154,16 @@ class Doctrine_Validator { break; } } - + /** if(self::gettype($value) !== $column[0] && self::gettype($value) != 'NULL') { $err[$key] = Doctrine_Validator::ERR_TYPE; continue; } + */ + if( ! self::isValidType($value, $column[0])) { + $err[$key] = Doctrine_Validator::ERR_TYPE; + continue; + } } if( ! empty($err)) { @@ -184,6 +189,32 @@ class Doctrine_Validator { public function getErrorStack() { return $this->stack; } + /** + * returns whether or not the given variable is + * valid type + * + * @param mixed $var + * @param string $type + * @return boolean + */ + public static function isValidType($var, $type) { + $looseType = self::gettype($var); + switch($looseType): + case 'float': + case 'double': + case 'integer': + if($type == 'string' || $type == 'float') + return true; + case 'string': + case 'array': + case 'object': + return ($type === $looseType); + break; + case 'NULL': + return true; + break; + endswitch; + } /** * returns the type of loosely typed variable * @@ -193,13 +224,16 @@ class Doctrine_Validator { public static function gettype($var) { $type = gettype($var); switch($type): - case "string": - if(preg_match("/^[0-9]+$/",$var)) return "integer"; - elseif(is_numeric($var)) return "float"; - else return $type; + case 'string': + if(preg_match("/^[0-9]+$/",$var)) + return 'integer'; + elseif(is_numeric($var)) + return 'float'; + else + return $type; break; default: - return $type; + return $type; endswitch; } } diff --git a/tests/ValidatorTestCase.php b/tests/ValidatorTestCase.php index ddcb97952..47c071967 100644 --- a/tests/ValidatorTestCase.php +++ b/tests/ValidatorTestCase.php @@ -4,6 +4,71 @@ class Doctrine_ValidatorTestCase extends Doctrine_UnitTestCase { $this->tables[] = "Validator_Test"; parent::prepareTables(); } + public function testIsValidType() { + $var = "123"; + $this->assertTrue(Doctrine_Validator::isValidType($var,"string")); + $this->assertTrue(Doctrine_Validator::isValidType($var,"integer")); + $this->assertTrue(Doctrine_Validator::isValidType($var,"float")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"array")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"object")); + + $var = 123; + $this->assertTrue(Doctrine_Validator::isValidType($var,"string")); + $this->assertTrue(Doctrine_Validator::isValidType($var,"integer")); + $this->assertTrue(Doctrine_Validator::isValidType($var,"float")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"array")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"object")); + + $var = 123.12; + $this->assertTrue(Doctrine_Validator::isValidType($var,"string")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"integer")); + $this->assertTrue(Doctrine_Validator::isValidType($var,"float")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"array")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"object")); + + $var = '123.12'; + $this->assertTrue(Doctrine_Validator::isValidType($var,"string")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"integer")); + $this->assertTrue(Doctrine_Validator::isValidType($var,"float")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"array")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"object")); + + $var = ''; + $this->assertTrue(Doctrine_Validator::isValidType($var,"string")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"integer")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"float")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"array")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"object")); + + $var = null; + $this->assertTrue(Doctrine_Validator::isValidType($var,"string")); + $this->assertTrue(Doctrine_Validator::isValidType($var,"integer")); + $this->assertTrue(Doctrine_Validator::isValidType($var,"float")); + $this->assertTrue(Doctrine_Validator::isValidType($var,"array")); + $this->assertTrue(Doctrine_Validator::isValidType($var,"object")); + + $var = 'str'; + $this->assertTrue(Doctrine_Validator::isValidType($var,"string")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"integer")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"float")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"array")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"object")); + + $var = array(); + $this->assertFalse(Doctrine_Validator::isValidType($var,"string")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"integer")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"float")); + $this->assertTrue(Doctrine_Validator::isValidType($var,"array")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"object")); + + $var = new Exception(); + $this->assertFalse(Doctrine_Validator::isValidType($var,"string")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"integer")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"float")); + $this->assertFalse(Doctrine_Validator::isValidType($var,"array")); + $this->assertTrue(Doctrine_Validator::isValidType($var,"object")); + } + public function testValidate2() { $test = new Validator_Test(); $test->mymixed = "message";