blob: 9645ccc11b765f42d7aa1774f05d595e61a16de7 [file] [log] [blame]
package android.os;
import android.test.suitebuilder.annotation.SmallTest;
import junit.framework.TestCase;
import org.junit.runner.RunWith;
import org.junit.Test;
import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
@SmallTest
public class PatternMatcherTest extends TestCase{
@Test
public void testAdvancedPatternMatchesAnyToken() {
PatternMatcher matcher = new PatternMatcher(".", PatternMatcher.PATTERN_ADVANCED_GLOB);
assertMatches("a", matcher);
assertMatches("b", matcher);
assertNotMatches("", matcher);
}
@Test
public void testAdvancedPatternMatchesSetToken() {
PatternMatcher matcher = new PatternMatcher("[a]", PatternMatcher.PATTERN_ADVANCED_GLOB);
assertMatches("a", matcher);
assertNotMatches("b", matcher);
matcher = new PatternMatcher("[.*+{}\\]\\\\[]", PatternMatcher.PATTERN_ADVANCED_GLOB);
assertMatches(".", matcher);
assertMatches("*", matcher);
assertMatches("+", matcher);
assertMatches("{", matcher);
assertMatches("}", matcher);
assertMatches("]", matcher);
assertMatches("\\", matcher);
assertMatches("[", matcher);
}
@Test
public void testAdvancedPatternMatchesSetCharacterClassToken() {
PatternMatcher matcher = new PatternMatcher("[a-z]", PatternMatcher.PATTERN_ADVANCED_GLOB);
assertMatches("a", matcher);
assertMatches("b", matcher);
assertNotMatches("A", matcher);
assertNotMatches("1", matcher);
matcher = new PatternMatcher("[a-z][0-9]", PatternMatcher.PATTERN_ADVANCED_GLOB);
assertMatches("a1", matcher);
assertNotMatches("1a", matcher);
assertNotMatches("aa", matcher);
matcher = new PatternMatcher("[z-a]", PatternMatcher.PATTERN_ADVANCED_GLOB);
assertNotMatches("a", matcher);
assertNotMatches("z", matcher);
assertNotMatches("A", matcher);
matcher = new PatternMatcher("[^0-9]", PatternMatcher.PATTERN_ADVANCED_GLOB);
assertMatches("a", matcher);
assertMatches("z", matcher);
assertMatches("A", matcher);
assertNotMatches("9", matcher);
assertNotMatches("5", matcher);
assertNotMatches("0", matcher);
assertPoorlyFormattedPattern("[]a]");
matcher = new PatternMatcher("[\\[a]", PatternMatcher.PATTERN_ADVANCED_GLOB);
assertMatches("a", matcher);
assertMatches("[", matcher);
}
@Test
public void testAdvancedPatternMatchesEscapedCharacters() {
PatternMatcher matcher = new PatternMatcher("\\.", PatternMatcher.PATTERN_ADVANCED_GLOB);
assertMatches(".", matcher);
assertNotMatches("a", matcher);
assertNotMatches("1", matcher);
matcher = new PatternMatcher("a\\+", PatternMatcher.PATTERN_ADVANCED_GLOB);
assertMatches("a+", matcher);
assertNotMatches("a", matcher);
assertNotMatches("aaaaa", matcher);
matcher = new PatternMatcher("[\\a-\\z]", PatternMatcher.PATTERN_ADVANCED_GLOB);
assertMatches("a", matcher);
assertMatches("z", matcher);
assertNotMatches("A", matcher);
}
@Test
public void testAdvancedPatternMatchesLiteralTokens() {
PatternMatcher matcher = new PatternMatcher("a", PatternMatcher.PATTERN_ADVANCED_GLOB);
assertNotMatches("", matcher);
assertMatches("a", matcher);
assertNotMatches("z", matcher);
matcher = new PatternMatcher("az", PatternMatcher.PATTERN_ADVANCED_GLOB);
assertNotMatches("", matcher);
assertMatches("az", matcher);
assertNotMatches("za", matcher);
}
@Test
public void testAdvancedPatternMatchesSetZeroOrMore() {
PatternMatcher matcher = new PatternMatcher("[a-z]*", PatternMatcher.PATTERN_ADVANCED_GLOB);
assertMatches("", matcher);
assertMatches("a", matcher);
assertMatches("abcdefg", matcher);
assertNotMatches("abc1", matcher);
assertNotMatches("1abc", matcher);
}
@Test
public void testAdvancedPatternMatchesSetOneOrMore() {
PatternMatcher matcher = new PatternMatcher("[a-z]+", PatternMatcher.PATTERN_ADVANCED_GLOB);
assertNotMatches("", matcher);
assertMatches("a", matcher);
assertMatches("abcdefg", matcher);
assertNotMatches("abc1", matcher);
assertNotMatches("1abc", matcher);
}
@Test
public void testAdvancedPatternMatchesSingleRange() {
PatternMatcher matcher = new PatternMatcher("[a-z]{1}",
PatternMatcher.PATTERN_ADVANCED_GLOB);
assertNotMatches("", matcher);
assertMatches("a", matcher);
assertMatches("z", matcher);
assertNotMatches("1", matcher);
assertNotMatches("aa", matcher);
}
@Test
public void testAdvancedPatternMatchesFullRange() {
PatternMatcher matcher = new PatternMatcher("[a-z]{1,5}",
PatternMatcher.PATTERN_ADVANCED_GLOB);
assertNotMatches("", matcher);
assertMatches("a", matcher);
assertMatches("zazaz", matcher);
assertNotMatches("azazaz", matcher);
assertNotMatches("11111", matcher);
}
@Test
public void testAdvancedPatternMatchesPartialRange() {
PatternMatcher matcher = new PatternMatcher("[a-z]{3,}",
PatternMatcher.PATTERN_ADVANCED_GLOB);
assertNotMatches("", matcher);
assertMatches("aza", matcher);
assertMatches("zazaz", matcher);
assertMatches("azazazazazaz", matcher);
assertNotMatches("aa", matcher);
}
@Test
public void testAdvancedPatternMatchesComplexPatterns() {
PatternMatcher matcher = new PatternMatcher(
"/[0-9]{4}/[0-9]{2}/[0-9]{2}/[a-zA-Z0-9_]+\\.html",
PatternMatcher.PATTERN_ADVANCED_GLOB);
assertNotMatches("", matcher);
assertMatches("/2016/09/07/got_this_working.html", matcher);
assertMatches("/2016/09/07/got_this_working2.html", matcher);
assertNotMatches("/2016/09/07/got_this_working2dothtml", matcher);
assertNotMatches("/2016/9/7/got_this_working.html", matcher);
matcher = new PatternMatcher(
"/b*a*bar.*",
PatternMatcher.PATTERN_ADVANCED_GLOB);
assertMatches("/babar", matcher);
assertMatches("/babarfff", matcher);
assertMatches("/bbaabarfff", matcher);
assertMatches("/babar?blah", matcher);
assertMatches("/baaaabar?blah", matcher);
assertNotMatches("?bar", matcher);
assertNotMatches("/bar", matcher);
assertNotMatches("/baz", matcher);
assertNotMatches("/ba/bar", matcher);
assertNotMatches("/barf", matcher);
assertNotMatches("/", matcher);
assertNotMatches("?blah", matcher);
}
@Test
public void testAdvancedPatternPoorFormatThrowsIllegalArgumentException() {
assertPoorlyFormattedPattern("[a-z");
assertPoorlyFormattedPattern("a{,4}");
assertPoorlyFormattedPattern("a{0,a}");
assertPoorlyFormattedPattern("a{\\1, 2}");
assertPoorlyFormattedPattern("[]");
assertPoorlyFormattedPattern("a{}");
assertPoorlyFormattedPattern("{3,4}");
assertPoorlyFormattedPattern("a+{3,4}");
assertPoorlyFormattedPattern("*.");
assertPoorlyFormattedPattern(".+*");
assertPoorlyFormattedPattern("a{3,4");
assertPoorlyFormattedPattern("[a");
assertPoorlyFormattedPattern("abc\\");
assertPoorlyFormattedPattern("+.");
StringBuilder charSet = new StringBuilder("[");
for (int i = 0; i < 1024; i++) {
charSet.append('a' + (i % 26));
}
charSet.append("]");
assertPoorlyFormattedPattern(charSet.toString());
}
private void assertMatches(String string, PatternMatcher matcher) {
assertTrue("'" + string + "' should match '" + matcher.toString() + "'",
matcher.match(string));
}
private void assertNotMatches(String string, PatternMatcher matcher) {
assertTrue("'" + string + "' should not match '" + matcher.toString() + "'",
!matcher.match(string));
}
private void assertPoorlyFormattedPattern(String format) {
try {
new PatternMatcher(format, PatternMatcher.PATTERN_ADVANCED_GLOB);
} catch (IllegalArgumentException e) {
return;// expected
}
fail("'" + format + "' was erroneously created");
}
}