View Javadoc
1   ///////////////////////////////////////////////////////////////////////////////////////////////
2   // checkstyle: Checks Java source code and other text files for adherence to a set of rules.
3   // Copyright (C) 2001-2024 the original author or authors.
4   //
5   // This library is free software; you can redistribute it and/or
6   // modify it under the terms of the GNU Lesser General Public
7   // License as published by the Free Software Foundation; either
8   // version 2.1 of the License, or (at your option) any later version.
9   //
10  // This library is distributed in the hope that it will be useful,
11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  // Lesser General Public License for more details.
14  //
15  // You should have received a copy of the GNU Lesser General Public
16  // License along with this library; if not, write to the Free Software
17  // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  ///////////////////////////////////////////////////////////////////////////////////////////////
19  
20  package com.puppycrawl.tools.checkstyle.filters;
21  
22  import static com.google.common.truth.Truth.assertWithMessage;
23  
24  import org.junit.jupiter.api.BeforeEach;
25  import org.junit.jupiter.api.Test;
26  
27  import com.puppycrawl.tools.checkstyle.TreeWalkerTest;
28  import com.puppycrawl.tools.checkstyle.api.AuditEvent;
29  import com.puppycrawl.tools.checkstyle.api.Violation;
30  import nl.jqno.equalsverifier.EqualsVerifier;
31  import nl.jqno.equalsverifier.EqualsVerifierReport;
32  import nl.jqno.equalsverifier.Warning;
33  
34  public class SuppressFilterElementTest {
35  
36      private SuppressFilterElement filter;
37  
38      @BeforeEach
39      public void setUp() {
40          filter = new SuppressFilterElement("Test", "Test", null, null, null, null);
41      }
42  
43      @Test
44      public void testDecideDefault() {
45          final AuditEvent ev = new AuditEvent(this, "Test.java");
46          assertWithMessage(ev.getFileName())
47                  .that(filter.accept(ev))
48                  .isTrue();
49      }
50  
51      @Test
52      public void testDecideViolation() {
53          final Violation violation =
54              new Violation(1, 0, "", "", null, null, getClass(), null);
55          final AuditEvent ev = new AuditEvent(this, "ATest.java", violation);
56          // deny because there are matches on file and check names
57          assertWithMessage("Names match")
58              .that(filter.accept(ev))
59              .isFalse();
60      }
61  
62      @Test
63      public void testDecideByMessage() {
64          final Violation violation =
65              new Violation(1, 0, "", "", null, null, getClass(), "Test");
66          final AuditEvent ev = new AuditEvent(this, "ATest.java", violation);
67          final SuppressFilterElement filter1 =
68                  new SuppressFilterElement(null, null, "Test", null, null, null);
69          final SuppressFilterElement filter2 =
70                  new SuppressFilterElement(null, null, "Bad", null, null, null);
71          assertWithMessage("Message match")
72                  .that(filter1.accept(ev))
73                  .isFalse();
74          assertWithMessage("Message not match")
75                  .that(filter2.accept(ev))
76                  .isTrue();
77      }
78  
79      @Test
80      public void testDecideByLine() {
81          final Violation violation =
82              new Violation(10, 10, "", "", null, null, getClass(), null);
83          final AuditEvent ev = new AuditEvent(this, "ATest.java", violation);
84          final SuppressFilterElement filter1 =
85                  new SuppressFilterElement("Test", "Test", null, null, "1-10", null);
86          final SuppressFilterElement filter2 =
87                  new SuppressFilterElement("Test", "Test", null, null, "1-9, 11", null);
88          final SuppressFilterElement filter3 =
89                  new SuppressFilterElement("Test", "Test", null, null, null, null);
90          // deny because there are matches on file name, check name, and line
91          assertWithMessage("In range 1-10")
92                  .that(filter1.accept(ev))
93                  .isFalse();
94          assertWithMessage("Not in 1-9, 11")
95                  .that(filter2.accept(ev))
96                  .isTrue();
97          assertWithMessage("none")
98                  .that(filter3.accept(ev))
99                  .isFalse();
100     }
101 
102     @Test
103     public void testDecideByColumn() {
104         final Violation violation =
105             new Violation(10, 10, "", "", null, null, getClass(), null);
106         final AuditEvent ev = new AuditEvent(this, "ATest.java", violation);
107         final SuppressFilterElement filter1 =
108                 new SuppressFilterElement("Test", "Test", null, null, null, "1-10");
109         final SuppressFilterElement filter2 =
110                 new SuppressFilterElement("Test", "Test", null, null, null, "1-9, 11");
111 
112         // deny because there are matches on file name, check name, and column
113         assertWithMessage("In range 1-10")
114                 .that(filter1.accept(ev))
115                 .isFalse();
116         assertWithMessage("Not in 1-9, 1)")
117                 .that(filter2.accept(ev))
118                 .isTrue();
119     }
120 
121     @Test
122     public void testDecideByFileNameAndModuleMatchingFileNameNull() {
123         final Violation message =
124                 new Violation(10, 10, "", "", null, null, getClass(), null);
125         final AuditEvent ev = new AuditEvent(this, null, message);
126         assertWithMessage("Filter should accept valid event")
127                 .that(filter.accept(ev))
128                 .isTrue();
129     }
130 
131     @Test
132     public void testDecideByFileNameAndModuleMatchingMessageNull() {
133         final AuditEvent ev = new AuditEvent(this, "ATest.java", null);
134         assertWithMessage("Filter should accept valid event")
135                 .that(filter.accept(ev))
136                 .isTrue();
137     }
138 
139     @Test
140     public void testDecideByFileNameAndModuleMatchingModuleNull() {
141         final Violation violation =
142                 new Violation(10, 10, "", "", null, "MyModule", getClass(), null);
143         final AuditEvent ev = new AuditEvent(this, "ATest.java", violation);
144         assertWithMessage("Filter should not accept invalid event")
145                 .that(filter.accept(ev))
146                 .isFalse();
147     }
148 
149     @Test
150     public void testDecideByFileNameAndModuleMatchingModuleEqual() {
151         final Violation violation =
152                 new Violation(10, 10, "", "", null, "MyModule", getClass(), null);
153         final AuditEvent ev = new AuditEvent(this, "ATest.java", violation);
154         final SuppressFilterElement myFilter =
155                 new SuppressFilterElement("Test", "Test", null, "MyModule", null, null);
156 
157         assertWithMessage("Filter should not accept invalid event")
158                 .that(myFilter.accept(ev))
159                 .isFalse();
160     }
161 
162     @Test
163     public void testDecideByFileNameAndModuleMatchingModuleNotEqual() {
164         final Violation message =
165                 new Violation(10, 10, "", "", null, "TheirModule", getClass(), null);
166         final AuditEvent ev = new AuditEvent(this, "ATest.java", message);
167         final SuppressFilterElement myFilter =
168                 new SuppressFilterElement("Test", "Test", null, "MyModule", null, null);
169 
170         assertWithMessage("Filter should accept valid event")
171                 .that(myFilter.accept(ev))
172                 .isTrue();
173     }
174 
175     @Test
176     public void testDecideByFileNameAndModuleMatchingRegExpNotMatch() {
177         final Violation message =
178                 new Violation(10, 10, "", "", null, null, getClass(), null);
179         final AuditEvent ev = new AuditEvent(this, "T1est", message);
180         assertWithMessage("Filter should accept valid event")
181                 .that(filter.accept(ev))
182                 .isTrue();
183     }
184 
185     @Test
186     public void testDecideByFileNameAndModuleMatchingRegExpMatch() {
187         final Violation message =
188                 new Violation(10, 10, "", "", null, null, getClass(), null);
189         final AuditEvent ev = new AuditEvent(this, "TestSUFFIX", message);
190         final SuppressFilterElement myFilter =
191                 new SuppressFilterElement("Test", null, null, null, null, null);
192         assertWithMessage("Filter should not accept invalid event")
193                 .that(myFilter.accept(ev))
194                 .isFalse();
195     }
196 
197     @Test
198     public void testDecideByFileNameAndModuleMatchingCheckRegExpNotMatch() {
199         final Violation message =
200                 new Violation(10, 10, "", "", null, null, getClass(), null);
201         final AuditEvent ev = new AuditEvent(this, "ATest.java", message);
202         final SuppressFilterElement myFilter = new SuppressFilterElement("Test",
203                 "NON_EXISTENT_CHECK", null, "MyModule", null, null);
204         assertWithMessage("Filter should accept valid event")
205                 .that(myFilter.accept(ev))
206                 .isTrue();
207     }
208 
209     @Test
210     public void testDecideByFileNameAndModuleMatchingCheckRegExpMatch() {
211         final Violation message =
212                 new Violation(10, 10, "", "", null, null, getClass(), null);
213         final AuditEvent ev = new AuditEvent(this, "ATest.java", message);
214         final SuppressFilterElement myFilter = new SuppressFilterElement("Test",
215                 getClass().getCanonicalName(), null, null, null, null);
216 
217         assertWithMessage("Filter should not accept invalid event")
218                 .that(myFilter.accept(ev))
219                 .isFalse();
220     }
221 
222     @Test
223     public void testDecideByFileNameAndSourceNameCheckRegExpNotMatch() {
224         final Violation message =
225                 new Violation(10, 10, "", "", null, null, getClass(), null);
226         final AuditEvent ev = new AuditEvent(this, "ATest.java", message);
227         final SuppressFilterElement myFilter =
228                 new SuppressFilterElement("Test", TreeWalkerTest.class.getCanonicalName(),
229                         null, null, null, null);
230 
231         assertWithMessage("Filter should not accept invalid event")
232                 .that(myFilter.accept(ev))
233                 .isTrue();
234     }
235 
236     @Test
237     public void testEquals() {
238         // filterBased is used instead of filter field only to satisfy IntelliJ IDEA Inspection
239         // Inspection "Arguments to assertEquals() in wrong order "
240         final SuppressFilterElement filterBased =
241                 new SuppressFilterElement("Test", "Test", null, null, null, null);
242 
243         final SuppressFilterElement filter2 =
244                 new SuppressFilterElement("Test", "Test", null, null, null, null);
245         assertWithMessage("filter, filter2")
246             .that(filter2)
247             .isEqualTo(filterBased);
248         final SuppressFilterElement filter3 =
249                 new SuppressFilterElement("Test", "Test3", null, null, null, null);
250         assertWithMessage("filter, filter3")
251             .that(filter3)
252             .isNotEqualTo(filterBased);
253         final SuppressFilterElement filterBased1 =
254                 new SuppressFilterElement("Test", "Test", null, null, null, "1-10");
255 
256         assertWithMessage("filter, filter2")
257             .that(filter2)
258             .isNotEqualTo(filterBased1);
259         final SuppressFilterElement filter22 =
260                 new SuppressFilterElement("Test", "Test", null, null, null, "1-10");
261         assertWithMessage("filter, filter2")
262             .that(filter22)
263             .isEqualTo(filterBased1);
264         assertWithMessage("filter, filter2")
265             .that(filter2)
266             .isNotEqualTo(filterBased1);
267         final SuppressFilterElement filterBased2 =
268                 new SuppressFilterElement("Test", "Test", null, null, "3,4", null);
269         assertWithMessage("filter, filter2")
270             .that(filter2)
271             .isNotEqualTo(filterBased2);
272         final SuppressFilterElement filter23 =
273                 new SuppressFilterElement("Test", "Test", null, null, "3,4", null);
274         assertWithMessage("filter, filter2")
275             .that(filter23)
276             .isEqualTo(filterBased2);
277         assertWithMessage("filter, filter2")
278             .that(filter2)
279             .isNotEqualTo(filterBased2);
280         assertWithMessage("filter, filter2")
281             .that(filter23)
282             .isEqualTo(filterBased2);
283     }
284 
285     @Test
286     public void testEqualsAndHashCode() {
287         final EqualsVerifierReport ev = EqualsVerifier.forClass(SuppressFilterElement.class)
288                 .usingGetClass()
289                 .withIgnoredFields("columnFilter", "lineFilter")
290                 .suppress(Warning.NONFINAL_FIELDS)
291                 .report();
292         assertWithMessage("Error: " + ev.getMessage())
293                 .that(ev.isSuccessful())
294                 .isTrue();
295     }
296 
297 }