From f7f879904d98be32416a06f583f4a0a3b568f963 Mon Sep 17 00:00:00 2001 From: Alexey Borzov Date: Fri, 27 Jul 2007 08:28:28 +0000 Subject: [PATCH] Added 'empty' rule (mostly useful for chaining) Fixed typos in Node's phpdoc comments git-svn-id: http://svn.php.net/repository/pear/packages/HTML_QuickForm2/trunk@240385 c90b9560-bf6c-de11-be94-00142212c4b1 --- QuickForm2/Factory.php | 2 + QuickForm2/Node.php | 6 +- QuickForm2/Rule/Empty.php | 83 ++++++++++++++++++ tests/QuickForm2/Rule/AllTests.php | 2 + tests/QuickForm2/Rule/EmptyTest.php | 129 ++++++++++++++++++++++++++++ 5 files changed, 219 insertions(+), 3 deletions(-) create mode 100644 QuickForm2/Rule/Empty.php create mode 100644 tests/QuickForm2/Rule/EmptyTest.php diff --git a/QuickForm2/Factory.php b/QuickForm2/Factory.php index eadabc59..db053ba7 100644 --- a/QuickForm2/Factory.php +++ b/QuickForm2/Factory.php @@ -104,6 +104,8 @@ class HTML_QuickForm2_Factory protected static $registeredRules = array( 'nonempty' => array('HTML_QuickForm2_Rule_Nonempty', 'HTML/QuickForm2/Rule/Nonempty.php'), + 'empty' => array('HTML_QuickForm2_Rule_Empty', + 'HTML/QuickForm2/Rule/Empty.php'), 'required' => array('HTML_QuickForm2_Rule_Required', 'HTML/QuickForm2/Rule/Required.php'), 'compare' => array('HTML_QuickForm2_Rule_Compare', diff --git a/QuickForm2/Node.php b/QuickForm2/Node.php index cd71daee..0a7ad88c 100644 --- a/QuickForm2/Node.php +++ b/QuickForm2/Node.php @@ -223,7 +223,7 @@ abstract public function getName(); * Sets the element's name * * @param string - * @return HTML_QuickForm_Node + * @return HTML_QuickForm2_Node */ abstract public function setName($name); @@ -244,7 +244,7 @@ abstract public function getId(); * an empty value. If id is not explicitly given, it will be autogenerated. * * @param string Element's id, will be autogenerated if not given - * @return HTML_QuickForm_Node + * @return HTML_QuickForm2_Node */ abstract public function setId($id = null); @@ -261,7 +261,7 @@ abstract public function getValue(); * Sets the element's value * * @param mixed - * @return HTML_QuickForm_Node + * @return HTML_QuickForm2_Node */ abstract public function setValue($value); diff --git a/QuickForm2/Rule/Empty.php b/QuickForm2/Rule/Empty.php new file mode 100644 index 00000000..235b4310 --- /dev/null +++ b/QuickForm2/Rule/Empty.php @@ -0,0 +1,83 @@ +, + * Bertrand Mansion + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The names of the authors may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @category HTML + * @package HTML_QuickForm2 + * @author Alexey Borzov + * @author Bertrand Mansion + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version CVS: $Id$ + * @link http://pear.php.net/package/HTML_QuickForm2 + */ + +/** + * Base class for HTML_QuickForm2 rules + */ +require_once 'HTML/QuickForm2/Rule.php'; + +/** + * Rule checking that the field is empty + * + * Handles both simple form fields and file uploads, the latter are considered + * valid iff no file upload was attempted. + * + * The rule doesn't make much sense if used separately, but can be very helpful + * if chained: + * + * $spamCheck->addRule('empty') + * ->or_($email->createRule('nonempty', 'Supply a valid email if you want to receive our spam') + * ->and_($email->createRule('email'))); + * + * + * @category HTML + * @package HTML_QuickForm2 + * @author Alexey Borzov + * @author Bertrand Mansion + * @version Release: @package_version@ + */ +class HTML_QuickForm2_Rule_Empty extends HTML_QuickForm2_Rule +{ + protected function checkValue($value) + { + if (!$this->owner instanceof HTML_QuickForm2_Element_InputFile) { + return 0 == strlen($value); + } else { + return isset($value['error']) && UPLOAD_ERR_NO_FILE == $value['error']; + } + } +} + +?> \ No newline at end of file diff --git a/tests/QuickForm2/Rule/AllTests.php b/tests/QuickForm2/Rule/AllTests.php index 7f7c0be6..6bd6e9b0 100644 --- a/tests/QuickForm2/Rule/AllTests.php +++ b/tests/QuickForm2/Rule/AllTests.php @@ -53,6 +53,7 @@ require_once dirname(__FILE__) . '/NonemptyTest.php'; require_once dirname(__FILE__) . '/RequiredTest.php'; require_once dirname(__FILE__) . '/CompareTest.php'; +require_once dirname(__FILE__) . '/EmptyTest.php'; class QuickForm2_Rule_AllTests { @@ -68,6 +69,7 @@ public static function suite() $suite->addTestSuite('HTML_QuickForm2_Rule_NonemptyTest'); $suite->addTestSuite('HTML_QuickForm2_Rule_RequiredTest'); $suite->addTestSuite('HTML_QuickForm2_Rule_CompareTest'); + $suite->addTestSuite('HTML_QuickForm2_Rule_EmptyTest'); return $suite; } diff --git a/tests/QuickForm2/Rule/EmptyTest.php b/tests/QuickForm2/Rule/EmptyTest.php new file mode 100644 index 00000000..fa76c906 --- /dev/null +++ b/tests/QuickForm2/Rule/EmptyTest.php @@ -0,0 +1,129 @@ +, + * Bertrand Mansion + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The names of the authors may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @category HTML + * @package HTML_QuickForm2 + * @author Alexey Borzov + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version CVS: $Id$ + * @link http://pear.php.net/package/HTML_QuickForm2 + */ + +/** + * PHPUnit2 Test Case + */ +require_once 'PHPUnit/Framework/TestCase.php'; + +/** + * Rule checking that the form field is empty + */ +require_once 'HTML/QuickForm2/Rule/Empty.php'; + +/** + * Class for elements + */ +require_once 'HTML/QuickForm2/Element/InputFile.php'; + +/** + * Unit test for HTML_QuickForm2_Rule_Empty class + */ +class HTML_QuickForm2_Rule_EmptyTest extends PHPUnit_Framework_TestCase +{ + public function testValidateGenericElement() + { + $mockValid = $this->getMock('HTML_QuickForm2_Element', array('getType', + 'getValue', 'setValue', '__toString')); + $mockValid->expects($this->once())->method('getValue') + ->will($this->returnValue('')); + $rule = new HTML_QuickForm2_Rule_Empty($mockValid, 'an error'); + $this->assertTrue($rule->validate()); + $this->assertEquals('', $mockValid->getError()); + + $mockInvalid = $this->getMock('HTML_QuickForm2_Element', array('getType', + 'getValue', 'setValue', '__toString')); + $mockInvalid->expects($this->once())->method('getValue') + ->will($this->returnValue('some value')); + $rule2 = new HTML_QuickForm2_Rule_Empty($mockInvalid, 'an error'); + $this->assertFalse($rule2->validate()); + $this->assertEquals('an error', $mockInvalid->getError()); + } + + public function testValidateInputFileElement() + { + $mockValid = $this->getMock('HTML_QuickForm2_Element_InputFile', array('getValue')); + $mockValid->expects($this->once())->method('getValue') + ->will($this->returnValue(array( + 'name' => '', + 'type' => '', + 'tmp_name' => '', + 'error' => UPLOAD_ERR_NO_FILE, + 'size' => 0 + ))); + $rule = new HTML_QuickForm2_Rule_Empty($mockValid, 'an error'); + $this->assertTrue($rule->validate()); + $this->assertEquals('', $mockValid->getError()); + + $mockInvalid = $this->getMock('HTML_QuickForm2_Element_InputFile', array('getValue')); + $mockInvalid->expects($this->once())->method('getValue') + ->will($this->returnValue(array( + 'name' => 'goodfile.php', + 'type' => 'application/octet-stream', + 'tmp_name' => '/tmp/foobar', + 'error' => UPLOAD_ERR_OK, + 'size' => 1234 + ))); + $rule2 = new HTML_QuickForm2_Rule_Empty($mockInvalid, 'an error'); + $this->assertFalse($rule2->validate()); + $this->assertEquals('an error', $mockInvalid->getError()); + } + + public function testFailedUploadIsNotEmpty() + { + $mockFailed = $this->getMock('HTML_QuickForm2_Element_InputFile', array('getValue')); + $mockFailed->expects($this->once())->method('getValue') + ->will($this->returnValue(array( + 'name' => 'badfile.php', + 'type' => '', + 'tmp_name' => '', + 'error' => UPLOAD_ERR_FORM_SIZE, + 'size' => 0 + ))); + $rule = new HTML_QuickForm2_Rule_Empty($mockFailed, 'an error'); + $this->assertFalse($rule->validate()); + $this->assertEquals('an error', $mockFailed->getError()); + } +} +?>