--- /dev/null
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Validator\Tests\Constraints;
+
+use Symfony\Component\Intl\Util\IntlTestHelper;
+use Symfony\Component\Validator\Constraints\Range;
+use Symfony\Component\Validator\Constraints\RangeValidator;
+use Symfony\Component\Validator\Validation;
+
+class RangeValidatorTest extends AbstractConstraintValidatorTest
+{
+ protected function getApiVersion()
+ {
+ return Validation::API_VERSION_2_5;
+ }
+
+ protected function createValidator()
+ {
+ return new RangeValidator();
+ }
+
+ public function testNullIsValid()
+ {
+ $this->validator->validate(null, new Range(array('min' => 10, 'max' => 20)));
+
+ $this->assertNoViolation();
+ }
+
+ public function getTenToTwenty()
+ {
+ return array(
+ array(10.00001),
+ array(19.99999),
+ array('10.00001'),
+ array('19.99999'),
+ array(10),
+ array(20),
+ array(10.0),
+ array(20.0),
+ );
+ }
+
+ public function getLessThanTen()
+ {
+ return array(
+ array(9.99999, '9.99999'),
+ array('9.99999', '"9.99999"'),
+ array(5, '5'),
+ array(1.0, '1.0'),
+ );
+ }
+
+ public function getMoreThanTwenty()
+ {
+ return array(
+ array(20.000001, '20.000001'),
+ array('20.000001', '"20.000001"'),
+ array(21, '21'),
+ array(30.0, '30.0'),
+ );
+ }
+
+ /**
+ * @dataProvider getTenToTwenty
+ */
+ public function testValidValuesMin($value)
+ {
+ $constraint = new Range(array('min' => 10));
+ $this->validator->validate($value, $constraint);
+
+ $this->assertNoViolation();
+ }
+
+ /**
+ * @dataProvider getTenToTwenty
+ */
+ public function testValidValuesMax($value)
+ {
+ $constraint = new Range(array('max' => 20));
+ $this->validator->validate($value, $constraint);
+
+ $this->assertNoViolation();
+ }
+
+ /**
+ * @dataProvider getTenToTwenty
+ */
+ public function testValidValuesMinMax($value)
+ {
+ $constraint = new Range(array('min' => 10, 'max' => 20));
+ $this->validator->validate($value, $constraint);
+
+ $this->assertNoViolation();
+ }
+
+ /**
+ * @dataProvider getLessThanTen
+ */
+ public function testInvalidValuesMin($value, $formattedValue)
+ {
+ $constraint = new Range(array(
+ 'min' => 10,
+ 'minMessage' => 'myMessage',
+ ));
+
+ $this->validator->validate($value, $constraint);
+
+ $this->buildViolation('myMessage')
+ ->setParameter('{{ value }}', $formattedValue)
+ ->setParameter('{{ limit }}', 10)
+ ->setCode(Range::TOO_LOW_ERROR)
+ ->assertRaised();
+ }
+
+ /**
+ * @dataProvider getMoreThanTwenty
+ */
+ public function testInvalidValuesMax($value, $formattedValue)
+ {
+ $constraint = new Range(array(
+ 'max' => 20,
+ 'maxMessage' => 'myMessage',
+ ));
+
+ $this->validator->validate($value, $constraint);
+
+ $this->buildViolation('myMessage')
+ ->setParameter('{{ value }}', $formattedValue)
+ ->setParameter('{{ limit }}', 20)
+ ->setCode(Range::TOO_HIGH_ERROR)
+ ->assertRaised();
+ }
+
+ /**
+ * @dataProvider getMoreThanTwenty
+ */
+ public function testInvalidValuesCombinedMax($value, $formattedValue)
+ {
+ $constraint = new Range(array(
+ 'min' => 10,
+ 'max' => 20,
+ 'minMessage' => 'myMinMessage',
+ 'maxMessage' => 'myMaxMessage',
+ ));
+
+ $this->validator->validate($value, $constraint);
+
+ $this->buildViolation('myMaxMessage')
+ ->setParameter('{{ value }}', $formattedValue)
+ ->setParameter('{{ limit }}', 20)
+ ->setCode(Range::TOO_HIGH_ERROR)
+ ->assertRaised();
+ }
+
+ /**
+ * @dataProvider getLessThanTen
+ */
+ public function testInvalidValuesCombinedMin($value, $formattedValue)
+ {
+ $constraint = new Range(array(
+ 'min' => 10,
+ 'max' => 20,
+ 'minMessage' => 'myMinMessage',
+ 'maxMessage' => 'myMaxMessage',
+ ));
+
+ $this->validator->validate($value, $constraint);
+
+ $this->buildViolation('myMinMessage')
+ ->setParameter('{{ value }}', $formattedValue)
+ ->setParameter('{{ limit }}', 10)
+ ->setCode(Range::TOO_LOW_ERROR)
+ ->assertRaised();
+ }
+
+ public function getTenthToTwentiethMarch2014()
+ {
+ // The provider runs before setUp(), so we need to manually fix
+ // the default timezone
+ $this->setDefaultTimezone('UTC');
+
+ $tests = array(
+ array(new \DateTime('March 10, 2014')),
+ array(new \DateTime('March 15, 2014')),
+ array(new \DateTime('March 20, 2014')),
+ );
+
+ if (PHP_VERSION_ID >= 50500) {
+ $tests[] = array(new \DateTimeImmutable('March 10, 2014'));
+ $tests[] = array(new \DateTimeImmutable('March 15, 2014'));
+ $tests[] = array(new \DateTimeImmutable('March 20, 2014'));
+ }
+
+ $this->restoreDefaultTimezone();
+
+ return $tests;
+ }
+
+ public function getSoonerThanTenthMarch2014()
+ {
+ // The provider runs before setUp(), so we need to manually fix
+ // the default timezone
+ $this->setDefaultTimezone('UTC');
+
+ $tests = array(
+ array(new \DateTime('March 20, 2013'), 'Mar 20, 2013, 12:00 AM'),
+ array(new \DateTime('March 9, 2014'), 'Mar 9, 2014, 12:00 AM'),
+ );
+
+ if (PHP_VERSION_ID >= 50500) {
+ $tests[] = array(new \DateTimeImmutable('March 20, 2013'), 'Mar 20, 2013, 12:00 AM');
+ $tests[] = array(new \DateTimeImmutable('March 9, 2014'), 'Mar 9, 2014, 12:00 AM');
+ }
+
+ $this->restoreDefaultTimezone();
+
+ return $tests;
+ }
+
+ public function getLaterThanTwentiethMarch2014()
+ {
+ // The provider runs before setUp(), so we need to manually fix
+ // the default timezone
+ $this->setDefaultTimezone('UTC');
+
+ $tests = array(
+ array(new \DateTime('March 21, 2014'), 'Mar 21, 2014, 12:00 AM'),
+ array(new \DateTime('March 9, 2015'), 'Mar 9, 2015, 12:00 AM'),
+ );
+
+ if (PHP_VERSION_ID >= 50500) {
+ $tests[] = array(new \DateTimeImmutable('March 21, 2014'), 'Mar 21, 2014, 12:00 AM');
+ $tests[] = array(new \DateTimeImmutable('March 9, 2015'), 'Mar 9, 2015, 12:00 AM');
+ }
+
+ $this->restoreDefaultTimezone();
+
+ return $tests;
+ }
+
+ /**
+ * @dataProvider getTenthToTwentiethMarch2014
+ */
+ public function testValidDatesMin($value)
+ {
+ $constraint = new Range(array('min' => 'March 10, 2014'));
+ $this->validator->validate($value, $constraint);
+
+ $this->assertNoViolation();
+ }
+
+ /**
+ * @dataProvider getTenthToTwentiethMarch2014
+ */
+ public function testValidDatesMax($value)
+ {
+ $constraint = new Range(array('max' => 'March 20, 2014'));
+ $this->validator->validate($value, $constraint);
+
+ $this->assertNoViolation();
+ }
+
+ /**
+ * @dataProvider getTenthToTwentiethMarch2014
+ */
+ public function testValidDatesMinMax($value)
+ {
+ $constraint = new Range(array('min' => 'March 10, 2014', 'max' => 'March 20, 2014'));
+ $this->validator->validate($value, $constraint);
+
+ $this->assertNoViolation();
+ }
+
+ /**
+ * @dataProvider getSoonerThanTenthMarch2014
+ */
+ public function testInvalidDatesMin($value, $dateTimeAsString)
+ {
+ // Conversion of dates to string differs between ICU versions
+ // Make sure we have the correct version loaded
+ IntlTestHelper::requireIntl($this, '57.1');
+
+ $constraint = new Range(array(
+ 'min' => 'March 10, 2014',
+ 'minMessage' => 'myMessage',
+ ));
+
+ $this->validator->validate($value, $constraint);
+
+ $this->buildViolation('myMessage')
+ ->setParameter('{{ value }}', $dateTimeAsString)
+ ->setParameter('{{ limit }}', 'Mar 10, 2014, 12:00 AM')
+ ->setCode(Range::TOO_LOW_ERROR)
+ ->assertRaised();
+ }
+
+ /**
+ * @dataProvider getLaterThanTwentiethMarch2014
+ */
+ public function testInvalidDatesMax($value, $dateTimeAsString)
+ {
+ // Conversion of dates to string differs between ICU versions
+ // Make sure we have the correct version loaded
+ IntlTestHelper::requireIntl($this, '57.1');
+
+ $constraint = new Range(array(
+ 'max' => 'March 20, 2014',
+ 'maxMessage' => 'myMessage',
+ ));
+
+ $this->validator->validate($value, $constraint);
+
+ $this->buildViolation('myMessage')
+ ->setParameter('{{ value }}', $dateTimeAsString)
+ ->setParameter('{{ limit }}', 'Mar 20, 2014, 12:00 AM')
+ ->setCode(Range::TOO_HIGH_ERROR)
+ ->assertRaised();
+ }
+
+ /**
+ * @dataProvider getLaterThanTwentiethMarch2014
+ */
+ public function testInvalidDatesCombinedMax($value, $dateTimeAsString)
+ {
+ // Conversion of dates to string differs between ICU versions
+ // Make sure we have the correct version loaded
+ IntlTestHelper::requireIntl($this, '57.1');
+
+ $constraint = new Range(array(
+ 'min' => 'March 10, 2014',
+ 'max' => 'March 20, 2014',
+ 'minMessage' => 'myMinMessage',
+ 'maxMessage' => 'myMaxMessage',
+ ));
+
+ $this->validator->validate($value, $constraint);
+
+ $this->buildViolation('myMaxMessage')
+ ->setParameter('{{ value }}', $dateTimeAsString)
+ ->setParameter('{{ limit }}', 'Mar 20, 2014, 12:00 AM')
+ ->setCode(Range::TOO_HIGH_ERROR)
+ ->assertRaised();
+ }
+
+ /**
+ * @dataProvider getSoonerThanTenthMarch2014
+ */
+ public function testInvalidDatesCombinedMin($value, $dateTimeAsString)
+ {
+ // Conversion of dates to string differs between ICU versions
+ // Make sure we have the correct version loaded
+ IntlTestHelper::requireIntl($this, '57.1');
+
+ $constraint = new Range(array(
+ 'min' => 'March 10, 2014',
+ 'max' => 'March 20, 2014',
+ 'minMessage' => 'myMinMessage',
+ 'maxMessage' => 'myMaxMessage',
+ ));
+
+ $this->validator->validate($value, $constraint);
+
+ $this->buildViolation('myMinMessage')
+ ->setParameter('{{ value }}', $dateTimeAsString)
+ ->setParameter('{{ limit }}', 'Mar 10, 2014, 12:00 AM')
+ ->setCode(Range::TOO_LOW_ERROR)
+ ->assertRaised();
+ }
+
+ public function getInvalidValues()
+ {
+ return array(
+ array(9.999999),
+ array(20.000001),
+ array('9.999999'),
+ array('20.000001'),
+ array(new \stdClass()),
+ );
+ }
+
+ public function testNonNumeric()
+ {
+ $this->validator->validate('abcd', new Range(array(
+ 'min' => 10,
+ 'max' => 20,
+ 'invalidMessage' => 'myMessage',
+ )));
+
+ $this->buildViolation('myMessage')
+ ->setParameter('{{ value }}', '"abcd"')
+ ->setCode(Range::INVALID_CHARACTERS_ERROR)
+ ->assertRaised();
+ }
+}