Author: ts Date: Mon Dec 31 15:02:48 2007 New Revision: 7048 Log: - Implemented enhancement #010765: ezcConsoleQuestionDialog::YesNoQuestion does not accept "Yes" or "yes" / "no", "No" as valid answer. A new validator (ezcConsoleQuestionMappingValidator) was introduced for this, which extends ezcConsoleQuestionCollectionValidator and is now used for the yes-no-question.
Added: trunk/ConsoleTools/src/dialog/validators/question_dialog_mapping.php (with props) trunk/ConsoleTools/tests/question_dialog_mapping_validator_test.php (with props) Modified: trunk/ConsoleTools/ChangeLog trunk/ConsoleTools/design/class_diagram.png trunk/ConsoleTools/src/console_autoload.php trunk/ConsoleTools/src/dialog/question_dialog.php trunk/ConsoleTools/tests/suite.php Modified: trunk/ConsoleTools/ChangeLog ============================================================================== --- trunk/ConsoleTools/ChangeLog [iso-8859-1] (original) +++ trunk/ConsoleTools/ChangeLog [iso-8859-1] Mon Dec 31 15:02:48 2007 @@ -1,3 +1,12 @@ +1.4 - [RELEASEDATE] +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- Implemented enhancement #010765: ezcConsoleQuestionDialog::YesNoQuestion + does not accept "Yes" or "yes" / "no", "No" as valid answer. A new validator + (ezcConsoleQuestionMappingValidator) was introduced for this, which extends + ezcConsoleQuestionCollectionValidator and is now used for the + yes-no-question. + 1.3.1 - Wednesday 28 November 2007 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Modified: trunk/ConsoleTools/design/class_diagram.png ============================================================================== Binary files - no diff available. Modified: trunk/ConsoleTools/src/console_autoload.php ============================================================================== --- trunk/ConsoleTools/src/console_autoload.php [iso-8859-1] (original) +++ trunk/ConsoleTools/src/console_autoload.php [iso-8859-1] Mon Dec 31 15:02:48 2007 @@ -37,6 +37,7 @@ 'ezcConsoleDialog' => 'ConsoleTools/interfaces/dialog.php', 'ezcConsoleDialogOptions' => 'ConsoleTools/options/dialog.php', 'ezcConsoleMenuDialogValidator' => 'ConsoleTools/interfaces/menu_dialog_validator.php', + 'ezcConsoleQuestionDialogCollectionValidator' => 'ConsoleTools/dialog/validators/question_dialog_collection.php', 'ezcConsoleArgument' => 'ConsoleTools/input/argument.php', 'ezcConsoleArguments' => 'ConsoleTools/input/arguments.php', 'ezcConsoleDialogViewer' => 'ConsoleTools/dialog_viewer.php', @@ -55,7 +56,7 @@ 'ezcConsoleProgressbar' => 'ConsoleTools/progressbar.php', 'ezcConsoleProgressbarOptions' => 'ConsoleTools/options/progressbar.php', 'ezcConsoleQuestionDialog' => 'ConsoleTools/dialog/question_dialog.php', - 'ezcConsoleQuestionDialogCollectionValidator' => 'ConsoleTools/dialog/validators/question_dialog_collection.php', + 'ezcConsoleQuestionDialogMappingValidator' => 'ConsoleTools/dialog/validators/question_dialog_mapping.php', 'ezcConsoleQuestionDialogOptions' => 'ConsoleTools/options/question_dialog.php', 'ezcConsoleQuestionDialogRegexValidator' => 'ConsoleTools/dialog/validators/question_dialog_regex.php', 'ezcConsoleQuestionDialogTypeValidator' => 'ConsoleTools/dialog/validators/question_dialog_type.php', Modified: trunk/ConsoleTools/src/dialog/question_dialog.php ============================================================================== --- trunk/ConsoleTools/src/dialog/question_dialog.php [iso-8859-1] (original) +++ trunk/ConsoleTools/src/dialog/question_dialog.php [iso-8859-1] Mon Dec 31 15:02:48 2007 @@ -155,10 +155,14 @@ $opts = new ezcConsoleQuestionDialogOptions(); $opts->text = $questionString; $opts->showResults = true; - $opts->validator = new ezcConsoleQuestionDialogCollectionValidator( + $opts->validator = new ezcConsoleQuestionDialogMappingValidator( array( "y", "n" ), $default, ezcConsoleQuestionDialogCollectionValidator::CONVERT_LOWER + array( + 'yes' => 'y', + 'no' => 'n', + ), ); return new ezcConsoleQuestionDialog( $out, $opts ); Added: trunk/ConsoleTools/src/dialog/validators/question_dialog_mapping.php ============================================================================== --- trunk/ConsoleTools/src/dialog/validators/question_dialog_mapping.php (added) +++ trunk/ConsoleTools/src/dialog/validators/question_dialog_mapping.php [iso-8859-1] Mon Dec 31 15:02:48 2007 @@ -1,0 +1,141 @@ +<?php +/** + * File containing the ezcConsoleQuestionDialogMappingValidator class. + * + * @package ConsoleTools + * @version //autogentag// + * @copyright Copyright (C) 2005-2007 eZ systems as. All rights reserved. + * @license http://ez.no/licenses/new_bsd New BSD License + * @filesource + */ + +/** + * Validator class to map certain results to others. + * This validator class, for [EMAIL PROTECTED] ezcConsoleQuestionDialog} objects, + * validates a given result against a set of predefined values, exactly like + * [EMAIL PROTECTED] ezcConsoleQuestionDialogCollectionValidator} does, but allows in + * addition to map certain results to other results. The $map property contains + * an array of mappings that are checked before a received result is validated. + * If a mapping matches, the received result is converted to the mapping target + * before being validated. + * + * A valid $map looks like this: + * <code> + * array( + * 'yes' => 'y', + * 'no' => 'n', + * '1' => 'y', + * '0' => 'n' + * ) + * </code> + * While the corresponding collection of valid answers would look like + * this: + * <code> + * array( + * 'y', 'n' + * ) + * </code> + * If the answer 'yes' is received by the validator, it is mapped to 'y', + * therefore considered valid and 'y' is returned as the received value. + * + * @package ConsoleTools + * @version //autogen// + * + * @property array(string) $collection + * The collection of valid answers. + * @property mixed $default + * Default value. + * @property int $conversion + * ezcConsoleQuestionDialogMappingValidator::TYPE_*. + * @property array(string=>string) $map + * Mapping of answers to valid answers (e.g. array('yes' => 'y') to + * map 'yes' to 'y' while 'y' must be in $collection). + */ +class ezcConsoleQuestionDialogMappingValidator extends ezcConsoleQuestionDialogCollectionValidator +{ + /** + * Creates a new question dialog mapping validator. + * Creates a new question dialog mapping validator, which validates the + * result specified by the user against an array of valid results + * ($collection). If not value is provided by the user a possibly set + * $default value is used instead. The $conversion parameter can optionally + * define a conversion to be performed on the result before validating it. + * Valid conversions are defined by the CONVERT_* constants in this class. + * + * While this functionality is already provided by [EMAIL PROTECTED] + * ezcConsoleQuestionDialogCollectionValidator}, the additional $map + * paramater allows the sepcification of a map of result values. These + * mapping is then checked for matches, before a received answer is + * validated against the collection. + * + * @param array(string) $collection The collection of valid results. + * @param mixed $default Optional default value. + * @param int $conversion CONVERT_* constant. + * @paran array(string=>string) $map + * @return void + */ + public function __construct( array $collection, $default = null, $conversion = self::CONVERT_NONE, $map = array() ) + { + // Initialize additional property + $this->properties['map'] = array(); + $this->map = $map; + + parent::__construct( $collection, $default, $conversion ); + } + + /** + * Returns a fixed version of the result, if possible. + * Converts the given result according to the conversion defined in the + * $conversion property. + * + * @param mixed $result The received result. + * @return mixed The manipulated result. + */ + public function fixup( $result ) + { + if ( $result === "" && $this->default !== null ) + { + return $this->default; + } + switch ( $this->conversion ) + { + case self::CONVERT_UPPER: + $result = strtoupper( $result ); + break; + case self::CONVERT_LOWER: + $result = strtolower( $result ); + break; + } + return ( isset( $this->map[$result] ) ? $this->map[$result] : $result ); + } + + /** + * Property write access. + * + * @param string $propertyName Name of the property. + * @param mixed $propertyValue The value for the property. + * + * @throws ezcBasePropertyNotFoundException + * If a the value for the property options is not an instance of + * @throws ezcBaseValueException + * If a the value for a property is out of range. + * @ignore + */ + public function __set( $propertyName, $propertyValue ) + { + switch ( $propertyName ) + { + case "map": + if ( is_array( $propertyValue ) === false ) + { + throw new ezcBaseValueException( $propertyName, $propertyValue, "array" ); + } + break; + default: + return parent::__set( $propertyName, $propertyValue ); + } + $this->properties[$propertyName] = $propertyValue; + } +} + +?> Propchange: trunk/ConsoleTools/src/dialog/validators/question_dialog_mapping.php ------------------------------------------------------------------------------ svn:eol-style = native Added: trunk/ConsoleTools/tests/question_dialog_mapping_validator_test.php ============================================================================== --- trunk/ConsoleTools/tests/question_dialog_mapping_validator_test.php (added) +++ trunk/ConsoleTools/tests/question_dialog_mapping_validator_test.php [iso-8859-1] Mon Dec 31 15:02:48 2007 @@ -1,0 +1,250 @@ +<?php +/** + * ezcConsoleQuestionDialogMappingValidatorTest class. + * + * @package ConsoleTools + * @subpackage Tests + * @version //autogentag// + * @copyright Copyright (C) 2005-2007 eZ systems as. All rights reserved. + * @license http://ez.no/licenses/new_bsd New BSD License + */ + +/** + * Test suite for ezcConsoleQuestionDialogMappingValidator class. + * + * @package ConsoleTools + * @subpackage Tests + */ +class ezcConsoleQuestionDialogMappingValidatorTest extends ezcTestCase +{ + public static function suite() + { + return new PHPUnit_Framework_TestSuite( "ezcConsoleQuestionDialogMappingValidatorTest" ); + } + + public function testGetAccessDefaultSuccess() + { + $collection = array( "foo", "bar", "baz" ); + $validator = new ezcConsoleQuestionDialogMappingValidator( $collection ); + $this->assertEquals( $collection, $validator->collection ); + $this->assertNull( $validator->default ); + $this->assertEquals( ezcConsoleQuestionDialogMappingValidator::CONVERT_NONE, $validator->conversion ); + $this->assertEquals( array(), $validator->map ); + } + + public function testGetAccessCustomSuccess() + { + $collection = array( "foo", "bar", "baz" ); + $validator = new ezcConsoleQuestionDialogMappingValidator( + $collection, + "foo", + ezcConsoleQuestionDialogMappingValidator::CONVERT_UPPER, + array( 'f' => 'foo' ) + ); + $this->assertEquals( $collection, $validator->collection ); + $this->assertEquals( "foo", $validator->default ); + $this->assertEquals( ezcConsoleQuestionDialogMappingValidator::CONVERT_UPPER, $validator->conversion ); + $this->assertEquals( array( 'f' => 'foo' ), $validator->map ); + } + + public function testGetAccessFailure() + { + $collection = array( "foo", "bar", "baz" ); + $validator = new ezcConsoleQuestionDialogMappingValidator( $collection ); + + try + { + echo $validator->foo; + } + catch ( ezcBasePropertyNotFoundException $e ) + { + return; + } + $this->fail( "Exception not thrown on invalid property foo." ); + } + + public function testSetAccessSuccess() + { + $collection = array( "foo", "bar", "baz" ); + $validator = new ezcConsoleQuestionDialogMappingValidator( $collection ); + + $collectionNew = array( 23, 42 ); + $validator->collection = $collectionNew; + $validator->default = 23; + $validator->conversion = ezcConsoleQuestionDialogMappingValidator::CONVERT_LOWER; + $newMap = array( 'f' => 23, 'g' => 42 ); + $validator->map = $newMap; + + $this->assertEquals( $collectionNew, $validator->collection ); + $this->assertEquals( 23, $validator->default ); + $this->assertEquals( ezcConsoleQuestionDialogMappingValidator::CONVERT_LOWER, $validator->conversion ); + $this->assertEquals( $newMap, $validator->map ); + } + + public function testSetAccessFailure() + { + $collection = array( "foo", "bar", "baz" ); + $validator = new ezcConsoleQuestionDialogMappingValidator( $collection ); + + $exceptionCaught = false; + try + { + $validator->collection = true; + $this->fail( "Exception not thrown on invalid value for property collection." ); + } + catch ( ezcBaseValueException $e ) + { + } + + try + { + $validator->default = array(); + $this->fail( "Exception not thrown on invalid value for property default." ); + } + catch ( ezcBaseValueException $e ) + { + } + + try + { + $validator->conversion = "Foo"; + $this->fail( "Exception not thrown on invalid value for property conversion." ); + } + catch ( ezcBaseValueException $e ) + { + } + + try + { + $validator->map = "Foo"; + $this->fail( "Exception not thrown on invalid value for property map." ); + } + catch ( ezcBaseValueException $e ) + { + } + + $exceptionCaught = false; + try + { + $validator->foo = "Foo"; + $this->fail( "Exception not thrown on access of nonexistent property foo." ); + } + catch ( ezcBasePropertyNotFoundException $e ) + { + } + } + + public function testIssetAccess() + { + $collection = array( "foo", "bar", "baz" ); + $validator = new ezcConsoleQuestionDialogMappingValidator( $collection ); + $this->assertTrue( isset( $validator->collection ), "Property collection not set." ); + $this->assertTrue( isset( $validator->default ), "Property default not set." ); + $this->assertTrue( isset( $validator->conversion ), "Property conversion not set." ); + $this->assertTrue( isset( $validator->map ), "Property map not set." ); + + $this->assertFalse( isset( $validator->foo ), "Property foo set." ); + } + + public function testValidate() + { + $collection = array( "foo", "bar", "baz" ); + $validator = new ezcConsoleQuestionDialogMappingValidator( $collection ); + $this->assertTrue( $validator->validate( "foo" ) ); + $this->assertFalse( $validator->validate( "test" ) ); + } + + public function testFixup() + { + $collection = array( "foo", "bar", "baz" ); + $validator = new ezcConsoleQuestionDialogMappingValidator( $collection, null ); + + $this->assertEquals( "foo", $validator->fixup( "foo" ), 'Fixup incorrect without conversion.' ); + $this->assertEquals( "FOO", $validator->fixup( "FOO" ), 'Fixup incorrect without conversion.' ); + + $validator->conversion = ezcConsoleQuestionDialogMappingValidator::CONVERT_UPPER; + + $this->assertEquals( "FOO", $validator->fixup( "foo" ), 'Fixup incorrect with conversion to upper case.' ); + $this->assertEquals( "FOO", $validator->fixup( "FOO" ), 'Fixup incorrect with conversion to upper case.' ); + + $validator->conversion = ezcConsoleQuestionDialogMappingValidator::CONVERT_LOWER; + + $this->assertEquals( "foo", $validator->fixup( "foo" ), 'Fixup incorrect with conversion to lower case.' ); + $this->assertEquals( "foo", $validator->fixup( "FOO" ), 'Fixup incorrect with conversion to lower case.' ); + + $this->assertEquals( "", $validator->fixup( "" ) ); + + $validator->default = "foo"; + + $this->assertEquals( "foo", $validator->fixup( "" ) ); + } + + public function testFixupWithMapping() + { + $collection = array( 'y', 'n' ); + $validator = new ezcConsoleQuestionDialogMappingValidator( + $collection, + null, + ezcConsoleQuestionDialogMappingValidator::CONVERT_NONE, + array( + 'yes' => 'y', + 'no' => 'n', + '1' => 'y', + '0' => 'n', + ) + ); + + $this->assertEquals( "y", $validator->fixup( "yes" ) ); + $this->assertEquals( "y", $validator->fixup( "1" ) ); + $this->assertEquals( "YES", $validator->fixup( "YES" ) ); + + $this->assertEquals( "n", $validator->fixup( "no" ) ); + $this->assertEquals( "n", $validator->fixup( "0" ) ); + $this->assertEquals( "NO", $validator->fixup( "NO" ) ); + + $validator->conversion = ezcConsoleQuestionDialogMappingValidator::CONVERT_UPPER; + + $this->assertEquals( "YES", $validator->fixup( "yes" ) ); + $this->assertEquals( "y", $validator->fixup( "1" ) ); + $this->assertEquals( "YES", $validator->fixup( "YES" ) ); + + $this->assertEquals( "NO", $validator->fixup( "no" ) ); + $this->assertEquals( "n", $validator->fixup( "0" ) ); + $this->assertEquals( "NO", $validator->fixup( "NO" ) ); + + $validator->conversion = ezcConsoleQuestionDialogMappingValidator::CONVERT_LOWER; + + $this->assertEquals( "y", $validator->fixup( "yes" ) ); + $this->assertEquals( "y", $validator->fixup( "1" ) ); + $this->assertEquals( "y", $validator->fixup( "YES" ) ); + + $this->assertEquals( "n", $validator->fixup( "no" ) ); + $this->assertEquals( "n", $validator->fixup( "0" ) ); + $this->assertEquals( "n", $validator->fixup( "NO" ) ); + + $this->assertEquals( "", $validator->fixup( "" ) ); + + $validator->default = "no"; + + $this->assertEquals( "no", $validator->fixup( "" ) ); + } + + public function testGetResultString() + { + $collection = array( "foo", "bar", "baz" ); + $validator = new ezcConsoleQuestionDialogMappingValidator( + $collection, + null, + ezcConsoleQuestionDialogMappingValidator::CONVERT_NONE, + array( 'f' => 'foo', 'b' => 'bar' ) + ); + + $this->assertEquals( "(foo/bar/baz)", $validator->getResultString() ); + + $validator->default = "foo"; + + $this->assertEquals( "(foo/bar/baz) [foo]", $validator->getResultString() ); + } +} + +?> Propchange: trunk/ConsoleTools/tests/question_dialog_mapping_validator_test.php ------------------------------------------------------------------------------ svn:eol-style = native Modified: trunk/ConsoleTools/tests/suite.php ============================================================================== --- trunk/ConsoleTools/tests/suite.php [iso-8859-1] (original) +++ trunk/ConsoleTools/tests/suite.php [iso-8859-1] Mon Dec 31 15:02:48 2007 @@ -106,6 +106,10 @@ /** * Require test suite for ezcConsoleQuestionDialogCollectionValidator class. */ +require_once 'question_dialog_mapping_validator_test.php'; +/** + * Require test suite for ezcConsoleQuestionDialogMappingValidator class. + */ require_once 'question_dialog_collection_validator_test.php'; /** * Require test suite for ezcConsoleQuestionDialogTypeValidator class. @@ -170,6 +174,7 @@ $this->addTest( ezcConsoleDialogOptionsTest::suite() ); $this->addTest( ezcConsoleQuestionDialogOptionsTest::suite() ); $this->addTest( ezcConsoleQuestionDialogCollectionValidatorTest::suite() ); + $this->addTest( ezcConsoleQuestionDialogMappingValidatorTest::suite() ); $this->addTest( ezcConsoleQuestionDialogTypeValidatorTest::suite() ); $this->addTest( ezcConsoleQuestionDialogRegexValidatorTest::suite() ); $this->addTest( ezcConsoleMenuDialogTest::suite() ); -- svn-components mailing list svn-components@lists.ez.no http://lists.ez.no/mailman/listinfo/svn-components