View Javadoc
1   /*
2    * SPDX-FileCopyrightText: Copyright (c) 2011-2026 Yegor Bugayenko
3    * SPDX-License-Identifier: MIT
4    */
5   package com.qulice.pmd;
6   
7   import org.hamcrest.Matcher;
8   import org.hamcrest.core.CombinableMatcher;
9   import org.hamcrest.core.IsEqual;
10  import org.hamcrest.core.StringContains;
11  import org.hamcrest.text.IsEmptyString;
12  import org.junit.jupiter.api.Test;
13  import org.junit.jupiter.params.ParameterizedTest;
14  import org.junit.jupiter.params.provider.ValueSource;
15  
16  /**
17   * Test case for {@link com.qulice.pmd.rules.UseStringIsEmptyRule}.
18   *
19   * @since 0.18
20   */
21  final class UseStringIsEmptyRuleTest {
22  
23      /**
24       * UseStringIsEmpty can detect when used String.length(), when checking for
25       * empty string.
26       *
27       * @param file File name
28       * @throws Exception If something goes wrong.
29       */
30      @ParameterizedTest
31      @ValueSource(
32          strings = {
33              "StringLengthGreaterThanZero.java",
34              "StringLengthGreaterOrEqualOne.java",
35              "StringLengthLessThanOne.java",
36              "StringLengthLessOrEqualZero.java",
37              "StringLengthEqualsZero.java",
38              "StringLengthNotEqualsZero.java"
39          }
40      )
41      void detectLengthComparisons(final String file) throws Exception {
42          new PmdAssert(
43              file, new IsEqual<>(false),
44              new CombinableMatcher<>(containsMatcher(file, 20))
45                  .and(containsMatcher(file, 24))
46                  .and(containsMatcher(file, 28))
47                  .and(containsMatcher(file, 32))
48                  .and(containsMatcher(file, 36))
49          ).assertOk();
50      }
51  
52      /**
53       * UseStringIsEmpty does not flag comparisons that have no
54       * {@code isEmpty()} equivalent, such as {@code length()} checks against
55       * {@code 1} (single-character strings) or the always-true
56       * {@code length() >= 0}.
57       *
58       * @param file File name
59       * @throws Exception If something goes wrong.
60       */
61      @ParameterizedTest
62      @ValueSource(
63          strings = {
64              "StringLengthEqualsOne.java",
65              "StringLengthNotEqualsOne.java",
66              "StringLengthGreaterThanOne.java",
67              "StringLengthLessOrEqualOne.java",
68              "StringLengthGreaterOrEqualZero.java"
69          }
70      )
71      void ignoresNonEmptyChecks(final String file) throws Exception {
72          new PmdAssert(
73              file, new IsEqual<>(true),
74              IsEmptyString.emptyString()
75          ).assertOk();
76      }
77  
78      /**
79       * UseStringIsEmpty not detect when used String[].length, when checking for
80       * empty string.
81       *
82       * @throws Exception If something goes wrong.
83       */
84      @Test
85      void notDetectOnArrayOfStrings() throws Exception {
86          new PmdAssert(
87              "ArrayOfStringsLengthGreaterThanZero.java",
88              new IsEqual<>(true),
89              IsEmptyString.emptyString()
90          ).assertOk();
91      }
92  
93      private static Matcher<String> containsMatcher(
94          final String file, final int line
95      ) {
96          return new StringContains(
97              String.format(
98                  "PMD: %1$s[%2$d-%2$d]: %3$s (UseStringIsEmptyRule)",
99                  file, line,
100                 "Use String.isEmpty() when checking for empty string"
101             )
102         );
103     }
104 }