001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.commons.io.filefilter;
018
019import java.io.File;
020import java.util.ArrayList;
021import java.util.List;
022
023public abstract class ConditionalFileFilterAbstractTestCase
024  extends IOFileFilterAbstractTestCase {
025
026  private static final String TEST_FILE_NAME_PREFIX = "TestFile";
027  private static final String TEST_FILE_TYPE = ".tst";
028
029  protected TesterTrueFileFilter[] trueFilters;
030  protected TesterFalseFileFilter[] falseFilters;
031
032  private File file;
033  private File workingPath;
034
035  public ConditionalFileFilterAbstractTestCase(final String name) {
036    super(name);
037  }
038
039  @Override
040  public void setUp() throws Exception {
041    this.workingPath = this.determineWorkingDirectoryPath(this.getWorkingPathNamePropertyKey(), this.getDefaultWorkingPath());
042    this.file = new File(this.workingPath, TEST_FILE_NAME_PREFIX + 1 + TEST_FILE_TYPE);
043    this.trueFilters = new TesterTrueFileFilter[4];
044    this.falseFilters = new TesterFalseFileFilter[4];
045    this.trueFilters[1] = new TesterTrueFileFilter();
046    this.trueFilters[2] = new TesterTrueFileFilter();
047    this.trueFilters[3] = new TesterTrueFileFilter();
048    this.falseFilters[1] = new TesterFalseFileFilter();
049    this.falseFilters[2] = new TesterFalseFileFilter();
050    this.falseFilters[3] = new TesterFalseFileFilter();
051  }
052
053  public void testAdd() {
054    final List<TesterTrueFileFilter> filters = new ArrayList<TesterTrueFileFilter>();
055    final ConditionalFileFilter fileFilter = this.getConditionalFileFilter();
056    filters.add(new TesterTrueFileFilter());
057    filters.add(new TesterTrueFileFilter());
058    filters.add(new TesterTrueFileFilter());
059    filters.add(new TesterTrueFileFilter());
060    for(int i = 0; i < filters.size(); i++) {
061      assertEquals("file filters count: ", i, fileFilter.getFileFilters().size());
062      fileFilter.addFileFilter(filters.get(i));
063      assertEquals("file filters count: ", i+1, fileFilter.getFileFilters().size());
064    }
065    for (final IOFileFilter filter : fileFilter.getFileFilters()) {
066      assertTrue("found file filter", filters.contains(filter));
067    }
068    assertEquals("file filters count", filters.size(), fileFilter.getFileFilters().size());
069  }
070
071  public void testRemove() {
072    final List<TesterTrueFileFilter> filters = new ArrayList<TesterTrueFileFilter>();
073    final ConditionalFileFilter fileFilter = this.getConditionalFileFilter();
074    filters.add(new TesterTrueFileFilter());
075    filters.add(new TesterTrueFileFilter());
076    filters.add(new TesterTrueFileFilter());
077    filters.add(new TesterTrueFileFilter());
078    for(int i = 0; i < filters.size(); i++) {
079      fileFilter.removeFileFilter(filters.get(i));
080      assertTrue("file filter removed", !fileFilter.getFileFilters().contains(filters.get(i)));
081    }
082    assertEquals("file filters count", 0, fileFilter.getFileFilters().size());
083  }
084
085  public void testNoFilters() throws Exception {
086    final ConditionalFileFilter fileFilter = this.getConditionalFileFilter();
087    final File file = new File(this.workingPath, TEST_FILE_NAME_PREFIX + 1 + TEST_FILE_TYPE);
088    assertFileFiltering(1, (IOFileFilter) fileFilter, file, false);
089    assertFilenameFiltering(1, (IOFileFilter) fileFilter, file, false);
090  }
091
092  public void testFilterBuiltUsingConstructor() throws Exception {
093    final List<List<IOFileFilter>> testFilters = this.getTestFilters();
094    final List<boolean []> testTrueResults = this.getTrueResults();
095    final List<boolean []> testFalseResults = this.getFalseResults();
096    final List<Boolean> testFileResults = this.getFileResults();
097    final List<Boolean> testFilenameResults = this.getFilenameResults();
098
099    for(int i = 1; i < testFilters.size(); i++) {
100      final List<IOFileFilter> filters = testFilters.get(i);
101      final boolean[] trueResults = testTrueResults.get(i);
102      final boolean[] falseResults = testFalseResults.get(i);
103      final boolean fileResults = testFileResults.get(i).booleanValue();
104      final boolean filenameResults = testFilenameResults.get(i).booleanValue();
105
106      // Test conditional AND filter created by passing filters to the constructor
107      final IOFileFilter filter = this.buildFilterUsingConstructor(filters);
108
109      // Test as a file filter
110      this.resetTrueFilters(this.trueFilters);
111      this.resetFalseFilters(this.falseFilters);
112      this.assertFileFiltering(i, filter, this.file, fileResults);
113      this.assertTrueFiltersInvoked(i, trueFilters, trueResults);
114      this.assertFalseFiltersInvoked(i, falseFilters, falseResults);
115
116      // Test as a filename filter
117      this.resetTrueFilters(this.trueFilters);
118      this.resetFalseFilters(this.falseFilters);
119      this.assertFilenameFiltering(i, filter, this.file, filenameResults);
120      this.assertTrueFiltersInvoked(i, trueFilters, trueResults);
121      this.assertFalseFiltersInvoked(i, falseFilters, falseResults);
122    }
123  }
124
125  public void testFilterBuiltUsingAdd() throws Exception {
126    final List<List<IOFileFilter>> testFilters = this.getTestFilters();
127    final List<boolean[]> testTrueResults = this.getTrueResults();
128    final List<boolean[]> testFalseResults = this.getFalseResults();
129    final List<Boolean> testFileResults = this.getFileResults();
130    final List<Boolean> testFilenameResults = this.getFilenameResults();
131
132    for(int i = 1; i < testFilters.size(); i++) {
133      final List<IOFileFilter> filters = testFilters.get(i);
134      final boolean[] trueResults = testTrueResults.get(i);
135      final boolean[] falseResults = testFalseResults.get(i);
136      final boolean fileResults = testFileResults.get(i).booleanValue();
137      final boolean filenameResults = testFilenameResults.get(i).booleanValue();
138
139      // Test conditional AND filter created by passing filters to the constructor
140      final IOFileFilter filter = this.buildFilterUsingAdd(filters);
141
142      // Test as a file filter
143      this.resetTrueFilters(this.trueFilters);
144      this.resetFalseFilters(this.falseFilters);
145      this.assertFileFiltering(i, filter, this.file, fileResults);
146      this.assertTrueFiltersInvoked(i, trueFilters, trueResults);
147      this.assertFalseFiltersInvoked(i, falseFilters, falseResults);
148
149      // Test as a filename filter
150      this.resetTrueFilters(this.trueFilters);
151      this.resetFalseFilters(this.falseFilters);
152      this.assertFilenameFiltering(i, filter, this.file, filenameResults);
153      this.assertTrueFiltersInvoked(i, trueFilters, trueResults);
154      this.assertFalseFiltersInvoked(i, falseFilters, falseResults);
155    }
156  }
157
158  protected abstract ConditionalFileFilter getConditionalFileFilter();
159  protected abstract IOFileFilter buildFilterUsingAdd(List<IOFileFilter> filters);
160  protected abstract IOFileFilter buildFilterUsingConstructor(List<IOFileFilter> filters);
161  protected abstract List<List<IOFileFilter>> getTestFilters();
162  protected abstract List<boolean[]> getTrueResults();
163  protected abstract List<boolean[]> getFalseResults();
164  protected abstract List<Boolean> getFileResults();
165  protected abstract List<Boolean> getFilenameResults();
166  protected abstract String getWorkingPathNamePropertyKey();
167  protected abstract String getDefaultWorkingPath();
168}