From f2daad5dafe10740e23826abb450e3dc53d76b93 Mon Sep 17 00:00:00 2001 From: pacien Date: Fri, 29 Mar 2019 16:29:07 +0100 Subject: shorten name --- .../org/pacien/lemonad/validation/Validation.java | 129 +++++++++++++++++++++ .../lemonad/validation/ValidationContainer.java | 40 +++++++ .../lemonad/validation/ValidationResult.java | 129 --------------------- .../validation/ValidationResultContainer.java | 40 ------- .../org/pacien/lemonad/validation/Validator.java | 10 +- .../lemonad/validation/ValidationResultTest.java | 75 ------------ .../pacien/lemonad/validation/ValidationTest.java | 75 ++++++++++++ 7 files changed, 249 insertions(+), 249 deletions(-) create mode 100644 src/main/java/org/pacien/lemonad/validation/Validation.java create mode 100644 src/main/java/org/pacien/lemonad/validation/ValidationContainer.java delete mode 100644 src/main/java/org/pacien/lemonad/validation/ValidationResult.java delete mode 100644 src/main/java/org/pacien/lemonad/validation/ValidationResultContainer.java delete mode 100644 src/test/java/org/pacien/lemonad/validation/ValidationResultTest.java create mode 100644 src/test/java/org/pacien/lemonad/validation/ValidationTest.java diff --git a/src/main/java/org/pacien/lemonad/validation/Validation.java b/src/main/java/org/pacien/lemonad/validation/Validation.java new file mode 100644 index 0000000..04c1ed0 --- /dev/null +++ b/src/main/java/org/pacien/lemonad/validation/Validation.java @@ -0,0 +1,129 @@ +/* + * lemonad - Some functional sweetness for Java + * Copyright (C) 2019 Pacien TRAN-GIRARD + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.pacien.lemonad.validation; + +import org.pacien.lemonad.attempt.Attempt; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Stream; + +import lombok.NonNull; + +import static java.util.stream.Collectors.toUnmodifiableList; +import static org.pacien.lemonad.attempt.Attempt.failure; +import static org.pacien.lemonad.attempt.Attempt.success; + +/** + * Wraps the result of the validation of a subject. + * + * @param the subject type, + * @param the error type. + * @author pacien + */ +public interface Validation { + /** + * @return whether no error have been reported during the validation. + */ + boolean isValid(); + + /** + * @return whether some error have been reported during the validation. + */ + boolean isInvalid(); + + /** + * @return the subject of the validation. + */ + S getSubject(); + + /** + * @return the potentially empty list of reported validation errors. + */ + List getErrors(); + + /** + * @param consumer a subject consumer called if the validation is successful. + * @return the current object. + */ + default Validation ifValid(@NonNull Consumer consumer) { + if (isValid()) consumer.accept(getSubject()); + return this; + } + + /** + * @param consumer the consumer called with the validation subject and reported errors if the validation is failed. + * @return the current object. + */ + default Validation ifInvalid(@NonNull BiConsumer> consumer) { + if (!isValid()) consumer.accept(getSubject(), getErrors()); + return this; + } + + /** + * @return an {@link Attempt} with a state corresponding to the one of the validation. + */ + default Attempt> toAttempt() { + return isValid() ? success(getSubject()) : failure(getErrors()); + } + + /** + * @param mapper a function transforming a {@link Validation}. + * @return the transformed {@link Validation}. + */ + default Validation flatMap(@NonNull Function, ? extends Validation> mapper) { + //noinspection unchecked + return (Validation) mapper.apply(this); + } + + /** + * @param subject an overriding subject. + * @param validationResults a {@link Stream} of {@link Validation}s to merge. + * @return the merged {@link Validation} containing all errors from the supplied ones. + */ + static Validation merge(S subject, @NonNull Stream> validationResults) { + return new ValidationContainer<>( + subject, + validationResults.flatMap(res -> res.getErrors().stream()).collect(toUnmodifiableList())); + } + + /** + * @param subject the suject of the validation. + * @return a successful {@link Validation}. + */ + static Validation valid(S subject) { + return new ValidationContainer<>(subject, List.of()); + } + + /** + * @param subject the suject of the validation. + * @param error a validation error. + * @param errors additional validation errors. + * @return a failed {@link Validation} for the supplied subject. + */ + @SafeVarargs static Validation invalid(S subject, E error, E... errors) { + return new ValidationContainer<>( + subject, + Stream.concat(Stream.of(error), Arrays.stream(errors)).map(Objects::requireNonNull).collect(toUnmodifiableList())); + } +} diff --git a/src/main/java/org/pacien/lemonad/validation/ValidationContainer.java b/src/main/java/org/pacien/lemonad/validation/ValidationContainer.java new file mode 100644 index 0000000..03f77be --- /dev/null +++ b/src/main/java/org/pacien/lemonad/validation/ValidationContainer.java @@ -0,0 +1,40 @@ +/* + * lemonad - Some functional sweetness for Java + * Copyright (C) 2019 Pacien TRAN-GIRARD + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.pacien.lemonad.validation; + +import java.util.List; + +import lombok.NonNull; +import lombok.Value; + +/** + * @author pacien + */ +@Value class ValidationContainer implements Validation { + S subject; + @NonNull List errors; + + @Override public boolean isValid() { + return errors.isEmpty(); + } + + @Override public boolean isInvalid() { + return !isValid(); + } +} diff --git a/src/main/java/org/pacien/lemonad/validation/ValidationResult.java b/src/main/java/org/pacien/lemonad/validation/ValidationResult.java deleted file mode 100644 index 65bb389..0000000 --- a/src/main/java/org/pacien/lemonad/validation/ValidationResult.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * lemonad - Some functional sweetness for Java - * Copyright (C) 2019 Pacien TRAN-GIRARD - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.pacien.lemonad.validation; - -import org.pacien.lemonad.attempt.Attempt; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.stream.Stream; - -import lombok.NonNull; - -import static java.util.stream.Collectors.toUnmodifiableList; -import static org.pacien.lemonad.attempt.Attempt.failure; -import static org.pacien.lemonad.attempt.Attempt.success; - -/** - * Wraps the result of the validation of a subject. - * - * @param the subject type, - * @param the error type. - * @author pacien - */ -public interface ValidationResult { - /** - * @return whether no error have been reported during the validation. - */ - boolean isValid(); - - /** - * @return whether some error have been reported during the validation. - */ - boolean isInvalid(); - - /** - * @return the subject of the validation. - */ - S getSubject(); - - /** - * @return the potentially empty list of reported validation errors. - */ - List getErrors(); - - /** - * @param consumer a subject consumer called if the validation is successful. - * @return the current object. - */ - default ValidationResult ifValid(@NonNull Consumer consumer) { - if (isValid()) consumer.accept(getSubject()); - return this; - } - - /** - * @param consumer the consumer called with the validation subject and reported errors if the validation is failed. - * @return the current object. - */ - default ValidationResult ifInvalid(@NonNull BiConsumer> consumer) { - if (!isValid()) consumer.accept(getSubject(), getErrors()); - return this; - } - - /** - * @return an {@link Attempt} with a state corresponding to the one of the validation. - */ - default Attempt> toAttempt() { - return isValid() ? success(getSubject()) : failure(getErrors()); - } - - /** - * @param mapper a function transforming a {@link ValidationResult}. - * @return the transformed {@link ValidationResult}. - */ - default ValidationResult flatMap(@NonNull Function, ? extends ValidationResult> mapper) { - //noinspection unchecked - return (ValidationResult) mapper.apply(this); - } - - /** - * @param subject an overriding subject. - * @param validationResults a {@link Stream} of {@link ValidationResult}s to merge. - * @return the merged {@link ValidationResult} containing all errors from the supplied ones. - */ - static ValidationResult merge(S subject, @NonNull Stream> validationResults) { - return new ValidationResultContainer<>( - subject, - validationResults.flatMap(res -> res.getErrors().stream()).collect(toUnmodifiableList())); - } - - /** - * @param subject the suject of the validation. - * @return a successful {@link ValidationResult}. - */ - static ValidationResult valid(S subject) { - return new ValidationResultContainer<>(subject, List.of()); - } - - /** - * @param subject the suject of the validation. - * @param error a validation error. - * @param errors additional validation errors. - * @return a failed {@link ValidationResult} for the supplied subject. - */ - @SafeVarargs static ValidationResult invalid(S subject, E error, E... errors) { - return new ValidationResultContainer<>( - subject, - Stream.concat(Stream.of(error), Arrays.stream(errors)).map(Objects::requireNonNull).collect(toUnmodifiableList())); - } -} diff --git a/src/main/java/org/pacien/lemonad/validation/ValidationResultContainer.java b/src/main/java/org/pacien/lemonad/validation/ValidationResultContainer.java deleted file mode 100644 index 2c752f6..0000000 --- a/src/main/java/org/pacien/lemonad/validation/ValidationResultContainer.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * lemonad - Some functional sweetness for Java - * Copyright (C) 2019 Pacien TRAN-GIRARD - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.pacien.lemonad.validation; - -import java.util.List; - -import lombok.NonNull; -import lombok.Value; - -/** - * @author pacien - */ -@Value class ValidationResultContainer implements ValidationResult { - S subject; - @NonNull List errors; - - @Override public boolean isValid() { - return errors.isEmpty(); - } - - @Override public boolean isInvalid() { - return !isValid(); - } -} diff --git a/src/main/java/org/pacien/lemonad/validation/Validator.java b/src/main/java/org/pacien/lemonad/validation/Validator.java index a8a9e3f..e04cde8 100644 --- a/src/main/java/org/pacien/lemonad/validation/Validator.java +++ b/src/main/java/org/pacien/lemonad/validation/Validator.java @@ -28,8 +28,8 @@ import lombok.NonNull; import lombok.val; import static java.util.stream.Collectors.toUnmodifiableList; -import static org.pacien.lemonad.validation.ValidationResult.invalid; -import static org.pacien.lemonad.validation.ValidationResult.valid; +import static org.pacien.lemonad.validation.Validation.invalid; +import static org.pacien.lemonad.validation.Validation.valid; /** * A function which applies validation rules on a subject and reports possible errors. @@ -43,7 +43,7 @@ import static org.pacien.lemonad.validation.ValidationResult.valid; * @param subject the subject to validate, which can potentially be null. * @return the non-null result of the validation of the supplied subject. */ - ValidationResult validate(S subject); + Validation validate(S subject); /** * @param predicate the validation predicate testing the validity of a subject. @@ -60,7 +60,7 @@ import static org.pacien.lemonad.validation.ValidationResult.valid; */ @SafeVarargs static Validator validatingAll(@NonNull Validator... validators) { val validatorList = Arrays.stream(validators).map(Objects::requireNonNull).collect(toUnmodifiableList()); - return subject -> new ValidationResultContainer<>( + return subject -> new ValidationContainer<>( subject, validatorList.stream() .flatMap(validator -> validator.validate(subject).getErrors().stream()) @@ -75,6 +75,6 @@ import static org.pacien.lemonad.validation.ValidationResult.valid; static Validator validatingField(@NonNull Function getter, @NonNull Validator validator) { //noinspection unchecked - return subject -> new ValidationResultContainer<>(subject, (List) validator.validate(getter.apply(subject)).getErrors()); + return subject -> new ValidationContainer<>(subject, (List) validator.validate(getter.apply(subject)).getErrors()); } } diff --git a/src/test/java/org/pacien/lemonad/validation/ValidationResultTest.java b/src/test/java/org/pacien/lemonad/validation/ValidationResultTest.java deleted file mode 100644 index 65b2cb3..0000000 --- a/src/test/java/org/pacien/lemonad/validation/ValidationResultTest.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * lemonad - Some functional sweetness for Java - * Copyright (C) 2019 Pacien TRAN-GIRARD - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.pacien.lemonad.validation; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.stream.Stream; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; - -/** - * @author pacien - */ -class ValidationResultTest { - @Test void testValidResult() { - var subject = "subject"; - var validationResult = ValidationResult.valid(subject); - assertTrue(validationResult.getErrors().isEmpty()); - assertTrue(validationResult.isValid()); - assertFalse(validationResult.isInvalid()); - validationResult.ifValid(innerSubject -> assertEquals(subject, innerSubject)); - validationResult.ifInvalid((__, ___) -> fail()); - } - - @Test void testInvalidResult() { - var subject = "subject"; - var errors = List.of(0, 1); - var validationResult = ValidationResult.invalid(subject, 0, 1); - assertEquals(errors, validationResult.getErrors()); - assertFalse(validationResult.isValid()); - assertTrue(validationResult.isInvalid()); - validationResult.ifValid(Assertions::fail); - validationResult.ifInvalid((innerSubject, innerErrors) -> { - assertEquals(subject, innerSubject); - assertEquals(errors, innerErrors); - }); - } - - @Test void testFlatMap() { - ValidationResult.valid("subject") - .ifInvalid((__, ___) -> fail()) - .flatMap(res -> ValidationResult.invalid(res.getSubject(), 0)) - .ifValid(innerSubject -> fail()); - } - - @Test void testMerge() { - var subject = "subject"; - assertEquals(List.of(0, 1, 2, 3), ValidationResult.merge(subject, Stream.of( - ValidationResult.valid(subject), - ValidationResult.invalid(subject, 0, 1), - ValidationResult.invalid(subject, 2, 3)) - ).getErrors()); - } -} diff --git a/src/test/java/org/pacien/lemonad/validation/ValidationTest.java b/src/test/java/org/pacien/lemonad/validation/ValidationTest.java new file mode 100644 index 0000000..665f501 --- /dev/null +++ b/src/test/java/org/pacien/lemonad/validation/ValidationTest.java @@ -0,0 +1,75 @@ +/* + * lemonad - Some functional sweetness for Java + * Copyright (C) 2019 Pacien TRAN-GIRARD + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.pacien.lemonad.validation; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +/** + * @author pacien + */ +class ValidationTest { + @Test void testValidResult() { + var subject = "subject"; + var validation = Validation.valid(subject); + assertTrue(validation.getErrors().isEmpty()); + assertTrue(validation.isValid()); + assertFalse(validation.isInvalid()); + validation.ifValid(innerSubject -> assertEquals(subject, innerSubject)); + validation.ifInvalid((__, ___) -> fail()); + } + + @Test void testInvalidResult() { + var subject = "subject"; + var errors = List.of(0, 1); + var validation = Validation.invalid(subject, 0, 1); + assertEquals(errors, validation.getErrors()); + assertFalse(validation.isValid()); + assertTrue(validation.isInvalid()); + validation.ifValid(Assertions::fail); + validation.ifInvalid((innerSubject, innerErrors) -> { + assertEquals(subject, innerSubject); + assertEquals(errors, innerErrors); + }); + } + + @Test void testFlatMap() { + Validation.valid("subject") + .ifInvalid((__, ___) -> fail()) + .flatMap(res -> Validation.invalid(res.getSubject(), 0)) + .ifValid(innerSubject -> fail()); + } + + @Test void testMerge() { + var subject = "subject"; + assertEquals(List.of(0, 1, 2, 3), Validation.merge(subject, Stream.of( + Validation.valid(subject), + Validation.invalid(subject, 0, 1), + Validation.invalid(subject, 2, 3)) + ).getErrors()); + } +} -- cgit v1.2.3