1 /*
2  * Copyright 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package androidx.compose.lint
18 
19 import com.android.tools.lint.checks.infrastructure.LintDetectorTest
20 import com.android.tools.lint.detector.api.Detector
21 import com.android.tools.lint.detector.api.Issue
22 import org.junit.Test
23 import org.junit.runner.RunWith
24 import org.junit.runners.JUnit4
25 
26 @RunWith(JUnit4::class)
27 class ExceptionMessageDetectorTest : LintDetectorTest() {
getDetectornull28     override fun getDetector(): Detector = ExceptionMessageDetector()
29 
30     override fun getIssues(): MutableList<Issue> {
31         return mutableListOf(ExceptionMessageDetector.ISSUE)
32     }
33 
34     @Test
checkWithMessagenull35     fun checkWithMessage() {
36         lint()
37             .files(
38                 kotlin(
39                     """
40                     package test
41 
42                     fun content() {
43                         check(true) {"Message"}
44                     }
45                     """
46                 )
47             )
48             .run()
49             .expectClean()
50     }
51 
52     @Test
checkWithNamedParameterValuenull53     fun checkWithNamedParameterValue() {
54         lint()
55             .files(
56                 kotlin(
57                     """
58                     package test
59 
60                     fun content() {
61                         check(value = true) {"Message"}
62                     }
63                     """
64                 )
65             )
66             .run()
67             .expectClean()
68     }
69 
70     @Test
checkWithNamedParameterMessagenull71     fun checkWithNamedParameterMessage() {
72         lint()
73             .files(
74                 kotlin(
75                     """
76                     package test
77 
78                     fun content() {
79                         check(true, lazyMessage = {"Message"})
80                     }
81                     """
82                 )
83             )
84             .run()
85             .expectClean()
86     }
87 
88     @Test
checkWithNamedParameterValueAndMessagenull89     fun checkWithNamedParameterValueAndMessage() {
90         lint()
91             .files(
92                 kotlin(
93                     """
94                     package test
95 
96                     fun content() {
97                         check(value = true, lazyMessage = {"Message"})
98                     }
99                     """
100                 )
101             )
102             .run()
103             .expectClean()
104     }
105 
106     @Test
checkWithNamedParameterValueAndMessageReversednull107     fun checkWithNamedParameterValueAndMessageReversed() {
108         lint()
109             .files(
110                 kotlin(
111                     """
112                     package test
113 
114                     fun content() {
115                         check(lazyMessage = {"Message"}, value = true)
116                     }
117                     """
118                 )
119             )
120             .run()
121             .expectClean()
122     }
123 
124     @Test
checkWithoutMessagenull125     fun checkWithoutMessage() {
126         lint()
127             .files(
128                 kotlin(
129                     """
130                     package test
131 
132                     fun content() {
133                         check(true)
134                     }
135                     """
136                 ),
137             )
138             .run()
139             .expect(
140                 """
141                     src/test/test.kt:5: Error: Please specify a lazyMessage param for check [ExceptionMessage]
142                                             check(true)
143                                             ~~~~~
144                     1 errors, 0 warnings
145                 """
146             )
147     }
148 
149     @Test
checkFromDifferentPackageWithoutMessagenull150     fun checkFromDifferentPackageWithoutMessage() {
151         lint()
152             .files(
153                 kotlin(
154                     """
155                     package test
156 
157                     fun content() {
158                         check(true)
159                     }
160 
161                     fun check(boolean: Boolean) {}
162                     """
163                 ),
164             )
165             .run()
166             .expectClean()
167     }
168 
169     @Test
checkNotNullWithMessagenull170     fun checkNotNullWithMessage() {
171         lint()
172             .files(
173                 kotlin(
174                     """
175                     package test
176 
177                     fun content() {
178                         checkNotNull(null) {"Message"}
179                     }
180                     """
181                 )
182             )
183             .run()
184             .expectClean()
185     }
186 
187     @Test
checkNotNullWithNamedParameterValuenull188     fun checkNotNullWithNamedParameterValue() {
189         lint()
190             .files(
191                 kotlin(
192                     """
193                     package test
194 
195                     fun content() {
196                         checkNotNull(value = null) {"Message"}
197                     }
198                     """
199                 )
200             )
201             .run()
202             .expectClean()
203     }
204 
205     @Test
checkNotNullWithNamedParameterMessagenull206     fun checkNotNullWithNamedParameterMessage() {
207         lint()
208             .files(
209                 kotlin(
210                     """
211                     package test
212 
213                     fun content() {
214                         checkNotNull(null, lazyMessage = {"Message"})
215                     }
216                     """
217                 )
218             )
219             .run()
220             .expectClean()
221     }
222 
223     @Test
checkNotNullWithNamedParameterValueAndMessagenull224     fun checkNotNullWithNamedParameterValueAndMessage() {
225         lint()
226             .files(
227                 kotlin(
228                     """
229                     package test
230 
231                     fun content() {
232                         checkNotNull(value = null, lazyMessage = {"Message"})
233                     }
234                     """
235                 )
236             )
237             .run()
238             .expectClean()
239     }
240 
241     @Test
checkNotNullWithNamedParameterValueAndMessageReversednull242     fun checkNotNullWithNamedParameterValueAndMessageReversed() {
243         lint()
244             .files(
245                 kotlin(
246                     """
247                     package test
248 
249                     fun content() {
250                         checkNotNull(lazyMessage = {"Message"}, value = null)
251                     }
252                     """
253                 )
254             )
255             .run()
256             .expectClean()
257     }
258 
259     @Test
checkNotNullWithoutMessagenull260     fun checkNotNullWithoutMessage() {
261         lint()
262             .files(
263                 kotlin(
264                     """
265                     package test
266 
267                     fun content() {
268                         checkNotNull(null)
269                     }
270                     """
271                 ),
272             )
273             .run()
274             .expect(
275                 """
276                     src/test/test.kt:5: Error: Please specify a lazyMessage param for checkNotNull [ExceptionMessage]
277                                             checkNotNull(null)
278                                             ~~~~~~~~~~~~
279                     1 errors, 0 warnings
280                 """
281             )
282     }
283 
284     @Test
checkNotNullFromDifferentPackageWithoutMessagenull285     fun checkNotNullFromDifferentPackageWithoutMessage() {
286         lint()
287             .files(
288                 kotlin(
289                     """
290                     package test
291 
292                     fun content() {
293                         checkNotNull(null)
294                     }
295 
296                     fun checkNotNull(value: Any?) {}
297                     """
298                 ),
299             )
300             .run()
301             .expectClean()
302     }
303 
304     @Test
requireWithMessagenull305     fun requireWithMessage() {
306         lint()
307             .files(
308                 kotlin(
309                     """
310                     package test
311 
312                     fun content() {
313                         require(true) {"Message"}
314                     }
315                     """
316                 )
317             )
318             .run()
319             .expectClean()
320     }
321 
322     @Test
requireWithNamedParameterValuenull323     fun requireWithNamedParameterValue() {
324         lint()
325             .files(
326                 kotlin(
327                     """
328                     package test
329 
330                     fun content() {
331                         require(value = true) {"Message"}
332                     }
333                     """
334                 )
335             )
336             .run()
337             .expectClean()
338     }
339 
340     @Test
requireWithNamedParameterMessagenull341     fun requireWithNamedParameterMessage() {
342         lint()
343             .files(
344                 kotlin(
345                     """
346                     package test
347 
348                     fun content() {
349                         require(true, lazyMessage = {"Message"})
350                     }
351                     """
352                 )
353             )
354             .run()
355             .expectClean()
356     }
357 
358     @Test
requireWithNamedParameterValueAndMessagenull359     fun requireWithNamedParameterValueAndMessage() {
360         lint()
361             .files(
362                 kotlin(
363                     """
364                     package test
365 
366                     fun content() {
367                         require(value = true, lazyMessage = {"Message"})
368                     }
369                     """
370                 )
371             )
372             .run()
373             .expectClean()
374     }
375 
376     @Test
requireWithNamedParameterValueAndMessageReversednull377     fun requireWithNamedParameterValueAndMessageReversed() {
378         lint()
379             .files(
380                 kotlin(
381                     """
382                     package test
383 
384                     fun content() {
385                         require(lazyMessage = {"Message"}, value = true)
386                     }
387                     """
388                 )
389             )
390             .run()
391             .expectClean()
392     }
393 
394     @Test
requireWithoutMessagenull395     fun requireWithoutMessage() {
396         lint()
397             .files(
398                 kotlin(
399                     """
400                     package test
401 
402                     fun content() {
403                         require(true)
404                     }
405                     """
406                 ),
407             )
408             .run()
409             .expect(
410                 """
411                     src/test/test.kt:5: Error: Please specify a lazyMessage param for require [ExceptionMessage]
412                                             require(true)
413                                             ~~~~~~~
414                     1 errors, 0 warnings
415                 """
416             )
417     }
418 
419     @Test
requireFromDifferentPackageWithoutMessagenull420     fun requireFromDifferentPackageWithoutMessage() {
421         lint()
422             .files(
423                 kotlin(
424                     """
425                     package test
426 
427                     fun content() {
428                         require(true)
429                     }
430 
431                     fun require(boolean: Boolean) {}
432                     """
433                 ),
434             )
435             .run()
436             .expectClean()
437     }
438 
439     @Test
requireNotNullWithMessagenull440     fun requireNotNullWithMessage() {
441         lint()
442             .files(
443                 kotlin(
444                     """
445                     package test
446 
447                     fun content() {
448                         requireNotNull(null) {"Message"}
449                     }
450                     """
451                 )
452             )
453             .run()
454             .expectClean()
455     }
456 
457     @Test
requireNotNullWithNamedParameterValuenull458     fun requireNotNullWithNamedParameterValue() {
459         lint()
460             .files(
461                 kotlin(
462                     """
463                     package test
464 
465                     fun content() {
466                         requireNotNull(value = null) {"Message"}
467                     }
468                     """
469                 )
470             )
471             .run()
472             .expectClean()
473     }
474 
475     @Test
requireNotNullWithNamedParameterMessagenull476     fun requireNotNullWithNamedParameterMessage() {
477         lint()
478             .files(
479                 kotlin(
480                     """
481                     package test
482 
483                     fun content() {
484                         requireNotNull(null, lazyMessage = {"Message"})
485                     }
486                     """
487                 )
488             )
489             .run()
490             .expectClean()
491     }
492 
493     @Test
requireNotNullWithNamedParameterValueAndMessagenull494     fun requireNotNullWithNamedParameterValueAndMessage() {
495         lint()
496             .files(
497                 kotlin(
498                     """
499                     package test
500 
501                     fun content() {
502                         requireNotNull(value = null, lazyMessage = {"Message"})
503                     }
504                     """
505                 )
506             )
507             .run()
508             .expectClean()
509     }
510 
511     @Test
requireNotNullWithNamedParameterValueAndMessageReversednull512     fun requireNotNullWithNamedParameterValueAndMessageReversed() {
513         lint()
514             .files(
515                 kotlin(
516                     """
517                     package test
518 
519                     fun content() {
520                         requireNotNull(lazyMessage = {"Message"}, value = null)
521                     }
522                     """
523                 )
524             )
525             .run()
526             .expectClean()
527     }
528 
529     @Test
requireNotNullWithoutMessagenull530     fun requireNotNullWithoutMessage() {
531         lint()
532             .files(
533                 kotlin(
534                     """
535                     package test
536 
537                     fun content() {
538                         requireNotNull(null)
539                     }
540                     """
541                 ),
542             )
543             .run()
544             .expect(
545                 """
546                     src/test/test.kt:5: Error: Please specify a lazyMessage param for requireNotNull [ExceptionMessage]
547                                             requireNotNull(null)
548                                             ~~~~~~~~~~~~~~
549                     1 errors, 0 warnings
550                 """
551             )
552     }
553 
554     @Test
requireNotNullFromDifferentPackageWithoutMessagenull555     fun requireNotNullFromDifferentPackageWithoutMessage() {
556         lint()
557             .files(
558                 kotlin(
559                     """
560                     package test
561 
562                     fun content() {
563                         requireNotNull(null)
564                     }
565 
566                     fun requireNotNull(value: Any?) {}
567                     """
568                 ),
569             )
570             .run()
571             .expectClean()
572     }
573 }
574