package org.smoothbuild.builtin.file.match.testing;
import static org.smoothbuild.builtin.file.match.Constants.SINGLE_STAR;
import static org.smoothbuild.builtin.file.match.testing.HelpTester.endsWithThreeLetters;
import java.util.function.Consumer;
public class NamePatternGenerator {
/**
* Generates all name patterns containing 'size' or less elements and pass it
* to given 'consumer'.
*
* Element is either "*" wildcard or one of the letters {a, b, b}.
*/
public static void generatePatterns(int maxSize, Consumer<String> consumer) {
for (int i = 1; i <= maxSize; i++) {
generatePatternsImpl(i, consumer);
}
}
static void generatePatternsImpl(int size, Consumer<String> consumer) {
generatePatterns("", size, consumer);
}
private static void generatePatterns(String pattern, int size, Consumer<String> consumer) {
if (size == 0) {
consumer.accept(pattern);
} else {
if (!endsWithThreeLetters(pattern)) {
generatePatterns(pattern + "a", size - 1, consumer);
/*
* To reduce number of generated patterns by merging equivalent patterns
* (in terms of NameMatcher). This is done by making sure that each
* generated pattern, the first occurrence of a letter is letter 'a' and
* first occurrence of a letter different than 'a' is letter 'b'. This
* way pattern like "bcb*aa" won't be generated as it is equivalent to
* generated "aba*cc".
*/
if (pattern.contains("a")) {
generatePatterns(pattern + "b", size - 1, consumer);
if (pattern.contains("b")) {
generatePatterns(pattern + "c", size - 1, consumer);
}
}
}
if (!pattern.endsWith(SINGLE_STAR)) {
generatePatterns(pattern + SINGLE_STAR, size - 1, consumer);
}
}
}
}