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   * @since 0.18
19   */
20  final class UseStringIsEmptyRuleTest {
21  
22      /**
23       * UseStringIsEmpty can detect when used String.length(), when checking for
24       * empty string.
25       * @param file File name.
26       * @throws Exception If something goes wrong.
27       */
28      @ParameterizedTest
29      @ValueSource(
30          strings = {
31              "StringLengthGreaterThanZero.java",
32              "StringLengthGreaterOrEqualZero.java",
33              "StringLengthGreaterOrEqualOne.java",
34              "StringLengthLessThanOne.java",
35              "StringLengthLessOrEqualZero.java",
36              "StringLengthEqualsZero.java",
37              "StringLengthNotEqualsZero.java"
38          }
39      )
40      void detectLengthComparisons(final String file) throws Exception {
41          new PmdAssert(
42              file, new IsEqual<>(false),
43              new CombinableMatcher<>(containsMatcher(file, 20))
44                  .and(containsMatcher(file, 24))
45                  .and(containsMatcher(file, 28))
46                  .and(containsMatcher(file, 32))
47                  .and(containsMatcher(file, 36))
48          ).validate();
49      }
50  
51      /**
52       * UseStringIsEmpty not detect when used String[].length, when checking for
53       *  empty string.
54       * @throws Exception If something goes wrong.
55       */
56      @Test
57      void notDetectOnArrayOfStrings() throws Exception {
58          new PmdAssert(
59              "ArrayOfStringsLengthGreaterThanZero.java",
60              new IsEqual<>(true),
61              IsEmptyString.emptyString()
62          ).validate();
63      }
64  
65      /**
66       * Constructs StringContains matcher for error message.
67       * @param file File name.
68       * @param line Line number.
69       * @return StringContains matcher.
70       */
71      private static Matcher<String> containsMatcher(
72          final String file, final int line
73      ) {
74          final String message =
75              "Use String.isEmpty() when checking for empty string";
76          return new StringContains(
77              String.format(
78                  "PMD: %1$s[%2$d-%2$d]: %3$s (UseStringIsEmptyRule)",
79                  file, line, message
80              )
81          );
82      }
83  }