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  
18  package org.apache.commons.io.function;
19  
20  import static org.junit.jupiter.api.Assertions.assertEquals;
21  import static org.junit.jupiter.api.Assertions.assertFalse;
22  import static org.junit.jupiter.api.Assertions.assertSame;
23  import static org.junit.jupiter.api.Assertions.assertThrows;
24  import static org.junit.jupiter.api.Assertions.assertTrue;
25  
26  import java.io.IOException;
27  import java.io.UncheckedIOException;
28  import java.nio.file.Files;
29  import java.nio.file.Path;
30  import java.nio.file.Paths;
31  import java.util.ArrayList;
32  import java.util.List;
33  import java.util.function.Predicate;
34  
35  import org.junit.jupiter.api.Test;
36  import org.junit.jupiter.api.function.Executable;
37  
38  /**
39   * Tests {@link IOPredicate}.
40   */
41  class IOPredicateTest {
42  
43      /** Files::isHidden throws IOException. */
44      private static final IOPredicate<Path> IS_HIDDEN = Files::isHidden;
45  
46      private static final Path PATH_FIXTURE = Paths.get("src/test/resources/org/apache/commons/io/abitmorethan16k.txt");
47  
48      private static final Object THROWING_EQUALS = new Object() {
49          @Override
50          public boolean equals(final Object obj) {
51              throw Erase.rethrow(new IOException("Expected"));
52          }
53          @Override
54          public int hashCode() {
55              // Pair implementation with equals() even though not strictly necessary.
56              return super.hashCode();
57          }
58      };
59  
60      private static final Predicate<Object> THROWING_UNCHECKED_PREDICATE = TestConstants.THROWING_IO_PREDICATE.asPredicate();
61  
62      private void assertThrowsChecked(final Executable executable) {
63          assertThrows(IOException.class, executable);
64      }
65  
66      private void assertThrowsUnchecked(final Executable executable) {
67          assertThrows(UncheckedIOException.class, executable);
68      }
69  
70      @Test
71      void testAndChecked() throws IOException {
72          assertFalse(IS_HIDDEN.and(IS_HIDDEN).test(PATH_FIXTURE));
73          assertTrue(IOPredicate.alwaysTrue().and(IOPredicate.alwaysTrue()).test(PATH_FIXTURE));
74          assertFalse(IOPredicate.alwaysFalse().and(IOPredicate.alwaysTrue()).test(PATH_FIXTURE));
75          assertFalse(IOPredicate.alwaysTrue().and(IOPredicate.alwaysFalse()).test(PATH_FIXTURE));
76          assertFalse(IOPredicate.alwaysFalse().and(IOPredicate.alwaysFalse()).test(PATH_FIXTURE));
77      }
78  
79      @Test
80      void testAndUnchecked() {
81          assertThrowsUnchecked(() -> THROWING_UNCHECKED_PREDICATE.and(THROWING_UNCHECKED_PREDICATE).test(PATH_FIXTURE));
82      }
83  
84      @Test
85      void testAsPredicate() throws IOException {
86          new ArrayList<>().removeIf(THROWING_UNCHECKED_PREDICATE);
87          final List<String> list = new ArrayList<>();
88          list.add("A");
89          list.add("B");
90          list.removeIf(Predicate.isEqual("A"));
91          assertFalse(list.contains("A"));
92          list.removeIf(IOPredicate.isEqual("B").asPredicate());
93          assertFalse(list.contains("B"));
94          assertFalse(IS_HIDDEN.test(PATH_FIXTURE));
95      }
96  
97      @Test
98      void testFalse() throws IOException {
99          assertFalse(Constants.IO_PREDICATE_FALSE.test("A"));
100         // Make sure we keep the argument type
101         final IOPredicate<String> alwaysFalse = IOPredicate.alwaysFalse();
102         assertFalse(alwaysFalse.test("A"));
103         assertEquals(IOPredicate.alwaysFalse(), IOPredicate.alwaysFalse());
104         assertSame(IOPredicate.alwaysFalse(), IOPredicate.alwaysFalse());
105     }
106 
107     @Test
108     void testIsEqualChecked() throws IOException {
109         assertThrowsChecked(() -> IOPredicate.isEqual(THROWING_EQUALS).test("B"));
110         assertFalse(IOPredicate.isEqual(null).test("A"));
111         assertTrue(IOPredicate.isEqual("B").test("B"));
112         assertFalse(IOPredicate.isEqual("A").test("B"));
113         assertFalse(IOPredicate.isEqual("B").test("A"));
114     }
115 
116     @Test
117     void testIsEqualUnchecked() {
118         assertThrowsUnchecked(() -> IOPredicate.isEqual(THROWING_EQUALS).asPredicate().test("B"));
119         assertFalse(IOPredicate.isEqual(null).asPredicate().test("A"));
120         assertTrue(IOPredicate.isEqual("B").asPredicate().test("B"));
121         assertFalse(IOPredicate.isEqual("A").asPredicate().test("B"));
122         assertFalse(IOPredicate.isEqual("B").asPredicate().test("A"));
123     }
124 
125     @Test
126     void testNegateChecked() throws IOException {
127         assertTrue(IS_HIDDEN.negate().test(PATH_FIXTURE));
128         assertFalse(IOPredicate.alwaysTrue().negate().test(PATH_FIXTURE));
129     }
130 
131     @Test
132     void testNegateUnchecked() {
133         assertTrue(IS_HIDDEN.negate().asPredicate().test(PATH_FIXTURE));
134         assertTrue(IS_HIDDEN.asPredicate().negate().test(PATH_FIXTURE));
135         assertThrowsUnchecked(() -> THROWING_UNCHECKED_PREDICATE.negate().test(PATH_FIXTURE));
136     }
137 
138     @Test
139     void testOrChecked() throws IOException {
140         assertFalse(IS_HIDDEN.or(IS_HIDDEN).test(PATH_FIXTURE));
141         assertTrue(IOPredicate.alwaysTrue().or(IOPredicate.alwaysFalse()).test(PATH_FIXTURE));
142         assertTrue(IOPredicate.alwaysFalse().or(IOPredicate.alwaysTrue()).test(PATH_FIXTURE));
143     }
144 
145     @Test
146     void testOrUnchecked() {
147         assertFalse(IS_HIDDEN.asPredicate().or(e -> false).test(PATH_FIXTURE));
148         assertThrowsUnchecked(() -> THROWING_UNCHECKED_PREDICATE.or(THROWING_UNCHECKED_PREDICATE).test(PATH_FIXTURE));
149     }
150 
151     @Test
152     void testTestChecked() throws IOException {
153         assertThrowsChecked(() -> TestConstants.THROWING_IO_PREDICATE.test(null));
154         assertTrue(Constants.IO_PREDICATE_TRUE.test("A"));
155     }
156 
157     @Test
158     void testTestUnchecked() {
159         assertThrowsUnchecked(() -> THROWING_UNCHECKED_PREDICATE.test(null));
160         assertTrue(Constants.IO_PREDICATE_TRUE.asPredicate().test("A"));
161     }
162 
163     @Test
164     void testTrue() throws IOException {
165         assertTrue(Constants.IO_PREDICATE_TRUE.test("A"));
166         // Make sure we keep the argument type
167         final IOPredicate<String> alwaysTrue = IOPredicate.alwaysTrue();
168         assertTrue(alwaysTrue.test("A"));
169         assertEquals(IOPredicate.alwaysTrue(), IOPredicate.alwaysTrue());
170         assertSame(IOPredicate.alwaysTrue(), IOPredicate.alwaysTrue());
171     }
172 
173 }