Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 0 additions & 11 deletions src/com/xpeppers/kata/ContainsAlphabeticChars.java

This file was deleted.

16 changes: 0 additions & 16 deletions src/com/xpeppers/kata/ContainsDigits.java

This file was deleted.

19 changes: 0 additions & 19 deletions src/com/xpeppers/kata/ContainsSpecialChars.java

This file was deleted.

9 changes: 0 additions & 9 deletions src/com/xpeppers/kata/ContainsUpperCaseChars.java

This file was deleted.

14 changes: 0 additions & 14 deletions src/com/xpeppers/kata/LongerThan.java

This file was deleted.

42 changes: 25 additions & 17 deletions src/com/xpeppers/kata/PasswordStrengthChecker.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,36 +6,44 @@
import java.util.List;

public class PasswordStrengthChecker {

private List<Rule> rules;
private static List<Rule> BASIC_RULES = asList(

private static final List<Rule> 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<Rule> ADMIN_RULES = asList(
new LongerThan(10),
new ContainsSpecialChars());
private List<Rule> rules;

public PasswordStrengthChecker(List<Rule> rules) {
this.rules = new ArrayList<Rule>(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<Rule> rules = new ArrayList<Rule>(BASIC_RULES);
private static PasswordStrengthChecker buildPasswordStrengthChecker(boolean isAdmin) {
List<Rule> allRules = new ArrayList<Rule>(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;
});
}

}
7 changes: 0 additions & 7 deletions src/com/xpeppers/kata/Rule.java

This file was deleted.

8 changes: 8 additions & 0 deletions src/com/xpeppers/kata/predicates/IsDigit.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.xpeppers.kata;
package com.xpeppers.kata.predicates;

import java.util.function.IntPredicate;

Expand Down
11 changes: 11 additions & 0 deletions src/com/xpeppers/kata/predicates/IsSpecialChar.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.xpeppers.kata;
package com.xpeppers.kata.predicates;

import java.util.function.IntPredicate;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.xpeppers.kata;
package com.xpeppers.kata.predicates;

import java.util.function.IntPredicate;

Expand Down
16 changes: 16 additions & 0 deletions src/com/xpeppers/kata/rules/ContainsAlphabeticChars.java
Original file line number Diff line number Diff line change
@@ -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";
}
}
15 changes: 15 additions & 0 deletions src/com/xpeppers/kata/rules/ContainsDigits.java
Original file line number Diff line number Diff line change
@@ -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";
}

}
14 changes: 14 additions & 0 deletions src/com/xpeppers/kata/rules/ContainsSpecialChars.java
Original file line number Diff line number Diff line change
@@ -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";
}
}
14 changes: 14 additions & 0 deletions src/com/xpeppers/kata/rules/ContainsUpperCaseChars.java
Original file line number Diff line number Diff line change
@@ -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";
}
}
9 changes: 9 additions & 0 deletions src/com/xpeppers/kata/rules/IRule.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.xpeppers.kata.rules;

public interface IRule {

boolean isSatisfiedOn(String password);

String getFailedReasonMessage();

}
19 changes: 19 additions & 0 deletions src/com/xpeppers/kata/rules/LongerThan.java
Original file line number Diff line number Diff line change
@@ -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";
}
}
6 changes: 5 additions & 1 deletion test/com/xpeppers/kata/ContainsAlphabeticCharsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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("!"));
}
Expand Down
6 changes: 5 additions & 1 deletion test/com/xpeppers/kata/ContainsDigitsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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"));
}

Expand Down
7 changes: 5 additions & 2 deletions test/com/xpeppers/kata/ContainsSpecialCharsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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"));
}

}
6 changes: 5 additions & 1 deletion test/com/xpeppers/kata/LongerThanTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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"));
}

Expand Down
6 changes: 3 additions & 3 deletions test/com/xpeppers/kata/PasswordStrengthCheckerExamples.java
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -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"));
}
Expand Down
Loading