diff --git a/src/main/java/net/datafaker/Faker.java b/src/main/java/net/datafaker/Faker.java index fc0eb1b97..124b8a84a 100644 --- a/src/main/java/net/datafaker/Faker.java +++ b/src/main/java/net/datafaker/Faker.java @@ -365,6 +365,20 @@ public String regexify(String regex) { return fakeValuesService.regexify(regex); } + /** + * Generates a String by example. The output string will have the same pattern as the input string. + * + * For example: + * "AAA" becomes "KRA" + * "abc" becomes "uio" + * "948" becomes "345" + * "A19c" becomes "Z20d" + * + * @param example The input string + * @return The output string based on the input pattern + */ + public String examplify(String example) {return fakeValuesService.examplify(example);} + public RandomService random() { return this.randomService; } diff --git a/src/main/java/net/datafaker/service/FakeValuesService.java b/src/main/java/net/datafaker/service/FakeValuesService.java index c7ae3988e..2f9d985a4 100644 --- a/src/main/java/net/datafaker/service/FakeValuesService.java +++ b/src/main/java/net/datafaker/service/FakeValuesService.java @@ -240,6 +240,31 @@ public String regexify(String regex) { return generex.random(); } + /** + * Generates a String by example. The output string will have the same pattern as the input string. + */ + public String examplify(String example) { + StringBuilder sb = new StringBuilder(); + if(example == null) { + return null; + } + + char[] chars = example.toCharArray(); + + for (char character : chars) { + if (Character.isLetter(character)) { + sb.append(letterify("?", Character.isUpperCase(character))); + } else if(Character.isDigit(character)) { + sb.append(randomService.nextInt(10)); + } else { + sb.append(character); + } + } + + return sb.toString(); + + } + /** * Returns a string with the '?' characters in the parameter replaced with random alphabetic * characters. diff --git a/src/test/java/net/datafaker/FakerTest.java b/src/test/java/net/datafaker/FakerTest.java index e1bea4009..0d5837d18 100644 --- a/src/test/java/net/datafaker/FakerTest.java +++ b/src/test/java/net/datafaker/FakerTest.java @@ -16,6 +16,31 @@ public class FakerTest extends AbstractFakerTest { + @Test + public void examplifyUppercaseLetters() { + assertThat(faker.examplify("ABC"), matchesRegularExpression("[A-Z]{3}")); + } + + @Test + public void examplifyLowercaseLetters() { + assertThat(faker.examplify("abc"), matchesRegularExpression("[a-z]{3}")); + } + + @Test + public void examplifyNumbers() { + assertThat(faker.examplify("489321"), matchesRegularExpression("[0-9]{6}")); + } + + @Test + public void examplifyMixed() { + assertThat(faker.examplify("abc123ABC1zzz"), matchesRegularExpression("[a-z]{3}[0-9]{3}[A-Z]{3}[0-9][a-z]{3}")); + } + + @Test + public void examplifyWithSpacesAndSpecialCharacters() { + assertThat(faker.examplify("The number 4!"), matchesRegularExpression("[A-Z][a-z]{2} [a-z]{6} [0-9]!")); + } + @Test public void bothifyShouldGenerateLettersAndNumbers() { assertThat(faker.bothify("????##@gmail.com"), matchesRegularExpression("\\w{4}\\d{2}@gmail.com"));