Skip to content

Commit

Permalink
BVTCK-45 Adding tests for cross-parameter constraint validator resolu…
Browse files Browse the repository at this point in the history
…tion
  • Loading branch information
gunnarmorling committed Mar 15, 2013
1 parent f68c6d6 commit 7f3270b
Show file tree
Hide file tree
Showing 6 changed files with 196 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -160,16 +160,15 @@ public void testConstraintDefinitionWithWrongGroupType() {
fail( "The groups parameter has to be of type Class<?>[]. The validation should have failed." );
}

//TODO Add test case for Object
@Test(expectedExceptions = ConstraintDefinitionException.class)
@SpecAssertion(section = "3.4", id = "g")
public void testValidatorForCrossParameterConstraintMustValidateObjectArray() throws Exception {
public void testValidatorForCrossParameterConstraintMustValidateObjectOrObjectArray() throws Exception {
Object object = new CalendarService();
Method method = CalendarService.class.getMethod( "createEvent", Date.class, Date.class );
Object[] parameterValues = new Object[2];

executableValidator.validateParameters( object, method, parameterValues );
fail( "Validators for cross-parameter constraints must validate the type Object[]. Expected exception wasn't thrown." );
fail( "Validators for cross-parameter constraints must validate the type Object or Object[]. Expected exception wasn't thrown." );
}

@Test(expectedExceptions = ConstraintDefinitionException.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,11 @@
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import javax.validation.constraintvalidation.SupportedValidationTarget;
import javax.validation.constraintvalidation.ValidationTarget;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.METHOD;
Expand All @@ -30,7 +34,7 @@
/**
* @author Gunnar Morling
*/
@Constraint(validatedBy = InvalidCrossParameterConstraintValidator.class)
@Constraint(validatedBy = InvalidCrossParameterConstraint.Validator.class)
@Target({ TYPE, METHOD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Documented
Expand All @@ -40,4 +44,17 @@
Class<?>[] groups() default { };

Class<? extends Payload>[] payload() default { };

@SupportedValidationTarget(ValidationTarget.PARAMETERS)
public static class Validator implements ConstraintValidator<InvalidCrossParameterConstraint, Integer> {

@Override
public void initialize(InvalidCrossParameterConstraint constraintAnnotation) {
}

@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return false;
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/*
* JBoss, Home of Professional Open Source
* Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.hibernate.beanvalidation.tck.tests.constraints.validatorresolution;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import javax.validation.constraintvalidation.SupportedValidationTarget;
import javax.validation.constraintvalidation.ValidationTarget;

import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
* @author Gunnar Morling
*/
@Documented
@Constraint(validatedBy = CrossParameterConstraintWithObjectArrayValidator.Validator.class)
@Target({ METHOD, CONSTRUCTOR, TYPE, FIELD })
@Retention(RUNTIME)
public @interface CrossParameterConstraintWithObjectArrayValidator {
String message() default "default message";

Class<?>[] groups() default { };

Class<? extends Payload>[] payload() default { };

@SupportedValidationTarget(value = ValidationTarget.PARAMETERS)
public static class Validator
implements ConstraintValidator<CrossParameterConstraintWithObjectArrayValidator, Object[]> {

@Override
public void initialize(CrossParameterConstraintWithObjectArrayValidator parameters) {
}

@Override
public boolean isValid(Object[] parameters, ConstraintValidatorContext constraintValidatorContext) {
constraintValidatorContext.disableDefaultConstraintViolation();
constraintValidatorContext.buildConstraintViolationWithTemplate(
"violation created by validator for Object[]"
).addConstraintViolation();

return false;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* JBoss, Home of Professional Open Source
* Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.hibernate.beanvalidation.tck.tests.constraints.validatorresolution;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import javax.validation.constraintvalidation.SupportedValidationTarget;
import javax.validation.constraintvalidation.ValidationTarget;

import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
* @author Gunnar Morling
*/
@Documented
@Constraint(validatedBy = CrossParameterConstraintWithObjectValidator.Validator.class)
@Target({ METHOD, CONSTRUCTOR, TYPE, FIELD })
@Retention(RUNTIME)
public @interface CrossParameterConstraintWithObjectValidator {
String message() default "default message";

Class<?>[] groups() default { };

Class<? extends Payload>[] payload() default { };

@SupportedValidationTarget(value = ValidationTarget.PARAMETERS)
public static class Validator implements ConstraintValidator<CrossParameterConstraintWithObjectValidator, Object> {

@Override
public void initialize(CrossParameterConstraintWithObjectValidator parameters) {
}

@Override
public boolean isValid(Object parameters, ConstraintValidatorContext constraintValidatorContext) {
constraintValidatorContext.disableDefaultConstraintViolation();
constraintValidatorContext.buildConstraintViolationWithTemplate( "violation created by validator for Object" )
.addConstraintViolation();

return false;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,36 @@ public void testCrossParameterValidatorIsUsedForConstraintExplicitlyTargetingPar
assertCorrectConstraintViolationMessages( violations, "violation created by cross-parameter validator" );
}

@Test
@SpecAssertions({
@SpecAssertion(section = "3.4", id = "g"),
@SpecAssertion(section = "4.6.4", id = "a")
})
public void testCrossParameterValidatorValidatingObjectArray() throws Exception {
Object object = new YetAnotherCalendarService();
Method method = YetAnotherCalendarService.class.getMethod( "createEvent", Date.class, Date.class );
Object[] parameterValues = new Object[2];

Set<ConstraintViolation<Object>> violations = validator.forExecutables()
.validateParameters( object, method, parameterValues );
assertCorrectConstraintViolationMessages( violations, "violation created by validator for Object[]" );
}

@Test
@SpecAssertions({
@SpecAssertion(section = "3.4", id = "g"),
@SpecAssertion(section = "4.6.4", id = "a")
})
public void testCrossParameterValidatorValidatingObject() throws Exception {
Object object = new EvenYetAnotherCalendarService();
Method method = EvenYetAnotherCalendarService.class.getMethod( "createEvent", Date.class, Date.class );
Object[] parameterValues = new Object[2];

Set<ConstraintViolation<Object>> violations = validator.forExecutables()
.validateParameters( object, method, parameterValues );
assertCorrectConstraintViolationMessages( violations, "violation created by validator for Object" );
}

@Test
@SpecAssertion(section = "4.6.4", id = "f")
public void testGenericValidatorIsUsedForConstraintTargetingMethodReturnValue() throws Exception {
Expand Down Expand Up @@ -457,6 +487,20 @@ public Object createEvent(Date startDate, Date endDate) {
}
}

private static class YetAnotherCalendarService {

@CrossParameterConstraintWithObjectArrayValidator
public void createEvent(Date startDate, Date endDate) {
}
}

private static class EvenYetAnotherCalendarService {

@CrossParameterConstraintWithObjectValidator
public void createEvent(Date startDate, Date endDate) {
}
}

private static class TestBean {

@GenericAndCrossParameterConstraint
Expand Down

0 comments on commit 7f3270b

Please sign in to comment.