/*
* Hibernate Validator, declare and validate application constraints
*
* License: Apache License, Version 2.0
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package org.hibernate.validator.test.internal.engine.cascaded;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static org.hibernate.validator.testutil.ConstraintViolationAssert.assertCorrectPropertyPaths;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.ConstraintViolation;
import javax.validation.Payload;
import javax.validation.Valid;
import javax.validation.Validator;
import org.hibernate.validator.testutil.TestForIssue;
import org.hibernate.validator.testutils.ValidatorUtil;
import org.testng.annotations.Test;
/**
* @author Hardy Ferentschik
*/
public class CascadedClassConstraintTest {
@Test
@TestForIssue( jiraKey = "HV-509")
public void testCascadedValidation() {
Validator validator = ValidatorUtil.getValidator();
Set<ConstraintViolation<Bar>> violations = validator.validate( new Bar() );
assertCorrectPropertyPaths( violations, "foos[0]", "foos[1]" );
}
@Test
public void testCascadedValidationViaTypeParameterOnField() {
Validator validator = ValidatorUtil.getValidator();
Set<ConstraintViolation<BarUsingTypeParameterOnField>> violations = validator.validate( new BarUsingTypeParameterOnField() );
assertCorrectPropertyPaths( violations, "foos[0]", "foos[1]" );
}
@Test
public void testCascadedValidationViaTypeParameterOnGetter() {
Validator validator = ValidatorUtil.getValidator();
Set<ConstraintViolation<BarUsingTypeParameterOnGetter>> violations = validator.validate( new BarUsingTypeParameterOnGetter() );
assertCorrectPropertyPaths( violations, "foos[0]", "foos[1]" );
}
@ValidFoo
private static class Foo {
}
private static class Bar {
@Valid
private final List<Foo> foos = Arrays.asList( new Foo(), new Foo() );
}
private static class BarUsingTypeParameterOnField {
private final List<@Valid Foo> foos = Arrays.asList( new Foo(), new Foo() );
}
private static class BarUsingTypeParameterOnGetter {
private List<@Valid Foo> getFoos() {
return Arrays.asList( new Foo(), new Foo() );
}
}
@Constraint(validatedBy = { ValidFooValidator.class })
@Target({ TYPE })
@Retention(RUNTIME)
public @interface ValidFoo {
String message() default "{ValidFoo.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
public static class ValidFooValidator implements ConstraintValidator<ValidFoo, Foo> {
@Override
public boolean isValid(Foo foo, ConstraintValidatorContext context) {
return false;
}
}
}