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:
commit
3bed1b7988
@ -74,7 +74,7 @@ abstract class RegisterMappingsPass implements CompilerPassInterface
|
|||||||
* @param string[] $managerParameters list of container parameters
|
* @param string[] $managerParameters list of container parameters
|
||||||
* that could hold the manager name
|
* that could hold the manager name
|
||||||
* @param string $driverPattern pattern to get the metadata driver service names
|
* @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
|
* present to enable the mapping. Set to false
|
||||||
* to not do any check, optional.
|
* to not do any check, optional.
|
||||||
*/
|
*/
|
||||||
|
@ -80,6 +80,9 @@ class ModelChoiceList extends ObjectChoiceList
|
|||||||
* Either an array if $choices is given,
|
* Either an array if $choices is given,
|
||||||
* or a ModelCriteria to be merged with the $queryObject.
|
* or a ModelCriteria to be merged with the $queryObject.
|
||||||
* @param PropertyAccessorInterface $propertyAccessor The reflection graph for reading property paths.
|
* @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)
|
public function __construct($class, $labelPath = null, $choices = null, $queryObject = null, $groupPath = null, $preferred = array(), PropertyAccessorInterface $propertyAccessor = null)
|
||||||
{
|
{
|
||||||
|
@ -292,6 +292,7 @@ abstract class BaseNode implements NodeInterface
|
|||||||
*
|
*
|
||||||
* @return mixed The finalized value
|
* @return mixed The finalized value
|
||||||
*
|
*
|
||||||
|
* @throws Exception
|
||||||
* @throws InvalidConfigurationException
|
* @throws InvalidConfigurationException
|
||||||
*/
|
*/
|
||||||
final public function finalize($value)
|
final public function finalize($value)
|
||||||
|
@ -872,6 +872,8 @@ class Application
|
|||||||
* @param OutputInterface $output An Output instance
|
* @param OutputInterface $output An Output instance
|
||||||
*
|
*
|
||||||
* @return int 0 if everything went fine, or an error code
|
* @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)
|
protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output)
|
||||||
{
|
{
|
||||||
|
@ -54,7 +54,7 @@ class DescriptorHelper extends Helper
|
|||||||
* @param object $object
|
* @param object $object
|
||||||
* @param array $options
|
* @param array $options
|
||||||
*
|
*
|
||||||
* @throws \InvalidArgumentException
|
* @throws \InvalidArgumentException when the given format is not supported
|
||||||
*/
|
*/
|
||||||
public function describe(OutputInterface $output, $object, array $options = array())
|
public function describe(OutputInterface $output, $object, array $options = array())
|
||||||
{
|
{
|
||||||
|
@ -325,7 +325,7 @@ class DialogHelper extends InputAwareHelper
|
|||||||
* @param OutputInterface $output An Output instance
|
* @param OutputInterface $output An Output instance
|
||||||
* @param string|array $question The question to ask
|
* @param string|array $question The question to ask
|
||||||
* @param callable $validator A PHP callback
|
* @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 string $default The default answer if none is given by the user
|
||||||
* @param array $autocomplete List of values to autocomplete
|
* @param array $autocomplete List of values to autocomplete
|
||||||
*
|
*
|
||||||
@ -354,7 +354,7 @@ class DialogHelper extends InputAwareHelper
|
|||||||
* @param OutputInterface $output An Output instance
|
* @param OutputInterface $output An Output instance
|
||||||
* @param string|array $question The question to ask
|
* @param string|array $question The question to ask
|
||||||
* @param callable $validator A PHP callback
|
* @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
|
* @param bool $fallback In case the response can not be hidden, whether to fallback on non-hidden question or not
|
||||||
*
|
*
|
||||||
* @return string The response
|
* @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 callable $interviewer A callable that will ask for a question and return the result
|
||||||
* @param OutputInterface $output An Output instance
|
* @param OutputInterface $output An Output instance
|
||||||
* @param callable $validator A PHP callback
|
* @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
|
* @return string The validated response
|
||||||
*
|
*
|
||||||
|
@ -80,6 +80,8 @@ class TableHelper extends Helper
|
|||||||
* @param int $layout self::LAYOUT_*
|
* @param int $layout self::LAYOUT_*
|
||||||
*
|
*
|
||||||
* @return TableHelper
|
* @return TableHelper
|
||||||
|
*
|
||||||
|
* @throws InvalidArgumentException when the table layout is not known
|
||||||
*/
|
*/
|
||||||
public function setLayout($layout)
|
public function setLayout($layout)
|
||||||
{
|
{
|
||||||
|
@ -50,7 +50,7 @@ EOF;
|
|||||||
public function testExecuteListsCommandsWithNamespaceArgument()
|
public function testExecuteListsCommandsWithNamespaceArgument()
|
||||||
{
|
{
|
||||||
|
|
||||||
require_once(realpath(__DIR__.'/../Fixtures/FooCommand.php'));
|
require_once realpath(__DIR__.'/../Fixtures/FooCommand.php');
|
||||||
$application = new Application();
|
$application = new Application();
|
||||||
$application->add(new \FooCommand());
|
$application->add(new \FooCommand());
|
||||||
$commandTester = new CommandTester($command = $application->get('list'));
|
$commandTester = new CommandTester($command = $application->get('list'));
|
||||||
|
@ -197,6 +197,12 @@ class Container implements IntrospectableContainerInterface
|
|||||||
|
|
||||||
$id = strtolower($id);
|
$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 (self::SCOPE_CONTAINER !== $scope) {
|
||||||
if (!isset($this->scopedServices[$scope])) {
|
if (!isset($this->scopedServices[$scope])) {
|
||||||
throw new RuntimeException(sprintf('You cannot set service "%s" of inactive scope.', $id));
|
throw new RuntimeException(sprintf('You cannot set service "%s" of inactive scope.', $id));
|
||||||
@ -233,6 +239,10 @@ class Container implements IntrospectableContainerInterface
|
|||||||
{
|
{
|
||||||
$id = strtolower($id);
|
$id = strtolower($id);
|
||||||
|
|
||||||
|
if ('service_container' === $id) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return isset($this->services[$id])
|
return isset($this->services[$id])
|
||||||
|| array_key_exists($id, $this->services)
|
|| array_key_exists($id, $this->services)
|
||||||
|| isset($this->aliases[$id])
|
|| isset($this->aliases[$id])
|
||||||
@ -251,9 +261,10 @@ class Container implements IntrospectableContainerInterface
|
|||||||
*
|
*
|
||||||
* @return object The associated service
|
* @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 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
|
* @see Reference
|
||||||
*
|
*
|
||||||
@ -269,6 +280,9 @@ class Container implements IntrospectableContainerInterface
|
|||||||
if ($strtolower) {
|
if ($strtolower) {
|
||||||
$id = strtolower($id);
|
$id = strtolower($id);
|
||||||
}
|
}
|
||||||
|
if ('service_container' === $id) {
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
if (isset($this->aliases[$id])) {
|
if (isset($this->aliases[$id])) {
|
||||||
$id = $this->aliases[$id];
|
$id = $this->aliases[$id];
|
||||||
}
|
}
|
||||||
@ -340,6 +354,12 @@ class Container implements IntrospectableContainerInterface
|
|||||||
{
|
{
|
||||||
$id = strtolower($id);
|
$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);
|
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[] = self::underscore($match[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$ids[] = 'service_container';
|
||||||
|
|
||||||
return array_unique(array_merge($ids, array_keys($this->services)));
|
return array_unique(array_merge($ids, array_keys($this->services)));
|
||||||
}
|
}
|
||||||
|
@ -428,7 +428,10 @@ class PhpDumper extends Dumper
|
|||||||
*
|
*
|
||||||
* @param string $id
|
* @param string $id
|
||||||
* @param Definition $definition
|
* @param Definition $definition
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
|
*
|
||||||
|
* @throws ServiceCircularReferenceException when the container contains a circular reference
|
||||||
*/
|
*/
|
||||||
private function addServiceInlinedDefinitionsSetup($id, $definition)
|
private function addServiceInlinedDefinitionsSetup($id, $definition)
|
||||||
{
|
{
|
||||||
@ -632,6 +635,8 @@ EOF;
|
|||||||
*
|
*
|
||||||
* @param string $id A service identifier
|
* @param string $id A service identifier
|
||||||
* @param Definition $definition A Definition instance
|
* @param Definition $definition A Definition instance
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
*/
|
*/
|
||||||
private function addServiceSynchronizer($id, Definition $definition)
|
private function addServiceSynchronizer($id, Definition $definition)
|
||||||
{
|
{
|
||||||
|
@ -243,6 +243,8 @@ class YamlFileLoader extends FileLoader
|
|||||||
* @param string $file
|
* @param string $file
|
||||||
*
|
*
|
||||||
* @return array The file content
|
* @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)
|
protected function loadFile($file)
|
||||||
{
|
{
|
||||||
|
@ -140,7 +140,7 @@ class PhpDumperTest extends \PHPUnit_Framework_TestCase
|
|||||||
eval('?>'.$dumper->dump(array('class' => 'Symfony_DI_PhpDumper_Test_Aliases')));
|
eval('?>'.$dumper->dump(array('class' => 'Symfony_DI_PhpDumper_Test_Aliases')));
|
||||||
|
|
||||||
$container = new \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('foo'));
|
||||||
$this->assertSame($foo, $container->get('alias_for_foo'));
|
$this->assertSame($foo, $container->get('alias_for_foo'));
|
||||||
$this->assertSame($foo, $container->get('alias_for_alias'));
|
$this->assertSame($foo, $container->get('alias_for_alias'));
|
||||||
|
@ -891,7 +891,7 @@ class Crawler extends \SplObjectStorage
|
|||||||
$expression = $nonMatchingExpression;
|
$expression = $nonMatchingExpression;
|
||||||
} elseif (0 === strpos($expression, 'descendant::')) {
|
} elseif (0 === strpos($expression, 'descendant::')) {
|
||||||
$expression = 'descendant-or-self::' . substr($expression, strlen('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;
|
$expression = 'self::' .$expression;
|
||||||
}
|
}
|
||||||
$expressions[] = $parenthesis.$expression;
|
$expressions[] = $parenthesis.$expression;
|
||||||
|
@ -472,6 +472,74 @@ EOF
|
|||||||
$this->assertSame('Music', $crawler->text());
|
$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
|
* @covers Symfony\Component\DomCrawler\Crawler::filter
|
||||||
*/
|
*/
|
||||||
|
@ -495,6 +495,8 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface
|
|||||||
*
|
*
|
||||||
* @param bool $initialize
|
* @param bool $initialize
|
||||||
*
|
*
|
||||||
|
* @return ButtonBuilder
|
||||||
|
*
|
||||||
* @throws BadMethodCallException
|
* @throws BadMethodCallException
|
||||||
*/
|
*/
|
||||||
public function setAutoInitialize($initialize)
|
public function setAutoInitialize($initialize)
|
||||||
|
@ -61,6 +61,8 @@ class BinaryFileResponse extends Response
|
|||||||
* @param null|string $contentDisposition The type of Content-Disposition to set automatically with the filename
|
* @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 $autoEtag Whether the ETag header should be automatically set
|
||||||
* @param bool $autoLastModified Whether the Last-Modified 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)
|
public static function create($file = null, $status = 200, $headers = array(), $public = true, $contentDisposition = null, $autoEtag = false, $autoLastModified = true)
|
||||||
{
|
{
|
||||||
|
@ -781,7 +781,7 @@ class ResponseTest extends ResponseTestCase
|
|||||||
public function invalidContentProvider()
|
public function invalidContentProvider()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
'obj' => array(new \stdClass),
|
'obj' => array(new \stdClass()),
|
||||||
'array' => array(array()),
|
'array' => array(array()),
|
||||||
'bool' => array(true, '1'),
|
'bool' => array(true, '1'),
|
||||||
);
|
);
|
||||||
|
@ -252,8 +252,9 @@ class TraceableEventDispatcher implements EventDispatcherInterface, TraceableEve
|
|||||||
/**
|
/**
|
||||||
* Returns information about the listener
|
* Returns information about the listener
|
||||||
*
|
*
|
||||||
* @param object $listener The listener
|
* @param object $listener The listener
|
||||||
* @param string $eventName The event name
|
* @param int|null $eventId The event id
|
||||||
|
* @param string $eventName The event name
|
||||||
*
|
*
|
||||||
* @return array Information about the listener
|
* @return array Information about the listener
|
||||||
*/
|
*/
|
||||||
|
@ -97,7 +97,7 @@ class FragmentHandler
|
|||||||
* @return string|null The Response content or null when the Response is streamed
|
* @return string|null The Response content or null when the Response is streamed
|
||||||
*
|
*
|
||||||
* @throws \InvalidArgumentException when the renderer does not exist
|
* @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())
|
public function render($uri, $renderer = 'inline', array $options = array())
|
||||||
{
|
{
|
||||||
|
@ -1177,7 +1177,7 @@ class HttpCacheTest extends HttpCacheTestCase
|
|||||||
|
|
||||||
public function testEsiCacheRemoveValidationHeadersIfEmbeddedResponses()
|
public function testEsiCacheRemoveValidationHeadersIfEmbeddedResponses()
|
||||||
{
|
{
|
||||||
$time = new \DateTime;
|
$time = new \DateTime();
|
||||||
|
|
||||||
$responses = array(
|
$responses = array(
|
||||||
array(
|
array(
|
||||||
|
@ -46,7 +46,7 @@ class ExecutableFinderTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
$this->setPath(dirname(PHP_BINARY));
|
$this->setPath(dirname(PHP_BINARY));
|
||||||
|
|
||||||
$finder = new ExecutableFinder;
|
$finder = new ExecutableFinder();
|
||||||
$result = $finder->find($this->getPhpBinaryName());
|
$result = $finder->find($this->getPhpBinaryName());
|
||||||
|
|
||||||
$this->assertSamePath(PHP_BINARY, $result);
|
$this->assertSamePath(PHP_BINARY, $result);
|
||||||
@ -62,7 +62,7 @@ class ExecutableFinderTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
$this->setPath('');
|
$this->setPath('');
|
||||||
|
|
||||||
$finder = new ExecutableFinder;
|
$finder = new ExecutableFinder();
|
||||||
$result = $finder->find('foo', $expected);
|
$result = $finder->find('foo', $expected);
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
$this->assertEquals($expected, $result);
|
||||||
@ -82,7 +82,7 @@ class ExecutableFinderTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
$extraDirs = array(dirname(PHP_BINARY));
|
$extraDirs = array(dirname(PHP_BINARY));
|
||||||
|
|
||||||
$finder = new ExecutableFinder;
|
$finder = new ExecutableFinder();
|
||||||
$result = $finder->find($this->getPhpBinaryName(), null, $extraDirs);
|
$result = $finder->find($this->getPhpBinaryName(), null, $extraDirs);
|
||||||
|
|
||||||
$this->assertSamePath(PHP_BINARY, $result);
|
$this->assertSamePath(PHP_BINARY, $result);
|
||||||
@ -104,7 +104,7 @@ class ExecutableFinderTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
ini_set('open_basedir', dirname(PHP_BINARY).PATH_SEPARATOR.'/');
|
ini_set('open_basedir', dirname(PHP_BINARY).PATH_SEPARATOR.'/');
|
||||||
|
|
||||||
$finder = new ExecutableFinder;
|
$finder = new ExecutableFinder();
|
||||||
$result = $finder->find($this->getPhpBinaryName());
|
$result = $finder->find($this->getPhpBinaryName());
|
||||||
|
|
||||||
$this->assertSamePath(PHP_BINARY, $result);
|
$this->assertSamePath(PHP_BINARY, $result);
|
||||||
|
@ -167,7 +167,7 @@ class SimpleProcessTest extends AbstractProcessTest
|
|||||||
$process = $this->getProcess('php -r "echo \'foo\'; sleep(1); echo \'bar\';"');
|
$process = $this->getProcess('php -r "echo \'foo\'; sleep(1); echo \'bar\';"');
|
||||||
$process->run(function () use ($process) {
|
$process->run(function () use ($process) {
|
||||||
if ($process->isRunning()) {
|
if ($process->isRunning()) {
|
||||||
$process->signal(SIGKILL);
|
$process->signal(defined('SIGKILL') ? SIGKILL : 9);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (RuntimeException $e) {
|
} catch (RuntimeException $e) {
|
||||||
@ -183,7 +183,7 @@ class SimpleProcessTest extends AbstractProcessTest
|
|||||||
$process = $this->getProcess('php -r "echo \'foo\'; sleep(1); echo \'bar\';"');
|
$process = $this->getProcess('php -r "echo \'foo\'; sleep(1); echo \'bar\';"');
|
||||||
$process->run(function () use ($process) {
|
$process->run(function () use ($process) {
|
||||||
if ($process->isRunning()) {
|
if ($process->isRunning()) {
|
||||||
$process->signal(SIGTERM);
|
$process->signal(defined('SIGTERM') ? SIGTERM : 15);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (RuntimeException $e) {
|
} catch (RuntimeException $e) {
|
||||||
|
@ -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 string $name
|
||||||
* @param array $changes
|
* @param array $changes
|
||||||
*/
|
*/
|
||||||
private function updateOldFieldAceProperty($ane, array $changes)
|
private function updateOldFieldAceProperty($name, array $changes)
|
||||||
{
|
{
|
||||||
$currentIds = array();
|
$currentIds = array();
|
||||||
foreach ($changes[1] as $field => $new) {
|
foreach ($changes[1] as $field => $new) {
|
||||||
|
@ -61,6 +61,8 @@ class BCryptPasswordEncoder extends BasePasswordEncoder
|
|||||||
*
|
*
|
||||||
* @return string The encoded password
|
* @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
|
* @link http://lxr.php.net/xref/PHP_5_5/ext/standard/password.c#111
|
||||||
*/
|
*/
|
||||||
public function encodePassword($raw, $salt)
|
public function encodePassword($raw, $salt)
|
||||||
|
@ -89,6 +89,8 @@ abstract class BasePasswordEncoder implements PasswordEncoderInterface
|
|||||||
/**
|
/**
|
||||||
* Checks if the password is too long.
|
* 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
|
* @return bool true if the password is too long, false otherwise
|
||||||
*/
|
*/
|
||||||
protected function isPasswordTooLong($password)
|
protected function isPasswordTooLong($password)
|
||||||
|
@ -117,6 +117,18 @@ class GetSetMethodNormalizer extends SerializerAwareNormalizer implements Normal
|
|||||||
*/
|
*/
|
||||||
public function denormalize($data, $class, $format = null, array $context = array())
|
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);
|
$reflectionClass = new \ReflectionClass($class);
|
||||||
$constructor = $reflectionClass->getConstructor();
|
$constructor = $reflectionClass->getConstructor();
|
||||||
|
|
||||||
@ -127,10 +139,10 @@ class GetSetMethodNormalizer extends SerializerAwareNormalizer implements Normal
|
|||||||
foreach ($constructorParameters as $constructorParameter) {
|
foreach ($constructorParameters as $constructorParameter) {
|
||||||
$paramName = lcfirst($this->formatAttribute($constructorParameter->name));
|
$paramName = lcfirst($this->formatAttribute($constructorParameter->name));
|
||||||
|
|
||||||
if (isset($data[$paramName])) {
|
if (isset($normalizedData[$paramName])) {
|
||||||
$params[] = $data[$paramName];
|
$params[] = $normalizedData[$paramName];
|
||||||
// don't run set for a parameter passed to the constructor
|
// don't run set for a parameter passed to the constructor
|
||||||
unset($data[$paramName]);
|
unset($normalizedData[$paramName]);
|
||||||
} elseif ($constructorParameter->isOptional()) {
|
} elseif ($constructorParameter->isOptional()) {
|
||||||
$params[] = $constructorParameter->getDefaultValue();
|
$params[] = $constructorParameter->getDefaultValue();
|
||||||
} else {
|
} else {
|
||||||
@ -144,10 +156,10 @@ class GetSetMethodNormalizer extends SerializerAwareNormalizer implements Normal
|
|||||||
|
|
||||||
$object = $reflectionClass->newInstanceArgs($params);
|
$object = $reflectionClass->newInstanceArgs($params);
|
||||||
} else {
|
} else {
|
||||||
$object = new $class;
|
$object = new $class();
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($data as $attribute => $value) {
|
foreach ($normalizedData as $attribute => $value) {
|
||||||
$setter = 'set'.$this->formatAttribute($attribute);
|
$setter = 'set'.$this->formatAttribute($attribute);
|
||||||
|
|
||||||
if (method_exists($object, $setter)) {
|
if (method_exists($object, $setter)) {
|
||||||
|
@ -17,6 +17,11 @@ use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
|||||||
|
|
||||||
class GetSetMethodNormalizerTest extends \PHPUnit_Framework_TestCase
|
class GetSetMethodNormalizerTest extends \PHPUnit_Framework_TestCase
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @var GetSetMethodNormalizer
|
||||||
|
*/
|
||||||
|
private $normalizer;
|
||||||
|
|
||||||
protected function setUp()
|
protected function setUp()
|
||||||
{
|
{
|
||||||
$this->serializer = $this->getMock(__NAMESPACE__.'\SerializerNormalizer');
|
$this->serializer = $this->getMock(__NAMESPACE__.'\SerializerNormalizer');
|
||||||
@ -63,6 +68,17 @@ class GetSetMethodNormalizerTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertEquals('bar', $obj->getBar());
|
$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()
|
public function testDenormalizeOnCamelCaseFormat()
|
||||||
{
|
{
|
||||||
$this->normalizer->setCamelizedAttributes(array('camel_case'));
|
$this->normalizer->setCamelizedAttributes(array('camel_case'));
|
||||||
@ -73,6 +89,11 @@ class GetSetMethodNormalizerTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertEquals('camelCase', $obj->getCamelCase());
|
$this->assertEquals('camelCase', $obj->getCamelCase());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testDenormalizeNull()
|
||||||
|
{
|
||||||
|
$this->assertEquals(new GetSetDummy(), $this->normalizer->denormalize(null, __NAMESPACE__.'\GetSetDummy'));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dataProvider attributeProvider
|
* @dataProvider attributeProvider
|
||||||
*/
|
*/
|
||||||
@ -115,6 +136,17 @@ class GetSetMethodNormalizerTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertEquals(array(1, 2, 3), $obj->getBaz());
|
$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
|
* @dataProvider provideCallbacks
|
||||||
*/
|
*/
|
||||||
|
@ -32,4 +32,110 @@ abstract class ConstraintValidator implements ConstraintValidatorInterface
|
|||||||
{
|
{
|
||||||
$this->context = $context;
|
$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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -96,9 +96,9 @@ class ConstraintViolation implements ConstraintViolationInterface
|
|||||||
public function __toString()
|
public function __toString()
|
||||||
{
|
{
|
||||||
if (is_object($this->root)) {
|
if (is_object($this->root)) {
|
||||||
$class = get_class($this->root);
|
$class = 'Object('.get_class($this->root).')';
|
||||||
} elseif (is_array($this->root)) {
|
} elseif (is_array($this->root)) {
|
||||||
$class = "Array";
|
$class = 'Array';
|
||||||
} else {
|
} else {
|
||||||
$class = (string) $this->root;
|
$class = (string) $this->root;
|
||||||
}
|
}
|
||||||
|
@ -32,45 +32,13 @@ abstract class AbstractComparisonValidator extends ConstraintValidator
|
|||||||
|
|
||||||
if (!$this->compareValues($value, $constraint->value)) {
|
if (!$this->compareValues($value, $constraint->value)) {
|
||||||
$this->context->addViolation($constraint->message, array(
|
$this->context->addViolation($constraint->message, array(
|
||||||
'{{ value }}' => $this->valueToString($constraint->value),
|
'{{ value }}' => $this->formatValue($value, true),
|
||||||
'{{ compared_value }}' => $this->valueToString($constraint->value),
|
'{{ compared_value }}' => $this->formatValue($constraint->value, true),
|
||||||
'{{ compared_value_type }}' => $this->valueToType($constraint->value)
|
'{{ 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
|
* Compares the two given values to find if their relationship is valid
|
||||||
*
|
*
|
||||||
|
@ -27,7 +27,9 @@ class BlankValidator extends ConstraintValidator
|
|||||||
public function validate($value, Constraint $constraint)
|
public function validate($value, Constraint $constraint)
|
||||||
{
|
{
|
||||||
if ('' !== $value && null !== $value) {
|
if ('' !== $value && null !== $value) {
|
||||||
$this->context->addViolation($constraint->message, array('{{ value }}' => $value));
|
$this->context->addViolation($constraint->message, array(
|
||||||
|
'{{ value }}' => $this->formatValue($value)
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -108,7 +108,9 @@ class CardSchemeValidator extends ConstraintValidator
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!is_numeric($value)) {
|
if (!is_numeric($value)) {
|
||||||
$this->context->addViolation($constraint->message);
|
$this->context->addViolation($constraint->message, array(
|
||||||
|
'{{ value }}' => $this->formatValue($value),
|
||||||
|
));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -124,6 +126,8 @@ class CardSchemeValidator extends ConstraintValidator
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->context->addViolation($constraint->message);
|
$this->context->addViolation($constraint->message, array(
|
||||||
|
'{{ value }}' => $this->formatValue($value),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -59,25 +59,33 @@ class ChoiceValidator extends ConstraintValidator
|
|||||||
if ($constraint->multiple) {
|
if ($constraint->multiple) {
|
||||||
foreach ($value as $_value) {
|
foreach ($value as $_value) {
|
||||||
if (!in_array($_value, $choices, $constraint->strict)) {
|
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);
|
$count = count($value);
|
||||||
|
|
||||||
if ($constraint->min !== null && $count < $constraint->min) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($constraint->max !== null && $count > $constraint->max) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
} elseif (!in_array($value, $choices, $constraint->strict)) {
|
} 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)
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,7 @@ class CollectionValidator extends ConstraintValidator
|
|||||||
}
|
}
|
||||||
} elseif (!$fieldConstraint instanceof Optional && !$constraint->allowMissingFields) {
|
} elseif (!$fieldConstraint instanceof Optional && !$constraint->allowMissingFields) {
|
||||||
$context->addViolationAt('['.$field.']', $constraint->missingFieldsMessage, array(
|
$context->addViolationAt('['.$field.']', $constraint->missingFieldsMessage, array(
|
||||||
'{{ field }}' => $field
|
'{{ field }}' => $this->formatValue($field)
|
||||||
), null);
|
), null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -67,7 +67,7 @@ class CollectionValidator extends ConstraintValidator
|
|||||||
foreach ($value as $field => $fieldValue) {
|
foreach ($value as $field => $fieldValue) {
|
||||||
if (!isset($constraint->fields[$field])) {
|
if (!isset($constraint->fields[$field])) {
|
||||||
$context->addViolationAt('['.$field.']', $constraint->extraFieldsMessage, array(
|
$context->addViolationAt('['.$field.']', $constraint->extraFieldsMessage, array(
|
||||||
'{{ field }}' => $field
|
'{{ field }}' => $this->formatValue($field)
|
||||||
), $fieldValue);
|
), $fieldValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,9 @@ class CountryValidator extends ConstraintValidator
|
|||||||
$countries = Intl::getRegionBundle()->getCountryNames();
|
$countries = Intl::getRegionBundle()->getCountryNames();
|
||||||
|
|
||||||
if (!isset($countries[$value])) {
|
if (!isset($countries[$value])) {
|
||||||
$this->context->addViolation($constraint->message, array('{{ value }}' => $value));
|
$this->context->addViolation($constraint->message, array(
|
||||||
|
'{{ value }}' => $this->formatValue($value),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,9 @@ class CurrencyValidator extends ConstraintValidator
|
|||||||
$currencies = Intl::getCurrencyBundle()->getCurrencyNames();
|
$currencies = Intl::getCurrencyBundle()->getCurrencyNames();
|
||||||
|
|
||||||
if (!isset($currencies[$value])) {
|
if (!isset($currencies[$value])) {
|
||||||
$this->context->addViolation($constraint->message, array('{{ value }}' => $value));
|
$this->context->addViolation($constraint->message, array(
|
||||||
|
'{{ value }}' => $this->formatValue($value),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,9 @@ class DateValidator extends ConstraintValidator
|
|||||||
$value = (string) $value;
|
$value = (string) $value;
|
||||||
|
|
||||||
if (!preg_match(static::PATTERN, $value, $matches) || !checkdate($matches[2], $matches[3], $matches[1])) {
|
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),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,9 @@ class EmailValidator extends ConstraintValidator
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!$valid) {
|
if (!$valid) {
|
||||||
$this->context->addViolation($constraint->message, array('{{ value }}' => $value));
|
$this->context->addViolation($constraint->message, array(
|
||||||
|
'{{ value }}' => $this->formatValue($value),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,6 +30,8 @@ class FalseValidator extends ConstraintValidator
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->context->addViolation($constraint->message);
|
$this->context->addViolation($constraint->message, array(
|
||||||
|
'{{ value }}' => $this->formatValue($value),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -96,13 +96,17 @@ class FileValidator extends ConstraintValidator
|
|||||||
$path = $value instanceof FileObject ? $value->getPathname() : (string) $value;
|
$path = $value instanceof FileObject ? $value->getPathname() : (string) $value;
|
||||||
|
|
||||||
if (!is_file($path)) {
|
if (!is_file($path)) {
|
||||||
$this->context->addViolation($constraint->notFoundMessage, array('{{ file }}' => $path));
|
$this->context->addViolation($constraint->notFoundMessage, array(
|
||||||
|
'{{ file }}' => $this->formatValue($path)
|
||||||
|
));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_readable($path)) {
|
if (!is_readable($path)) {
|
||||||
$this->context->addViolation($constraint->notReadableMessage, array('{{ file }}' => $path));
|
$this->context->addViolation($constraint->notReadableMessage, array(
|
||||||
|
'{{ file }}' => $this->formatValue($path)
|
||||||
|
));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -126,10 +130,10 @@ class FileValidator extends ConstraintValidator
|
|||||||
|
|
||||||
if ($size > $limit) {
|
if ($size > $limit) {
|
||||||
$this->context->addViolation($constraint->maxSizeMessage, array(
|
$this->context->addViolation($constraint->maxSizeMessage, array(
|
||||||
'{{ size }}' => $size,
|
'{{ size }}' => $size,
|
||||||
'{{ limit }}' => $limit,
|
'{{ limit }}' => $limit,
|
||||||
'{{ suffix }}' => $suffix,
|
'{{ suffix }}' => $suffix,
|
||||||
'{{ file }}' => $path,
|
'{{ file }}' => $this->formatValue($path),
|
||||||
));
|
));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -161,9 +165,9 @@ class FileValidator extends ConstraintValidator
|
|||||||
|
|
||||||
if (false === $valid) {
|
if (false === $valid) {
|
||||||
$this->context->addViolation($constraint->mimeTypesMessage, array(
|
$this->context->addViolation($constraint->mimeTypesMessage, array(
|
||||||
'{{ type }}' => '"'.$mime.'"',
|
'{{ type }}' => $this->formatValue($mime),
|
||||||
'{{ types }}' => '"'.implode('", "', $mimeTypes) .'"',
|
'{{ types }}' => $this->formatValues($mimeTypes),
|
||||||
'{{ file }}' => $path,
|
'{{ file }}' => $this->formatValue($path),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,10 +13,12 @@ namespace Symfony\Component\Validator\Constraints;
|
|||||||
|
|
||||||
use Symfony\Component\Validator\Constraint;
|
use Symfony\Component\Validator\Constraint;
|
||||||
use Symfony\Component\Validator\ConstraintValidator;
|
use Symfony\Component\Validator\ConstraintValidator;
|
||||||
|
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Manuel Reinhard <manu@sprain.ch>
|
* @author Manuel Reinhard <manu@sprain.ch>
|
||||||
* @author Michael Schummel
|
* @author Michael Schummel
|
||||||
|
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||||
* @link http://www.michael-schummel.de/2007/10/05/iban-prufung-mit-php/
|
* @link http://www.michael-schummel.de/2007/10/05/iban-prufung-mit-php/
|
||||||
*/
|
*/
|
||||||
class IbanValidator extends ConstraintValidator
|
class IbanValidator extends ConstraintValidator
|
||||||
@ -30,41 +32,100 @@ class IbanValidator extends ConstraintValidator
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// An IBAN without a country code is not an IBAN.
|
if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
|
||||||
if (0 === preg_match('/[A-Z]/', $value)) {
|
throw new UnexpectedTypeException($value, 'string');
|
||||||
$this->context->addViolation($constraint->message, array('{{ value }}' => $value));
|
}
|
||||||
|
|
||||||
|
$value = (string) $value;
|
||||||
|
|
||||||
|
// Remove spaces
|
||||||
|
$canonicalized = str_replace(' ', '', $value);
|
||||||
|
|
||||||
|
if (strlen($canonicalized) < 4) {
|
||||||
|
$this->context->addViolation($constraint->message, array(
|
||||||
|
'{{ value }}' => $this->formatValue($value),
|
||||||
|
));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$teststring = preg_replace('/\s+/', '', $value);
|
// The IBAN must have at least 4 characters, start with a country
|
||||||
|
// code and contain only digits and (uppercase) characters
|
||||||
if (strlen($teststring) < 4) {
|
if (strlen($canonicalized) < 4 || !ctype_upper($canonicalized{0})
|
||||||
$this->context->addViolation($constraint->message, array('{{ value }}' => $value));
|
|| !ctype_upper($canonicalized{1}) || !ctype_alnum($canonicalized)) {
|
||||||
|
$this->context->addViolation($constraint->message, array(
|
||||||
|
'{{ value }}' => $this->formatValue($value),
|
||||||
|
));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$teststring = substr($teststring, 4)
|
// Move the first four characters to the end
|
||||||
.strval(ord($teststring{0}) - 55)
|
// e.g. CH93 0076 2011 6238 5295 7
|
||||||
.strval(ord($teststring{1}) - 55)
|
// -> 0076 2011 6238 5295 7 CH93
|
||||||
.substr($teststring, 2, 2);
|
$canonicalized = substr($canonicalized, 4).substr($canonicalized, 0, 4);
|
||||||
|
|
||||||
$teststring = preg_replace_callback('/[A-Z]/', function ($letter) {
|
// Convert all remaining letters to their ordinals
|
||||||
return intval(ord(strtolower($letter[0])) - 87);
|
// The result is an integer, which is too large for PHP's int
|
||||||
}, $teststring);
|
// 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;
|
if (false === $checkSum) {
|
||||||
$strlen = strlen($teststring);
|
$this->context->addViolation($constraint->message, array(
|
||||||
for ($pos = 0; $pos < $strlen; $pos += 7) {
|
'{{ value }}' => $this->formatValue($value),
|
||||||
$part = strval($rest).substr($teststring, $pos, 7);
|
));
|
||||||
$rest = intval($part) % 97;
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($rest != 1) {
|
// Do a modulo-97 operation on the large integer
|
||||||
$this->context->addViolation($constraint->message, array('{{ value }}' => $value));
|
// 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;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -91,7 +91,9 @@ class IpValidator extends ConstraintValidator
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!filter_var($value, FILTER_VALIDATE_IP, $flag)) {
|
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),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,5 +42,8 @@ class Isbn extends Constraint
|
|||||||
if (null === $this->isbn10 && null === $this->isbn13) {
|
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'));
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException;
|
|||||||
* Validates whether the value is a valid ISBN-10 or ISBN-13.
|
* Validates whether the value is a valid ISBN-10 or ISBN-13.
|
||||||
*
|
*
|
||||||
* @author The Whole Life To Learn <thewholelifetolearn@gmail.com>
|
* @author The Whole Life To Learn <thewholelifetolearn@gmail.com>
|
||||||
|
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||||
*
|
*
|
||||||
* @see https://en.wikipedia.org/wiki/Isbn
|
* @see https://en.wikipedia.org/wiki/Isbn
|
||||||
*/
|
*/
|
||||||
@ -37,53 +38,71 @@ class IsbnValidator extends ConstraintValidator
|
|||||||
throw new UnexpectedTypeException($value, 'string');
|
throw new UnexpectedTypeException($value, 'string');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_numeric($value)) {
|
$value = (string) $value;
|
||||||
$value = str_replace('-', '', $value);
|
$canonical = strtoupper(str_replace('-', '', $value));
|
||||||
|
|
||||||
|
if ($constraint->isbn10 && $this->isValidIsbn10($canonical)) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$validation = 0;
|
if ($constraint->isbn13 && $this->isValidIsbn13($canonical)) {
|
||||||
$value = strtoupper($value);
|
return;
|
||||||
$valueLength = strlen($value);
|
}
|
||||||
|
|
||||||
if (10 === $valueLength && null !== $constraint->isbn10) {
|
if ($constraint->isbn10 && $constraint->isbn13) {
|
||||||
for ($i = 0; $i < 10; $i++) {
|
$this->context->addViolation($constraint->bothIsbnMessage, array(
|
||||||
if ($value[$i] == 'X') {
|
'{{ value }}' => $this->formatValue($value),
|
||||||
$validation += 10 * intval(10 - $i);
|
));
|
||||||
} else {
|
} elseif ($constraint->isbn10) {
|
||||||
$validation += intval($value[$i]) * intval(10 - $i);
|
$this->context->addViolation($constraint->isbn10Message, array(
|
||||||
}
|
'{{ value }}' => $this->formatValue($value),
|
||||||
}
|
));
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (null !== $constraint->isbn10 && null !== $constraint->isbn13) {
|
$this->context->addViolation($constraint->isbn13Message, array(
|
||||||
$this->context->addViolation($constraint->bothIsbnMessage);
|
'{{ value }}' => $this->formatValue($value),
|
||||||
} elseif (null !== $constraint->isbn10) {
|
));
|
||||||
$this->context->addViolation($constraint->isbn10Message);
|
|
||||||
} else {
|
|
||||||
$this->context->addViolation($constraint->isbn13Message);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,26 +37,35 @@ class IssnValidator extends ConstraintValidator
|
|||||||
throw new UnexpectedTypeException($value, 'string');
|
throw new UnexpectedTypeException($value, 'string');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$value = (string) $value;
|
||||||
|
|
||||||
// Compose regex pattern
|
// Compose regex pattern
|
||||||
$digitsPattern = $constraint->requireHyphen ? '\d{4}-\d{3}' : '\d{4}-?\d{3}';
|
$digitsPattern = $constraint->requireHyphen ? '\d{4}-\d{3}' : '\d{4}-?\d{3}';
|
||||||
$checksumPattern = $constraint->caseSensitive ? '[\d|X]' : '[\d|X|x]';
|
$checkSumPattern = $constraint->caseSensitive ? '[\d|X]' : '[\d|X|x]';
|
||||||
$pattern = "/^".$digitsPattern.$checksumPattern."$/";
|
$pattern = "/^".$digitsPattern.$checkSumPattern."$/";
|
||||||
|
|
||||||
if (!preg_match($pattern, $value)) {
|
if (!preg_match($pattern, $value)) {
|
||||||
$this->context->addViolation($constraint->message);
|
$this->context->addViolation($constraint->message, array(
|
||||||
} else {
|
'{{ value }}' => $this->formatValue($value),
|
||||||
$digits = str_split(strtoupper(str_replace('-', '', $value)));
|
));
|
||||||
|
|
||||||
$sum = 0;
|
return;
|
||||||
for ($i = 8; $i > 1; $i--) {
|
}
|
||||||
$sum += $i * (int) array_shift($digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
$checksum = 'X' == reset($digits) ? 10 : (int) reset($digits);
|
$canonical = strtoupper(str_replace('-', '', $value));
|
||||||
|
|
||||||
if (0 != ($sum + $checksum) % 11) {
|
// Calculate a checksum. "X" equals 10.
|
||||||
$this->context->addViolation($constraint->message);
|
$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),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,9 @@ class LanguageValidator extends ConstraintValidator
|
|||||||
$languages = Intl::getLanguageBundle()->getLanguageNames();
|
$languages = Intl::getLanguageBundle()->getLanguageNames();
|
||||||
|
|
||||||
if (!isset($languages[$value])) {
|
if (!isset($languages[$value])) {
|
||||||
$this->context->addViolation($constraint->message, array('{{ value }}' => $value));
|
$this->context->addViolation($constraint->message, array(
|
||||||
|
'{{ value }}' => $this->formatValue($value),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@ class LengthValidator extends ConstraintValidator
|
|||||||
|
|
||||||
if ($constraint->min == $constraint->max && $length != $constraint->min) {
|
if ($constraint->min == $constraint->max && $length != $constraint->min) {
|
||||||
$this->context->addViolation($constraint->exactMessage, array(
|
$this->context->addViolation($constraint->exactMessage, array(
|
||||||
'{{ value }}' => $stringValue,
|
'{{ value }}' => $this->formatValue($stringValue),
|
||||||
'{{ limit }}' => $constraint->min,
|
'{{ limit }}' => $constraint->min,
|
||||||
), $value, (int) $constraint->min);
|
), $value, (int) $constraint->min);
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ class LengthValidator extends ConstraintValidator
|
|||||||
|
|
||||||
if (null !== $constraint->max && $length > $constraint->max) {
|
if (null !== $constraint->max && $length > $constraint->max) {
|
||||||
$this->context->addViolation($constraint->maxMessage, array(
|
$this->context->addViolation($constraint->maxMessage, array(
|
||||||
'{{ value }}' => $stringValue,
|
'{{ value }}' => $this->formatValue($stringValue),
|
||||||
'{{ limit }}' => $constraint->max,
|
'{{ limit }}' => $constraint->max,
|
||||||
), $value, (int) $constraint->max);
|
), $value, (int) $constraint->max);
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ class LengthValidator extends ConstraintValidator
|
|||||||
|
|
||||||
if (null !== $constraint->min && $length < $constraint->min) {
|
if (null !== $constraint->min && $length < $constraint->min) {
|
||||||
$this->context->addViolation($constraint->minMessage, array(
|
$this->context->addViolation($constraint->minMessage, array(
|
||||||
'{{ value }}' => $stringValue,
|
'{{ value }}' => $this->formatValue($stringValue),
|
||||||
'{{ limit }}' => $constraint->min,
|
'{{ limit }}' => $constraint->min,
|
||||||
), $value, (int) $constraint->min);
|
), $value, (int) $constraint->min);
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,9 @@ class LocaleValidator extends ConstraintValidator
|
|||||||
$locales = Intl::getLocaleBundle()->getLocaleNames();
|
$locales = Intl::getLocaleBundle()->getLocaleNames();
|
||||||
|
|
||||||
if (!isset($locales[$value])) {
|
if (!isset($locales[$value])) {
|
||||||
$this->context->addViolation($constraint->message, array('{{ value }}' => $value));
|
$this->context->addViolation($constraint->message, array(
|
||||||
|
'{{ value }}' => $this->formatValue($value),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,14 +24,17 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException;
|
|||||||
* @see http://en.wikipedia.org/wiki/Luhn_algorithm
|
* @see http://en.wikipedia.org/wiki/Luhn_algorithm
|
||||||
* @author Tim Nagel <t.nagel@infinite.net.au>
|
* @author Tim Nagel <t.nagel@infinite.net.au>
|
||||||
* @author Greg Knapp http://gregk.me/2011/php-implementation-of-bank-card-luhn-algorithm/
|
* @author Greg Knapp http://gregk.me/2011/php-implementation-of-bank-card-luhn-algorithm/
|
||||||
|
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||||
*/
|
*/
|
||||||
class LuhnValidator extends ConstraintValidator
|
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 mixed $value
|
||||||
* @param Constraint $constraint
|
* @param Constraint $constraint
|
||||||
|
*
|
||||||
|
* @throws UnexpectedTypeException when the given credit card number is no string
|
||||||
*/
|
*/
|
||||||
public function validate($value, Constraint $constraint)
|
public function validate($value, Constraint $constraint)
|
||||||
{
|
{
|
||||||
@ -39,28 +42,48 @@ class LuhnValidator extends ConstraintValidator
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// Work with strings only, because long numbers are represented as floats
|
||||||
* need to work with strings only because long numbers are treated as floats and don't work with strlen
|
// internally and don't work with strlen()
|
||||||
*/
|
if (!is_string($value) && !(is_object($value) && method_exists($value, '__toString'))) {
|
||||||
if (!is_string($value)) {
|
|
||||||
throw new UnexpectedTypeException($value, 'string');
|
throw new UnexpectedTypeException($value, 'string');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_numeric($value)) {
|
$value = (string) $value;
|
||||||
$this->context->addViolation($constraint->message);
|
|
||||||
|
if (!ctype_digit($value)) {
|
||||||
|
$this->context->addViolation($constraint->message, array(
|
||||||
|
'{{ value }}' => $this->formatValue($value),
|
||||||
|
));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$checkSum = 0;
|
||||||
$length = strlen($value);
|
$length = strlen($value);
|
||||||
$oddLength = $length % 2;
|
|
||||||
for ($sum = 0, $i = $length - 1; $i >= 0; $i--) {
|
// Starting with the last digit and walking left, add every second
|
||||||
$digit = (int) $value[$i];
|
// digit to the check sum
|
||||||
$sum += (($i % 2) === $oddLength) ? array_sum(str_split($digit * 2)) : $digit;
|
// 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) {
|
// Starting with the second last digit and walking left, double every
|
||||||
$this->context->addViolation($constraint->message);
|
// 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),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,9 @@ class NotBlankValidator extends ConstraintValidator
|
|||||||
public function validate($value, Constraint $constraint)
|
public function validate($value, Constraint $constraint)
|
||||||
{
|
{
|
||||||
if (false === $value || (empty($value) && '0' != $value)) {
|
if (false === $value || (empty($value) && '0' != $value)) {
|
||||||
$this->context->addViolation($constraint->message);
|
$this->context->addViolation($constraint->message, array(
|
||||||
|
'{{ value }}' => $this->formatValue($value),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,13 +27,9 @@ class NullValidator extends ConstraintValidator
|
|||||||
public function validate($value, Constraint $constraint)
|
public function validate($value, Constraint $constraint)
|
||||||
{
|
{
|
||||||
if (null !== $value) {
|
if (null !== $value) {
|
||||||
if (is_object($value)) {
|
$this->context->addViolation($constraint->message, array(
|
||||||
$value = get_class($value);
|
'{{ value }}' => $this->formatValue($value),
|
||||||
} elseif (is_array($value)) {
|
));
|
||||||
$value = 'Array';
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->context->addViolation($constraint->message, array('{{ value }}' => $value));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ class RangeValidator extends ConstraintValidator
|
|||||||
|
|
||||||
if (!is_numeric($value)) {
|
if (!is_numeric($value)) {
|
||||||
$this->context->addViolation($constraint->invalidMessage, array(
|
$this->context->addViolation($constraint->invalidMessage, array(
|
||||||
'{{ value }}' => $value,
|
'{{ value }}' => $this->formatValue($value),
|
||||||
));
|
));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -41,7 +41,9 @@ class RegexValidator extends ConstraintValidator
|
|||||||
$value = (string) $value;
|
$value = (string) $value;
|
||||||
|
|
||||||
if ($constraint->match xor preg_match($constraint->pattern, $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),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,9 @@ class TimeValidator extends ConstraintValidator
|
|||||||
$value = (string) $value;
|
$value = (string) $value;
|
||||||
|
|
||||||
if (!preg_match(static::PATTERN, $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),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,9 @@ class TrueValidator extends ConstraintValidator
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (true !== $value && 1 !== $value && '1' !== $value) {
|
if (true !== $value && 1 !== $value && '1' !== $value) {
|
||||||
$this->context->addViolation($constraint->message);
|
$this->context->addViolation($constraint->message, array(
|
||||||
|
'{{ value }}' => $this->formatValue($value),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ class TypeValidator extends ConstraintValidator
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->context->addViolation($constraint->message, array(
|
$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,
|
'{{ type }}' => $constraint->type,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
@ -51,11 +51,12 @@ class UrlValidator extends ConstraintValidator
|
|||||||
}
|
}
|
||||||
|
|
||||||
$value = (string) $value;
|
$value = (string) $value;
|
||||||
|
|
||||||
$pattern = sprintf(static::PATTERN, implode('|', $constraint->protocols));
|
$pattern = sprintf(static::PATTERN, implode('|', $constraint->protocols));
|
||||||
|
|
||||||
if (!preg_match($pattern, $value)) {
|
if (!preg_match($pattern, $value)) {
|
||||||
$this->context->addViolation($constraint->message, array('{{ value }}' => $value));
|
$this->context->addViolation($constraint->message, array(
|
||||||
|
'{{ value }}' => $this->formatValue($value),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,11 +24,11 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6">
|
<trans-unit id="6">
|
||||||
<source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
|
<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>
|
||||||
<trans-unit id="7">
|
<trans-unit id="7">
|
||||||
<source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
|
<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>
|
||||||
<trans-unit id="8">
|
<trans-unit id="8">
|
||||||
<source>One or more of the given values is invalid.</source>
|
<source>One or more of the given values is invalid.</source>
|
||||||
@ -76,7 +76,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="19">
|
<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>
|
<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>
|
||||||
<trans-unit id="20">
|
<trans-unit id="20">
|
||||||
<source>This value should be {{ limit }} or more.</source>
|
<source>This value should be {{ limit }} or more.</source>
|
||||||
@ -84,7 +84,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="21">
|
<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>
|
<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>
|
||||||
<trans-unit id="22">
|
<trans-unit id="22">
|
||||||
<source>This value should not be blank.</source>
|
<source>This value should not be blank.</source>
|
||||||
@ -180,7 +180,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="48">
|
<trans-unit id="48">
|
||||||
<source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
|
<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>
|
||||||
<trans-unit id="49">
|
<trans-unit id="49">
|
||||||
<source>The file was only partially uploaded.</source>
|
<source>The file was only partially uploaded.</source>
|
||||||
@ -204,15 +204,15 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="54">
|
<trans-unit id="54">
|
||||||
<source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
|
<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>
|
||||||
<trans-unit id="55">
|
<trans-unit id="55">
|
||||||
<source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
|
<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>
|
||||||
<trans-unit id="56">
|
<trans-unit id="56">
|
||||||
<source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
|
<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>
|
||||||
<trans-unit id="57">
|
<trans-unit id="57">
|
||||||
<source>Invalid card number.</source>
|
<source>Invalid card number.</source>
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Validator\Tests\Constraints;
|
namespace Symfony\Component\Validator\Tests\Constraints;
|
||||||
|
|
||||||
|
use Symfony\Component\Intl\Util\IntlTestHelper;
|
||||||
use Symfony\Component\Validator\Constraint;
|
use Symfony\Component\Validator\Constraint;
|
||||||
use Symfony\Component\Validator\Constraints\AbstractComparisonValidator;
|
use Symfony\Component\Validator\Constraints\AbstractComparisonValidator;
|
||||||
|
|
||||||
@ -44,6 +45,8 @@ abstract class AbstractComparisonValidatorTestCase extends \PHPUnit_Framework_Te
|
|||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
->getMock();
|
->getMock();
|
||||||
$this->validator->initialize($this->context);
|
$this->validator->initialize($this->context);
|
||||||
|
|
||||||
|
\Locale::setDefault('en');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -86,12 +89,19 @@ abstract class AbstractComparisonValidatorTestCase extends \PHPUnit_Framework_Te
|
|||||||
/**
|
/**
|
||||||
* @dataProvider provideInvalidComparisons
|
* @dataProvider provideInvalidComparisons
|
||||||
* @param mixed $dirtyValue
|
* @param mixed $dirtyValue
|
||||||
|
* @param mixed $dirtyValueAsString
|
||||||
* @param mixed $comparedValue
|
* @param mixed $comparedValue
|
||||||
* @param mixed $comparedValueString
|
* @param mixed $comparedValueString
|
||||||
* @param string $comparedValueType
|
* @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 = $this->createConstraint(array('value' => $comparedValue));
|
||||||
$constraint->message = 'Constraint Message';
|
$constraint->message = 'Constraint Message';
|
||||||
|
|
||||||
@ -102,7 +112,7 @@ abstract class AbstractComparisonValidatorTestCase extends \PHPUnit_Framework_Te
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('Constraint Message', array(
|
->with('Constraint Message', array(
|
||||||
'{{ value }}' => $comparedValueString,
|
'{{ value }}' => $dirtyValueAsString,
|
||||||
'{{ compared_value }}' => $comparedValueString,
|
'{{ compared_value }}' => $comparedValueString,
|
||||||
'{{ compared_value_type }}' => $comparedValueType
|
'{{ compared_value_type }}' => $comparedValueType
|
||||||
));
|
));
|
||||||
|
@ -51,7 +51,7 @@ class BlankValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
/**
|
/**
|
||||||
* @dataProvider getInvalidValues
|
* @dataProvider getInvalidValues
|
||||||
*/
|
*/
|
||||||
public function testInvalidValues($value)
|
public function testInvalidValues($value, $valueAsString)
|
||||||
{
|
{
|
||||||
$constraint = new Blank(array(
|
$constraint = new Blank(array(
|
||||||
'message' => 'myMessage'
|
'message' => 'myMessage'
|
||||||
@ -60,7 +60,7 @@ class BlankValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $value,
|
'{{ value }}' => $valueAsString,
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($value, $constraint);
|
$this->validator->validate($value, $constraint);
|
||||||
@ -69,10 +69,10 @@ class BlankValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
public function getInvalidValues()
|
public function getInvalidValues()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array('foobar'),
|
array('foobar', '"foobar"'),
|
||||||
array(0),
|
array(0, '0'),
|
||||||
array(false),
|
array(false, 'false'),
|
||||||
array(1234),
|
array(1234, '1234'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -158,7 +158,7 @@ class ChoiceValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => 'baz',
|
'{{ value }}' => '"baz"',
|
||||||
), null, null);
|
), null, null);
|
||||||
|
|
||||||
$this->validator->validate('baz', $constraint);
|
$this->validator->validate('baz', $constraint);
|
||||||
@ -175,7 +175,7 @@ class ChoiceValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => 'baz',
|
'{{ value }}' => '"baz"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate(array('foo', 'baz'), $constraint);
|
$this->validator->validate(array('foo', 'baz'), $constraint);
|
||||||
@ -255,7 +255,7 @@ class ChoiceValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => '2',
|
'{{ value }}' => '"2"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate('2', $constraint);
|
$this->validator->validate('2', $constraint);
|
||||||
@ -287,7 +287,7 @@ class ChoiceValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => '3',
|
'{{ value }}' => '"3"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate(array(2, '3'), $constraint);
|
$this->validator->validate(array(2, '3'), $constraint);
|
||||||
|
@ -147,7 +147,7 @@ abstract class CollectionValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolationAt')
|
->method('addViolationAt')
|
||||||
->with('[baz]', 'myMessage', array(
|
->with('[baz]', 'myMessage', array(
|
||||||
'{{ field }}' => 'baz'
|
'{{ field }}' => '"baz"'
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($data, new Collection(array(
|
$this->validator->validate($data, new Collection(array(
|
||||||
@ -211,7 +211,7 @@ abstract class CollectionValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolationAt')
|
->method('addViolationAt')
|
||||||
->with('[foo]', 'myMessage', array(
|
->with('[foo]', 'myMessage', array(
|
||||||
'{{ field }}' => 'foo',
|
'{{ field }}' => '"foo"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($data, $constraint);
|
$this->validator->validate($data, $constraint);
|
||||||
@ -331,7 +331,7 @@ abstract class CollectionValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolationAt')
|
->method('addViolationAt')
|
||||||
->with('[foo]', 'myMessage', array(
|
->with('[foo]', 'myMessage', array(
|
||||||
'{{ field }}' => 'foo',
|
'{{ field }}' => '"foo"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($data, new Collection(array(
|
$this->validator->validate($data, new Collection(array(
|
||||||
|
@ -96,7 +96,7 @@ class DateTimeValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $dateTime,
|
'{{ value }}' => '"'.$dateTime.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($dateTime, $constraint);
|
$this->validator->validate($dateTime, $constraint);
|
||||||
|
@ -96,7 +96,7 @@ class DateValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $date,
|
'{{ value }}' => '"'.$date.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($date, $constraint);
|
$this->validator->validate($date, $constraint);
|
||||||
|
@ -88,7 +88,7 @@ class EmailValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $email,
|
'{{ value }}' => '"'.$email.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($email, $constraint);
|
$this->validator->validate($email, $constraint);
|
||||||
|
@ -50,10 +50,9 @@ class EqualToValidatorTest extends AbstractComparisonValidatorTestCase
|
|||||||
public function provideInvalidComparisons()
|
public function provideInvalidComparisons()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array(1, 2, '2', 'integer'),
|
array(1, '1', 2, '2', 'integer'),
|
||||||
array('22', '333', "'333'", 'string'),
|
array('22', '"22"', '333', '"333"', 'string'),
|
||||||
array(new \DateTime('2001-01-01'), new \DateTime('2000-01-01'), '2000-01-01 00:00:00', 'DateTime'),
|
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), new ComparisonTest_Class(5), '5', __NAMESPACE__.'\ComparisonTest_Class'),
|
array(new ComparisonTest_Class(4), 'object', new ComparisonTest_Class(5), 'object', __NAMESPACE__.'\ComparisonTest_Class'), );
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@ class FalseValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array());
|
->with('myMessage', array('{{ value }}' => 'true'));
|
||||||
|
|
||||||
$this->validator->validate(true, $constraint);
|
$this->validator->validate(true, $constraint);
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ class FileValidatorPathTest extends FileValidatorTest
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ file }}' => 'foobar',
|
'{{ file }}' => '"foobar"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate('foobar', $constraint);
|
$this->validator->validate('foobar', $constraint);
|
||||||
|
@ -97,7 +97,7 @@ abstract class FileValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
'{{ limit }}' => '10',
|
'{{ limit }}' => '10',
|
||||||
'{{ size }}' => '11',
|
'{{ size }}' => '11',
|
||||||
'{{ suffix }}' => 'bytes',
|
'{{ suffix }}' => 'bytes',
|
||||||
'{{ file }}' => $this->path,
|
'{{ file }}' => '"'.$this->path.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($this->getFile($this->path), $constraint);
|
$this->validator->validate($this->getFile($this->path), $constraint);
|
||||||
@ -118,7 +118,7 @@ abstract class FileValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
'{{ limit }}' => '1',
|
'{{ limit }}' => '1',
|
||||||
'{{ size }}' => '1.4',
|
'{{ size }}' => '1.4',
|
||||||
'{{ suffix }}' => 'kB',
|
'{{ suffix }}' => 'kB',
|
||||||
'{{ file }}' => $this->path,
|
'{{ file }}' => '"'.$this->path.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($this->getFile($this->path), $constraint);
|
$this->validator->validate($this->getFile($this->path), $constraint);
|
||||||
@ -139,7 +139,7 @@ abstract class FileValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
'{{ limit }}' => '1',
|
'{{ limit }}' => '1',
|
||||||
'{{ size }}' => '1.4',
|
'{{ size }}' => '1.4',
|
||||||
'{{ suffix }}' => 'MB',
|
'{{ suffix }}' => 'MB',
|
||||||
'{{ file }}' => $this->path,
|
'{{ file }}' => '"'.$this->path.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($this->getFile($this->path), $constraint);
|
$this->validator->validate($this->getFile($this->path), $constraint);
|
||||||
@ -241,7 +241,7 @@ abstract class FileValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ type }}' => '"application/pdf"',
|
'{{ type }}' => '"application/pdf"',
|
||||||
'{{ types }}' => '"image/png", "image/jpg"',
|
'{{ types }}' => '"image/png", "image/jpg"',
|
||||||
'{{ file }}' => $this->path,
|
'{{ file }}' => '"'.$this->path.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($file, $constraint);
|
$this->validator->validate($file, $constraint);
|
||||||
@ -275,7 +275,7 @@ abstract class FileValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ type }}' => '"application/pdf"',
|
'{{ type }}' => '"application/pdf"',
|
||||||
'{{ types }}' => '"image/*", "image/jpg"',
|
'{{ types }}' => '"image/*", "image/jpg"',
|
||||||
'{{ file }}' => $this->path,
|
'{{ file }}' => '"'.$this->path.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($file, $constraint);
|
$this->validator->validate($file, $constraint);
|
||||||
|
@ -51,9 +51,9 @@ class GreaterThanOrEqualValidatorTest extends AbstractComparisonValidatorTestCas
|
|||||||
public function provideInvalidComparisons()
|
public function provideInvalidComparisons()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array(1, 2, '2', 'integer'),
|
array(1, '1', 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'), 'Jan 1, 2000, 12:00 AM', new \DateTime('2005/01/01'), 'Jan 1, 2005, 12:00 AM', 'DateTime'),
|
||||||
array('b', 'c', "'c'", 'string')
|
array('b', '"b"', 'c', '"c"', 'string')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,14 +49,14 @@ class GreaterThanValidatorTest extends AbstractComparisonValidatorTestCase
|
|||||||
public function provideInvalidComparisons()
|
public function provideInvalidComparisons()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array(1, 2, '2', 'integer'),
|
array(1, '1', 2, '2', 'integer'),
|
||||||
array(2, 2, '2', 'integer'),
|
array(2, '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'), 'Jan 1, 2000, 12:00 AM', new \DateTime('2005/01/01'), 'Jan 1, 2005, 12:00 AM', 'DateTime'),
|
||||||
array(new \DateTime('2000/01/01'), new \DateTime('2000/01/01'), '2000-01-01 00:00:00', '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(4), new ComparisonTest_Class(5), '5', __NAMESPACE__.'\ComparisonTest_Class'),
|
array(new ComparisonTest_Class(5), 'object', new ComparisonTest_Class(5), 'object', __NAMESPACE__.'\ComparisonTest_Class'),
|
||||||
array(new ComparisonTest_Class(5), new ComparisonTest_Class(5), '5', __NAMESPACE__.'\ComparisonTest_Class'),
|
array(new ComparisonTest_Class(5), 'object', new ComparisonTest_Class(5), 'object', __NAMESPACE__.'\ComparisonTest_Class'),
|
||||||
array('22', '333', "'333'", 'string'),
|
array('22', '"22"', '333', '"333"', 'string'),
|
||||||
array('22', '22', "'22'", 'string')
|
array('22', '"22"', '22', '"22"', 'string')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,6 +54,7 @@ class IbanValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array('CH9300762011623852957'), // Switzerland without spaces
|
array('CH9300762011623852957'), // Switzerland without spaces
|
||||||
|
array('CH93 0076 2011 6238 5295 7'), // Switzerland with multiple spaces
|
||||||
|
|
||||||
//Country list
|
//Country list
|
||||||
//http://www.rbs.co.uk/corporate/international/g0/guide-to-international-business/regulatory-information/iban/iban-example.ashx
|
//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())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $iban,
|
'{{ value }}' => '"'.$iban.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($iban, $constraint);
|
$this->validator->validate($iban, $constraint);
|
||||||
@ -182,6 +183,7 @@ class IbanValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
array('foo'),
|
array('foo'),
|
||||||
array('123'),
|
array('123'),
|
||||||
array('0750447346'),
|
array('0750447346'),
|
||||||
|
array('CH930076201162385295]'),
|
||||||
|
|
||||||
//Ibans with lower case values are invalid
|
//Ibans with lower case values are invalid
|
||||||
array('Ae260211000000230064016'),
|
array('Ae260211000000230064016'),
|
||||||
|
@ -52,12 +52,12 @@ class IdenticalToValidatorTest extends AbstractComparisonValidatorTestCase
|
|||||||
public function provideInvalidComparisons()
|
public function provideInvalidComparisons()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array(1, 2, '2', 'integer'),
|
array(1, '1', 2, '2', 'integer'),
|
||||||
array(2, '2', "'2'", 'string'),
|
array(2, '2', '2', '"2"', 'string'),
|
||||||
array('22', '333', "'333'", 'string'),
|
array('22', '"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'), 'Jan 1, 2001, 12:00 AM', new \DateTime('2001-01-01'), 'Jan 1, 2001, 12:00 AM', 'DateTime'),
|
||||||
array(new \DateTime('2001-01-01'), new \DateTime('1999-01-01'), '1999-01-01 00:00:00', '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), new ComparisonTest_Class(5), '5', __NAMESPACE__.'\ComparisonTest_Class'),
|
array(new ComparisonTest_Class(4), 'object', new ComparisonTest_Class(5), 'object', __NAMESPACE__.'\ComparisonTest_Class'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -162,7 +162,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $ip,
|
'{{ value }}' => '"'.$ip.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($ip, $constraint);
|
$this->validator->validate($ip, $constraint);
|
||||||
@ -196,7 +196,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $ip,
|
'{{ value }}' => '"'.$ip.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($ip, $constraint);
|
$this->validator->validate($ip, $constraint);
|
||||||
@ -224,7 +224,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $ip,
|
'{{ value }}' => '"'.$ip.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($ip, $constraint);
|
$this->validator->validate($ip, $constraint);
|
||||||
@ -252,7 +252,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $ip,
|
'{{ value }}' => '"'.$ip.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($ip, $constraint);
|
$this->validator->validate($ip, $constraint);
|
||||||
@ -276,7 +276,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $ip,
|
'{{ value }}' => '"'.$ip.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($ip, $constraint);
|
$this->validator->validate($ip, $constraint);
|
||||||
@ -314,7 +314,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $ip,
|
'{{ value }}' => '"'.$ip.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($ip, $constraint);
|
$this->validator->validate($ip, $constraint);
|
||||||
@ -342,7 +342,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $ip,
|
'{{ value }}' => '"'.$ip.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($ip, $constraint);
|
$this->validator->validate($ip, $constraint);
|
||||||
@ -369,7 +369,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $ip,
|
'{{ value }}' => '"'.$ip.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($ip, $constraint);
|
$this->validator->validate($ip, $constraint);
|
||||||
@ -393,7 +393,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $ip,
|
'{{ value }}' => '"'.$ip.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($ip, $constraint);
|
$this->validator->validate($ip, $constraint);
|
||||||
@ -417,7 +417,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $ip,
|
'{{ value }}' => '"'.$ip.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($ip, $constraint);
|
$this->validator->validate($ip, $constraint);
|
||||||
@ -441,7 +441,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $ip,
|
'{{ value }}' => '"'.$ip.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($ip, $constraint);
|
$this->validator->validate($ip, $constraint);
|
||||||
@ -465,7 +465,7 @@ class IpValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $ip,
|
'{{ value }}' => '"'.$ip.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($ip, $constraint);
|
$this->validator->validate($ip, $constraint);
|
||||||
|
@ -58,6 +58,10 @@ class IsbnValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
array('0-4X19-92611'),
|
array('0-4X19-92611'),
|
||||||
array('0_45122_5244'),
|
array('0_45122_5244'),
|
||||||
array('2870#971#648'),
|
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('980-0474292319'),
|
||||||
array('978_0451225245'),
|
array('978_0451225245'),
|
||||||
array('978#0471292319'),
|
array('978#0471292319'),
|
||||||
|
array('978-272C442282'),
|
||||||
|
// chr(1) evaluates to 0
|
||||||
|
// 978-2070546817 is valid
|
||||||
|
array('978-2'.chr(1).'70546817'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ class LengthValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', $this->identicalTo(array(
|
->with('myMessage', $this->identicalTo(array(
|
||||||
'{{ value }}' => (string) $value,
|
'{{ value }}' => '"'.$value.'"',
|
||||||
'{{ limit }}' => 4,
|
'{{ limit }}' => 4,
|
||||||
)), $this->identicalTo($value), 4);
|
)), $this->identicalTo($value), 4);
|
||||||
|
|
||||||
@ -191,7 +191,7 @@ class LengthValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', $this->identicalTo(array(
|
->with('myMessage', $this->identicalTo(array(
|
||||||
'{{ value }}' => (string) $value,
|
'{{ value }}' => '"'.$value.'"',
|
||||||
'{{ limit }}' => 4,
|
'{{ limit }}' => 4,
|
||||||
)), $this->identicalTo($value), 4);
|
)), $this->identicalTo($value), 4);
|
||||||
|
|
||||||
@ -216,7 +216,7 @@ class LengthValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', $this->identicalTo(array(
|
->with('myMessage', $this->identicalTo(array(
|
||||||
'{{ value }}' => (string) $value,
|
'{{ value }}' => '"'.$value.'"',
|
||||||
'{{ limit }}' => 4,
|
'{{ limit }}' => 4,
|
||||||
)), $this->identicalTo($value), 4);
|
)), $this->identicalTo($value), 4);
|
||||||
|
|
||||||
|
@ -53,10 +53,10 @@ class LessThanOrEqualValidatorTest extends AbstractComparisonValidatorTestCase
|
|||||||
public function provideInvalidComparisons()
|
public function provideInvalidComparisons()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array(2, 1, '1', 'integer'),
|
array(2, '2', 1, '1', 'integer'),
|
||||||
array(new \DateTime('2010-01-01'), new \DateTime('2000-01-01'), '2000-01-01 00:00:00', 'DateTime'),
|
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), new ComparisonTest_Class(4), '4', __NAMESPACE__.'\ComparisonTest_Class'),
|
array(new ComparisonTest_Class(5), 'object', new ComparisonTest_Class(4), 'object', __NAMESPACE__.'\ComparisonTest_Class'),
|
||||||
array('c', 'b', "'b'", 'string')
|
array('c', '"c"', 'b', '"b"', 'string')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,13 +49,13 @@ class LessThanValidatorTest extends AbstractComparisonValidatorTestCase
|
|||||||
public function provideInvalidComparisons()
|
public function provideInvalidComparisons()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array(3, 2, '2', 'integer'),
|
array(3, '3', 2, '2', 'integer'),
|
||||||
array(2, 2, '2', 'integer'),
|
array(2, '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('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'), new \DateTime('2000-01-01'), '2000-01-01 00:00:00', '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), new ComparisonTest_Class(5), '5', __NAMESPACE__.'\ComparisonTest_Class'),
|
array(new ComparisonTest_Class(5), 'object', new ComparisonTest_Class(5), 'object', __NAMESPACE__.'\ComparisonTest_Class'),
|
||||||
array(new ComparisonTest_Class(6), new ComparisonTest_Class(5), '5', __NAMESPACE__.'\ComparisonTest_Class'),
|
array(new ComparisonTest_Class(6), 'object', new ComparisonTest_Class(5), 'object', __NAMESPACE__.'\ComparisonTest_Class'),
|
||||||
array('333', '22', "'22'", 'string'),
|
array('333', '"333"', '22', '"22"', 'string'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,11 +49,11 @@ class NotEqualToValidatorTest extends AbstractComparisonValidatorTestCase
|
|||||||
public function provideInvalidComparisons()
|
public function provideInvalidComparisons()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array(3, 3, '3', 'integer'),
|
array(3, '3', 3, '3', 'integer'),
|
||||||
array('2', 2, '2', 'integer'),
|
array('2', '"2"', 2, '2', 'integer'),
|
||||||
array('a', 'a', "'a'", 'string'),
|
array('a', '"a"', 'a', '"a"', 'string'),
|
||||||
array(new \DateTime('2000-01-01'), new \DateTime('2000-01-01'), '2000-01-01 00:00:00', '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), new ComparisonTest_Class(5), '5', __NAMESPACE__.'\ComparisonTest_Class'),
|
array(new ComparisonTest_Class(5), 'object', new ComparisonTest_Class(5), 'object', __NAMESPACE__.'\ComparisonTest_Class'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,10 +53,10 @@ class NotIdenticalToValidatorTest extends AbstractComparisonValidatorTestCase
|
|||||||
$object = new ComparisonTest_Class(2);
|
$object = new ComparisonTest_Class(2);
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
array(3, 3, '3', 'integer'),
|
array(3, '3', 3, '3', 'integer'),
|
||||||
array('a', 'a', "'a'", 'string'),
|
array('a', '"a"', 'a', '"a"', 'string'),
|
||||||
array($date, $date, '2000-01-01 00:00:00', 'DateTime'),
|
array($date, 'Jan 1, 2000, 12:00 AM', $date, 'Jan 1, 2000, 12:00 AM', 'DateTime'),
|
||||||
array($object, $object, '2', __NAMESPACE__.'\ComparisonTest_Class'),
|
array($object, 'object', $object, 'object', __NAMESPACE__.'\ComparisonTest_Class'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ class NullValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
/**
|
/**
|
||||||
* @dataProvider getInvalidValues
|
* @dataProvider getInvalidValues
|
||||||
*/
|
*/
|
||||||
public function testInvalidValues($value, $readableValue)
|
public function testInvalidValues($value, $valueAsString)
|
||||||
{
|
{
|
||||||
$constraint = new Null(array(
|
$constraint = new Null(array(
|
||||||
'message' => 'myMessage'
|
'message' => 'myMessage'
|
||||||
@ -52,7 +52,7 @@ class NullValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $readableValue,
|
'{{ value }}' => $valueAsString,
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($value, $constraint);
|
$this->validator->validate($value, $constraint);
|
||||||
@ -61,13 +61,14 @@ class NullValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
public function getInvalidValues()
|
public function getInvalidValues()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array(0, 0),
|
array(0, '0'),
|
||||||
array(false, false),
|
array(false, 'false'),
|
||||||
array(true, true),
|
array(true, 'true'),
|
||||||
array('', ''),
|
array('', '""'),
|
||||||
array('foo bar', 'foo bar'),
|
array('foo bar', '"foo bar"'),
|
||||||
array(new \DateTime(), 'DateTime'),
|
array(new \DateTime(), 'object'),
|
||||||
array(array(), 'Array'),
|
array(new \stdClass(), 'object'),
|
||||||
|
array(array(), 'array'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -234,4 +234,19 @@ class RangeValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
$this->validator->validate(21, $constraint);
|
$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',
|
||||||
|
)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -91,7 +91,7 @@ class RegexValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $value,
|
'{{ value }}' => '"'.$value.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($value, $constraint);
|
$this->validator->validate($value, $constraint);
|
||||||
|
@ -96,7 +96,7 @@ class TimeValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $time,
|
'{{ value }}' => '"'.$time.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($time, $constraint);
|
$this->validator->validate($time, $constraint);
|
||||||
|
@ -57,6 +57,7 @@ class TrueValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
|
'{{ value }}' => 'false',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate(false, $constraint);
|
$this->validator->validate(false, $constraint);
|
||||||
|
@ -134,34 +134,34 @@ class TypeValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$file = $this->createFile();
|
$file = $this->createFile();
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
array('foobar', 'numeric', 'foobar'),
|
array('foobar', 'numeric', '"foobar"'),
|
||||||
array('foobar', 'boolean', 'foobar'),
|
array('foobar', 'boolean', '"foobar"'),
|
||||||
array('0', 'integer', '0'),
|
array('0', 'integer', '"0"'),
|
||||||
array('1.5', 'float', '1.5'),
|
array('1.5', 'float', '"1.5"'),
|
||||||
array(12345, 'string', '12345'),
|
array(12345, 'string', '12345'),
|
||||||
array($object, 'boolean', 'stdClass'),
|
array($object, 'boolean', 'object'),
|
||||||
array($object, 'numeric', 'stdClass'),
|
array($object, 'numeric', 'object'),
|
||||||
array($object, 'integer', 'stdClass'),
|
array($object, 'integer', 'object'),
|
||||||
array($object, 'float', 'stdClass'),
|
array($object, 'float', 'object'),
|
||||||
array($object, 'string', 'stdClass'),
|
array($object, 'string', 'object'),
|
||||||
array($object, 'resource', 'stdClass'),
|
array($object, 'resource', 'object'),
|
||||||
array($file, 'boolean', (string) $file),
|
array($file, 'boolean', 'resource'),
|
||||||
array($file, 'numeric', (string) $file),
|
array($file, 'numeric', 'resource'),
|
||||||
array($file, 'integer', (string) $file),
|
array($file, 'integer', 'resource'),
|
||||||
array($file, 'float', (string) $file),
|
array($file, 'float', 'resource'),
|
||||||
array($file, 'string', (string) $file),
|
array($file, 'string', 'resource'),
|
||||||
array($file, 'object', (string) $file),
|
array($file, 'object', 'resource'),
|
||||||
array('12a34', 'digit', '12a34'),
|
array('12a34', 'digit', '"12a34"'),
|
||||||
array('1a#23', 'alnum', '1a#23'),
|
array('1a#23', 'alnum', '"1a#23"'),
|
||||||
array('abcd1', 'alpha', 'abcd1'),
|
array('abcd1', 'alpha', '"abcd1"'),
|
||||||
array("\nabc", 'cntrl', "\nabc"),
|
array("\nabc", 'cntrl', "\"\nabc\""),
|
||||||
array("abc\n", 'graph', "abc\n"),
|
array("abc\n", 'graph', "\"abc\n\""),
|
||||||
array('abCDE', 'lower', 'abCDE'),
|
array('abCDE', 'lower', '"abCDE"'),
|
||||||
array('ABcde', 'upper', 'ABcde'),
|
array('ABcde', 'upper', '"ABcde"'),
|
||||||
array("\nabc", 'print', "\nabc"),
|
array("\nabc", 'print', "\"\nabc\""),
|
||||||
array('abc&$!', 'punct', 'abc&$!'),
|
array('abc&$!', 'punct', '"abc&$!"'),
|
||||||
array("\nabc", 'space', "\nabc"),
|
array("\nabc", 'space', "\"\nabc\""),
|
||||||
array('AR1012', 'xdigit', 'AR1012'),
|
array('AR1012', 'xdigit', '"AR1012"'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,7 +129,7 @@ class UrlValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('myMessage', array(
|
->with('myMessage', array(
|
||||||
'{{ value }}' => $url,
|
'{{ value }}' => '"'.$url.'"',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($url, $constraint);
|
$this->validator->validate($url, $constraint);
|
||||||
|
@ -384,6 +384,8 @@ class Inline
|
|||||||
* @param string $scalar
|
* @param string $scalar
|
||||||
*
|
*
|
||||||
* @return string A YAML string
|
* @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)
|
private static function evaluateScalar($scalar)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user