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