diff --git a/src/main/java/com/DesktopApplicationClientJava/validation/EmailValidator.java b/src/main/java/com/DesktopApplicationClientJava/validation/EmailValidator.java index d6f9a7c..689504a 100644 --- a/src/main/java/com/DesktopApplicationClientJava/validation/EmailValidator.java +++ b/src/main/java/com/DesktopApplicationClientJava/validation/EmailValidator.java @@ -1,8 +1,9 @@ package com.DesktopApplicationClientJava.validation; import com.DesktopApplicationClientJava.validation.utils.ErrorMessages; -import com.DesktopApplicationClientJava.validation.utils.ValidatorHelpers; -import com.dlsc.formsfx.model.validators.CustomValidator; +import com.dlsc.formsfx.model.structure.Field; +import com.dlsc.formsfx.model.structure.StringField; +import com.dlsc.formsfx.model.validators.RegexValidator; import com.dlsc.formsfx.model.validators.StringLengthValidator; import com.dlsc.formsfx.model.validators.Validator; import java.util.List; @@ -14,29 +15,32 @@ public final class EmailValidator { private EmailValidator() {} - public static String validate(String input) { - if (ValidatorHelpers.isEmpty(input)) return ErrorMessages.Required; - if (ValidatorHelpers.isShorterThan(input, MIN_EMAIL_LENGTH)) - return ErrorMessages.MinLength(FIELD_NAME, MIN_EMAIL_LENGTH); - if (ValidatorHelpers.isLongerThan(input, MAX_EMAIL_LENGTH)) - return ErrorMessages.MaxLength(FIELD_NAME, MAX_EMAIL_LENGTH); - if (!ValidatorHelpers.includes(input, "@")) return ErrorMessages.IncorrectFormat; - return null; - } - public static List> validators() { return List.of( - CustomValidator.forPredicate( - input -> !ValidatorHelpers.isEmpty(input), ErrorMessages.Required), StringLengthValidator.atLeast( MIN_EMAIL_LENGTH, ErrorMessages.MinLength(FIELD_NAME, MIN_EMAIL_LENGTH)), StringLengthValidator.upTo( MAX_EMAIL_LENGTH, ErrorMessages.MaxLength(FIELD_NAME, MAX_EMAIL_LENGTH)), - CustomValidator.forPredicate( - EmailValidator::hasValidFormat, ErrorMessages.IncorrectFormat)); + RegexValidator.forEmail(ErrorMessages.IncorrectFormat)); + } + + /** + * Thin contract over the stock FormsFX validators above: runs a {@link StringField} and returns + * the first error message, or {@code null} when valid. + */ + public static String validate(String input) { + String value = input == null ? "" : input; + if (value.isBlank()) { + // Stock FormsFX required-check is empty-based; preserve blank-means-required semantics. + return ErrorMessages.Required; + } + StringField field = + Field.ofStringType(value).required(ErrorMessages.Required).validate(toArray(validators())); + return field.isValid() ? null : field.getErrorMessages().get(0); } - private static boolean hasValidFormat(String input) { - return ValidatorHelpers.isEmpty(input) || ValidatorHelpers.includes(input, "@"); + @SuppressWarnings("unchecked") + private static Validator[] toArray(List> validators) { + return validators.toArray(new Validator[0]); } } diff --git a/src/main/java/com/DesktopApplicationClientJava/validation/FirstNameValidator.java b/src/main/java/com/DesktopApplicationClientJava/validation/FirstNameValidator.java index 2c125e1..e30ccd9 100644 --- a/src/main/java/com/DesktopApplicationClientJava/validation/FirstNameValidator.java +++ b/src/main/java/com/DesktopApplicationClientJava/validation/FirstNameValidator.java @@ -1,8 +1,8 @@ package com.DesktopApplicationClientJava.validation; import com.DesktopApplicationClientJava.validation.utils.ErrorMessages; -import com.DesktopApplicationClientJava.validation.utils.ValidatorHelpers; -import com.dlsc.formsfx.model.validators.CustomValidator; +import com.dlsc.formsfx.model.structure.Field; +import com.dlsc.formsfx.model.structure.StringField; import com.dlsc.formsfx.model.validators.StringLengthValidator; import com.dlsc.formsfx.model.validators.Validator; import java.util.List; @@ -13,17 +13,28 @@ public final class FirstNameValidator { private FirstNameValidator() {} - public static String validate(String input) { - if (ValidatorHelpers.isEmpty(input)) return ErrorMessages.Required; - if (ValidatorHelpers.isShorterThan(input, MIN_LENGTH)) - return ErrorMessages.MinLength(FIELD_NAME, MIN_LENGTH); - return null; - } - public static List> validators() { return List.of( - CustomValidator.forPredicate( - input -> !ValidatorHelpers.isEmpty(input), ErrorMessages.Required), StringLengthValidator.atLeast(MIN_LENGTH, ErrorMessages.MinLength(FIELD_NAME, MIN_LENGTH))); } + + /** + * Thin contract over the stock FormsFX validators above: runs a {@link StringField} and returns + * the first error message, or {@code null} when valid. + */ + public static String validate(String input) { + String value = input == null ? "" : input; + if (value.isBlank()) { + // Stock FormsFX required-check is empty-based; preserve blank-means-required semantics. + return ErrorMessages.Required; + } + StringField field = + Field.ofStringType(value).required(ErrorMessages.Required).validate(toArray(validators())); + return field.isValid() ? null : field.getErrorMessages().get(0); + } + + @SuppressWarnings("unchecked") + private static Validator[] toArray(List> validators) { + return validators.toArray(new Validator[0]); + } } diff --git a/src/main/java/com/DesktopApplicationClientJava/validation/LastNameValidator.java b/src/main/java/com/DesktopApplicationClientJava/validation/LastNameValidator.java index a24c702..80ed81a 100644 --- a/src/main/java/com/DesktopApplicationClientJava/validation/LastNameValidator.java +++ b/src/main/java/com/DesktopApplicationClientJava/validation/LastNameValidator.java @@ -1,8 +1,8 @@ package com.DesktopApplicationClientJava.validation; import com.DesktopApplicationClientJava.validation.utils.ErrorMessages; -import com.DesktopApplicationClientJava.validation.utils.ValidatorHelpers; -import com.dlsc.formsfx.model.validators.CustomValidator; +import com.dlsc.formsfx.model.structure.Field; +import com.dlsc.formsfx.model.structure.StringField; import com.dlsc.formsfx.model.validators.StringLengthValidator; import com.dlsc.formsfx.model.validators.Validator; import java.util.List; @@ -13,17 +13,28 @@ public final class LastNameValidator { private LastNameValidator() {} - public static String validate(String input) { - if (ValidatorHelpers.isEmpty(input)) return ErrorMessages.Required; - if (ValidatorHelpers.isShorterThan(input, MIN_LENGTH)) - return ErrorMessages.MinLength(FIELD_NAME, MIN_LENGTH); - return null; - } - public static List> validators() { return List.of( - CustomValidator.forPredicate( - input -> !ValidatorHelpers.isEmpty(input), ErrorMessages.Required), StringLengthValidator.atLeast(MIN_LENGTH, ErrorMessages.MinLength(FIELD_NAME, MIN_LENGTH))); } + + /** + * Thin contract over the stock FormsFX validators above: runs a {@link StringField} and returns + * the first error message, or {@code null} when valid. + */ + public static String validate(String input) { + String value = input == null ? "" : input; + if (value.isBlank()) { + // Stock FormsFX required-check is empty-based; preserve blank-means-required semantics. + return ErrorMessages.Required; + } + StringField field = + Field.ofStringType(value).required(ErrorMessages.Required).validate(toArray(validators())); + return field.isValid() ? null : field.getErrorMessages().get(0); + } + + @SuppressWarnings("unchecked") + private static Validator[] toArray(List> validators) { + return validators.toArray(new Validator[0]); + } } diff --git a/src/main/java/com/DesktopApplicationClientJava/validation/PasswordValidator.java b/src/main/java/com/DesktopApplicationClientJava/validation/PasswordValidator.java index 1976007..4dcda23 100644 --- a/src/main/java/com/DesktopApplicationClientJava/validation/PasswordValidator.java +++ b/src/main/java/com/DesktopApplicationClientJava/validation/PasswordValidator.java @@ -1,8 +1,8 @@ package com.DesktopApplicationClientJava.validation; import com.DesktopApplicationClientJava.validation.utils.ErrorMessages; -import com.DesktopApplicationClientJava.validation.utils.ValidatorHelpers; -import com.dlsc.formsfx.model.validators.CustomValidator; +import com.dlsc.formsfx.model.structure.Field; +import com.dlsc.formsfx.model.structure.PasswordField; import com.dlsc.formsfx.model.validators.StringLengthValidator; import com.dlsc.formsfx.model.validators.Validator; import java.util.List; @@ -14,20 +14,31 @@ public final class PasswordValidator { private PasswordValidator() {} - public static String validate(String input) { - if (ValidatorHelpers.isEmpty(input)) return ErrorMessages.Required; - if (ValidatorHelpers.isShorterThan(input, MIN_LENGTH)) - return ErrorMessages.MinLength(FIELD_NAME, MIN_LENGTH); - if (ValidatorHelpers.isLongerThan(input, MAX_LENGTH)) - return ErrorMessages.MaxLength(FIELD_NAME, MAX_LENGTH); - return null; - } - public static List> validators() { return List.of( - CustomValidator.forPredicate( - input -> !ValidatorHelpers.isEmpty(input), ErrorMessages.Required), StringLengthValidator.atLeast(MIN_LENGTH, ErrorMessages.MinLength(FIELD_NAME, MIN_LENGTH)), StringLengthValidator.upTo(MAX_LENGTH, ErrorMessages.MaxLength(FIELD_NAME, MAX_LENGTH))); } + + /** + * Thin contract over the stock FormsFX validators above: runs a {@link PasswordField} and returns + * the first error message, or {@code null} when valid. + */ + public static String validate(String input) { + String value = input == null ? "" : input; + if (value.isBlank()) { + // Stock FormsFX required-check is empty-based; preserve blank-means-required semantics. + return ErrorMessages.Required; + } + PasswordField field = + Field.ofPasswordType(value) + .required(ErrorMessages.Required) + .validate(toArray(validators())); + return field.isValid() ? null : field.getErrorMessages().get(0); + } + + @SuppressWarnings("unchecked") + private static Validator[] toArray(List> validators) { + return validators.toArray(new Validator[0]); + } } diff --git a/src/main/java/com/DesktopApplicationClientJava/validation/ThirdNameValidator.java b/src/main/java/com/DesktopApplicationClientJava/validation/ThirdNameValidator.java index 0cca4f4..fd4c53f 100644 --- a/src/main/java/com/DesktopApplicationClientJava/validation/ThirdNameValidator.java +++ b/src/main/java/com/DesktopApplicationClientJava/validation/ThirdNameValidator.java @@ -1,24 +1,41 @@ package com.DesktopApplicationClientJava.validation; import com.DesktopApplicationClientJava.validation.utils.ErrorMessages; -import com.DesktopApplicationClientJava.validation.utils.ValidatorHelpers; -import com.dlsc.formsfx.model.validators.CustomValidator; +import com.dlsc.formsfx.model.structure.Field; +import com.dlsc.formsfx.model.structure.StringField; +import com.dlsc.formsfx.model.validators.StringLengthValidator; import com.dlsc.formsfx.model.validators.Validator; import java.util.List; public final class ThirdNameValidator { public static final String FIELD_NAME = "Отчество"; + public static final int MIN_LENGTH = 2; private ThirdNameValidator() {} + public static List> validators() { + return List.of( + StringLengthValidator.atLeast(MIN_LENGTH, ErrorMessages.MinLength(FIELD_NAME, MIN_LENGTH))); + } + + /** + * Thin contract over the stock FormsFX setup above: runs a {@link StringField} and returns the + * first error message, or {@code null} when valid. A missing third name is valid — the field is + * optional — but a whitespace-only value is malformed. + */ public static String validate(String input) { - if (ValidatorHelpers.isEmpty(input)) return ErrorMessages.Required; - return null; + if (input == null || input.isEmpty()) { + return null; + } + if (input.isBlank()) { + return ErrorMessages.IncorrectFormat; + } + StringField field = Field.ofStringType(input).validate(toArray(validators())); + return field.isValid() ? null : field.getErrorMessages().get(0); } - public static List> validators() { - return List.of( - CustomValidator.forPredicate( - input -> !ValidatorHelpers.isEmpty(input), ErrorMessages.Required)); + @SuppressWarnings("unchecked") + private static Validator[] toArray(List> validators) { + return validators.toArray(new Validator[0]); } } diff --git a/src/main/java/com/DesktopApplicationClientJava/validation/utils/ValidatorHelpers.java b/src/main/java/com/DesktopApplicationClientJava/validation/utils/ValidatorHelpers.java deleted file mode 100644 index 6db826b..0000000 --- a/src/main/java/com/DesktopApplicationClientJava/validation/utils/ValidatorHelpers.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.DesktopApplicationClientJava.validation.utils; - -public class ValidatorHelpers { - public static boolean isEmpty(String input) { - return input == null || input.isBlank(); - } - - public static boolean isShorterThan(String input, int min) { - return input.length() < min; - } - - public static boolean isLongerThan(String input, int max) { - return input.length() > max; - } - - /** - * @param input input string - * @param sub substring - * @return true if input includes a substring sub, - * false otherwise - */ - public static boolean includes(String input, String sub) { - return input.contains(sub); - } -} diff --git a/src/test/java/validation/EmailValidatorTest.java b/src/test/java/validation/EmailValidatorTest.java index 15ac389..6869b47 100644 --- a/src/test/java/validation/EmailValidatorTest.java +++ b/src/test/java/validation/EmailValidatorTest.java @@ -1,28 +1,15 @@ package validation; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; import com.DesktopApplicationClientJava.validation.EmailValidator; import com.DesktopApplicationClientJava.validation.utils.ErrorMessages; -import com.dlsc.formsfx.model.structure.Field; -import com.dlsc.formsfx.model.structure.StringField; -import com.dlsc.formsfx.model.validators.Validator; -import java.util.List; import org.junit.jupiter.api.Test; public class EmailValidatorTest { private static final String FIELD_NAME = EmailValidator.FIELD_NAME; - private static StringField fieldWith(String value) { - List> validators = EmailValidator.validators(); - @SuppressWarnings("unchecked") - Validator[] array = validators.toArray(new Validator[0]); - return Field.ofStringType(value).required(ErrorMessages.Required).validate(array); - } - @Test void emptyEmailIsRejected() { assertEquals(ErrorMessages.Required, EmailValidator.validate("")); @@ -57,25 +44,4 @@ void emailWithoutAtIsRejected() { void validEmailIsAccepted() { assertNull(EmailValidator.validate("test@example.com")); } - - @Test - void fieldRejectsEmptyEmail() { - StringField field = fieldWith(""); - - assertFalse(field.isValid()); - assertTrue(field.getErrorMessages().contains(ErrorMessages.Required)); - } - - @Test - void fieldRejectsInvalidEmail() { - StringField field = fieldWith("nope.com"); - - assertFalse(field.isValid()); - assertTrue(field.getErrorMessages().contains(ErrorMessages.IncorrectFormat)); - } - - @Test - void fieldAcceptsValidEmail() { - assertTrue(fieldWith("test@example.com").isValid()); - } } diff --git a/src/test/java/validation/FirstNameValidatorTest.java b/src/test/java/validation/FirstNameValidatorTest.java index 2bd1b82..047afa7 100644 --- a/src/test/java/validation/FirstNameValidatorTest.java +++ b/src/test/java/validation/FirstNameValidatorTest.java @@ -1,26 +1,14 @@ package validation; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; import com.DesktopApplicationClientJava.validation.FirstNameValidator; import com.DesktopApplicationClientJava.validation.utils.ErrorMessages; -import com.dlsc.formsfx.model.structure.Field; -import com.dlsc.formsfx.model.structure.StringField; -import com.dlsc.formsfx.model.validators.Validator; -import java.util.List; import org.junit.jupiter.api.Test; public class FirstNameValidatorTest { - - private static StringField fieldWith(String value) { - List> validators = FirstNameValidator.validators(); - @SuppressWarnings("unchecked") - Validator[] array = validators.toArray(new Validator[0]); - return Field.ofStringType(value).required(ErrorMessages.Required).validate(array); - } + private static final String FIELD_NAME = FirstNameValidator.FIELD_NAME; @Test void emptyFirstNameIsRejected() { @@ -28,20 +16,14 @@ void emptyFirstNameIsRejected() { } @Test - void validFirstNameIsAccepted() { - assertNull(FirstNameValidator.validate("Антон")); - } - - @Test - void fieldRejectsEmptyFirstName() { - StringField field = fieldWith(""); - - assertFalse(field.isValid()); - assertTrue(field.getErrorMessages().contains(ErrorMessages.Required)); + void shortFirstNameIsRejected() { + assertEquals( + ErrorMessages.MinLength(FIELD_NAME, FirstNameValidator.MIN_LENGTH), + FirstNameValidator.validate("А")); } @Test - void fieldAcceptsValidFirstName() { - assertTrue(fieldWith("Антон").isValid()); + void validFirstNameIsAccepted() { + assertNull(FirstNameValidator.validate("Антон")); } } diff --git a/src/test/java/validation/LastNameValidatorTest.java b/src/test/java/validation/LastNameValidatorTest.java index 9976d07..6158c2f 100644 --- a/src/test/java/validation/LastNameValidatorTest.java +++ b/src/test/java/validation/LastNameValidatorTest.java @@ -1,26 +1,14 @@ package validation; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; import com.DesktopApplicationClientJava.validation.LastNameValidator; import com.DesktopApplicationClientJava.validation.utils.ErrorMessages; -import com.dlsc.formsfx.model.structure.Field; -import com.dlsc.formsfx.model.structure.StringField; -import com.dlsc.formsfx.model.validators.Validator; -import java.util.List; import org.junit.jupiter.api.Test; public class LastNameValidatorTest { - - private static StringField fieldWith(String value) { - List> validators = LastNameValidator.validators(); - @SuppressWarnings("unchecked") - Validator[] array = validators.toArray(new Validator[0]); - return Field.ofStringType(value).required(ErrorMessages.Required).validate(array); - } + private static final String FIELD_NAME = LastNameValidator.FIELD_NAME; @Test void emptyLastNameIsRejected() { @@ -28,20 +16,14 @@ void emptyLastNameIsRejected() { } @Test - void validLastNameIsAccepted() { - assertNull(LastNameValidator.validate("Антонов")); - } - - @Test - void fieldRejectsEmptyLastName() { - StringField field = fieldWith(""); - - assertFalse(field.isValid()); - assertTrue(field.getErrorMessages().contains(ErrorMessages.Required)); + void shortLastNameIsRejected() { + assertEquals( + ErrorMessages.MinLength(FIELD_NAME, LastNameValidator.MIN_LENGTH), + LastNameValidator.validate("А")); } @Test - void fieldAcceptsValidLastName() { - assertTrue(fieldWith("Антонов").isValid()); + void validLastNameIsAccepted() { + assertNull(LastNameValidator.validate("Антонов")); } } diff --git a/src/test/java/validation/PasswordValidatorTest.java b/src/test/java/validation/PasswordValidatorTest.java index 099ddb2..6ae4acc 100644 --- a/src/test/java/validation/PasswordValidatorTest.java +++ b/src/test/java/validation/PasswordValidatorTest.java @@ -1,28 +1,15 @@ package validation; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; import com.DesktopApplicationClientJava.validation.PasswordValidator; import com.DesktopApplicationClientJava.validation.utils.ErrorMessages; -import com.dlsc.formsfx.model.structure.Field; -import com.dlsc.formsfx.model.structure.PasswordField; -import com.dlsc.formsfx.model.validators.Validator; -import java.util.List; import org.junit.jupiter.api.Test; public class PasswordValidatorTest { private static final String FIELD_NAME = PasswordValidator.FIELD_NAME; - private static PasswordField fieldWith(String value) { - List> validators = PasswordValidator.validators(); - @SuppressWarnings("unchecked") - Validator[] array = validators.toArray(new Validator[0]); - return Field.ofPasswordType(value).required(ErrorMessages.Required).validate(array); - } - @Test void emptyPasswordIsRejected() { assertEquals(ErrorMessages.Required, PasswordValidator.validate("")); @@ -39,28 +26,4 @@ void shortPasswordIsRejected() { void exactlyEightCharPasswordIsAccepted() { assertNull(PasswordValidator.validate("12345678")); } - - @Test - void fieldRejectsEmptyPassword() { - PasswordField field = fieldWith(""); - - assertFalse(field.isValid()); - assertTrue(field.getErrorMessages().contains(ErrorMessages.Required)); - } - - @Test - void fieldRejectsShortPassword() { - PasswordField field = fieldWith("short"); - - assertFalse(field.isValid()); - assertTrue( - field - .getErrorMessages() - .contains(ErrorMessages.MinLength(FIELD_NAME, PasswordValidator.MIN_LENGTH))); - } - - @Test - void fieldAcceptsValidPassword() { - assertTrue(fieldWith("12345678").isValid()); - } } diff --git a/src/test/java/validation/ThirdNameValidatorTest.java b/src/test/java/validation/ThirdNameValidatorTest.java index 8a0b549..7e97020 100644 --- a/src/test/java/validation/ThirdNameValidatorTest.java +++ b/src/test/java/validation/ThirdNameValidatorTest.java @@ -1,47 +1,34 @@ package validation; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; import com.DesktopApplicationClientJava.validation.ThirdNameValidator; import com.DesktopApplicationClientJava.validation.utils.ErrorMessages; -import com.dlsc.formsfx.model.structure.Field; -import com.dlsc.formsfx.model.structure.StringField; -import com.dlsc.formsfx.model.validators.Validator; -import java.util.List; import org.junit.jupiter.api.Test; public class ThirdNameValidatorTest { - - private static StringField fieldWith(String value) { - List> validators = ThirdNameValidator.validators(); - @SuppressWarnings("unchecked") - Validator[] array = validators.toArray(new Validator[0]); - return Field.ofStringType(value).required(ErrorMessages.Required).validate(array); - } + private static final String FIELD_NAME = ThirdNameValidator.FIELD_NAME; @Test - void emptyThirdNameIsRejected() { - assertEquals(ErrorMessages.Required, ThirdNameValidator.validate("")); + void emptyThirdNameIsAccepted() { + assertNull(ThirdNameValidator.validate("")); } @Test - void validThirdNameIsAccepted() { - assertNull(ThirdNameValidator.validate("Антон")); + void blankThirdNameIsRejected() { + assertEquals(ErrorMessages.IncorrectFormat, ThirdNameValidator.validate(" ")); } @Test - void fieldRejectsEmptyThirdName() { - StringField field = fieldWith(""); - - assertFalse(field.isValid()); - assertTrue(field.getErrorMessages().contains(ErrorMessages.Required)); + void shortThirdNameIsRejected() { + assertEquals( + ErrorMessages.MinLength(FIELD_NAME, ThirdNameValidator.MIN_LENGTH), + ThirdNameValidator.validate("А")); } @Test - void fieldAcceptsValidThirdName() { - assertTrue(fieldWith("Антон").isValid()); + void validThirdNameIsAccepted() { + assertNull(ThirdNameValidator.validate("Антон")); } }