From fdb0ba2abf0b1d814303ab8d132404359f9140e7 Mon Sep 17 00:00:00 2001 From: Diego Krupitza Date: Mon, 27 Dec 2021 16:09:27 +0100 Subject: [PATCH] `isZero()` & `isOne()` introduced to `NumericConstraintBase`. Checking whether a given number is zero or one is now more pleasent to write and read. It is not longer needed to to use `c -> c.equalTo(0)` or `c -> c.equalTo(1)`. --- .../yavi/constraint/BigDecimalConstraint.java | 5 + .../yavi/constraint/BigIntegerConstraint.java | 5 + .../am/ik/yavi/constraint/ByteConstraint.java | 5 + .../yavi/constraint/CharacterConstraint.java | 5 + .../ik/yavi/constraint/DoubleConstraint.java | 5 + .../ik/yavi/constraint/FloatConstraint.java | 5 + .../ik/yavi/constraint/IntegerConstraint.java | 5 + .../am/ik/yavi/constraint/LongConstraint.java | 5 + .../ik/yavi/constraint/ShortConstraint.java | 5 + .../base/NumericConstraintBase.java | 55 +++++++- .../constraint/BigDecimalConstraintTest.java | 29 ++++ .../constraint/BigIntegerConstraintTest.java | 30 +++- .../yavi/constraint/ByteConstraintTest.java | 28 +++- .../constraint/CharacterConstraintTest.java | 27 ++++ .../yavi/constraint/DoubleConstraintTest.java | 27 ++++ .../yavi/constraint/FloatConstraintTest.java | 27 ++++ .../constraint/IntegerConstraintTest.java | 27 ++++ .../yavi/constraint/LongConstraintTest.java | 27 ++++ .../yavi/constraint/ShortConstraintTest.java | 27 ++++ .../java/am/ik/yavi/core/ValidatorTest.java | 129 +++++++++++------- 20 files changed, 421 insertions(+), 57 deletions(-) diff --git a/src/main/java/am/ik/yavi/constraint/BigDecimalConstraint.java b/src/main/java/am/ik/yavi/constraint/BigDecimalConstraint.java index c7b0f8a9..57503ddd 100644 --- a/src/main/java/am/ik/yavi/constraint/BigDecimalConstraint.java +++ b/src/main/java/am/ik/yavi/constraint/BigDecimalConstraint.java @@ -51,4 +51,9 @@ protected Predicate isLessThanOrEqual(BigDecimal max) { protected BigDecimal zeroValue() { return BigDecimal.ZERO; } + + @Override + protected BigDecimal oneValue() { + return BigDecimal.ONE; + } } diff --git a/src/main/java/am/ik/yavi/constraint/BigIntegerConstraint.java b/src/main/java/am/ik/yavi/constraint/BigIntegerConstraint.java index 29c9cc80..d9a5b0e3 100644 --- a/src/main/java/am/ik/yavi/constraint/BigIntegerConstraint.java +++ b/src/main/java/am/ik/yavi/constraint/BigIntegerConstraint.java @@ -51,4 +51,9 @@ protected Predicate isLessThanOrEqual(BigInteger max) { protected BigInteger zeroValue() { return BigInteger.ZERO; } + + @Override + protected BigInteger oneValue() { + return BigInteger.ONE; + } } diff --git a/src/main/java/am/ik/yavi/constraint/ByteConstraint.java b/src/main/java/am/ik/yavi/constraint/ByteConstraint.java index 3e694367..0db3bc10 100644 --- a/src/main/java/am/ik/yavi/constraint/ByteConstraint.java +++ b/src/main/java/am/ik/yavi/constraint/ByteConstraint.java @@ -49,4 +49,9 @@ protected Predicate isLessThanOrEqual(Byte max) { protected Byte zeroValue() { return 0; } + + @Override + protected Byte oneValue() { + return 1; + } } diff --git a/src/main/java/am/ik/yavi/constraint/CharacterConstraint.java b/src/main/java/am/ik/yavi/constraint/CharacterConstraint.java index 501f757e..d75c02d3 100644 --- a/src/main/java/am/ik/yavi/constraint/CharacterConstraint.java +++ b/src/main/java/am/ik/yavi/constraint/CharacterConstraint.java @@ -50,4 +50,9 @@ protected Predicate isLessThanOrEqual(Character max) { protected Character zeroValue() { return Character.MIN_VALUE; } + + @Override + protected Character oneValue() { + return '1'; + } } diff --git a/src/main/java/am/ik/yavi/constraint/DoubleConstraint.java b/src/main/java/am/ik/yavi/constraint/DoubleConstraint.java index a848ac23..3cc16644 100644 --- a/src/main/java/am/ik/yavi/constraint/DoubleConstraint.java +++ b/src/main/java/am/ik/yavi/constraint/DoubleConstraint.java @@ -50,4 +50,9 @@ protected Predicate isLessThanOrEqual(Double max) { protected Double zeroValue() { return 0.0; } + + @Override + protected Double oneValue() { + return 1.0; + } } diff --git a/src/main/java/am/ik/yavi/constraint/FloatConstraint.java b/src/main/java/am/ik/yavi/constraint/FloatConstraint.java index 4d5ee6af..68d974db 100644 --- a/src/main/java/am/ik/yavi/constraint/FloatConstraint.java +++ b/src/main/java/am/ik/yavi/constraint/FloatConstraint.java @@ -50,4 +50,9 @@ protected Predicate isLessThanOrEqual(Float max) { protected Float zeroValue() { return 0f; } + + @Override + protected Float oneValue() { + return 1f; + } } diff --git a/src/main/java/am/ik/yavi/constraint/IntegerConstraint.java b/src/main/java/am/ik/yavi/constraint/IntegerConstraint.java index b3d5bd40..ef3b0761 100644 --- a/src/main/java/am/ik/yavi/constraint/IntegerConstraint.java +++ b/src/main/java/am/ik/yavi/constraint/IntegerConstraint.java @@ -50,4 +50,9 @@ protected Predicate isLessThanOrEqual(Integer max) { protected Integer zeroValue() { return 0; } + + @Override + protected Integer oneValue() { + return 1; + } } diff --git a/src/main/java/am/ik/yavi/constraint/LongConstraint.java b/src/main/java/am/ik/yavi/constraint/LongConstraint.java index 31fdf760..f95bb8f6 100644 --- a/src/main/java/am/ik/yavi/constraint/LongConstraint.java +++ b/src/main/java/am/ik/yavi/constraint/LongConstraint.java @@ -49,4 +49,9 @@ protected Predicate isLessThanOrEqual(Long max) { protected Long zeroValue() { return 0L; } + + @Override + protected Long oneValue() { + return 1L; + } } diff --git a/src/main/java/am/ik/yavi/constraint/ShortConstraint.java b/src/main/java/am/ik/yavi/constraint/ShortConstraint.java index 6c64e094..dc822d43 100644 --- a/src/main/java/am/ik/yavi/constraint/ShortConstraint.java +++ b/src/main/java/am/ik/yavi/constraint/ShortConstraint.java @@ -50,4 +50,9 @@ protected Predicate isLessThanOrEqual(Short max) { protected Short zeroValue() { return 0; } + + @Override + protected Short oneValue() { + return 1; + } } diff --git a/src/main/java/am/ik/yavi/constraint/base/NumericConstraintBase.java b/src/main/java/am/ik/yavi/constraint/base/NumericConstraintBase.java index 2a5671dd..65be03a3 100644 --- a/src/main/java/am/ik/yavi/constraint/base/NumericConstraintBase.java +++ b/src/main/java/am/ik/yavi/constraint/base/NumericConstraintBase.java @@ -51,6 +51,15 @@ public C lessThanOrEqual(V max) { } /** + * Is the given value positve. Positive means it is greater than 0. + * + *
+	 *     0 -> false
+	 *     1 -> true
+	 *     n where n > 0 -> true
+	 *     n where n < 0 -> false
+	 * 
+ * * @since 0.10.0 */ public C positive() { @@ -59,9 +68,7 @@ public C positive() { return cast(); } - /** - * @since 0.10.0 - */ + /** @since 0.10.0 */ public C positiveOrZero() { this.predicates() .add(ConstraintPredicate.of(this.isGreaterThanOrEqual(zeroValue()), @@ -70,6 +77,16 @@ public C positiveOrZero() { } /** + * Is the given value negative. Negative means it is less than 0. + * + *
+	 *     0 -> false
+	 *     1 -> false
+	 *     -1 -> true
+	 *     n where n > 0 -> false
+	 *     n where n < 0 -> true
+	 * 
+ * * @since 0.10.0 */ public C negative() { @@ -78,15 +95,29 @@ public C negative() { return cast(); } - /** - * @since 0.10.0 - */ + /** @since 0.10.0 */ public C negaitveOrZero() { this.predicates().add(ConstraintPredicate.of(this.isLessThanOrEqual(zeroValue()), NUMERIC_NEGATIVE_OR_ZERO, () -> new Object[] {}, VALID)); return cast(); } + /** + * Is the given value equal to the zero representation of its type. The exact + * representation of zero can be found in {@link #zeroValue()}. + */ + public C isZero() { + return this.equalTo(zeroValue()); + } + + /** + * Is the given value equal to the one representation of its type The exact + * representation of one can be found in {@link #oneValue()}. + */ + public C isOne() { + return this.equalTo(oneValue()); + } + protected abstract Predicate isGreaterThan(V min); protected abstract Predicate isGreaterThanOrEqual(V min); @@ -95,5 +126,17 @@ public C negaitveOrZero() { protected abstract Predicate isLessThanOrEqual(V max); + /** + * The value that represents zero + * + * @return the numeric value zero + */ protected abstract V zeroValue(); + + /** + * The value that represents one + * + * @return the numeric value one + */ + protected abstract V oneValue(); } diff --git a/src/test/java/am/ik/yavi/constraint/BigDecimalConstraintTest.java b/src/test/java/am/ik/yavi/constraint/BigDecimalConstraintTest.java index 34b1bd49..80c60260 100644 --- a/src/test/java/am/ik/yavi/constraint/BigDecimalConstraintTest.java +++ b/src/test/java/am/ik/yavi/constraint/BigDecimalConstraintTest.java @@ -16,6 +16,7 @@ package am.ik.yavi.constraint; import am.ik.yavi.constraint.base.NumericConstraintBase; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -155,6 +156,34 @@ void validNegativeOrZero(BigDecimal value) { assertThat(predicate.test(value)).isTrue(); } + @ParameterizedTest + @ValueSource(strings = { "-101", "-120" }) + void invalidZero(BigDecimal value) { + Predicate predicate = retrievePredicate( + NumericConstraintBase::isZero); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validZero() { + Predicate predicate = retrievePredicate( + NumericConstraintBase::isZero); + assertThat(predicate.test(BigDecimal.ZERO)).isTrue(); + } + + @ParameterizedTest + @ValueSource(strings = { "-101", "-120" }) + void invalidOne(BigDecimal value) { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validOne() { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test(BigDecimal.ONE)).isTrue(); + } + private static Predicate retrievePredicate( Function, BigDecimalConstraint> constraint) { return constraint.apply(new BigDecimalConstraint<>()).predicates().peekFirst() diff --git a/src/test/java/am/ik/yavi/constraint/BigIntegerConstraintTest.java b/src/test/java/am/ik/yavi/constraint/BigIntegerConstraintTest.java index a218c9c4..4f7c13a8 100644 --- a/src/test/java/am/ik/yavi/constraint/BigIntegerConstraintTest.java +++ b/src/test/java/am/ik/yavi/constraint/BigIntegerConstraintTest.java @@ -16,10 +16,10 @@ package am.ik.yavi.constraint; import am.ik.yavi.constraint.base.NumericConstraintBase; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import java.math.BigDecimal; import java.math.BigInteger; import java.util.function.Function; import java.util.function.Predicate; @@ -156,6 +156,34 @@ void validNegativeOrZero(BigInteger value) { assertThat(predicate.test(value)).isTrue(); } + @ParameterizedTest + @ValueSource(strings = { "-101", "-120" }) + void invalidZero(BigInteger value) { + Predicate predicate = retrievePredicate( + NumericConstraintBase::isZero); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validZero() { + Predicate predicate = retrievePredicate( + NumericConstraintBase::isZero); + assertThat(predicate.test(BigInteger.ZERO)).isTrue(); + } + + @ParameterizedTest + @ValueSource(strings = { "-101", "-120" }) + void invalidOne(BigInteger value) { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validOne() { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test(BigInteger.ONE)).isTrue(); + } + private static Predicate retrievePredicate( Function, BigIntegerConstraint> constraint) { return constraint.apply(new BigIntegerConstraint<>()).predicates().peekFirst() diff --git a/src/test/java/am/ik/yavi/constraint/ByteConstraintTest.java b/src/test/java/am/ik/yavi/constraint/ByteConstraintTest.java index 0532c311..3541ad17 100644 --- a/src/test/java/am/ik/yavi/constraint/ByteConstraintTest.java +++ b/src/test/java/am/ik/yavi/constraint/ByteConstraintTest.java @@ -16,10 +16,10 @@ package am.ik.yavi.constraint; import am.ik.yavi.constraint.base.NumericConstraintBase; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import java.math.BigInteger; import java.util.function.Function; import java.util.function.Predicate; @@ -145,6 +145,32 @@ void validNegativeOrZero(byte value) { assertThat(predicate.test(value)).isTrue(); } + @ParameterizedTest + @ValueSource(bytes = { -101, -120 }) + void invalidZero(byte value) { + Predicate predicate = retrievePredicate(NumericConstraintBase::isZero); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validZero() { + Predicate predicate = retrievePredicate(NumericConstraintBase::isZero); + assertThat(predicate.test(Byte.valueOf("0"))).isTrue(); + } + + @ParameterizedTest + @ValueSource(bytes = { -101, -120 }) + void invalidOne(byte value) { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validOne() { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test(Byte.valueOf("1"))).isTrue(); + } + private static Predicate retrievePredicate( Function, ByteConstraint> constraint) { return constraint.apply(new ByteConstraint<>()).predicates().peekFirst() diff --git a/src/test/java/am/ik/yavi/constraint/CharacterConstraintTest.java b/src/test/java/am/ik/yavi/constraint/CharacterConstraintTest.java index bacc4d7c..ad3b5593 100644 --- a/src/test/java/am/ik/yavi/constraint/CharacterConstraintTest.java +++ b/src/test/java/am/ik/yavi/constraint/CharacterConstraintTest.java @@ -16,6 +16,7 @@ package am.ik.yavi.constraint; import am.ik.yavi.constraint.base.NumericConstraintBase; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -112,6 +113,32 @@ void validNegative(char value) { assertThat(predicate.test(value)).isFalse(); } + @ParameterizedTest + @ValueSource(chars = { 101, 120 }) + void invalidZero(char value) { + Predicate predicate = retrievePredicate(NumericConstraintBase::isZero); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validZero() { + Predicate predicate = retrievePredicate(NumericConstraintBase::isZero); + assertThat(predicate.test(Character.MIN_VALUE)).isTrue(); + } + + @ParameterizedTest + @ValueSource(chars = { 101, 120 }) + void invalidOne(char value) { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validOne() { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test('1')).isTrue(); + } + private static Predicate retrievePredicate( Function, CharacterConstraint> constraint) { return constraint.apply(new CharacterConstraint<>()).predicates().peekFirst() diff --git a/src/test/java/am/ik/yavi/constraint/DoubleConstraintTest.java b/src/test/java/am/ik/yavi/constraint/DoubleConstraintTest.java index 4d99933b..6e5f371a 100644 --- a/src/test/java/am/ik/yavi/constraint/DoubleConstraintTest.java +++ b/src/test/java/am/ik/yavi/constraint/DoubleConstraintTest.java @@ -16,6 +16,7 @@ package am.ik.yavi.constraint; import am.ik.yavi.constraint.base.NumericConstraintBase; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -142,6 +143,32 @@ void validNegativeOrZero(double value) { assertThat(predicate.test(value)).isTrue(); } + @ParameterizedTest + @ValueSource(doubles = { -101.5, -120.1 }) + void invalidZero(double value) { + Predicate predicate = retrievePredicate(NumericConstraintBase::isZero); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validZero() { + Predicate predicate = retrievePredicate(NumericConstraintBase::isZero); + assertThat(predicate.test(0.0)).isTrue(); + } + + @ParameterizedTest + @ValueSource(doubles = { -101.5, -120.1 }) + void invalidOne(double value) { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validOne() { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test(1.0)).isTrue(); + } + private static Predicate retrievePredicate( Function, DoubleConstraint> constraint) { return constraint.apply(new DoubleConstraint<>()).predicates().peekFirst() diff --git a/src/test/java/am/ik/yavi/constraint/FloatConstraintTest.java b/src/test/java/am/ik/yavi/constraint/FloatConstraintTest.java index 8d9d14bc..63c95c8a 100644 --- a/src/test/java/am/ik/yavi/constraint/FloatConstraintTest.java +++ b/src/test/java/am/ik/yavi/constraint/FloatConstraintTest.java @@ -16,6 +16,7 @@ package am.ik.yavi.constraint; import am.ik.yavi.constraint.base.NumericConstraintBase; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -142,6 +143,32 @@ void validNegativeOrZero(float value) { assertThat(predicate.test(value)).isTrue(); } + @ParameterizedTest + @ValueSource(floats = { -101f, -120f }) + void invalidZero(float value) { + Predicate predicate = retrievePredicate(NumericConstraintBase::isZero); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validZero() { + Predicate predicate = retrievePredicate(NumericConstraintBase::isZero); + assertThat(predicate.test(0f)).isTrue(); + } + + @ParameterizedTest + @ValueSource(floats = { -101f, -120f }) + void invalidOne(float value) { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validOne() { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test(1f)).isTrue(); + } + private static Predicate retrievePredicate( Function, FloatConstraint> constraint) { return constraint.apply(new FloatConstraint<>()).predicates().peekFirst() diff --git a/src/test/java/am/ik/yavi/constraint/IntegerConstraintTest.java b/src/test/java/am/ik/yavi/constraint/IntegerConstraintTest.java index 8cab6f49..cb9a12b9 100644 --- a/src/test/java/am/ik/yavi/constraint/IntegerConstraintTest.java +++ b/src/test/java/am/ik/yavi/constraint/IntegerConstraintTest.java @@ -16,6 +16,7 @@ package am.ik.yavi.constraint; import am.ik.yavi.constraint.base.NumericConstraintBase; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -142,6 +143,32 @@ void validNegativeOrZero(int value) { assertThat(predicate.test(value)).isTrue(); } + @ParameterizedTest + @ValueSource(ints = { -101, -120 }) + void invalidZero(int value) { + Predicate predicate = retrievePredicate(NumericConstraintBase::isZero); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validZero() { + Predicate predicate = retrievePredicate(NumericConstraintBase::isZero); + assertThat(predicate.test(0)).isTrue(); + } + + @ParameterizedTest + @ValueSource(ints = { -101, -120 }) + void invalidOne(int value) { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validOne() { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test(1)).isTrue(); + } + private static Predicate retrievePredicate( Function, IntegerConstraint> constraint) { return constraint.apply(new IntegerConstraint<>()).predicates().peekFirst() diff --git a/src/test/java/am/ik/yavi/constraint/LongConstraintTest.java b/src/test/java/am/ik/yavi/constraint/LongConstraintTest.java index 802d5f2a..c8b5b572 100644 --- a/src/test/java/am/ik/yavi/constraint/LongConstraintTest.java +++ b/src/test/java/am/ik/yavi/constraint/LongConstraintTest.java @@ -16,6 +16,7 @@ package am.ik.yavi.constraint; import am.ik.yavi.constraint.base.NumericConstraintBase; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -142,6 +143,32 @@ void validNegativeOrZero(long value) { assertThat(predicate.test(value)).isTrue(); } + @ParameterizedTest + @ValueSource(longs = { -101L, -120L }) + void invalidZero(long value) { + Predicate predicate = retrievePredicate(NumericConstraintBase::isZero); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validZero() { + Predicate predicate = retrievePredicate(NumericConstraintBase::isZero); + assertThat(predicate.test(0L)).isTrue(); + } + + @ParameterizedTest + @ValueSource(longs = { -101L, -120L }) + void invalidOne(long value) { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validOne() { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test(1L)).isTrue(); + } + private static Predicate retrievePredicate( Function, LongConstraint> constraint) { return constraint.apply(new LongConstraint<>()).predicates().peekFirst() diff --git a/src/test/java/am/ik/yavi/constraint/ShortConstraintTest.java b/src/test/java/am/ik/yavi/constraint/ShortConstraintTest.java index e655e5af..b719d0d5 100644 --- a/src/test/java/am/ik/yavi/constraint/ShortConstraintTest.java +++ b/src/test/java/am/ik/yavi/constraint/ShortConstraintTest.java @@ -16,6 +16,7 @@ package am.ik.yavi.constraint; import am.ik.yavi.constraint.base.NumericConstraintBase; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -146,6 +147,32 @@ void validNegativeOrZero(short value) { assertThat(predicate.test(value)).isTrue(); } + @ParameterizedTest + @ValueSource(shorts = { -101, -120 }) + void invalidZero(short value) { + Predicate predicate = retrievePredicate(NumericConstraintBase::isZero); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validZero() { + Predicate predicate = retrievePredicate(NumericConstraintBase::isZero); + assertThat(predicate.test(Short.parseShort("0"))).isTrue(); + } + + @ParameterizedTest + @ValueSource(shorts = { -101, -120 }) + void invalidOne(short value) { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test(value)).isFalse(); + } + + @Test + void validOne() { + Predicate predicate = retrievePredicate(NumericConstraintBase::isOne); + assertThat(predicate.test(Short.parseShort("1"))).isTrue(); + } + private static Predicate retrievePredicate( Function, ShortConstraint> constraint) { return constraint.apply(new ShortConstraint<>()).predicates().peekFirst() diff --git a/src/test/java/am/ik/yavi/core/ValidatorTest.java b/src/test/java/am/ik/yavi/core/ValidatorTest.java index ff8a6929..c1dcfd2f 100644 --- a/src/test/java/am/ik/yavi/core/ValidatorTest.java +++ b/src/test/java/am/ik/yavi/core/ValidatorTest.java @@ -29,15 +29,16 @@ import am.ik.yavi.constraint.charsequence.CodePoints.CodePointsRanges; import am.ik.yavi.constraint.charsequence.CodePoints.CodePointsSet; import am.ik.yavi.fn.Either; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static am.ik.yavi.constraint.charsequence.variant.IdeographicVariationSequence.IGNORE; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; -public class ValidatorTest { +class ValidatorTest { + @Test - public void allInvalid() throws Exception { + void allInvalid() throws Exception { User user = new User("", "example.com", 300); user.setEnabled(false); Validator validator = validator(); @@ -61,8 +62,8 @@ public void allInvalid() throws Exception { @Test public void codePointsAllIncludedRange() throws Exception { CodePointsRanges whiteList = () -> Arrays.asList( - CodePoints.Range.of(0x0041/* A */, 0x005A /* Z */), - CodePoints.Range.of(0x0061/* a */, 0x007A /* z */)); + CodePoints.Range.of(0x0041 /* A */, 0x005A /* Z */), + CodePoints.Range.of(0x0061 /* a */, 0x007A /* z */)); User user = new User("abc@b.c", null, null); Validator validator = ValidatorBuilder.of(User.class) @@ -78,11 +79,11 @@ public void codePointsAllIncludedRange() throws Exception { } @Test - public void codePointsAllIncludedRangeBeginToEnd() throws Exception { + void codePointsAllIncludedRangeBeginToEnd() throws Exception { User user = new User("abc@b.c", null, null); Validator validator = ValidatorBuilder.of(User.class) .constraint(User::getName, "name", - c -> c.codePoints(0x0041/* A */, 0x007A /* z */).asWhiteList()) + c -> c.codePoints(0x0041 /* A */, 0x007A /* z */).asWhiteList()) .build(); ConstraintViolations violations = validator.validate(user); assertThat(violations.isValid()).isFalse(); @@ -93,12 +94,13 @@ public void codePointsAllIncludedRangeBeginToEnd() throws Exception { } @Test - public void codePointsAllIncludedRangeRange() throws Exception { + void codePointsAllIncludedRangeRange() throws Exception { User user = new User("abc@b.c", null, null); - Validator validator = ValidatorBuilder.of(User.class).constraint( - User::getName, "name", - c -> c.codePoints(CodePoints.Range.of(0x0041/* A */, 0x005A /* Z */), - CodePoints.Range.of(0x0061/* a */, 0x007A /* z */)).asWhiteList()) + Validator validator = ValidatorBuilder.of(User.class) + .constraint(User::getName, "name", c -> c + .codePoints(CodePoints.Range.of(0x0041 /* A */, 0x005A /* Z */), + CodePoints.Range.of(0x0061 /* a */, 0x007A /* z */)) + .asWhiteList()) .build(); ConstraintViolations violations = validator.validate(user); assertThat(violations.isValid()).isFalse(); @@ -109,7 +111,7 @@ public void codePointsAllIncludedRangeRange() throws Exception { } @Test - public void codePointsAllIncludedSet() throws Exception { + void codePointsAllIncludedSet() throws Exception { CodePointsSet whiteList = () -> new HashSet<>( Arrays.asList(0x0041 /* A */, 0x0042 /* B */, 0x0043 /* C */, 0x0044 /* D */, 0x0045 /* E */, 0x0046 /* F */, 0x0047 /* G */, @@ -140,7 +142,7 @@ public void codePointsAllIncludedSet() throws Exception { } @Test - public void codePointsAllIncludedSetSet() throws Exception { + void codePointsAllIncludedSetSet() throws Exception { Set whiteList = new HashSet<>( Arrays.asList(0x0041 /* A */, 0x0042 /* B */, 0x0043 /* C */, 0x0044 /* D */, 0x0045 /* E */, 0x0046 /* F */, 0x0047 /* G */, @@ -171,10 +173,10 @@ public void codePointsAllIncludedSetSet() throws Exception { } @Test - public void codePointsNotIncludedRange() throws Exception { + void codePointsNotIncludedRange() throws Exception { CodePointsRanges blackList = () -> Arrays.asList( - CodePoints.Range.of(0x0041/* A */, 0x0042 /* B */), - CodePoints.Range.of(0x0061/* a */, 0x0062 /* b */)); + CodePoints.Range.of(0x0041 /* A */, 0x0042 /* B */), + CodePoints.Range.of(0x0061 /* a */, 0x0062 /* b */)); User user = new User("abcA@Bb.c", null, null); Validator validator = ValidatorBuilder.of(User.class) @@ -190,7 +192,7 @@ public void codePointsNotIncludedRange() throws Exception { } @Test - public void codePointsNotIncludedSet() throws Exception { + void codePointsNotIncludedSet() throws Exception { CodePointsSet blackList = () -> new HashSet<>( Arrays.asList(0x0061 /* a */, 0x0062 /* b */)); @@ -208,7 +210,7 @@ public void codePointsNotIncludedSet() throws Exception { } @Test - public void combiningCharacterByteSizeInValid() throws Exception { + void combiningCharacterByteSizeInValid() throws Exception { User user = new User("モジ" /* モシ\u3099 */, null, null); Validator validator = ValidatorBuilder.of(User.class) .constraint(User::getName, "name", @@ -222,7 +224,7 @@ public void combiningCharacterByteSizeInValid() throws Exception { } @Test - public void combiningCharacterSizeAndByteSizeInValid() throws Exception { + void combiningCharacterSizeAndByteSizeInValid() throws Exception { User user = new User("モジ" /* モシ\u3099 */, null, null); Validator validator = ValidatorBuilder.of(User.class) .constraint(User::getName, "name", @@ -238,7 +240,7 @@ public void combiningCharacterSizeAndByteSizeInValid() throws Exception { } @Test - public void combiningCharacterValid() throws Exception { + void combiningCharacterValid() throws Exception { User user = new User("モジ" /* モシ\u3099 */, null, null); Validator validator = ValidatorBuilder.of(User.class) .constraint(User::getName, "name", @@ -249,7 +251,7 @@ public void combiningCharacterValid() throws Exception { } @Test - public void condition() { + void condition() { Validator validator = ValidatorBuilder.of(User.class) // .constraintOnCondition((u, cg) -> !u.getName().isEmpty(), // b -> b.constraint(User::getEmail, "email", @@ -272,7 +274,7 @@ public void condition() { } @Test - public void constraintOnTarget() { + void constraintOnTarget() { Validator validator = ValidatorBuilder.of(Range.class) // .constraintOnTarget(Range::isToGreaterThanFrom, "to", "to.isGreaterThanFrom", "\"to\" must be greater than \"from\".") // @@ -294,7 +296,7 @@ public void constraintOnTarget() { } @Test - public void customMessageFormatter() throws Exception { + void customMessageFormatter() throws Exception { Validator validator = ValidatorBuilder.of(User.class) .messageFormatter((messageKey, defaultMessageFormat, args, locale) -> args[0].toString().toUpperCase() + "." @@ -312,7 +314,7 @@ public void customMessageFormatter() throws Exception { } @Test - public void details() throws Exception { + void details() throws Exception { User user = new User("", "example.com", 300); Validator validator = validator(); ConstraintViolations violations = validator.validate(user); @@ -334,7 +336,7 @@ public void details() throws Exception { } @Test - public void emojiInValid() throws Exception { + void emojiInValid() throws Exception { User user = new User("I❤️☕️", null, null); Validator validator = ValidatorBuilder.of(User.class) .constraint(User::getName, "name", c -> c.emoji().greaterThan(3)).build(); @@ -347,7 +349,7 @@ public void emojiInValid() throws Exception { } @Test - public void emojiValid() throws Exception { + void emojiValid() throws Exception { User user = new User("I❤️☕️", null, null); Validator validator = ValidatorBuilder.of(User.class) .constraint(User::getName, "name", c -> c.emoji().lessThanOrEqual(3)) @@ -357,7 +359,7 @@ public void emojiValid() throws Exception { } @Test - public void group() { + void group() { User user = new User("foobar", "foo@example.com", -1); Validator validator = ValidatorBuilder.of(User.class) // .constraintOnCondition(Group.UPDATE.toCondition(), // @@ -380,7 +382,7 @@ public void group() { } @Test - public void groupConditionByGroup() { + void groupConditionByGroup() { User user = new User("foobar", "foo@example.com", -1); Validator validator = ValidatorBuilder.of(User.class) // .constraintOnCondition( @@ -413,7 +415,7 @@ public void groupConditionByGroup() { } @Test - public void groupTwoCondition() { + void groupTwoCondition() { User user = new User("foobar", "foo@example.com", -1); Validator validator = ValidatorBuilder.of(User.class) // .constraintOnGroup(Group.UPDATE, // @@ -443,7 +445,7 @@ public void groupTwoCondition() { } @Test - public void ivsByteSizeInValid() throws Exception { + void ivsByteSizeInValid() throws Exception { User user = new User("葛󠄁飾区" /* 葛\uDB40\uDD01飾区 */, null, null); Validator validator = ValidatorBuilder.of(User.class) .constraint(User::getName, "name", @@ -458,7 +460,7 @@ public void ivsByteSizeInValid() throws Exception { } @Test - public void ivsInValid() throws Exception { + void ivsInValid() throws Exception { User user = new User("葛󠄁飾区" /* 葛\uDB40\uDD01飾区 */, null, null); Validator validator = ValidatorBuilder.of(User.class) .constraint(User::getName, "name", @@ -472,7 +474,7 @@ public void ivsInValid() throws Exception { } @Test - public void ivsSizeAndByteSizeInValid() throws Exception { + void ivsSizeAndByteSizeInValid() throws Exception { User user = new User("葛󠄁飾区" /* 葛\uDB40\uDD01飾区 */, null, null); Validator validator = ValidatorBuilder.of(User.class) .constraint(User::getName, "name", @@ -488,7 +490,7 @@ public void ivsSizeAndByteSizeInValid() throws Exception { } @Test - public void ivsValid() throws Exception { + void ivsValid() throws Exception { User user = new User("葛󠄁飾区" /* 葛\uDB40\uDD01飾区 */, null, null); Validator validator = ValidatorBuilder.of(User.class) .constraint(User::getName, "name", @@ -501,7 +503,7 @@ public void ivsValid() throws Exception { } @Test - public void multipleViolationOnOneProperty() throws Exception { + void multipleViolationOnOneProperty() throws Exception { User user = new User("foo", "aa", 200); Validator validator = validator(); ConstraintViolations violations = validator.validate(user); @@ -517,7 +519,7 @@ public void multipleViolationOnOneProperty() throws Exception { } @Test - public void nullValues() throws Exception { + void nullValues() throws Exception { User user = new User(null, null, null); Validator validator = validator(); ConstraintViolations violations = validator.validate(user); @@ -532,7 +534,7 @@ public void nullValues() throws Exception { } @Test - public void overrideMessage() { + void overrideMessage() { Validator validator = ValidatorBuilder. of() // .constraint(User::getName, "name", c -> c.notNull().message("name is required!") // @@ -569,7 +571,7 @@ public void overrideMessage() { } @Test - public void overrideViolationMessage() { + void overrideViolationMessage() { Validator validator = ValidatorBuilder. of() // .constraint(User::getName, "name", c -> c.notNull() @@ -607,7 +609,7 @@ public void overrideViolationMessage() { } @Test - public void throwIfInValidInValid() throws Exception { + void throwIfInValidInValid() throws Exception { User user = new User("foo", "foo@example.com", -1); try { validator().validate(user).throwIfInvalid(ConstraintViolationsException::new); @@ -625,13 +627,13 @@ public void throwIfInValidInValid() throws Exception { } @Test - public void throwIfInValidValid() throws Exception { + void throwIfInValidValid() throws Exception { User user = new User("foo", "foo@example.com", 30); validator().validate(user).throwIfInvalid(ConstraintViolationsException::new); } @Test - public void valid() throws Exception { + void valid() throws Exception { User user = new User("foo", "foo@example.com", 30); Validator validator = validator(); ConstraintViolations violations = validator.validate(user); @@ -639,7 +641,7 @@ public void valid() throws Exception { } @Test - public void validateToEitherInValid() throws Exception { + void validateToEitherInValid() throws Exception { User user = new User("foo", "foo@example.com", -1); Either either = validator().either().validate(user); assertThat(either.isLeft()).isTrue(); @@ -653,7 +655,7 @@ public void validateToEitherInValid() throws Exception { } @Test - public void validateToEitherValid() throws Exception { + void validateToEitherValid() throws Exception { User user = new User("foo", "foo@example.com", 30); Either either = validator().either().validate(user); assertThat(either.isRight()).isTrue(); @@ -661,7 +663,7 @@ public void validateToEitherValid() throws Exception { } @Test - public void violateGroupAndDefault() { + void violateGroupAndDefault() { User user = new User("foobar", "foo@example.com", -1); Validator validator = ValidatorBuilder.of(User.class) // .constraint(User::getEmail, "email", c -> c.email().lessThanOrEqual(10)) @@ -694,7 +696,7 @@ public void violateGroupAndDefault() { } @Test - public void agePositiveValidatorUserValid() { + void agePositiveValidatorUserValid() { User user = new User("Diego", "foo@bar.com", 10); Validator validator = ValidatorBuilder. of() @@ -705,7 +707,7 @@ public void agePositiveValidatorUserValid() { } @Test - public void agePositiveValidatorUserInValid() { + void agePositiveValidatorUserInValid() { User user = new User("Diego", "foo@bar.com", -1); Validator validator = ValidatorBuilder. of() @@ -718,7 +720,7 @@ public void agePositiveValidatorUserInValid() { } @Test - public void ageNegativeValidatorUserValid() { + void ageNegativeValidatorUserValid() { User user = new User("Diego", "foo@bar.com", -1); Validator validator = ValidatorBuilder. of() @@ -729,7 +731,7 @@ public void ageNegativeValidatorUserValid() { } @Test - public void ageNegativeValidatorUserInValid() { + void ageNegativeValidatorUserInValid() { User user = new User("Diego", "foo@bar.com", 10); Validator validator = ValidatorBuilder. of() @@ -741,6 +743,36 @@ public void ageNegativeValidatorUserInValid() { assertThat(violations.get(0).message()).isEqualTo("\"age\" must be negative"); } + @Test + void ageIsZeroAndNameDiegoValidTest() { + String validName = "Diego"; + User user = new User(validName, "foo@bar.com", 0); + + Validator validator = ValidatorBuilder. of() + .constraint(User::getAge, "age", NumericConstraintBase::isZero) + .constraint(User::getName, "name", c -> c.equalTo(validName)).build(); + + ConstraintViolations violations = validator.validate(user); + assertThat(violations.isValid()).isTrue(); + } + + @Test + void ageIsZeroAndNameDiegoInValidTest() { + String validName = "Diego"; + User user = new User(validName + "Invalid", "foo@bar.com", 10); + + Validator validator = ValidatorBuilder. of() + .constraint(User::getAge, "age", NumericConstraintBase::isZero) + .constraint(User::getName, "name", c -> c.equalTo(validName)).build(); + + ConstraintViolations violations = validator.validate(user); + assertThat(violations.isValid()).isFalse(); + assertThat(violations.size()).isEqualTo(2); + assertThat(violations.get(0).message()).isEqualTo("\"age\" must be equal to 0"); + assertThat(violations.get(1).message()) + .isEqualTo("\"name\" must be equal to Diego"); + } + Validator validator() { return ValidatorBuilder. of() // .constraint(User::getName, "name", c -> c.notNull() // @@ -756,5 +788,4 @@ Validator validator() { .constraint(User::isEnabled, "enabled", c -> c.isTrue()) // .build(); } - }