/*
* 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.ap;
import static org.hibernate.validator.ap.testutil.CompilerTestHelper.assertThatDiagnosticsMatch;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import java.io.File;
import java.util.EnumSet;
import java.util.Locale;
import javax.tools.Diagnostic;
import javax.tools.Diagnostic.Kind;
import org.hibernate.validator.ap.testmodel.FieldLevelValidationUsingBuiltInConstraints;
import org.hibernate.validator.ap.testmodel.MethodLevelValidationUsingBuiltInConstraints;
import org.hibernate.validator.ap.testmodel.ModelWithDateConstraints;
import org.hibernate.validator.ap.testmodel.ModelWithJava8DateTime;
import org.hibernate.validator.ap.testmodel.ModelWithJavaMoneyTypes;
import org.hibernate.validator.ap.testmodel.ModelWithJodaTypes;
import org.hibernate.validator.ap.testmodel.ModelWithoutConstraints;
import org.hibernate.validator.ap.testmodel.MultipleConstraintsOfSameType;
import org.hibernate.validator.ap.testmodel.ValidationUsingAtValidAnnotation;
import org.hibernate.validator.ap.testmodel.boxing.ValidLong;
import org.hibernate.validator.ap.testmodel.boxing.ValidLongValidator;
import org.hibernate.validator.ap.testmodel.boxing.ValidationUsingBoxing;
import org.hibernate.validator.ap.testmodel.classlevelconstraints.ClassLevelValidation;
import org.hibernate.validator.ap.testmodel.classlevelconstraints.ValidCustomer;
import org.hibernate.validator.ap.testmodel.classlevelconstraints.ValidCustomerValidator;
import org.hibernate.validator.ap.testmodel.composedconstraint.FieldLevelValidationUsingComposedConstraint;
import org.hibernate.validator.ap.testmodel.composedconstraint.ValidOrderNumber;
import org.hibernate.validator.ap.testmodel.composedconstraint2.ComposedConstraint;
import org.hibernate.validator.ap.testmodel.composedconstraint2.ComposingConstraint1;
import org.hibernate.validator.ap.testmodel.composedconstraint2.ComposingConstraint1ValidatorForGregorianCalendar;
import org.hibernate.validator.ap.testmodel.composedconstraint2.ComposingConstraint1ValidatorForList;
import org.hibernate.validator.ap.testmodel.composedconstraint2.ComposingConstraint1ValidatorForString;
import org.hibernate.validator.ap.testmodel.composedconstraint2.ComposingConstraint2;
import org.hibernate.validator.ap.testmodel.composedconstraint2.ComposingConstraint2ValidatorForArrayList;
import org.hibernate.validator.ap.testmodel.composedconstraint2.ComposingConstraint2ValidatorForCalendar;
import org.hibernate.validator.ap.testmodel.composedconstraint2.ComposingConstraint2ValidatorForCollection;
import org.hibernate.validator.ap.testmodel.composedconstraint2.FieldLevelValidationUsingComplexComposedConstraint;
import org.hibernate.validator.ap.testmodel.crossparameters.GenericCrossParameterValidator;
import org.hibernate.validator.ap.testmodel.crossparameters.GenericCrossParameterValidatorObjectArray;
import org.hibernate.validator.ap.testmodel.crossparameters.GenericNormalValidator;
import org.hibernate.validator.ap.testmodel.crossparameters.MethodLevelValidationUsingCrossParameterConstraints;
import org.hibernate.validator.ap.testmodel.crossparameters.ValidCrossParameterAndNormalConstraint;
import org.hibernate.validator.ap.testmodel.crossparameters.ValidCrossParameterConstraint;
import org.hibernate.validator.ap.testmodel.customconstraints.BeanValidationConstraints;
import org.hibernate.validator.ap.testmodel.customconstraints.CaseMode;
import org.hibernate.validator.ap.testmodel.customconstraints.CheckCase;
import org.hibernate.validator.ap.testmodel.customconstraints.CheckCaseValidator;
import org.hibernate.validator.ap.testmodel.customconstraints.FieldLevelValidationUsingCustomConstraints;
import org.hibernate.validator.ap.testmodel.customconstraints.HibernateValidatorProvidedCustomConstraints;
import org.hibernate.validator.ap.testmodel.groupsequenceprovider.BazDefaultGroupSequenceProvider;
import org.hibernate.validator.ap.testmodel.groupsequenceprovider.FooBarBazDefaultGroupSequenceProvider;
import org.hibernate.validator.ap.testmodel.groupsequenceprovider.FooBarDefaultGroupSequenceProvider;
import org.hibernate.validator.ap.testmodel.groupsequenceprovider.FooDefaultGroupSequenceProvider;
import org.hibernate.validator.ap.testmodel.groupsequenceprovider.GroupSequenceProviderDefinition;
import org.hibernate.validator.ap.testmodel.groupsequenceprovider.QuxDefaultGroupSequenceProvider;
import org.hibernate.validator.ap.testmodel.groupsequenceprovider.SampleDefaultGroupSequenceProvider;
import org.hibernate.validator.ap.testmodel.inheritedvalidator.AbstractCustomConstraintValidator;
import org.hibernate.validator.ap.testmodel.inheritedvalidator.CustomConstraint;
import org.hibernate.validator.ap.testmodel.inheritedvalidator.CustomConstraintValidator;
import org.hibernate.validator.ap.testmodel.inheritedvalidator.FieldLevelValidationUsingInheritedValidator;
import org.hibernate.validator.ap.testmodel.nouniquevalidatorresolution.NoUniqueValidatorResolution;
import org.hibernate.validator.ap.testmodel.nouniquevalidatorresolution.SerializableCollection;
import org.hibernate.validator.ap.testmodel.nouniquevalidatorresolution.Size;
import org.hibernate.validator.ap.testmodel.nouniquevalidatorresolution.SizeValidatorForCollection;
import org.hibernate.validator.ap.testmodel.nouniquevalidatorresolution.SizeValidatorForSerializable;
import org.hibernate.validator.ap.testmodel.nouniquevalidatorresolution.SizeValidatorForSet;
import org.hibernate.validator.ap.testmodel.overriding.MethodOverridingTests;
import org.hibernate.validator.ap.testutil.CompilerTestHelper.Library;
import org.hibernate.validator.ap.util.DiagnosticExpectation;
import org.hibernate.validator.testutil.TestForIssue;
import org.testng.annotations.Test;
/**
* Miscellaneous tests for {@link ConstraintValidationProcessor}.
*
* @author Gunnar Morling
* @author Kevin Pollet <kevin.pollet@serli.com> (C) 2011 SERLI
*/
public class ConstraintValidationProcessorTest extends ConstraintValidationProcessorTestBase {
@Test
public void fieldLevelValidationUsingBuiltInConstraints() {
File sourceFile = compilerHelper.getSourceFile( FieldLevelValidationUsingBuiltInConstraints.class );
boolean compilationResult =
compilerHelper.compile( new ConstraintValidationProcessor(), diagnostics, sourceFile );
assertFalse( compilationResult );
assertThatDiagnosticsMatch(
diagnostics, new DiagnosticExpectation( Kind.ERROR, 43 ), new DiagnosticExpectation( Kind.ERROR, 49 )
);
}
@Test
@TestForIssue( jiraKey = "HV-840" )
public void overridingMethodParameterConstraintsTest() {
File sourceFile = compilerHelper.getSourceFile( MethodOverridingTests.class );
boolean compilationResult = compilerHelper.compile( new ConstraintValidationProcessor(), diagnostics, sourceFile );
assertFalse( compilationResult );
assertThatDiagnosticsMatch(
diagnostics,
new DiagnosticExpectation( Kind.ERROR, 39 ),
new DiagnosticExpectation( Kind.ERROR, 56 ),
new DiagnosticExpectation( Kind.ERROR, 71 ),
new DiagnosticExpectation( Kind.ERROR, 90 ),
new DiagnosticExpectation( Kind.ERROR, 144 ),
new DiagnosticExpectation( Kind.ERROR, 152 ),
new DiagnosticExpectation( Kind.ERROR, 169 ),
new DiagnosticExpectation( Kind.ERROR, 191 ),
new DiagnosticExpectation( Kind.ERROR, 219 ),
new DiagnosticExpectation( Kind.ERROR, 373 ),
new DiagnosticExpectation( Kind.ERROR, 387 ),
new DiagnosticExpectation( Kind.ERROR, 409 ),
new DiagnosticExpectation( Kind.ERROR, 434 )
);
assertEquals( diagnostics.getDiagnostics().get( 0 ).getMessage( Locale.getDefault() ),
"Method parameters do not respect the inheritance rules. " +
"In subtypes, no parameter constraints may be declared on overridden or implemented methods, nor may parameters be marked for cascaded validation. " +
"Types that contain the overridden methods are: [ org.hibernate.validator.ap.testmodel.overriding.MethodOverridingTests.MethodOverridingTestCase1 ]." );
assertEquals( diagnostics.getDiagnostics().get( 11 ).getMessage( Locale.getDefault() ),
"Method parameters do not respect inheritance rules. " +
"If a subtype overrides/implements a method originally defined in several parallel types of the hierarchy, " +
"no parameter constraints may be declared for that method nor parameters be marked for cascaded validation. " +
"Parallel method definitions are in: [ java.lang.Object, org.hibernate.validator.ap.testmodel.overriding.MethodOverridingTests.Case15.SimpleService ]." );
}
@Test
@TestForIssue( jiraKey = "HV-567" )
public void hibernateValidatorProvidedCustomConstraints() {
File sourceFile = compilerHelper.getSourceFile( HibernateValidatorProvidedCustomConstraints.class );
boolean compilationResult =
compilerHelper.compile( new ConstraintValidationProcessor(), diagnostics, sourceFile );
assertFalse( compilationResult );
assertThatDiagnosticsMatch(
diagnostics,
new DiagnosticExpectation( Kind.ERROR, 68 ),
new DiagnosticExpectation( Kind.ERROR, 69 ),
new DiagnosticExpectation( Kind.ERROR, 70 ),
new DiagnosticExpectation( Kind.ERROR, 71 ),
new DiagnosticExpectation( Kind.ERROR, 72 ),
new DiagnosticExpectation( Kind.ERROR, 73 ),
new DiagnosticExpectation( Kind.ERROR, 74 ),
new DiagnosticExpectation( Kind.ERROR, 75 ),
new DiagnosticExpectation( Kind.ERROR, 76 ),
new DiagnosticExpectation( Kind.ERROR, 77 ),
new DiagnosticExpectation( Kind.ERROR, 78 ),
new DiagnosticExpectation( Kind.ERROR, 79 ),
new DiagnosticExpectation( Kind.ERROR, 80 ),
new DiagnosticExpectation( Kind.ERROR, 81 ),
new DiagnosticExpectation( Kind.ERROR, 82 ),
new DiagnosticExpectation( Kind.ERROR, 83 ),
new DiagnosticExpectation( Kind.ERROR, 84 ),
new DiagnosticExpectation( Kind.ERROR, 85 ),
new DiagnosticExpectation( Kind.ERROR, 86 ),
new DiagnosticExpectation( Kind.ERROR, 87 )
);
}
@Test
@TestForIssue( jiraKey = "HV-1297" )
public void beanValidationConstraints() {
File sourceFile = compilerHelper.getSourceFile( BeanValidationConstraints.class );
boolean compilationResult =
compilerHelper.compile( new ConstraintValidationProcessor(), diagnostics, sourceFile );
assertFalse( compilationResult );
assertThatDiagnosticsMatch(
diagnostics,
new DiagnosticExpectation( Kind.ERROR, 39 ),
new DiagnosticExpectation( Kind.ERROR, 40 ),
new DiagnosticExpectation( Kind.ERROR, 41 ),
new DiagnosticExpectation( Kind.ERROR, 42 ),
new DiagnosticExpectation( Kind.ERROR, 45 ),
new DiagnosticExpectation( Kind.ERROR, 46 ),
new DiagnosticExpectation( Kind.ERROR, 47 ),
new DiagnosticExpectation( Kind.ERROR, 50 )
);
}
/**
* HV-575. Make sure that the AP can be applied to projects which don't have
* the BV API or Hibernate Validator on the class path without failing.
*/
@Test
public void modelWithoutConstraintsCanBeProcessedWithoutBvAndHvOnClassPath() {
File sourceFile = compilerHelper.getSourceFile( ModelWithoutConstraints.class );
boolean compilationResult =
compilerHelper.compile(
new ConstraintValidationProcessor(),
diagnostics,
EnumSet.noneOf( Library.class ),
sourceFile
);
assertTrue( compilationResult );
}
/**
* HV-575. Make sure that @Past/@Future can be validated for JDK types, also
* if JodaTime isn't available.
*/
@Test
public void modelWithDateConstraintsCanBeProcessedWithoutJodaTimeOnClassPath() {
File sourceFile = compilerHelper.getSourceFile( ModelWithDateConstraints.class );
boolean compilationResult =
compilerHelper.compile(
new ConstraintValidationProcessor(),
diagnostics,
EnumSet.of( Library.VALIDATION_API ),
sourceFile
);
assertFalse( compilationResult );
assertThatDiagnosticsMatch(
diagnostics,
new DiagnosticExpectation( Kind.ERROR, 17 )
);
}
/**
* HV-575. Missing classes shall not break the AP, instead the compiler
* should display appropriate errors.
*/
@Test
public void missingClassesHandledByCompiler() {
File sourceFile = compilerHelper.getSourceFile( ModelWithDateConstraints.class );
boolean compilationResult =
compilerHelper.compile(
new ConstraintValidationProcessor(),
diagnostics,
EnumSet.noneOf( Library.class ),
sourceFile
);
assertFalse( compilationResult );
assertThatDiagnosticsMatch(
diagnostics,
new DiagnosticExpectation( Kind.ERROR, 10 ),
new DiagnosticExpectation( Kind.ERROR, 17 ),
new DiagnosticExpectation( Kind.ERROR, 20 )
);
}
@Test
public void testThatProcessorOptionsAreEvaluated() {
File sourceFile = compilerHelper.getSourceFile( FieldLevelValidationUsingBuiltInConstraints.class );
// compile with -AdiagnosticKind=Kind.WARNING and -Averbose=true
boolean compilationResult =
compilerHelper.compile(
new ConstraintValidationProcessor(),
diagnostics,
Kind.WARNING,
true,
false,
EnumSet.allOf( Library.class ),
sourceFile
);
// compilation succeeds as there are problems, but Kind.WARNING won't stop compilation
assertTrue( compilationResult );
assertThatDiagnosticsMatch(
diagnostics,
new DiagnosticExpectation( Kind.NOTE, Diagnostic.NOPOS ), //says that verbose messaging is enabled
new DiagnosticExpectation( Kind.WARNING, 43 ),
new DiagnosticExpectation( Kind.WARNING, 49 )
);
}
@Test
public void fieldLevelValidationUsingCustomConstraints() {
File sourceFile1 = compilerHelper.getSourceFile( FieldLevelValidationUsingCustomConstraints.class );
File sourceFile2 = compilerHelper.getSourceFile( CheckCase.class );
File sourceFile3 = compilerHelper.getSourceFile( CaseMode.class );
File sourceFile4 = compilerHelper.getSourceFile( CheckCaseValidator.class );
boolean compilationResult =
compilerHelper.compile(
new ConstraintValidationProcessor(),
diagnostics,
sourceFile1,
sourceFile2,
sourceFile3,
sourceFile4
);
assertFalse( compilationResult );
assertThatDiagnosticsMatch( diagnostics, new DiagnosticExpectation( Kind.ERROR, 19 ) );
}
@Test
public void testThatInheritedValidatorClassesAreHandledCorrectly() {
File sourceFile1 = compilerHelper.getSourceFile( FieldLevelValidationUsingInheritedValidator.class );
File sourceFile2 = compilerHelper.getSourceFile( CustomConstraint.class );
File sourceFile3 = compilerHelper.getSourceFile( AbstractCustomConstraintValidator.class );
File sourceFile4 = compilerHelper.getSourceFile( CustomConstraintValidator.class );
boolean compilationResult =
compilerHelper.compile(
new ConstraintValidationProcessor(),
diagnostics,
sourceFile1,
sourceFile2,
sourceFile3,
sourceFile4
);
assertFalse( compilationResult );
assertThatDiagnosticsMatch( diagnostics, new DiagnosticExpectation( Kind.ERROR, 19 ) );
}
@Test
public void methodLevelValidationUsingBuiltInConstraints() {
File sourceFile = compilerHelper.getSourceFile( MethodLevelValidationUsingBuiltInConstraints.class );
boolean compilationResult =
compilerHelper.compile( new ConstraintValidationProcessor(), diagnostics, false, false, sourceFile );
assertFalse( compilationResult );
assertThatDiagnosticsMatch(
diagnostics,
new DiagnosticExpectation( Kind.ERROR, 21 ),
new DiagnosticExpectation( Kind.ERROR, 28 ),
new DiagnosticExpectation( Kind.ERROR, 36 ),
new DiagnosticExpectation( Kind.ERROR, 43 ),
new DiagnosticExpectation( Kind.ERROR, 51 ),
new DiagnosticExpectation( Kind.ERROR, 59 ),
new DiagnosticExpectation( Kind.ERROR, 67 ),
new DiagnosticExpectation( Kind.ERROR, 74 )
);
}
/**
* Constraints are allowed at non-getters per processor option, but all other
* checks (no static methods allowed etc.) still apply.
*/
@Test
public void methodLevelConstraintsAllowedAtNonGetterMethods() {
File sourceFile = compilerHelper.getSourceFile( MethodLevelValidationUsingBuiltInConstraints.class );
//compile with -AmethodConstraintsSupported
boolean compilationResult =
compilerHelper.compile( new ConstraintValidationProcessor(), diagnostics, false, true, sourceFile );
assertFalse( compilationResult );
assertThatDiagnosticsMatch(
diagnostics,
new DiagnosticExpectation( Kind.ERROR, 21 ),
new DiagnosticExpectation( Kind.ERROR, 28 ),
new DiagnosticExpectation( Kind.ERROR, 36 ),
new DiagnosticExpectation( Kind.ERROR, 43 ),
new DiagnosticExpectation( Kind.ERROR, 59 ),
new DiagnosticExpectation( Kind.ERROR, 67 ),
new DiagnosticExpectation( Kind.ERROR, 74 )
);
}
@Test
public void classLevelValidation() {
File sourceFile1 = compilerHelper.getSourceFile( ClassLevelValidation.class );
File sourceFile2 = compilerHelper.getSourceFile( ValidCustomer.class );
File sourceFile3 = compilerHelper.getSourceFile( ValidCustomerValidator.class );
boolean compilationResult =
compilerHelper.compile(
new ConstraintValidationProcessor(), diagnostics, sourceFile1, sourceFile2, sourceFile3
);
assertFalse( compilationResult );
assertThatDiagnosticsMatch( diagnostics, new DiagnosticExpectation( Kind.ERROR, 17 ) );
}
@Test
public void validationUsingComposedConstraint() {
File sourceFile1 = compilerHelper.getSourceFile( FieldLevelValidationUsingComposedConstraint.class );
File sourceFile2 = compilerHelper.getSourceFile( ValidOrderNumber.class );
boolean compilationResult =
compilerHelper.compile( new ConstraintValidationProcessor(), diagnostics, sourceFile1, sourceFile2 );
assertFalse( compilationResult );
assertThatDiagnosticsMatch( diagnostics, new DiagnosticExpectation( Kind.ERROR, 18 ) );
}
@Test
public void validationUsingComplexComposedConstraint() {
File sourceFile1 = compilerHelper.getSourceFile( FieldLevelValidationUsingComplexComposedConstraint.class );
File sourceFile2 = compilerHelper.getSourceFile( ComposedConstraint.class );
File sourceFile3 = compilerHelper.getSourceFile( ComposingConstraint1.class );
File sourceFile4 = compilerHelper.getSourceFile( ComposingConstraint1ValidatorForString.class );
File sourceFile5 = compilerHelper.getSourceFile( ComposingConstraint1ValidatorForGregorianCalendar.class );
File sourceFile6 = compilerHelper.getSourceFile( ComposingConstraint1ValidatorForList.class );
File sourceFile7 = compilerHelper.getSourceFile( ComposingConstraint2.class );
File sourceFile8 = compilerHelper.getSourceFile( ComposingConstraint2ValidatorForArrayList.class );
File sourceFile9 = compilerHelper.getSourceFile( ComposingConstraint2ValidatorForCalendar.class );
File sourceFile10 = compilerHelper.getSourceFile( ComposingConstraint2ValidatorForCollection.class );
boolean compilationResult =
compilerHelper.compile(
new ConstraintValidationProcessor(),
diagnostics,
sourceFile1,
sourceFile2,
sourceFile3,
sourceFile4,
sourceFile5,
sourceFile6,
sourceFile7,
sourceFile8,
sourceFile9,
sourceFile10
);
assertFalse( compilationResult );
assertThatDiagnosticsMatch(
diagnostics,
new DiagnosticExpectation( Kind.ERROR, 18 ),
new DiagnosticExpectation( Kind.ERROR, 30 ),
new DiagnosticExpectation( Kind.ERROR, 39 ),
new DiagnosticExpectation( Kind.ERROR, 45 )
);
}
@Test
public void validationUsingBoxing() {
File sourceFile1 = compilerHelper.getSourceFile( ValidationUsingBoxing.class );
File sourceFile2 = compilerHelper.getSourceFile( ValidLong.class );
File sourceFile3 = compilerHelper.getSourceFile( ValidLongValidator.class );
boolean compilationResult =
compilerHelper.compile(
new ConstraintValidationProcessor(), diagnostics, sourceFile1, sourceFile2, sourceFile3
);
assertFalse( compilationResult );
assertThatDiagnosticsMatch(
diagnostics,
new DiagnosticExpectation( Kind.ERROR, 20 ),
new DiagnosticExpectation( Kind.ERROR, 26 ),
new DiagnosticExpectation( Kind.ERROR, 32 ),
new DiagnosticExpectation( Kind.ERROR, 48 ),
new DiagnosticExpectation( Kind.ERROR, 56 )
);
}
@Test
public void testThatNonUniqueValidatorResolutionCausesCompilationError() {
File sourceFile1 = compilerHelper.getSourceFile( NoUniqueValidatorResolution.class );
File sourceFile2 = compilerHelper.getSourceFile( Size.class );
File sourceFile3 = compilerHelper.getSourceFile( SizeValidatorForCollection.class );
File sourceFile4 = compilerHelper.getSourceFile( SizeValidatorForSerializable.class );
File sourceFile5 = compilerHelper.getSourceFile( SerializableCollection.class );
File sourceFile6 = compilerHelper.getSourceFile( SizeValidatorForSet.class );
boolean compilationResult =
compilerHelper.compile(
new ConstraintValidationProcessor(),
diagnostics,
sourceFile1,
sourceFile2,
sourceFile3,
sourceFile4,
sourceFile5,
sourceFile6
);
assertFalse( compilationResult );
assertThatDiagnosticsMatch(
diagnostics, new DiagnosticExpectation(
Kind.ERROR, 22
)
);
}
@Test
public void testThatMultiValuedConstrainedIsOnlyGivenAtSupportedType() {
File sourceFile1 = compilerHelper.getSourceFile( MultipleConstraintsOfSameType.class );
boolean compilationResult = compilerHelper.compile(
new ConstraintValidationProcessor(), diagnostics, sourceFile1
);
assertFalse( compilationResult );
assertThatDiagnosticsMatch(
diagnostics,
new DiagnosticExpectation( Kind.ERROR, 22 ),
new DiagnosticExpectation( Kind.ERROR, 22 )
);
}
@Test
public void testThatAtValidAnnotationGivenAtNotSupportedTypesCausesCompilationErrors() {
File sourceFile1 = compilerHelper.getSourceFile( ValidationUsingAtValidAnnotation.class );
boolean compilationResult = compilerHelper.compile(
new ConstraintValidationProcessor(), diagnostics, false, false, sourceFile1
);
assertFalse( compilationResult );
assertThatDiagnosticsMatch(
diagnostics,
new DiagnosticExpectation( Kind.ERROR, 23 ),
new DiagnosticExpectation( Kind.ERROR, 29 ),
new DiagnosticExpectation( Kind.ERROR, 45 ),
new DiagnosticExpectation( Kind.ERROR, 53 ),
new DiagnosticExpectation( Kind.ERROR, 61 ),
new DiagnosticExpectation( Kind.ERROR, 69 ),
new DiagnosticExpectation( Kind.ERROR, 77 )
);
}
@Test
public void groupSequenceProvider() {
File sourceFile1 = compilerHelper.getSourceFile( GroupSequenceProviderDefinition.class );
File sourceFile2 = compilerHelper.getSourceFile( BazDefaultGroupSequenceProvider.class );
File sourceFile3 = compilerHelper.getSourceFile( FooDefaultGroupSequenceProvider.class );
File sourceFile4 = compilerHelper.getSourceFile( QuxDefaultGroupSequenceProvider.class );
File sourceFile5 = compilerHelper.getSourceFile( SampleDefaultGroupSequenceProvider.class );
File sourceFile6 = compilerHelper.getSourceFile( FooBarDefaultGroupSequenceProvider.class );
File sourceFile7 = compilerHelper.getSourceFile( FooBarBazDefaultGroupSequenceProvider.class );
boolean compilationResult = compilerHelper.compile(
new ConstraintValidationProcessor(),
diagnostics,
sourceFile1,
sourceFile2,
sourceFile3,
sourceFile4,
sourceFile5,
sourceFile6,
sourceFile7
);
assertFalse( compilationResult );
assertThatDiagnosticsMatch(
diagnostics,
new DiagnosticExpectation( Kind.ERROR, 25 ),
new DiagnosticExpectation( Kind.ERROR, 34 ),
new DiagnosticExpectation( Kind.ERROR, 42 ),
new DiagnosticExpectation( Kind.ERROR, 50 ),
new DiagnosticExpectation( Kind.ERROR, 58 ),
new DiagnosticExpectation( Kind.ERROR, 66 )
);
}
/**
* HV-418: No error shall be raised, when @Past/@Future are given at Joda
* date/time types.
*/
@Test()
public void timeConstraintsAllowedAtJodaTypes() {
File sourceFile1 = compilerHelper.getSourceFile( ModelWithJodaTypes.class );
boolean compilationResult = compilerHelper.compile(
new ConstraintValidationProcessor(), diagnostics, sourceFile1
);
assertFalse( compilationResult );
assertThatDiagnosticsMatch(
diagnostics,
new DiagnosticExpectation( Kind.ERROR, 50 ),
new DiagnosticExpectation( Kind.ERROR, 51 )
);
}
@Test
public void timeConstraintsAllowedAtJava8DateTime() {
File sourceFile = compilerHelper.getSourceFile( ModelWithJava8DateTime.class );
boolean compilationResult = compilerHelper.compile(
new ConstraintValidationProcessor(), diagnostics, sourceFile
);
assertTrue( compilationResult, "Java 8 date/time API types fails at @Future/@Past." );
}
@Test
@TestForIssue(jiraKey = "HV-1252")
public void constraintsAllowedAtJavaMoneyTypes() {
File sourceFile = compilerHelper.getSourceFile( ModelWithJavaMoneyTypes.class );
EnumSet<Library> libraries = EnumSet.of(
Library.VALIDATION_API,
Library.HIBERNATE_VALIDATOR,
Library.JAVA_MONEY_API
);
boolean compilationResult = compilerHelper.compile(
new ConstraintValidationProcessor(), diagnostics, libraries, sourceFile
);
assertTrue( compilationResult, "Java Money API types (MonetaryAmount) fails with constraints annotations." );
}
@Test
public void crossParameterConstraintsAllowed() {
File[] sourceFiles = new File[] {
compilerHelper.getSourceFile( ValidCrossParameterAndNormalConstraint.class ),
compilerHelper.getSourceFile( ValidCrossParameterConstraint.class ),
compilerHelper.getSourceFile( MethodLevelValidationUsingCrossParameterConstraints.class ),
compilerHelper.getSourceFile( GenericCrossParameterValidatorObjectArray.class ),
compilerHelper.getSourceFile( GenericCrossParameterValidator.class ),
compilerHelper.getSourceFile( GenericNormalValidator.class )
};
boolean compilationResult =
compilerHelper.compile( new ConstraintValidationProcessor(), diagnostics, false, true, sourceFiles );
assertFalse( compilationResult );
assertThatDiagnosticsMatch(
diagnostics,
new DiagnosticExpectation( Kind.ERROR, 41 ),
new DiagnosticExpectation( Kind.ERROR, 63 )
);
}
}