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