1   /*
2       StatCvs - CVS statistics generation 
3       Copyright (C) 2002  Lukasz Pekacki <lukasz@pekacki.de>
4       http://statcvs.sf.net/
5       
6       This library is free software; you can redistribute it and/or
7       modify it under the terms of the GNU Lesser General Public
8       License as published by the Free Software Foundation; either
9       version 2.1 of the License, or (at your option) any later version.
10  
11      This library is distributed in the hope that it will be useful,
12      but WITHOUT ANY WARRANTY; without even the implied warranty of
13      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14      Lesser General Public License for more details.
15  
16      You should have received a copy of the GNU Lesser General Public
17      License along with this library; if not, write to the Free Software
18      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19      
20  	$Name:  $ 
21  	Created on $Date: 2008/04/02 11:22:15 $ 
22  */
23  package net.sf.statcvs.util;
24  
25  import junit.framework.TestCase;
26  
27  /**
28   * Test cases for {@link FilePatternMatcher}
29   *
30   * @author Richard Cyganiak
31   * @version $Id: FilePatternMatcherTest.java,v 1.2 2008/04/02 11:22:15 benoitx Exp $
32   */
33  public class FilePatternMatcherTest extends TestCase {
34  
35      /**
36       * Constructor for OutputUtilsTest.
37       * @param arg0 input 
38       */
39      public FilePatternMatcherTest(final String arg0) {
40          super(arg0);
41      }
42  
43      /**
44       * Test a pattern without wildcards
45       */
46      public void testSimplePattern() {
47          final FilePatternMatcher fpm = new FilePatternMatcher("test");
48          assertTrue(fpm.matches("test"));
49          assertTrue(!fpm.matches("foo"));
50          assertTrue(!fpm.matches("atest"));
51          assertTrue(!fpm.matches("testa"));
52          assertTrue(!fpm.matches("test/test"));
53          assertTrue(!fpm.matches("/test"));
54          assertTrue(!fpm.matches("test/"));
55      }
56  
57      /**
58       * Test a pattern with a ? wildcard, matching exactly one char
59       */
60      public void testQuestionMarkPattern1() {
61          final FilePatternMatcher fpm = new FilePatternMatcher("test?");
62          assertTrue(fpm.matches("test1"));
63          assertTrue(fpm.matches("test2"));
64          assertTrue(fpm.matches("test "));
65          assertTrue(fpm.matches("test?"));
66          assertTrue(fpm.matches("test*"));
67          assertTrue(!fpm.matches("foo"));
68          assertTrue(!fpm.matches("atest"));
69          assertTrue(!fpm.matches("test11"));
70          assertTrue(!fpm.matches("test/test"));
71          assertTrue(!fpm.matches("/test"));
72          assertTrue(!fpm.matches("test/"));
73      }
74  
75      /**
76       * Test a pattern with a ??? wildcard, matching exactly three chars
77       */
78      public void testQuestionMarkPattern2() {
79          final FilePatternMatcher fpm = new FilePatternMatcher("???");
80          assertTrue(fpm.matches("abc"));
81          assertTrue(fpm.matches("123"));
82          assertTrue(fpm.matches("   "));
83          assertTrue(!fpm.matches("1234"));
84          assertTrue(!fpm.matches("///"));
85          assertTrue(!fpm.matches("/123"));
86          assertTrue(!fpm.matches("123/"));
87      }
88  
89      /**
90       * Test a pattern with a * wildcard, matching any character sequence
91       * not containing /
92       */
93      public void testAsteriskPattern1() {
94          final FilePatternMatcher fpm = new FilePatternMatcher("*.java");
95          assertTrue(fpm.matches(".java"));
96          assertTrue(fpm.matches("AllTests.java"));
97          assertTrue(fpm.matches("FilePatternMatcher.java"));
98          assertTrue(!fpm.matches("foo"));
99          assertTrue(!fpm.matches("java"));
100         assertTrue(!fpm.matches("dir/AllTests.java"));
101         assertTrue(!fpm.matches("AllTests.java/foo"));
102     }
103 
104     /**
105      * Test a pattern with a * wildcard, matching any character sequence
106      * not containing /
107      */
108     public void testAsteriskPattern2() {
109         final FilePatternMatcher fpm = new FilePatternMatcher("*");
110         assertTrue(fpm.matches("AllTests.java"));
111         assertTrue(!fpm.matches("foo/bar"));
112     }
113 
114     /**
115      * Test a pattern with a * wildcard, matching any character sequence
116      * not containing /
117      */
118     public void testAsteriskPattern3() {
119         final FilePatternMatcher fpm = new FilePatternMatcher("A*T**.java");
120         assertTrue(fpm.matches("AT.java"));
121         assertTrue(fpm.matches("AllTests.java"));
122         assertTrue(!fpm.matches("All.java"));
123         assertTrue(!fpm.matches("java"));
124         assertTrue(!fpm.matches("A"));
125         assertTrue(!fpm.matches("AllTests/.java"));
126     }
127 
128     /**
129      * Test a pattern ending with /**, matching nothing or any file within
130      * any subdirectory
131      */
132     public void testDirWildcardEnd() {
133         final FilePatternMatcher fpm = new FilePatternMatcher("src/**");
134         assertTrue(fpm.matches("src"));
135         assertTrue(fpm.matches("src/foo"));
136         assertTrue(fpm.matches("src/foo/bar"));
137         assertTrue(fpm.matches("src/src"));
138         assertTrue(!fpm.matches("foo"));
139         assertTrue(!fpm.matches("foo/src"));
140         assertTrue(!fpm.matches("src1"));
141         assertTrue(!fpm.matches("src1/foo"));
142     }
143 
144     /**
145      * Test a pattern ending with /, which is shorthand for /** and matches
146      * the same files.
147      */
148     public void testImplicitDirWildcardEnd() {
149         final FilePatternMatcher fpm = new FilePatternMatcher("src/");
150         assertTrue(fpm.matches("src"));
151         assertTrue(fpm.matches("src/foo"));
152         assertTrue(fpm.matches("src/foo/bar"));
153         assertTrue(fpm.matches("src/src"));
154         assertTrue(!fpm.matches("foo"));
155         assertTrue(!fpm.matches("foo/src"));
156         assertTrue(!fpm.matches("src1"));
157         assertTrue(!fpm.matches("src1/foo"));
158     }
159 
160     /**
161      * Test a pattern beginning with asterisk asterisk slash, matching
162      * nothing or any directory
163      */
164     public void testDirWildcardBegin() {
165         final FilePatternMatcher fpm = new FilePatternMatcher("**/AllTests.java");
166         assertTrue(fpm.matches("AllTests.java"));
167         assertTrue(fpm.matches("src/AllTests.java"));
168         assertTrue(fpm.matches("src/foo/AllTests.java"));
169         assertTrue(fpm.matches("AllTests.java/AllTests.java"));
170         assertTrue(!fpm.matches("foo"));
171         assertTrue(!fpm.matches("ReallyAllTests.java"));
172         assertTrue(!fpm.matches("foo/bar"));
173         assertTrue(!fpm.matches("foo/AllTests.java/bar"));
174     }
175 
176     /**
177      * directory wildcards ** are not allowed in combination with filenames,
178      * so they are interpreted as two normal asterisk wildcards
179      */
180     public void testBogus1() {
181         final FilePatternMatcher fpm = new FilePatternMatcher("**AllTests.java");
182         assertTrue(fpm.matches("ReallyAllTests.java"));
183         assertTrue(!fpm.matches("src/AllTests.java"));
184     }
185 
186     /**
187      * Test a pattern with a ** wildcard, matching zero or more directories
188      */
189     public void testDirWildcard() {
190         final FilePatternMatcher fpm = new FilePatternMatcher("src/**/AllTests.java");
191         assertTrue(fpm.matches("src/AllTests.java"));
192         assertTrue(fpm.matches("src/foo/AllTests.java"));
193         assertTrue(fpm.matches("src/foo/bar/AllTests.java"));
194         assertTrue(!fpm.matches("srcAllTests.java"));
195         assertTrue(!fpm.matches("1src/AllTests.java"));
196         assertTrue(!fpm.matches("foo/src/AllTests.java"));
197         assertTrue(!fpm.matches("src/AllTests.java1"));
198     }
199 
200     /**
201      * Test a really complex pattern
202      */
203     public void testComplexPattern() {
204         final FilePatternMatcher fpm = new FilePatternMatcher("**/*o*/**/*a*/**/");
205         assertTrue(fpm.matches("o/a"));
206         assertTrue(fpm.matches("1o1/1a1"));
207         assertTrue(fpm.matches("1/2/3/1o1/4/5/6/1a1/7/8/9"));
208         assertTrue(!fpm.matches("1/2/3/a/4/5/6/o/7/8/9"));
209     }
210 
211     /**
212      * Test a pattern list with : as delimiter
213      */
214     public void testMultiplePatterns1() {
215         final FilePatternMatcher fpm = new FilePatternMatcher("a:b:c");
216         assertTrue(!fpm.matches("a:b:c"));
217         assertTrue(fpm.matches("a"));
218         assertTrue(fpm.matches("b"));
219         assertTrue(fpm.matches("c"));
220         assertTrue(!fpm.matches("d"));
221     }
222 
223     /**
224      * Test a pattern list with ; as delimiter
225      */
226     public void testMultiplePatterns2() {
227         final FilePatternMatcher fpm = new FilePatternMatcher("a;b;c");
228         assertTrue(!fpm.matches("a;b;c"));
229         assertTrue(fpm.matches("a"));
230         assertTrue(fpm.matches("b"));
231         assertTrue(fpm.matches("c"));
232         assertTrue(!fpm.matches("d"));
233     }
234 }