From 5684c2532baade3e53d2dfef58d73e1d6209a6e7 Mon Sep 17 00:00:00 2001 From: viad1234 Date: Fri, 9 Dec 2022 15:06:20 +0000 Subject: [PATCH] cleaned code up for PasswordStrengthChecker --- .../kata/ContainsAlphabeticChars.java | 11 ----- src/com/xpeppers/kata/ContainsDigits.java | 16 ------- .../xpeppers/kata/ContainsSpecialChars.java | 19 --------- .../xpeppers/kata/ContainsUpperCaseChars.java | 9 ---- src/com/xpeppers/kata/LongerThan.java | 14 ------- .../kata/PasswordStrengthChecker.java | 42 +++++++++++-------- src/com/xpeppers/kata/Rule.java | 7 ---- src/com/xpeppers/kata/predicates/IsDigit.java | 8 ++++ .../kata/{ => predicates}/IsLowerCase.java | 2 +- .../kata/predicates/IsSpecialChar.java | 11 +++++ .../kata/{ => predicates}/IsUpperCase.java | 2 +- .../kata/{ => predicates}/Predicates.java | 2 +- .../kata/rules/ContainsAlphabeticChars.java | 16 +++++++ .../xpeppers/kata/rules/ContainsDigits.java | 15 +++++++ .../kata/rules/ContainsSpecialChars.java | 14 +++++++ .../kata/rules/ContainsUpperCaseChars.java | 14 +++++++ src/com/xpeppers/kata/rules/IRule.java | 9 ++++ src/com/xpeppers/kata/rules/LongerThan.java | 19 +++++++++ .../kata/ContainsAlphabeticCharsTest.java | 6 ++- .../com/xpeppers/kata/ContainsDigitsTest.java | 6 ++- .../kata/ContainsSpecialCharsTest.java | 7 +++- test/com/xpeppers/kata/LongerThanTest.java | 6 ++- .../kata/PasswordStrengthCheckerExamples.java | 6 +-- .../kata/PasswordStrengthCheckerTest.java | 20 ++++----- 24 files changed, 167 insertions(+), 114 deletions(-) delete mode 100644 src/com/xpeppers/kata/ContainsAlphabeticChars.java delete mode 100644 src/com/xpeppers/kata/ContainsDigits.java delete mode 100644 src/com/xpeppers/kata/ContainsSpecialChars.java delete mode 100644 src/com/xpeppers/kata/ContainsUpperCaseChars.java delete mode 100644 src/com/xpeppers/kata/LongerThan.java delete mode 100644 src/com/xpeppers/kata/Rule.java create mode 100644 src/com/xpeppers/kata/predicates/IsDigit.java rename src/com/xpeppers/kata/{ => predicates}/IsLowerCase.java (84%) create mode 100644 src/com/xpeppers/kata/predicates/IsSpecialChar.java rename src/com/xpeppers/kata/{ => predicates}/IsUpperCase.java (84%) rename src/com/xpeppers/kata/{ => predicates}/Predicates.java (85%) create mode 100644 src/com/xpeppers/kata/rules/ContainsAlphabeticChars.java create mode 100644 src/com/xpeppers/kata/rules/ContainsDigits.java create mode 100644 src/com/xpeppers/kata/rules/ContainsSpecialChars.java create mode 100644 src/com/xpeppers/kata/rules/ContainsUpperCaseChars.java create mode 100644 src/com/xpeppers/kata/rules/IRule.java create mode 100644 src/com/xpeppers/kata/rules/LongerThan.java diff --git a/src/com/xpeppers/kata/ContainsAlphabeticChars.java b/src/com/xpeppers/kata/ContainsAlphabeticChars.java deleted file mode 100644 index e9b1316..0000000 --- a/src/com/xpeppers/kata/ContainsAlphabeticChars.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.xpeppers.kata; - -import static com.xpeppers.kata.Predicates.isLowerCase; -import static com.xpeppers.kata.Predicates.isUpperCase; - -final class ContainsAlphabeticChars implements Rule { - @Override - public boolean isSatisfiedOn(String string) { - return string.chars().anyMatch(isUpperCase().or(isLowerCase())); - } -} \ No newline at end of file diff --git a/src/com/xpeppers/kata/ContainsDigits.java b/src/com/xpeppers/kata/ContainsDigits.java deleted file mode 100644 index f9b1098..0000000 --- a/src/com/xpeppers/kata/ContainsDigits.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.xpeppers.kata; -import java.util.function.IntPredicate; - -final class ContainsDigits implements Rule { - @Override - public boolean isSatisfiedOn(String string) { - return string.chars().anyMatch(new IsDigit()); - } - - private final class IsDigit implements IntPredicate { - @Override - public boolean test(int asciiValue) { - return asciiValue >= 48 && asciiValue <= 57; - } - } -} \ No newline at end of file diff --git a/src/com/xpeppers/kata/ContainsSpecialChars.java b/src/com/xpeppers/kata/ContainsSpecialChars.java deleted file mode 100644 index 20d6b66..0000000 --- a/src/com/xpeppers/kata/ContainsSpecialChars.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.xpeppers.kata; -import java.util.function.IntPredicate; - -final class ContainsSpecialChars implements Rule { - @Override - public boolean isSatisfiedOn(String string) { - return string.chars().anyMatch(new IsSpecialChar()); - } - - private final class IsSpecialChar implements IntPredicate { - @Override - public boolean test(int asciiValue) { - return (asciiValue >= 33 && asciiValue <= 47) || - (asciiValue >= 58 && asciiValue <= 64) || - (asciiValue >= 91 && asciiValue <= 96) || - (asciiValue >= 123 && asciiValue <= 126); - } - } -} \ No newline at end of file diff --git a/src/com/xpeppers/kata/ContainsUpperCaseChars.java b/src/com/xpeppers/kata/ContainsUpperCaseChars.java deleted file mode 100644 index dd29319..0000000 --- a/src/com/xpeppers/kata/ContainsUpperCaseChars.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.xpeppers.kata; - -public class ContainsUpperCaseChars implements Rule { - - @Override - public boolean isSatisfiedOn(String string) { - return string.chars().anyMatch(new IsUpperCase()); - } -} diff --git a/src/com/xpeppers/kata/LongerThan.java b/src/com/xpeppers/kata/LongerThan.java deleted file mode 100644 index e9b575f..0000000 --- a/src/com/xpeppers/kata/LongerThan.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.xpeppers.kata; - -final class LongerThan implements Rule { - private int size; - - public LongerThan(int size) { - this.size = size; - } - - @Override - public boolean isSatisfiedOn(String string) { - return string.length() > size; - } -} \ No newline at end of file diff --git a/src/com/xpeppers/kata/PasswordStrengthChecker.java b/src/com/xpeppers/kata/PasswordStrengthChecker.java index 3f9ce43..36d9386 100644 --- a/src/com/xpeppers/kata/PasswordStrengthChecker.java +++ b/src/com/xpeppers/kata/PasswordStrengthChecker.java @@ -6,36 +6,44 @@ import java.util.List; public class PasswordStrengthChecker { - - private List rules; - private static List BASIC_RULES = asList( + + private static final List BASIC_RULES = asList( new ContainsDigits(), new ContainsAlphabeticChars(), new LongerThan(7), new ContainsUpperCaseChars()); - - public static PasswordStrengthChecker basic() { - return build(false); - } - - public static PasswordStrengthChecker forAdmin() { - return build(true); - } + private static final List ADMIN_RULES = asList( + new LongerThan(10), + new ContainsSpecialChars()); + private List rules; public PasswordStrengthChecker(List rules) { this.rules = new ArrayList(rules); } + public static PasswordStrengthChecker createForBasicPassword() { + return buildPasswordStrengthChecker(false); + } - public boolean isAcceptable(String password) { - return rules.stream().allMatch(rule -> rule.isSatisfiedOn(password)); + public static PasswordStrengthChecker createForAdminPassword() { + return buildPasswordStrengthChecker(true); } - private static PasswordStrengthChecker build(boolean isAdmin) { - List rules = new ArrayList(BASIC_RULES); + private static PasswordStrengthChecker buildPasswordStrengthChecker(boolean isAdmin) { + List allRules = new ArrayList(BASIC_RULES); if (isAdmin) { - rules.addAll(asList(new LongerThan(10), new ContainsSpecialChars())); + allRules.addAll(ADMIN_RULES); } - return new PasswordStrengthChecker(rules); + return new PasswordStrengthChecker(allRules); + } + + public boolean accepts(String password) { + return rules.stream().allMatch(rule -> { + if (!rule.isSatisfiedOn(password)) { + System.out.println(rule.getFailedReasonMessage()); + return false; + } + return true; + }); } } diff --git a/src/com/xpeppers/kata/Rule.java b/src/com/xpeppers/kata/Rule.java deleted file mode 100644 index bab5168..0000000 --- a/src/com/xpeppers/kata/Rule.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.xpeppers.kata; - -public interface Rule { - - boolean isSatisfiedOn(String string); - -} diff --git a/src/com/xpeppers/kata/predicates/IsDigit.java b/src/com/xpeppers/kata/predicates/IsDigit.java new file mode 100644 index 0000000..6187aaf --- /dev/null +++ b/src/com/xpeppers/kata/predicates/IsDigit.java @@ -0,0 +1,8 @@ +package com.xpeppers.kata.predicates; + +public class IsDigit implements IntPredicate { + @Override + public boolean test(int asciiValue) { + return asciiValue >= 48 && asciiValue <= 57; + } +} \ No newline at end of file diff --git a/src/com/xpeppers/kata/IsLowerCase.java b/src/com/xpeppers/kata/predicates/IsLowerCase.java similarity index 84% rename from src/com/xpeppers/kata/IsLowerCase.java rename to src/com/xpeppers/kata/predicates/IsLowerCase.java index a3f5cce..82b6ab0 100644 --- a/src/com/xpeppers/kata/IsLowerCase.java +++ b/src/com/xpeppers/kata/predicates/IsLowerCase.java @@ -1,4 +1,4 @@ -package com.xpeppers.kata; +package com.xpeppers.kata.predicates; import java.util.function.IntPredicate; diff --git a/src/com/xpeppers/kata/predicates/IsSpecialChar.java b/src/com/xpeppers/kata/predicates/IsSpecialChar.java new file mode 100644 index 0000000..b4b4e59 --- /dev/null +++ b/src/com/xpeppers/kata/predicates/IsSpecialChar.java @@ -0,0 +1,11 @@ +package src.com.xpeppers.kata.predicates; + +public class IsSpecialChar implements IntPredicate { + @Override + public boolean test(int asciiValue) { + return (asciiValue >= 33 && asciiValue <= 47) || + (asciiValue >= 58 && asciiValue <= 64) || + (asciiValue >= 91 && asciiValue <= 96) || + (asciiValue >= 123 && asciiValue <= 126); + } +} \ No newline at end of file diff --git a/src/com/xpeppers/kata/IsUpperCase.java b/src/com/xpeppers/kata/predicates/IsUpperCase.java similarity index 84% rename from src/com/xpeppers/kata/IsUpperCase.java rename to src/com/xpeppers/kata/predicates/IsUpperCase.java index 19642ea..af27886 100644 --- a/src/com/xpeppers/kata/IsUpperCase.java +++ b/src/com/xpeppers/kata/predicates/IsUpperCase.java @@ -1,4 +1,4 @@ -package com.xpeppers.kata; +package com.xpeppers.kata.predicates; import java.util.function.IntPredicate; diff --git a/src/com/xpeppers/kata/Predicates.java b/src/com/xpeppers/kata/predicates/Predicates.java similarity index 85% rename from src/com/xpeppers/kata/Predicates.java rename to src/com/xpeppers/kata/predicates/Predicates.java index 8632a11..864331d 100644 --- a/src/com/xpeppers/kata/Predicates.java +++ b/src/com/xpeppers/kata/predicates/Predicates.java @@ -1,4 +1,4 @@ -package com.xpeppers.kata; +package com.xpeppers.kata.predicates; import java.util.function.IntPredicate; diff --git a/src/com/xpeppers/kata/rules/ContainsAlphabeticChars.java b/src/com/xpeppers/kata/rules/ContainsAlphabeticChars.java new file mode 100644 index 0000000..f1a5552 --- /dev/null +++ b/src/com/xpeppers/kata/rules/ContainsAlphabeticChars.java @@ -0,0 +1,16 @@ +package com.xpeppers.kata.rules; + +import static com.xpeppers.kata.Predicates.isLowerCase; +import static com.xpeppers.kata.Predicates.isUpperCase; + +public class ContainsAlphabeticCharsRule implements IRule { + @Override + public boolean isSatisfiedOn(String password) { + return password.chars().anyMatch(isUpperCase().or(isLowerCase())); + } + + @Override + public String getFailedReasonMessage() { + return "Your password contains no alphabetic letters"; + } +} \ No newline at end of file diff --git a/src/com/xpeppers/kata/rules/ContainsDigits.java b/src/com/xpeppers/kata/rules/ContainsDigits.java new file mode 100644 index 0000000..4858614 --- /dev/null +++ b/src/com/xpeppers/kata/rules/ContainsDigits.java @@ -0,0 +1,15 @@ +package com.xpeppers.kata.rules; +import java.util.function.IntPredicate; + +final class ContainsDigits implements IRule { + @Override + public boolean isSatisfiedOn(String string) { + return string.chars().anyMatch(new IsDigit()); + } + + @Override + public String getFailedReasonMessage() { + return "Your password contains no numbers"; + } + +} \ No newline at end of file diff --git a/src/com/xpeppers/kata/rules/ContainsSpecialChars.java b/src/com/xpeppers/kata/rules/ContainsSpecialChars.java new file mode 100644 index 0000000..89f21af --- /dev/null +++ b/src/com/xpeppers/kata/rules/ContainsSpecialChars.java @@ -0,0 +1,14 @@ +package com.xpeppers.kata.rules; +import java.util.function.IntPredicate; + +public class ContainsSpecialChars implements IRule { + @Override + public boolean isSatisfiedOn(String password) { + return password.chars().anyMatch(new IsSpecialChar()); + } + + @Override + public String getFailedReasonMessage() { + return "Your password contains no special characters"; + } +} \ No newline at end of file diff --git a/src/com/xpeppers/kata/rules/ContainsUpperCaseChars.java b/src/com/xpeppers/kata/rules/ContainsUpperCaseChars.java new file mode 100644 index 0000000..3762e2a --- /dev/null +++ b/src/com/xpeppers/kata/rules/ContainsUpperCaseChars.java @@ -0,0 +1,14 @@ +package com.xpeppers.kata; + +public class ContainsUpperCaseChars implements IRule { + + @Override + public boolean isSatisfiedOn(String password) { + return password.chars().anyMatch(new IsUpperCase()); + } + + @Override + public String getFailedReasonMessage() { + return "Your password has no uppercase letters"; + } +} diff --git a/src/com/xpeppers/kata/rules/IRule.java b/src/com/xpeppers/kata/rules/IRule.java new file mode 100644 index 0000000..2a21395 --- /dev/null +++ b/src/com/xpeppers/kata/rules/IRule.java @@ -0,0 +1,9 @@ +package com.xpeppers.kata.rules; + +public interface IRule { + + boolean isSatisfiedOn(String password); + + String getFailedReasonMessage(); + +} diff --git a/src/com/xpeppers/kata/rules/LongerThan.java b/src/com/xpeppers/kata/rules/LongerThan.java new file mode 100644 index 0000000..e51ae29 --- /dev/null +++ b/src/com/xpeppers/kata/rules/LongerThan.java @@ -0,0 +1,19 @@ +package com.xpeppers.kata.rules; + +public class LongerThan implements IRule { + private int size; + + public LongerThan(int size) { + this.size = size; + } + + @Override + public boolean isSatisfiedOn(String password) { + return password.length() > size; + } + + @Override + public String getFailedReasonMessage() { + return "Your password is to short"; + } +} \ No newline at end of file diff --git a/test/com/xpeppers/kata/ContainsAlphabeticCharsTest.java b/test/com/xpeppers/kata/ContainsAlphabeticCharsTest.java index 6be0b27..7a3b238 100644 --- a/test/com/xpeppers/kata/ContainsAlphabeticCharsTest.java +++ b/test/com/xpeppers/kata/ContainsAlphabeticCharsTest.java @@ -9,9 +9,13 @@ public class ContainsAlphabeticCharsTest { @Test - public void test() { + public void password_with_alphabetic_chars() { assertTrue(new ContainsAlphabeticChars().isSatisfiedOn("a")); assertTrue(new ContainsAlphabeticChars().isSatisfiedOn("A")); + } + + @Test + public void password_without_alphabetic_chars() { assertFalse(new ContainsAlphabeticChars().isSatisfiedOn("0")); assertFalse(new ContainsAlphabeticChars().isSatisfiedOn("!")); } diff --git a/test/com/xpeppers/kata/ContainsDigitsTest.java b/test/com/xpeppers/kata/ContainsDigitsTest.java index ab83ab0..23b25ea 100644 --- a/test/com/xpeppers/kata/ContainsDigitsTest.java +++ b/test/com/xpeppers/kata/ContainsDigitsTest.java @@ -7,8 +7,12 @@ public class ContainsDigitsTest { @Test - public void test() { + public void password_with_digits() { assertTrue(new ContainsDigits().isSatisfiedOn("1")); + } + + @Test + public void password_without_digits() { assertFalse(new ContainsDigits().isSatisfiedOn("a")); } diff --git a/test/com/xpeppers/kata/ContainsSpecialCharsTest.java b/test/com/xpeppers/kata/ContainsSpecialCharsTest.java index 8d28826..25881f8 100644 --- a/test/com/xpeppers/kata/ContainsSpecialCharsTest.java +++ b/test/com/xpeppers/kata/ContainsSpecialCharsTest.java @@ -7,10 +7,13 @@ public class ContainsSpecialCharsTest { @Test - public void test() { + public void password_with_special_character() { assertTrue(new ContainsSpecialChars().isSatisfiedOn("!")); + } + + @Test + public void password_without_special_character() { assertFalse(new ContainsSpecialChars().isSatisfiedOn("A")); assertFalse(new ContainsSpecialChars().isSatisfiedOn("1")); } - } diff --git a/test/com/xpeppers/kata/LongerThanTest.java b/test/com/xpeppers/kata/LongerThanTest.java index 0a10c7b..79e36b2 100644 --- a/test/com/xpeppers/kata/LongerThanTest.java +++ b/test/com/xpeppers/kata/LongerThanTest.java @@ -9,8 +9,12 @@ public class LongerThanTest { @Test - public void test() { + public void long_enough_password() { assertTrue(new LongerThan(1).isSatisfiedOn("12")); + } + + @Test + public void too_short_password() { assertFalse(new LongerThan(1).isSatisfiedOn("1")); } diff --git a/test/com/xpeppers/kata/PasswordStrengthCheckerExamples.java b/test/com/xpeppers/kata/PasswordStrengthCheckerExamples.java index cd39773..7ef828f 100644 --- a/test/com/xpeppers/kata/PasswordStrengthCheckerExamples.java +++ b/test/com/xpeppers/kata/PasswordStrengthCheckerExamples.java @@ -7,7 +7,7 @@ public class PasswordStrengthCheckerExamples { - private PasswordStrengthChecker checker = PasswordStrengthChecker.basic(); + private PasswordStrengthChecker checker = PasswordStrengthChecker.createForBasicPassword(); @Test public void at_least_one_uppercase_character() { @@ -36,14 +36,14 @@ public void at_least_one_digit() { @Test public void longer_than_10_characters_for_admins() throws Exception { - PasswordStrengthChecker checker = PasswordStrengthChecker.forAdmin(); + PasswordStrengthChecker checker = PasswordStrengthChecker.createForAdminPassword(); assertTrue(checker.isAcceptable("123456789!A")); assertFalse(checker.isAcceptable("1234567A")); } @Test public void at_least_one_special_character_for_admins() throws Exception { - PasswordStrengthChecker checker = PasswordStrengthChecker.forAdmin(); + PasswordStrengthChecker checker = PasswordStrengthChecker.createForAdminPassword(); assertTrue(checker.isAcceptable("123456789A!")); assertFalse(checker.isAcceptable("1234567890A")); } diff --git a/test/com/xpeppers/kata/PasswordStrengthCheckerTest.java b/test/com/xpeppers/kata/PasswordStrengthCheckerTest.java index d2fdd93..5ee6ebb 100644 --- a/test/com/xpeppers/kata/PasswordStrengthCheckerTest.java +++ b/test/com/xpeppers/kata/PasswordStrengthCheckerTest.java @@ -10,21 +10,21 @@ public class PasswordStrengthCheckerTest { @Test - public void with_no_rules_every_password_will_be_fine() { + public void with_no_rules_password_passes() { PasswordStrengthChecker checker = new PasswordStrengthChecker(new ArrayList()); - assertTrue(checker.isAcceptable("everything_will_be_just_fine")); + assertTrue(checker.accepts("everything_will_be_just_fine")); } @Test - public void with_always_failing_rule_every_password_will_be_rejected() { - PasswordStrengthChecker checker = new PasswordStrengthChecker(asList(string -> false)); - assertFalse(checker.isAcceptable("everything_will_be_rejected")); + public void with_always_failing_rule_password_will_be_rejected() { + PasswordStrengthChecker checker = new PasswordStrengthChecker(asList(password -> false)); + assertFalse(checker.accepts("everything_will_be_rejected")); } @Test - public void with_always_failing_rule_every_password_will_be_fine() { - PasswordStrengthChecker checker = new PasswordStrengthChecker(asList(string -> true)); - assertTrue(checker.isAcceptable("everything_will_be_fine")); + public void with_always_succeeding_rule_password_will_pass() { + PasswordStrengthChecker checker = new PasswordStrengthChecker(asList(password -> true)); + assertTrue(checker.accepts("everything_will_be_fine")); } @Test @@ -32,7 +32,7 @@ public void rule_is_evaluated() throws Exception { SpyRule rule = new SpyRule(); PasswordStrengthChecker checker = new PasswordStrengthChecker(asList(rule)); assertFalse(rule.hasBeenCalled); - checker.isAcceptable("anything"); + checker.accepts("anything"); assertTrue(rule.hasBeenCalled); } @@ -40,7 +40,7 @@ private final class SpyRule implements Rule { public boolean hasBeenCalled = false; @Override - public boolean isSatisfiedOn(String string) { + public boolean isSatisfiedOn(String password) { this.hasBeenCalled = true; return true; }