• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 static org.junit.jupiter.api.Assertions.assertArrayEquals;
20 import static org.junit.jupiter.api.Assertions.assertEquals;
21 import static org.junit.jupiter.api.Assertions.assertFalse;
22 import static org.junit.jupiter.api.Assertions.assertTrue;
23 
24 import java.io.File;
25 import java.util.Locale;
26 
27 import org.junit.jupiter.api.Test;
28 
29 /**
30  * Tests {@link FilenameUtils} {@code wildcardMatch()} methods.
31  */
32 public class FilenameUtilsWildcardTest {
33 
34     private static final boolean WINDOWS = File.separatorChar == '\\';
35 
36     // Testing:
37     //   FilenameUtils.wildcardMatch(String,String)
38 
assertMatch(final String text, final String wildcard, final boolean expected)39     private void assertMatch(final String text, final String wildcard, final boolean expected) {
40         assertEquals(expected, FilenameUtils.wildcardMatch(text, wildcard), text + " " + wildcard);
41     }
42 
43     /**
44      * See https://issues.apache.org/jira/browse/IO-246
45      */
46     @Test
test_IO_246()47     public void test_IO_246() {
48 
49         // Tests for "*?"
50         assertMatch("aaa", "aa*?", true);
51         // these ought to work as well, but "*?" does not work properly at present
52 //      assertMatch("aaa", "a*?", true);
53 //      assertMatch("aaa", "*?", true);
54 
55         // Tests for "?*"
56         assertMatch("",    "?*",   false);
57         assertMatch("a",   "a?*",  false);
58         assertMatch("aa",  "aa?*", false);
59         assertMatch("a",   "?*",   true);
60         assertMatch("aa",  "?*",   true);
61         assertMatch("aaa", "?*",   true);
62 
63         // Test ending on "?"
64         assertMatch("",    "?", false);
65         assertMatch("a",   "a?", false);
66         assertMatch("aa",  "aa?", false);
67         assertMatch("aab", "aa?", true);
68         assertMatch("aaa", "*a", true);
69     }
70 
71     @Test
testLocaleIndependence()72     public void testLocaleIndependence() {
73         final Locale orig = Locale.getDefault();
74 
75         final Locale[] locales = Locale.getAvailableLocales();
76 
77         final String[][] data = {
78             { "I", "i"},
79             { "i", "I"},
80             { "i", "\u0130"},
81             { "i", "\u0131"},
82             { "\u03A3", "\u03C2"},
83             { "\u03A3", "\u03C3"},
84             { "\u03C2", "\u03C3"},
85         };
86 
87         try {
88             for (int i = 0; i < data.length; i++) {
89                 for (final Locale locale : locales) {
90                     Locale.setDefault(locale);
91                     assertTrue(data[i][0].equalsIgnoreCase(data[i][1]), "Test data corrupt: " + i);
92                     final boolean match = FilenameUtils.wildcardMatch(data[i][0], data[i][1], IOCase.INSENSITIVE);
93                     assertTrue(match, Locale.getDefault().toString() + ": " + i);
94                 }
95             }
96         } finally {
97             Locale.setDefault(orig);
98         }
99     }
100 
101     @Test
testMatch()102     public void testMatch() {
103         assertFalse(FilenameUtils.wildcardMatch(null, "Foo"));
104         assertFalse(FilenameUtils.wildcardMatch("Foo", null));
105         assertTrue(FilenameUtils.wildcardMatch(null, null));
106         assertTrue(FilenameUtils.wildcardMatch("Foo", "Foo"));
107         assertTrue(FilenameUtils.wildcardMatch("", ""));
108         assertTrue(FilenameUtils.wildcardMatch("", "*"));
109         assertFalse(FilenameUtils.wildcardMatch("", "?"));
110         assertTrue(FilenameUtils.wildcardMatch("Foo", "Fo*"));
111         assertTrue(FilenameUtils.wildcardMatch("Foo", "Fo?"));
112         assertTrue(FilenameUtils.wildcardMatch("Foo Bar and Catflap", "Fo*"));
113         assertTrue(FilenameUtils.wildcardMatch("New Bookmarks", "N?w ?o?k??r?s"));
114         assertFalse(FilenameUtils.wildcardMatch("Foo", "Bar"));
115         assertTrue(FilenameUtils.wildcardMatch("Foo Bar Foo", "F*o Bar*"));
116         assertTrue(FilenameUtils.wildcardMatch("Adobe Acrobat Installer", "Ad*er"));
117         assertTrue(FilenameUtils.wildcardMatch("Foo", "*Foo"));
118         assertTrue(FilenameUtils.wildcardMatch("BarFoo", "*Foo"));
119         assertTrue(FilenameUtils.wildcardMatch("Foo", "Foo*"));
120         assertTrue(FilenameUtils.wildcardMatch("FooBar", "Foo*"));
121         assertFalse(FilenameUtils.wildcardMatch("FOO", "*Foo"));
122         assertFalse(FilenameUtils.wildcardMatch("BARFOO", "*Foo"));
123         assertFalse(FilenameUtils.wildcardMatch("FOO", "Foo*"));
124         assertFalse(FilenameUtils.wildcardMatch("FOOBAR", "Foo*"));
125     }
126 
127     // A separate set of tests, added to this batch
128     @Test
testMatch2()129     public void testMatch2() {
130         assertMatch("log.txt", "log.txt", true);
131         assertMatch("log.txt1", "log.txt", false);
132 
133         assertMatch("log.txt", "log.txt*", true);
134         assertMatch("log.txt", "log.txt*1", false);
135         assertMatch("log.txt", "*log.txt*", true);
136 
137         assertMatch("log.txt", "*.txt", true);
138         assertMatch("txt.log", "*.txt", false);
139         assertMatch("config.ini", "*.ini", true);
140 
141         assertMatch("config.txt.bak", "con*.txt", false);
142 
143         assertMatch("log.txt9", "*.txt?", true);
144         assertMatch("log.txt", "*.txt?", false);
145 
146         assertMatch("progtestcase.java~5~", "*test*.java~*~", true);
147         assertMatch("progtestcase.java;5~", "*test*.java~*~", false);
148         assertMatch("progtestcase.java~5", "*test*.java~*~", false);
149 
150         assertMatch("log.txt", "log.*", true);
151 
152         assertMatch("log.txt", "log?*", true);
153 
154         assertMatch("log.txt12", "log.txt??", true);
155 
156         assertMatch("log.log", "log**log", true);
157         assertMatch("log.log", "log**", true);
158         assertMatch("log.log", "log.**", true);
159         assertMatch("log.log", "**.log", true);
160         assertMatch("log.log", "**log", true);
161 
162         assertMatch("log.log", "log*log", true);
163         assertMatch("log.log", "log*", true);
164         assertMatch("log.log", "log.*", true);
165         assertMatch("log.log", "*.log", true);
166         assertMatch("log.log", "*log", true);
167 
168         assertMatch("log.log", "*log?", false);
169         assertMatch("log.log", "*log?*", true);
170         assertMatch("log.log.abc", "*log?abc", true);
171         assertMatch("log.log.abc.log.abc", "*log?abc", true);
172         assertMatch("log.log.abc.log.abc.d", "*log?abc?d", true);
173     }
174 
175     @Test
testMatchCaseSpecified()176     public void testMatchCaseSpecified() {
177         assertFalse(FilenameUtils.wildcardMatch(null, "Foo", IOCase.SENSITIVE));
178         assertFalse(FilenameUtils.wildcardMatch("Foo", null, IOCase.SENSITIVE));
179         assertTrue(FilenameUtils.wildcardMatch(null, null, IOCase.SENSITIVE));
180         assertTrue(FilenameUtils.wildcardMatch("Foo", "Foo", IOCase.SENSITIVE));
181         assertTrue(FilenameUtils.wildcardMatch("", "", IOCase.SENSITIVE));
182         assertTrue(FilenameUtils.wildcardMatch("Foo", "Fo*", IOCase.SENSITIVE));
183         assertTrue(FilenameUtils.wildcardMatch("Foo", "Fo?", IOCase.SENSITIVE));
184         assertTrue(FilenameUtils.wildcardMatch("Foo Bar and Catflap", "Fo*", IOCase.SENSITIVE));
185         assertTrue(FilenameUtils.wildcardMatch("New Bookmarks", "N?w ?o?k??r?s", IOCase.SENSITIVE));
186         assertFalse(FilenameUtils.wildcardMatch("Foo", "Bar", IOCase.SENSITIVE));
187         assertTrue(FilenameUtils.wildcardMatch("Foo Bar Foo", "F*o Bar*", IOCase.SENSITIVE));
188         assertTrue(FilenameUtils.wildcardMatch("Adobe Acrobat Installer", "Ad*er", IOCase.SENSITIVE));
189         assertTrue(FilenameUtils.wildcardMatch("Foo", "*Foo", IOCase.SENSITIVE));
190         assertTrue(FilenameUtils.wildcardMatch("Foo", "Foo*", IOCase.SENSITIVE));
191         assertTrue(FilenameUtils.wildcardMatch("Foo", "*Foo", IOCase.SENSITIVE));
192         assertTrue(FilenameUtils.wildcardMatch("BarFoo", "*Foo", IOCase.SENSITIVE));
193         assertTrue(FilenameUtils.wildcardMatch("Foo", "Foo*", IOCase.SENSITIVE));
194         assertTrue(FilenameUtils.wildcardMatch("FooBar", "Foo*", IOCase.SENSITIVE));
195 
196         assertFalse(FilenameUtils.wildcardMatch("FOO", "*Foo", IOCase.SENSITIVE));
197         assertFalse(FilenameUtils.wildcardMatch("BARFOO", "*Foo", IOCase.SENSITIVE));
198         assertFalse(FilenameUtils.wildcardMatch("FOO", "Foo*", IOCase.SENSITIVE));
199         assertFalse(FilenameUtils.wildcardMatch("FOOBAR", "Foo*", IOCase.SENSITIVE));
200         assertTrue(FilenameUtils.wildcardMatch("FOO", "*Foo", IOCase.INSENSITIVE));
201         assertTrue(FilenameUtils.wildcardMatch("BARFOO", "*Foo", IOCase.INSENSITIVE));
202         assertTrue(FilenameUtils.wildcardMatch("FOO", "Foo*", IOCase.INSENSITIVE));
203         assertTrue(FilenameUtils.wildcardMatch("FOOBAR", "Foo*", IOCase.INSENSITIVE));
204         assertEquals(WINDOWS, FilenameUtils.wildcardMatch("FOO", "*Foo", IOCase.SYSTEM));
205         assertEquals(WINDOWS, FilenameUtils.wildcardMatch("BARFOO", "*Foo", IOCase.SYSTEM));
206         assertEquals(WINDOWS, FilenameUtils.wildcardMatch("FOO", "Foo*", IOCase.SYSTEM));
207         assertEquals(WINDOWS, FilenameUtils.wildcardMatch("FOOBAR", "Foo*", IOCase.SYSTEM));
208     }
209 
210     @Test
testMatchOnSystem()211     public void testMatchOnSystem() {
212         assertFalse(FilenameUtils.wildcardMatchOnSystem(null, "Foo"));
213         assertFalse(FilenameUtils.wildcardMatchOnSystem("Foo", null));
214         assertTrue(FilenameUtils.wildcardMatchOnSystem(null, null));
215         assertTrue(FilenameUtils.wildcardMatchOnSystem("Foo", "Foo"));
216         assertTrue(FilenameUtils.wildcardMatchOnSystem("", ""));
217         assertTrue(FilenameUtils.wildcardMatchOnSystem("Foo", "Fo*"));
218         assertTrue(FilenameUtils.wildcardMatchOnSystem("Foo", "Fo?"));
219         assertTrue(FilenameUtils.wildcardMatchOnSystem("Foo Bar and Catflap", "Fo*"));
220         assertTrue(FilenameUtils.wildcardMatchOnSystem("New Bookmarks", "N?w ?o?k??r?s"));
221         assertFalse(FilenameUtils.wildcardMatchOnSystem("Foo", "Bar"));
222         assertTrue(FilenameUtils.wildcardMatchOnSystem("Foo Bar Foo", "F*o Bar*"));
223         assertTrue(FilenameUtils.wildcardMatchOnSystem("Adobe Acrobat Installer", "Ad*er"));
224         assertTrue(FilenameUtils.wildcardMatchOnSystem("Foo", "*Foo"));
225         assertTrue(FilenameUtils.wildcardMatchOnSystem("BarFoo", "*Foo"));
226         assertTrue(FilenameUtils.wildcardMatchOnSystem("Foo", "Foo*"));
227         assertTrue(FilenameUtils.wildcardMatchOnSystem("FooBar", "Foo*"));
228         assertEquals(WINDOWS, FilenameUtils.wildcardMatchOnSystem("FOO", "*Foo"));
229         assertEquals(WINDOWS, FilenameUtils.wildcardMatchOnSystem("BARFOO", "*Foo"));
230         assertEquals(WINDOWS, FilenameUtils.wildcardMatchOnSystem("FOO", "Foo*"));
231         assertEquals(WINDOWS, FilenameUtils.wildcardMatchOnSystem("FOOBAR", "Foo*"));
232     }
233 
234     @Test
testSplitOnTokens()235     public void testSplitOnTokens() {
236         assertArrayEquals(new String[] { "Ad", "*", "er" }, FilenameUtils.splitOnTokens("Ad*er"));
237         assertArrayEquals(new String[] { "Ad", "?", "er" }, FilenameUtils.splitOnTokens("Ad?er"));
238         assertArrayEquals(new String[] { "Test", "*", "?", "One" }, FilenameUtils.splitOnTokens("Test*?One"));
239         assertArrayEquals(new String[] { "Test", "?", "*", "One" }, FilenameUtils.splitOnTokens("Test?*One"));
240         assertArrayEquals(new String[] { "*" }, FilenameUtils.splitOnTokens("****"));
241         assertArrayEquals(new String[] { "*", "?", "?", "*" }, FilenameUtils.splitOnTokens("*??*"));
242         assertArrayEquals(new String[] { "*", "?", "*", "?", "*" }, FilenameUtils.splitOnTokens("*?**?*"));
243         assertArrayEquals(new String[] { "*", "?", "*", "?", "*" }, FilenameUtils.splitOnTokens("*?***?*"));
244         assertArrayEquals(new String[] { "h", "?", "?", "*" }, FilenameUtils.splitOnTokens("h??*"));
245         assertArrayEquals(new String[] { "" }, FilenameUtils.splitOnTokens(""));
246     }
247 
248 }
249