1package android.os; 2 3import android.test.suitebuilder.annotation.SmallTest; 4import junit.framework.TestCase; 5import org.junit.runner.RunWith; 6import org.junit.Test; 7import org.junit.runners.JUnit4; 8 9@RunWith(JUnit4.class) 10@SmallTest 11public class PatternMatcherTest extends TestCase{ 12 13 @Test 14 public void testAdvancedPatternMatchesAnyToken() { 15 PatternMatcher matcher = new PatternMatcher(".", PatternMatcher.PATTERN_ADVANCED_GLOB); 16 assertMatches("a", matcher); 17 assertMatches("b", matcher); 18 assertNotMatches("", matcher); 19 } 20 21 @Test 22 public void testAdvancedPatternMatchesSetToken() { 23 PatternMatcher matcher = new PatternMatcher("[a]", PatternMatcher.PATTERN_ADVANCED_GLOB); 24 assertMatches("a", matcher); 25 assertNotMatches("b", matcher); 26 27 matcher = new PatternMatcher("[.*+{}\\]\\\\[]", PatternMatcher.PATTERN_ADVANCED_GLOB); 28 assertMatches(".", matcher); 29 assertMatches("*", matcher); 30 assertMatches("+", matcher); 31 assertMatches("{", matcher); 32 assertMatches("}", matcher); 33 assertMatches("]", matcher); 34 assertMatches("\\", matcher); 35 assertMatches("[", matcher); 36 } 37 38 @Test 39 public void testAdvancedPatternMatchesSetCharacterClassToken() { 40 PatternMatcher matcher = new PatternMatcher("[a-z]", PatternMatcher.PATTERN_ADVANCED_GLOB); 41 assertMatches("a", matcher); 42 assertMatches("b", matcher); 43 assertNotMatches("A", matcher); 44 assertNotMatches("1", matcher); 45 46 matcher = new PatternMatcher("[a-z][0-9]", PatternMatcher.PATTERN_ADVANCED_GLOB); 47 assertMatches("a1", matcher); 48 assertNotMatches("1a", matcher); 49 assertNotMatches("aa", matcher); 50 51 matcher = new PatternMatcher("[z-a]", PatternMatcher.PATTERN_ADVANCED_GLOB); 52 assertNotMatches("a", matcher); 53 assertNotMatches("z", matcher); 54 assertNotMatches("A", matcher); 55 56 matcher = new PatternMatcher("[^0-9]", PatternMatcher.PATTERN_ADVANCED_GLOB); 57 assertMatches("a", matcher); 58 assertMatches("z", matcher); 59 assertMatches("A", matcher); 60 assertNotMatches("9", matcher); 61 assertNotMatches("5", matcher); 62 assertNotMatches("0", matcher); 63 64 assertPoorlyFormattedPattern("[]a]"); 65 matcher = new PatternMatcher("[\\[a]", PatternMatcher.PATTERN_ADVANCED_GLOB); 66 assertMatches("a", matcher); 67 assertMatches("[", matcher); 68 } 69 70 @Test 71 public void testAdvancedPatternMatchesEscapedCharacters() { 72 PatternMatcher matcher = new PatternMatcher("\\.", PatternMatcher.PATTERN_ADVANCED_GLOB); 73 assertMatches(".", matcher); 74 assertNotMatches("a", matcher); 75 assertNotMatches("1", matcher); 76 77 matcher = new PatternMatcher("a\\+", PatternMatcher.PATTERN_ADVANCED_GLOB); 78 assertMatches("a+", matcher); 79 assertNotMatches("a", matcher); 80 assertNotMatches("aaaaa", matcher); 81 82 matcher = new PatternMatcher("[\\a-\\z]", PatternMatcher.PATTERN_ADVANCED_GLOB); 83 assertMatches("a", matcher); 84 assertMatches("z", matcher); 85 assertNotMatches("A", matcher); 86 } 87 88 @Test 89 public void testAdvancedPatternMatchesLiteralTokens() { 90 PatternMatcher matcher = new PatternMatcher("a", PatternMatcher.PATTERN_ADVANCED_GLOB); 91 assertNotMatches("", matcher); 92 assertMatches("a", matcher); 93 assertNotMatches("z", matcher); 94 95 matcher = new PatternMatcher("az", PatternMatcher.PATTERN_ADVANCED_GLOB); 96 assertNotMatches("", matcher); 97 assertMatches("az", matcher); 98 assertNotMatches("za", matcher); 99 } 100 101 @Test 102 public void testAdvancedPatternMatchesSetZeroOrMore() { 103 PatternMatcher matcher = new PatternMatcher("[a-z]*", PatternMatcher.PATTERN_ADVANCED_GLOB); 104 105 assertMatches("", matcher); 106 assertMatches("a", matcher); 107 assertMatches("abcdefg", matcher); 108 assertNotMatches("abc1", matcher); 109 assertNotMatches("1abc", matcher); 110 } 111 112 @Test 113 public void testAdvancedPatternMatchesSetOneOrMore() { 114 PatternMatcher matcher = new PatternMatcher("[a-z]+", PatternMatcher.PATTERN_ADVANCED_GLOB); 115 116 assertNotMatches("", matcher); 117 assertMatches("a", matcher); 118 assertMatches("abcdefg", matcher); 119 assertNotMatches("abc1", matcher); 120 assertNotMatches("1abc", matcher); 121 } 122 123 124 @Test 125 public void testAdvancedPatternMatchesSingleRange() { 126 PatternMatcher matcher = new PatternMatcher("[a-z]{1}", 127 PatternMatcher.PATTERN_ADVANCED_GLOB); 128 129 assertNotMatches("", matcher); 130 assertMatches("a", matcher); 131 assertMatches("z", matcher); 132 assertNotMatches("1", matcher); 133 assertNotMatches("aa", matcher); 134 } 135 136 @Test 137 public void testAdvancedPatternMatchesFullRange() { 138 PatternMatcher matcher = new PatternMatcher("[a-z]{1,5}", 139 PatternMatcher.PATTERN_ADVANCED_GLOB); 140 141 assertNotMatches("", matcher); 142 assertMatches("a", matcher); 143 assertMatches("zazaz", matcher); 144 assertNotMatches("azazaz", matcher); 145 assertNotMatches("11111", matcher); 146 } 147 148 @Test 149 public void testAdvancedPatternMatchesPartialRange() { 150 PatternMatcher matcher = new PatternMatcher("[a-z]{3,}", 151 PatternMatcher.PATTERN_ADVANCED_GLOB); 152 153 assertNotMatches("", matcher); 154 assertMatches("aza", matcher); 155 assertMatches("zazaz", matcher); 156 assertMatches("azazazazazaz", matcher); 157 assertNotMatches("aa", matcher); 158 } 159 160 @Test 161 public void testAdvancedPatternMatchesComplexPatterns() { 162 PatternMatcher matcher = new PatternMatcher( 163 "/[0-9]{4}/[0-9]{2}/[0-9]{2}/[a-zA-Z0-9_]+\\.html", 164 PatternMatcher.PATTERN_ADVANCED_GLOB); 165 166 assertNotMatches("", matcher); 167 assertMatches("/2016/09/07/got_this_working.html", matcher); 168 assertMatches("/2016/09/07/got_this_working2.html", matcher); 169 assertNotMatches("/2016/09/07/got_this_working2dothtml", matcher); 170 assertNotMatches("/2016/9/7/got_this_working.html", matcher); 171 172 matcher = new PatternMatcher( 173 "/b*a*bar.*", 174 PatternMatcher.PATTERN_ADVANCED_GLOB); 175 176 assertMatches("/babar", matcher); 177 assertMatches("/babarfff", matcher); 178 assertMatches("/bbaabarfff", matcher); 179 assertMatches("/babar?blah", matcher); 180 assertMatches("/baaaabar?blah", matcher); 181 assertNotMatches("?bar", matcher); 182 assertNotMatches("/bar", matcher); 183 assertNotMatches("/baz", matcher); 184 assertNotMatches("/ba/bar", matcher); 185 assertNotMatches("/barf", matcher); 186 assertNotMatches("/", matcher); 187 assertNotMatches("?blah", matcher); 188 } 189 190 @Test 191 public void testAdvancedPatternPoorFormatThrowsIllegalArgumentException() { 192 assertPoorlyFormattedPattern("[a-z"); 193 assertPoorlyFormattedPattern("a{,4}"); 194 assertPoorlyFormattedPattern("a{0,a}"); 195 assertPoorlyFormattedPattern("a{\\1, 2}"); 196 assertPoorlyFormattedPattern("[]"); 197 assertPoorlyFormattedPattern("a{}"); 198 assertPoorlyFormattedPattern("{3,4}"); 199 assertPoorlyFormattedPattern("a+{3,4}"); 200 assertPoorlyFormattedPattern("*."); 201 assertPoorlyFormattedPattern(".+*"); 202 assertPoorlyFormattedPattern("a{3,4"); 203 assertPoorlyFormattedPattern("[a"); 204 assertPoorlyFormattedPattern("abc\\"); 205 assertPoorlyFormattedPattern("+."); 206 207 StringBuilder charSet = new StringBuilder("["); 208 for (int i = 0; i < 1024; i++) { 209 charSet.append('a' + (i % 26)); 210 } 211 charSet.append("]"); 212 assertPoorlyFormattedPattern(charSet.toString()); 213 } 214 215 private void assertMatches(String string, PatternMatcher matcher) { 216 assertTrue("'" + string + "' should match '" + matcher.toString() + "'", 217 matcher.match(string)); 218 } 219 220 private void assertNotMatches(String string, PatternMatcher matcher) { 221 assertTrue("'" + string + "' should not match '" + matcher.toString() + "'", 222 !matcher.match(string)); 223 } 224 225 private void assertPoorlyFormattedPattern(String format) { 226 try { 227 new PatternMatcher(format, PatternMatcher.PATTERN_ADVANCED_GLOB); 228 } catch (IllegalArgumentException e) { 229 return;// expected 230 } 231 232 fail("'" + format + "' was erroneously created"); 233 } 234} 235