From b6869c1b17c65594f65c3ad5e53461082e5c3088 Mon Sep 17 00:00:00 2001 From: pacien Date: Fri, 29 Mar 2019 01:31:15 +0100 Subject: initial impl --- .../org/pacien/lemonad/attempt/AttemptTest.java | 114 +++++++++++++++++++++ .../lemonad/validation/ValidationResultTest.java | 75 ++++++++++++++ .../pacien/lemonad/validation/ValidatorTest.java | 61 +++++++++++ 3 files changed, 250 insertions(+) create mode 100644 src/test/java/org/pacien/lemonad/attempt/AttemptTest.java create mode 100644 src/test/java/org/pacien/lemonad/validation/ValidationResultTest.java create mode 100644 src/test/java/org/pacien/lemonad/validation/ValidatorTest.java (limited to 'src/test') diff --git a/src/test/java/org/pacien/lemonad/attempt/AttemptTest.java b/src/test/java/org/pacien/lemonad/attempt/AttemptTest.java new file mode 100644 index 0000000..1b165e8 --- /dev/null +++ b/src/test/java/org/pacien/lemonad/attempt/AttemptTest.java @@ -0,0 +1,114 @@ +/* + * 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.attempt; + +import org.junit.jupiter.api.Test; + +import java.util.NoSuchElementException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +/** + * @author pacien + */ +class AttemptTest { + @Test void testSimpleSuccess() { + var result = "result"; + var success = Attempt.success(result); + assertFalse(success.isFailure()); + assertTrue(success.isSuccess()); + assertThrows(NoSuchElementException.class, success::getError); + assertEquals(result, success.getResult()); + success.ifFailure(__ -> fail()); + success.ifSuccess(innerResult -> assertEquals(result, innerResult)); + } + + @Test void testSimpleFailure() { + var fault = 0; + var failure = Attempt.failure(fault); + assertTrue(failure.isFailure()); + assertFalse(failure.isSuccess()); + assertEquals(fault, failure.getError()); + assertThrows(NoSuchElementException.class, failure::getResult); + failure.ifFailure(innerFault -> assertEquals(fault, innerFault)); + failure.ifSuccess(__ -> fail()); + } + + @Test void testNormalAttempt() { + var result = "result"; + var success = Attempt.attempt(() -> result); + assertFalse(success.isFailure()); + assertTrue(success.isSuccess()); + assertThrows(NoSuchElementException.class, success::getError); + assertEquals(result, success.getResult()); + success.ifFailure(__ -> fail()); + success.ifSuccess(innerResult -> assertEquals(result, innerResult)); + } + + @Test void testFailedAttempt() { + var exception = new Exception(); + var failure = Attempt.attempt(() -> { + throw exception; + }); + assertTrue(failure.isFailure()); + assertFalse(failure.isSuccess()); + assertEquals(exception, failure.getError()); + assertThrows(NoSuchElementException.class, failure::getResult); + failure.ifFailure(innerFault -> assertEquals(exception, innerFault)); + failure.ifSuccess(__ -> fail()); + } + + @Test void testTransformationFlow() { + var result0 = 0; + var result1 = "res"; + var result2 = 0L; + var fault0 = 0; + var fault1 = 1; + var fault2 = 2; + + Attempt.success(result0) + .mapFailure(__ -> fail()) + .mapResult(res -> Attempt.success(result1)) + .mapResult(res -> { + assertEquals(result1, res); + return Attempt.failure(fault0); + }) + .ifSuccess(__ -> fail()) + .mapResult(__ -> fail()) + .mapFailure(f -> { + assertEquals(fault0, f); + return Attempt.failure(fault1); + }) + .mapFailure(f -> { + assertEquals(fault1, f); + return Attempt.success(result2); + }) + .ifFailure(__ -> fail()) + .flatMap(attempt -> { + assertEquals(result2, attempt.getResult()); + return Attempt.failure(fault2); + }) + .ifSuccess(__ -> fail()) + .ifFailure(f -> assertEquals(fault2, f)); + } +} diff --git a/src/test/java/org/pacien/lemonad/validation/ValidationResultTest.java b/src/test/java/org/pacien/lemonad/validation/ValidationResultTest.java new file mode 100644 index 0000000..65b2cb3 --- /dev/null +++ b/src/test/java/org/pacien/lemonad/validation/ValidationResultTest.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 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/ValidatorTest.java b/src/test/java/org/pacien/lemonad/validation/ValidatorTest.java new file mode 100644 index 0000000..55927b5 --- /dev/null +++ b/src/test/java/org/pacien/lemonad/validation/ValidatorTest.java @@ -0,0 +1,61 @@ +/* + * 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.Test; + +import java.util.List; + +import static java.util.function.Predicate.not; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * @author pacien + */ +class ValidatorTest { + @Test void testValidatorEnsuringPredicate() { + var emptyError = 0; + var validator = Validator.ensuringPredicate(not(String::isEmpty), emptyError); + assertEquals(List.of(emptyError), validator.validate("").getErrors()); + assertEquals(List.of(), validator.validate("test").getErrors()); + } + + @Test void testValidatorValidatingAll() { + var emptyError = 0; + var tooLongError = 1; + var containsBadLetterError = 2; + + var validator = Validator.validatingAll( + Validator.ensuringPredicate(not(String::isEmpty), emptyError), + Validator.ensuringPredicate((String str) -> str.length() < 10, tooLongError), + Validator.ensuringPredicate((String str) -> !str.contains("e"), containsBadLetterError)); + + assertEquals(List.of(emptyError), validator.validate("").getErrors()); + assertEquals(List.of(tooLongError, containsBadLetterError), validator.validate("test test test").getErrors()); + assertEquals(List.of(), validator.validate("potato").getErrors()); + } + + @Test void testValidatingField() { + var emptyError = 0; + var fieldValidator = Validator.ensuringPredicate((Integer len) -> len > 0, emptyError); + var validator = Validator.validatingField(String::length, fieldValidator); + assertEquals(List.of(emptyError), validator.validate("").getErrors()); + assertEquals(List.of(), validator.validate("test").getErrors()); + } +} -- cgit v1.2.3