4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\Validator\Tests\Constraints;
14 use Symfony\Component\Validator\Constraint;
15 use Symfony\Component\Validator\Constraints\Callback;
16 use Symfony\Component\Validator\Constraints\CallbackValidator;
17 use Symfony\Component\Validator\ExecutionContextInterface;
18 use Symfony\Component\Validator\Validation;
20 class CallbackValidatorTest_Class
22 public static function validateCallback($object, ExecutionContextInterface $context)
24 $context->addViolation('Callback message', array('{{ value }}' => 'foobar'));
30 class CallbackValidatorTest_Object
32 public function validate(ExecutionContextInterface $context)
34 $context->addViolation('My message', array('{{ value }}' => 'foobar'));
39 public static function validateStatic($object, ExecutionContextInterface $context)
41 $context->addViolation('Static message', array('{{ value }}' => 'baz'));
47 class CallbackValidatorTest extends AbstractConstraintValidatorTest
49 protected function getApiVersion()
51 return Validation::API_VERSION_2_5;
54 protected function createValidator()
56 return new CallbackValidator();
59 public function testNullIsValid()
61 $this->validator->validate(null, new Callback());
63 $this->assertNoViolation();
66 public function testSingleMethod()
68 $object = new CallbackValidatorTest_Object();
69 $constraint = new Callback('validate');
71 $this->validator->validate($object, $constraint);
73 $this->buildViolation('My message')
74 ->setParameter('{{ value }}', 'foobar')
78 public function testSingleMethodExplicitName()
80 $object = new CallbackValidatorTest_Object();
81 $constraint = new Callback(array('callback' => 'validate'));
83 $this->validator->validate($object, $constraint);
85 $this->buildViolation('My message')
86 ->setParameter('{{ value }}', 'foobar')
90 public function testSingleStaticMethod()
92 $object = new CallbackValidatorTest_Object();
93 $constraint = new Callback('validateStatic');
95 $this->validator->validate($object, $constraint);
97 $this->buildViolation('Static message')
98 ->setParameter('{{ value }}', 'baz')
102 public function testClosure()
104 $object = new CallbackValidatorTest_Object();
105 $constraint = new Callback(function ($object, ExecutionContextInterface $context) {
106 $context->addViolation('My message', array('{{ value }}' => 'foobar'));
111 $this->validator->validate($object, $constraint);
113 $this->buildViolation('My message')
114 ->setParameter('{{ value }}', 'foobar')
118 public function testClosureNullObject()
120 $constraint = new Callback(function ($object, ExecutionContextInterface $context) {
121 $context->addViolation('My message', array('{{ value }}' => 'foobar'));
126 $this->validator->validate(null, $constraint);
128 $this->buildViolation('My message')
129 ->setParameter('{{ value }}', 'foobar')
133 public function testClosureExplicitName()
135 $object = new CallbackValidatorTest_Object();
136 $constraint = new Callback(array(
137 'callback' => function ($object, ExecutionContextInterface $context) {
138 $context->addViolation('My message', array('{{ value }}' => 'foobar'));
144 $this->validator->validate($object, $constraint);
146 $this->buildViolation('My message')
147 ->setParameter('{{ value }}', 'foobar')
151 public function testArrayCallable()
153 $object = new CallbackValidatorTest_Object();
154 $constraint = new Callback(array(__CLASS__.'_Class', 'validateCallback'));
156 $this->validator->validate($object, $constraint);
158 $this->buildViolation('Callback message')
159 ->setParameter('{{ value }}', 'foobar')
163 public function testArrayCallableNullObject()
165 $constraint = new Callback(array(__CLASS__.'_Class', 'validateCallback'));
167 $this->validator->validate(null, $constraint);
169 $this->buildViolation('Callback message')
170 ->setParameter('{{ value }}', 'foobar')
174 public function testArrayCallableExplicitName()
176 $object = new CallbackValidatorTest_Object();
177 $constraint = new Callback(array(
178 'callback' => array(__CLASS__.'_Class', 'validateCallback'),
181 $this->validator->validate($object, $constraint);
183 $this->buildViolation('Callback message')
184 ->setParameter('{{ value }}', 'foobar')
191 public function testLegacySingleMethodBc()
193 $object = new CallbackValidatorTest_Object();
194 $constraint = new Callback(array('validate'));
196 $this->validator->validate($object, $constraint);
198 $this->buildViolation('My message')
199 ->setParameter('{{ value }}', 'foobar')
206 public function testLegacySingleMethodBcExplicitName()
208 $object = new CallbackValidatorTest_Object();
209 $constraint = new Callback(array('methods' => array('validate')));
211 $this->validator->validate($object, $constraint);
213 $this->buildViolation('My message')
214 ->setParameter('{{ value }}', 'foobar')
221 public function testLegacyMultipleMethodsBc()
223 $object = new CallbackValidatorTest_Object();
224 $constraint = new Callback(array('validate', 'validateStatic'));
226 $this->validator->validate($object, $constraint);
228 $this->buildViolation('My message')
229 ->setParameter('{{ value }}', 'foobar')
230 ->buildNextViolation('Static message')
231 ->setParameter('{{ value }}', 'baz')
238 public function testLegacyMultipleMethodsBcExplicitName()
240 $object = new CallbackValidatorTest_Object();
241 $constraint = new Callback(array(
242 'methods' => array('validate', 'validateStatic'),
245 $this->validator->validate($object, $constraint);
247 $this->buildViolation('My message')
248 ->setParameter('{{ value }}', 'foobar')
249 ->buildNextViolation('Static message')
250 ->setParameter('{{ value }}', 'baz')
257 public function testLegacySingleStaticMethodBc()
259 $object = new CallbackValidatorTest_Object();
260 $constraint = new Callback(array(
261 array(__CLASS__.'_Class', 'validateCallback'),
264 $this->validator->validate($object, $constraint);
266 $this->buildViolation('Callback message')
267 ->setParameter('{{ value }}', 'foobar')
274 public function testLegacySingleStaticMethodBcExplicitName()
276 $object = new CallbackValidatorTest_Object();
277 $constraint = new Callback(array(
278 'methods' => array(array(__CLASS__.'_Class', 'validateCallback')),
281 $this->validator->validate($object, $constraint);
283 $this->buildViolation('Callback message')
284 ->setParameter('{{ value }}', 'foobar')
289 * @expectedException \Symfony\Component\Validator\Exception\ConstraintDefinitionException
291 public function testExpectValidMethods()
293 $object = new CallbackValidatorTest_Object();
295 $this->validator->validate($object, new Callback(array('callback' => array('foobar'))));
299 * @expectedException \Symfony\Component\Validator\Exception\ConstraintDefinitionException
301 public function testExpectValidCallbacks()
303 $object = new CallbackValidatorTest_Object();
305 $this->validator->validate($object, new Callback(array('callback' => array('foo', 'bar'))));
309 * @expectedException \Symfony\Component\Validator\Exception\ConstraintDefinitionException
312 public function testLegacyExpectEitherCallbackOrMethods()
314 $object = new CallbackValidatorTest_Object();
316 $this->validator->validate($object, new Callback(array(
317 'callback' => 'validate',
318 'methods' => array('validateStatic'),
322 public function testConstraintGetTargets()
324 $constraint = new Callback(array());
325 $targets = array(Constraint::CLASS_CONSTRAINT, Constraint::PROPERTY_CONSTRAINT);
327 $this->assertEquals($targets, $constraint->getTargets());
330 // Should succeed. Needed when defining constraints as annotations.
331 public function testNoConstructorArguments()
333 $constraint = new Callback();
335 $this->assertSame(array(Constraint::CLASS_CONSTRAINT, Constraint::PROPERTY_CONSTRAINT), $constraint->getTargets());
338 public function testAnnotationInvocationSingleValued()
340 $constraint = new Callback(array('value' => 'validateStatic'));
342 $this->assertEquals(new Callback('validateStatic'), $constraint);
345 public function testAnnotationInvocationMultiValued()
347 $constraint = new Callback(array('value' => array(__CLASS__.'_Class', 'validateCallback')));
349 $this->assertEquals(new Callback(array(__CLASS__.'_Class', 'validateCallback')), $constraint);