diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessor.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/lambda/expression/TextProcessor.java similarity index 88% rename from DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessor.java rename to DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/lambda/expression/TextProcessor.java index 6ff6301..6a2708c 100644 --- a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessor.java +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/lambda/expression/TextProcessor.java @@ -1,4 +1,4 @@ -package pl.mperor.lab.java.design.pattern.structural.decorator; +package pl.mperor.lab.java.design.pattern.structural.decorator.lambda.expression; import java.util.Arrays; import java.util.function.UnaryOperator; diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/lambda/expression/TextValidator.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/lambda/expression/TextValidator.java new file mode 100644 index 0000000..b3add91 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/lambda/expression/TextValidator.java @@ -0,0 +1,34 @@ +package pl.mperor.lab.java.design.pattern.structural.decorator.lambda.expression; + +import java.util.function.Predicate; + +public class TextValidator { + + private TextValidator() { + } + + public static Predicate notEmpty() { + return Predicate.not(String::isEmpty); + } + + public static Predicate lengthBetween(int min, int max) { + return minLength(min).and(maxLength(max)); + } + + public static Predicate minLength(int min) { + return text -> text.length() >= min; + } + + public static Predicate maxLength(int max) { + return text -> text.length() >= max; + } + + public static Predicate numeric() { + return text -> text.matches("\\d+"); + } + + public static Predicate nan() { + return numeric().negate(); + } + +} diff --git a/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessorTest.java b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/decorator/lambda/expression/TextProcessorAndValidatorTest.java similarity index 54% rename from DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessorTest.java rename to DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/decorator/lambda/expression/TextProcessorAndValidatorTest.java index dcd864e..03f4438 100644 --- a/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessorTest.java +++ b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/decorator/lambda/expression/TextProcessorAndValidatorTest.java @@ -1,9 +1,9 @@ -package pl.mperor.lab.java.design.pattern.structural.decorator; +package pl.mperor.lab.java.design.pattern.structural.decorator.lambda.expression; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -public class TextProcessorTest { +public class TextProcessorAndValidatorTest { @Test public void shouldAllowToCreateTextProcessorAsChainOfFunctions() { @@ -23,4 +23,17 @@ public void shouldAllowToCreateTextProcessorAsChainOfFunctions() { ); } + @Test + public void shouldAllowToCreateTextValidator() { + Assertions.assertTrue( + TextValidator.notEmpty() + .and(TextValidator.nan()) + .and(TextValidator.lengthBetween(1, 3)) + .test("abc") + ); + + var blankOrNumeric = TextValidator.numeric().or(String::isBlank); + Assertions.assertTrue(blankOrNumeric.test(" ") && blankOrNumeric.test("123")); + } + }