Merge branch '2.3' into 2.4

* 2.3: (22 commits)
  Fix incorrect romanian plural translations
  fix axes handling in Crawler::filterXPath()
  fix some docblocks
  Fixed self-reference in 'service_container' service breaks garbage collection (and clone).
  [Process] Fix tests when pcntl is not available.
  [DependencyInjection] Roll back changes made to generated files.
  [Console] Roll back changes made to fixture files.
  [Validator] Added more detailed inline documentation
  [Validator] Removed information from the violation output if the value is an array, object or resource
  partially reverted previous commit
  fixed CS
  properly handle null data when denormalizing
  [Validator] Renamed valueToString() to formatValue(); added missing formatValue() calls
  [Validator] Fixed CS
  [Validator] Fixed date-to-string conversion tests to match ICU 51
  [Validator] Added "{{ value }}" parameters where they were missing
  [Validator] Simplified and explained the LuhnValidator
  [Validator] Simplified IssnValidator
  [Validator] Fixed and simplified IsbnValidator
  [Validator] Simplified IBAN validation algorithm
  ...

Conflicts:
	src/Symfony/Component/Console/Helper/DescriptorHelper.php
	src/Symfony/Component/DependencyInjection/Container.php
	src/Symfony/Component/DomCrawler/Tests/CrawlerTest.php
	src/Symfony/Component/HttpFoundation/File/UploadedFile.php
	src/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php
	src/Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php
	src/Symfony/Component/Validator/Constraints/CollectionValidator.php
	src/Symfony/Component/Validator/Tests/Constraints/EqualToValidatorTest.php
	src/Symfony/Component/Validator/Tests/Constraints/GreaterThanValidatorTest.php
	src/Symfony/Component/Validator/Tests/Constraints/IdenticalToValidatorTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LessThanOrEqualValidatorTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LessThanValidatorTest.php
	src/Symfony/Component/Validator/Tests/Constraints/NotEqualToValidatorTest.php
	src/Symfony/Component/Validator/Tests/Constraints/NotIdenticalToValidatorTest.php
This commit is contained in:
Bernhard Schussek 2014-08-04 12:16:36 +02:00
commit 3bed1b7988
88 changed files with 753 additions and 330 deletions

View File

@ -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.
*/

View File

@ -80,6 +80,9 @@ class ModelChoiceList extends ObjectChoiceList
* Either an array if $choices is given,
* or a ModelCriteria to be merged with the $queryObject.
* @param PropertyAccessorInterface $propertyAccessor The reflection graph for reading property paths.
*
* @throws MissingOptionsException when no model class is given
* @throws InvalidOptionsException when the model class cannot be found
*/
public function __construct($class, $labelPath = null, $choices = null, $queryObject = null, $groupPath = null, $preferred = array(), PropertyAccessorInterface $propertyAccessor = null)
{

View File

@ -292,6 +292,7 @@ abstract class BaseNode implements NodeInterface
*
* @return mixed The finalized value
*
* @throws Exception
* @throws InvalidConfigurationException
*/
final public function finalize($value)

View File

@ -872,6 +872,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)
{

View File

@ -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())
{

View File

@ -325,7 +325,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
*
@ -354,7 +354,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
@ -448,7 +448,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
*

View File

@ -80,6 +80,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)
{

View File

@ -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'));

View File

@ -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)));
}

View File

@ -428,7 +428,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)
{
@ -632,6 +635,8 @@ EOF;
*
* @param string $id A service identifier
* @param Definition $definition A Definition instance
*
* @return string|null
*/
private function addServiceSynchronizer($id, Definition $definition)
{

View File

@ -243,6 +243,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)
{

View File

@ -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'));

View File

@ -891,7 +891,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;

View File

@ -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
*/

View File

@ -495,6 +495,8 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface
*
* @param bool $initialize
*
* @return ButtonBuilder
*
* @throws BadMethodCallException
*/
public function setAutoInitialize($initialize)

View File

@ -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)
{

View File

@ -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'),
);

View File

@ -252,8 +252,9 @@ class TraceableEventDispatcher implements EventDispatcherInterface, TraceableEve
/**
* Returns information about the listener
*
* @param object $listener The listener
* @param string $eventName The event name
* @param object $listener The listener
* @param int|null $eventId The event id
* @param string $eventName The event name
*
* @return array Information about the listener
*/

View File

@ -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())
{

View File

@ -1177,7 +1177,7 @@ class HttpCacheTest extends HttpCacheTestCase
public function testEsiCacheRemoveValidationHeadersIfEmbeddedResponses()
{
$time = new \DateTime;
$time = new \DateTime();
$responses = array(
array(

View File

@ -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);

View File

@ -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) {

View File

@ -801,12 +801,12 @@ 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($ane, array $changes)
private function updateOldFieldAceProperty($name, array $changes)
{
$currentIds = array();
foreach ($changes[1] as $field => $new) {

View File

@ -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)

View File

@ -89,6 +89,8 @@ abstract class BasePasswordEncoder implements PasswordEncoderInterface
/**
* Checks if the password is too long.
*
* @param string $password The password to check
*
* @return bool true if the password is too long, false otherwise
*/
protected function isPasswordTooLong($password)

View File

@ -117,6 +117,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();
@ -127,10 +139,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 {
@ -144,10 +156,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)) {

View File

@ -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');
@ -63,6 +68,17 @@ class GetSetMethodNormalizerTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('bar', $obj->getBar());
}
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'));
@ -73,6 +89,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
*/
@ -115,6 +136,17 @@ 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->fooBar = 'foobar';
$obj = $this->normalizer->denormalize($data, __NAMESPACE__.'\GetConstructorDummy', 'any');
$this->assertEquals('foo', $obj->getFoo());
$this->assertEquals('bar', $obj->getBar());
}
/**
* @dataProvider provideCallbacks
*/

View File

@ -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);
}
}

View File

@ -96,9 +96,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;
}

View File

@ -32,45 +32,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
*

View File

@ -27,7 +27,9 @@ class BlankValidator extends ConstraintValidator
public function validate($value, Constraint $constraint)
{
if ('' !== $value && null !== $value) {
$this->context->addViolation($constraint->message, array('{{ value }}' => $value));
$this->context->addViolation($constraint->message, array(
'{{ value }}' => $this->formatValue($value)
));
}
}
}

View File

@ -108,7 +108,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;
}
@ -124,6 +126,8 @@ class CardSchemeValidator extends ConstraintValidator
}
}
$this->context->addViolation($constraint->message);
$this->context->addViolation($constraint->message, array(
'{{ value }}' => $this->formatValue($value),
));
}
}

View File

@ -59,25 +59,33 @@ class ChoiceValidator 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), null, (int) $constraint->min);
$this->context->addViolation($constraint->minMessage, array(
'{{ limit }}' => $constraint->min
), null, (int) $constraint->min);
return;
}
if ($constraint->max !== null && $count > $constraint->max) {
$this->context->addViolation($constraint->maxMessage, array('{{ limit }}' => $constraint->max), null, (int) $constraint->max);
$this->context->addViolation($constraint->maxMessage, array(
'{{ limit }}' => $constraint->max
), null, (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)
));
}
}
}

View File

@ -58,7 +58,7 @@ class CollectionValidator extends ConstraintValidator
}
} elseif (!$fieldConstraint instanceof Optional && !$constraint->allowMissingFields) {
$context->addViolationAt('['.$field.']', $constraint->missingFieldsMessage, array(
'{{ field }}' => $field
'{{ field }}' => $this->formatValue($field)
), null);
}
}
@ -67,7 +67,7 @@ class CollectionValidator 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);
}
}

View File

@ -42,7 +42,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),
));
}
}
}

View File

@ -42,7 +42,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),
));
}
}
}

View File

@ -40,7 +40,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),
));
}
}
}

View File

@ -50,7 +50,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),
));
}
}

View File

@ -30,6 +30,8 @@ class FalseValidator extends ConstraintValidator
return;
}
$this->context->addViolation($constraint->message);
$this->context->addViolation($constraint->message, array(
'{{ value }}' => $this->formatValue($value),
));
}
}

View File

@ -96,13 +96,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;
}
@ -126,10 +130,10 @@ class FileValidator extends ConstraintValidator
if ($size > $limit) {
$this->context->addViolation($constraint->maxSizeMessage, array(
'{{ size }}' => $size,
'{{ limit }}' => $limit,
'{{ suffix }}' => $suffix,
'{{ file }}' => $path,
'{{ size }}' => $size,
'{{ limit }}' => $limit,
'{{ suffix }}' => $suffix,
'{{ file }}' => $this->formatValue($path),
));
return;
@ -161,9 +165,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),
));
}
}

View File

@ -13,10 +13,12 @@ namespace Symfony\Component\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
/**
* @author Manuel Reinhard <manu@sprain.ch>
* @author Michael Schummel
* @author Bernhard Schussek <bschussek@gmail.com>
* @link http://www.michael-schummel.de/2007/10/05/iban-prufung-mit-php/
*/
class IbanValidator extends ConstraintValidator
@ -30,41 +32,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;
}
}

View File

@ -91,7 +91,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),
));
}
}
}

View File

@ -42,5 +42,8 @@ class Isbn extends Constraint
if (null === $this->isbn10 && null === $this->isbn13) {
throw new MissingOptionsException(sprintf('Either option "isbn10" or "isbn13" must be given for constraint "%s".', __CLASS__), array('isbn10', 'isbn13'));
}
$this->isbn10 = (bool) $this->isbn10;
$this->isbn13 = (bool) $this->isbn13;
}
}

View File

@ -19,6 +19,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException;
* Validates whether the value is a valid ISBN-10 or ISBN-13.
*
* @author The Whole Life To Learn <thewholelifetolearn@gmail.com>
* @author Bernhard Schussek <bschussek@gmail.com>
*
* @see https://en.wikipedia.org/wiki/Isbn
*/
@ -37,53 +38,71 @@ class IsbnValidator extends ConstraintValidator
throw new UnexpectedTypeException($value, 'string');
}
if (!is_numeric($value)) {
$value = str_replace('-', '', $value);
$value = (string) $value;
$canonical = strtoupper(str_replace('-', '', $value));
if ($constraint->isbn10 && $this->isValidIsbn10($canonical)) {
return;
}
$validation = 0;
$value = strtoupper($value);
$valueLength = strlen($value);
if ($constraint->isbn13 && $this->isValidIsbn13($canonical)) {
return;
}
if (10 === $valueLength && null !== $constraint->isbn10) {
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) {
if (null !== $constraint->isbn13) {
$this->context->addViolation($constraint->bothIsbnMessage);
} else {
$this->context->addViolation($constraint->isbn10Message);
}
}
} elseif (13 === $valueLength && null !== $constraint->isbn13) {
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) {
if (null !== $constraint->isbn10) {
$this->context->addViolation($constraint->bothIsbnMessage);
} else {
$this->context->addViolation($constraint->isbn13Message);
}
}
if ($constraint->isbn10 && $constraint->isbn13) {
$this->context->addViolation($constraint->bothIsbnMessage, array(
'{{ value }}' => $this->formatValue($value),
));
} elseif ($constraint->isbn10) {
$this->context->addViolation($constraint->isbn10Message, array(
'{{ value }}' => $this->formatValue($value),
));
} else {
if (null !== $constraint->isbn10 && null !== $constraint->isbn13) {
$this->context->addViolation($constraint->bothIsbnMessage);
} elseif (null !== $constraint->isbn10) {
$this->context->addViolation($constraint->isbn10Message);
} else {
$this->context->addViolation($constraint->isbn13Message);
}
$this->context->addViolation($constraint->isbn13Message, array(
'{{ value }}' => $this->formatValue($value),
));
}
}
private function isValidIsbn10($isbn)
{
if (10 !== strlen($isbn)) {
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;
}
private function isValidIsbn13($isbn)
{
if (13 !== strlen($isbn) || !ctype_digit($isbn)) {
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;
}
}

View File

@ -37,26 +37,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),
));
}
}
}

View File

@ -42,7 +42,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),
));
}
}
}

View File

@ -45,7 +45,7 @@ class LengthValidator 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);
@ -54,7 +54,7 @@ class LengthValidator 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);
@ -63,7 +63,7 @@ class LengthValidator 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);
}

View File

@ -42,7 +42,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),
));
}
}
}

View File

@ -24,14 +24,17 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException;
* @see http://en.wikipedia.org/wiki/Luhn_algorithm
* @author Tim Nagel <t.nagel@infinite.net.au>
* @author Greg Knapp http://gregk.me/2011/php-implementation-of-bank-card-luhn-algorithm/
* @author Bernhard Schussek <bschussek@gmail.com>
*/
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)
{
@ -39,28 +42,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),
));
}
}
}

View File

@ -27,7 +27,9 @@ class NotBlankValidator extends ConstraintValidator
public function validate($value, Constraint $constraint)
{
if (false === $value || (empty($value) && '0' != $value)) {
$this->context->addViolation($constraint->message);
$this->context->addViolation($constraint->message, array(
'{{ value }}' => $this->formatValue($value),
));
}
}
}

View File

@ -27,13 +27,9 @@ class NullValidator extends ConstraintValidator
public function validate($value, Constraint $constraint)
{
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),
));
}
}
}

View File

@ -30,7 +30,7 @@ class RangeValidator extends ConstraintValidator
if (!is_numeric($value)) {
$this->context->addViolation($constraint->invalidMessage, array(
'{{ value }}' => $value,
'{{ value }}' => $this->formatValue($value),
));
return;

View File

@ -41,7 +41,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),
));
}
}
}

View File

@ -40,7 +40,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),
));
}
}
}

View File

@ -31,7 +31,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),
));
}
}
}

View File

@ -44,7 +44,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,
));
}

View File

@ -51,11 +51,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),
));
}
}
}

View File

@ -24,11 +24,11 @@
</trans-unit>
<trans-unit id="6">
<source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
<target>Trebuie să selectați cel puțin {{ limit }} opțiuni.</target>
<target>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</target>
</trans-unit>
<trans-unit id="7">
<source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
<target>Trebuie să selectați cel mult {{ limit }} opțiuni.</target>
<target>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.</target>
</trans-unit>
<trans-unit id="8">
<source>One or more of the given values is invalid.</source>
@ -76,7 +76,7 @@
</trans-unit>
<trans-unit id="19">
<source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
<target>Această valoare este prea lungă. Ar trebui să aibă maxim {{ limit }} caracter.|Această valoare este prea lungă. Ar trebui să aibă maxim {{ limit }} caractere.</target>
<target>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.</target>
</trans-unit>
<trans-unit id="20">
<source>This value should be {{ limit }} or more.</source>
@ -84,7 +84,7 @@
</trans-unit>
<trans-unit id="21">
<source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
<target>Această valoare este prea scurtă. Ar trebui să aibă minim {{ limit }} caracter.|Această valoare este prea scurtă. Ar trebui să aibă minim {{ limit }} caractere.</target>
<target>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.</target>
</trans-unit>
<trans-unit id="22">
<source>This value should not be blank.</source>
@ -180,7 +180,7 @@
</trans-unit>
<trans-unit id="48">
<source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
<target>Această valoare trebuie să conțină exact {{ limit }} caracter.|Această valoare trebuie să conțină exact {{ limit }} caractere.</target>
<target>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.</target>
</trans-unit>
<trans-unit id="49">
<source>The file was only partially uploaded.</source>
@ -204,15 +204,15 @@
</trans-unit>
<trans-unit id="54">
<source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
<target>Această colecție trebuie să conțină cel puțin {{ limit }} elemente.</target>
<target>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.</target>
</trans-unit>
<trans-unit id="55">
<source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
<target>Această colecție trebuie să conțină cel mult {{ limit }} elemente.</target>
<target>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.</target>
</trans-unit>
<trans-unit id="56">
<source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
<target>Această colecție trebuie să conțină {{ limit }} elemente.</target>
<target>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.</target>
</trans-unit>
<trans-unit id="57">
<source>Invalid card number.</source>

View File

@ -11,6 +11,7 @@
namespace Symfony\Component\Validator\Tests\Constraints;
use Symfony\Component\Intl\Util\IntlTestHelper;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\AbstractComparisonValidator;
@ -44,6 +45,8 @@ abstract class AbstractComparisonValidatorTestCase extends \PHPUnit_Framework_Te
->disableOriginalConstructor()
->getMock();
$this->validator->initialize($this->context);
\Locale::setDefault('en');
}
/**
@ -86,12 +89,19 @@ abstract class AbstractComparisonValidatorTestCase extends \PHPUnit_Framework_Te
/**
* @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';
@ -102,7 +112,7 @@ abstract class AbstractComparisonValidatorTestCase extends \PHPUnit_Framework_Te
$this->context->expects($this->once())
->method('addViolation')
->with('Constraint Message', array(
'{{ value }}' => $comparedValueString,
'{{ value }}' => $dirtyValueAsString,
'{{ compared_value }}' => $comparedValueString,
'{{ compared_value_type }}' => $comparedValueType
));

View File

@ -51,7 +51,7 @@ class BlankValidatorTest extends \PHPUnit_Framework_TestCase
/**
* @dataProvider getInvalidValues
*/
public function testInvalidValues($value)
public function testInvalidValues($value, $valueAsString)
{
$constraint = new Blank(array(
'message' => 'myMessage'
@ -60,7 +60,7 @@ class BlankValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $value,
'{{ value }}' => $valueAsString,
));
$this->validator->validate($value, $constraint);
@ -69,10 +69,10 @@ class BlankValidatorTest extends \PHPUnit_Framework_TestCase
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'),
);
}
}

View File

@ -158,7 +158,7 @@ class ChoiceValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => 'baz',
'{{ value }}' => '"baz"',
), null, null);
$this->validator->validate('baz', $constraint);
@ -175,7 +175,7 @@ class ChoiceValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => 'baz',
'{{ value }}' => '"baz"',
));
$this->validator->validate(array('foo', 'baz'), $constraint);
@ -255,7 +255,7 @@ class ChoiceValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => '2',
'{{ value }}' => '"2"',
));
$this->validator->validate('2', $constraint);
@ -287,7 +287,7 @@ class ChoiceValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => '3',
'{{ value }}' => '"3"',
));
$this->validator->validate(array(2, '3'), $constraint);

View File

@ -147,7 +147,7 @@ abstract class CollectionValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolationAt')
->with('[baz]', 'myMessage', array(
'{{ field }}' => 'baz'
'{{ field }}' => '"baz"'
));
$this->validator->validate($data, new Collection(array(
@ -211,7 +211,7 @@ abstract class CollectionValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolationAt')
->with('[foo]', 'myMessage', array(
'{{ field }}' => 'foo',
'{{ field }}' => '"foo"',
));
$this->validator->validate($data, $constraint);
@ -331,7 +331,7 @@ abstract class CollectionValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolationAt')
->with('[foo]', 'myMessage', array(
'{{ field }}' => 'foo',
'{{ field }}' => '"foo"',
));
$this->validator->validate($data, new Collection(array(

View File

@ -96,7 +96,7 @@ class DateTimeValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $dateTime,
'{{ value }}' => '"'.$dateTime.'"',
));
$this->validator->validate($dateTime, $constraint);

View File

@ -96,7 +96,7 @@ class DateValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $date,
'{{ value }}' => '"'.$date.'"',
));
$this->validator->validate($date, $constraint);

View File

@ -88,7 +88,7 @@ class EmailValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $email,
'{{ value }}' => '"'.$email.'"',
));
$this->validator->validate($email, $constraint);

View File

@ -50,10 +50,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'), );
}
}

View File

@ -56,7 +56,7 @@ class FalseValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array());
->with('myMessage', array('{{ value }}' => 'true'));
$this->validator->validate(true, $constraint);
}

View File

@ -29,7 +29,7 @@ class FileValidatorPathTest extends FileValidatorTest
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ file }}' => 'foobar',
'{{ file }}' => '"foobar"',
));
$this->validator->validate('foobar', $constraint);

View File

@ -97,7 +97,7 @@ abstract class FileValidatorTest extends \PHPUnit_Framework_TestCase
'{{ limit }}' => '10',
'{{ size }}' => '11',
'{{ suffix }}' => 'bytes',
'{{ file }}' => $this->path,
'{{ file }}' => '"'.$this->path.'"',
));
$this->validator->validate($this->getFile($this->path), $constraint);
@ -118,7 +118,7 @@ abstract class FileValidatorTest extends \PHPUnit_Framework_TestCase
'{{ limit }}' => '1',
'{{ size }}' => '1.4',
'{{ suffix }}' => 'kB',
'{{ file }}' => $this->path,
'{{ file }}' => '"'.$this->path.'"',
));
$this->validator->validate($this->getFile($this->path), $constraint);
@ -139,7 +139,7 @@ abstract class FileValidatorTest extends \PHPUnit_Framework_TestCase
'{{ limit }}' => '1',
'{{ size }}' => '1.4',
'{{ suffix }}' => 'MB',
'{{ file }}' => $this->path,
'{{ file }}' => '"'.$this->path.'"',
));
$this->validator->validate($this->getFile($this->path), $constraint);
@ -241,7 +241,7 @@ abstract class FileValidatorTest extends \PHPUnit_Framework_TestCase
->with('myMessage', array(
'{{ type }}' => '"application/pdf"',
'{{ types }}' => '"image/png", "image/jpg"',
'{{ file }}' => $this->path,
'{{ file }}' => '"'.$this->path.'"',
));
$this->validator->validate($file, $constraint);
@ -275,7 +275,7 @@ abstract class FileValidatorTest extends \PHPUnit_Framework_TestCase
->with('myMessage', array(
'{{ type }}' => '"application/pdf"',
'{{ types }}' => '"image/*", "image/jpg"',
'{{ file }}' => $this->path,
'{{ file }}' => '"'.$this->path.'"',
));
$this->validator->validate($file, $constraint);

View File

@ -51,9 +51,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')
);
}
}

View File

@ -49,14 +49,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')
);
}
}

View File

@ -54,6 +54,7 @@ class IbanValidatorTest extends \PHPUnit_Framework_TestCase
{
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
@ -163,7 +164,7 @@ class IbanValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $iban,
'{{ value }}' => '"'.$iban.'"',
));
$this->validator->validate($iban, $constraint);
@ -182,6 +183,7 @@ class IbanValidatorTest extends \PHPUnit_Framework_TestCase
array('foo'),
array('123'),
array('0750447346'),
array('CH930076201162385295]'),
//Ibans with lower case values are invalid
array('Ae260211000000230064016'),

View File

@ -52,12 +52,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'),
);
}
}

View File

@ -162,7 +162,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $ip,
'{{ value }}' => '"'.$ip.'"',
));
$this->validator->validate($ip, $constraint);
@ -196,7 +196,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $ip,
'{{ value }}' => '"'.$ip.'"',
));
$this->validator->validate($ip, $constraint);
@ -224,7 +224,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $ip,
'{{ value }}' => '"'.$ip.'"',
));
$this->validator->validate($ip, $constraint);
@ -252,7 +252,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $ip,
'{{ value }}' => '"'.$ip.'"',
));
$this->validator->validate($ip, $constraint);
@ -276,7 +276,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $ip,
'{{ value }}' => '"'.$ip.'"',
));
$this->validator->validate($ip, $constraint);
@ -314,7 +314,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $ip,
'{{ value }}' => '"'.$ip.'"',
));
$this->validator->validate($ip, $constraint);
@ -342,7 +342,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $ip,
'{{ value }}' => '"'.$ip.'"',
));
$this->validator->validate($ip, $constraint);
@ -369,7 +369,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $ip,
'{{ value }}' => '"'.$ip.'"',
));
$this->validator->validate($ip, $constraint);
@ -393,7 +393,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $ip,
'{{ value }}' => '"'.$ip.'"',
));
$this->validator->validate($ip, $constraint);
@ -417,7 +417,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $ip,
'{{ value }}' => '"'.$ip.'"',
));
$this->validator->validate($ip, $constraint);
@ -441,7 +441,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $ip,
'{{ value }}' => '"'.$ip.'"',
));
$this->validator->validate($ip, $constraint);
@ -465,7 +465,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $ip,
'{{ value }}' => '"'.$ip.'"',
));
$this->validator->validate($ip, $constraint);

View File

@ -58,6 +58,10 @@ class IsbnValidatorTest extends \PHPUnit_Framework_TestCase
array('0-4X19-92611'),
array('0_45122_5244'),
array('2870#971#648'),
array('1A34567890'),
// chr(1) evaluates to 0
// 2070546810 is valid
array('2'.chr(1).'70546810'),
);
}
@ -92,6 +96,10 @@ class IsbnValidatorTest extends \PHPUnit_Framework_TestCase
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'),
);
}

View File

@ -167,7 +167,7 @@ class LengthValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', $this->identicalTo(array(
'{{ value }}' => (string) $value,
'{{ value }}' => '"'.$value.'"',
'{{ limit }}' => 4,
)), $this->identicalTo($value), 4);
@ -191,7 +191,7 @@ class LengthValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', $this->identicalTo(array(
'{{ value }}' => (string) $value,
'{{ value }}' => '"'.$value.'"',
'{{ limit }}' => 4,
)), $this->identicalTo($value), 4);
@ -216,7 +216,7 @@ class LengthValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', $this->identicalTo(array(
'{{ value }}' => (string) $value,
'{{ value }}' => '"'.$value.'"',
'{{ limit }}' => 4,
)), $this->identicalTo($value), 4);

View File

@ -53,10 +53,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')
);
}
}

View File

@ -49,13 +49,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'),
);
}
}

View File

@ -49,11 +49,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'),
);
}
}

View File

@ -53,10 +53,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'),
);
}
}

View File

@ -43,7 +43,7 @@ class NullValidatorTest extends \PHPUnit_Framework_TestCase
/**
* @dataProvider getInvalidValues
*/
public function testInvalidValues($value, $readableValue)
public function testInvalidValues($value, $valueAsString)
{
$constraint = new Null(array(
'message' => 'myMessage'
@ -52,7 +52,7 @@ class NullValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $readableValue,
'{{ value }}' => $valueAsString,
));
$this->validator->validate($value, $constraint);
@ -61,13 +61,14 @@ class NullValidatorTest extends \PHPUnit_Framework_TestCase
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'),
);
}
}

View File

@ -234,4 +234,19 @@ class RangeValidatorTest extends \PHPUnit_Framework_TestCase
$this->validator->validate(21, $constraint);
}
public function testNonNumeric()
{
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => '"abcd"',
));
$this->validator->validate('abcd', new Range(array(
'min' => 10,
'max' => 20,
'invalidMessage' => 'myMessage',
)));
}
}

View File

@ -91,7 +91,7 @@ class RegexValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $value,
'{{ value }}' => '"'.$value.'"',
));
$this->validator->validate($value, $constraint);

View File

@ -96,7 +96,7 @@ class TimeValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $time,
'{{ value }}' => '"'.$time.'"',
));
$this->validator->validate($time, $constraint);

View File

@ -57,6 +57,7 @@ class TrueValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => 'false',
));
$this->validator->validate(false, $constraint);

View File

@ -134,34 +134,34 @@ class TypeValidatorTest extends \PHPUnit_Framework_TestCase
$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"'),
);
}

View File

@ -129,7 +129,7 @@ class UrlValidatorTest extends \PHPUnit_Framework_TestCase
$this->context->expects($this->once())
->method('addViolation')
->with('myMessage', array(
'{{ value }}' => $url,
'{{ value }}' => '"'.$url.'"',
));
$this->validator->validate($url, $constraint);

View File

@ -384,6 +384,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)
{