From c3d266e27dfb4b2eef8105cfde5210ae66189aee Mon Sep 17 00:00:00 2001
From: the_undefined <felix@debuggable.com>
Date: Mon, 19 May 2008 07:10:06 +0000
Subject: [PATCH] Applied patch by 'GreyCells', closes #4629

git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@6956 3807eeeb-6ff5-0310-8944-8be069107fe0
---
 cake/libs/validation.php                  | 33 ++++++++++++++++++++++-
 cake/tests/cases/libs/validation.test.php | 32 +++++++++++++++++++++-
 2 files changed, 63 insertions(+), 2 deletions(-)

diff --git a/cake/libs/validation.php b/cake/libs/validation.php
index fcf5e62df..be00c8a83 100644
--- a/cake/libs/validation.php
+++ b/cake/libs/validation.php
@@ -412,6 +412,37 @@ class Validation extends Object {
 		}
 		return false;
 	}
+
+/**
+ * Time validation, determines if the string passed is a valid time.
+ * Validates time as 24hr (HH:MM) or am/pm ([H]H:MM[a|p]m)
+ * Does not allow/validate seconds.
+ *
+ * @param string $check a valid time string
+ * @return boolean Success
+ * @access public
+ */
+
+	function time($check) {
+		$_this =& Validation::getInstance();
+		$_this->__reset();
+		$_this->check = $check;
+		$_this->regex = '%^((0?[1-9]|1[012])(:[0-5]\d){0,2}([AP]M|[ap]m))$|^([01]\d|2[0-3])(:[0-5]\d){0,2}$%';
+		return $_this->_check();
+	}
+
+/**
+ * Boolean validation, determines if value passed is a boolean integer or true/false.
+ *
+ * @param string $check a valid boolean
+ * @return boolean Success
+ * @access public
+ */
+	function boolean($check) {
+		$booleanList = array(0,1,'0','1',true,false);
+		return in_array($check, $booleanList, true);
+	}
+
 /**
  * Checks that a value is a valid decimal. If $places is null, the $check is allowed to be a scientific float
  * If no decimal point is found a false will be returned. Both the sign and exponent are optional.
@@ -868,4 +899,4 @@ class Validation extends Object {
 		$_this->type = null;
 	}
 }
-?>
\ No newline at end of file
+?>
diff --git a/cake/tests/cases/libs/validation.test.php b/cake/tests/cases/libs/validation.test.php
index 3c5f57e15..e9762380c 100644
--- a/cake/tests/cases/libs/validation.test.php
+++ b/cake/tests/cases/libs/validation.test.php
@@ -1123,6 +1123,36 @@ class ValidationTestCase extends UnitTestCase {
 		$this->assertFalse(Validation::date('12 06', array('my')));
 	}
 
+	function testTime() {
+		$this->assertTrue(Validation::time('00:00'));
+		$this->assertTrue(Validation::time('23:59'));
+		$this->assertFalse(Validation::time('24:00'));
+		$this->assertTrue(Validation::time('12:00'));
+		$this->assertTrue(Validation::time('12:01'));
+		$this->assertTrue(Validation::time('12:01am'));
+		$this->assertTrue(Validation::time('12:01pm'));
+		$this->assertTrue(Validation::time('1pm'));
+		$this->assertTrue(Validation::time('01:00'));
+		$this->assertFalse(Validation::time('1:00'));
+		$this->assertTrue(Validation::time('1:00pm'));
+		$this->assertFalse(Validation::time('13:00pm'));
+		$this->assertFalse(Validation::time('9:00'));
+	}
+
+	function testBoolean() {
+		$this->assertTrue(Validation::boolean('0'));
+		$this->assertTrue(Validation::boolean('1'));
+		$this->assertTrue(Validation::boolean(0));
+		$this->assertTrue(Validation::boolean(1));
+		$this->assertTrue(Validation::boolean(true));
+		$this->assertTrue(Validation::boolean(false));
+		$this->assertFalse(Validation::boolean('true'));
+		$this->assertFalse(Validation::boolean('false'));
+		$this->assertFalse(Validation::boolean('-1'));
+		$this->assertFalse(Validation::boolean('2'));
+		$this->assertFalse(Validation::boolean('Boo!'));
+	}
+
 	function testDateCustomRegx() {
 		$this->assertTrue(Validation::date('2006-12-27', null, '%^(19|20)[0-9]{2}[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$%'));
 		$this->assertFalse(Validation::date('12-27-2006', null, '%^(19|20)[0-9]{2}[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$%'));
@@ -1489,4 +1519,4 @@ class ValidationTestCase extends UnitTestCase {
 	// 	$this->assertTrue(Validation::file(TEST_CAKE_CORE_INCLUDE_PATH. 'VERSION.txt'));
 	// }
 }
-?>
\ No newline at end of file
+?>