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.input;
18  
19  import static org.apache.commons.io.IOUtils.EOF;
20  import static org.junit.jupiter.api.Assertions.assertEquals;
21  import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively;
22  
23  import java.io.IOException;
24  import java.io.StringReader;
25  import java.time.Duration;
26  import java.util.HashSet;
27  import java.util.Set;
28  
29  import org.apache.commons.io.output.StringBuilderWriter;
30  import org.junit.jupiter.api.Test;
31  
32  public class CharacterSetFilterReaderTest {
33  
34      private static final String STRING_FIXTURE = "ab";
35  
36      @Test
37      public void testInputSize0FilterSize0() throws IOException {
38          final StringReader input = new StringReader("");
39          try (CharacterSetFilterReader reader = new CharacterSetFilterReader(input, new HashSet<>(0))) {
40              assertEquals(-1, reader.read());
41          }
42      }
43  
44      @Test
45      public void testInputSize0FilterSize1() throws IOException {
46          final StringReader input = new StringReader("");
47          final HashSet<Integer> codePoints = new HashSet<>();
48          codePoints.add(Integer.valueOf('a'));
49          try (CharacterSetFilterReader reader = new CharacterSetFilterReader(input, codePoints)) {
50              assertEquals(-1, reader.read());
51          }
52      }
53  
54      @Test
55      public void testInputSize0NullFilter() throws IOException {
56          final StringReader input = new StringReader("");
57          try (CharacterSetFilterReader reader = new CharacterSetFilterReader(input, (Set<Integer>) null)) {
58              assertEquals(-1, reader.read());
59          }
60      }
61  
62      @Test
63      public void testInputSize1FilterSize1() throws IOException {
64          try (StringReader input = new StringReader("a")) {
65              final HashSet<Integer> codePoints = new HashSet<>();
66              codePoints.add(Integer.valueOf('a'));
67              try (CharacterSetFilterReader reader = new CharacterSetFilterReader(input, codePoints)) {
68                  assertEquals(-1, reader.read());
69              }
70          }
71      }
72  
73      @Test
74      public void testInputSize2FilterSize1FilterAll() throws IOException {
75          final StringReader input = new StringReader("aa");
76          final HashSet<Integer> codePoints = new HashSet<>();
77          codePoints.add(Integer.valueOf('a'));
78          try (CharacterSetFilterReader reader = new CharacterSetFilterReader(input, codePoints)) {
79              assertEquals(-1, reader.read());
80          }
81      }
82  
83      @Test
84      public void testInputSize2FilterSize1FilterFirst() throws IOException {
85          final StringReader input = new StringReader(STRING_FIXTURE);
86          final HashSet<Integer> codePoints = new HashSet<>();
87          codePoints.add(Integer.valueOf('a'));
88          try (CharacterSetFilterReader reader = new CharacterSetFilterReader(input, codePoints)) {
89              assertEquals('b', reader.read());
90              assertEquals(-1, reader.read());
91          }
92      }
93  
94      @Test
95      public void testInputSize2FilterSize1FilterLast() throws IOException {
96          final StringReader input = new StringReader(STRING_FIXTURE);
97          final HashSet<Integer> codePoints = new HashSet<>();
98          codePoints.add(Integer.valueOf('b'));
99          try (CharacterSetFilterReader reader = new CharacterSetFilterReader(input, codePoints)) {
100             assertEquals('a', reader.read());
101             assertEquals(-1, reader.read());
102         }
103     }
104 
105     @Test
106     public void testInputSize2FilterSize2FilterFirst() throws IOException {
107         final StringReader input = new StringReader(STRING_FIXTURE);
108         final HashSet<Integer> codePoints = new HashSet<>();
109         codePoints.add(Integer.valueOf('a'));
110         codePoints.add(Integer.valueOf('y'));
111         try (CharacterSetFilterReader reader = new CharacterSetFilterReader(input, codePoints)) {
112             assertEquals('b', reader.read());
113             assertEquals(-1, reader.read());
114         }
115     }
116 
117     @Test
118     public void testInputSize2FilterSize2FilterLast() throws IOException {
119         final StringReader input = new StringReader(STRING_FIXTURE);
120         final HashSet<Integer> codePoints = new HashSet<>();
121         codePoints.add(Integer.valueOf('x'));
122         codePoints.add(Integer.valueOf('b'));
123         try (CharacterSetFilterReader reader = new CharacterSetFilterReader(input, codePoints)) {
124             assertEquals('a', reader.read());
125             assertEquals(-1, reader.read());
126         }
127     }
128 
129     @Test
130     public void testInputSize2FilterSize2FilterNone() throws IOException {
131         final StringReader input = new StringReader(STRING_FIXTURE);
132         final HashSet<Integer> codePoints = new HashSet<>();
133         codePoints.add(Integer.valueOf('x'));
134         codePoints.add(Integer.valueOf('y'));
135         try (CharacterSetFilterReader reader = new CharacterSetFilterReader(input, codePoints)) {
136             assertEquals('a', reader.read());
137             assertEquals('b', reader.read());
138         }
139     }
140 
141     @Test
142     public void testReadFilteringEOF() {
143         final StringReader input = new StringReader(STRING_FIXTURE);
144         assertTimeoutPreemptively(Duration.ofMillis(500), () -> {
145             try (StringBuilderWriter output = new StringBuilderWriter();
146                 CharacterSetFilterReader reader = new CharacterSetFilterReader(input, EOF)) {
147                 int c;
148                 while ((c = reader.read()) != EOF) {
149                     output.write(c);
150                 }
151                 assertEquals(STRING_FIXTURE, output.toString());
152             }
153         });
154     }
155 }