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.filefilter;
18  
19  import java.io.File;
20  import java.util.ArrayList;
21  import java.util.Iterator;
22  import java.util.List;
23  
24  public abstract class ConditionalFileFilterAbstractTestCase
25    extends IOFileFilterAbstractTestCase {
26      
27    private static final String TEST_FILE_NAME_PREFIX = "TestFile";
28    private static final String TEST_FILE_TYPE = ".tst";
29    
30    protected TesterTrueFileFilter[] trueFilters;
31    protected TesterFalseFileFilter[] falseFilters;
32    
33    private File file;
34    private File workingPath;
35    
36    public ConditionalFileFilterAbstractTestCase(final String name) {
37      super(name);
38    }
39    
40    public void setUp() throws Exception {
41      this.workingPath = this.determineWorkingDirectoryPath(this.getWorkingPathNamePropertyKey(), this.getDefaultWorkingPath());
42      this.file = new File(this.workingPath, TEST_FILE_NAME_PREFIX + 1 + TEST_FILE_TYPE);
43      this.trueFilters = new TesterTrueFileFilter[4];
44      this.falseFilters = new TesterFalseFileFilter[4];
45      this.trueFilters[1] = new TesterTrueFileFilter();
46      this.trueFilters[2] = new TesterTrueFileFilter();
47      this.trueFilters[3] = new TesterTrueFileFilter();
48      this.falseFilters[1] = new TesterFalseFileFilter();
49      this.falseFilters[2] = new TesterFalseFileFilter();
50      this.falseFilters[3] = new TesterFalseFileFilter();
51    }
52    
53    public void testAdd() {
54      List filters = new ArrayList();
55      ConditionalFileFilter fileFilter = this.getConditionalFileFilter();
56      filters.add(new TesterTrueFileFilter());
57      filters.add(new TesterTrueFileFilter());
58      filters.add(new TesterTrueFileFilter());
59      filters.add(new TesterTrueFileFilter());
60      for(int i = 0; i < filters.size(); i++) {
61        assertEquals("file filters count: ", i, fileFilter.getFileFilters().size());
62        fileFilter.addFileFilter((IOFileFilter) filters.get(i));
63        assertEquals("file filters count: ", i+1, fileFilter.getFileFilters().size());
64      }
65      for(Iterator iter = fileFilter.getFileFilters().iterator(); iter.hasNext();) {
66        IOFileFilter filter = (IOFileFilter) iter.next();
67        assertTrue("found file filter", filters.contains(filter));
68      }
69      assertEquals("file filters count", filters.size(), fileFilter.getFileFilters().size());
70    }
71    
72    public void testRemove() {
73      List filters = new ArrayList();
74      ConditionalFileFilter fileFilter = this.getConditionalFileFilter();
75      filters.add(new TesterTrueFileFilter());
76      filters.add(new TesterTrueFileFilter());
77      filters.add(new TesterTrueFileFilter());
78      filters.add(new TesterTrueFileFilter());
79      for(int i = 0; i < filters.size(); i++) {
80        fileFilter.removeFileFilter((IOFileFilter) filters.get(i));
81        assertTrue("file filter removed", !fileFilter.getFileFilters().contains((IOFileFilter) filters.get(i)));
82      }
83      assertEquals("file filters count", 0, fileFilter.getFileFilters().size());
84    }
85  
86    public void testNoFilters() throws Exception {
87      ConditionalFileFilter fileFilter = this.getConditionalFileFilter();
88      File file = new File(this.workingPath, TEST_FILE_NAME_PREFIX + 1 + TEST_FILE_TYPE);
89      assertFileFiltering(1, (IOFileFilter) fileFilter, file, false);
90      assertFilenameFiltering(1, (IOFileFilter) fileFilter, file, false);
91    }
92    
93    public void testFilterBuiltUsingConstructor() throws Exception {
94      List testFilters = this.getTestFilters();
95      List testTrueResults = this.getTrueResults();
96      List testFalseResults = this.getFalseResults();
97      List testFileResults = this.getFileResults();
98      List testFilenameResults = this.getFilenameResults();
99      
100     for(int i = 1; i < testFilters.size(); i++) {
101       List filters = (List) testFilters.get(i);
102       boolean[] trueResults = (boolean []) testTrueResults.get(i);
103       boolean[] falseResults = (boolean []) testFalseResults.get(i);
104       boolean fileResults = ((Boolean) testFileResults.get(i)).booleanValue();
105       boolean filenameResults = ((Boolean) testFilenameResults.get(i)).booleanValue();
106 
107       // Test conditional AND filter created by passing filters to the constructor
108       IOFileFilter filter = this.buildFilterUsingConstructor(filters);
109       
110       // Test as a file filter
111       this.resetTrueFilters(this.trueFilters);
112       this.resetFalseFilters(this.falseFilters);
113       this.assertFileFiltering(i, filter, this.file, fileResults);
114       this.assertTrueFiltersInvoked(i, trueFilters, trueResults);
115       this.assertFalseFiltersInvoked(i, falseFilters, falseResults);
116 
117       // Test as a filename filter
118       this.resetTrueFilters(this.trueFilters);
119       this.resetFalseFilters(this.falseFilters);
120       this.assertFilenameFiltering(i, filter, this.file, filenameResults);
121       this.assertTrueFiltersInvoked(i, trueFilters, trueResults);
122       this.assertFalseFiltersInvoked(i, falseFilters, falseResults);
123     }
124   }
125   
126   public void testFilterBuiltUsingAdd() throws Exception {
127     List testFilters = this.getTestFilters();
128     List testTrueResults = this.getTrueResults();
129     List testFalseResults = this.getFalseResults();
130     List testFileResults = this.getFileResults();
131     List testFilenameResults = this.getFilenameResults();
132     
133     for(int i = 1; i < testFilters.size(); i++) {
134       List filters = (List) testFilters.get(i);
135       boolean[] trueResults = (boolean []) testTrueResults.get(i);
136       boolean[] falseResults = (boolean []) testFalseResults.get(i);
137       boolean fileResults = ((Boolean) testFileResults.get(i)).booleanValue();
138       boolean filenameResults = ((Boolean) testFilenameResults.get(i)).booleanValue();
139 
140       // Test conditional AND filter created by passing filters to the constructor
141       IOFileFilter filter = this.buildFilterUsingAdd(filters);
142       
143       // Test as a file filter
144       this.resetTrueFilters(this.trueFilters);
145       this.resetFalseFilters(this.falseFilters);
146       this.assertFileFiltering(i, filter, this.file, fileResults);
147       this.assertTrueFiltersInvoked(i, trueFilters, trueResults);
148       this.assertFalseFiltersInvoked(i, falseFilters, falseResults);
149 
150       // Test as a filename filter
151       this.resetTrueFilters(this.trueFilters);
152       this.resetFalseFilters(this.falseFilters);
153       this.assertFilenameFiltering(i, filter, this.file, filenameResults);
154       this.assertTrueFiltersInvoked(i, trueFilters, trueResults);
155       this.assertFalseFiltersInvoked(i, falseFilters, falseResults);
156     }
157   }
158 
159   protected abstract ConditionalFileFilter getConditionalFileFilter();
160   protected abstract IOFileFilter buildFilterUsingAdd(List filters);
161   protected abstract IOFileFilter buildFilterUsingConstructor(List filters);
162   protected abstract List getTestFilters();
163   protected abstract List getTrueResults();
164   protected abstract List getFalseResults();
165   protected abstract List getFileResults();
166   protected abstract List getFilenameResults();
167   protected abstract String getWorkingPathNamePropertyKey();
168   protected abstract String getDefaultWorkingPath();
169 }