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    *      https://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 = getWorkingDirectoryPath(getWorkingPathNamePropertyKey(), 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      void testAdd() {
77          final List<TesterTrueFileFilter> filters = new ArrayList<>();
78          final ConditionalFileFilter fileFilter = 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 -> assertTrue(filters.contains(filter), "found file filter"));
89          assertEquals(filters.size(), fileFilter.getFileFilters().size(), "file filters count");
90      }
91  
92      @Test
93      void testFilterBuiltUsingAdd() {
94          final List<List<IOFileFilter>> testFilters = getTestFilters();
95          final List<boolean[]> testTrueResults = getTrueResults();
96          final List<boolean[]> testFalseResults = getFalseResults();
97          final List<Boolean> testFileResults = getFileResults();
98          final List<Boolean> testFilenameResults = getFilenameResults();
99  
100         for (int i = 1; i < testFilters.size(); i++) {
101             final List<IOFileFilter> filters = testFilters.get(i);
102             final boolean[] trueResults = testTrueResults.get(i);
103             final boolean[] falseResults = testFalseResults.get(i);
104             final boolean fileResults = testFileResults.get(i);
105             final boolean fileNameResults = testFilenameResults.get(i);
106 
107             // Test conditional AND filter created by passing filters to the constructor
108             final IOFileFilter filter = buildFilterUsingAdd(filters);
109 
110             // Test as a file filter
111             resetTrueFilters(this.trueFilters);
112             resetFalseFilters(this.falseFilters);
113             assertFileFiltering(i, filter, this.file, fileResults);
114             assertTrueFiltersInvoked(i, trueFilters, trueResults);
115             assertFalseFiltersInvoked(i, falseFilters, falseResults);
116 
117             // Test as a file name filter
118             resetTrueFilters(this.trueFilters);
119             resetFalseFilters(this.falseFilters);
120             assertFilenameFiltering(i, filter, this.file, fileNameResults);
121             assertTrueFiltersInvoked(i, trueFilters, trueResults);
122             assertFalseFiltersInvoked(i, falseFilters, falseResults);
123         }
124     }
125 
126     @Test
127     void testFilterBuiltUsingConstructor() {
128         final List<List<IOFileFilter>> testFilters = getTestFilters();
129         final List<boolean[]> testTrueResults = getTrueResults();
130         final List<boolean[]> testFalseResults = getFalseResults();
131         final List<Boolean> testFileResults = getFileResults();
132         final List<Boolean> testFilenameResults = getFilenameResults();
133 
134         for (int i = 1; i < testFilters.size(); i++) {
135             final List<IOFileFilter> filters = testFilters.get(i);
136             final boolean[] trueResults = testTrueResults.get(i);
137             final boolean[] falseResults = testFalseResults.get(i);
138             final boolean fileResults = testFileResults.get(i);
139             final boolean fileNameResults = testFilenameResults.get(i);
140 
141             // Test conditional AND filter created by passing filters to the constructor
142             final IOFileFilter filter = buildFilterUsingConstructor(filters);
143 
144             // Test as a file filter
145             resetTrueFilters(this.trueFilters);
146             resetFalseFilters(this.falseFilters);
147             assertFileFiltering(i, filter, this.file, fileResults);
148             assertTrueFiltersInvoked(i, trueFilters, trueResults);
149             assertFalseFiltersInvoked(i, falseFilters, falseResults);
150 
151             // Test as a file name filter
152             resetTrueFilters(this.trueFilters);
153             resetFalseFilters(this.falseFilters);
154             assertFilenameFiltering(i, filter, this.file, fileNameResults);
155             assertTrueFiltersInvoked(i, trueFilters, trueResults);
156             assertFalseFiltersInvoked(i, falseFilters, falseResults);
157         }
158     }
159 
160     @Test
161     void testNoFilters() {
162         final ConditionalFileFilter fileFilter = getConditionalFileFilter();
163         final File file = new File(this.workingPath, TEST_FILE_NAME_PREFIX + 1 + TEST_FILE_TYPE);
164         assertFileFiltering(1, (IOFileFilter) fileFilter, file, false);
165         assertFilenameFiltering(1, (IOFileFilter) fileFilter, file, false);
166     }
167 
168     @Test
169     void testRemove() {
170         final List<TesterTrueFileFilter> filters = new ArrayList<>();
171         final ConditionalFileFilter fileFilter = getConditionalFileFilter();
172         filters.add(new TesterTrueFileFilter());
173         filters.add(new TesterTrueFileFilter());
174         filters.add(new TesterTrueFileFilter());
175         filters.add(new TesterTrueFileFilter());
176         filters.forEach(filter -> {
177             fileFilter.removeFileFilter(filter);
178             assertFalse(fileFilter.getFileFilters().contains(filter), "file filter removed");
179         });
180         assertEquals(0, fileFilter.getFileFilters().size(), "file filters count");
181     }
182 }