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