Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<Validator<String>> 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<String>[] toArray(List<Validator<String>> validators) {
return validators.toArray(new Validator[0]);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<Validator<String>> 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<String>[] toArray(List<Validator<String>> validators) {
return validators.toArray(new Validator[0]);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<Validator<String>> 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<String>[] toArray(List<Validator<String>> validators) {
return validators.toArray(new Validator[0]);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<Validator<String>> 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<String>[] toArray(List<Validator<String>> validators) {
return validators.toArray(new Validator[0]);
}
}
Original file line number Diff line number Diff line change
@@ -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<Validator<String>> 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<Validator<String>> validators() {
return List.of(
CustomValidator.forPredicate(
input -> !ValidatorHelpers.isEmpty(input), ErrorMessages.Required));
@SuppressWarnings("unchecked")
private static Validator<String>[] toArray(List<Validator<String>> validators) {
return validators.toArray(new Validator[0]);
}
}

This file was deleted.

34 changes: 0 additions & 34 deletions src/test/java/validation/EmailValidatorTest.java
Original file line number Diff line number Diff line change
@@ -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<Validator<String>> validators = EmailValidator.validators();
@SuppressWarnings("unchecked")
Validator<String>[] array = validators.toArray(new Validator[0]);
return Field.ofStringType(value).required(ErrorMessages.Required).validate(array);
}

@Test
void emptyEmailIsRejected() {
assertEquals(ErrorMessages.Required, EmailValidator.validate(""));
Expand Down Expand Up @@ -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());
}
}
32 changes: 7 additions & 25 deletions src/test/java/validation/FirstNameValidatorTest.java
Original file line number Diff line number Diff line change
@@ -1,47 +1,29 @@
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<Validator<String>> validators = FirstNameValidator.validators();
@SuppressWarnings("unchecked")
Validator<String>[] 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() {
assertEquals(ErrorMessages.Required, FirstNameValidator.validate(""));
}

@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("Антон"));
}
}
Loading
Loading