Home | History | Annotate | Download | only in os
      1 package android.os;
      2 
      3 import android.test.suitebuilder.annotation.SmallTest;
      4 import junit.framework.TestCase;
      5 import org.junit.runner.RunWith;
      6 import org.junit.Test;
      7 import org.junit.runners.JUnit4;
      8 
      9 @RunWith(JUnit4.class)
     10 @SmallTest
     11 public 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