diff --git a/.mvn/jvm.config b/.mvn/jvm.config new file mode 100644 index 0000000..fecd9cc --- /dev/null +++ b/.mvn/jvm.config @@ -0,0 +1 @@ +--sun-misc-unsafe-memory-access=allow diff --git a/pom.xml b/pom.xml index 66d3ed7..77bd69e 100644 --- a/pom.xml +++ b/pom.xml @@ -176,7 +176,7 @@ com.diffplug.spotless spotless-maven-plugin - 3.4.0 + 3.10.3 diff --git a/src/main/java/com/DesktopApplicationClientJava/controllers/LoginFormController.java b/src/main/java/com/DesktopApplicationClientJava/controllers/LoginFormController.java index 48e43eb..da59504 100644 --- a/src/main/java/com/DesktopApplicationClientJava/controllers/LoginFormController.java +++ b/src/main/java/com/DesktopApplicationClientJava/controllers/LoginFormController.java @@ -9,7 +9,7 @@ import com.DesktopApplicationClientJava.validation.LastNameValidator; import com.DesktopApplicationClientJava.validation.PasswordValidator; import com.DesktopApplicationClientJava.validation.ThirdNameValidator; -import com.DesktopApplicationClientJava.validation.utils.Validator; +import com.DesktopApplicationClientJava.validation.utils.FieldErrorDecoration; import java.util.UUID; import javafx.event.ActionEvent; import javafx.fxml.FXML; @@ -17,8 +17,11 @@ import javafx.scene.control.Label; import javafx.scene.control.PasswordField; import javafx.scene.control.TextField; +import net.synedra.validatorfx.Validator; public class LoginFormController extends Controller { + private final Validator validator = new Validator(); + @FXML private TextField firstNameField; @FXML private Label firstNameErrorLabel; private FieldError firstNameError; @@ -49,13 +52,35 @@ private void initialize() { emailError = new FieldError(emailErrorLabel); passwordError = new FieldError(passwordErrorLabel); - emailField.textProperty().addListener((o, a, b) -> emailError.hide()); - passwordField.textProperty().addListener((o, a, b) -> passwordError.hide()); + setupValidation(); + } + + private void setupValidation() { + FirstNameValidator.createCheck(validator, firstNameField.textProperty()) + .decoratingWith(FieldErrorDecoration.forError(firstNameError)) + .decorates(firstNameField) + .immediateClear(); + LastNameValidator.createCheck(validator, lastNameField.textProperty()) + .decoratingWith(FieldErrorDecoration.forError(lastNameError)) + .decorates(lastNameField) + .immediateClear(); + ThirdNameValidator.createCheck(validator, thirdNameField.textProperty()) + .decoratingWith(FieldErrorDecoration.forError(thirdNameError)) + .decorates(thirdNameField) + .immediateClear(); + EmailValidator.createCheck(validator, emailField.textProperty()) + .decoratingWith(FieldErrorDecoration.forError(emailError)) + .decorates(emailField) + .immediateClear(); + PasswordValidator.createCheck(validator, passwordField.textProperty()) + .decoratingWith(FieldErrorDecoration.forError(passwordError)) + .decorates(passwordField) + .immediateClear(); } @FXML private void onSubmit(ActionEvent event) { - if (!isValid()) return; + if (!validator.validate()) return; User user = authenticate(firstNameField.getText(), lastNameField.getText(), emailField.getText()); @@ -65,45 +90,6 @@ private void onSubmit(ActionEvent event) { navigator.goTo("/fxml/Search.fxml"); } - private boolean isValid() { - return isFirstNameValid() - & isLastNameValid() - & isThirdNameValid() - & isEmailValid() - & isPasswordValid(); - } - - private boolean isFirstNameValid() { - return isFieldValid(firstNameField, new FirstNameValidator(), firstNameError); - } - - private boolean isLastNameValid() { - return isFieldValid(lastNameField, new LastNameValidator(), lastNameError); - } - - private boolean isThirdNameValid() { - return isFieldValid(thirdNameField, new ThirdNameValidator(), thirdNameError); - } - - private boolean isEmailValid() { - return isFieldValid(emailField, new EmailValidator(), emailError); - } - - private boolean isPasswordValid() { - return isFieldValid(passwordField, new PasswordValidator(), passwordError); - } - - private boolean isFieldValid(TextField field, Validator validator, FieldError errorLabel) { - String input = field.getText(); - var error = validator.isValid(input); - if (error == null) { - errorLabel.hide(); - return true; - } - errorLabel.show(error); - return false; - } - private User authenticate(String firstName, String lastName, String email) { return new User(UUID.randomUUID(), email, Role.USER, firstName, lastName, true); } diff --git a/src/main/java/com/DesktopApplicationClientJava/validation/EmailValidator.java b/src/main/java/com/DesktopApplicationClientJava/validation/EmailValidator.java index 75e0d99..8f0f4e0 100644 --- a/src/main/java/com/DesktopApplicationClientJava/validation/EmailValidator.java +++ b/src/main/java/com/DesktopApplicationClientJava/validation/EmailValidator.java @@ -1,15 +1,20 @@ package com.DesktopApplicationClientJava.validation; -import com.DesktopApplicationClientJava.validation.utils.AbstractValidator; import com.DesktopApplicationClientJava.validation.utils.ErrorMessages; import com.DesktopApplicationClientJava.validation.utils.ValidatorHelpers; +import javafx.beans.value.ObservableValue; +import net.synedra.validatorfx.Check; +import net.synedra.validatorfx.Validator; -public class EmailValidator extends AbstractValidator { +public final class EmailValidator { public static final String FIELD_NAME = "Почта"; public static final int MIN_EMAIL_LENGTH = 5; public static final int MAX_EMAIL_LENGTH = 100; + private static final String KEY = "value"; - public String isValid(String input) { + 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); @@ -18,4 +23,15 @@ public String isValid(String input) { if (!ValidatorHelpers.includes(input, "@")) return ErrorMessages.IncorrectFormat; return null; } + + public static void check(Check.Context context) { + String error = validate(context.get(KEY)); + if (error != null) { + context.error(error); + } + } + + public static Check createCheck(Validator validator, ObservableValue property) { + return validator.createCheck().dependsOn(KEY, property).withMethod(EmailValidator::check); + } } diff --git a/src/main/java/com/DesktopApplicationClientJava/validation/FirstNameValidator.java b/src/main/java/com/DesktopApplicationClientJava/validation/FirstNameValidator.java index 5f9516f..78d78a3 100644 --- a/src/main/java/com/DesktopApplicationClientJava/validation/FirstNameValidator.java +++ b/src/main/java/com/DesktopApplicationClientJava/validation/FirstNameValidator.java @@ -1,17 +1,33 @@ package com.DesktopApplicationClientJava.validation; -import com.DesktopApplicationClientJava.validation.utils.AbstractValidator; import com.DesktopApplicationClientJava.validation.utils.ErrorMessages; import com.DesktopApplicationClientJava.validation.utils.ValidatorHelpers; +import javafx.beans.value.ObservableValue; +import net.synedra.validatorfx.Check; +import net.synedra.validatorfx.Validator; -public class FirstNameValidator extends AbstractValidator { +public final class FirstNameValidator { public static final String FIELD_NAME = "Имя"; private static final int MIN_LENGTH = 2; + private static final String KEY = "value"; - public String isValid(String input) { + 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 void check(Check.Context context) { + String error = validate(context.get(KEY)); + if (error != null) { + context.error(error); + } + } + + public static Check createCheck(Validator validator, ObservableValue property) { + return validator.createCheck().dependsOn(KEY, property).withMethod(FirstNameValidator::check); + } } diff --git a/src/main/java/com/DesktopApplicationClientJava/validation/LastNameValidator.java b/src/main/java/com/DesktopApplicationClientJava/validation/LastNameValidator.java index 933e658..bd12ee7 100644 --- a/src/main/java/com/DesktopApplicationClientJava/validation/LastNameValidator.java +++ b/src/main/java/com/DesktopApplicationClientJava/validation/LastNameValidator.java @@ -1,17 +1,33 @@ package com.DesktopApplicationClientJava.validation; -import com.DesktopApplicationClientJava.validation.utils.AbstractValidator; import com.DesktopApplicationClientJava.validation.utils.ErrorMessages; import com.DesktopApplicationClientJava.validation.utils.ValidatorHelpers; +import javafx.beans.value.ObservableValue; +import net.synedra.validatorfx.Check; +import net.synedra.validatorfx.Validator; -public class LastNameValidator extends AbstractValidator { +public final class LastNameValidator { public static final String FIELD_NAME = "Фамилия"; public static final int MIN_LENGTH = 2; + private static final String KEY = "value"; - public String isValid(String input) { + 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 Check createCheck(Validator validator, ObservableValue property) { + return validator.createCheck().dependsOn(KEY, property).withMethod(LastNameValidator::check); + } + + public static void check(Check.Context context) { + String error = validate(context.get(KEY)); + if (error != null) { + context.error(error); + } + } } diff --git a/src/main/java/com/DesktopApplicationClientJava/validation/PasswordValidator.java b/src/main/java/com/DesktopApplicationClientJava/validation/PasswordValidator.java index a9e2c97..2dc0b09 100644 --- a/src/main/java/com/DesktopApplicationClientJava/validation/PasswordValidator.java +++ b/src/main/java/com/DesktopApplicationClientJava/validation/PasswordValidator.java @@ -1,15 +1,20 @@ package com.DesktopApplicationClientJava.validation; -import com.DesktopApplicationClientJava.validation.utils.AbstractValidator; import com.DesktopApplicationClientJava.validation.utils.ErrorMessages; import com.DesktopApplicationClientJava.validation.utils.ValidatorHelpers; +import javafx.beans.value.ObservableValue; +import net.synedra.validatorfx.Check; +import net.synedra.validatorfx.Validator; -public class PasswordValidator extends AbstractValidator { +public final class PasswordValidator { public static final String FIELD_NAME = "Пароль"; public static final int MIN_LENGTH = 8; public static final int MAX_LENGTH = 64; + private static final String KEY = "value"; - public String isValid(String input) { + 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); @@ -17,4 +22,15 @@ public String isValid(String input) { return ErrorMessages.MaxLength(FIELD_NAME, MAX_LENGTH); return null; } + + public static void check(Check.Context context) { + String error = validate(context.get(KEY)); + if (error != null) { + context.error(error); + } + } + + public static Check createCheck(Validator validator, ObservableValue property) { + return validator.createCheck().dependsOn(KEY, property).withMethod(PasswordValidator::check); + } } diff --git a/src/main/java/com/DesktopApplicationClientJava/validation/ThirdNameValidator.java b/src/main/java/com/DesktopApplicationClientJava/validation/ThirdNameValidator.java index fd3aa2f..5c429e0 100644 --- a/src/main/java/com/DesktopApplicationClientJava/validation/ThirdNameValidator.java +++ b/src/main/java/com/DesktopApplicationClientJava/validation/ThirdNameValidator.java @@ -1,15 +1,30 @@ package com.DesktopApplicationClientJava.validation; -import com.DesktopApplicationClientJava.validation.utils.AbstractValidator; import com.DesktopApplicationClientJava.validation.utils.ErrorMessages; import com.DesktopApplicationClientJava.validation.utils.ValidatorHelpers; +import javafx.beans.value.ObservableValue; +import net.synedra.validatorfx.Check; +import net.synedra.validatorfx.Validator; -public class ThirdNameValidator extends AbstractValidator { +public final class ThirdNameValidator { public static final String FIELD_NAME = "Отчество"; + private static final String KEY = "value"; - @Override - public String isValid(String input) { + private ThirdNameValidator() {} + + public static String validate(String input) { if (ValidatorHelpers.isEmpty(input)) return ErrorMessages.Required; return null; } + + public static void check(Check.Context context) { + String error = validate(context.get(KEY)); + if (error != null) { + context.error(error); + } + } + + public static Check createCheck(Validator validator, ObservableValue property) { + return validator.createCheck().dependsOn(KEY, property).withMethod(ThirdNameValidator::check); + } } diff --git a/src/main/java/com/DesktopApplicationClientJava/validation/utils/AbstractValidator.java b/src/main/java/com/DesktopApplicationClientJava/validation/utils/AbstractValidator.java deleted file mode 100644 index 3a921e8..0000000 --- a/src/main/java/com/DesktopApplicationClientJava/validation/utils/AbstractValidator.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.DesktopApplicationClientJava.validation.utils; - -public abstract class AbstractValidator implements Validator { - public abstract String isValid(String input); -} diff --git a/src/main/java/com/DesktopApplicationClientJava/validation/utils/FieldErrorDecoration.java b/src/main/java/com/DesktopApplicationClientJava/validation/utils/FieldErrorDecoration.java new file mode 100644 index 0000000..a39b93f --- /dev/null +++ b/src/main/java/com/DesktopApplicationClientJava/validation/utils/FieldErrorDecoration.java @@ -0,0 +1,26 @@ +package com.DesktopApplicationClientJava.validation.utils; + +import com.DesktopApplicationClientJava.utils.FieldError; +import java.util.function.Function; +import javafx.scene.Node; +import net.synedra.validatorfx.Decoration; +import net.synedra.validatorfx.ValidationMessage; + +public final class FieldErrorDecoration { + private FieldErrorDecoration() {} + + public static Function forError(FieldError error) { + return message -> + new Decoration() { + @Override + public void add(Node target) { + error.show(message.getText()); + } + + @Override + public void remove(Node target) { + error.hide(); + } + }; + } +} diff --git a/src/main/java/com/DesktopApplicationClientJava/validation/utils/Validator.java b/src/main/java/com/DesktopApplicationClientJava/validation/utils/Validator.java deleted file mode 100644 index 081eef7..0000000 --- a/src/main/java/com/DesktopApplicationClientJava/validation/utils/Validator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.DesktopApplicationClientJava.validation.utils; - -@FunctionalInterface -public interface Validator { - String isValid(String input); -} diff --git a/src/test/java/validation/EmailValidatorTest.java b/src/test/java/validation/EmailValidatorTest.java index 54f5480..569e5f4 100644 --- a/src/test/java/validation/EmailValidatorTest.java +++ b/src/test/java/validation/EmailValidatorTest.java @@ -1,31 +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.EmailValidator; import com.DesktopApplicationClientJava.validation.utils.ErrorMessages; +import javafx.beans.property.SimpleStringProperty; +import net.synedra.validatorfx.Validator; import org.junit.jupiter.api.Test; -public class EmailValidatorTest { +public class EmailValidatorTest extends ValidatorFxTest { private static final String FIELD_NAME = EmailValidator.FIELD_NAME; - private static final EmailValidator emailValidator = new EmailValidator(); @Test void emptyEmailIsRejected() { - assertEquals(ErrorMessages.Required, emailValidator.isValid("")); + assertEquals(ErrorMessages.Required, EmailValidator.validate("")); } @Test void blankEmailIsRejected() { - assertEquals(ErrorMessages.Required, emailValidator.isValid(" ")); + assertEquals(ErrorMessages.Required, EmailValidator.validate(" ")); } @Test void shortEmailIsRejected() { assertEquals( ErrorMessages.MinLength(FIELD_NAME, EmailValidator.MIN_EMAIL_LENGTH), - emailValidator.isValid("a@b")); + EmailValidator.validate("a@b")); } @Test @@ -33,16 +36,39 @@ void longEmailIsRejected() { String e = "a".repeat(95) + "@x.com"; assertEquals( ErrorMessages.MaxLength(FIELD_NAME, EmailValidator.MAX_EMAIL_LENGTH), - emailValidator.isValid(e)); + EmailValidator.validate(e)); } @Test void emailWithoutAtIsRejected() { - assertEquals(ErrorMessages.IncorrectFormat, emailValidator.isValid("nope.com")); + assertEquals(ErrorMessages.IncorrectFormat, EmailValidator.validate("nope.com")); } @Test void validEmailIsAccepted() { - assertNull(emailValidator.isValid("test@example.com")); + assertNull(EmailValidator.validate("test@example.com")); + } + + @Test + void checkRejectsInvalidEmail() { + Validator validator = new Validator(); + SimpleStringProperty email = new SimpleStringProperty("nope.com"); + EmailValidator.createCheck(validator, email); + + assertFalse(validator.validate()); + assertTrue(validator.containsErrors()); + assertEquals(1, validator.getValidationResult().getMessages().size()); + assertEquals( + ErrorMessages.IncorrectFormat, + validator.getValidationResult().getMessages().get(0).getText()); + } + + @Test + void checkAcceptsValidEmail() { + Validator validator = new Validator(); + SimpleStringProperty email = new SimpleStringProperty("test@example.com"); + EmailValidator.createCheck(validator, email); + + assertTrue(validator.validate()); } } diff --git a/src/test/java/validation/FirstNameValidatorTest.java b/src/test/java/validation/FirstNameValidatorTest.java index 1ef2a3a..92fca95 100644 --- a/src/test/java/validation/FirstNameValidatorTest.java +++ b/src/test/java/validation/FirstNameValidatorTest.java @@ -1,23 +1,46 @@ 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 javafx.beans.property.SimpleStringProperty; +import net.synedra.validatorfx.Validator; import org.junit.jupiter.api.Test; -public class FirstNameValidatorTest { - private static final String FIELD_NAME = FirstNameValidator.FIELD_NAME; - private static final FirstNameValidator firstNameValidator = new FirstNameValidator(); +public class FirstNameValidatorTest extends ValidatorFxTest { @Test void emptyFirstNameIsRejected() { - assertEquals(ErrorMessages.Required, firstNameValidator.isValid("")); + assertEquals(ErrorMessages.Required, FirstNameValidator.validate("")); } @Test void validFirstNameIsAccepted() { - assertNull(firstNameValidator.isValid("Антон")); + assertNull(FirstNameValidator.validate("Антон")); + } + + @Test + void checkRejectsEmptyFirstName() { + Validator validator = new Validator(); + SimpleStringProperty firstName = new SimpleStringProperty(""); + FirstNameValidator.createCheck(validator, firstName); + + assertFalse(validator.validate()); + assertTrue(validator.containsErrors()); + assertEquals( + ErrorMessages.Required, validator.getValidationResult().getMessages().get(0).getText()); + } + + @Test + void checkAcceptsValidFirstName() { + Validator validator = new Validator(); + SimpleStringProperty firstName = new SimpleStringProperty("Антон"); + FirstNameValidator.createCheck(validator, firstName); + + assertTrue(validator.validate()); } } diff --git a/src/test/java/validation/LastNameValidatorTest.java b/src/test/java/validation/LastNameValidatorTest.java index aeec56e..8d06b45 100644 --- a/src/test/java/validation/LastNameValidatorTest.java +++ b/src/test/java/validation/LastNameValidatorTest.java @@ -1,23 +1,46 @@ 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 javafx.beans.property.SimpleStringProperty; +import net.synedra.validatorfx.Validator; import org.junit.jupiter.api.Test; -public class LastNameValidatorTest { - private static final String FIELD_NAME = LastNameValidator.FIELD_NAME; - private static final LastNameValidator lastNameValidator = new LastNameValidator(); +public class LastNameValidatorTest extends ValidatorFxTest { @Test void emptyLastNameIsRejected() { - assertEquals(ErrorMessages.Required, lastNameValidator.isValid("")); + assertEquals(ErrorMessages.Required, LastNameValidator.validate("")); } @Test void validLastNameIsAccepted() { - assertNull(lastNameValidator.isValid("Антонов")); + assertNull(LastNameValidator.validate("Антонов")); + } + + @Test + void checkRejectsEmptyLastName() { + Validator validator = new Validator(); + SimpleStringProperty lastName = new SimpleStringProperty(""); + LastNameValidator.createCheck(validator, lastName); + + assertFalse(validator.validate()); + assertTrue(validator.containsErrors()); + assertEquals( + ErrorMessages.Required, validator.getValidationResult().getMessages().get(0).getText()); + } + + @Test + void checkAcceptsValidLastName() { + Validator validator = new Validator(); + SimpleStringProperty lastName = new SimpleStringProperty("Антонов"); + LastNameValidator.createCheck(validator, lastName); + + assertTrue(validator.validate()); } } diff --git a/src/test/java/validation/PasswordValidatorTest.java b/src/test/java/validation/PasswordValidatorTest.java index 8350694..f339f4b 100644 --- a/src/test/java/validation/PasswordValidatorTest.java +++ b/src/test/java/validation/PasswordValidatorTest.java @@ -1,30 +1,55 @@ 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 javafx.beans.property.SimpleStringProperty; +import net.synedra.validatorfx.Validator; import org.junit.jupiter.api.Test; -public class PasswordValidatorTest { +public class PasswordValidatorTest extends ValidatorFxTest { private static final String FIELD_NAME = PasswordValidator.FIELD_NAME; - private static final PasswordValidator passwordValidator = new PasswordValidator(); @Test void emptyPasswordIsRejected() { - assertEquals(ErrorMessages.Required, passwordValidator.isValid("")); + assertEquals(ErrorMessages.Required, PasswordValidator.validate("")); } @Test void shortPasswordIsRejected() { assertEquals( ErrorMessages.MinLength(FIELD_NAME, PasswordValidator.MIN_LENGTH), - passwordValidator.isValid("short")); + PasswordValidator.validate("short")); } @Test void exactlyEightCharPasswordIsAccepted() { - assertNull(passwordValidator.isValid("12345678")); + assertNull(PasswordValidator.validate("12345678")); + } + + @Test + void checkRejectsShortPassword() { + Validator validator = new Validator(); + SimpleStringProperty password = new SimpleStringProperty("short"); + PasswordValidator.createCheck(validator, password); + + assertFalse(validator.validate()); + assertTrue(validator.containsErrors()); + assertEquals( + ErrorMessages.MinLength(FIELD_NAME, PasswordValidator.MIN_LENGTH), + validator.getValidationResult().getMessages().get(0).getText()); + } + + @Test + void checkAcceptsValidPassword() { + Validator validator = new Validator(); + SimpleStringProperty password = new SimpleStringProperty("12345678"); + PasswordValidator.createCheck(validator, password); + + assertTrue(validator.validate()); } } diff --git a/src/test/java/validation/ThirdNameValidatorTest.java b/src/test/java/validation/ThirdNameValidatorTest.java index 0eb4f25..fa9e771 100644 --- a/src/test/java/validation/ThirdNameValidatorTest.java +++ b/src/test/java/validation/ThirdNameValidatorTest.java @@ -1,23 +1,46 @@ 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 javafx.beans.property.SimpleStringProperty; +import net.synedra.validatorfx.Validator; import org.junit.jupiter.api.Test; -public class ThirdNameValidatorTest { - private static final String FIELD_NAME = ThirdNameValidator.FIELD_NAME; - private static final ThirdNameValidator thirdNameValidator = new ThirdNameValidator(); +public class ThirdNameValidatorTest extends ValidatorFxTest { @Test void emptyThirdNameIsRejected() { - assertEquals(ErrorMessages.Required, thirdNameValidator.isValid("")); + assertEquals(ErrorMessages.Required, ThirdNameValidator.validate("")); } @Test void validThirdNameIsAccepted() { - assertNull(thirdNameValidator.isValid("Антон")); + assertNull(ThirdNameValidator.validate("Антон")); + } + + @Test + void checkRejectsEmptyThirdName() { + Validator validator = new Validator(); + SimpleStringProperty thirdName = new SimpleStringProperty(""); + ThirdNameValidator.createCheck(validator, thirdName); + + assertFalse(validator.validate()); + assertTrue(validator.containsErrors()); + assertEquals( + ErrorMessages.Required, validator.getValidationResult().getMessages().get(0).getText()); + } + + @Test + void checkAcceptsValidThirdName() { + Validator validator = new Validator(); + SimpleStringProperty thirdName = new SimpleStringProperty("Антон"); + ThirdNameValidator.createCheck(validator, thirdName); + + assertTrue(validator.validate()); } } diff --git a/src/test/java/validation/ValidatorFxTest.java b/src/test/java/validation/ValidatorFxTest.java new file mode 100644 index 0000000..e59dd19 --- /dev/null +++ b/src/test/java/validation/ValidatorFxTest.java @@ -0,0 +1,42 @@ +package validation; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import javafx.application.Platform; +import org.junit.jupiter.api.BeforeAll; + +public abstract class ValidatorFxTest { + private static volatile boolean toolkitStarted; + + @BeforeAll + static void startJavaFxToolkit() throws InterruptedException { + if (toolkitStarted) { + return; + } + setHeadlessDefaults(); + CountDownLatch latch = new CountDownLatch(1); + try { + Platform.startup(latch::countDown); + } catch (IllegalStateException alreadyStarted) { + latch.countDown(); + } + latch.await(30, TimeUnit.SECONDS); + toolkitStarted = true; + } + + private static void setHeadlessDefaults() { + setIfAbsent("testfx.headless", "true"); + setIfAbsent("testfx.robot", "glass"); + setIfAbsent("glass.platform", "Monocle"); + setIfAbsent("monocle.platform", "Headless"); + setIfAbsent("prism.order", "sw"); + setIfAbsent("prism.text", "t2k"); + setIfAbsent("java.awt.headless", "true"); + } + + private static void setIfAbsent(String key, String value) { + if (System.getProperty(key) == null) { + System.setProperty(key, value); + } + } +}