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

Reply via email to