diff --git a/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterMappingsPass.php b/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterMappingsPass.php index ac3ce490aa..e56baa1e48 100644 --- a/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterMappingsPass.php +++ b/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterMappingsPass.php @@ -74,7 +74,7 @@ abstract class RegisterMappingsPass implements CompilerPassInterface * @param string[] $managerParameters list of container parameters * that could hold the manager name * @param string $driverPattern pattern to get the metadata driver service names - * @param string $enabledParameter service container parameter that must be + * @param string|false $enabledParameter service container parameter that must be * present to enable the mapping. Set to false * to not do any check, optional. */ diff --git a/src/Symfony/Component/Config/Definition/BaseNode.php b/src/Symfony/Component/Config/Definition/BaseNode.php index b9e48ce2a1..eb5ab59eeb 100644 --- a/src/Symfony/Component/Config/Definition/BaseNode.php +++ b/src/Symfony/Component/Config/Definition/BaseNode.php @@ -292,6 +292,7 @@ abstract class BaseNode implements NodeInterface * * @return mixed The finalized value * + * @throws Exception * @throws InvalidConfigurationException */ final public function finalize($value) diff --git a/src/Symfony/Component/Console/Application.php b/src/Symfony/Component/Console/Application.php index 41d8f93bbb..c4154fc934 100644 --- a/src/Symfony/Component/Console/Application.php +++ b/src/Symfony/Component/Console/Application.php @@ -874,6 +874,8 @@ class Application * @param OutputInterface $output An Output instance * * @return int 0 if everything went fine, or an error code + * + * @throws \Exception when the command being run threw an exception */ protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output) { diff --git a/src/Symfony/Component/Console/Helper/DescriptorHelper.php b/src/Symfony/Component/Console/Helper/DescriptorHelper.php index 932dd0f299..d58e0bf144 100644 --- a/src/Symfony/Component/Console/Helper/DescriptorHelper.php +++ b/src/Symfony/Component/Console/Helper/DescriptorHelper.php @@ -54,7 +54,7 @@ class DescriptorHelper extends Helper * @param object $object * @param array $options * - * @throws \InvalidArgumentException + * @throws \InvalidArgumentException when the given format is not supported */ public function describe(OutputInterface $output, $object, array $options = array()) { diff --git a/src/Symfony/Component/Console/Helper/DialogHelper.php b/src/Symfony/Component/Console/Helper/DialogHelper.php index 1ce4192df6..0362dd4d1d 100644 --- a/src/Symfony/Component/Console/Helper/DialogHelper.php +++ b/src/Symfony/Component/Console/Helper/DialogHelper.php @@ -328,7 +328,7 @@ class DialogHelper extends InputAwareHelper * @param OutputInterface $output An Output instance * @param string|array $question The question to ask * @param callable $validator A PHP callback - * @param int $attempts Max number of times to ask before giving up (false by default, which means infinite) + * @param int|false $attempts Max number of times to ask before giving up (false by default, which means infinite) * @param string $default The default answer if none is given by the user * @param array $autocomplete List of values to autocomplete * @@ -357,7 +357,7 @@ class DialogHelper extends InputAwareHelper * @param OutputInterface $output An Output instance * @param string|array $question The question to ask * @param callable $validator A PHP callback - * @param int $attempts Max number of times to ask before giving up (false by default, which means infinite) + * @param int|false $attempts Max number of times to ask before giving up (false by default, which means infinite) * @param bool $fallback In case the response can not be hidden, whether to fallback on non-hidden question or not * * @return string The response @@ -451,7 +451,7 @@ class DialogHelper extends InputAwareHelper * @param callable $interviewer A callable that will ask for a question and return the result * @param OutputInterface $output An Output instance * @param callable $validator A PHP callback - * @param int $attempts Max number of times to ask before giving up ; false will ask infinitely + * @param int|false $attempts Max number of times to ask before giving up ; false will ask infinitely * * @return string The validated response * diff --git a/src/Symfony/Component/Console/Helper/TableHelper.php b/src/Symfony/Component/Console/Helper/TableHelper.php index 76b5a08ae9..eeb670e882 100644 --- a/src/Symfony/Component/Console/Helper/TableHelper.php +++ b/src/Symfony/Component/Console/Helper/TableHelper.php @@ -44,6 +44,8 @@ class TableHelper extends Helper * @param int $layout self::LAYOUT_* * * @return TableHelper + * + * @throws InvalidArgumentException when the table layout is not known */ public function setLayout($layout) { diff --git a/src/Symfony/Component/Console/Tests/Command/ListCommandTest.php b/src/Symfony/Component/Console/Tests/Command/ListCommandTest.php index 1df06f5d94..ca50874912 100644 --- a/src/Symfony/Component/Console/Tests/Command/ListCommandTest.php +++ b/src/Symfony/Component/Console/Tests/Command/ListCommandTest.php @@ -50,7 +50,7 @@ EOF; public function testExecuteListsCommandsWithNamespaceArgument() { - require_once(realpath(__DIR__.'/../Fixtures/FooCommand.php')); + require_once realpath(__DIR__.'/../Fixtures/FooCommand.php'); $application = new Application(); $application->add(new \FooCommand()); $commandTester = new CommandTester($command = $application->get('list')); diff --git a/src/Symfony/Component/DependencyInjection/Container.php b/src/Symfony/Component/DependencyInjection/Container.php index b27df26442..3308d9f29a 100644 --- a/src/Symfony/Component/DependencyInjection/Container.php +++ b/src/Symfony/Component/DependencyInjection/Container.php @@ -197,6 +197,12 @@ class Container implements IntrospectableContainerInterface $id = strtolower($id); + if ('service_container' === $id) { + // BC: 'service_container' is no longer a self-reference but always + // $this, so ignore this call. + // @todo Throw InvalidArgumentException in next major release. + return; + } if (self::SCOPE_CONTAINER !== $scope) { if (!isset($this->scopedServices[$scope])) { throw new RuntimeException(sprintf('You cannot set service "%s" of inactive scope.', $id)); @@ -233,6 +239,10 @@ class Container implements IntrospectableContainerInterface { $id = strtolower($id); + if ('service_container' === $id) { + return true; + } + return isset($this->services[$id]) || array_key_exists($id, $this->services) || isset($this->aliases[$id]) @@ -251,9 +261,10 @@ class Container implements IntrospectableContainerInterface * * @return object The associated service * - * @throws InvalidArgumentException if the service is not defined + * @throws InvalidArgumentException if the service is not defined * @throws ServiceCircularReferenceException When a circular reference is detected - * @throws ServiceNotFoundException When the service is not defined + * @throws ServiceNotFoundException When the service is not defined + * @throws \Exception if an exception has been thrown when the service has been resolved * * @see Reference * @@ -269,6 +280,9 @@ class Container implements IntrospectableContainerInterface if ($strtolower) { $id = strtolower($id); } + if ('service_container' === $id) { + return $this; + } if (isset($this->aliases[$id])) { $id = $this->aliases[$id]; } @@ -340,6 +354,12 @@ class Container implements IntrospectableContainerInterface { $id = strtolower($id); + if ('service_container' === $id) { + // BC: 'service_container' was a synthetic service previously. + // @todo Change to false in next major release. + return true; + } + return isset($this->services[$id]) || array_key_exists($id, $this->services); } @@ -357,6 +377,7 @@ class Container implements IntrospectableContainerInterface $ids[] = self::underscore($match[1]); } } + $ids[] = 'service_container'; return array_unique(array_merge($ids, array_keys($this->services))); } diff --git a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php index f6c1a461de..b383fa0445 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php @@ -429,7 +429,10 @@ class PhpDumper extends Dumper * * @param string $id * @param Definition $definition + * * @return string + * + * @throws ServiceCircularReferenceException when the container contains a circular reference */ private function addServiceInlinedDefinitionsSetup($id, $definition) { @@ -640,6 +643,8 @@ EOF; * * @param string $id A service identifier * @param Definition $definition A Definition instance + * + * @return string|null */ private function addServiceSynchronizer($id, Definition $definition) { diff --git a/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php b/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php index 5580533458..54d30c4a6c 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php +++ b/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php @@ -248,6 +248,8 @@ class YamlFileLoader extends FileLoader * @param string $file * * @return array The file content + * + * @throws InvalidArgumentException when the given file is not a local file or when it does not exist */ protected function loadFile($file) { diff --git a/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php b/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php index 98b05d2501..8d5ea701a5 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php @@ -140,7 +140,7 @@ class PhpDumperTest extends \PHPUnit_Framework_TestCase eval('?>'.$dumper->dump(array('class' => 'Symfony_DI_PhpDumper_Test_Aliases'))); $container = new \Symfony_DI_PhpDumper_Test_Aliases(); - $container->set('foo', $foo = new \stdClass); + $container->set('foo', $foo = new \stdClass()); $this->assertSame($foo, $container->get('foo')); $this->assertSame($foo, $container->get('alias_for_foo')); $this->assertSame($foo, $container->get('alias_for_alias')); diff --git a/src/Symfony/Component/DomCrawler/Crawler.php b/src/Symfony/Component/DomCrawler/Crawler.php index 0b7200ace4..82579ed74b 100644 --- a/src/Symfony/Component/DomCrawler/Crawler.php +++ b/src/Symfony/Component/DomCrawler/Crawler.php @@ -889,7 +889,7 @@ class Crawler extends \SplObjectStorage $expression = $nonMatchingExpression; } elseif (0 === strpos($expression, 'descendant::')) { $expression = 'descendant-or-self::' . substr($expression, strlen('descendant::')); - } elseif (0 !== strpos($expression, 'descendant-or-self::')) { + } elseif (!preg_match('/^(ancestor|ancestor-or-self|attribute|child|descendant-or-self|following|following-sibling|parent|preceding|preceding-sibling|self)::/', $expression)) { $expression = 'self::' .$expression; } $expressions[] = $parenthesis.$expression; diff --git a/src/Symfony/Component/DomCrawler/Tests/CrawlerTest.php b/src/Symfony/Component/DomCrawler/Tests/CrawlerTest.php index 37b8d836f5..a87a867ea1 100644 --- a/src/Symfony/Component/DomCrawler/Tests/CrawlerTest.php +++ b/src/Symfony/Component/DomCrawler/Tests/CrawlerTest.php @@ -472,6 +472,74 @@ EOF $this->assertSame('Music', $crawler->text()); } + public function testFilterXPathWithAncestorAxis() + { + $crawler = $this->createTestCrawler()->filterXPath('//form'); + + $this->assertCount(2, $crawler->filterXPath('ancestor::*')); + } + + public function testFilterXPathWithAncestorOrSelfAxis() + { + $crawler = $this->createTestCrawler()->filterXPath('//form'); + + $this->assertCount(3, $crawler->filterXPath('ancestor-or-self::*')); + } + + public function testFilterXPathWithAttributeAxis() + { + $crawler = $this->createTestCrawler()->filterXPath('//form'); + + $this->assertCount(2, $crawler->filterXPath('attribute::*')); + } + + public function testFilterXPathWithChildAxis() + { + $crawler = $this->createTestCrawler()->filterXPath('//body'); + + $this->assertCount(2, $crawler->filterXPath('child::input')); + } + + public function testFilterXPathWithFollowingAxis() + { + $crawler = $this->createTestCrawler()->filterXPath('//a'); + + $this->assertCount(3, $crawler->filterXPath('following::div')); + } + + public function testFilterXPathWithFollowingSiblingAxis() + { + $crawler = $this->createTestCrawler()->filterXPath('//a'); + + $this->assertCount(2, $crawler->filterXPath('following-sibling::div')); + } + + public function testFilterXPathWithParentAxis() + { + $crawler = $this->createTestCrawler()->filterXPath('//button'); + + $this->assertEquals('foo', $crawler->filterXPath('parent::*')->attr('action')); + } + + public function testFilterXPathWithPrecedingAxis() + { + $crawler = $this->createTestCrawler()->filterXPath('//form'); + + $this->assertCount(13, $crawler->filterXPath('preceding::*')); + } + + public function testFilterXPathWithPrecedingSiblingAxis() + { + $crawler = $this->createTestCrawler()->filterXPath('//form'); + + $this->assertCount(9, $crawler->filterXPath('preceding-sibling::*')); + } + + public function testFilterXPathWithSelfAxes() + { + $this->assertCount(1, $this->createTestCrawler()->filterXPath('self::*')); + } + /** * @covers Symfony\Component\DomCrawler\Crawler::filter */ diff --git a/src/Symfony/Component/Form/ButtonBuilder.php b/src/Symfony/Component/Form/ButtonBuilder.php index 9302af4190..b02f8f5fe1 100644 --- a/src/Symfony/Component/Form/ButtonBuilder.php +++ b/src/Symfony/Component/Form/ButtonBuilder.php @@ -503,6 +503,8 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * * @param bool $initialize * + * @return ButtonBuilder + * * @throws BadMethodCallException */ public function setAutoInitialize($initialize) diff --git a/src/Symfony/Component/HttpFoundation/BinaryFileResponse.php b/src/Symfony/Component/HttpFoundation/BinaryFileResponse.php index 986dde1ac6..e9e4455c94 100644 --- a/src/Symfony/Component/HttpFoundation/BinaryFileResponse.php +++ b/src/Symfony/Component/HttpFoundation/BinaryFileResponse.php @@ -61,6 +61,8 @@ class BinaryFileResponse extends Response * @param null|string $contentDisposition The type of Content-Disposition to set automatically with the filename * @param bool $autoEtag Whether the ETag header should be automatically set * @param bool $autoLastModified Whether the Last-Modified header should be automatically set + * + * @return BinaryResponse The created response */ public static function create($file = null, $status = 200, $headers = array(), $public = true, $contentDisposition = null, $autoEtag = false, $autoLastModified = true) { diff --git a/src/Symfony/Component/HttpFoundation/Tests/ResponseTest.php b/src/Symfony/Component/HttpFoundation/Tests/ResponseTest.php index e513ffb351..1c97d4b762 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/ResponseTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/ResponseTest.php @@ -781,7 +781,7 @@ class ResponseTest extends ResponseTestCase public function invalidContentProvider() { return array( - 'obj' => array(new \stdClass), + 'obj' => array(new \stdClass()), 'array' => array(array()), 'bool' => array(true, '1'), ); diff --git a/src/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php b/src/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php index 5ed7ec5dba..27fa7eabec 100644 --- a/src/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php +++ b/src/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php @@ -97,7 +97,7 @@ class FragmentHandler * @return string|null The Response content or null when the Response is streamed * * @throws \InvalidArgumentException when the renderer does not exist - * @throws \LogicException when the Request is not successful + * @throws \LogicException when no master request is being handled */ public function render($uri, $renderer = 'inline', array $options = array()) { diff --git a/src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php b/src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php index f1c467d76b..89628cfd0f 100644 --- a/src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php @@ -1177,7 +1177,7 @@ class HttpCacheTest extends HttpCacheTestCase public function testEsiCacheRemoveValidationHeadersIfEmbeddedResponses() { - $time = new \DateTime; + $time = new \DateTime(); $responses = array( array( diff --git a/src/Symfony/Component/Process/Tests/ExecutableFinderTest.php b/src/Symfony/Component/Process/Tests/ExecutableFinderTest.php index 3b5bff26e9..5fbe1e0aa7 100644 --- a/src/Symfony/Component/Process/Tests/ExecutableFinderTest.php +++ b/src/Symfony/Component/Process/Tests/ExecutableFinderTest.php @@ -46,7 +46,7 @@ class ExecutableFinderTest extends \PHPUnit_Framework_TestCase $this->setPath(dirname(PHP_BINARY)); - $finder = new ExecutableFinder; + $finder = new ExecutableFinder(); $result = $finder->find($this->getPhpBinaryName()); $this->assertSamePath(PHP_BINARY, $result); @@ -62,7 +62,7 @@ class ExecutableFinderTest extends \PHPUnit_Framework_TestCase $this->setPath(''); - $finder = new ExecutableFinder; + $finder = new ExecutableFinder(); $result = $finder->find('foo', $expected); $this->assertEquals($expected, $result); @@ -82,7 +82,7 @@ class ExecutableFinderTest extends \PHPUnit_Framework_TestCase $extraDirs = array(dirname(PHP_BINARY)); - $finder = new ExecutableFinder; + $finder = new ExecutableFinder(); $result = $finder->find($this->getPhpBinaryName(), null, $extraDirs); $this->assertSamePath(PHP_BINARY, $result); @@ -104,7 +104,7 @@ class ExecutableFinderTest extends \PHPUnit_Framework_TestCase ini_set('open_basedir', dirname(PHP_BINARY).PATH_SEPARATOR.'/'); - $finder = new ExecutableFinder; + $finder = new ExecutableFinder(); $result = $finder->find($this->getPhpBinaryName()); $this->assertSamePath(PHP_BINARY, $result); diff --git a/src/Symfony/Component/Process/Tests/SimpleProcessTest.php b/src/Symfony/Component/Process/Tests/SimpleProcessTest.php index ee317ba2c4..cd206ea4c3 100644 --- a/src/Symfony/Component/Process/Tests/SimpleProcessTest.php +++ b/src/Symfony/Component/Process/Tests/SimpleProcessTest.php @@ -167,7 +167,7 @@ class SimpleProcessTest extends AbstractProcessTest $process = $this->getProcess('php -r "echo \'foo\'; sleep(1); echo \'bar\';"'); $process->run(function () use ($process) { if ($process->isRunning()) { - $process->signal(SIGKILL); + $process->signal(defined('SIGKILL') ? SIGKILL : 9); } }); } catch (RuntimeException $e) { @@ -183,7 +183,7 @@ class SimpleProcessTest extends AbstractProcessTest $process = $this->getProcess('php -r "echo \'foo\'; sleep(1); echo \'bar\';"'); $process->run(function () use ($process) { if ($process->isRunning()) { - $process->signal(SIGTERM); + $process->signal(defined('SIGTERM') ? SIGTERM : 15); } }); } catch (RuntimeException $e) { diff --git a/src/Symfony/Component/Security/Acl/Dbal/MutableAclProvider.php b/src/Symfony/Component/Security/Acl/Dbal/MutableAclProvider.php index 5f93845c98..4e634de40a 100644 --- a/src/Symfony/Component/Security/Acl/Dbal/MutableAclProvider.php +++ b/src/Symfony/Component/Security/Acl/Dbal/MutableAclProvider.php @@ -865,10 +865,10 @@ QUERY; } /** - * This process old entries changes on an ACE related property (classFieldAces, or objectFieldAces). + * This processes old entries changes on an ACE related property (classFieldAces, or objectFieldAces). * * @param string $name - * @param array $changes + * @param array $changes */ private function updateOldFieldAceProperty($name, array $changes) { diff --git a/src/Symfony/Component/Security/Core/Encoder/BCryptPasswordEncoder.php b/src/Symfony/Component/Security/Core/Encoder/BCryptPasswordEncoder.php index 1dcf3a6969..27a7334569 100644 --- a/src/Symfony/Component/Security/Core/Encoder/BCryptPasswordEncoder.php +++ b/src/Symfony/Component/Security/Core/Encoder/BCryptPasswordEncoder.php @@ -61,6 +61,8 @@ class BCryptPasswordEncoder extends BasePasswordEncoder * * @return string The encoded password * + * @throws BadCredentialsException when the given password is too long + * * @link http://lxr.php.net/xref/PHP_5_5/ext/standard/password.c#111 */ public function encodePassword($raw, $salt) diff --git a/src/Symfony/Component/Security/Core/Encoder/BasePasswordEncoder.php b/src/Symfony/Component/Security/Core/Encoder/BasePasswordEncoder.php index 97d707b124..0d29631f7a 100644 --- a/src/Symfony/Component/Security/Core/Encoder/BasePasswordEncoder.php +++ b/src/Symfony/Component/Security/Core/Encoder/BasePasswordEncoder.php @@ -89,7 +89,7 @@ abstract class BasePasswordEncoder implements PasswordEncoderInterface /** * Checks if the password is too long. * - * @param string $password The password + * @param string $password The password to check * * @return bool true if the password is too long, false otherwise */ diff --git a/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php index 9f2374266c..f4a1b9094b 100644 --- a/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php @@ -129,6 +129,18 @@ class GetSetMethodNormalizer extends SerializerAwareNormalizer implements Normal */ public function denormalize($data, $class, $format = null, array $context = array()) { + if (is_array($data) || is_object($data) && $data instanceof \ArrayAccess) { + $normalizedData = $data; + } elseif (is_object($data)) { + $normalizedData = array(); + + foreach ($data as $attribute => $value) { + $normalizedData[$attribute] = $value; + } + } else { + $normalizedData = array(); + } + $reflectionClass = new \ReflectionClass($class); $constructor = $reflectionClass->getConstructor(); @@ -139,10 +151,10 @@ class GetSetMethodNormalizer extends SerializerAwareNormalizer implements Normal foreach ($constructorParameters as $constructorParameter) { $paramName = lcfirst($this->formatAttribute($constructorParameter->name)); - if (isset($data[$paramName])) { - $params[] = $data[$paramName]; + if (isset($normalizedData[$paramName])) { + $params[] = $normalizedData[$paramName]; // don't run set for a parameter passed to the constructor - unset($data[$paramName]); + unset($normalizedData[$paramName]); } elseif ($constructorParameter->isOptional()) { $params[] = $constructorParameter->getDefaultValue(); } else { @@ -156,10 +168,10 @@ class GetSetMethodNormalizer extends SerializerAwareNormalizer implements Normal $object = $reflectionClass->newInstanceArgs($params); } else { - $object = new $class; + $object = new $class(); } - foreach ($data as $attribute => $value) { + foreach ($normalizedData as $attribute => $value) { $setter = 'set'.$this->formatAttribute($attribute); if (method_exists($object, $setter)) { diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php index 2ec68c0a0d..ba89a4c31d 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php @@ -17,6 +17,11 @@ use Symfony\Component\Serializer\Normalizer\NormalizerInterface; class GetSetMethodNormalizerTest extends \PHPUnit_Framework_TestCase { + /** + * @var GetSetMethodNormalizer + */ + private $normalizer; + protected function setUp() { $this->serializer = $this->getMock(__NAMESPACE__.'\SerializerNormalizer'); @@ -66,6 +71,17 @@ class GetSetMethodNormalizerTest extends \PHPUnit_Framework_TestCase $this->assertTrue($obj->isBaz()); } + public function testDenormalizeWithObject() + { + $data = new \stdClass(); + $data->foo = 'foo'; + $data->bar = 'bar'; + $data->fooBar = 'foobar'; + $obj = $this->normalizer->denormalize($data, __NAMESPACE__.'\GetSetDummy', 'any'); + $this->assertEquals('foo', $obj->getFoo()); + $this->assertEquals('bar', $obj->getBar()); + } + public function testDenormalizeOnCamelCaseFormat() { $this->normalizer->setCamelizedAttributes(array('camel_case')); @@ -76,6 +92,11 @@ class GetSetMethodNormalizerTest extends \PHPUnit_Framework_TestCase $this->assertEquals('camelCase', $obj->getCamelCase()); } + public function testDenormalizeNull() + { + $this->assertEquals(new GetSetDummy(), $this->normalizer->denormalize(null, __NAMESPACE__.'\GetSetDummy')); + } + /** * @dataProvider attributeProvider */ @@ -119,6 +140,18 @@ class GetSetMethodNormalizerTest extends \PHPUnit_Framework_TestCase $this->assertEquals(array(1, 2, 3), $obj->getBaz()); } + public function testConstructorWithObjectDenormalize() + { + $data = new \stdClass(); + $data->foo = 'foo'; + $data->bar = 'bar'; + $data->baz = true; + $data->fooBar = 'foobar'; + $obj = $this->normalizer->denormalize($data, __NAMESPACE__.'\GetConstructorDummy', 'any'); + $this->assertEquals('foo', $obj->getFoo()); + $this->assertEquals('bar', $obj->getBar()); + } + /** * @dataProvider provideCallbacks */ diff --git a/src/Symfony/Component/Validator/ConstraintValidator.php b/src/Symfony/Component/Validator/ConstraintValidator.php index 201db0f230..ac50f7e0e2 100644 --- a/src/Symfony/Component/Validator/ConstraintValidator.php +++ b/src/Symfony/Component/Validator/ConstraintValidator.php @@ -32,4 +32,110 @@ abstract class ConstraintValidator implements ConstraintValidatorInterface { $this->context = $context; } + + /** + * Returns a string representation of the type of the value. + * + * This method should be used if you pass the type of a value as + * message parameter to a constraint violation. Note that such + * parameters should usually not be included in messages aimed at + * non-technical people. + * + * @param mixed $value The value to return the type of + * + * @return string The type of the value + */ + protected function formatTypeOf($value) + { + return is_object($value) ? get_class($value) : gettype($value); + } + + /** + * Returns a string representation of the value. + * + * This method returns the equivalent PHP tokens for most scalar types + * (i.e. "false" for false, "1" for 1 etc.). Strings are always wrapped + * in double quotes ("). Objects, arrays and resources are formatted as + * "object", "array" and "resource". If the parameter $prettyDateTime + * is set to true, {@link \DateTime} objects will be formatted as + * RFC-3339 dates ("Y-m-d H:i:s"). + * + * Be careful when passing message parameters to a constraint violation + * that (may) contain objects, arrays or resources. These parameters + * should only be displayed for technical users. Non-technical users + * won't know what an "object", "array" or "resource" is and will be + * confused by the violation message. + * + * @param mixed $value The value to format as string + * @param bool $prettyDateTime Whether to format {@link \DateTime} + * objects as RFC-3339 dates ("Y-m-d H:i:s") + * + * @return string The string representation of the passed value + */ + protected function formatValue($value, $prettyDateTime = false) + { + if ($prettyDateTime && $value instanceof \DateTime) { + if (class_exists('IntlDateFormatter')) { + $locale = \Locale::getDefault(); + $formatter = new \IntlDateFormatter($locale, \IntlDateFormatter::MEDIUM, \IntlDateFormatter::SHORT); + + return $formatter->format($value); + } + + return $value->format('Y-m-d H:i:s'); + } + + if (is_object($value)) { + return 'object'; + } + + if (is_array($value)) { + return 'array'; + } + + if (is_string($value)) { + return '"'.$value.'"'; + } + + if (is_resource($value)) { + return 'resource'; + } + + if (null === $value) { + return 'null'; + } + + if (false === $value) { + return 'false'; + } + + if (true === $value) { + return 'true'; + } + + return (string) $value; + } + + /** + * Returns a string representation of a list of values. + * + * Each of the values is converted to a string using + * {@link formatValue()}. The values are then concatenated with commas. + * + * @param array $values A list of values + * @param bool $prettyDateTime Whether to format {@link \DateTime} + * objects as RFC-3339 dates ("Y-m-d H:i:s") + * + * @return string The string representation of the value list + * + * @see formatValue() + */ + protected function formatValues(array $values, $prettyDateTime = false) + { + foreach ($values as $key => $value) { + $values[$key] = $this->formatValue($value, $prettyDateTime); + } + + return implode(', ', $values); + } } diff --git a/src/Symfony/Component/Validator/ConstraintViolation.php b/src/Symfony/Component/Validator/ConstraintViolation.php index 12d29d54ff..d6a4e3095f 100644 --- a/src/Symfony/Component/Validator/ConstraintViolation.php +++ b/src/Symfony/Component/Validator/ConstraintViolation.php @@ -95,9 +95,9 @@ class ConstraintViolation implements ConstraintViolationInterface public function __toString() { if (is_object($this->root)) { - $class = get_class($this->root); + $class = 'Object('.get_class($this->root).')'; } elseif (is_array($this->root)) { - $class = "Array"; + $class = 'Array'; } else { $class = (string) $this->root; } diff --git a/src/Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php b/src/Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php index ceafae8a2f..6440570947 100644 --- a/src/Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php +++ b/src/Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php @@ -37,45 +37,13 @@ abstract class AbstractComparisonValidator extends ConstraintValidator if (!$this->compareValues($value, $constraint->value)) { $this->context->addViolation($constraint->message, array( - '{{ value }}' => $this->valueToString($constraint->value), - '{{ compared_value }}' => $this->valueToString($constraint->value), - '{{ compared_value_type }}' => $this->valueToType($constraint->value) + '{{ value }}' => $this->formatValue($value, true), + '{{ compared_value }}' => $this->formatValue($constraint->value, true), + '{{ compared_value_type }}' => $this->formatTypeOf($constraint->value) )); } } - /** - * Returns a string representation of the type of the value. - * - * @param mixed $value - * - * @return string - */ - private function valueToType($value) - { - return is_object($value) ? get_class($value) : gettype($value); - } - - /** - * Returns a string representation of the value. - * - * @param mixed $value - * - * @return string - */ - private function valueToString($value) - { - if (is_object($value) && method_exists($value, '__toString')) { - return (string) $value; - } - - if ($value instanceof \DateTime) { - return $value->format('Y-m-d H:i:s'); - } - - return var_export($value, true); - } - /** * Compares the two given values to find if their relationship is valid * diff --git a/src/Symfony/Component/Validator/Constraints/BlankValidator.php b/src/Symfony/Component/Validator/Constraints/BlankValidator.php index 553ba863a7..d1df32dad9 100644 --- a/src/Symfony/Component/Validator/Constraints/BlankValidator.php +++ b/src/Symfony/Component/Validator/Constraints/BlankValidator.php @@ -32,7 +32,9 @@ class BlankValidator extends ConstraintValidator } if ('' !== $value && null !== $value) { - $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value) + )); } } } diff --git a/src/Symfony/Component/Validator/Constraints/CardSchemeValidator.php b/src/Symfony/Component/Validator/Constraints/CardSchemeValidator.php index e38d814024..9f4c555aed 100644 --- a/src/Symfony/Component/Validator/Constraints/CardSchemeValidator.php +++ b/src/Symfony/Component/Validator/Constraints/CardSchemeValidator.php @@ -113,7 +113,9 @@ class CardSchemeValidator extends ConstraintValidator } if (!is_numeric($value)) { - $this->context->addViolation($constraint->message); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); return; } @@ -129,6 +131,8 @@ class CardSchemeValidator extends ConstraintValidator } } - $this->context->addViolation($constraint->message); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } diff --git a/src/Symfony/Component/Validator/Constraints/ChoiceValidator.php b/src/Symfony/Component/Validator/Constraints/ChoiceValidator.php index 4bfe206209..8a12863463 100644 --- a/src/Symfony/Component/Validator/Constraints/ChoiceValidator.php +++ b/src/Symfony/Component/Validator/Constraints/ChoiceValidator.php @@ -64,7 +64,7 @@ class ChoiceValidator extends ConstraintValidator foreach ($value as $_value) { if (!in_array($_value, $choices, $constraint->strict)) { $this->context->buildViolation($constraint->multipleMessage) - ->setParameter('{{ value }}', $_value) + ->setParameter('{{ value }}', $this->formatValue($_value)) ->addViolation(); } } @@ -90,7 +90,7 @@ class ChoiceValidator extends ConstraintValidator } } elseif (!in_array($value, $choices, $constraint->strict)) { $this->context->buildViolation($constraint->message) - ->setParameter('{{ value }}', $value) + ->setParameter('{{ value }}', $this->formatValue($value)) ->addViolation(); } } diff --git a/src/Symfony/Component/Validator/Constraints/CollectionValidator.php b/src/Symfony/Component/Validator/Constraints/CollectionValidator.php index c345601b91..9681da0e22 100644 --- a/src/Symfony/Component/Validator/Constraints/CollectionValidator.php +++ b/src/Symfony/Component/Validator/Constraints/CollectionValidator.php @@ -65,7 +65,7 @@ class CollectionValidator extends ConstraintValidator } elseif (!$fieldConstraint instanceof Optional && !$constraint->allowMissingFields) { $context->buildViolation($constraint->missingFieldsMessage) ->atPath('['.$field.']') - ->setParameter('{{ field }}', $field) + ->setParameter('{{ field }}', $this->formatValue($field)) ->setInvalidValue(null) ->addViolation(); } @@ -76,7 +76,7 @@ class CollectionValidator extends ConstraintValidator if (!isset($constraint->fields[$field])) { $context->buildViolation($constraint->extraFieldsMessage) ->atPath('['.$field.']') - ->setParameter('{{ field }}', $field) + ->setParameter('{{ field }}', $this->formatValue($field)) ->setInvalidValue($fieldValue) ->addViolation(); } diff --git a/src/Symfony/Component/Validator/Constraints/CountryValidator.php b/src/Symfony/Component/Validator/Constraints/CountryValidator.php index 9c443033d7..92049db54d 100644 --- a/src/Symfony/Component/Validator/Constraints/CountryValidator.php +++ b/src/Symfony/Component/Validator/Constraints/CountryValidator.php @@ -46,7 +46,9 @@ class CountryValidator extends ConstraintValidator $countries = Intl::getRegionBundle()->getCountryNames(); if (!isset($countries[$value])) { - $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } } diff --git a/src/Symfony/Component/Validator/Constraints/CurrencyValidator.php b/src/Symfony/Component/Validator/Constraints/CurrencyValidator.php index b88f3e8e9f..92989ac99e 100644 --- a/src/Symfony/Component/Validator/Constraints/CurrencyValidator.php +++ b/src/Symfony/Component/Validator/Constraints/CurrencyValidator.php @@ -46,7 +46,9 @@ class CurrencyValidator extends ConstraintValidator $currencies = Intl::getCurrencyBundle()->getCurrencyNames(); if (!isset($currencies[$value])) { - $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } } diff --git a/src/Symfony/Component/Validator/Constraints/DateTimeValidator.php b/src/Symfony/Component/Validator/Constraints/DateTimeValidator.php index 7f4c3f8b9b..14634b3051 100644 --- a/src/Symfony/Component/Validator/Constraints/DateTimeValidator.php +++ b/src/Symfony/Component/Validator/Constraints/DateTimeValidator.php @@ -43,7 +43,9 @@ class DateTimeValidator extends DateValidator $value = (string) $value; if (!preg_match(static::PATTERN, $value, $matches) || !checkdate($matches[2], $matches[3], $matches[1])) { - $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } } diff --git a/src/Symfony/Component/Validator/Constraints/DateValidator.php b/src/Symfony/Component/Validator/Constraints/DateValidator.php index 307c8d5418..7edc59c5c7 100644 --- a/src/Symfony/Component/Validator/Constraints/DateValidator.php +++ b/src/Symfony/Component/Validator/Constraints/DateValidator.php @@ -44,7 +44,9 @@ class DateValidator extends ConstraintValidator $value = (string) $value; if (!preg_match(static::PATTERN, $value, $matches) || !checkdate($matches[2], $matches[3], $matches[1])) { - $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } } diff --git a/src/Symfony/Component/Validator/Constraints/EmailValidator.php b/src/Symfony/Component/Validator/Constraints/EmailValidator.php index 8263577f7f..2b56766bd7 100644 --- a/src/Symfony/Component/Validator/Constraints/EmailValidator.php +++ b/src/Symfony/Component/Validator/Constraints/EmailValidator.php @@ -78,7 +78,9 @@ class EmailValidator extends ConstraintValidator } if (!$valid) { - $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } diff --git a/src/Symfony/Component/Validator/Constraints/FalseValidator.php b/src/Symfony/Component/Validator/Constraints/FalseValidator.php index 175cf7ed0a..d798ebfbb9 100644 --- a/src/Symfony/Component/Validator/Constraints/FalseValidator.php +++ b/src/Symfony/Component/Validator/Constraints/FalseValidator.php @@ -35,6 +35,8 @@ class FalseValidator extends ConstraintValidator return; } - $this->context->addViolation($constraint->message); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } diff --git a/src/Symfony/Component/Validator/Constraints/FileValidator.php b/src/Symfony/Component/Validator/Constraints/FileValidator.php index aa81ba25c1..8b9b326fb0 100644 --- a/src/Symfony/Component/Validator/Constraints/FileValidator.php +++ b/src/Symfony/Component/Validator/Constraints/FileValidator.php @@ -110,13 +110,17 @@ class FileValidator extends ConstraintValidator $path = $value instanceof FileObject ? $value->getPathname() : (string) $value; if (!is_file($path)) { - $this->context->addViolation($constraint->notFoundMessage, array('{{ file }}' => $path)); + $this->context->addViolation($constraint->notFoundMessage, array( + '{{ file }}' => $this->formatValue($path) + )); return; } if (!is_readable($path)) { - $this->context->addViolation($constraint->notReadableMessage, array('{{ file }}' => $path)); + $this->context->addViolation($constraint->notReadableMessage, array( + '{{ file }}' => $this->formatValue($path) + )); return; } @@ -158,10 +162,10 @@ class FileValidator extends ConstraintValidator } $this->context->addViolation($constraint->maxSizeMessage, array( - '{{ size }}' => $sizeAsString, - '{{ limit }}' => $limitAsString, - '{{ suffix }}' => self::$suffices[$coef], - '{{ file }}' => $path, + '{{ size }}' => $sizeAsString, + '{{ limit }}' => $limitAsString, + '{{ suffix }}' => self::$suffices[$coef], + '{{ file }}' => $this->formatValue($path), )); return; @@ -193,9 +197,9 @@ class FileValidator extends ConstraintValidator if (false === $valid) { $this->context->addViolation($constraint->mimeTypesMessage, array( - '{{ type }}' => '"'.$mime.'"', - '{{ types }}' => '"'.implode('", "', $mimeTypes) .'"', - '{{ file }}' => $path, + '{{ type }}' => $this->formatValue($mime), + '{{ types }}' => $this->formatValues($mimeTypes), + '{{ file }}' => $this->formatValue($path), )); } } diff --git a/src/Symfony/Component/Validator/Constraints/IbanValidator.php b/src/Symfony/Component/Validator/Constraints/IbanValidator.php index 288afe659c..2276789c31 100644 --- a/src/Symfony/Component/Validator/Constraints/IbanValidator.php +++ b/src/Symfony/Component/Validator/Constraints/IbanValidator.php @@ -18,6 +18,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; /** * @author Manuel Reinhard * @author Michael Schummel + * @author Bernhard Schussek * @link http://www.michael-schummel.de/2007/10/05/iban-prufung-mit-php/ */ class IbanValidator extends ConstraintValidator @@ -35,41 +36,100 @@ class IbanValidator extends ConstraintValidator return; } - // An IBAN without a country code is not an IBAN. - if (0 === preg_match('/[A-Z]/', $value)) { - $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); + if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) { + throw new UnexpectedTypeException($value, 'string'); + } + + $value = (string) $value; + + // Remove spaces + $canonicalized = str_replace(' ', '', $value); + + if (strlen($canonicalized) < 4) { + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); return; } - $teststring = preg_replace('/\s+/', '', $value); - - if (strlen($teststring) < 4) { - $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); + // The IBAN must have at least 4 characters, start with a country + // code and contain only digits and (uppercase) characters + if (strlen($canonicalized) < 4 || !ctype_upper($canonicalized{0}) + || !ctype_upper($canonicalized{1}) || !ctype_alnum($canonicalized)) { + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); return; } - $teststring = substr($teststring, 4) - .strval(ord($teststring{0}) - 55) - .strval(ord($teststring{1}) - 55) - .substr($teststring, 2, 2); + // Move the first four characters to the end + // e.g. CH93 0076 2011 6238 5295 7 + // -> 0076 2011 6238 5295 7 CH93 + $canonicalized = substr($canonicalized, 4).substr($canonicalized, 0, 4); - $teststring = preg_replace_callback('/[A-Z]/', function ($letter) { - return intval(ord(strtolower($letter[0])) - 87); - }, $teststring); + // Convert all remaining letters to their ordinals + // The result is an integer, which is too large for PHP's int + // data type, so we store it in a string instead. + // e.g. 0076 2011 6238 5295 7 CH93 + // -> 0076 2011 6238 5295 7 121893 + $checkSum = $this->toBigInt($canonicalized); - $rest = 0; - $strlen = strlen($teststring); - for ($pos = 0; $pos < $strlen; $pos += 7) { - $part = strval($rest).substr($teststring, $pos, 7); - $rest = intval($part) % 97; + if (false === $checkSum) { + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); + + return; } - if ($rest != 1) { - $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); + // Do a modulo-97 operation on the large integer + // We cannot use PHP's modulo operator, so we calculate the + // modulo step-wisely instead + if (1 !== $this->bigModulo97($checkSum)) { + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); return; } } + + private function toBigInt($string) + { + $chars = str_split($string); + $bigInt = ''; + + foreach ($chars as $char) { + // Convert uppercase characters to ordinals, starting with 10 for "A" + if (ctype_upper($char)) { + $bigInt .= (ord($char) - 55); + + continue; + } + + // Disallow lowercase characters + if (ctype_lower($char)) { + return false; + } + + // Simply append digits + $bigInt .= $char; + } + + return $bigInt; + } + + private function bigModulo97($bigInt) + { + $parts = str_split($bigInt, 7); + $rest = 0; + + foreach ($parts as $part) { + $rest = ($rest.$part) % 97; + } + + return $rest; + } } diff --git a/src/Symfony/Component/Validator/Constraints/IpValidator.php b/src/Symfony/Component/Validator/Constraints/IpValidator.php index 25a46f62b9..69286e90f9 100644 --- a/src/Symfony/Component/Validator/Constraints/IpValidator.php +++ b/src/Symfony/Component/Validator/Constraints/IpValidator.php @@ -95,7 +95,9 @@ class IpValidator extends ConstraintValidator } if (!filter_var($value, FILTER_VALIDATE_IP, $flag)) { - $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } } diff --git a/src/Symfony/Component/Validator/Constraints/IsbnValidator.php b/src/Symfony/Component/Validator/Constraints/IsbnValidator.php index 49193d5e51..ca3673e9a6 100644 --- a/src/Symfony/Component/Validator/Constraints/IsbnValidator.php +++ b/src/Symfony/Component/Validator/Constraints/IsbnValidator.php @@ -20,6 +20,8 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; * * @author The Whole Life To Learn * @author Manuel Reinhard + * @author Bernhard Schussek + * * @see https://en.wikipedia.org/wiki/Isbn */ class IsbnValidator extends ConstraintValidator @@ -41,89 +43,75 @@ class IsbnValidator extends ConstraintValidator throw new UnexpectedTypeException($value, 'string'); } - if (!is_numeric($value)) { - $value = str_replace('-', '', $value); - } + $value = (string) $value; + $canonical = str_replace('-', '', $value); if (null == $constraint->type) { if ($constraint->isbn10 && !$constraint->isbn13) { $constraint->type = 'isbn10'; - $value = strtoupper($value); } elseif ($constraint->isbn13 && !$constraint->isbn10) { $constraint->type = 'isbn13'; - $value = strtoupper($value); } } - if ('isbn10' === $constraint->type) { - if (!$this->validateIsbn10($value)) { - $this->context->addViolation($this->getMessage($constraint, 'isbn10')); - - return; - } - } elseif ('isbn13' === $constraint->type) { - if (!$this->validateIsbn13($value)) { - $this->context->addViolation($this->getMessage($constraint, 'isbn13')); - - return; - } - } else { - if (!$this->validateIsbn10($value) && !$this->validateIsbn13($value)) { - $this->context->addViolation($this->getMessage($constraint)); - - return; - } + if ('isbn10' === $constraint->type && !$this->validateIsbn10($canonical)) { + $this->context->addViolation($this->getMessage($constraint, 'isbn10'), array( + '{{ value }}' => $this->formatValue($value), + )); + } elseif ('isbn13' === $constraint->type && !$this->validateIsbn13($canonical)) { + $this->context->addViolation($this->getMessage($constraint, 'isbn13'), array( + '{{ value }}' => $this->formatValue($value), + )); + } elseif (!$this->validateIsbn10($canonical) && !$this->validateIsbn13($canonical)) { + $this->context->addViolation($this->getMessage($constraint), array( + '{{ value }}' => $this->formatValue($value), + )); } } - protected function validateIsbn10($value) + protected function validateIsbn10($isbn) { - $validation = 0; - $valueLength = strlen($value); - - if (10 === $valueLength) { - for ($i = 0; $i < 10; $i++) { - if ($value[$i] == 'X') { - $validation += 10 * intval(10 - $i); - } else { - $validation += intval($value[$i]) * intval(10 - $i); - } - } - - if ($validation % 11 != 0) { - return false; - } else { - return true; - } + if (10 !== strlen($isbn)) { + return false; } - return false; + $checkSum = 0; + + for ($i = 0; $i < 10; ++$i) { + if ('X' === $isbn{$i}) { + $digit = 10; + } elseif (ctype_digit($isbn{$i})) { + $digit = $isbn{$i}; + } else { + return false; + } + + $checkSum += $digit * intval(10 - $i); + } + + return 0 === $checkSum % 11; } - protected function validateIsbn13($value) + protected function validateIsbn13($isbn) { - $validation = 0; - $valueLength = strlen($value); - - if (13 === $valueLength) { - for ($i = 0; $i < 13; $i += 2) { - $validation += intval($value[$i]); - } - for ($i = 1; $i < 12; $i += 2) { - $validation += intval($value[$i]) * 3; - } - - if ($validation % 10 != 0) { - return false; - } else { - return true; - } + if (13 !== strlen($isbn) || !ctype_digit($isbn)) { + return false; } - return false; + $checkSum = 0; + + for ($i = 0; $i < 13; $i += 2) { + $checkSum += $isbn{$i}; + } + + for ($i = 1; $i < 12; $i += 2) { + $checkSum += $isbn{$i} * 3; + } + + return 0 === $checkSum % 10; } - protected function getMessage($constraint, $type=null) + protected function getMessage($constraint, $type = null) { if (null !== $constraint->message) { return $constraint->message; @@ -131,8 +119,8 @@ class IsbnValidator extends ConstraintValidator return $constraint->isbn10Message; } elseif ($type == 'isbn13') { return $constraint->isbn13Message; - } else { - return $constraint->bothIsbnMessage; } + + return $constraint->bothIsbnMessage; } } diff --git a/src/Symfony/Component/Validator/Constraints/IssnValidator.php b/src/Symfony/Component/Validator/Constraints/IssnValidator.php index 73295d07ce..dc3dd28c6d 100644 --- a/src/Symfony/Component/Validator/Constraints/IssnValidator.php +++ b/src/Symfony/Component/Validator/Constraints/IssnValidator.php @@ -41,26 +41,35 @@ class IssnValidator extends ConstraintValidator throw new UnexpectedTypeException($value, 'string'); } + $value = (string) $value; + // Compose regex pattern $digitsPattern = $constraint->requireHyphen ? '\d{4}-\d{3}' : '\d{4}-?\d{3}'; - $checksumPattern = $constraint->caseSensitive ? '[\d|X]' : '[\d|X|x]'; - $pattern = "/^".$digitsPattern.$checksumPattern."$/"; + $checkSumPattern = $constraint->caseSensitive ? '[\d|X]' : '[\d|X|x]'; + $pattern = "/^".$digitsPattern.$checkSumPattern."$/"; if (!preg_match($pattern, $value)) { - $this->context->addViolation($constraint->message); - } else { - $digits = str_split(strtoupper(str_replace('-', '', $value))); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); - $sum = 0; - for ($i = 8; $i > 1; $i--) { - $sum += $i * (int) array_shift($digits); - } + return; + } - $checksum = 'X' == reset($digits) ? 10 : (int) reset($digits); + $canonical = strtoupper(str_replace('-', '', $value)); - if (0 != ($sum + $checksum) % 11) { - $this->context->addViolation($constraint->message); - } + // Calculate a checksum. "X" equals 10. + $checkSum = 'X' === $canonical{7} ? 10 : $canonical{7}; + + for ($i = 0; $i < 7; ++$i) { + // Multiply the first digit by 8, the second by 7, etc. + $checkSum += (8-$i) * $canonical{$i}; + } + + if (0 !== $checkSum % 11) { + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } } diff --git a/src/Symfony/Component/Validator/Constraints/LanguageValidator.php b/src/Symfony/Component/Validator/Constraints/LanguageValidator.php index 7ca121b577..3286f26b86 100644 --- a/src/Symfony/Component/Validator/Constraints/LanguageValidator.php +++ b/src/Symfony/Component/Validator/Constraints/LanguageValidator.php @@ -46,7 +46,9 @@ class LanguageValidator extends ConstraintValidator $languages = Intl::getLanguageBundle()->getLanguageNames(); if (!isset($languages[$value])) { - $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } } diff --git a/src/Symfony/Component/Validator/Constraints/LegacyChoiceValidator.php b/src/Symfony/Component/Validator/Constraints/LegacyChoiceValidator.php index 68f4faf507..4f1355eadd 100644 --- a/src/Symfony/Component/Validator/Constraints/LegacyChoiceValidator.php +++ b/src/Symfony/Component/Validator/Constraints/LegacyChoiceValidator.php @@ -63,25 +63,33 @@ class LegacyChoiceValidator extends ConstraintValidator if ($constraint->multiple) { foreach ($value as $_value) { if (!in_array($_value, $choices, $constraint->strict)) { - $this->context->addViolation($constraint->multipleMessage, array('{{ value }}' => $_value)); + $this->context->addViolation($constraint->multipleMessage, array( + '{{ value }}' => $this->formatValue($_value), + )); } } $count = count($value); if ($constraint->min !== null && $count < $constraint->min) { - $this->context->addViolation($constraint->minMessage, array('{{ limit }}' => $constraint->min), $value, (int) $constraint->min); + $this->context->addViolation($constraint->minMessage, array( + '{{ limit }}' => $constraint->min + ), $value, (int) $constraint->min); return; } if ($constraint->max !== null && $count > $constraint->max) { - $this->context->addViolation($constraint->maxMessage, array('{{ limit }}' => $constraint->max), $value, (int) $constraint->max); + $this->context->addViolation($constraint->maxMessage, array( + '{{ limit }}' => $constraint->max + ), $value, (int) $constraint->max); return; } } elseif (!in_array($value, $choices, $constraint->strict)) { - $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } } diff --git a/src/Symfony/Component/Validator/Constraints/LegacyCollectionValidator.php b/src/Symfony/Component/Validator/Constraints/LegacyCollectionValidator.php index cc1067439e..9de9613c9c 100644 --- a/src/Symfony/Component/Validator/Constraints/LegacyCollectionValidator.php +++ b/src/Symfony/Component/Validator/Constraints/LegacyCollectionValidator.php @@ -62,7 +62,7 @@ class LegacyCollectionValidator extends ConstraintValidator } } elseif (!$fieldConstraint instanceof Optional && !$constraint->allowMissingFields) { $context->addViolationAt('['.$field.']', $constraint->missingFieldsMessage, array( - '{{ field }}' => $field + '{{ field }}' => $this->formatValue($field) ), null); } } @@ -71,7 +71,7 @@ class LegacyCollectionValidator extends ConstraintValidator foreach ($value as $field => $fieldValue) { if (!isset($constraint->fields[$field])) { $context->addViolationAt('['.$field.']', $constraint->extraFieldsMessage, array( - '{{ field }}' => $field + '{{ field }}' => $this->formatValue($field) ), $fieldValue); } } diff --git a/src/Symfony/Component/Validator/Constraints/LegacyLengthValidator.php b/src/Symfony/Component/Validator/Constraints/LegacyLengthValidator.php index 2d2b8f8d34..2c45625ec7 100644 --- a/src/Symfony/Component/Validator/Constraints/LegacyLengthValidator.php +++ b/src/Symfony/Component/Validator/Constraints/LegacyLengthValidator.php @@ -51,7 +51,7 @@ class LegacyLengthValidator extends ConstraintValidator if ($constraint->min == $constraint->max && $length != $constraint->min) { $this->context->addViolation($constraint->exactMessage, array( - '{{ value }}' => $stringValue, + '{{ value }}' => $this->formatValue($stringValue), '{{ limit }}' => $constraint->min, ), $value, (int) $constraint->min); @@ -60,7 +60,7 @@ class LegacyLengthValidator extends ConstraintValidator if (null !== $constraint->max && $length > $constraint->max) { $this->context->addViolation($constraint->maxMessage, array( - '{{ value }}' => $stringValue, + '{{ value }}' => $this->formatValue($stringValue), '{{ limit }}' => $constraint->max, ), $value, (int) $constraint->max); @@ -69,7 +69,7 @@ class LegacyLengthValidator extends ConstraintValidator if (null !== $constraint->min && $length < $constraint->min) { $this->context->addViolation($constraint->minMessage, array( - '{{ value }}' => $stringValue, + '{{ value }}' => $this->formatValue($stringValue), '{{ limit }}' => $constraint->min, ), $value, (int) $constraint->min); } diff --git a/src/Symfony/Component/Validator/Constraints/LengthValidator.php b/src/Symfony/Component/Validator/Constraints/LengthValidator.php index df849544b3..c82508852e 100644 --- a/src/Symfony/Component/Validator/Constraints/LengthValidator.php +++ b/src/Symfony/Component/Validator/Constraints/LengthValidator.php @@ -49,7 +49,7 @@ class LengthValidator extends ConstraintValidator if ($constraint->min == $constraint->max && $length != $constraint->min) { $this->context->buildViolation($constraint->exactMessage) - ->setParameter('{{ value }}', $stringValue) + ->setParameter('{{ value }}', $this->formatValue($stringValue)) ->setParameter('{{ limit }}', $constraint->min) ->setInvalidValue($value) ->setPlural((int) $constraint->min) @@ -60,7 +60,7 @@ class LengthValidator extends ConstraintValidator if (null !== $constraint->max && $length > $constraint->max) { $this->context->buildViolation($constraint->maxMessage) - ->setParameter('{{ value }}', $stringValue) + ->setParameter('{{ value }}', $this->formatValue($stringValue)) ->setParameter('{{ limit }}', $constraint->max) ->setInvalidValue($value) ->setPlural((int) $constraint->max) @@ -71,7 +71,7 @@ class LengthValidator extends ConstraintValidator if (null !== $constraint->min && $length < $constraint->min) { $this->context->buildViolation($constraint->minMessage) - ->setParameter('{{ value }}', $stringValue) + ->setParameter('{{ value }}', $this->formatValue($stringValue)) ->setParameter('{{ limit }}', $constraint->min) ->setInvalidValue($value) ->setPlural((int) $constraint->min) diff --git a/src/Symfony/Component/Validator/Constraints/LocaleValidator.php b/src/Symfony/Component/Validator/Constraints/LocaleValidator.php index ff03b048b0..08f1d1d0a5 100644 --- a/src/Symfony/Component/Validator/Constraints/LocaleValidator.php +++ b/src/Symfony/Component/Validator/Constraints/LocaleValidator.php @@ -46,7 +46,9 @@ class LocaleValidator extends ConstraintValidator $locales = Intl::getLocaleBundle()->getLocaleNames(); if (!isset($locales[$value])) { - $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } } diff --git a/src/Symfony/Component/Validator/Constraints/LuhnValidator.php b/src/Symfony/Component/Validator/Constraints/LuhnValidator.php index 2823b4f3a1..a149aa9a81 100644 --- a/src/Symfony/Component/Validator/Constraints/LuhnValidator.php +++ b/src/Symfony/Component/Validator/Constraints/LuhnValidator.php @@ -24,14 +24,17 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; * @see http://en.wikipedia.org/wiki/Luhn_algorithm * @author Tim Nagel * @author Greg Knapp http://gregk.me/2011/php-implementation-of-bank-card-luhn-algorithm/ + * @author Bernhard Schussek */ class LuhnValidator extends ConstraintValidator { /** - * Validates a creditcard number with the Luhn algorithm. + * Validates a credit card number with the Luhn algorithm. * * @param mixed $value * @param Constraint $constraint + * + * @throws UnexpectedTypeException when the given credit card number is no string */ public function validate($value, Constraint $constraint) { @@ -43,28 +46,48 @@ class LuhnValidator extends ConstraintValidator return; } - /** - * need to work with strings only because long numbers are treated as floats and don't work with strlen - */ - if (!is_string($value)) { + // Work with strings only, because long numbers are represented as floats + // internally and don't work with strlen() + if (!is_string($value) && !(is_object($value) && method_exists($value, '__toString'))) { throw new UnexpectedTypeException($value, 'string'); } - if (!is_numeric($value)) { - $this->context->addViolation($constraint->message); + $value = (string) $value; + + if (!ctype_digit($value)) { + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); return; } + $checkSum = 0; $length = strlen($value); - $oddLength = $length % 2; - for ($sum = 0, $i = $length - 1; $i >= 0; $i--) { - $digit = (int) $value[$i]; - $sum += (($i % 2) === $oddLength) ? array_sum(str_split($digit * 2)) : $digit; + + // Starting with the last digit and walking left, add every second + // digit to the check sum + // e.g. 7 9 9 2 7 3 9 8 7 1 3 + // ^ ^ ^ ^ ^ ^ + // = 7 + 9 + 7 + 9 + 7 + 3 + for ($i = $length - 1; $i >= 0; $i -= 2) { + $checkSum += $value{$i}; } - if ($sum === 0 || ($sum % 10) !== 0) { - $this->context->addViolation($constraint->message); + // Starting with the second last digit and walking left, double every + // second digit and add it to the check sum + // For doubles greater than 9, sum the individual digits + // e.g. 7 9 9 2 7 3 9 8 7 1 3 + // ^ ^ ^ ^ ^ + // = 1+8 + 4 + 6 + 1+6 + 2 + for ($i = $length - 2; $i >= 0; $i -= 2) { + $checkSum += array_sum(str_split($value{$i} * 2)); + } + + if (0 === $checkSum || 0 !== $checkSum % 10) { + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } } diff --git a/src/Symfony/Component/Validator/Constraints/NotBlankValidator.php b/src/Symfony/Component/Validator/Constraints/NotBlankValidator.php index 1fe94e1e7f..e76135623a 100644 --- a/src/Symfony/Component/Validator/Constraints/NotBlankValidator.php +++ b/src/Symfony/Component/Validator/Constraints/NotBlankValidator.php @@ -32,7 +32,9 @@ class NotBlankValidator extends ConstraintValidator } if (false === $value || (empty($value) && '0' != $value)) { - $this->context->addViolation($constraint->message); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } } diff --git a/src/Symfony/Component/Validator/Constraints/NullValidator.php b/src/Symfony/Component/Validator/Constraints/NullValidator.php index 76d9f60c8f..645ffc034b 100644 --- a/src/Symfony/Component/Validator/Constraints/NullValidator.php +++ b/src/Symfony/Component/Validator/Constraints/NullValidator.php @@ -32,13 +32,9 @@ class NullValidator extends ConstraintValidator } if (null !== $value) { - if (is_object($value)) { - $value = get_class($value); - } elseif (is_array($value)) { - $value = 'Array'; - } - - $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } } diff --git a/src/Symfony/Component/Validator/Constraints/RangeValidator.php b/src/Symfony/Component/Validator/Constraints/RangeValidator.php index da2791deea..c7bf7a93bc 100644 --- a/src/Symfony/Component/Validator/Constraints/RangeValidator.php +++ b/src/Symfony/Component/Validator/Constraints/RangeValidator.php @@ -35,7 +35,7 @@ class RangeValidator extends ConstraintValidator if (!is_numeric($value)) { $this->context->addViolation($constraint->invalidMessage, array( - '{{ value }}' => $value, + '{{ value }}' => $this->formatValue($value), )); return; diff --git a/src/Symfony/Component/Validator/Constraints/RegexValidator.php b/src/Symfony/Component/Validator/Constraints/RegexValidator.php index c5864c43a4..88b19d023d 100644 --- a/src/Symfony/Component/Validator/Constraints/RegexValidator.php +++ b/src/Symfony/Component/Validator/Constraints/RegexValidator.php @@ -45,7 +45,9 @@ class RegexValidator extends ConstraintValidator $value = (string) $value; if ($constraint->match xor preg_match($constraint->pattern, $value)) { - $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } } diff --git a/src/Symfony/Component/Validator/Constraints/TimeValidator.php b/src/Symfony/Component/Validator/Constraints/TimeValidator.php index 6a61e4941d..cf252b1d28 100644 --- a/src/Symfony/Component/Validator/Constraints/TimeValidator.php +++ b/src/Symfony/Component/Validator/Constraints/TimeValidator.php @@ -44,7 +44,9 @@ class TimeValidator extends ConstraintValidator $value = (string) $value; if (!preg_match(static::PATTERN, $value)) { - $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } } diff --git a/src/Symfony/Component/Validator/Constraints/TrueValidator.php b/src/Symfony/Component/Validator/Constraints/TrueValidator.php index 366db0fce1..ef0e2608ef 100644 --- a/src/Symfony/Component/Validator/Constraints/TrueValidator.php +++ b/src/Symfony/Component/Validator/Constraints/TrueValidator.php @@ -36,7 +36,9 @@ class TrueValidator extends ConstraintValidator } if (true !== $value && 1 !== $value && '1' !== $value) { - $this->context->addViolation($constraint->message); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } } diff --git a/src/Symfony/Component/Validator/Constraints/TypeValidator.php b/src/Symfony/Component/Validator/Constraints/TypeValidator.php index 0f7faee72d..002c1bd2aa 100644 --- a/src/Symfony/Component/Validator/Constraints/TypeValidator.php +++ b/src/Symfony/Component/Validator/Constraints/TypeValidator.php @@ -49,7 +49,7 @@ class TypeValidator extends ConstraintValidator } $this->context->addViolation($constraint->message, array( - '{{ value }}' => is_object($value) ? get_class($value) : (is_array($value) ? 'Array' : (string) $value), + '{{ value }}' => $this->formatValue($value), '{{ type }}' => $constraint->type, )); } diff --git a/src/Symfony/Component/Validator/Constraints/UrlValidator.php b/src/Symfony/Component/Validator/Constraints/UrlValidator.php index 377a56ad52..3773ba15e0 100644 --- a/src/Symfony/Component/Validator/Constraints/UrlValidator.php +++ b/src/Symfony/Component/Validator/Constraints/UrlValidator.php @@ -55,11 +55,12 @@ class UrlValidator extends ConstraintValidator } $value = (string) $value; - $pattern = sprintf(static::PATTERN, implode('|', $constraint->protocols)); if (!preg_match($pattern, $value)) { - $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); + $this->context->addViolation($constraint->message, array( + '{{ value }}' => $this->formatValue($value), + )); } } } diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.ca.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.ca.xlf index 4b42b819b9..08df82c64f 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.ca.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.ca.xlf @@ -278,6 +278,26 @@ This value should not be identical to {{ compared_value_type }} {{ compared_value }}. Aquest valor no hauria de idèntic a {{ compared_value_type }} {{ compared_value }}. + + The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. + La proporció de l'imatge és massa gran ({{ ratio }}). La màxima proporció permesa és {{ max_ratio }}. + + + The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. + La proporció de l'imatge és massa petita ({{ ratio }}). La mínima proporció permesa és {{ max_ratio }}. + + + The image is square ({{ width }}x{{ height }}px). Square images are not allowed. + L'imatge és quadrada({{ width }}x{{ height }}px). Les imatges quadrades no estan permeses. + + + The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed. + L'imatge està orientada horitzontalment ({{ width }}x{{ height }}px). Les imatges orientades horitzontalment no estan permeses. + + + The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed. + L'imatge està orientada verticalment ({{ width }}x{{ height }}px). Les imatges orientades verticalment no estan permeses. + diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.es.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.es.xlf index 2765fa2ae4..2f8c99322a 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.es.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.es.xlf @@ -160,19 +160,19 @@ The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px. - La anchura de la imagen es demasiado grande ({{ width }}px). La anchura máxima permitida son {{ max_width }}px. + El ancho de la imagen es demasiado grande ({{ width }}px). El ancho máximo permitido es de {{ max_width }}px. The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px. - La anchura de la imagen es demasiado pequeña ({{ width }}px). La anchura mínima requerida son {{ min_width }}px. + El ancho de la imagen es demasiado pequeño ({{ width }}px). El ancho mínimo requerido es {{ min_width }}px. The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px. - La altura de la imagen es demasiado grande ({{ height }}px). La altura máxima permitida son {{ max_height }}px. + La altura de la imagen es demasiado grande ({{ height }}px). La altura máxima permitida es de {{ max_height }}px. The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px. - La altura de la imagen es demasiado pequeña ({{ height }}px). La altura mínima requerida son {{ min_height }}px. + La altura de la imagen es demasiado pequeña ({{ height }}px). La altura mínima requerida es de {{ min_height }}px. This value should be the user current password. @@ -280,23 +280,23 @@ The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. - La proporción de la imagen es demasiado grande ({{ ratio }}). Maxima proporción permitida es {{ max_ratio }}. + La proporción de la imagen es demasiado grande ({{ ratio }}). La máxima proporción permitida es {{ max_ratio }}. The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. - La proporción de la imagen es demasiado pequeña ({{ ratio }}). Mínima proporción permitida es {{ min_ratio }}. + La proporción de la imagen es demasiado pequeña ({{ ratio }}). La mínima proporción permitida es {{ min_ratio }}. The image is square ({{ width }}x{{ height }}px). Square images are not allowed. - La imagen es cuadrada ({{ width }}x{{ height }}px). Imágenes cuadradas no son permitidas. + La imagen es cuadrada ({{ width }}x{{ height }}px). Las imágenes cuadradas no están permitidas. The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed. - La imagen está orientada horizontal ({{ width }}x{{ height }}px). Imágenes orientada horizontal no está permitido. + La imagen está orientada horizontalmente ({{ width }}x{{ height }}px). Las imágenes orientadas horizontalmente no están permitidas. The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed. - La imagen está orientada vertical ({{ width }}x{{ height }}px). Imágenes orientada vertical no está permitido. + La imagen está orientada verticalmente ({{ width }}x{{ height }}px). Las imágenes orientadas verticalmente no están permitidas. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.ro.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.ro.xlf index e109eb3c4b..58f3d535d1 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.ro.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.ro.xlf @@ -24,11 +24,11 @@ You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices. - Trebuie să selectați cel puțin {{ limit }} opțiuni. + Trebuie să selectați cel puțin {{ limit }} opțiune.|Trebuie să selectați cel puțin {{ limit }} opțiuni.|Trebuie să selectați cel puțin {{ limit }} de opțiuni You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices. - Trebuie să selectați cel mult {{ limit }} opțiuni. + Trebuie să selectați cel mult {{ limit }} opțiune.|Trebuie să selectați cel mult {{ limit }} opțiuni.|Trebuie să selectați cel mult {{ limit }} de opțiuni. One or more of the given values is invalid. @@ -76,7 +76,7 @@ This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less. - Această valoare este prea lungă. Ar trebui să aibă maxim {{ limit }} caracter.|Această valoare este prea lungă. Ar trebui să aibă maxim {{ limit }} caractere. + Această valoare este prea lungă. Ar trebui să aibă maxim {{ limit }} caracter.|Această valoare este prea lungă. Ar trebui să aibă maxim {{ limit }} caractere.|Această valoare este prea lungă. Ar trebui să aibă maxim {{ limit }} de caractere. This value should be {{ limit }} or more. @@ -84,7 +84,7 @@ This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more. - Această valoare este prea scurtă. Ar trebui să aibă minim {{ limit }} caracter.|Această valoare este prea scurtă. Ar trebui să aibă minim {{ limit }} caractere. + Această valoare este prea scurtă. Ar trebui să aibă minim {{ limit }} caracter.|Această valoare este prea scurtă. Ar trebui să aibă minim {{ limit }} caractere.|Această valoare este prea scurtă. Ar trebui să aibă minim {{ limit }} de caractere. This value should not be blank. @@ -180,7 +180,7 @@ This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters. - Această valoare trebuie să conțină exact {{ limit }} caracter.|Această valoare trebuie să conțină exact {{ limit }} caractere. + Această valoare trebuie să conțină exact {{ limit }} caracter.|Această valoare trebuie să conțină exact {{ limit }} caractere.|Această valoare trebuie să conțină exact {{ limit }} de caractere. The file was only partially uploaded. @@ -204,15 +204,15 @@ This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more. - Această colecție trebuie să conțină cel puțin {{ limit }} elemente. + Această colecție trebuie să conțină cel puțin {{ limit }} element.|Această colecție trebuie să conțină cel puțin {{ limit }} elemente.|Această colecție trebuie să conțină cel puțin {{ limit }} de elemente. This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less. - Această colecție trebuie să conțină cel mult {{ limit }} elemente. + Această colecție trebuie să conțină cel mult {{ limit }} element.|Această colecție trebuie să conțină cel mult {{ limit }} elemente.|Această colecție trebuie să conțină cel mult {{ limit }} de elemente. This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements. - Această colecție trebuie să conțină {{ limit }} elemente. + Această colecție trebuie să conțină {{ limit }} element.|Această colecție trebuie să conțină {{ limit }} elemente.|Această colecție trebuie să conțină {{ limit }} de elemente. Invalid card number. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.sv.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.sv.xlf index c9d7b37b9a..b70848b8e7 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.sv.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.sv.xlf @@ -278,6 +278,26 @@ This value should not be identical to {{ compared_value_type }} {{ compared_value }}. Värdet ska inte vara identiskt med {{ compared_value_type }} {{ compared_value }}. + + The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. + Förhållandet mellan bildens bredd och höjd är för stort ({{ ratio }}). Högsta tillåtna förhållande är {{ max_ratio }}. + + + The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. + Förhållandet mellan bildens bredd och höjd är för litet ({{ ratio }}). Minsta tillåtna förhållande är {{ min_ratio }}. + + + The image is square ({{ width }}x{{ height }}px). Square images are not allowed. + Bilden är kvadratisk ({{ width }}x{{ height }}px). Kvadratiska bilder tillåts inte. + + + The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed. + Bilden är landskapsorienterad ({{ width }}x{{ height }}px). Landskapsorienterade bilder tillåts inte. + + + The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed. + Bilden är porträttsorienterad ({{ width }}x{{ height }}px). Porträttsorienterade bilder tillåts inte. + diff --git a/src/Symfony/Component/Validator/Tests/Constraints/AbstractComparisonValidatorTestCase.php b/src/Symfony/Component/Validator/Tests/Constraints/AbstractComparisonValidatorTestCase.php index 7379289d3f..a56f734554 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/AbstractComparisonValidatorTestCase.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/AbstractComparisonValidatorTestCase.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Validator\Tests\Constraints; +use Symfony\Component\Intl\Util\IntlTestHelper; use Symfony\Component\Validator\Constraint; class ComparisonTest_Class @@ -65,19 +66,26 @@ abstract class AbstractComparisonValidatorTestCase extends AbstractConstraintVal /** * @dataProvider provideInvalidComparisons * @param mixed $dirtyValue + * @param mixed $dirtyValueAsString * @param mixed $comparedValue * @param mixed $comparedValueString * @param string $comparedValueType */ - public function testInvalidComparisonToValue($dirtyValue, $comparedValue, $comparedValueString, $comparedValueType) + public function testInvalidComparisonToValue($dirtyValue, $dirtyValueAsString, $comparedValue, $comparedValueString, $comparedValueType) { + // Conversion of dates to string differs between ICU versions + // Make sure we have the correct version loaded + if ($dirtyValue instanceof \DateTime) { + IntlTestHelper::requireIntl($this); + } + $constraint = $this->createConstraint(array('value' => $comparedValue)); $constraint->message = 'Constraint Message'; $this->validator->validate($dirtyValue, $constraint); $this->assertViolation('Constraint Message', array( - '{{ value }}' => $comparedValueString, + '{{ value }}' => $dirtyValueAsString, '{{ compared_value }}' => $comparedValueString, '{{ compared_value_type }}' => $comparedValueType )); diff --git a/src/Symfony/Component/Validator/Tests/Constraints/AbstractConstraintValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/AbstractConstraintValidatorTest.php index 65cd62586f..cbb3025233 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/AbstractConstraintValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/AbstractConstraintValidatorTest.php @@ -60,6 +60,8 @@ abstract class AbstractConstraintValidatorTest extends \PHPUnit_Framework_TestCa $this->context = $this->createContext(); $this->validator = $this->createValidator(); $this->validator->initialize($this->context); + + \Locale::setDefault('en'); } protected function createContext() diff --git a/src/Symfony/Component/Validator/Tests/Constraints/BlankValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/BlankValidatorTest.php index 2af35aefa3..7915547dba 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/BlankValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/BlankValidatorTest.php @@ -44,7 +44,7 @@ class BlankValidatorTest extends AbstractConstraintValidatorTest /** * @dataProvider getInvalidValues */ - public function testInvalidValues($value) + public function testInvalidValues($value, $valueAsString) { $constraint = new Blank(array( 'message' => 'myMessage' @@ -54,17 +54,17 @@ class BlankValidatorTest extends AbstractConstraintValidatorTest $this->assertViolation( 'myMessage', - array('{{ value }}' => $value) + array('{{ value }}' => $valueAsString) ); } public function getInvalidValues() { return array( - array('foobar'), - array(0), - array(false), - array(1234), + array('foobar', '"foobar"'), + array(0, '0'), + array(false, 'false'), + array(1234, '1234'), ); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/CardSchemeValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/CardSchemeValidatorTest.php index 01949492cf..7511157994 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/CardSchemeValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/CardSchemeValidatorTest.php @@ -63,7 +63,9 @@ class CardSchemeValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($number, $constraint); - $this->assertViolation('myMessage', array()); + $this->assertViolation('myMessage', array( + '{{ value }}' => is_string($number) ? '"'.$number.'"' : $number, + )); } public function getValidNumbers() diff --git a/src/Symfony/Component/Validator/Tests/Constraints/ChoiceValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/ChoiceValidatorTest.php index 3bd9234d5c..40271f4254 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/ChoiceValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/ChoiceValidatorTest.php @@ -145,7 +145,7 @@ class ChoiceValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate('baz', $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => 'baz', + '{{ value }}' => '"baz"', )); } @@ -160,7 +160,7 @@ class ChoiceValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate(array('foo', 'baz'), $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => 'baz', + '{{ value }}' => '"baz"', )); } @@ -240,7 +240,7 @@ class ChoiceValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate('2', $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => '2', + '{{ value }}' => '"2"', )); } @@ -269,7 +269,7 @@ class ChoiceValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate(array(2, '3'), $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => '3', + '{{ value }}' => '"3"', )); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorTest.php index 7303460406..1f5c6ec20e 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorTest.php @@ -143,7 +143,7 @@ abstract class CollectionValidatorTest extends AbstractConstraintValidatorTest ))); $this->assertViolation('myMessage', array( - '{{ field }}' => 'baz' + '{{ field }}' => '"baz"' ), 'property.path[baz]', 6); } @@ -202,7 +202,7 @@ abstract class CollectionValidatorTest extends AbstractConstraintValidatorTest ))); $this->assertViolation('myMessage', array( - '{{ field }}' => 'foo' + '{{ field }}' => '"foo"' ), 'property.path[foo]', null); } @@ -312,7 +312,7 @@ abstract class CollectionValidatorTest extends AbstractConstraintValidatorTest ))); $this->assertViolation('myMessage', array( - '{{ field }}' => 'foo' + '{{ field }}' => '"foo"' ), 'property.path[foo]', null); } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/DateTimeValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/DateTimeValidatorTest.php index 29201890d7..edd9fd9544 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/DateTimeValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/DateTimeValidatorTest.php @@ -87,7 +87,7 @@ class DateTimeValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($dateTime, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $dateTime, + '{{ value }}' => '"'.$dateTime.'"', )); } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/DateValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/DateValidatorTest.php index 3766c6fd87..4cac751484 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/DateValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/DateValidatorTest.php @@ -87,7 +87,7 @@ class DateValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($date, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $date, + '{{ value }}' => '"'.$date.'"', )); } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/EmailValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/EmailValidatorTest.php index 95756f5061..422692a646 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/EmailValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/EmailValidatorTest.php @@ -80,7 +80,7 @@ class EmailValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($email, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $email, + '{{ value }}' => '"'.$email.'"', )); } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/EqualToValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/EqualToValidatorTest.php index 0b7a983231..20489215fa 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/EqualToValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/EqualToValidatorTest.php @@ -56,10 +56,9 @@ class EqualToValidatorTest extends AbstractComparisonValidatorTestCase public function provideInvalidComparisons() { return array( - array(1, 2, '2', 'integer'), - array('22', '333', "'333'", 'string'), - array(new \DateTime('2001-01-01'), new \DateTime('2000-01-01'), '2000-01-01 00:00:00', 'DateTime'), - array(new ComparisonTest_Class(4), new ComparisonTest_Class(5), '5', __NAMESPACE__.'\ComparisonTest_Class'), - ); + array(1, '1', 2, '2', 'integer'), + array('22', '"22"', '333', '"333"', 'string'), + array(new \DateTime('2001-01-01'), 'Jan 1, 2001, 12:00 AM', new \DateTime('2000-01-01'), 'Jan 1, 2000, 12:00 AM', 'DateTime'), + array(new ComparisonTest_Class(4), 'object', new ComparisonTest_Class(5), 'object', __NAMESPACE__.'\ComparisonTest_Class'), ); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/ExpressionValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/ExpressionValidatorTest.php index 887789ea40..1e90c09e31 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/ExpressionValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/ExpressionValidatorTest.php @@ -158,22 +158,13 @@ class ExpressionValidatorTest extends AbstractConstraintValidatorTest { $constraint = new Expression('value == "1"'); - $this->context->expects($this->any()) - ->method('getPropertyName') - ->will($this->returnValue('property')); - - $this->context->expects($this->any()) - ->method('getPropertyPath') - ->will($this->returnValue('')); - - $this->context->expects($this->any()) - ->method('getRoot') - ->will($this->returnValue('1')); - - $this->context->expects($this->never()) - ->method('addViolation'); + $this->setRoot('1'); + $this->setPropertyPath(''); + $this->setProperty(null, 'property'); $this->validator->validate('1', $constraint); + + $this->assertNoViolation(); } /** @@ -187,22 +178,12 @@ class ExpressionValidatorTest extends AbstractConstraintValidatorTest 'message' => 'myMessage', )); - $this->context->expects($this->any()) - ->method('getPropertyName') - ->will($this->returnValue('property')); - - $this->context->expects($this->any()) - ->method('getPropertyPath') - ->will($this->returnValue('')); - - $this->context->expects($this->any()) - ->method('getRoot') - ->will($this->returnValue('2')); - - $this->context->expects($this->once()) - ->method('addViolation') - ->with('myMessage'); + $this->setRoot('2'); + $this->setPropertyPath(''); + $this->setProperty(null, 'property'); $this->validator->validate('2', $constraint); + + $this->assertViolation('myMessage', array(), ''); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/FalseValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/FalseValidatorTest.php index c770579473..8016231a5a 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/FalseValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/FalseValidatorTest.php @@ -49,6 +49,8 @@ class FalseValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate(true, $constraint); - $this->assertViolation('myMessage'); + $this->assertViolation('myMessage', array( + '{{ value }}' => 'true' + )); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/FileValidatorPathTest.php b/src/Symfony/Component/Validator/Tests/Constraints/FileValidatorPathTest.php index 36a5bbc012..f1f8db692a 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/FileValidatorPathTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/FileValidatorPathTest.php @@ -29,7 +29,7 @@ class FileValidatorPathTest extends FileValidatorTest $this->validator->validate('foobar', $constraint); $this->assertViolation('myMessage', array( - '{{ file }}' => 'foobar', + '{{ file }}' => '"foobar"', )); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/FileValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/FileValidatorTest.php index 1e28c89136..9b06fa5fde 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/FileValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/FileValidatorTest.php @@ -148,7 +148,7 @@ abstract class FileValidatorTest extends AbstractConstraintValidatorTest '{{ limit }}' => $limitAsString, '{{ size }}' => $sizeAsString, '{{ suffix }}' => $suffix, - '{{ file }}' => $this->path, + '{{ file }}' => '"'.$this->path.'"', )); } @@ -279,7 +279,7 @@ abstract class FileValidatorTest extends AbstractConstraintValidatorTest $this->assertViolation('myMessage', array( '{{ type }}' => '"application/pdf"', '{{ types }}' => '"image/png", "image/jpg"', - '{{ file }}' => $this->path, + '{{ file }}' => '"'.$this->path.'"', )); } @@ -311,7 +311,7 @@ abstract class FileValidatorTest extends AbstractConstraintValidatorTest $this->assertViolation('myMessage', array( '{{ type }}' => '"application/pdf"', '{{ types }}' => '"image/*", "image/jpg"', - '{{ file }}' => $this->path, + '{{ file }}' => '"'.$this->path.'"', )); } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/GreaterThanOrEqualValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/GreaterThanOrEqualValidatorTest.php index 893debf154..ed1f47b1fc 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/GreaterThanOrEqualValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/GreaterThanOrEqualValidatorTest.php @@ -57,9 +57,9 @@ class GreaterThanOrEqualValidatorTest extends AbstractComparisonValidatorTestCas public function provideInvalidComparisons() { return array( - array(1, 2, '2', 'integer'), - array(new \DateTime('2000/01/01'), new \DateTime('2005/01/01'), '2005-01-01 00:00:00', 'DateTime'), - array('b', 'c', "'c'", 'string') + array(1, '1', 2, '2', 'integer'), + array(new \DateTime('2000/01/01'), 'Jan 1, 2000, 12:00 AM', new \DateTime('2005/01/01'), 'Jan 1, 2005, 12:00 AM', 'DateTime'), + array('b', '"b"', 'c', '"c"', 'string') ); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/GreaterThanValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/GreaterThanValidatorTest.php index 0c43a33007..225cefd29e 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/GreaterThanValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/GreaterThanValidatorTest.php @@ -55,14 +55,14 @@ class GreaterThanValidatorTest extends AbstractComparisonValidatorTestCase public function provideInvalidComparisons() { return array( - array(1, 2, '2', 'integer'), - array(2, 2, '2', 'integer'), - array(new \DateTime('2000/01/01'), new \DateTime('2005/01/01'), '2005-01-01 00:00:00', 'DateTime'), - array(new \DateTime('2000/01/01'), new \DateTime('2000/01/01'), '2000-01-01 00:00:00', 'DateTime'), - array(new ComparisonTest_Class(4), new ComparisonTest_Class(5), '5', __NAMESPACE__.'\ComparisonTest_Class'), - array(new ComparisonTest_Class(5), new ComparisonTest_Class(5), '5', __NAMESPACE__.'\ComparisonTest_Class'), - array('22', '333', "'333'", 'string'), - array('22', '22', "'22'", 'string') + array(1, '1', 2, '2', 'integer'), + array(2, '2', 2, '2', 'integer'), + array(new \DateTime('2000/01/01'), 'Jan 1, 2000, 12:00 AM', new \DateTime('2005/01/01'), 'Jan 1, 2005, 12:00 AM', 'DateTime'), + array(new \DateTime('2000/01/01'), 'Jan 1, 2000, 12:00 AM', new \DateTime('2000/01/01'), 'Jan 1, 2000, 12:00 AM', 'DateTime'), + array(new ComparisonTest_Class(5), 'object', new ComparisonTest_Class(5), 'object', __NAMESPACE__.'\ComparisonTest_Class'), + array(new ComparisonTest_Class(5), 'object', new ComparisonTest_Class(5), 'object', __NAMESPACE__.'\ComparisonTest_Class'), + array('22', '"22"', '333', '"333"', 'string'), + array('22', '"22"', '22', '"22"', 'string') ); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/IbanValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/IbanValidatorTest.php index 3c78981f73..ba3fcc429d 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/IbanValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/IbanValidatorTest.php @@ -55,6 +55,7 @@ class IbanValidatorTest extends AbstractConstraintValidatorTest { return array( array('CH9300762011623852957'), // Switzerland without spaces + array('CH93 0076 2011 6238 5295 7'), // Switzerland with multiple spaces //Country list //http://www.rbs.co.uk/corporate/international/g0/guide-to-international-business/regulatory-information/iban/iban-example.ashx @@ -164,7 +165,7 @@ class IbanValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($iban, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $iban, + '{{ value }}' => '"'.$iban.'"', )); } @@ -181,6 +182,7 @@ class IbanValidatorTest extends AbstractConstraintValidatorTest array('foo'), array('123'), array('0750447346'), + array('CH930076201162385295]'), //Ibans with lower case values are invalid array('Ae260211000000230064016'), diff --git a/src/Symfony/Component/Validator/Tests/Constraints/IdenticalToValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/IdenticalToValidatorTest.php index e2414806f5..7b4667995b 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/IdenticalToValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/IdenticalToValidatorTest.php @@ -58,12 +58,12 @@ class IdenticalToValidatorTest extends AbstractComparisonValidatorTestCase public function provideInvalidComparisons() { return array( - array(1, 2, '2', 'integer'), - array(2, '2', "'2'", 'string'), - array('22', '333', "'333'", 'string'), - array(new \DateTime('2001-01-01'), new \DateTime('2001-01-01'), '2001-01-01 00:00:00', 'DateTime'), - array(new \DateTime('2001-01-01'), new \DateTime('1999-01-01'), '1999-01-01 00:00:00', 'DateTime'), - array(new ComparisonTest_Class(4), new ComparisonTest_Class(5), '5', __NAMESPACE__.'\ComparisonTest_Class'), + array(1, '1', 2, '2', 'integer'), + array(2, '2', '2', '"2"', 'string'), + array('22', '"22"', '333', '"333"', 'string'), + array(new \DateTime('2001-01-01'), 'Jan 1, 2001, 12:00 AM', new \DateTime('2001-01-01'), 'Jan 1, 2001, 12:00 AM', 'DateTime'), + array(new \DateTime('2001-01-01'), 'Jan 1, 2001, 12:00 AM', new \DateTime('1999-01-01'), 'Jan 1, 1999, 12:00 AM', 'DateTime'), + array(new ComparisonTest_Class(4), 'object', new ComparisonTest_Class(5), 'object', __NAMESPACE__.'\ComparisonTest_Class'), ); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/IpValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/IpValidatorTest.php index 1bd22598db..a00459d8f7 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/IpValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/IpValidatorTest.php @@ -152,7 +152,7 @@ class IpValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($ip, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $ip, + '{{ value }}' => '"'.$ip.'"', )); } @@ -184,7 +184,7 @@ class IpValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($ip, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $ip, + '{{ value }}' => '"'.$ip.'"', )); } @@ -210,7 +210,7 @@ class IpValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($ip, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $ip, + '{{ value }}' => '"'.$ip.'"', )); } @@ -236,7 +236,7 @@ class IpValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($ip, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $ip, + '{{ value }}' => '"'.$ip.'"', )); } @@ -258,7 +258,7 @@ class IpValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($ip, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $ip, + '{{ value }}' => '"'.$ip.'"', )); } @@ -294,7 +294,7 @@ class IpValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($ip, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $ip, + '{{ value }}' => '"'.$ip.'"', )); } @@ -320,7 +320,7 @@ class IpValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($ip, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $ip, + '{{ value }}' => '"'.$ip.'"', )); } @@ -345,7 +345,7 @@ class IpValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($ip, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $ip, + '{{ value }}' => '"'.$ip.'"', )); } @@ -367,7 +367,7 @@ class IpValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($ip, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $ip, + '{{ value }}' => '"'.$ip.'"', )); } @@ -389,7 +389,7 @@ class IpValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($ip, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $ip, + '{{ value }}' => '"'.$ip.'"', )); } @@ -411,7 +411,7 @@ class IpValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($ip, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $ip, + '{{ value }}' => '"'.$ip.'"', )); } @@ -433,7 +433,7 @@ class IpValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($ip, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $ip, + '{{ value }}' => '"'.$ip.'"', )); } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/IsbnValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/IsbnValidatorTest.php index ff4f1ba708..54687a7c2c 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/IsbnValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/IsbnValidatorTest.php @@ -60,7 +60,11 @@ class IsbnValidatorTest extends AbstractConstraintValidatorTest array('0-4X19-92611'), array('0_45122_5244'), array('2870#971#648'), - array('0-9752298-0-x') + array('0-9752298-0-x'), + array('1A34567890'), + // chr(1) evaluates to 0 + // 2070546810 is valid + array('2'.chr(1).'70546810'), ); } @@ -95,6 +99,10 @@ class IsbnValidatorTest extends AbstractConstraintValidatorTest array('980-0474292319'), array('978_0451225245'), array('978#0471292319'), + array('978-272C442282'), + // chr(1) evaluates to 0 + // 978-2070546817 is valid + array('978-2'.chr(1).'70546817'), ); } @@ -168,7 +176,9 @@ class IsbnValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($isbn, $constraint); - $this->assertViolation('myMessage'); + $this->assertViolation('myMessage', array( + '{{ value }}' => '"'.$isbn.'"', + )); } /** @@ -195,7 +205,9 @@ class IsbnValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($isbn, $constraint); - $this->assertViolation('myMessage'); + $this->assertViolation('myMessage', array( + '{{ value }}' => '"'.$isbn.'"', + )); } /** @@ -221,6 +233,8 @@ class IsbnValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($isbn, $constraint); - $this->assertViolation('myMessage'); + $this->assertViolation('myMessage', array( + '{{ value }}' => '"'.$isbn.'"', + )); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/IssnValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/IssnValidatorTest.php index 495a3a609f..5a73c175be 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/IssnValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/IssnValidatorTest.php @@ -147,7 +147,9 @@ class IssnValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($issn, $constraint); - $this->assertViolation('myMessage'); + $this->assertViolation('myMessage', array( + '{{ value }}' => '"'.$issn.'"', + )); } /** @@ -162,7 +164,9 @@ class IssnValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($issn, $constraint); - $this->assertViolation('myMessage'); + $this->assertViolation('myMessage', array( + '{{ value }}' => '"'.$issn.'"', + )); } /** @@ -188,7 +192,9 @@ class IssnValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($issn, $constraint); - $this->assertViolation('myMessage'); + $this->assertViolation('myMessage', array( + '{{ value }}' => '"'.$issn.'"', + )); } /** @@ -202,7 +208,9 @@ class IssnValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($issn, $constraint); - $this->assertViolation('myMessage'); + $this->assertViolation('myMessage', array( + '{{ value }}' => '"'.$issn.'"', + )); } /** @@ -216,6 +224,8 @@ class IssnValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($issn, $constraint); - $this->assertViolation('myMessage'); + $this->assertViolation('myMessage', array( + '{{ value }}' => '"'.$issn.'"', + )); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/LengthValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/LengthValidatorTest.php index f320658721..39c283a83a 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/LengthValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/LengthValidatorTest.php @@ -157,7 +157,7 @@ class LengthValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($value, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => (string) $value, + '{{ value }}' => '"'.$value.'"', '{{ limit }}' => 4, ), 'property.path', $value, 4); } @@ -179,7 +179,7 @@ class LengthValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($value, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => (string) $value, + '{{ value }}' => '"'.$value.'"', '{{ limit }}' => 4, ), 'property.path', $value, 4); } @@ -202,7 +202,7 @@ class LengthValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($value, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => (string) $value, + '{{ value }}' => '"'.$value.'"', '{{ limit }}' => 4, ), 'property.path', $value, 4); } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/LessThanOrEqualValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/LessThanOrEqualValidatorTest.php index fafb246d74..3d7d44e645 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/LessThanOrEqualValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/LessThanOrEqualValidatorTest.php @@ -59,10 +59,10 @@ class LessThanOrEqualValidatorTest extends AbstractComparisonValidatorTestCase public function provideInvalidComparisons() { return array( - array(2, 1, '1', 'integer'), - array(new \DateTime('2010-01-01'), new \DateTime('2000-01-01'), '2000-01-01 00:00:00', 'DateTime'), - array(new ComparisonTest_Class(5), new ComparisonTest_Class(4), '4', __NAMESPACE__.'\ComparisonTest_Class'), - array('c', 'b', "'b'", 'string') + array(2, '2', 1, '1', 'integer'), + array(new \DateTime('2010-01-01'), 'Jan 1, 2010, 12:00 AM', new \DateTime('2000-01-01'), 'Jan 1, 2000, 12:00 AM', 'DateTime'), + array(new ComparisonTest_Class(5), 'object', new ComparisonTest_Class(4), 'object', __NAMESPACE__.'\ComparisonTest_Class'), + array('c', '"c"', 'b', '"b"', 'string') ); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/LessThanValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/LessThanValidatorTest.php index 3eac5d09f9..d4470ce051 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/LessThanValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/LessThanValidatorTest.php @@ -55,13 +55,13 @@ class LessThanValidatorTest extends AbstractComparisonValidatorTestCase public function provideInvalidComparisons() { return array( - array(3, 2, '2', 'integer'), - array(2, 2, '2', 'integer'), - array(new \DateTime('2010-01-01'), new \DateTime('2000-01-01'), '2000-01-01 00:00:00', 'DateTime'), - array(new \DateTime('2000-01-01'), new \DateTime('2000-01-01'), '2000-01-01 00:00:00', 'DateTime'), - array(new ComparisonTest_Class(5), new ComparisonTest_Class(5), '5', __NAMESPACE__.'\ComparisonTest_Class'), - array(new ComparisonTest_Class(6), new ComparisonTest_Class(5), '5', __NAMESPACE__.'\ComparisonTest_Class'), - array('333', '22', "'22'", 'string'), + array(3, '3', 2, '2', 'integer'), + array(2, '2', 2, '2', 'integer'), + array(new \DateTime('2010-01-01'), 'Jan 1, 2010, 12:00 AM', new \DateTime('2000-01-01'), 'Jan 1, 2000, 12:00 AM', 'DateTime'), + array(new \DateTime('2000-01-01'), 'Jan 1, 2000, 12:00 AM', new \DateTime('2000-01-01'), 'Jan 1, 2000, 12:00 AM', 'DateTime'), + array(new ComparisonTest_Class(5), 'object', new ComparisonTest_Class(5), 'object', __NAMESPACE__.'\ComparisonTest_Class'), + array(new ComparisonTest_Class(6), 'object', new ComparisonTest_Class(5), 'object', __NAMESPACE__.'\ComparisonTest_Class'), + array('333', '"333"', '22', '"22"', 'string'), ); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/LuhnValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/LuhnValidatorTest.php index e166e030ec..dd6706225f 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/LuhnValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/LuhnValidatorTest.php @@ -86,7 +86,9 @@ class LuhnValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($number, $constraint); - $this->assertViolation('myMessage'); + $this->assertViolation('myMessage', array( + '{{ value }}' => '"'.$number.'"', + )); } public function getInvalidNumbers() diff --git a/src/Symfony/Component/Validator/Tests/Constraints/NotBlankValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/NotBlankValidatorTest.php index effe6fb5cd..54cf83aef4 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/NotBlankValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/NotBlankValidatorTest.php @@ -56,7 +56,9 @@ class NotBlankValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate(null, $constraint); - $this->assertViolation('myMessage'); + $this->assertViolation('myMessage', array( + '{{ value }}' => 'null', + )); } public function testBlankIsInvalid() @@ -67,7 +69,9 @@ class NotBlankValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate('', $constraint); - $this->assertViolation('myMessage'); + $this->assertViolation('myMessage', array( + '{{ value }}' => '""', + )); } public function testFalseIsInvalid() @@ -78,7 +82,9 @@ class NotBlankValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate(false, $constraint); - $this->assertViolation('myMessage'); + $this->assertViolation('myMessage', array( + '{{ value }}' => 'false', + )); } public function testEmptyArrayIsInvalid() @@ -89,6 +95,8 @@ class NotBlankValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate(array(), $constraint); - $this->assertViolation('myMessage'); + $this->assertViolation('myMessage', array( + '{{ value }}' => 'array', + )); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/NotEqualToValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/NotEqualToValidatorTest.php index d4abec3483..39f125dce7 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/NotEqualToValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/NotEqualToValidatorTest.php @@ -55,11 +55,11 @@ class NotEqualToValidatorTest extends AbstractComparisonValidatorTestCase public function provideInvalidComparisons() { return array( - array(3, 3, '3', 'integer'), - array('2', 2, '2', 'integer'), - array('a', 'a', "'a'", 'string'), - array(new \DateTime('2000-01-01'), new \DateTime('2000-01-01'), '2000-01-01 00:00:00', 'DateTime'), - array(new ComparisonTest_Class(5), new ComparisonTest_Class(5), '5', __NAMESPACE__.'\ComparisonTest_Class'), + array(3, '3', 3, '3', 'integer'), + array('2', '"2"', 2, '2', 'integer'), + array('a', '"a"', 'a', '"a"', 'string'), + array(new \DateTime('2000-01-01'), 'Jan 1, 2000, 12:00 AM', new \DateTime('2000-01-01'), 'Jan 1, 2000, 12:00 AM', 'DateTime'), + array(new ComparisonTest_Class(5), 'object', new ComparisonTest_Class(5), 'object', __NAMESPACE__.'\ComparisonTest_Class'), ); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/NotIdenticalToValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/NotIdenticalToValidatorTest.php index c908cb7b00..a4e1c04de7 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/NotIdenticalToValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/NotIdenticalToValidatorTest.php @@ -59,10 +59,10 @@ class NotIdenticalToValidatorTest extends AbstractComparisonValidatorTestCase $object = new ComparisonTest_Class(2); return array( - array(3, 3, '3', 'integer'), - array('a', 'a', "'a'", 'string'), - array($date, $date, '2000-01-01 00:00:00', 'DateTime'), - array($object, $object, '2', __NAMESPACE__.'\ComparisonTest_Class'), + array(3, '3', 3, '3', 'integer'), + array('a', '"a"', 'a', '"a"', 'string'), + array($date, 'Jan 1, 2000, 12:00 AM', $date, 'Jan 1, 2000, 12:00 AM', 'DateTime'), + array($object, 'object', $object, 'object', __NAMESPACE__.'\ComparisonTest_Class'), ); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/NullValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/NullValidatorTest.php index 9809bdfa8c..771c76edc5 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/NullValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/NullValidatorTest.php @@ -37,7 +37,7 @@ class NullValidatorTest extends AbstractConstraintValidatorTest /** * @dataProvider getInvalidValues */ - public function testInvalidValues($value, $readableValue) + public function testInvalidValues($value, $valueAsString) { $constraint = new Null(array( 'message' => 'myMessage' @@ -46,20 +46,21 @@ class NullValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($value, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $readableValue, + '{{ value }}' => $valueAsString, )); } public function getInvalidValues() { return array( - array(0, 0), - array(false, false), - array(true, true), - array('', ''), - array('foo bar', 'foo bar'), - array(new \DateTime(), 'DateTime'), - array(array(), 'Array'), + array(0, '0'), + array(false, 'false'), + array(true, 'true'), + array('', '""'), + array('foo bar', '"foo bar"'), + array(new \DateTime(), 'object'), + array(new \stdClass(), 'object'), + array(array(), 'array'), ); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/RangeValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/RangeValidatorTest.php index 5ae5e43ef7..71477ad4f1 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/RangeValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/RangeValidatorTest.php @@ -219,4 +219,17 @@ class RangeValidatorTest extends AbstractConstraintValidatorTest '{{ limit }}' => 20, )); } + + public function testNonNumeric() + { + $this->validator->validate('abcd', new Range(array( + 'min' => 10, + 'max' => 20, + 'invalidMessage' => 'myMessage', + ))); + + $this->assertViolation('myMessage', array( + '{{ value }}' => '"abcd"', + )); + } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/RegexValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/RegexValidatorTest.php index 17546b0879..317e8231ea 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/RegexValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/RegexValidatorTest.php @@ -83,7 +83,7 @@ class RegexValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($value, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $value, + '{{ value }}' => '"'.$value.'"', )); } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/TimeValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/TimeValidatorTest.php index b68bd8dd1c..8d8f9fb649 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/TimeValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/TimeValidatorTest.php @@ -87,7 +87,7 @@ class TimeValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($time, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $time, + '{{ value }}' => '"'.$time.'"', )); } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/TrueValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/TrueValidatorTest.php index e3c7f265d5..b2c5999f42 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/TrueValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/TrueValidatorTest.php @@ -49,6 +49,8 @@ class TrueValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate(false, $constraint); - $this->assertViolation('myMessage'); + $this->assertViolation('myMessage', array( + '{{ value }}' => 'false', + )); } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/TypeValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/TypeValidatorTest.php index 634418f245..2412dce0e9 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/TypeValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/TypeValidatorTest.php @@ -57,7 +57,7 @@ class TypeValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate('', $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => '', + '{{ value }}' => '""', '{{ type }}' => 'integer', )); } @@ -135,34 +135,34 @@ class TypeValidatorTest extends AbstractConstraintValidatorTest $file = $this->createFile(); return array( - array('foobar', 'numeric', 'foobar'), - array('foobar', 'boolean', 'foobar'), - array('0', 'integer', '0'), - array('1.5', 'float', '1.5'), + array('foobar', 'numeric', '"foobar"'), + array('foobar', 'boolean', '"foobar"'), + array('0', 'integer', '"0"'), + array('1.5', 'float', '"1.5"'), array(12345, 'string', '12345'), - array($object, 'boolean', 'stdClass'), - array($object, 'numeric', 'stdClass'), - array($object, 'integer', 'stdClass'), - array($object, 'float', 'stdClass'), - array($object, 'string', 'stdClass'), - array($object, 'resource', 'stdClass'), - array($file, 'boolean', (string) $file), - array($file, 'numeric', (string) $file), - array($file, 'integer', (string) $file), - array($file, 'float', (string) $file), - array($file, 'string', (string) $file), - array($file, 'object', (string) $file), - array('12a34', 'digit', '12a34'), - array('1a#23', 'alnum', '1a#23'), - array('abcd1', 'alpha', 'abcd1'), - array("\nabc", 'cntrl', "\nabc"), - array("abc\n", 'graph', "abc\n"), - array('abCDE', 'lower', 'abCDE'), - array('ABcde', 'upper', 'ABcde'), - array("\nabc", 'print', "\nabc"), - array('abc&$!', 'punct', 'abc&$!'), - array("\nabc", 'space', "\nabc"), - array('AR1012', 'xdigit', 'AR1012'), + array($object, 'boolean', 'object'), + array($object, 'numeric', 'object'), + array($object, 'integer', 'object'), + array($object, 'float', 'object'), + array($object, 'string', 'object'), + array($object, 'resource', 'object'), + array($file, 'boolean', 'resource'), + array($file, 'numeric', 'resource'), + array($file, 'integer', 'resource'), + array($file, 'float', 'resource'), + array($file, 'string', 'resource'), + array($file, 'object', 'resource'), + array('12a34', 'digit', '"12a34"'), + array('1a#23', 'alnum', '"1a#23"'), + array('abcd1', 'alpha', '"abcd1"'), + array("\nabc", 'cntrl', "\"\nabc\""), + array("abc\n", 'graph', "\"abc\n\""), + array('abCDE', 'lower', '"abCDE"'), + array('ABcde', 'upper', '"ABcde"'), + array("\nabc", 'print', "\"\nabc\""), + array('abc&$!', 'punct', '"abc&$!"'), + array("\nabc", 'space', "\"\nabc\""), + array('AR1012', 'xdigit', '"AR1012"'), ); } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php index 82fae79a2a..fd5c43246d 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php @@ -123,7 +123,7 @@ class UrlValidatorTest extends AbstractConstraintValidatorTest $this->validator->validate($url, $constraint); $this->assertViolation('myMessage', array( - '{{ value }}' => $url, + '{{ value }}' => '"'.$url.'"', )); } diff --git a/src/Symfony/Component/Yaml/Inline.php b/src/Symfony/Component/Yaml/Inline.php index 2242d12c7b..461d605627 100644 --- a/src/Symfony/Component/Yaml/Inline.php +++ b/src/Symfony/Component/Yaml/Inline.php @@ -402,6 +402,8 @@ class Inline * @param string $scalar * * @return string A YAML string + * + * @throws ParseException when object parsing support was disabled and the parser detected a PHP object */ private static function evaluateScalar($scalar) {