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  import java.io.IOException;
21  import java.util.ArrayList;
22  import java.util.Arrays;
23  import java.util.Collection;
24  
25  import junit.framework.Test;
26  import junit.framework.TestSuite;
27  import junit.textui.TestRunner;
28  
29  import org.apache.commons.io.testtools.FileBasedTestCase;
30  
31  /**
32   * This is used to test FilenameUtils for correctness.
33   *
34   * @author Peter Donald
35   * @author Matthew Hawthorne
36   * @author Martin Cooper
37   * @version $Id: FilenameUtilsTestCase.java 437567 2006-08-28 06:39:07Z bayard $
38   * @see FilenameUtils
39   */
40  public class FilenameUtilsTestCase extends FileBasedTestCase {
41      
42      private static final String SEP = "" + File.separatorChar;
43      private static final boolean WINDOWS = (File.separatorChar == '\\');
44  
45      private File testFile1;
46      private File testFile2;
47  
48      private static int testFile1Size;
49      private static int testFile2Size;
50  
51      public static void main(String[] args) {
52          TestRunner.run(suite());
53      }
54  
55      public static Test suite() {
56          return new TestSuite(FilenameUtilsTestCase.class);
57      }
58  
59      public FilenameUtilsTestCase(String name) throws IOException {
60          super(name);
61  
62          testFile1 = new File(getTestDirectory(), "file1-test.txt");
63          testFile2 = new File(getTestDirectory(), "file1a-test.txt");
64  
65          testFile1Size = (int)testFile1.length();
66          testFile2Size = (int)testFile2.length();
67      }
68  
69      /** @see junit.framework.TestCase#setUp() */
70      protected void setUp() throws Exception {
71          getTestDirectory().mkdirs();
72          createFile(testFile1, testFile1Size);
73          createFile(testFile2, testFile2Size);
74          FileUtils.deleteDirectory(getTestDirectory());
75          getTestDirectory().mkdirs();
76          createFile(testFile1, testFile1Size);
77          createFile(testFile2, testFile2Size);
78      }
79  
80      /** @see junit.framework.TestCase#tearDown() */
81      protected void tearDown() throws Exception {
82          FileUtils.deleteDirectory(getTestDirectory());
83      }
84  
85      //-----------------------------------------------------------------------
86      public void testNormalize() throws Exception {
87          assertEquals(null, FilenameUtils.normalize(null));
88          assertEquals(null, FilenameUtils.normalize(":"));
89          assertEquals(null, FilenameUtils.normalize("1:\\a\\b\\c.txt"));
90          assertEquals(null, FilenameUtils.normalize("1:"));
91          assertEquals(null, FilenameUtils.normalize("1:a"));
92          assertEquals(null, FilenameUtils.normalize("\\\\\\a\\b\\c.txt"));
93          assertEquals(null, FilenameUtils.normalize("\\\\a"));
94          
95          assertEquals("a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("a\\b/c.txt"));
96          assertEquals("" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\a\\b/c.txt"));
97          assertEquals("C:" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("C:\\a\\b/c.txt"));
98          assertEquals("" + SEP + "" + SEP + "server" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\server\\a\\b/c.txt"));
99          assertEquals("~" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("~\\a\\b/c.txt"));
100         assertEquals("~user" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("~user\\a\\b/c.txt"));
101         
102         assertEquals("a" + SEP + "c", FilenameUtils.normalize("a/b/../c"));
103         assertEquals("c", FilenameUtils.normalize("a/b/../../c"));
104         assertEquals("c" + SEP, FilenameUtils.normalize("a/b/../../c/"));
105         assertEquals(null, FilenameUtils.normalize("a/b/../../../c"));
106         assertEquals("a" + SEP, FilenameUtils.normalize("a/b/.."));
107         assertEquals("a" + SEP, FilenameUtils.normalize("a/b/../"));
108         assertEquals("", FilenameUtils.normalize("a/b/../.."));
109         assertEquals("", FilenameUtils.normalize("a/b/../../"));
110         assertEquals(null, FilenameUtils.normalize("a/b/../../.."));
111         assertEquals("a" + SEP + "d", FilenameUtils.normalize("a/b/../c/../d"));
112         assertEquals("a" + SEP + "d" + SEP, FilenameUtils.normalize("a/b/../c/../d/"));
113         assertEquals("a" + SEP + "b" + SEP + "d", FilenameUtils.normalize("a/b//d"));
114         assertEquals("a" + SEP + "b" + SEP, FilenameUtils.normalize("a/b/././."));
115         assertEquals("a" + SEP + "b" + SEP, FilenameUtils.normalize("a/b/./././"));
116         assertEquals("a" + SEP, FilenameUtils.normalize("./a/"));
117         assertEquals("a", FilenameUtils.normalize("./a"));
118         assertEquals("", FilenameUtils.normalize("./"));
119         assertEquals("", FilenameUtils.normalize("."));
120         assertEquals(null, FilenameUtils.normalize("../a"));
121         assertEquals(null, FilenameUtils.normalize(".."));
122         assertEquals("", FilenameUtils.normalize(""));
123         
124         assertEquals(SEP + "a", FilenameUtils.normalize("/a"));
125         assertEquals(SEP + "a" + SEP, FilenameUtils.normalize("/a/"));
126         assertEquals(SEP + "a" + SEP + "c", FilenameUtils.normalize("/a/b/../c"));
127         assertEquals(SEP + "c", FilenameUtils.normalize("/a/b/../../c"));
128         assertEquals(null, FilenameUtils.normalize("/a/b/../../../c"));
129         assertEquals(SEP + "a" + SEP, FilenameUtils.normalize("/a/b/.."));
130         assertEquals(SEP + "", FilenameUtils.normalize("/a/b/../.."));
131         assertEquals(null, FilenameUtils.normalize("/a/b/../../.."));
132         assertEquals(SEP + "a" + SEP + "d", FilenameUtils.normalize("/a/b/../c/../d"));
133         assertEquals(SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalize("/a/b//d"));
134         assertEquals(SEP + "a" + SEP + "b" + SEP, FilenameUtils.normalize("/a/b/././."));
135         assertEquals(SEP + "a", FilenameUtils.normalize("/./a"));
136         assertEquals(SEP + "", FilenameUtils.normalize("/./"));
137         assertEquals(SEP + "", FilenameUtils.normalize("/."));
138         assertEquals(null, FilenameUtils.normalize("/../a"));
139         assertEquals(null, FilenameUtils.normalize("/.."));
140         assertEquals(SEP + "", FilenameUtils.normalize("/"));
141         
142         assertEquals("~" + SEP + "a", FilenameUtils.normalize("~/a"));
143         assertEquals("~" + SEP + "a" + SEP, FilenameUtils.normalize("~/a/"));
144         assertEquals("~" + SEP + "a" + SEP + "c", FilenameUtils.normalize("~/a/b/../c"));
145         assertEquals("~" + SEP + "c", FilenameUtils.normalize("~/a/b/../../c"));
146         assertEquals(null, FilenameUtils.normalize("~/a/b/../../../c"));
147         assertEquals("~" + SEP + "a" + SEP, FilenameUtils.normalize("~/a/b/.."));
148         assertEquals("~" + SEP + "", FilenameUtils.normalize("~/a/b/../.."));
149         assertEquals(null, FilenameUtils.normalize("~/a/b/../../.."));
150         assertEquals("~" + SEP + "a" + SEP + "d", FilenameUtils.normalize("~/a/b/../c/../d"));
151         assertEquals("~" + SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalize("~/a/b//d"));
152         assertEquals("~" + SEP + "a" + SEP + "b" + SEP, FilenameUtils.normalize("~/a/b/././."));
153         assertEquals("~" + SEP + "a", FilenameUtils.normalize("~/./a"));
154         assertEquals("~" + SEP, FilenameUtils.normalize("~/./"));
155         assertEquals("~" + SEP, FilenameUtils.normalize("~/."));
156         assertEquals(null, FilenameUtils.normalize("~/../a"));
157         assertEquals(null, FilenameUtils.normalize("~/.."));
158         assertEquals("~" + SEP, FilenameUtils.normalize("~/"));
159         assertEquals("~" + SEP, FilenameUtils.normalize("~"));
160         
161         assertEquals("~user" + SEP + "a", FilenameUtils.normalize("~user/a"));
162         assertEquals("~user" + SEP + "a" + SEP, FilenameUtils.normalize("~user/a/"));
163         assertEquals("~user" + SEP + "a" + SEP + "c", FilenameUtils.normalize("~user/a/b/../c"));
164         assertEquals("~user" + SEP + "c", FilenameUtils.normalize("~user/a/b/../../c"));
165         assertEquals(null, FilenameUtils.normalize("~user/a/b/../../../c"));
166         assertEquals("~user" + SEP + "a" + SEP, FilenameUtils.normalize("~user/a/b/.."));
167         assertEquals("~user" + SEP + "", FilenameUtils.normalize("~user/a/b/../.."));
168         assertEquals(null, FilenameUtils.normalize("~user/a/b/../../.."));
169         assertEquals("~user" + SEP + "a" + SEP + "d", FilenameUtils.normalize("~user/a/b/../c/../d"));
170         assertEquals("~user" + SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalize("~user/a/b//d"));
171         assertEquals("~user" + SEP + "a" + SEP + "b" + SEP, FilenameUtils.normalize("~user/a/b/././."));
172         assertEquals("~user" + SEP + "a", FilenameUtils.normalize("~user/./a"));
173         assertEquals("~user" + SEP + "", FilenameUtils.normalize("~user/./"));
174         assertEquals("~user" + SEP + "", FilenameUtils.normalize("~user/."));
175         assertEquals(null, FilenameUtils.normalize("~user/../a"));
176         assertEquals(null, FilenameUtils.normalize("~user/.."));
177         assertEquals("~user" + SEP, FilenameUtils.normalize("~user/"));
178         assertEquals("~user" + SEP, FilenameUtils.normalize("~user"));
179         
180         assertEquals("C:" + SEP + "a", FilenameUtils.normalize("C:/a"));
181         assertEquals("C:" + SEP + "a" + SEP, FilenameUtils.normalize("C:/a/"));
182         assertEquals("C:" + SEP + "a" + SEP + "c", FilenameUtils.normalize("C:/a/b/../c"));
183         assertEquals("C:" + SEP + "c", FilenameUtils.normalize("C:/a/b/../../c"));
184         assertEquals(null, FilenameUtils.normalize("C:/a/b/../../../c"));
185         assertEquals("C:" + SEP + "a" + SEP, FilenameUtils.normalize("C:/a/b/.."));
186         assertEquals("C:" + SEP + "", FilenameUtils.normalize("C:/a/b/../.."));
187         assertEquals(null, FilenameUtils.normalize("C:/a/b/../../.."));
188         assertEquals("C:" + SEP + "a" + SEP + "d", FilenameUtils.normalize("C:/a/b/../c/../d"));
189         assertEquals("C:" + SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalize("C:/a/b//d"));
190         assertEquals("C:" + SEP + "a" + SEP + "b" + SEP, FilenameUtils.normalize("C:/a/b/././."));
191         assertEquals("C:" + SEP + "a", FilenameUtils.normalize("C:/./a"));
192         assertEquals("C:" + SEP + "", FilenameUtils.normalize("C:/./"));
193         assertEquals("C:" + SEP + "", FilenameUtils.normalize("C:/."));
194         assertEquals(null, FilenameUtils.normalize("C:/../a"));
195         assertEquals(null, FilenameUtils.normalize("C:/.."));
196         assertEquals("C:" + SEP + "", FilenameUtils.normalize("C:/"));
197         
198         assertEquals("C:" + "a", FilenameUtils.normalize("C:a"));
199         assertEquals("C:" + "a" + SEP, FilenameUtils.normalize("C:a/"));
200         assertEquals("C:" + "a" + SEP + "c", FilenameUtils.normalize("C:a/b/../c"));
201         assertEquals("C:" + "c", FilenameUtils.normalize("C:a/b/../../c"));
202         assertEquals(null, FilenameUtils.normalize("C:a/b/../../../c"));
203         assertEquals("C:" + "a" + SEP, FilenameUtils.normalize("C:a/b/.."));
204         assertEquals("C:" + "", FilenameUtils.normalize("C:a/b/../.."));
205         assertEquals(null, FilenameUtils.normalize("C:a/b/../../.."));
206         assertEquals("C:" + "a" + SEP + "d", FilenameUtils.normalize("C:a/b/../c/../d"));
207         assertEquals("C:" + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalize("C:a/b//d"));
208         assertEquals("C:" + "a" + SEP + "b" + SEP, FilenameUtils.normalize("C:a/b/././."));
209         assertEquals("C:" + "a", FilenameUtils.normalize("C:./a"));
210         assertEquals("C:" + "", FilenameUtils.normalize("C:./"));
211         assertEquals("C:" + "", FilenameUtils.normalize("C:."));
212         assertEquals(null, FilenameUtils.normalize("C:../a"));
213         assertEquals(null, FilenameUtils.normalize("C:.."));
214         assertEquals("C:" + "", FilenameUtils.normalize("C:"));
215         
216         assertEquals(SEP + SEP + "server" + SEP + "a", FilenameUtils.normalize("//server/a"));
217         assertEquals(SEP + SEP + "server" + SEP + "a" + SEP, FilenameUtils.normalize("//server/a/"));
218         assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "c", FilenameUtils.normalize("//server/a/b/../c"));
219         assertEquals(SEP + SEP + "server" + SEP + "c", FilenameUtils.normalize("//server/a/b/../../c"));
220         assertEquals(null, FilenameUtils.normalize("//server/a/b/../../../c"));
221         assertEquals(SEP + SEP + "server" + SEP + "a" + SEP, FilenameUtils.normalize("//server/a/b/.."));
222         assertEquals(SEP + SEP + "server" + SEP + "", FilenameUtils.normalize("//server/a/b/../.."));
223         assertEquals(null, FilenameUtils.normalize("//server/a/b/../../.."));
224         assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "d", FilenameUtils.normalize("//server/a/b/../c/../d"));
225         assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalize("//server/a/b//d"));
226         assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "b" + SEP, FilenameUtils.normalize("//server/a/b/././."));
227         assertEquals(SEP + SEP + "server" + SEP + "a", FilenameUtils.normalize("//server/./a"));
228         assertEquals(SEP + SEP + "server" + SEP + "", FilenameUtils.normalize("//server/./"));
229         assertEquals(SEP + SEP + "server" + SEP + "", FilenameUtils.normalize("//server/."));
230         assertEquals(null, FilenameUtils.normalize("//server/../a"));
231         assertEquals(null, FilenameUtils.normalize("//server/.."));
232         assertEquals(SEP + SEP + "server" + SEP + "", FilenameUtils.normalize("//server/"));
233     }
234 
235     //-----------------------------------------------------------------------
236     public void testNormalizeNoEndSeparator() throws Exception {
237         assertEquals(null, FilenameUtils.normalizeNoEndSeparator(null));
238         assertEquals(null, FilenameUtils.normalizeNoEndSeparator(":"));
239         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("1:\\a\\b\\c.txt"));
240         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("1:"));
241         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("1:a"));
242         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("\\\\\\a\\b\\c.txt"));
243         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("\\\\a"));
244         
245         assertEquals("a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalizeNoEndSeparator("a\\b/c.txt"));
246         assertEquals("" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalizeNoEndSeparator("\\a\\b/c.txt"));
247         assertEquals("C:" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalizeNoEndSeparator("C:\\a\\b/c.txt"));
248         assertEquals("" + SEP + "" + SEP + "server" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalizeNoEndSeparator("\\\\server\\a\\b/c.txt"));
249         assertEquals("~" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalizeNoEndSeparator("~\\a\\b/c.txt"));
250         assertEquals("~user" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalizeNoEndSeparator("~user\\a\\b/c.txt"));
251         
252         assertEquals("a" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("a/b/../c"));
253         assertEquals("c", FilenameUtils.normalizeNoEndSeparator("a/b/../../c"));
254         assertEquals("c", FilenameUtils.normalizeNoEndSeparator("a/b/../../c/"));
255         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("a/b/../../../c"));
256         assertEquals("a", FilenameUtils.normalizeNoEndSeparator("a/b/.."));
257         assertEquals("a", FilenameUtils.normalizeNoEndSeparator("a/b/../"));
258         assertEquals("", FilenameUtils.normalizeNoEndSeparator("a/b/../.."));
259         assertEquals("", FilenameUtils.normalizeNoEndSeparator("a/b/../../"));
260         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("a/b/../../.."));
261         assertEquals("a" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("a/b/../c/../d"));
262         assertEquals("a" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("a/b/../c/../d/"));
263         assertEquals("a" + SEP + "b" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("a/b//d"));
264         assertEquals("a" + SEP + "b", FilenameUtils.normalizeNoEndSeparator("a/b/././."));
265         assertEquals("a" + SEP + "b", FilenameUtils.normalizeNoEndSeparator("a/b/./././"));
266         assertEquals("a", FilenameUtils.normalizeNoEndSeparator("./a/"));
267         assertEquals("a", FilenameUtils.normalizeNoEndSeparator("./a"));
268         assertEquals("", FilenameUtils.normalizeNoEndSeparator("./"));
269         assertEquals("", FilenameUtils.normalizeNoEndSeparator("."));
270         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("../a"));
271         assertEquals(null, FilenameUtils.normalizeNoEndSeparator(".."));
272         assertEquals("", FilenameUtils.normalizeNoEndSeparator(""));
273         
274         assertEquals(SEP + "a", FilenameUtils.normalizeNoEndSeparator("/a"));
275         assertEquals(SEP + "a", FilenameUtils.normalizeNoEndSeparator("/a/"));
276         assertEquals(SEP + "a" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("/a/b/../c"));
277         assertEquals(SEP + "c", FilenameUtils.normalizeNoEndSeparator("/a/b/../../c"));
278         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("/a/b/../../../c"));
279         assertEquals(SEP + "a", FilenameUtils.normalizeNoEndSeparator("/a/b/.."));
280         assertEquals(SEP + "", FilenameUtils.normalizeNoEndSeparator("/a/b/../.."));
281         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("/a/b/../../.."));
282         assertEquals(SEP + "a" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("/a/b/../c/../d"));
283         assertEquals(SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("/a/b//d"));
284         assertEquals(SEP + "a" + SEP + "b", FilenameUtils.normalizeNoEndSeparator("/a/b/././."));
285         assertEquals(SEP + "a", FilenameUtils.normalizeNoEndSeparator("/./a"));
286         assertEquals(SEP + "", FilenameUtils.normalizeNoEndSeparator("/./"));
287         assertEquals(SEP + "", FilenameUtils.normalizeNoEndSeparator("/."));
288         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("/../a"));
289         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("/.."));
290         assertEquals(SEP + "", FilenameUtils.normalizeNoEndSeparator("/"));
291         
292         assertEquals("~" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("~/a"));
293         assertEquals("~" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("~/a/"));
294         assertEquals("~" + SEP + "a" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("~/a/b/../c"));
295         assertEquals("~" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("~/a/b/../../c"));
296         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("~/a/b/../../../c"));
297         assertEquals("~" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("~/a/b/.."));
298         assertEquals("~" + SEP + "", FilenameUtils.normalizeNoEndSeparator("~/a/b/../.."));
299         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("~/a/b/../../.."));
300         assertEquals("~" + SEP + "a" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("~/a/b/../c/../d"));
301         assertEquals("~" + SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("~/a/b//d"));
302         assertEquals("~" + SEP + "a" + SEP + "b", FilenameUtils.normalizeNoEndSeparator("~/a/b/././."));
303         assertEquals("~" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("~/./a"));
304         assertEquals("~" + SEP, FilenameUtils.normalizeNoEndSeparator("~/./"));
305         assertEquals("~" + SEP, FilenameUtils.normalizeNoEndSeparator("~/."));
306         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("~/../a"));
307         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("~/.."));
308         assertEquals("~" + SEP, FilenameUtils.normalizeNoEndSeparator("~/"));
309         assertEquals("~" + SEP, FilenameUtils.normalizeNoEndSeparator("~"));
310         
311         assertEquals("~user" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("~user/a"));
312         assertEquals("~user" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("~user/a/"));
313         assertEquals("~user" + SEP + "a" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("~user/a/b/../c"));
314         assertEquals("~user" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("~user/a/b/../../c"));
315         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("~user/a/b/../../../c"));
316         assertEquals("~user" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("~user/a/b/.."));
317         assertEquals("~user" + SEP + "", FilenameUtils.normalizeNoEndSeparator("~user/a/b/../.."));
318         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("~user/a/b/../../.."));
319         assertEquals("~user" + SEP + "a" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("~user/a/b/../c/../d"));
320         assertEquals("~user" + SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("~user/a/b//d"));
321         assertEquals("~user" + SEP + "a" + SEP + "b", FilenameUtils.normalizeNoEndSeparator("~user/a/b/././."));
322         assertEquals("~user" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("~user/./a"));
323         assertEquals("~user" + SEP + "", FilenameUtils.normalizeNoEndSeparator("~user/./"));
324         assertEquals("~user" + SEP + "", FilenameUtils.normalizeNoEndSeparator("~user/."));
325         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("~user/../a"));
326         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("~user/.."));
327         assertEquals("~user" + SEP, FilenameUtils.normalizeNoEndSeparator("~user/"));
328         assertEquals("~user" + SEP, FilenameUtils.normalizeNoEndSeparator("~user"));
329         
330         assertEquals("C:" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("C:/a"));
331         assertEquals("C:" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("C:/a/"));
332         assertEquals("C:" + SEP + "a" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("C:/a/b/../c"));
333         assertEquals("C:" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("C:/a/b/../../c"));
334         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("C:/a/b/../../../c"));
335         assertEquals("C:" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("C:/a/b/.."));
336         assertEquals("C:" + SEP + "", FilenameUtils.normalizeNoEndSeparator("C:/a/b/../.."));
337         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("C:/a/b/../../.."));
338         assertEquals("C:" + SEP + "a" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("C:/a/b/../c/../d"));
339         assertEquals("C:" + SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("C:/a/b//d"));
340         assertEquals("C:" + SEP + "a" + SEP + "b", FilenameUtils.normalizeNoEndSeparator("C:/a/b/././."));
341         assertEquals("C:" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("C:/./a"));
342         assertEquals("C:" + SEP + "", FilenameUtils.normalizeNoEndSeparator("C:/./"));
343         assertEquals("C:" + SEP + "", FilenameUtils.normalizeNoEndSeparator("C:/."));
344         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("C:/../a"));
345         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("C:/.."));
346         assertEquals("C:" + SEP + "", FilenameUtils.normalizeNoEndSeparator("C:/"));
347         
348         assertEquals("C:" + "a", FilenameUtils.normalizeNoEndSeparator("C:a"));
349         assertEquals("C:" + "a", FilenameUtils.normalizeNoEndSeparator("C:a/"));
350         assertEquals("C:" + "a" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("C:a/b/../c"));
351         assertEquals("C:" + "c", FilenameUtils.normalizeNoEndSeparator("C:a/b/../../c"));
352         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("C:a/b/../../../c"));
353         assertEquals("C:" + "a", FilenameUtils.normalizeNoEndSeparator("C:a/b/.."));
354         assertEquals("C:" + "", FilenameUtils.normalizeNoEndSeparator("C:a/b/../.."));
355         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("C:a/b/../../.."));
356         assertEquals("C:" + "a" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("C:a/b/../c/../d"));
357         assertEquals("C:" + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("C:a/b//d"));
358         assertEquals("C:" + "a" + SEP + "b", FilenameUtils.normalizeNoEndSeparator("C:a/b/././."));
359         assertEquals("C:" + "a", FilenameUtils.normalizeNoEndSeparator("C:./a"));
360         assertEquals("C:" + "", FilenameUtils.normalizeNoEndSeparator("C:./"));
361         assertEquals("C:" + "", FilenameUtils.normalizeNoEndSeparator("C:."));
362         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("C:../a"));
363         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("C:.."));
364         assertEquals("C:" + "", FilenameUtils.normalizeNoEndSeparator("C:"));
365         
366         assertEquals(SEP + SEP + "server" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("//server/a"));
367         assertEquals(SEP + SEP + "server" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("//server/a/"));
368         assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("//server/a/b/../c"));
369         assertEquals(SEP + SEP + "server" + SEP + "c", FilenameUtils.normalizeNoEndSeparator("//server/a/b/../../c"));
370         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("//server/a/b/../../../c"));
371         assertEquals(SEP + SEP + "server" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("//server/a/b/.."));
372         assertEquals(SEP + SEP + "server" + SEP + "", FilenameUtils.normalizeNoEndSeparator("//server/a/b/../.."));
373         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("//server/a/b/../../.."));
374         assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("//server/a/b/../c/../d"));
375         assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "b" + SEP + "d", FilenameUtils.normalizeNoEndSeparator("//server/a/b//d"));
376         assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "b", FilenameUtils.normalizeNoEndSeparator("//server/a/b/././."));
377         assertEquals(SEP + SEP + "server" + SEP + "a", FilenameUtils.normalizeNoEndSeparator("//server/./a"));
378         assertEquals(SEP + SEP + "server" + SEP + "", FilenameUtils.normalizeNoEndSeparator("//server/./"));
379         assertEquals(SEP + SEP + "server" + SEP + "", FilenameUtils.normalizeNoEndSeparator("//server/."));
380         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("//server/../a"));
381         assertEquals(null, FilenameUtils.normalizeNoEndSeparator("//server/.."));
382         assertEquals(SEP + SEP + "server" + SEP + "", FilenameUtils.normalizeNoEndSeparator("//server/"));
383     }
384 
385     //-----------------------------------------------------------------------
386     public void testConcat() {
387         assertEquals(null, FilenameUtils.concat("", null));
388         assertEquals(null, FilenameUtils.concat(null, null));
389         assertEquals(null, FilenameUtils.concat(null, ""));
390         assertEquals(null, FilenameUtils.concat(null, "a"));
391         assertEquals(SEP + "a", FilenameUtils.concat(null, "/a"));
392         
393         assertEquals(null, FilenameUtils.concat("", ":")); // invalid prefix
394         assertEquals(null, FilenameUtils.concat(":", "")); // invalid prefix
395         
396         assertEquals("f" + SEP, FilenameUtils.concat("", "f/"));
397         assertEquals("f", FilenameUtils.concat("", "f"));
398         assertEquals("a" + SEP + "f" + SEP, FilenameUtils.concat("a/", "f/"));
399         assertEquals("a" + SEP + "f", FilenameUtils.concat("a", "f"));
400         assertEquals("a" + SEP + "b" + SEP + "f" + SEP, FilenameUtils.concat("a/b/", "f/"));
401         assertEquals("a" + SEP + "b" + SEP + "f", FilenameUtils.concat("a/b", "f"));
402         
403         assertEquals("a" + SEP + "f" + SEP, FilenameUtils.concat("a/b/", "../f/"));
404         assertEquals("a" + SEP + "f", FilenameUtils.concat("a/b", "../f"));
405         assertEquals("a" + SEP + "c" + SEP + "g" + SEP, FilenameUtils.concat("a/b/../c/", "f/../g/"));
406         assertEquals("a" + SEP + "c" + SEP + "g", FilenameUtils.concat("a/b/../c", "f/../g"));
407         
408         assertEquals("a" + SEP + "c.txt" + SEP + "f", FilenameUtils.concat("a/c.txt", "f"));
409         
410         assertEquals(SEP + "f" + SEP, FilenameUtils.concat("", "/f/"));
411         assertEquals(SEP + "f", FilenameUtils.concat("", "/f"));
412         assertEquals(SEP + "f" + SEP, FilenameUtils.concat("a/", "/f/"));
413         assertEquals(SEP + "f", FilenameUtils.concat("a", "/f"));
414         
415         assertEquals(SEP + "c" + SEP + "d", FilenameUtils.concat("a/b/", "/c/d"));
416         assertEquals("C:c" + SEP + "d", FilenameUtils.concat("a/b/", "C:c/d"));
417         assertEquals("C:" + SEP + "c" + SEP + "d", FilenameUtils.concat("a/b/", "C:/c/d"));
418         assertEquals("~" + SEP + "c" + SEP + "d", FilenameUtils.concat("a/b/", "~/c/d"));
419         assertEquals("~user" + SEP + "c" + SEP + "d", FilenameUtils.concat("a/b/", "~user/c/d"));
420         assertEquals("~" + SEP, FilenameUtils.concat("a/b/", "~"));
421         assertEquals("~user" + SEP, FilenameUtils.concat("a/b/", "~user"));
422     }
423 
424     //-----------------------------------------------------------------------
425     public void testSeparatorsToUnix() {
426         assertEquals(null, FilenameUtils.separatorsToUnix(null));
427         assertEquals("/a/b/c", FilenameUtils.separatorsToUnix("/a/b/c"));
428         assertEquals("/a/b/c.txt", FilenameUtils.separatorsToUnix("/a/b/c.txt"));
429         assertEquals("/a/b/c", FilenameUtils.separatorsToUnix("/a/b\\c"));
430         assertEquals("/a/b/c", FilenameUtils.separatorsToUnix("\\a\\b\\c"));
431         assertEquals("D:/a/b/c", FilenameUtils.separatorsToUnix("D:\\a\\b\\c"));
432     }
433 
434     public void testSeparatorsToWindows() {
435         assertEquals(null, FilenameUtils.separatorsToWindows(null));
436         assertEquals("\\a\\b\\c", FilenameUtils.separatorsToWindows("\\a\\b\\c"));
437         assertEquals("\\a\\b\\c.txt", FilenameUtils.separatorsToWindows("\\a\\b\\c.txt"));
438         assertEquals("\\a\\b\\c", FilenameUtils.separatorsToWindows("\\a\\b/c"));
439         assertEquals("\\a\\b\\c", FilenameUtils.separatorsToWindows("/a/b/c"));
440         assertEquals("D:\\a\\b\\c", FilenameUtils.separatorsToWindows("D:/a/b/c"));
441     }
442 
443     public void testSeparatorsToSystem() {
444         if (WINDOWS) {
445             assertEquals(null, FilenameUtils.separatorsToSystem(null));
446             assertEquals("\\a\\b\\c", FilenameUtils.separatorsToSystem("\\a\\b\\c"));
447             assertEquals("\\a\\b\\c.txt", FilenameUtils.separatorsToSystem("\\a\\b\\c.txt"));
448             assertEquals("\\a\\b\\c", FilenameUtils.separatorsToSystem("\\a\\b/c"));
449             assertEquals("\\a\\b\\c", FilenameUtils.separatorsToSystem("/a/b/c"));
450             assertEquals("D:\\a\\b\\c", FilenameUtils.separatorsToSystem("D:/a/b/c"));
451         } else {
452             assertEquals(null, FilenameUtils.separatorsToSystem(null));
453             assertEquals("/a/b/c", FilenameUtils.separatorsToSystem("/a/b/c"));
454             assertEquals("/a/b/c.txt", FilenameUtils.separatorsToSystem("/a/b/c.txt"));
455             assertEquals("/a/b/c", FilenameUtils.separatorsToSystem("/a/b\\c"));
456             assertEquals("/a/b/c", FilenameUtils.separatorsToSystem("\\a\\b\\c"));
457             assertEquals("D:/a/b/c", FilenameUtils.separatorsToSystem("D:\\a\\b\\c"));
458         }
459     }
460 
461     //-----------------------------------------------------------------------
462     public void testGetPrefixLength() {
463         assertEquals(-1, FilenameUtils.getPrefixLength(null));
464         assertEquals(-1, FilenameUtils.getPrefixLength(":"));
465         assertEquals(-1, FilenameUtils.getPrefixLength("1:\\a\\b\\c.txt"));
466         assertEquals(-1, FilenameUtils.getPrefixLength("1:"));
467         assertEquals(-1, FilenameUtils.getPrefixLength("1:a"));
468         assertEquals(-1, FilenameUtils.getPrefixLength("\\\\\\a\\b\\c.txt"));
469         assertEquals(-1, FilenameUtils.getPrefixLength("\\\\a"));
470         
471         assertEquals(0, FilenameUtils.getPrefixLength(""));
472         assertEquals(1, FilenameUtils.getPrefixLength("\\"));
473         assertEquals(2, FilenameUtils.getPrefixLength("C:"));
474         assertEquals(3, FilenameUtils.getPrefixLength("C:\\"));
475         assertEquals(9, FilenameUtils.getPrefixLength("//server/"));
476         assertEquals(2, FilenameUtils.getPrefixLength("~"));
477         assertEquals(2, FilenameUtils.getPrefixLength("~/"));
478         assertEquals(6, FilenameUtils.getPrefixLength("~user"));
479         assertEquals(6, FilenameUtils.getPrefixLength("~user/"));
480         
481         assertEquals(0, FilenameUtils.getPrefixLength("a\\b\\c.txt"));
482         assertEquals(1, FilenameUtils.getPrefixLength("\\a\\b\\c.txt"));
483         assertEquals(2, FilenameUtils.getPrefixLength("C:a\\b\\c.txt"));
484         assertEquals(3, FilenameUtils.getPrefixLength("C:\\a\\b\\c.txt"));
485         assertEquals(9, FilenameUtils.getPrefixLength("\\\\server\\a\\b\\c.txt"));
486         
487         assertEquals(0, FilenameUtils.getPrefixLength("a/b/c.txt"));
488         assertEquals(1, FilenameUtils.getPrefixLength("/a/b/c.txt"));
489         assertEquals(3, FilenameUtils.getPrefixLength("C:/a/b/c.txt"));
490         assertEquals(9, FilenameUtils.getPrefixLength("//server/a/b/c.txt"));
491         assertEquals(2, FilenameUtils.getPrefixLength("~/a/b/c.txt"));
492         assertEquals(6, FilenameUtils.getPrefixLength("~user/a/b/c.txt"));
493         
494         assertEquals(0, FilenameUtils.getPrefixLength("a\\b\\c.txt"));
495         assertEquals(1, FilenameUtils.getPrefixLength("\\a\\b\\c.txt"));
496         assertEquals(2, FilenameUtils.getPrefixLength("~\\a\\b\\c.txt"));
497         assertEquals(6, FilenameUtils.getPrefixLength("~user\\a\\b\\c.txt"));
498     }
499     
500     public void testIndexOfLastSeparator() {
501         assertEquals(-1, FilenameUtils.indexOfLastSeparator(null));
502         assertEquals(-1, FilenameUtils.indexOfLastSeparator("noseperator.inthispath"));
503         assertEquals(3, FilenameUtils.indexOfLastSeparator("a/b/c"));
504         assertEquals(3, FilenameUtils.indexOfLastSeparator("a\\b\\c"));
505     }
506 
507     public void testIndexOfExtension() {
508         assertEquals(-1, FilenameUtils.indexOfExtension(null));
509         assertEquals(-1, FilenameUtils.indexOfExtension("file"));
510         assertEquals(4, FilenameUtils.indexOfExtension("file.txt"));
511         assertEquals(13, FilenameUtils.indexOfExtension("a.txt/b.txt/c.txt"));
512         assertEquals(-1, FilenameUtils.indexOfExtension("a/b/c"));
513         assertEquals(-1, FilenameUtils.indexOfExtension("a\\b\\c"));
514         assertEquals(-1, FilenameUtils.indexOfExtension("a/b.notextension/c"));
515         assertEquals(-1, FilenameUtils.indexOfExtension("a\\b.notextension\\c"));
516     }
517 
518     //-----------------------------------------------------------------------
519     public void testGetPrefix() {
520         assertEquals(null, FilenameUtils.getPrefix(null));
521         assertEquals(null, FilenameUtils.getPrefix(":"));
522         assertEquals(null, FilenameUtils.getPrefix("1:\\a\\b\\c.txt"));
523         assertEquals(null, FilenameUtils.getPrefix("1:"));
524         assertEquals(null, FilenameUtils.getPrefix("1:a"));
525         assertEquals(null, FilenameUtils.getPrefix("\\\\\\a\\b\\c.txt"));
526         assertEquals(null, FilenameUtils.getPrefix("\\\\a"));
527         
528         assertEquals("", FilenameUtils.getPrefix(""));
529         assertEquals("\\", FilenameUtils.getPrefix("\\"));
530         assertEquals("C:", FilenameUtils.getPrefix("C:"));
531         assertEquals("C:\\", FilenameUtils.getPrefix("C:\\"));
532         assertEquals("//server/", FilenameUtils.getPrefix("//server/"));
533         assertEquals("~/", FilenameUtils.getPrefix("~"));
534         assertEquals("~/", FilenameUtils.getPrefix("~/"));
535         assertEquals("~user/", FilenameUtils.getPrefix("~user"));
536         assertEquals("~user/", FilenameUtils.getPrefix("~user/"));
537         
538         assertEquals("", FilenameUtils.getPrefix("a\\b\\c.txt"));
539         assertEquals("\\", FilenameUtils.getPrefix("\\a\\b\\c.txt"));
540         assertEquals("C:\\", FilenameUtils.getPrefix("C:\\a\\b\\c.txt"));
541         assertEquals("\\\\server\\", FilenameUtils.getPrefix("\\\\server\\a\\b\\c.txt"));
542         
543         assertEquals("", FilenameUtils.getPrefix("a/b/c.txt"));
544         assertEquals("/", FilenameUtils.getPrefix("/a/b/c.txt"));
545         assertEquals("C:/", FilenameUtils.getPrefix("C:/a/b/c.txt"));
546         assertEquals("//server/", FilenameUtils.getPrefix("//server/a/b/c.txt"));
547         assertEquals("~/", FilenameUtils.getPrefix("~/a/b/c.txt"));
548         assertEquals("~user/", FilenameUtils.getPrefix("~user/a/b/c.txt"));
549         
550         assertEquals("", FilenameUtils.getPrefix("a\\b\\c.txt"));
551         assertEquals("\\", FilenameUtils.getPrefix("\\a\\b\\c.txt"));
552         assertEquals("~\\", FilenameUtils.getPrefix("~\\a\\b\\c.txt"));
553         assertEquals("~user\\", FilenameUtils.getPrefix("~user\\a\\b\\c.txt"));
554     }
555 
556     public void testGetPath() {
557         assertEquals(null, FilenameUtils.getPath(null));
558         assertEquals("", FilenameUtils.getPath("noseperator.inthispath"));
559         assertEquals("a/b/", FilenameUtils.getPath("a/b/c.txt"));
560         assertEquals("a/b/", FilenameUtils.getPath("a/b/c"));
561         assertEquals("a/b/c/", FilenameUtils.getPath("a/b/c/"));
562         assertEquals("a\\b\\", FilenameUtils.getPath("a\\b\\c"));
563         
564         assertEquals(null, FilenameUtils.getPath(":"));
565         assertEquals(null, FilenameUtils.getPath("1:/a/b/c.txt"));
566         assertEquals(null, FilenameUtils.getPath("1:"));
567         assertEquals(null, FilenameUtils.getPath("1:a"));
568         assertEquals(null, FilenameUtils.getPath("///a/b/c.txt"));
569         assertEquals(null, FilenameUtils.getPath("//a"));
570         
571         assertEquals("", FilenameUtils.getPath(""));
572         assertEquals("", FilenameUtils.getPath("C:"));
573         assertEquals("", FilenameUtils.getPath("C:/"));
574         assertEquals("", FilenameUtils.getPath("//server/"));
575         assertEquals("", FilenameUtils.getPath("~"));
576         assertEquals("", FilenameUtils.getPath("~/"));
577         assertEquals("", FilenameUtils.getPath("~user"));
578         assertEquals("", FilenameUtils.getPath("~user/"));
579         
580         assertEquals("a/b/", FilenameUtils.getPath("a/b/c.txt"));
581         assertEquals("a/b/", FilenameUtils.getPath("/a/b/c.txt"));
582         assertEquals("", FilenameUtils.getPath("C:a"));
583         assertEquals("a/b/", FilenameUtils.getPath("C:a/b/c.txt"));
584         assertEquals("a/b/", FilenameUtils.getPath("C:/a/b/c.txt"));
585         assertEquals("a/b/", FilenameUtils.getPath("//server/a/b/c.txt"));
586         assertEquals("a/b/", FilenameUtils.getPath("~/a/b/c.txt"));
587         assertEquals("a/b/", FilenameUtils.getPath("~user/a/b/c.txt"));
588     }
589 
590     public void testGetPathNoEndSeparator() {
591         assertEquals(null, FilenameUtils.getPath(null));
592         assertEquals("", FilenameUtils.getPath("noseperator.inthispath"));
593         assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("a/b/c.txt"));
594         assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("a/b/c"));
595         assertEquals("a/b/c", FilenameUtils.getPathNoEndSeparator("a/b/c/"));
596         assertEquals("a\\b", FilenameUtils.getPathNoEndSeparator("a\\b\\c"));
597         
598         assertEquals(null, FilenameUtils.getPathNoEndSeparator(":"));
599         assertEquals(null, FilenameUtils.getPathNoEndSeparator("1:/a/b/c.txt"));
600         assertEquals(null, FilenameUtils.getPathNoEndSeparator("1:"));
601         assertEquals(null, FilenameUtils.getPathNoEndSeparator("1:a"));
602         assertEquals(null, FilenameUtils.getPathNoEndSeparator("///a/b/c.txt"));
603         assertEquals(null, FilenameUtils.getPathNoEndSeparator("//a"));
604         
605         assertEquals("", FilenameUtils.getPathNoEndSeparator(""));
606         assertEquals("", FilenameUtils.getPathNoEndSeparator("C:"));
607         assertEquals("", FilenameUtils.getPathNoEndSeparator("C:/"));
608         assertEquals("", FilenameUtils.getPathNoEndSeparator("//server/"));
609         assertEquals("", FilenameUtils.getPathNoEndSeparator("~"));
610         assertEquals("", FilenameUtils.getPathNoEndSeparator("~/"));
611         assertEquals("", FilenameUtils.getPathNoEndSeparator("~user"));
612         assertEquals("", FilenameUtils.getPathNoEndSeparator("~user/"));
613         
614         assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("a/b/c.txt"));
615         assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("/a/b/c.txt"));
616         assertEquals("", FilenameUtils.getPathNoEndSeparator("C:a"));
617         assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("C:a/b/c.txt"));
618         assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("C:/a/b/c.txt"));
619         assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("//server/a/b/c.txt"));
620         assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("~/a/b/c.txt"));
621         assertEquals("a/b", FilenameUtils.getPathNoEndSeparator("~user/a/b/c.txt"));
622     }
623 
624     public void testGetFullPath() {
625         assertEquals(null, FilenameUtils.getFullPath(null));
626         assertEquals("", FilenameUtils.getFullPath("noseperator.inthispath"));
627         assertEquals("a/b/", FilenameUtils.getFullPath("a/b/c.txt"));
628         assertEquals("a/b/", FilenameUtils.getFullPath("a/b/c"));
629         assertEquals("a/b/c/", FilenameUtils.getFullPath("a/b/c/"));
630         assertEquals("a\\b\\", FilenameUtils.getFullPath("a\\b\\c"));
631         
632         assertEquals(null, FilenameUtils.getFullPath(":"));
633         assertEquals(null, FilenameUtils.getFullPath("1:/a/b/c.txt"));
634         assertEquals(null, FilenameUtils.getFullPath("1:"));
635         assertEquals(null, FilenameUtils.getFullPath("1:a"));
636         assertEquals(null, FilenameUtils.getFullPath("///a/b/c.txt"));
637         assertEquals(null, FilenameUtils.getFullPath("//a"));
638         
639         assertEquals("", FilenameUtils.getFullPath(""));
640         assertEquals("C:", FilenameUtils.getFullPath("C:"));
641         assertEquals("C:/", FilenameUtils.getFullPath("C:/"));
642         assertEquals("//server/", FilenameUtils.getFullPath("//server/"));
643         assertEquals("~/", FilenameUtils.getFullPath("~"));
644         assertEquals("~/", FilenameUtils.getFullPath("~/"));
645         assertEquals("~user/", FilenameUtils.getFullPath("~user"));
646         assertEquals("~user/", FilenameUtils.getFullPath("~user/"));
647         
648         assertEquals("a/b/", FilenameUtils.getFullPath("a/b/c.txt"));
649         assertEquals("/a/b/", FilenameUtils.getFullPath("/a/b/c.txt"));
650         assertEquals("C:", FilenameUtils.getFullPath("C:a"));
651         assertEquals("C:a/b/", FilenameUtils.getFullPath("C:a/b/c.txt"));
652         assertEquals("C:/a/b/", FilenameUtils.getFullPath("C:/a/b/c.txt"));
653         assertEquals("//server/a/b/", FilenameUtils.getFullPath("//server/a/b/c.txt"));
654         assertEquals("~/a/b/", FilenameUtils.getFullPath("~/a/b/c.txt"));
655         assertEquals("~user/a/b/", FilenameUtils.getFullPath("~user/a/b/c.txt"));
656     }
657 
658     public void testGetFullPathNoEndSeparator() {
659         assertEquals(null, FilenameUtils.getFullPathNoEndSeparator(null));
660         assertEquals("", FilenameUtils.getFullPathNoEndSeparator("noseperator.inthispath"));
661         assertEquals("a/b", FilenameUtils.getFullPathNoEndSeparator("a/b/c.txt"));
662         assertEquals("a/b", FilenameUtils.getFullPathNoEndSeparator("a/b/c"));
663         assertEquals("a/b/c", FilenameUtils.getFullPathNoEndSeparator("a/b/c/"));
664         assertEquals("a\\b", FilenameUtils.getFullPathNoEndSeparator("a\\b\\c"));
665         
666         assertEquals(null, FilenameUtils.getFullPathNoEndSeparator(":"));
667         assertEquals(null, FilenameUtils.getFullPathNoEndSeparator("1:/a/b/c.txt"));
668         assertEquals(null, FilenameUtils.getFullPathNoEndSeparator("1:"));
669         assertEquals(null, FilenameUtils.getFullPathNoEndSeparator("1:a"));
670         assertEquals(null, FilenameUtils.getFullPathNoEndSeparator("///a/b/c.txt"));
671         assertEquals(null, FilenameUtils.getFullPathNoEndSeparator("//a"));
672         
673         assertEquals("", FilenameUtils.getFullPathNoEndSeparator(""));
674         assertEquals("C:", FilenameUtils.getFullPathNoEndSeparator("C:"));
675         assertEquals("C:/", FilenameUtils.getFullPathNoEndSeparator("C:/"));
676         assertEquals("//server/", FilenameUtils.getFullPathNoEndSeparator("//server/"));
677         assertEquals("~", FilenameUtils.getFullPathNoEndSeparator("~"));
678         assertEquals("~/", FilenameUtils.getFullPathNoEndSeparator("~/"));
679         assertEquals("~user", FilenameUtils.getFullPathNoEndSeparator("~user"));
680         assertEquals("~user/", FilenameUtils.getFullPathNoEndSeparator("~user/"));
681         
682         assertEquals("a/b", FilenameUtils.getFullPathNoEndSeparator("a/b/c.txt"));
683         assertEquals("/a/b", FilenameUtils.getFullPathNoEndSeparator("/a/b/c.txt"));
684         assertEquals("C:", FilenameUtils.getFullPathNoEndSeparator("C:a"));
685         assertEquals("C:a/b", FilenameUtils.getFullPathNoEndSeparator("C:a/b/c.txt"));
686         assertEquals("C:/a/b", FilenameUtils.getFullPathNoEndSeparator("C:/a/b/c.txt"));
687         assertEquals("//server/a/b", FilenameUtils.getFullPathNoEndSeparator("//server/a/b/c.txt"));
688         assertEquals("~/a/b", FilenameUtils.getFullPathNoEndSeparator("~/a/b/c.txt"));
689         assertEquals("~user/a/b", FilenameUtils.getFullPathNoEndSeparator("~user/a/b/c.txt"));
690     }
691 
692     public void testGetName() {
693         assertEquals(null, FilenameUtils.getName(null));
694         assertEquals("noseperator.inthispath", FilenameUtils.getName("noseperator.inthispath"));
695         assertEquals("c.txt", FilenameUtils.getName("a/b/c.txt"));
696         assertEquals("c", FilenameUtils.getName("a/b/c"));
697         assertEquals("", FilenameUtils.getName("a/b/c/"));
698         assertEquals("c", FilenameUtils.getName("a\\b\\c"));
699     }
700 
701     public void testGetBaseName() {
702         assertEquals(null, FilenameUtils.getBaseName(null));
703         assertEquals("noseperator", FilenameUtils.getBaseName("noseperator.inthispath"));
704         assertEquals("c", FilenameUtils.getBaseName("a/b/c.txt"));
705         assertEquals("c", FilenameUtils.getBaseName("a/b/c"));
706         assertEquals("", FilenameUtils.getBaseName("a/b/c/"));
707         assertEquals("c", FilenameUtils.getBaseName("a\\b\\c"));
708         assertEquals("file.txt", FilenameUtils.getBaseName("file.txt.bak"));
709     }
710 
711     public void testGetExtension() {
712         assertEquals(null, FilenameUtils.getExtension(null));
713         assertEquals("ext", FilenameUtils.getExtension("file.ext"));
714         assertEquals("", FilenameUtils.getExtension("README"));
715         assertEquals("com", FilenameUtils.getExtension("domain.dot.com"));
716         assertEquals("jpeg", FilenameUtils.getExtension("image.jpeg"));
717         assertEquals("", FilenameUtils.getExtension("a.b/c"));
718         assertEquals("txt", FilenameUtils.getExtension("a.b/c.txt"));
719         assertEquals("", FilenameUtils.getExtension("a/b/c"));
720         assertEquals("", FilenameUtils.getExtension("a.b\\c"));
721         assertEquals("txt", FilenameUtils.getExtension("a.b\\c.txt"));
722         assertEquals("", FilenameUtils.getExtension("a\\b\\c"));
723         assertEquals("", FilenameUtils.getExtension("C:\\temp\\foo.bar\\README"));
724         assertEquals("ext", FilenameUtils.getExtension("../filename.ext"));
725     }
726 
727     public void testRemoveExtension() {
728         assertEquals(null, FilenameUtils.removeExtension(null));
729         assertEquals("file", FilenameUtils.removeExtension("file.ext"));
730         assertEquals("README", FilenameUtils.removeExtension("README"));
731         assertEquals("domain.dot", FilenameUtils.removeExtension("domain.dot.com"));
732         assertEquals("image", FilenameUtils.removeExtension("image.jpeg"));
733         assertEquals("a.b/c", FilenameUtils.removeExtension("a.b/c"));
734         assertEquals("a.b/c", FilenameUtils.removeExtension("a.b/c.txt"));
735         assertEquals("a/b/c", FilenameUtils.removeExtension("a/b/c"));
736         assertEquals("a.b\\c", FilenameUtils.removeExtension("a.b\\c"));
737         assertEquals("a.b\\c", FilenameUtils.removeExtension("a.b\\c.txt"));
738         assertEquals("a\\b\\c", FilenameUtils.removeExtension("a\\b\\c"));
739         assertEquals("C:\\temp\\foo.bar\\README", FilenameUtils.removeExtension("C:\\temp\\foo.bar\\README"));
740         assertEquals("../filename", FilenameUtils.removeExtension("../filename.ext"));
741     }
742 
743     //-----------------------------------------------------------------------
744     public void testEquals() {
745         assertEquals(true, FilenameUtils.equals(null, null));
746         assertEquals(false, FilenameUtils.equals(null, ""));
747         assertEquals(false, FilenameUtils.equals("", null));
748         assertEquals(true, FilenameUtils.equals("", ""));
749         assertEquals(true, FilenameUtils.equals("file.txt", "file.txt"));
750         assertEquals(false, FilenameUtils.equals("file.txt", "FILE.TXT"));
751         assertEquals(false, FilenameUtils.equals("a\\b\\file.txt", "a/b/file.txt"));
752     }
753 
754     public void testEqualsOnSystem() {
755         assertEquals(true, FilenameUtils.equalsOnSystem(null, null));
756         assertEquals(false, FilenameUtils.equalsOnSystem(null, ""));
757         assertEquals(false, FilenameUtils.equalsOnSystem("", null));
758         assertEquals(true, FilenameUtils.equalsOnSystem("", ""));
759         assertEquals(true, FilenameUtils.equalsOnSystem("file.txt", "file.txt"));
760         assertEquals(WINDOWS, FilenameUtils.equalsOnSystem("file.txt", "FILE.TXT"));
761         assertEquals(false, FilenameUtils.equalsOnSystem("a\\b\\file.txt", "a/b/file.txt"));
762     }
763 
764     //-----------------------------------------------------------------------
765     public void testEqualsNormalized() {
766         assertEquals(true, FilenameUtils.equalsNormalized(null, null));
767         assertEquals(false, FilenameUtils.equalsNormalized(null, ""));
768         assertEquals(false, FilenameUtils.equalsNormalized("", null));
769         assertEquals(true, FilenameUtils.equalsNormalized("", ""));
770         assertEquals(true, FilenameUtils.equalsNormalized("file.txt", "file.txt"));
771         assertEquals(false, FilenameUtils.equalsNormalized("file.txt", "FILE.TXT"));
772         assertEquals(true, FilenameUtils.equalsNormalized("a\\b\\file.txt", "a/b/file.txt"));
773         assertEquals(false, FilenameUtils.equalsNormalized("a/b/", "a/b"));
774     }
775 
776     public void testEqualsNormalizedOnSystem() {
777         assertEquals(true, FilenameUtils.equalsNormalizedOnSystem(null, null));
778         assertEquals(false, FilenameUtils.equalsNormalizedOnSystem(null, ""));
779         assertEquals(false, FilenameUtils.equalsNormalizedOnSystem("", null));
780         assertEquals(true, FilenameUtils.equalsNormalizedOnSystem("", ""));
781         assertEquals(true, FilenameUtils.equalsNormalizedOnSystem("file.txt", "file.txt"));
782         assertEquals(WINDOWS, FilenameUtils.equalsNormalizedOnSystem("file.txt", "FILE.TXT"));
783         assertEquals(true, FilenameUtils.equalsNormalizedOnSystem("a\\b\\file.txt", "a/b/file.txt"));
784         assertEquals(false, FilenameUtils.equalsNormalizedOnSystem("a/b/", "a/b"));
785     }
786 
787     public void testEquals_fullControl() {
788         assertEquals(false, FilenameUtils.equals("file.txt", "FILE.TXT", true, IOCase.SENSITIVE));
789         assertEquals(true, FilenameUtils.equals("file.txt", "FILE.TXT", true, IOCase.INSENSITIVE));
790         assertEquals(WINDOWS, FilenameUtils.equals("file.txt", "FILE.TXT", true, IOCase.SYSTEM));
791         assertEquals(false, FilenameUtils.equals("file.txt", "FILE.TXT", true, null));
792     }
793 
794     //-----------------------------------------------------------------------
795     public void testIsExtension() {
796         assertEquals(false, FilenameUtils.isExtension(null, (String) null));
797         assertEquals(false, FilenameUtils.isExtension("file.txt", (String) null));
798         assertEquals(true, FilenameUtils.isExtension("file", (String) null));
799         assertEquals(false, FilenameUtils.isExtension("file.txt", ""));
800         assertEquals(true, FilenameUtils.isExtension("file", ""));
801         assertEquals(true, FilenameUtils.isExtension("file.txt", "txt"));
802         assertEquals(false, FilenameUtils.isExtension("file.txt", "rtf"));
803         
804         assertEquals(false, FilenameUtils.isExtension("a/b/file.txt", (String) null));
805         assertEquals(false, FilenameUtils.isExtension("a/b/file.txt", ""));
806         assertEquals(true, FilenameUtils.isExtension("a/b/file.txt", "txt"));
807         assertEquals(false, FilenameUtils.isExtension("a/b/file.txt", "rtf"));
808         
809         assertEquals(false, FilenameUtils.isExtension("a.b/file.txt", (String) null));
810         assertEquals(false, FilenameUtils.isExtension("a.b/file.txt", ""));
811         assertEquals(true, FilenameUtils.isExtension("a.b/file.txt", "txt"));
812         assertEquals(false, FilenameUtils.isExtension("a.b/file.txt", "rtf"));
813         
814         assertEquals(false, FilenameUtils.isExtension("a\\b\\file.txt", (String) null));
815         assertEquals(false, FilenameUtils.isExtension("a\\b\\file.txt", ""));
816         assertEquals(true, FilenameUtils.isExtension("a\\b\\file.txt", "txt"));
817         assertEquals(false, FilenameUtils.isExtension("a\\b\\file.txt", "rtf"));
818         
819         assertEquals(false, FilenameUtils.isExtension("a.b\\file.txt", (String) null));
820         assertEquals(false, FilenameUtils.isExtension("a.b\\file.txt", ""));
821         assertEquals(true, FilenameUtils.isExtension("a.b\\file.txt", "txt"));
822         assertEquals(false, FilenameUtils.isExtension("a.b\\file.txt", "rtf"));
823         
824         assertEquals(false, FilenameUtils.isExtension("a.b\\file.txt", "TXT"));
825     }
826 
827     public void testIsExtensionArray() {
828         assertEquals(false, FilenameUtils.isExtension(null, (String[]) null));
829         assertEquals(false, FilenameUtils.isExtension("file.txt", (String[]) null));
830         assertEquals(true, FilenameUtils.isExtension("file", (String[]) null));
831         assertEquals(false, FilenameUtils.isExtension("file.txt", new String[0]));
832         assertEquals(true, FilenameUtils.isExtension("file.txt", new String[] {"txt"}));
833         assertEquals(false, FilenameUtils.isExtension("file.txt", new String[] {"rtf"}));
834         assertEquals(true, FilenameUtils.isExtension("file", new String[] {"rtf", ""}));
835         assertEquals(true, FilenameUtils.isExtension("file.txt", new String[] {"rtf", "txt"}));
836         
837         assertEquals(false, FilenameUtils.isExtension("a/b/file.txt", (String[]) null));
838         assertEquals(false, FilenameUtils.isExtension("a/b/file.txt", new String[0]));
839         assertEquals(true, FilenameUtils.isExtension("a/b/file.txt", new String[] {"txt"}));
840         assertEquals(false, FilenameUtils.isExtension("a/b/file.txt", new String[] {"rtf"}));
841         assertEquals(true, FilenameUtils.isExtension("a/b/file.txt", new String[] {"rtf", "txt"}));
842         
843         assertEquals(false, FilenameUtils.isExtension("a.b/file.txt", (String[]) null));
844         assertEquals(false, FilenameUtils.isExtension("a.b/file.txt", new String[0]));
845         assertEquals(true, FilenameUtils.isExtension("a.b/file.txt", new String[] {"txt"}));
846         assertEquals(false, FilenameUtils.isExtension("a.b/file.txt", new String[] {"rtf"}));
847         assertEquals(true, FilenameUtils.isExtension("a.b/file.txt", new String[] {"rtf", "txt"}));
848         
849         assertEquals(false, FilenameUtils.isExtension("a\\b\\file.txt", (String[]) null));
850         assertEquals(false, FilenameUtils.isExtension("a\\b\\file.txt", new String[0]));
851         assertEquals(true, FilenameUtils.isExtension("a\\b\\file.txt", new String[] {"txt"}));
852         assertEquals(false, FilenameUtils.isExtension("a\\b\\file.txt", new String[] {"rtf"}));
853         assertEquals(true, FilenameUtils.isExtension("a\\b\\file.txt", new String[] {"rtf", "txt"}));
854         
855         assertEquals(false, FilenameUtils.isExtension("a.b\\file.txt", (String[]) null));
856         assertEquals(false, FilenameUtils.isExtension("a.b\\file.txt", new String[0]));
857         assertEquals(true, FilenameUtils.isExtension("a.b\\file.txt", new String[] {"txt"}));
858         assertEquals(false, FilenameUtils.isExtension("a.b\\file.txt", new String[] {"rtf"}));
859         assertEquals(true, FilenameUtils.isExtension("a.b\\file.txt", new String[] {"rtf", "txt"}));
860         
861         assertEquals(false, FilenameUtils.isExtension("a.b\\file.txt", new String[] {"TXT"}));
862         assertEquals(false, FilenameUtils.isExtension("a.b\\file.txt", new String[] {"TXT", "RTF"}));
863     }
864 
865     public void testIsExtensionCollection() {
866         assertEquals(false, FilenameUtils.isExtension(null, (Collection) null));
867         assertEquals(false, FilenameUtils.isExtension("file.txt", (Collection) null));
868         assertEquals(true, FilenameUtils.isExtension("file", (Collection) null));
869         assertEquals(false, FilenameUtils.isExtension("file.txt", new ArrayList()));
870         assertEquals(true, FilenameUtils.isExtension("file.txt", new ArrayList(Arrays.asList(new String[] {"txt"}))));
871         assertEquals(false, FilenameUtils.isExtension("file.txt", new ArrayList(Arrays.asList(new String[] {"rtf"}))));
872         assertEquals(true, FilenameUtils.isExtension("file", new ArrayList(Arrays.asList(new String[] {"rtf", ""}))));
873         assertEquals(true, FilenameUtils.isExtension("file.txt", new ArrayList(Arrays.asList(new String[] {"rtf", "txt"}))));
874         
875         assertEquals(false, FilenameUtils.isExtension("a/b/file.txt", (Collection) null));
876         assertEquals(false, FilenameUtils.isExtension("a/b/file.txt", new ArrayList()));
877         assertEquals(true, FilenameUtils.isExtension("a/b/file.txt", new ArrayList(Arrays.asList(new String[] {"txt"}))));
878         assertEquals(false, FilenameUtils.isExtension("a/b/file.txt", new ArrayList(Arrays.asList(new String[] {"rtf"}))));
879         assertEquals(true, FilenameUtils.isExtension("a/b/file.txt", new ArrayList(Arrays.asList(new String[] {"rtf", "txt"}))));
880         
881         assertEquals(false, FilenameUtils.isExtension("a.b/file.txt", (Collection) null));
882         assertEquals(false, FilenameUtils.isExtension("a.b/file.txt", new ArrayList()));
883         assertEquals(true, FilenameUtils.isExtension("a.b/file.txt", new ArrayList(Arrays.asList(new String[] {"txt"}))));
884         assertEquals(false, FilenameUtils.isExtension("a.b/file.txt", new ArrayList(Arrays.asList(new String[] {"rtf"}))));
885         assertEquals(true, FilenameUtils.isExtension("a.b/file.txt", new ArrayList(Arrays.asList(new String[] {"rtf", "txt"}))));
886         
887         assertEquals(false, FilenameUtils.isExtension("a\\b\\file.txt", (Collection) null));
888         assertEquals(false, FilenameUtils.isExtension("a\\b\\file.txt", new ArrayList()));
889         assertEquals(true, FilenameUtils.isExtension("a\\b\\file.txt", new ArrayList(Arrays.asList(new String[] {"txt"}))));
890         assertEquals(false, FilenameUtils.isExtension("a\\b\\file.txt", new ArrayList(Arrays.asList(new String[] {"rtf"}))));
891         assertEquals(true, FilenameUtils.isExtension("a\\b\\file.txt", new ArrayList(Arrays.asList(new String[] {"rtf", "txt"}))));
892         
893         assertEquals(false, FilenameUtils.isExtension("a.b\\file.txt", (Collection) null));
894         assertEquals(false, FilenameUtils.isExtension("a.b\\file.txt", new ArrayList()));
895         assertEquals(true, FilenameUtils.isExtension("a.b\\file.txt", new ArrayList(Arrays.asList(new String[] {"txt"}))));
896         assertEquals(false, FilenameUtils.isExtension("a.b\\file.txt", new ArrayList(Arrays.asList(new String[] {"rtf"}))));
897         assertEquals(true, FilenameUtils.isExtension("a.b\\file.txt", new ArrayList(Arrays.asList(new String[] {"rtf", "txt"}))));
898         
899         assertEquals(false, FilenameUtils.isExtension("a.b\\file.txt", new ArrayList(Arrays.asList(new String[] {"TXT"}))));
900         assertEquals(false, FilenameUtils.isExtension("a.b\\file.txt", new ArrayList(Arrays.asList(new String[] {"TXT", "RTF"}))));
901     }
902 
903 }