From 89a040434ed65c07834716a30208dad355595394 Mon Sep 17 00:00:00 2001 From: franek Date: Tue, 1 Oct 2013 13:52:53 +0200 Subject: [PATCH] [Form] add support for Length and Range constraint in order to replace MaxLength, MinLength, Max and Min constraints in next release (2.3) --- .../Validator/ValidatorTypeGuesser.php | 26 +++++++ .../Validator/ValidatorTypeGuesserTest.php | 77 +++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 src/Symfony/Component/Form/Tests/Extension/Validator/ValidatorTypeGuesserTest.php diff --git a/src/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php b/src/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php index 387a724de2..75be62749c 100644 --- a/src/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php +++ b/src/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php @@ -155,11 +155,13 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface case 'Symfony\Component\Validator\Constraints\MaxLength': case 'Symfony\Component\Validator\Constraints\MinLength': + case 'Symfony\Component\Validator\Constraints\Length': case 'Symfony\Component\Validator\Constraints\Regex': return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE); case 'Symfony\Component\Validator\Constraints\Min': case 'Symfony\Component\Validator\Constraints\Max': + case 'Symfony\Component\Validator\Constraints\Range': return new TypeGuess('number', array(), Guess::LOW_CONFIDENCE); case 'Symfony\Component\Validator\Constraints\MinCount': @@ -206,6 +208,12 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface case 'Symfony\Component\Validator\Constraints\MaxLength': return new ValueGuess($constraint->limit, Guess::HIGH_CONFIDENCE); + case 'Symfony\Component\Validator\Constraints\Length': + if (is_numeric($constraint->max)) { + return new ValueGuess($constraint->max, Guess::HIGH_CONFIDENCE); + } + break; + case 'Symfony\Component\Validator\Constraints\Type': if (in_array($constraint->type, array('double', 'float', 'numeric', 'real'))) { return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE); @@ -214,6 +222,12 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface case 'Symfony\Component\Validator\Constraints\Max': return new ValueGuess(strlen((string) $constraint->limit), Guess::LOW_CONFIDENCE); + + case 'Symfony\Component\Validator\Constraints\Range': + if (is_numeric($constraint->max)) { + return new ValueGuess(strlen((string) $constraint->max), Guess::LOW_CONFIDENCE); + } + break; } return null; @@ -232,6 +246,12 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface case 'Symfony\Component\Validator\Constraints\MinLength': return new ValueGuess(sprintf('.{%s,}', (string) $constraint->limit), Guess::LOW_CONFIDENCE); + case 'Symfony\Component\Validator\Constraints\Length': + if (is_numeric($constraint->min)) { + return new ValueGuess(sprintf('.{%s,}', (string) $constraint->min), Guess::LOW_CONFIDENCE); + } + break; + case 'Symfony\Component\Validator\Constraints\Regex': $htmlPattern = $constraint->getHtmlPattern(); @@ -243,6 +263,12 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface case 'Symfony\Component\Validator\Constraints\Min': return new ValueGuess(sprintf('.{%s,}', strlen((string) $constraint->limit)), Guess::LOW_CONFIDENCE); + case 'Symfony\Component\Validator\Constraints\Range': + if (is_numeric($constraint->min)) { + return new ValueGuess(sprintf('.{%s,}', strlen((string) $constraint->min)), Guess::LOW_CONFIDENCE); + } + break; + case 'Symfony\Component\Validator\Constraints\Type': if (in_array($constraint->type, array('double', 'float', 'numeric', 'real'))) { return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE); diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/ValidatorTypeGuesserTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/ValidatorTypeGuesserTest.php new file mode 100644 index 0000000000..f42003d214 --- /dev/null +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/ValidatorTypeGuesserTest.php @@ -0,0 +1,77 @@ + +* +* For the full copyright and license information, please view the LICENSE +* file that was distributed with this source code. +*/ + +namespace Symfony\Component\Form\Tests\Extension\Validator; + +use Symfony\Component\Form\Extension\Validator\ValidatorTypeGuesser; +use Symfony\Component\Form\Guess\Guess; +use Symfony\Component\Validator\Constraints\Length; +use Symfony\Component\Validator\Constraints\Type; + +/** +* @author franek +*/ +class ValidatorTypeGuesserTest extends \PHPUnit_Framework_TestCase +{ + private $typeGuesser; + + public function setUp() + { + if (!class_exists('Symfony\Component\Validator\Constraint')) { + $this->markTestSkipped('The "Validator" component is not available'); + } + + $metadataFactory = $this->getMock('Symfony\Component\Validator\MetadataFactoryInterface'); + + $this->typeGuesser = new ValidatorTypeGuesser($metadataFactory); + } + + public function testGuessMaxLengthForConstraintWithMaxValue() + { + $constraint = new Length(array('max' => '2')); + + $result = $this->typeGuesser->guessMaxLengthForConstraint($constraint); + $this->assertInstanceOf('Symfony\Component\Form\Guess\ValueGuess', $result); + $this->assertEquals(2, $result->getValue()); + $this->assertEquals(Guess::HIGH_CONFIDENCE, $result->getConfidence()); + } + + public function testGuessMaxLengthForConstraintWithMinValue() + { + $constraint = new Length(array('min' => '2')); + + $result = $this->typeGuesser->guessMaxLengthForConstraint($constraint); + $this->assertNull($result); + } + + /** +* @dataProvider dataProviderTestGuessMaxLengthForConstraintWithType +*/ + public function testGuessMaxLengthForConstraintWithType($type) + { + $constraint = new Type($type); + + $result = $this->typeGuesser->guessMaxLengthForConstraint($constraint); + $this->assertInstanceOf('Symfony\Component\Form\Guess\ValueGuess', $result); + $this->assertEquals(null, $result->getValue()); + $this->assertEquals(Guess::MEDIUM_CONFIDENCE, $result->getConfidence()); + } + + public static function dataProviderTestGuessMaxLengthForConstraintWithType() + { + return array ( + array('double'), + array('float'), + array('numeric'), + array('real') + ); + } +}