/* * 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.constraintvalidators.bv; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import java.math.BigDecimal; import java.math.BigInteger; import javax.validation.ConstraintValidator; import javax.validation.constraints.Negative; import javax.validation.constraints.Positive; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.AbstractNegativeValidator; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.AbstractPositiveValidator; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForBigDecimal; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForBigInteger; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForByte; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForDouble; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForFloat; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForInteger; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForLong; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForNumber; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForShort; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForBigDecimal; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForBigInteger; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForByte; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForDouble; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForFloat; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForInteger; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForLong; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForNumber; import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForShort; import org.hibernate.validator.internal.util.annotationfactory.AnnotationDescriptor; import org.hibernate.validator.internal.util.annotationfactory.AnnotationFactory; import org.testng.annotations.Test; /** * @author Marko Bekhta */ public class SignValidatorForNumberTest { @Test public void testPositiveValidator() { AnnotationDescriptor<Positive> descriptor = new AnnotationDescriptor<>( Positive.class ); testPositive( AnnotationFactory.create( descriptor ), false ); descriptor.setValue( "strict", true ); testPositive( AnnotationFactory.create( descriptor ), true ); } @Test public void testNegativeValidator() { AnnotationDescriptor<Negative> descriptor = new AnnotationDescriptor<>( Negative.class ); testNegative( AnnotationFactory.create( descriptor ), false ); descriptor.setValue( "strict", true ); testNegative( AnnotationFactory.create( descriptor ), true ); } private void testNegative(Negative m, boolean strict) { AbstractNegativeValidator constraint = new NegativeValidatorForNumber(); constraint.initialize( m ); testSignNumber( constraint, strict, false ); constraint = new NegativeValidatorForBigDecimal(); constraint.initialize( m ); testSignBigDecimal( constraint, strict, false ); constraint = new NegativeValidatorForBigInteger(); constraint.initialize( m ); testSignBigInteger( constraint, strict, false ); constraint = new NegativeValidatorForLong(); constraint.initialize( m ); testSignLong( constraint, strict, false ); constraint = new NegativeValidatorForFloat(); constraint.initialize( m ); testSignFloat( constraint, strict, false ); constraint = new NegativeValidatorForDouble(); constraint.initialize( m ); testSignDouble( constraint, strict, false ); constraint = new NegativeValidatorForShort(); constraint.initialize( m ); testSignShort( constraint, strict, false ); constraint = new NegativeValidatorForByte(); constraint.initialize( m ); testSignByte( constraint, strict, false ); constraint = new NegativeValidatorForInteger(); constraint.initialize( m ); testSignInteger( constraint, strict, false ); } private void testPositive(Positive m, boolean strict) { AbstractPositiveValidator constraint = new PositiveValidatorForNumber(); constraint.initialize( m ); testSignNumber( constraint, strict, true ); constraint = new PositiveValidatorForBigDecimal(); constraint.initialize( m ); testSignBigDecimal( constraint, strict, true ); constraint = new PositiveValidatorForBigInteger(); constraint.initialize( m ); testSignBigInteger( constraint, strict, true ); constraint = new PositiveValidatorForLong(); constraint.initialize( m ); testSignLong( constraint, strict, true ); constraint = new PositiveValidatorForFloat(); constraint.initialize( m ); testSignFloat( constraint, strict, true ); constraint = new PositiveValidatorForDouble(); constraint.initialize( m ); testSignDouble( constraint, strict, true ); constraint = new PositiveValidatorForShort(); constraint.initialize( m ); testSignShort( constraint, strict, true ); constraint = new PositiveValidatorForByte(); constraint.initialize( m ); testSignByte( constraint, strict, true ); constraint = new PositiveValidatorForInteger(); constraint.initialize( m ); testSignInteger( constraint, strict, true ); } private void testSignShort(ConstraintValidator<?, Number> constraint, boolean strict, boolean positive) { assertTrue( constraint.isValid( null, null ) ); assertEquals( constraint.isValid( (short) 0, null ), !strict ); assertEquals( constraint.isValid( (short) 1, null ), positive ); assertEquals( constraint.isValid( (short) -1, null ), !positive ); assertEquals( constraint.isValid( (short) 10.0, null ), positive ); assertEquals( constraint.isValid( (short) -10.0, null ), !positive ); } private void testSignByte(ConstraintValidator<?, Number> constraint, boolean strict, boolean positive) { assertTrue( constraint.isValid( null, null ) ); assertEquals( constraint.isValid( (byte) 0, null ), !strict ); assertEquals( constraint.isValid( (byte) 1, null ), positive ); assertEquals( constraint.isValid( (byte) -1, null ), !positive ); assertEquals( constraint.isValid( (byte) 10.0, null ), positive ); assertEquals( constraint.isValid( (byte) -10.0, null ), !positive ); } private void testSignInteger(ConstraintValidator<?, Number> constraint, boolean strict, boolean positive) { assertTrue( constraint.isValid( null, null ) ); assertEquals( constraint.isValid( 0, null ), !strict ); assertEquals( constraint.isValid( 1, null ), positive ); assertEquals( constraint.isValid( -1, null ), !positive ); assertEquals( constraint.isValid( 10, null ), positive ); assertEquals( constraint.isValid( -10, null ), !positive ); } private void testSignNumber(ConstraintValidator<?, Number> constraint, boolean strict, boolean positive) { assertTrue( constraint.isValid( null, null ) ); assertEquals( constraint.isValid( 0, null ), !strict ); assertEquals( constraint.isValid( 1, null ), positive ); assertEquals( constraint.isValid( -1, null ), !positive ); assertEquals( constraint.isValid( 10.0, null ), positive ); assertEquals( constraint.isValid( -10.0, null ), !positive ); } private void testSignBigDecimal(ConstraintValidator<?, BigDecimal> constraint, boolean strict, boolean positive) { assertTrue( constraint.isValid( null, null ) ); assertEquals( constraint.isValid( BigDecimal.ZERO, null ), !strict ); assertEquals( constraint.isValid( BigDecimal.ONE, null ), positive ); assertEquals( constraint.isValid( BigDecimal.ONE.negate(), null ), !positive ); assertEquals( constraint.isValid( BigDecimal.TEN, null ), positive ); assertEquals( constraint.isValid( BigDecimal.TEN.negate(), null ), !positive ); } private void testSignBigInteger(ConstraintValidator<?, BigInteger> constraint, boolean strict, boolean positive) { assertTrue( constraint.isValid( null, null ) ); assertEquals( constraint.isValid( BigInteger.ZERO, null ), !strict ); assertEquals( constraint.isValid( BigInteger.ONE, null ), positive ); assertEquals( constraint.isValid( BigInteger.ONE.negate(), null ), !positive ); assertEquals( constraint.isValid( BigInteger.TEN, null ), positive ); assertEquals( constraint.isValid( BigInteger.TEN.negate(), null ), !positive ); } private void testSignLong(ConstraintValidator<?, Long> constraint, boolean strict, boolean positive) { assertTrue( constraint.isValid( null, null ) ); assertEquals( constraint.isValid( 0L, null ), !strict ); assertEquals( constraint.isValid( 1L, null ), positive ); assertEquals( constraint.isValid( -1L, null ), !positive ); assertEquals( constraint.isValid( 10L, null ), positive ); assertEquals( constraint.isValid( -10L, null ), !positive ); } private void testSignDouble(ConstraintValidator<?, Double> constraint, boolean strict, boolean positive) { assertTrue( constraint.isValid( null, null ) ); assertEquals( constraint.isValid( 0D, null ), !strict ); assertEquals( constraint.isValid( 1D, null ), positive ); assertEquals( constraint.isValid( -1D, null ), !positive ); assertEquals( constraint.isValid( 10D, null ), positive ); assertEquals( constraint.isValid( -10D, null ), !positive ); assertEquals( constraint.isValid( Double.POSITIVE_INFINITY, null ), positive ); assertEquals( constraint.isValid( Double.NEGATIVE_INFINITY, null ), !positive ); assertFalse( constraint.isValid( Double.NaN, null ) ); } private void testSignFloat(ConstraintValidator<?, Float> constraint, boolean strict, boolean positive) { assertTrue( constraint.isValid( null, null ) ); assertEquals( constraint.isValid( 0F, null ), !strict ); assertEquals( constraint.isValid( 1F, null ), positive ); assertEquals( constraint.isValid( -1F, null ), !positive ); assertEquals( constraint.isValid( 10F, null ), positive ); assertEquals( constraint.isValid( -10F, null ), !positive ); assertEquals( constraint.isValid( Float.POSITIVE_INFINITY, null ), positive ); assertEquals( constraint.isValid( Float.NEGATIVE_INFINITY, null ), !positive ); assertFalse( constraint.isValid( Float.NaN, null ) ); } }