1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.io;
18  
19  import java.io.File;
20  
21  import junit.framework.TestCase;
22  
23  public class FilenameUtilsWildcardTestCase extends TestCase {
24  
25      private static final boolean WINDOWS = (File.separatorChar == '\\');
26  
27      public FilenameUtilsWildcardTestCase(String name) {
28          super(name);
29      }
30  
31      //-----------------------------------------------------------------------
32      // Testing:
33      //   FilenameUtils.wildcardMatch(String,String)
34  
35      public void testMatch() {
36          assertEquals(false, FilenameUtils.wildcardMatch(null, "Foo"));
37          assertEquals(false, FilenameUtils.wildcardMatch("Foo", null));
38          assertEquals(true, FilenameUtils.wildcardMatch(null, null));
39          assertEquals(true, FilenameUtils.wildcardMatch("Foo", "Foo"));
40          assertEquals(true, FilenameUtils.wildcardMatch("", ""));
41          assertEquals(true, FilenameUtils.wildcardMatch("Foo", "Fo*"));
42          assertEquals(true, FilenameUtils.wildcardMatch("Foo", "Fo?"));
43          assertEquals(true, FilenameUtils.wildcardMatch("Foo Bar and Catflap", "Fo*"));
44          assertEquals(true, FilenameUtils.wildcardMatch("New Bookmarks", "N?w ?o?k??r?s"));
45          assertEquals(false, FilenameUtils.wildcardMatch("Foo", "Bar"));
46          assertEquals(true, FilenameUtils.wildcardMatch("Foo Bar Foo", "F*o Bar*"));
47          assertEquals(true, FilenameUtils.wildcardMatch("Adobe Acrobat Installer", "Ad*er"));
48          assertEquals(true, FilenameUtils.wildcardMatch("Foo", "*Foo"));
49          assertEquals(true, FilenameUtils.wildcardMatch("BarFoo", "*Foo"));
50          assertEquals(true, FilenameUtils.wildcardMatch("Foo", "Foo*"));
51          assertEquals(true, FilenameUtils.wildcardMatch("FooBar", "Foo*"));
52          assertEquals(false, FilenameUtils.wildcardMatch("FOO", "*Foo"));
53          assertEquals(false, FilenameUtils.wildcardMatch("BARFOO", "*Foo"));
54          assertEquals(false, FilenameUtils.wildcardMatch("FOO", "Foo*"));
55          assertEquals(false, FilenameUtils.wildcardMatch("FOOBAR", "Foo*"));
56      }
57  
58      public void testMatchOnSystem() {
59          assertEquals(false, FilenameUtils.wildcardMatchOnSystem(null, "Foo"));
60          assertEquals(false, FilenameUtils.wildcardMatchOnSystem("Foo", null));
61          assertEquals(true, FilenameUtils.wildcardMatchOnSystem(null, null));
62          assertEquals(true, FilenameUtils.wildcardMatchOnSystem("Foo", "Foo"));
63          assertEquals(true, FilenameUtils.wildcardMatchOnSystem("", ""));
64          assertEquals(true, FilenameUtils.wildcardMatchOnSystem("Foo", "Fo*"));
65          assertEquals(true, FilenameUtils.wildcardMatchOnSystem("Foo", "Fo?"));
66          assertEquals(true, FilenameUtils.wildcardMatchOnSystem("Foo Bar and Catflap", "Fo*"));
67          assertEquals(true, FilenameUtils.wildcardMatchOnSystem("New Bookmarks", "N?w ?o?k??r?s"));
68          assertEquals(false, FilenameUtils.wildcardMatchOnSystem("Foo", "Bar"));
69          assertEquals(true, FilenameUtils.wildcardMatchOnSystem("Foo Bar Foo", "F*o Bar*"));
70          assertEquals(true, FilenameUtils.wildcardMatchOnSystem("Adobe Acrobat Installer", "Ad*er"));
71          assertEquals(true, FilenameUtils.wildcardMatchOnSystem("Foo", "*Foo"));
72          assertEquals(true, FilenameUtils.wildcardMatchOnSystem("BarFoo", "*Foo"));
73          assertEquals(true, FilenameUtils.wildcardMatchOnSystem("Foo", "Foo*"));
74          assertEquals(true, FilenameUtils.wildcardMatchOnSystem("FooBar", "Foo*"));
75          assertEquals(WINDOWS, FilenameUtils.wildcardMatchOnSystem("FOO", "*Foo"));
76          assertEquals(WINDOWS, FilenameUtils.wildcardMatchOnSystem("BARFOO", "*Foo"));
77          assertEquals(WINDOWS, FilenameUtils.wildcardMatchOnSystem("FOO", "Foo*"));
78          assertEquals(WINDOWS, FilenameUtils.wildcardMatchOnSystem("FOOBAR", "Foo*"));
79      }
80  
81      public void testMatchCaseSpecified() {
82          assertEquals(false, FilenameUtils.wildcardMatch(null, "Foo", IOCase.SENSITIVE));
83          assertEquals(false, FilenameUtils.wildcardMatch("Foo", null, IOCase.SENSITIVE));
84          assertEquals(true, FilenameUtils.wildcardMatch(null, null, IOCase.SENSITIVE));
85          assertEquals(true, FilenameUtils.wildcardMatch("Foo", "Foo", IOCase.SENSITIVE));
86          assertEquals(true, FilenameUtils.wildcardMatch("", "", IOCase.SENSITIVE));
87          assertEquals(true, FilenameUtils.wildcardMatch("Foo", "Fo*", IOCase.SENSITIVE));
88          assertEquals(true, FilenameUtils.wildcardMatch("Foo", "Fo?", IOCase.SENSITIVE));
89          assertEquals(true, FilenameUtils.wildcardMatch("Foo Bar and Catflap", "Fo*", IOCase.SENSITIVE));
90          assertEquals(true, FilenameUtils.wildcardMatch("New Bookmarks", "N?w ?o?k??r?s", IOCase.SENSITIVE));
91          assertEquals(false, FilenameUtils.wildcardMatch("Foo", "Bar", IOCase.SENSITIVE));
92          assertEquals(true, FilenameUtils.wildcardMatch("Foo Bar Foo", "F*o Bar*", IOCase.SENSITIVE));
93          assertEquals(true, FilenameUtils.wildcardMatch("Adobe Acrobat Installer", "Ad*er", IOCase.SENSITIVE));
94          assertEquals(true, FilenameUtils.wildcardMatch("Foo", "*Foo", IOCase.SENSITIVE));
95          assertEquals(true, FilenameUtils.wildcardMatch("Foo", "Foo*", IOCase.SENSITIVE));
96          assertEquals(true, FilenameUtils.wildcardMatch("Foo", "*Foo", IOCase.SENSITIVE));
97          assertEquals(true, FilenameUtils.wildcardMatch("BarFoo", "*Foo", IOCase.SENSITIVE));
98          assertEquals(true, FilenameUtils.wildcardMatch("Foo", "Foo*", IOCase.SENSITIVE));
99          assertEquals(true, FilenameUtils.wildcardMatch("FooBar", "Foo*", IOCase.SENSITIVE));
100         
101         assertEquals(false, FilenameUtils.wildcardMatch("FOO", "*Foo", IOCase.SENSITIVE));
102         assertEquals(false, FilenameUtils.wildcardMatch("BARFOO", "*Foo", IOCase.SENSITIVE));
103         assertEquals(false, FilenameUtils.wildcardMatch("FOO", "Foo*", IOCase.SENSITIVE));
104         assertEquals(false, FilenameUtils.wildcardMatch("FOOBAR", "Foo*", IOCase.SENSITIVE));
105         assertEquals(true, FilenameUtils.wildcardMatch("FOO", "*Foo", IOCase.INSENSITIVE));
106         assertEquals(true, FilenameUtils.wildcardMatch("BARFOO", "*Foo", IOCase.INSENSITIVE));
107         assertEquals(true, FilenameUtils.wildcardMatch("FOO", "Foo*", IOCase.INSENSITIVE));
108         assertEquals(true, FilenameUtils.wildcardMatch("FOOBAR", "Foo*", IOCase.INSENSITIVE));
109         assertEquals(WINDOWS, FilenameUtils.wildcardMatch("FOO", "*Foo", IOCase.SYSTEM));
110         assertEquals(WINDOWS, FilenameUtils.wildcardMatch("BARFOO", "*Foo", IOCase.SYSTEM));
111         assertEquals(WINDOWS, FilenameUtils.wildcardMatch("FOO", "Foo*", IOCase.SYSTEM));
112         assertEquals(WINDOWS, FilenameUtils.wildcardMatch("FOOBAR", "Foo*", IOCase.SYSTEM));
113     }
114 
115     public void testSplitOnTokens() {
116         assertArrayEquals( new String[] { "Ad", "*", "er" }, FilenameUtils.splitOnTokens("Ad*er") );
117         assertArrayEquals( new String[] { "Ad", "?", "er" }, FilenameUtils.splitOnTokens("Ad?er") );
118         assertArrayEquals( new String[] { "Test", "*", "?", "One" }, FilenameUtils.splitOnTokens("Test*?One") );
119         assertArrayEquals( new String[] { "*" }, FilenameUtils.splitOnTokens("****") );
120         assertArrayEquals( new String[] { "*", "?", "?", "*" }, FilenameUtils.splitOnTokens("*??*") );
121         assertArrayEquals( new String[] { "*", "?", "?", "*" }, FilenameUtils.splitOnTokens("*??*") );
122         assertArrayEquals( new String[] { "h", "?", "?", "*" }, FilenameUtils.splitOnTokens("h??*") );
123         assertArrayEquals( new String[] { "" }, FilenameUtils.splitOnTokens("") );
124     }
125 
126     private void assertArrayEquals(Object[] a1, Object[] a2) {
127         assertEquals(a1.length, a2.length);
128         for(int i=0; i<a1.length; i++) {
129             assertEquals(a1[i], a2[i]);
130         }
131     }
132 
133     private void assertMatch(String text, String wildcard, boolean expected) {
134         assertEquals(text + " " + wildcard, expected, FilenameUtils.wildcardMatch(text, wildcard));
135     }
136 
137     // A separate set of tests, added to this batch
138     public void testMatch2() {
139         assertMatch("log.txt", "log.txt", true);
140         assertMatch("log.txt1", "log.txt", false);
141 
142         assertMatch("log.txt", "log.txt*", true);
143         assertMatch("log.txt", "log.txt*1", false);
144         assertMatch("log.txt", "*log.txt*", true);
145 
146         assertMatch("log.txt", "*.txt", true);
147         assertMatch("txt.log", "*.txt", false);
148         assertMatch("config.ini", "*.ini", true);
149 
150         assertMatch("config.txt.bak", "con*.txt", false);
151 
152         assertMatch("log.txt9", "*.txt?", true);
153         assertMatch("log.txt", "*.txt?", false);
154 
155         assertMatch("progtestcase.java~5~", "*test*.java~*~", true);
156         assertMatch("progtestcase.java;5~", "*test*.java~*~", false);
157         assertMatch("progtestcase.java~5", "*test*.java~*~", false);
158 
159         assertMatch("log.txt", "log.*", true);
160 
161         assertMatch("log.txt", "log?*", true);
162 
163         assertMatch("log.txt12", "log.txt??", true);
164         
165         assertMatch("log.log", "log**log", true);
166         assertMatch("log.log", "log**", true);
167         assertMatch("log.log", "log.**", true);
168         assertMatch("log.log", "**.log", true);
169         assertMatch("log.log", "**log", true);
170 
171         assertMatch("log.log", "log*log", true);
172         assertMatch("log.log", "log*", true);
173         assertMatch("log.log", "log.*", true);
174         assertMatch("log.log", "*.log", true);
175         assertMatch("log.log", "*log", true);
176         
177         assertMatch("log.log", "*log?", false);
178         assertMatch("log.log", "*log?*", true);
179         assertMatch("log.log.abc", "*log?abc", true);
180         assertMatch("log.log.abc.log.abc", "*log?abc", true);
181         assertMatch("log.log.abc.log.abc.d", "*log?abc?d", true);
182     }
183 
184 }