Compare commits
No commits in common. "master" and "0.9.4" have entirely different histories.
39 changed files with 601 additions and 2226 deletions
20
.github/workflows/bld.yml
vendored
20
.github/workflows/bld.yml
vendored
|
@ -4,27 +4,29 @@ on: [ push, pull_request, workflow_dispatch ]
|
|||
|
||||
jobs:
|
||||
build-bld-project:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
java-version: [ 17, 21, 24 ]
|
||||
os: [ ubuntu-latest, windows-latest, macos-latest ]
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
java-version: [ 17, 20 ]
|
||||
|
||||
steps:
|
||||
- name: Checkout source repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up JDK ${{ matrix.java-version }}
|
||||
uses: actions/setup-java@v4
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: "zulu"
|
||||
distribution: 'zulu'
|
||||
java-version: ${{ matrix.java-version }}
|
||||
|
||||
- name: Download dependencies
|
||||
- name: Grant execute permission for bld
|
||||
run: chmod +x bld
|
||||
|
||||
- name: Download the dependencies
|
||||
run: ./bld download
|
||||
|
||||
- name: Run tests
|
||||
- name: Run tests with bld
|
||||
run: ./bld compile test
|
||||
|
|
12
.github/workflows/pages.yml
vendored
12
.github/workflows/pages.yml
vendored
|
@ -30,14 +30,14 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: Checkout source repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v4
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: "zulu"
|
||||
distribution: 'zulu'
|
||||
java-version: 17
|
||||
|
||||
- name: Build Javadocs
|
||||
|
@ -47,11 +47,11 @@ jobs:
|
|||
uses: actions/configure-pages@v3
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v3
|
||||
uses: actions/upload-pages-artifact@v1
|
||||
with:
|
||||
# Upload generated Javadocs repository
|
||||
path: "build/javadoc/"
|
||||
path: 'build/javadoc/'
|
||||
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v4
|
||||
uses: actions/deploy-pages@v1
|
6
.idea/bld.xml
generated
6
.idea/bld.xml
generated
|
@ -1,6 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="BldConfiguration">
|
||||
<events />
|
||||
</component>
|
||||
</project>
|
2
.idea/copyright/Apache_License.xml
generated
2
.idea/copyright/Apache_License.xml
generated
|
@ -1,6 +1,6 @@
|
|||
<component name="CopyrightManager">
|
||||
<copyright>
|
||||
<option name="notice" value="Copyright 2023-&#36;today.year the original author or authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." />
|
||||
<option name="notice" value="Copyright &#36;today.year the original author or authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." />
|
||||
<option name="myName" value="Apache License" />
|
||||
</copyright>
|
||||
</component>
|
13
.idea/icon.svg
generated
13
.idea/icon.svg
generated
|
@ -1,13 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 179 108" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1,0,0,1,-210.511,-96.3382)">
|
||||
<g transform="matrix(1,0,0,1,-23.3386,-649.816)">
|
||||
<g transform="matrix(0.221288,0,0,0.24,73.9536,390.254)">
|
||||
<path d="M722.568,1482.92L722.568,1921.1L808.968,1921.1L808.968,1888.7C822.168,1907.9 846.168,1930.1 893.568,1930.1C933.168,1930.1 961.968,1917.5 985.368,1893.5C1012.97,1865.9 1027.37,1827.5 1027.37,1786.1C1027.37,1741.7 1011.17,1705.1 985.368,1680.5C961.968,1658.3 928.968,1644.5 892.368,1644.5C862.968,1644.5 830.568,1654.1 808.968,1683.5L808.968,1482.92L722.568,1482.92ZM871.368,1718.9C888.768,1718.9 903.768,1723.7 917.568,1736.9C930.168,1748.9 938.568,1766.3 938.568,1787.9C938.568,1807.7 930.168,1825.1 917.568,1837.1C904.368,1849.7 887.568,1855.7 872.568,1855.7C856.368,1855.7 837.168,1849.1 823.368,1835.9C813.168,1826.3 803.568,1810.1 803.568,1787.9C803.568,1765.1 812.568,1749.5 822.768,1738.7C836.568,1724.3 852.768,1718.9 871.368,1718.9Z" style="fill:rgb(35,146,255);fill-rule:nonzero;"/>
|
||||
<rect x="1083.77" y="1482.92" width="86.4" height="438.182" style="fill:rgb(250,144,82);fill-rule:nonzero;"/>
|
||||
<path d="M1531.37,1482.92L1444.97,1482.92L1444.97,1683.5C1423.37,1654.1 1390.97,1644.5 1361.57,1644.5C1324.97,1644.5 1291.97,1658.3 1268.57,1680.5C1242.77,1705.1 1226.57,1741.7 1226.57,1786.1C1226.57,1827.5 1240.97,1865.9 1268.57,1893.5C1291.97,1917.5 1320.77,1930.1 1360.37,1930.1C1407.77,1930.1 1431.77,1907.9 1444.97,1888.7L1444.97,1921.1L1531.37,1921.1L1531.37,1482.92ZM1382.57,1718.9C1401.17,1718.9 1417.37,1724.3 1431.17,1738.7C1441.37,1749.5 1450.37,1765.1 1450.37,1787.9C1450.37,1810.1 1440.77,1826.3 1430.57,1835.9C1416.77,1849.1 1397.57,1855.7 1381.37,1855.7C1366.37,1855.7 1349.57,1849.7 1336.37,1837.1C1323.77,1825.1 1315.37,1807.7 1315.37,1787.9C1315.37,1766.3 1323.77,1748.9 1336.37,1736.9C1350.17,1723.7 1365.17,1718.9 1382.57,1718.9Z" style="fill:rgb(35,146,255);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 2.4 KiB |
204
.idea/intellij-javadocs-4.0.1.xml
generated
204
.idea/intellij-javadocs-4.0.1.xml
generated
|
@ -1,204 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="JavaDocConfiguration">
|
||||
<GENERAL>
|
||||
<MODE>UPDATE</MODE>
|
||||
<OVERRIDDEN_METHODS>false</OVERRIDDEN_METHODS>
|
||||
<SPLITTED_CLASS_NAME>true</SPLITTED_CLASS_NAME>
|
||||
<LEVELS>
|
||||
<LEVEL>METHOD</LEVEL>
|
||||
<LEVEL>TYPE</LEVEL>
|
||||
<LEVEL>FIELD</LEVEL>
|
||||
</LEVELS>
|
||||
<VISIBILITIES>
|
||||
<VISIBILITY>DEFAULT</VISIBILITY>
|
||||
<VISIBILITY>PUBLIC</VISIBILITY>
|
||||
<VISIBILITY>PROTECTED</VISIBILITY>
|
||||
</VISIBILITIES>
|
||||
</GENERAL>
|
||||
<TEMPLATES>
|
||||
<CLASSES>
|
||||
<CLASS>
|
||||
<KEY>^.*(public|protected|private)*.+interface\s+\w+.*</KEY>
|
||||
<VALUE>/**\n
|
||||
* The interface ${name}.\n
|
||||
<#if element.typeParameters?has_content> * \n
|
||||
</#if>
|
||||
<#list element.typeParameters as typeParameter>
|
||||
* @param <${typeParameter.name}> the type parameter\n
|
||||
</#list>
|
||||
*/</VALUE>
|
||||
</CLASS>
|
||||
<CLASS>
|
||||
<KEY>^.*(public|protected|private)*.+enum\s+\w+.*</KEY>
|
||||
<VALUE>/**\n
|
||||
* The enum ${name}.\n
|
||||
*/</VALUE>
|
||||
</CLASS>
|
||||
<CLASS>
|
||||
<KEY>^.*(public|protected|private)*.+class\s+\w+.*</KEY>
|
||||
<VALUE>/**\n
|
||||
* The type ${name}.\n
|
||||
<#if element.typeParameters?has_content> * \n
|
||||
</#if>
|
||||
<#list element.typeParameters as typeParameter>
|
||||
* @param <${typeParameter.name}> the type parameter\n
|
||||
</#list>
|
||||
*/</VALUE>
|
||||
</CLASS>
|
||||
<CLASS>
|
||||
<KEY>.+</KEY>
|
||||
<VALUE>/**\n
|
||||
* The type ${name}.\n
|
||||
*/</VALUE>
|
||||
</CLASS>
|
||||
</CLASSES>
|
||||
<CONSTRUCTORS>
|
||||
<CONSTRUCTOR>
|
||||
<KEY>.+</KEY>
|
||||
<VALUE>/**\n
|
||||
* Instantiates a new ${name}.\n
|
||||
<#if element.parameterList.parameters?has_content>
|
||||
*\n
|
||||
</#if>
|
||||
<#list element.parameterList.parameters as parameter>
|
||||
* @param ${parameter.name} the ${paramNames[parameter.name]}\n
|
||||
</#list>
|
||||
<#if element.throwsList.referenceElements?has_content>
|
||||
*\n
|
||||
</#if>
|
||||
<#list element.throwsList.referenceElements as exception>
|
||||
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
|
||||
</#list>
|
||||
*/</VALUE>
|
||||
</CONSTRUCTOR>
|
||||
</CONSTRUCTORS>
|
||||
<METHODS>
|
||||
<METHOD>
|
||||
<KEY>^.*(public|protected|private)*\s*.*(\w(\s*<.+>)*)+\s+get\w+\s*\(.*\).+</KEY>
|
||||
<VALUE>/**\n
|
||||
* Gets ${partName}.\n
|
||||
<#if element.typeParameters?has_content> * \n
|
||||
</#if>
|
||||
<#list element.typeParameters as typeParameter>
|
||||
* @param <${typeParameter.name}> the type parameter\n
|
||||
</#list>
|
||||
<#if element.parameterList.parameters?has_content>
|
||||
*\n
|
||||
</#if>
|
||||
<#list element.parameterList.parameters as parameter>
|
||||
* @param ${parameter.name} the ${paramNames[parameter.name]}\n
|
||||
</#list>
|
||||
<#if isNotVoid>
|
||||
*\n
|
||||
* @return the ${partName}\n
|
||||
</#if>
|
||||
<#if element.throwsList.referenceElements?has_content>
|
||||
*\n
|
||||
</#if>
|
||||
<#list element.throwsList.referenceElements as exception>
|
||||
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
|
||||
</#list>
|
||||
*/</VALUE>
|
||||
</METHOD>
|
||||
<METHOD>
|
||||
<KEY>^.*(public|protected|private)*\s*.*(void|\w(\s*<.+>)*)+\s+set\w+\s*\(.*\).+</KEY>
|
||||
<VALUE>/**\n
|
||||
* Sets ${partName}.\n
|
||||
<#if element.typeParameters?has_content> * \n
|
||||
</#if>
|
||||
<#list element.typeParameters as typeParameter>
|
||||
* @param <${typeParameter.name}> the type parameter\n
|
||||
</#list>
|
||||
<#if element.parameterList.parameters?has_content>
|
||||
*\n
|
||||
</#if>
|
||||
<#list element.parameterList.parameters as parameter>
|
||||
* @param ${parameter.name} the ${paramNames[parameter.name]}\n
|
||||
</#list>
|
||||
<#if isNotVoid>
|
||||
*\n
|
||||
* @return the ${partName}\n
|
||||
</#if>
|
||||
<#if element.throwsList.referenceElements?has_content>
|
||||
*\n
|
||||
</#if>
|
||||
<#list element.throwsList.referenceElements as exception>
|
||||
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
|
||||
</#list>
|
||||
*/</VALUE>
|
||||
</METHOD>
|
||||
<METHOD>
|
||||
<KEY>^.*((public\s+static)|(static\s+public))\s+void\s+main\s*\(\s*String\s*(\[\s*\]|\.\.\.)\s+\w+\s*\).+</KEY>
|
||||
<VALUE>/**\n
|
||||
* The entry point of application.\n
|
||||
|
||||
<#if element.parameterList.parameters?has_content>
|
||||
*\n
|
||||
</#if>
|
||||
* @param ${element.parameterList.parameters[0].name} the input arguments\n
|
||||
<#if element.throwsList.referenceElements?has_content>
|
||||
*\n
|
||||
</#if>
|
||||
<#list element.throwsList.referenceElements as exception>
|
||||
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
|
||||
</#list>
|
||||
*/</VALUE>
|
||||
</METHOD>
|
||||
<METHOD>
|
||||
<KEY>.+</KEY>
|
||||
<VALUE>/**\n
|
||||
* ${name}<#if isNotVoid> ${return}</#if>.\n
|
||||
<#if element.typeParameters?has_content> * \n
|
||||
</#if>
|
||||
<#list element.typeParameters as typeParameter>
|
||||
* @param <${typeParameter.name}> the type parameter\n
|
||||
</#list>
|
||||
<#if element.parameterList.parameters?has_content>
|
||||
*\n
|
||||
</#if>
|
||||
<#list element.parameterList.parameters as parameter>
|
||||
* @param ${parameter.name} the ${paramNames[parameter.name]}\n
|
||||
</#list>
|
||||
<#if isNotVoid>
|
||||
*\n
|
||||
* @return the ${return}\n
|
||||
</#if>
|
||||
<#if element.throwsList.referenceElements?has_content>
|
||||
*\n
|
||||
</#if>
|
||||
<#list element.throwsList.referenceElements as exception>
|
||||
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
|
||||
</#list>
|
||||
*/</VALUE>
|
||||
</METHOD>
|
||||
</METHODS>
|
||||
<FIELDS>
|
||||
<FIELD>
|
||||
<KEY>^.*(public|protected|private)*.+static.*(\w\s\w)+.+</KEY>
|
||||
<VALUE>/**\n
|
||||
* The constant ${element.getName()}.\n
|
||||
*/</VALUE>
|
||||
</FIELD>
|
||||
<FIELD>
|
||||
<KEY>^.*(public|protected|private)*.*(\w\s\w)+.+</KEY>
|
||||
<VALUE>/**\n
|
||||
<#if element.parent.isInterface()>
|
||||
* The constant ${element.getName()}.\n
|
||||
<#else>
|
||||
* The ${name}.\n
|
||||
</#if> */</VALUE>
|
||||
</FIELD>
|
||||
<FIELD>
|
||||
<KEY>.+</KEY>
|
||||
<VALUE>/**\n
|
||||
<#if element.parent.isEnum()>
|
||||
*${name} ${typeName}.\n
|
||||
<#else>
|
||||
* The ${name}.\n
|
||||
</#if>*/</VALUE>
|
||||
</FIELD>
|
||||
</FIELDS>
|
||||
</TEMPLATES>
|
||||
</component>
|
||||
</project>
|
5
.idea/libraries/bld.xml
generated
5
.idea/libraries/bld.xml
generated
|
@ -2,12 +2,11 @@
|
|||
<library name="bld">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1.jar!/" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-1.7.5.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1-sources.jar!/" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-1.7.5-sources.jar!/" />
|
||||
</SOURCES>
|
||||
<excluded>
|
||||
<root url="jar://$PROJECT_DIR$/lib/bld/bld-wrapper.jar!/" />
|
||||
|
|
4
.idea/libraries/compile.xml
generated
4
.idea/libraries/compile.xml
generated
|
@ -7,7 +7,7 @@
|
|||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/compile" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" type="SOURCES" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" type="SOURCES" />
|
||||
</library>
|
||||
</component>
|
4
.idea/libraries/runtime.xml
generated
4
.idea/libraries/runtime.xml
generated
|
@ -7,7 +7,7 @@
|
|||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/runtime" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" type="SOURCES" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" type="SOURCES" />
|
||||
</library>
|
||||
</component>
|
4
.idea/libraries/test.xml
generated
4
.idea/libraries/test.xml
generated
|
@ -7,7 +7,7 @@
|
|||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/test" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" type="SOURCES" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" type="SOURCES" />
|
||||
</library>
|
||||
</component>
|
6
.idea/misc.xml
generated
6
.idea/misc.xml
generated
|
@ -1,4 +1,3 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="EntryPointsManager">
|
||||
<entry_points version="2.0">
|
||||
|
@ -9,7 +8,6 @@
|
|||
<pattern value="rife.bld.extension.PmdOperation" method="addInputPath" />
|
||||
<pattern value="rife.bld.extension.PmdOperation" method="addRelativizeRoot" />
|
||||
<pattern value="rife.bld.extension.PmdOperation" method="addRuleSet" />
|
||||
<pattern value="rife.bld.extension.PmdOperationBuild" method="jacoco" />
|
||||
</component>
|
||||
<component name="PDMPlugin">
|
||||
<option name="customRuleSets">
|
||||
|
@ -19,13 +17,11 @@
|
|||
<option value="$PROJECT_DIR$/../bld-exec/config/pmd.xml" />
|
||||
<option value="$PROJECT_DIR$/../bld-testng/config/pmd.xml" />
|
||||
<option value="K:\java\semver\config\pmd.xml" />
|
||||
<option value="$PROJECT_DIR$/../bld-pitest/config/pmd.xml" />
|
||||
<option value="$PROJECT_DIR$/../bld-generated-version/config/pmd.xml" />
|
||||
</list>
|
||||
</option>
|
||||
<option name="skipTestSources" value="false" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="17" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/build" />
|
||||
</component>
|
||||
</project>
|
9
.idea/runConfigurations/PmdOperation.xml
generated
Normal file
9
.idea/runConfigurations/PmdOperation.xml
generated
Normal file
|
@ -0,0 +1,9 @@
|
|||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="PmdOperation" type="Application" factoryName="Application" nameIsGenerated="true">
|
||||
<option name="MAIN_CLASS_NAME" value="rife.bld.extension.PmdOperation" />
|
||||
<module name="app" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
13
.idea/runConfigurations/Run Tests.xml
generated
Normal file
13
.idea/runConfigurations/Run Tests.xml
generated
Normal file
|
@ -0,0 +1,13 @@
|
|||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Run Tests" type="JUnit" factoryName="JUnit">
|
||||
<module name="app" />
|
||||
<option name="PACKAGE_NAME" value="moog" />
|
||||
<option name="MAIN_CLASS_NAME" value="rife.bld.extension" />
|
||||
<option name="METHOD_NAME" value="" />
|
||||
<option name="TEST_OBJECT" value="directory" />
|
||||
<dir value="$PROJECT_DIR$/src/test/java" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
5
.vscode/launch.json
vendored
5
.vscode/launch.json
vendored
|
@ -1,6 +1,11 @@
|
|||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "java",
|
||||
"name": "Run Main",
|
||||
"request": "launch",
|
||||
"mainClass": "rife.bld.extension.PmdOperation },
|
||||
{
|
||||
"type": "java",
|
||||
"name": "Run Tests",
|
||||
|
|
10
.vscode/settings.json
vendored
10
.vscode/settings.json
vendored
|
@ -3,13 +3,13 @@
|
|||
"src/main/java",
|
||||
"src/main/resources",
|
||||
"src/test/java",
|
||||
"src/test/resources",
|
||||
"src/bld/java",
|
||||
"src/bld/resources"
|
||||
"src/bld/java"
|
||||
],
|
||||
"java.configuration.updateBuildConfiguration": "automatic",
|
||||
"java.project.referencedLibraries": [
|
||||
"${HOME}/.bld/dist/bld-2.2.1.jar",
|
||||
"lib/**/*.jar"
|
||||
"${HOME}bld-1.7.0-SNAPSHOT.jar",
|
||||
"lib/compile/*.jar",
|
||||
"lib/runtime/*.jar",
|
||||
"lib/test/*.jar"
|
||||
]
|
||||
}
|
||||
|
|
29
README.md
29
README.md
|
@ -1,26 +1,19 @@
|
|||
# [bld](https://rife2.com/bld) Extension to Perform Static Code Analysis with [PMD](https://pmd.github.io/)
|
||||
|
||||
|
||||
[](https://opensource.org/licenses/Apache-2.0)
|
||||
[](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
|
||||
[](https://rife2.com/bld)
|
||||
[](https://rife2.com/bld)
|
||||
[](https://repo.rife2.com/#/releases/com/uwyn/rife2/bld-pmd)
|
||||
[](https://repo.rife2.com/#/snapshots/com/uwyn/rife2/bld-pmd)
|
||||
[](https://github.com/rife2/bld-pmd/actions/workflows/bld.yml)
|
||||
|
||||
To install the latest version, add the following to the `lib/bld/bld-wrapper.properties` file:
|
||||
To install, please refer to the [extensions documentation](https://github.com/rife2/bld/wiki/Extensions).
|
||||
|
||||
```properties
|
||||
bld.extension-pmd=com.uwyn.rife2:bld-pmd
|
||||
```
|
||||
|
||||
For more information, please refer to the [extensions](https://github.com/rife2/bld/wiki/Extensions) documentation.
|
||||
|
||||
## Check Source with PMD
|
||||
|
||||
To check all source Codecode using the [Java Quickstart](https://docs.pmd-code.org/latest/pmd_rules_java.html) configuration, add the following to your build file:
|
||||
To check all source code using the [java quickstart rule](https://pmd.github.io/pmd/pmd_rules_java.html), add the following to your build file
|
||||
|
||||
```java
|
||||
@BuildCommand(summary = "Checks source code with PMD")
|
||||
@BuildCommand
|
||||
public void pmd() throws Exception {
|
||||
new PmdOperation()
|
||||
.fromProject(this)
|
||||
|
@ -28,26 +21,26 @@ public void pmd() throws Exception {
|
|||
}
|
||||
```
|
||||
|
||||
```console
|
||||
```text
|
||||
./bld pmd test
|
||||
```
|
||||
|
||||
To check the main source directory using a custom ruleset, [Java Error Prone](https://docs.pmd-code.org/latest/pmd_rules_java.html#error-prone) configuration, and failing on any violation.
|
||||
To check the main source directory using a custom rule, [java error prone rule](https://pmd.github.io/pmd/pmd_rules_java.html) and failing on any violation.
|
||||
|
||||
```java
|
||||
@BuildCommand(value = "pmd-main", summary = "Checks main source code with PMD")
|
||||
@BuildCommand
|
||||
public void pmdMain() throws Exception {
|
||||
new PmdOperation()
|
||||
.fromProject(this)
|
||||
.failOnViolation(true)
|
||||
.inputPaths(srcMainDirectory())
|
||||
.inputPaths(this.srcMainDirectory().toPath())
|
||||
.ruleSets("config/pmd.xml", "category/java/errorprone.xml")
|
||||
.execute();
|
||||
}
|
||||
```
|
||||
|
||||
```console
|
||||
./bld compile pmd-main
|
||||
```text
|
||||
./bld compile pmdMain
|
||||
```
|
||||
|
||||
Please check the [PmdOperation documentation](https://rife2.github.io/bld-pmd/rife/bld/extension/PmdOperation.html#method-summary) for all available configuration options.
|
||||
|
|
110
config/pmd.xml
110
config/pmd.xml
|
@ -1,110 +0,0 @@
|
|||
<?xml version="1.0"?>
|
||||
<ruleset name="erik"
|
||||
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
|
||||
<description>Erik's Ruleset</description>
|
||||
<!-- BEST PRACTICES -->
|
||||
<rule ref="category/java/bestpractices.xml">
|
||||
<exclude name="AvoidPrintStackTrace"/>
|
||||
<exclude name="GuardLogStatement"/>
|
||||
<exclude name="UnitTestContainsTooManyAsserts"/>
|
||||
<exclude name="UnitTestShouldUseTestAnnotation"/>
|
||||
</rule>
|
||||
|
||||
<rule ref="category/java/bestpractices.xml/MissingOverride">
|
||||
<properties>
|
||||
<property name="violationSuppressXPath"
|
||||
value="//MethodDeclaration[@Name='hashCode' or @Name='equals' or @Name='toString']"/>
|
||||
</properties>
|
||||
</rule>
|
||||
|
||||
|
||||
<!-- CODE STYLE -->
|
||||
<rule ref="category/java/codestyle.xml">
|
||||
<exclude name="AtLeastOneConstructor"/>
|
||||
<exclude name="ClassNamingConventions"/>
|
||||
<exclude name="CommentDefaultAccessModifier"/>
|
||||
<exclude name="ConfusingTernary"/>
|
||||
<exclude name="FieldNamingConventions"/>
|
||||
<exclude name="LocalVariableCouldBeFinal"/>
|
||||
<exclude name="LongVariable"/>
|
||||
<exclude name="MethodArgumentCouldBeFinal"/>
|
||||
<exclude name="OnlyOneReturn"/>
|
||||
<exclude name="PackageCase"/>
|
||||
<exclude name="ShortClassName"/>
|
||||
<exclude name="ShortMethodName"/>
|
||||
<exclude name="ShortVariable"/>
|
||||
<exclude name="UseExplicitTypes"/>
|
||||
<exclude name="UseUnderscoresInNumericLiterals"/>
|
||||
<exclude name="UselessParentheses"/>
|
||||
</rule>
|
||||
|
||||
<rule ref="category/java/codestyle.xml/UnnecessaryImport">
|
||||
<properties>
|
||||
<property name="violationSuppressRegex" value="Unused (static|.*\.\*).*"/>
|
||||
</properties>
|
||||
</rule>
|
||||
|
||||
<!-- DESIGN -->
|
||||
<rule ref="category/java/design.xml">
|
||||
<exclude name="AvoidCatchingGenericException"/>
|
||||
<exclude name="AvoidDeeplyNestedIfStmts"/>
|
||||
<exclude name="AvoidUncheckedExceptionsInSignatures"/>
|
||||
<exclude name="CognitiveComplexity"/>
|
||||
<exclude name="CyclomaticComplexity"/>
|
||||
<exclude name="ExcessiveParameterList"/>
|
||||
<exclude name="ExcessivePublicCount"/>
|
||||
<exclude name="GodClass"/>
|
||||
<exclude name="LawOfDemeter"/>
|
||||
<exclude name="LoosePackageCoupling"/>
|
||||
<exclude name="NPathComplexity"/>
|
||||
<exclude name="NcssCount"/>
|
||||
<exclude name="TooManyFields"/>
|
||||
<exclude name="TooManyMethods"/>
|
||||
<exclude name="UseObjectForClearerAPI"/>
|
||||
</rule>
|
||||
|
||||
<!-- DOCUMENTATION -->
|
||||
<rule ref="category/java/documentation.xml">
|
||||
<exclude name="CommentRequired"/>
|
||||
<exclude name="CommentSize"/>
|
||||
</rule>
|
||||
|
||||
<!-- ERROR PRONE -->
|
||||
<rule ref="category/java/errorprone.xml">
|
||||
<exclude name="AssignmentInOperand"/>
|
||||
<exclude name="AvoidCatchingNPE"/>
|
||||
<exclude name="AvoidDuplicateLiterals"/>
|
||||
<exclude name="AvoidFieldNameMatchingMethodName"/>
|
||||
<exclude name="AvoidFieldNameMatchingTypeName"/>
|
||||
<exclude name="AvoidLiteralsInIfCondition"/>
|
||||
<exclude name="NullAssignment"/>
|
||||
<exclude name="UseLocaleWithCaseConversions"/>
|
||||
</rule>
|
||||
|
||||
<rule ref="category/java/errorprone.xml/AssignmentInOperand">
|
||||
<properties>
|
||||
<property name="allowWhile" value="true"/>
|
||||
<property name="allowFor" value="true"/>
|
||||
<property name="allowIf" value="true"/>
|
||||
</properties>
|
||||
</rule>
|
||||
<rule ref="category/java/errorprone.xml/AvoidDuplicateLiterals">
|
||||
<properties>
|
||||
<property name="skipAnnotations" value="true"/>
|
||||
</properties>
|
||||
</rule>
|
||||
|
||||
<!-- MULTITHREADING -->
|
||||
<rule ref="category/java/multithreading.xml">
|
||||
</rule>
|
||||
|
||||
<!-- PERFORMANCE -->
|
||||
<rule ref="category/java/performance.xml">
|
||||
</rule>
|
||||
|
||||
<!-- SECURITY -->
|
||||
<rule ref="category/java/security.xml">
|
||||
</rule>
|
||||
</ruleset>
|
Binary file not shown.
|
@ -1,6 +1,6 @@
|
|||
bld.downloadExtensionJavadoc=false
|
||||
bld.downloadExtensionSources=true
|
||||
bld.downloadLocation=
|
||||
bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.5
|
||||
bld.extensions=com.uwyn.rife2:bld-jacoco-report:0.9.1
|
||||
bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES
|
||||
bld.version=2.2.1
|
||||
bld.downloadLocation=
|
||||
bld.version=1.7.5
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2023-2025 the original author or authors.
|
||||
* Copyright 2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -16,74 +16,67 @@
|
|||
|
||||
package rife.bld.extension;
|
||||
|
||||
import rife.bld.BuildCommand;
|
||||
import rife.bld.Project;
|
||||
import rife.bld.publish.PublishDeveloper;
|
||||
import rife.bld.publish.PublishLicense;
|
||||
import rife.bld.publish.PublishScm;
|
||||
|
||||
import java.io.File;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import static rife.bld.dependencies.Repository.*;
|
||||
import static rife.bld.dependencies.Scope.*;
|
||||
import static rife.bld.dependencies.Repository.MAVEN_CENTRAL;
|
||||
import static rife.bld.dependencies.Repository.RIFE2_RELEASES;
|
||||
import static rife.bld.dependencies.Scope.compile;
|
||||
import static rife.bld.dependencies.Scope.runtime;
|
||||
import static rife.bld.dependencies.Scope.test;
|
||||
import static rife.bld.operations.JavadocOptions.DocLinkOption.NO_MISSING;
|
||||
|
||||
public class PmdOperationBuild extends Project {
|
||||
public PmdOperationBuild() {
|
||||
pkg = "rife.bld.extension";
|
||||
name = "bld-pmd";
|
||||
version = version(1, 3, 1);
|
||||
version = version(0, 9, 4);
|
||||
|
||||
javaRelease = 17;
|
||||
|
||||
downloadSources = true;
|
||||
autoDownloadPurge = true;
|
||||
repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES);
|
||||
|
||||
repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS);
|
||||
|
||||
var pmd = version(7, 15, 0);
|
||||
var pmd = version(7, 0, 0, "rc4");
|
||||
scope(compile)
|
||||
.include(dependency("com.uwyn.rife2", "bld", version(2, 2, 1)))
|
||||
.include(dependency("com.uwyn.rife2", "bld", version(1, 7, 5)))
|
||||
.include(dependency("net.sourceforge.pmd", "pmd-java", pmd));
|
||||
scope(runtime)
|
||||
.include(dependency("org.slf4j", "slf4j-simple", version(2, 0, 17)));
|
||||
.include(dependency("net.sourceforge.pmd", "pmd-java", pmd))
|
||||
.include(dependency("org.slf4j", "slf4j-simple", version(2,0,9)));
|
||||
scope(test)
|
||||
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 13, 2)))
|
||||
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 13, 2)))
|
||||
.include(dependency("org.assertj", "assertj-core", version(3, 27, 3)));
|
||||
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 0)))
|
||||
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 0)))
|
||||
.include(dependency("org.assertj", "assertj-core", version(3, 24, 2)));
|
||||
|
||||
javadocOperation()
|
||||
.javadocOptions()
|
||||
.author()
|
||||
.docLint(NO_MISSING)
|
||||
.link("https://rife2.github.io/bld/")
|
||||
.link("https://rife2.github.io/rife2/")
|
||||
.link("https://javadoc.io/doc/net.sourceforge.pmd/pmd-core/latest/");
|
||||
|
||||
publishOperation()
|
||||
// .repository(MAVEN_LOCAL)
|
||||
.repository(version.isSnapshot() ? repository("rife2-snapshot") : repository("rife2"))
|
||||
.repository(repository("github"))
|
||||
.info()
|
||||
.groupId("com.uwyn.rife2")
|
||||
.artifactId("bld-pmd")
|
||||
.description("bld Extension to Perform Static Code Analysis with PMD")
|
||||
.url("https://github.com/rife2/bld-pmd")
|
||||
.developer(new PublishDeveloper()
|
||||
.id("ethauvin").name("Erik C. Thauvin")
|
||||
.email("erik@thauvin.net")
|
||||
.url("https://erik.thauvin.net/")
|
||||
)
|
||||
.license(new PublishLicense()
|
||||
.name("The Apache License, Version 2.0")
|
||||
.url("https://www.apache.org/licenses/LICENSE-2.0.txt")
|
||||
)
|
||||
.scm(new PublishScm()
|
||||
.connection("scm:git:https://github.com/rife2/bld-pmd.git")
|
||||
.developer(new PublishDeveloper().id("ethauvin").name("Erik C. Thauvin").email("erik@thauvin.net")
|
||||
.url("https://erik.thauvin.net/"))
|
||||
.license(new PublishLicense().name("The Apache License, Version 2.0")
|
||||
.url("http://www.apache.org/licenses/LICENSE-2.0.txt"))
|
||||
.scm(new PublishScm().connection("scm:git:https://github.com/rife2/bld-pmd.git")
|
||||
.developerConnection("scm:git:git@github.com:rife2/bld-pmd.git")
|
||||
.url("https://github.com/rife2/bld-pmd")
|
||||
)
|
||||
.url("https://github.com/rife2/bld-pmd"))
|
||||
.signKey(property("sign.key"))
|
||||
.signPassphrase(property("sign.passphrase"));
|
||||
}
|
||||
|
@ -92,34 +85,10 @@ public class PmdOperationBuild extends Project {
|
|||
new PmdOperationBuild().start(args);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void test() throws Exception {
|
||||
var testResultsDir = "build/test-results/test/";
|
||||
|
||||
var op = testOperation().fromProject(this);
|
||||
op.testToolOptions().reportsDir(new File(testResultsDir));
|
||||
|
||||
Exception ex = null;
|
||||
try {
|
||||
op.execute();
|
||||
} catch (Exception e) {
|
||||
ex = e;
|
||||
}
|
||||
|
||||
var xunitViewer = new File("/usr/bin/xunit-viewer");
|
||||
if (xunitViewer.exists() && xunitViewer.canExecute()) {
|
||||
var reportsDir = "build/reports/tests/test/";
|
||||
|
||||
Files.createDirectories(Path.of(reportsDir));
|
||||
|
||||
new ExecOperation()
|
||||
.fromProject(this)
|
||||
.command(xunitViewer.getPath(), "-r", testResultsDir, "-o", reportsDir + "index.html")
|
||||
.execute();
|
||||
}
|
||||
|
||||
if (ex != null) {
|
||||
throw ex;
|
||||
}
|
||||
@BuildCommand(summary = "Generates JaCoCo Reports")
|
||||
public void jacoco() throws IOException {
|
||||
new JacocoReportOperation()
|
||||
.fromProject(this)
|
||||
.execute();
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,47 +0,0 @@
|
|||
/*
|
||||
* Copyright 2023-2025 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package rife.bld.extension.pmd;
|
||||
|
||||
/**
|
||||
* Represents the results of a PMD analysis, containing various counts
|
||||
* related to violations, errors, and rules.
|
||||
*
|
||||
* @param violations The number of violations found during the analysis
|
||||
* @param suppressedViolations The number of suppressed violations found during the analysis
|
||||
* @param errors The number of errors returned during the analysis
|
||||
* @param processingErrors The number of processing errors returned during the analysis
|
||||
* @param configurationErrors The number of processing errors returning during the analysis
|
||||
* @param rulesChecked The number of rules checked during the analysis
|
||||
* @since 1.3.0
|
||||
*/
|
||||
public record PmdAnalysisResults(
|
||||
int violations,
|
||||
int suppressedViolations,
|
||||
int errors,
|
||||
int processingErrors,
|
||||
int configurationErrors,
|
||||
int rulesChecked) {
|
||||
|
||||
/**
|
||||
* Checks if the analysis results indicate no errors of any type.
|
||||
*
|
||||
* @return {@code true} if there are no errors, {@code false} otherwise.
|
||||
*/
|
||||
public boolean hasNoErrors() {
|
||||
return errors == 0 && processingErrors == 0 && configurationErrors == 0;
|
||||
}
|
||||
}
|
255
src/test/java/rife/bld/extension/PmdOperationTest.java
Normal file
255
src/test/java/rife/bld/extension/PmdOperationTest.java
Normal file
|
@ -0,0 +1,255 @@
|
|||
/*
|
||||
* Copyright 2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package rife.bld.extension;
|
||||
|
||||
import net.sourceforge.pmd.PMDConfiguration;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatCode;
|
||||
|
||||
/**
|
||||
* PmdOperationTest class
|
||||
*
|
||||
* @author <a href="https://erik.thauvin.net/">Erik C. Thauvin</a>
|
||||
* @since 1.0
|
||||
*/
|
||||
class PmdOperationTest {
|
||||
static final String CATEGORY_FOO = "category/foo.xml";
|
||||
static final String CODE_STYLE = "category/java/codestyle.xml";
|
||||
static final Path CODE_STYLE_SAMPLE = Path.of("src/test/resources/java/CodeStyle.java");
|
||||
static final int CODING_STYLE_ERRORS = 13;
|
||||
static final String COMMAND_NAME = "pmd";
|
||||
static final String ERROR_PRONE = "category/java/errorprone.xml";
|
||||
static final int ERROR_PRONE_ERRORS = 8;
|
||||
static final Path ERROR_PRONE_SAMPLE = Path.of("src/test/resources/java/ErrorProne.java");
|
||||
static final String TEST = "test";
|
||||
|
||||
PmdOperation newPmdOperation() {
|
||||
final PmdOperation pmdOperation = new PmdOperation();
|
||||
pmdOperation.inputPaths(Path.of("src/main"), Path.of("src/test"));
|
||||
pmdOperation.reportFile_ = Paths.get("build", COMMAND_NAME, "pmd-test-report.txt");
|
||||
pmdOperation.cache_ = Paths.get("build", COMMAND_NAME, "pmd-cache");
|
||||
pmdOperation.failOnViolation_ = false;
|
||||
return pmdOperation;
|
||||
}
|
||||
|
||||
@Test
|
||||
void testAddInputPaths() {
|
||||
var pmd = newPmdOperation().ruleSets(PmdOperation.RULE_SET_DEFAULT, CODE_STYLE).inputPaths(ERROR_PRONE_SAMPLE)
|
||||
.addInputPath(CODE_STYLE_SAMPLE);
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(36);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testCache() {
|
||||
var cache = Path.of("build/pmd/temp-cache");
|
||||
var pmd = newPmdOperation().ruleSets(CODE_STYLE).inputPaths(CODE_STYLE_SAMPLE).cache(cache);
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(CODING_STYLE_ERRORS);
|
||||
var f = cache.toFile();
|
||||
assertThat(f.exists()).as("file exits").isTrue();
|
||||
assertThat(f.delete()).as("delete file").isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void testEncoding() {
|
||||
PmdOperation pmd = newPmdOperation().ruleSets(CATEGORY_FOO).encoding("UTF-16");
|
||||
PMDConfiguration config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getSourceEncoding()).isEqualTo(StandardCharsets.UTF_16).as("UTF-16");
|
||||
|
||||
pmd = pmd.encoding(StandardCharsets.ISO_8859_1);
|
||||
config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getSourceEncoding()).isEqualTo(StandardCharsets.ISO_8859_1).as("ISO_8859");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testFailOnValidation() {
|
||||
var pmd = newPmdOperation().ruleSets("category/java/documentation.xml")
|
||||
.inputPaths(Path.of("src/test/resources/java/Documentation.java"));
|
||||
assertThatCode(() -> pmd.failOnViolation(true).performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))
|
||||
).isInstanceOf(RuntimeException.class).hasMessageContaining('[' + TEST + ']');
|
||||
}
|
||||
|
||||
@Test
|
||||
void testIgnoreFile() {
|
||||
var pmd = newPmdOperation().ruleSets(ERROR_PRONE, CODE_STYLE).inputPaths(ERROR_PRONE_SAMPLE, CODE_STYLE_SAMPLE)
|
||||
.ignoreFile(Path.of("src/test/resources/ignore.txt"));
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testIncrementalAnalysis() {
|
||||
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).incrementalAnalysis(true);
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.isIgnoreIncrementalAnalysis()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
void testJavaBestPractices() {
|
||||
var pmd = newPmdOperation().ruleSets("category/java/bestpractices.xml")
|
||||
.inputPaths(Path.of("src/test/resources/java/BestPractices.java"));
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(11);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testJavaCodeStyle() {
|
||||
var pmd = newPmdOperation().ruleSets(CODE_STYLE).inputPaths(CODE_STYLE_SAMPLE);
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(CODING_STYLE_ERRORS);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testJavaCodeStyleAndErrorProne() {
|
||||
var pmd = newPmdOperation().ruleSets(CODE_STYLE).inputPaths(CODE_STYLE_SAMPLE);
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)))
|
||||
.as("code style").isEqualTo(CODING_STYLE_ERRORS);
|
||||
pmd = pmd.addRuleSet(ERROR_PRONE).addInputPath(ERROR_PRONE_SAMPLE);
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)))
|
||||
.as("code style + error prone").isEqualTo(34);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testJavaDesign() {
|
||||
var pmd = newPmdOperation().ruleSets("category/java/design.xml")
|
||||
.inputPaths(Path.of("src/test/resources/java/Design.java"))
|
||||
.cache(Path.of("build/pmd/design-cache"));
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(4);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testJavaDocumentation() {
|
||||
var pmd = newPmdOperation().ruleSets("category/java/documentation.xml")
|
||||
.inputPaths(Path.of("src/test/resources/java/Documentation.java"));
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(4);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testJavaErrorProne() {
|
||||
var pmd = newPmdOperation().ruleSets(ERROR_PRONE).inputPaths(ERROR_PRONE_SAMPLE);
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(ERROR_PRONE_ERRORS);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testJavaMultiThreading() {
|
||||
var pmd = newPmdOperation().ruleSets("category/java/multithreading.xml")
|
||||
.inputPaths(Path.of("src/test/resources/java/MultiThreading.java"));
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(3);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testJavaPerformance() {
|
||||
var pmd = newPmdOperation().ruleSets("category/java/performance.xml")
|
||||
.inputPaths(Path.of("src/test/resources/java/Performance.java"));
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(9);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testJavaQuickStart() {
|
||||
var pmd = newPmdOperation().ruleSets("rulesets/java/quickstart.xml")
|
||||
.inputPaths(Path.of("src/test/resources/java"));
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(34);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testJavaSecurity() {
|
||||
var pmd = newPmdOperation().ruleSets("category/java/security.xml")
|
||||
.inputPaths(Path.of("src/test/resources/java/Security.java"));
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testMainOperation() {
|
||||
var pmd = newPmdOperation().inputPaths(Path.of("src/main"))
|
||||
.performPmdAnalysis(TEST, newPmdOperation().initConfiguration(COMMAND_NAME));
|
||||
assertThat(pmd).isEqualTo(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testRelativizeRoots() {
|
||||
var foo = Path.of("foo/bar");
|
||||
var bar = Path.of("bar/foo");
|
||||
|
||||
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).relativizeRoots(foo).addRelativizeRoot(bar);
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getRelativizeRoots()).contains(foo).contains(bar);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testReportFormat() throws IOException {
|
||||
var pmd = newPmdOperation().ruleSets(ERROR_PRONE).reportFormat("xml").inputPaths(ERROR_PRONE_SAMPLE);
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(ERROR_PRONE_ERRORS);
|
||||
try (var br = Files.newBufferedReader(pmd.reportFile_)) {
|
||||
assertThat(br.readLine()).as("xml report").startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void testRuleSetsConfigFile() {
|
||||
var pmd = newPmdOperation().ruleSets("src/test/resources/pmd.xml")
|
||||
.ignoreFile(Path.of("src/test/resources/ignore-all.txt"));
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testRuleSetsEmpty() {
|
||||
var pmd = newPmdOperation().ruleSets("");
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testShowSuppressed() {
|
||||
var pmd = newPmdOperation().ruleSets(ERROR_PRONE).showSuppressed(true);
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.isShowSuppressedViolations()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void testSuppressedMarker() {
|
||||
var pmd = newPmdOperation().ruleSets(ERROR_PRONE).suppressedMarker(TEST);
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getSuppressMarker()).isEqualTo(TEST);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testThreads() {
|
||||
var pmd = newPmdOperation().ruleSets(ERROR_PRONE).threads(5);
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getThreads()).isEqualTo(5);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testUri() throws URISyntaxException {
|
||||
var uri = new URI("https://example.com");
|
||||
var pmd = newPmdOperation().ruleSets(ERROR_PRONE).uri(uri);
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getUri()).isEqualTo(uri);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testXml() {
|
||||
var pmd = newPmdOperation().inputPaths(Path.of("src/test/resources/pmd.xml"))
|
||||
.ruleSets("src/test/resources/xml/basic.xml");
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(0);
|
||||
}
|
||||
}
|
|
@ -1,761 +0,0 @@
|
|||
/*
|
||||
* Copyright 2023-2025 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package rife.bld.extension;
|
||||
|
||||
import net.sourceforge.pmd.PMDConfiguration;
|
||||
import net.sourceforge.pmd.lang.LanguageRegistry;
|
||||
import net.sourceforge.pmd.lang.rule.RulePriority;
|
||||
import org.assertj.core.api.AutoCloseableSoftAssertions;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Nested;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import rife.bld.BaseProject;
|
||||
import rife.bld.operations.exceptions.ExitStatusException;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.logging.ConsoleHandler;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatCode;
|
||||
|
||||
/**
|
||||
* PmdOperationTests class
|
||||
*
|
||||
* @author <a href="https://erik.thauvin.net/">Erik C. Thauvin</a>
|
||||
* @since 1.0
|
||||
*/
|
||||
class PmdOperationTests {
|
||||
private static final String ANALYSIS_FAILURE = "analysis should fail";
|
||||
private static final String ANALYSIS_SUCCESS = "analysis should succeed";
|
||||
private static final String BAR = "bar";
|
||||
private static final String CATEGORY_FOO = "category/foo.xml";
|
||||
private static final Path CODE_STYLE_SAMPLE = Path.of("src/test/resources/java/CodeStyle.java");
|
||||
private static final String CODE_STYLE_XML = "category/java/codestyle.xml";
|
||||
private static final String COMMAND_NAME = "pmd";
|
||||
private static final String DESIGN_XML = "category/java/design.xml";
|
||||
private static final String DOCUMENTATION_XML = "category/java/documentation.xml";
|
||||
private static final Path ERROR_PRONE_SAMPLE = Path.of("src/test/resources/java/ErrorProne.java");
|
||||
private static final String ERROR_PRONE_XML = "category/java/errorprone.xml";
|
||||
private static final File FILE_BAR = new File(BAR);
|
||||
private static final String FOO = "foo";
|
||||
private static final File FILE_FOO = new File(FOO);
|
||||
private static final Path PATH_BAR = Path.of(BAR);
|
||||
private static final Path PATH_FOO = Path.of(FOO);
|
||||
private static final String PERFORMANCE_XML = "category/java/performance.xml";
|
||||
private static final String SECURITY_XML = "category/java/security.xml";
|
||||
private static final String TEST = "test";
|
||||
|
||||
@BeforeAll
|
||||
public static void beforeAll() {
|
||||
var consoleHandler = new ConsoleHandler();
|
||||
var logger = PmdOperation.LOGGER;
|
||||
|
||||
consoleHandler.setLevel(Level.ALL);
|
||||
logger.addHandler(consoleHandler);
|
||||
logger.setLevel(Level.ALL);
|
||||
logger.setUseParentHandlers(false);
|
||||
}
|
||||
|
||||
PmdOperation newPmdOperation() {
|
||||
return new PmdOperation()
|
||||
.inputPaths(Path.of("src/main"), Path.of("src/test"))
|
||||
.cache("build/" + COMMAND_NAME + "/pmd-cache")
|
||||
.failOnViolation(false)
|
||||
.reportFile(Paths.get("build", COMMAND_NAME, "pmd-test-report.txt"));
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("Configuration Tests")
|
||||
class ConfigurationTests {
|
||||
@Test
|
||||
void cache() throws ExitStatusException {
|
||||
var cache = Path.of("build/pmd/temp-cache");
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets(CODE_STYLE_XML)
|
||||
.inputPaths(List.of(CODE_STYLE_SAMPLE))
|
||||
.cache(cache);
|
||||
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).rulesChecked())
|
||||
.isGreaterThan(0);
|
||||
var f = cache.toFile();
|
||||
assertThat(f.exists()).as("cache should exist").isTrue();
|
||||
assertThat(f.delete()).as("cache should be deleted").isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void collectFilesRecursively() {
|
||||
var pmd = newPmdOperation().ruleSets(ERROR_PRONE_XML).collectFilesRecursively(false);
|
||||
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.collectFilesRecursively()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
void encoding() {
|
||||
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).encoding("UTF-16");
|
||||
|
||||
PMDConfiguration config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getSourceEncoding()).as("encoding should be UTF-16")
|
||||
.isEqualTo(StandardCharsets.UTF_16);
|
||||
|
||||
pmd = pmd.encoding(StandardCharsets.ISO_8859_1);
|
||||
config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getSourceEncoding()).as("encoding should be ISO_8859")
|
||||
.isEqualTo(StandardCharsets.ISO_8859_1);
|
||||
}
|
||||
|
||||
@Test
|
||||
void incrementalAnalysis() {
|
||||
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).incrementalAnalysis(true);
|
||||
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.isIgnoreIncrementalAnalysis()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
void languageVersions() throws ExitStatusException {
|
||||
var language = LanguageRegistry.PMD.getLanguageById("java");
|
||||
assertThat(language).isNotNull();
|
||||
|
||||
var pmd = newPmdOperation()
|
||||
.forceLanguageVersion(language.getLatestVersion())
|
||||
.defaultLanguageVersions(language.getVersions())
|
||||
.languageVersions(language.getDefaultVersion())
|
||||
.ruleSets(PmdOperation.RULE_SET_DEFAULT);
|
||||
|
||||
assertThat(pmd.languageVersions()).as("should contain default language version")
|
||||
.contains(language.getDefaultVersion());
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).processingErrors())
|
||||
.as("should have processing errors").isGreaterThan(0);
|
||||
|
||||
assertThat(pmd.defaultLanguageVersions(language.getVersion("17"), language.getVersion("21"))
|
||||
.languageVersions(language.getVersions())
|
||||
.excludesStrings("src/test/resources/txt", "src/test/resources/xml")
|
||||
.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).configurationErrors())
|
||||
.as("should have no processing errors").isEqualTo(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void prependAuxClasspath() {
|
||||
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).prependAuxClasspath(FOO, BAR);
|
||||
assertThat(pmd.prependAuxClasspath()).isEqualTo(FOO + File.pathSeparator + BAR);
|
||||
}
|
||||
|
||||
@Test
|
||||
void priority() throws ExitStatusException {
|
||||
var pmd = newPmdOperation().inputPaths(CODE_STYLE_SAMPLE).minimumPriority(RulePriority.HIGH);
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).rulesChecked())
|
||||
.as(ANALYSIS_SUCCESS).isEqualTo(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void relativizeRoots() {
|
||||
var baz = Path.of("baz/foz");
|
||||
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets(List.of(CATEGORY_FOO))
|
||||
.relativizeRoots(PATH_FOO)
|
||||
.relativizeRoots(PATH_BAR.toFile()).relativizeRoots(baz.toString())
|
||||
.relativizeRoots(List.of(PATH_FOO, PATH_BAR, baz));
|
||||
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getRelativizeRoots()).as("multiple roots").isEqualTo(pmd.relativizeRoots())
|
||||
.containsExactly(PATH_FOO, PATH_BAR, baz, PATH_FOO, PATH_BAR, baz);
|
||||
|
||||
pmd = newPmdOperation().ruleSets(List.of(CATEGORY_FOO))
|
||||
.relativizeRootsFiles(List.of(PATH_FOO.toFile(), PATH_BAR.toFile(), baz.toFile()));
|
||||
config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getRelativizeRoots()).as("List(File...)").isEqualTo(pmd.relativizeRoots())
|
||||
.containsExactly(PATH_FOO, PATH_BAR, baz);
|
||||
|
||||
pmd = newPmdOperation().ruleSets(List.of(CATEGORY_FOO))
|
||||
.relativizeRootsStrings(List.of(PATH_FOO.toString(), PATH_BAR.toString(), baz.toString()));
|
||||
config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getRelativizeRoots()).as("List(String....)").isEqualTo(pmd.relativizeRoots())
|
||||
.containsExactly(PATH_FOO, PATH_BAR, baz);
|
||||
}
|
||||
|
||||
@Test
|
||||
void showSuppressed() {
|
||||
var pmd = newPmdOperation().ruleSets(ERROR_PRONE_XML).showSuppressed(true);
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.isShowSuppressedViolations()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void suppressedMarker() {
|
||||
var pmd = newPmdOperation().ruleSets(ERROR_PRONE_XML).suppressedMarker(TEST);
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getSuppressMarker()).isEqualTo(TEST);
|
||||
}
|
||||
|
||||
@Test
|
||||
void threads() {
|
||||
var pmd = newPmdOperation().ruleSets(ERROR_PRONE_XML).threads(5);
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getThreads()).isEqualTo(5);
|
||||
}
|
||||
|
||||
@Test
|
||||
void uri() throws URISyntaxException {
|
||||
var uri = new URI("https://example.com");
|
||||
var pmd = newPmdOperation().ruleSets(ERROR_PRONE_XML).uri(uri);
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getUri()).isEqualTo(uri);
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("Exclusion Tests")
|
||||
class ExclusionTests {
|
||||
@Test
|
||||
void addExcludes() {
|
||||
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).addExcludes(PATH_FOO);
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getExcludes()).containsExactly(PATH_FOO);
|
||||
|
||||
pmd = pmd.addExcludes(PATH_BAR);
|
||||
config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getExcludes()).containsExactly(PATH_FOO, PATH_BAR);
|
||||
}
|
||||
|
||||
@Test
|
||||
void addExcludesFiles() {
|
||||
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).addExcludesFiles(FILE_FOO);
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getExcludes()).containsExactly(FILE_FOO.toPath());
|
||||
|
||||
pmd = pmd.addExcludesFiles(FILE_BAR);
|
||||
config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getExcludes()).containsExactly(FILE_FOO.toPath(), FILE_BAR.toPath());
|
||||
}
|
||||
|
||||
@Test
|
||||
void addExcludesStrings() {
|
||||
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).addExcludesStrings(FOO);
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getExcludes()).containsExactly(PATH_FOO);
|
||||
|
||||
pmd = pmd.addExcludesStrings(BAR);
|
||||
config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getExcludes()).containsExactly(PATH_FOO, PATH_BAR);
|
||||
}
|
||||
|
||||
@Test
|
||||
void excludes() {
|
||||
var foz = Path.of("foz/baz");
|
||||
var baz = Path.of("baz/foz");
|
||||
|
||||
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).excludes(PATH_FOO, PATH_BAR);
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(pmd.excludes()).containsExactly(List.of(PATH_FOO, PATH_BAR).toArray(new Path[0]));
|
||||
assertThat(config.getExcludes()).containsExactly(List.of(PATH_FOO, PATH_BAR).toArray(new Path[0]));
|
||||
|
||||
var excludes = List.of(List.of(PATH_FOO, PATH_BAR), List.of(foz, baz));
|
||||
for (var exclude : excludes) {
|
||||
pmd = newPmdOperation().ruleSets(CATEGORY_FOO).excludes(exclude);
|
||||
config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getExcludes()).containsExactly(exclude.toArray(new Path[0]));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void excludesFiles() {
|
||||
var foz = new File("foz");
|
||||
var baz = new File("baz");
|
||||
|
||||
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).excludesFiles(FILE_FOO, FILE_BAR);
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getExcludes()).containsExactly(FILE_FOO.toPath(), FILE_BAR.toPath());
|
||||
|
||||
var excludes = List.of(List.of(FILE_FOO, FILE_BAR), List.of(foz, baz));
|
||||
for (var exclude : excludes) {
|
||||
pmd = newPmdOperation().ruleSets(CATEGORY_FOO).excludesFiles(exclude);
|
||||
config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getExcludes())
|
||||
.containsExactly(exclude.stream().map(File::toPath).toArray(Path[]::new));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void excludesStrings() {
|
||||
var foz = "foz";
|
||||
var baz = "baz";
|
||||
|
||||
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).excludesStrings(FOO, BAR);
|
||||
var config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(pmd.excludes()).containsExactly(PATH_FOO, PATH_BAR);
|
||||
assertThat(config.getExcludes()).containsExactly(PATH_FOO, PATH_BAR);
|
||||
|
||||
var excludes = List.of(List.of(FOO, BAR), List.of(foz, baz));
|
||||
for (var exclude : excludes) {
|
||||
pmd = newPmdOperation().ruleSets(CATEGORY_FOO).excludesStrings(exclude);
|
||||
config = pmd.initConfiguration(COMMAND_NAME);
|
||||
assertThat(config.getExcludes())
|
||||
.containsExactly(exclude.stream().map(Paths::get).toArray(Path[]::new));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("Failure Tests")
|
||||
class FailureTests {
|
||||
@Test
|
||||
void failOnError() {
|
||||
var pmd = newPmdOperation().ruleSets("src/test/resources/xml/old.xml")
|
||||
.inputPaths(Path.of("src/test/resources/java/Documentation.java"));
|
||||
assertThatCode(() -> pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)))
|
||||
.isInstanceOf(ExitStatusException.class);
|
||||
assertThatCode(() -> pmd.failOnError(false).performPmdAnalysis(TEST,
|
||||
pmd.initConfiguration(COMMAND_NAME))).doesNotThrowAnyException();
|
||||
}
|
||||
|
||||
@Test
|
||||
void failOnValidation() {
|
||||
var pmd = newPmdOperation().ruleSets(DOCUMENTATION_XML)
|
||||
.inputPaths(Path.of("src/test/resources/java/Documentation.java"));
|
||||
assertThatCode(() -> pmd.failOnViolation(true).performPmdAnalysis(TEST,
|
||||
pmd.initConfiguration(COMMAND_NAME))).isInstanceOf(ExitStatusException.class);
|
||||
assertThatCode(() -> pmd.failOnViolation(false).performPmdAnalysis(TEST,
|
||||
pmd.initConfiguration(COMMAND_NAME))).doesNotThrowAnyException();
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("Ignore File Tests")
|
||||
class IgnoreFileTests {
|
||||
@Test
|
||||
void ignoreFile() throws ExitStatusException {
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets(ERROR_PRONE_XML, CODE_STYLE_XML)
|
||||
.inputPaths(ERROR_PRONE_SAMPLE, CODE_STYLE_SAMPLE)
|
||||
.ignoreFile(Path.of("src/test/resources/txt/ignore.txt"));
|
||||
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as("%s for error prone and code style", ANALYSIS_SUCCESS).isEqualTo(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void ignoreSingleFile() throws ExitStatusException {
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets(ERROR_PRONE_XML)
|
||||
.inputPaths(ERROR_PRONE_SAMPLE)
|
||||
.ignoreFile(new File("src/test/resources/txt/ignore-single.txt"));
|
||||
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as("%s for error prone sample", ANALYSIS_SUCCESS).isEqualTo(0);
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("Input Paths Tests")
|
||||
class InputPathsTests {
|
||||
@Test
|
||||
void fileArray() throws ExitStatusException {
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets(PmdOperation.RULE_SET_DEFAULT, CODE_STYLE_XML)
|
||||
.inputPaths(ERROR_PRONE_SAMPLE.toFile(), CODE_STYLE_SAMPLE.toFile());
|
||||
|
||||
assertThat(pmd.inputPaths()).containsExactly(ERROR_PRONE_SAMPLE, CODE_STYLE_SAMPLE);
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as(ANALYSIS_FAILURE).isGreaterThan(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void mainOperation() throws ExitStatusException {
|
||||
var pmd = newPmdOperation()
|
||||
.inputPaths(new File("src/main"))
|
||||
.performPmdAnalysis(TEST, newPmdOperation().initConfiguration(COMMAND_NAME))
|
||||
.violations();
|
||||
|
||||
assertThat(pmd).as(ANALYSIS_SUCCESS).isEqualTo(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void pathArray() throws ExitStatusException {
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets(PmdOperation.RULE_SET_DEFAULT, CODE_STYLE_XML)
|
||||
.inputPaths(ERROR_PRONE_SAMPLE, CODE_STYLE_SAMPLE);
|
||||
|
||||
assertThat(pmd.inputPaths()).containsExactly(ERROR_PRONE_SAMPLE, CODE_STYLE_SAMPLE);
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as(ANALYSIS_FAILURE).isGreaterThan(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void pathList() throws ExitStatusException {
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets(PmdOperation.RULE_SET_DEFAULT, CODE_STYLE_XML)
|
||||
.inputPathsFiles(List.of(ERROR_PRONE_SAMPLE.toFile(), CODE_STYLE_SAMPLE.toFile()));
|
||||
|
||||
assertThat(pmd.inputPaths()).containsExactly(ERROR_PRONE_SAMPLE, CODE_STYLE_SAMPLE);
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as(ANALYSIS_FAILURE).isGreaterThan(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void stringArray() throws ExitStatusException {
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets(PmdOperation.RULE_SET_DEFAULT, CODE_STYLE_XML)
|
||||
.inputPaths(ERROR_PRONE_SAMPLE.toString(), CODE_STYLE_SAMPLE.toString());
|
||||
|
||||
assertThat(pmd.inputPaths()).containsExactly(ERROR_PRONE_SAMPLE, CODE_STYLE_SAMPLE);
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as(ANALYSIS_FAILURE).isGreaterThan(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void stringList() throws ExitStatusException {
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets(PmdOperation.RULE_SET_DEFAULT, CODE_STYLE_XML)
|
||||
.inputPathsStrings(List.of(ERROR_PRONE_SAMPLE.toString(), CODE_STYLE_SAMPLE.toString()));
|
||||
|
||||
assertThat(pmd.inputPaths()).containsExactly(ERROR_PRONE_SAMPLE, CODE_STYLE_SAMPLE);
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as(ANALYSIS_FAILURE).isGreaterThan(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void xml() throws ExitStatusException {
|
||||
var pmd = newPmdOperation().addInputPaths("src/test/resources/xml/pmd.xml")
|
||||
.ruleSets("src/test/resources/xml/basic.xml");
|
||||
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).configurationErrors())
|
||||
.isEqualTo(0);
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("Add Input Paths Tests")
|
||||
class AddInputPathsTests {
|
||||
final BaseProject project = new BaseProject();
|
||||
|
||||
@Test
|
||||
void addInputPathsAsFileArray() {
|
||||
var pmd = new PmdOperation().fromProject(project);
|
||||
pmd.inputPaths().clear();
|
||||
pmd = pmd.addInputPaths(project.srcMainDirectory(), project.srcTestDirectory());
|
||||
|
||||
assertThat(pmd.inputPaths()).as("File...").containsExactly(project.srcMainDirectory().toPath(),
|
||||
project.srcTestDirectory().toPath());
|
||||
}
|
||||
|
||||
@Test
|
||||
void addInputPathsAsFileList() {
|
||||
var pmd = new PmdOperation().fromProject(project);
|
||||
pmd.inputPaths().clear();
|
||||
pmd = pmd.addInputPathsFiles(List.of(project.srcMainDirectory(), project.srcTestDirectory()));
|
||||
|
||||
assertThat(pmd.inputPaths()).as("List(File...)")
|
||||
.containsExactly(project.srcMainDirectory().toPath(), project.srcTestDirectory().toPath());
|
||||
}
|
||||
|
||||
@Test
|
||||
void addInputPathsAsPathArray() {
|
||||
var pmd = new PmdOperation().fromProject(project);
|
||||
pmd.inputPaths().clear();
|
||||
pmd = pmd.addInputPaths(project.srcMainDirectory().toPath(), project.srcTestDirectory().toPath());
|
||||
|
||||
assertThat(pmd.inputPaths()).as("Path...")
|
||||
.containsExactly(project.srcMainDirectory().toPath(), project.srcTestDirectory().toPath());
|
||||
}
|
||||
|
||||
@Test
|
||||
void addInputPathsAsPathList() {
|
||||
var pmd = new PmdOperation().fromProject(project);
|
||||
pmd.inputPaths().clear();
|
||||
pmd = pmd.addInputPaths(List.of(project.srcMainDirectory().toPath(),
|
||||
project.srcTestDirectory().toPath()));
|
||||
|
||||
assertThat(pmd.inputPaths()).as("List(Path)")
|
||||
.containsExactly(project.srcMainDirectory().toPath(), project.srcTestDirectory().toPath());
|
||||
}
|
||||
|
||||
@Test
|
||||
void addInputPathsAsStringArray() {
|
||||
var pmd = new PmdOperation().fromProject(project);
|
||||
pmd.inputPaths().clear();
|
||||
pmd = pmd.addInputPaths(project.srcMainDirectory().getAbsolutePath(),
|
||||
project.srcTestDirectory().getAbsolutePath());
|
||||
|
||||
assertThat(pmd.inputPaths()).as("String...")
|
||||
.containsExactly(project.srcMainDirectory().toPath(), project.srcTestDirectory().toPath());
|
||||
}
|
||||
|
||||
@Test
|
||||
void addInputPathsAsStringList() {
|
||||
var pmd = new PmdOperation().fromProject(project);
|
||||
pmd.inputPaths().clear();
|
||||
pmd = pmd.addInputPathsStrings(
|
||||
List.of(project.srcMainDirectory().getAbsolutePath(),
|
||||
project.srcTestDirectory().getAbsolutePath())
|
||||
);
|
||||
|
||||
assertThat(pmd.inputPaths()).as("List(String...)")
|
||||
.containsExactly(project.srcMainDirectory().toPath(), project.srcTestDirectory().toPath());
|
||||
}
|
||||
|
||||
@Test
|
||||
void addInputPathsWithDefaults() {
|
||||
var pmd = new PmdOperation().fromProject(project);
|
||||
assertThat(pmd.inputPaths()).as("default input paths")
|
||||
.containsExactly(project.srcMainDirectory().toPath(), project.srcTestDirectory().toPath());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("Reporting Tests")
|
||||
class ReportingTests {
|
||||
@Test
|
||||
void reportFile() throws FileNotFoundException, ExitStatusException {
|
||||
var report = new File("build", "pmd-report-file");
|
||||
report.deleteOnExit();
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets(List.of(ERROR_PRONE_XML, DESIGN_XML))
|
||||
.reportFile(report);
|
||||
|
||||
pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME));
|
||||
assertThat(report).as("report should exist").exists();
|
||||
|
||||
try (var writer = new PrintWriter(report)) {
|
||||
writer.write("");
|
||||
}
|
||||
assertThat(report).as("report should not be empty").isEmpty();
|
||||
|
||||
pmd.reportFile(report.getAbsolutePath()).performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME));
|
||||
assertThat(report).as("report should not be empty").isNotEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
void reportFormat() throws IOException, ExitStatusException {
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets(ERROR_PRONE_XML)
|
||||
.reportFormat("xml")
|
||||
.inputPaths(ERROR_PRONE_SAMPLE);
|
||||
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as(ANALYSIS_FAILURE).isGreaterThan(0);
|
||||
try (var softly = new AutoCloseableSoftAssertions()) {
|
||||
try (var br = Files.newBufferedReader(pmd.reportFile())) {
|
||||
softly.assertThat(br.readLine()).as("XML report for %s", pmd.reportFile().toString())
|
||||
.startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void reportProperties() throws ExitStatusException {
|
||||
var pmd = newPmdOperation().ruleSets(CODE_STYLE_XML, ERROR_PRONE_XML)
|
||||
.includeLineNumber(true)
|
||||
.reportProperties(new Properties());
|
||||
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).processingErrors())
|
||||
.isEqualTo(0);
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("RuleSets Tests")
|
||||
class RuleSetsTests {
|
||||
@Test
|
||||
void javaBestPractices() throws ExitStatusException {
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets("category/java/bestpractices.xml")
|
||||
.inputPaths(Path.of("src/test/resources/java/BestPractices.java"));
|
||||
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as(ANALYSIS_FAILURE).isGreaterThan(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void javaCodeStyle() throws ExitStatusException {
|
||||
var pmd = newPmdOperation().ruleSets(CODE_STYLE_XML).inputPaths(CODE_STYLE_SAMPLE);
|
||||
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as(ANALYSIS_FAILURE).isGreaterThan(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void javaCodeStyleAndErrorProne() throws ExitStatusException {
|
||||
var pmd = newPmdOperation().ruleSets(CODE_STYLE_XML).inputPaths(CODE_STYLE_SAMPLE);
|
||||
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as("analysis with code style").isGreaterThan(0);
|
||||
|
||||
pmd = pmd.ruleSets(ERROR_PRONE_XML).inputPaths(ERROR_PRONE_SAMPLE);
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as("analysis with code style and error prone").isGreaterThan(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void javaDesign() throws ExitStatusException {
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets(DESIGN_XML)
|
||||
.inputPaths("src/test/resources/java/Design.java")
|
||||
.cache(new File("build/pmd/design-cache"));
|
||||
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as(ANALYSIS_FAILURE).isGreaterThan(0);
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).configurationErrors())
|
||||
.as(ANALYSIS_FAILURE).isGreaterThan(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void javaDocumentation() throws ExitStatusException {
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets(DOCUMENTATION_XML)
|
||||
.inputPaths(Path.of("src/test/resources/java/Documentation.java"));
|
||||
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as(ANALYSIS_FAILURE).isGreaterThan(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void javaErrorProne() throws ExitStatusException {
|
||||
var pmd = newPmdOperation().ruleSets(ERROR_PRONE_XML).inputPaths(ERROR_PRONE_SAMPLE);
|
||||
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as(ANALYSIS_FAILURE).isGreaterThan(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void javaMultiThreading() throws ExitStatusException {
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets("category/java/multithreading.xml")
|
||||
.inputPaths(Path.of("src/test/resources/java/MultiThreading.java"));
|
||||
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as(ANALYSIS_FAILURE).isGreaterThan(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void javaPerformance() throws ExitStatusException {
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets(PERFORMANCE_XML)
|
||||
.inputPaths(Path.of("src/test/resources/java/Performance.java"));
|
||||
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as(ANALYSIS_FAILURE).isGreaterThan(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void javaQuickStart() throws ExitStatusException {
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets(PmdOperation.RULE_SET_DEFAULT)
|
||||
.inputPaths(new File("src/test/resources/java/"));
|
||||
|
||||
assertThat(pmd.ruleSets()).containsExactly(PmdOperation.RULE_SET_DEFAULT);
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as(ANALYSIS_FAILURE).isGreaterThan(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void javaSecurity() throws ExitStatusException {
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets(SECURITY_XML)
|
||||
.inputPaths(Path.of("src/test/resources/java/Security.java"));
|
||||
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as(ANALYSIS_FAILURE).isGreaterThan(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void ruleSetsConfigFile() throws ExitStatusException {
|
||||
var pmd = newPmdOperation()
|
||||
.ruleSets("src/test/resources/xml/pmd.xml")
|
||||
.ignoreFile("src/test/resources/txt/ignore-all.txt");
|
||||
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).hasNoErrors()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void ruleSetsEmpty() throws ExitStatusException {
|
||||
var pmd = newPmdOperation().ruleSets("").failOnError(false);
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).errors())
|
||||
.isEqualTo(1);
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("Add RuleSets Tests")
|
||||
class AddRuleSetsTests {
|
||||
@Test
|
||||
void addRuleSetsWithDefault() {
|
||||
var pmd = new PmdOperation().fromProject(new BaseProject());
|
||||
|
||||
assertThat(pmd.ruleSets()).containsExactly(PmdOperation.RULE_SET_DEFAULT);
|
||||
}
|
||||
|
||||
@Test
|
||||
void addRuleSetsWithErrorProne() {
|
||||
var pmd = new PmdOperation().fromProject(new BaseProject());
|
||||
|
||||
pmd.addRuleSet(ERROR_PRONE_XML);
|
||||
|
||||
assertThat(pmd.ruleSets()).containsExactly(PmdOperation.RULE_SET_DEFAULT, ERROR_PRONE_XML);
|
||||
}
|
||||
|
||||
@Test
|
||||
void addRuleSetsWithList() {
|
||||
var pmd = new PmdOperation().fromProject(new BaseProject());
|
||||
pmd.ruleSets().clear();
|
||||
pmd.addRuleSet(List.of(PmdOperation.RULE_SET_DEFAULT, ERROR_PRONE_XML));
|
||||
|
||||
assertThat(pmd.ruleSets()).as("rulesets as collection")
|
||||
.containsExactly(PmdOperation.RULE_SET_DEFAULT, ERROR_PRONE_XML);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("Execution Tests")
|
||||
class ExecutionTests {
|
||||
@Test
|
||||
void execute() throws ExitStatusException {
|
||||
var pmd = new PmdOperation().fromProject(new BaseProject());
|
||||
|
||||
assertThat(pmd.inputPaths()).containsExactly(Paths.get("src/main").toAbsolutePath(),
|
||||
Paths.get("src/test").toAbsolutePath());
|
||||
|
||||
pmd.inputPaths().clear();
|
||||
pmd.inputPaths("src/main/java", "src/test/java")
|
||||
.ruleSets("config/pmd.xml");
|
||||
|
||||
assertThat(pmd.ruleSets()).containsExactly("config/pmd.xml");
|
||||
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)).violations())
|
||||
.as(ANALYSIS_SUCCESS).isEqualTo(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void executeNoProject() {
|
||||
var pmd = new PmdOperation();
|
||||
assertThatCode(pmd::execute).isInstanceOf(ExitStatusException.class);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,57 +0,0 @@
|
|||
/*
|
||||
* Copyright 2023-2025 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package rife.bld.extension.pmd;
|
||||
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Nested;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
|
||||
|
||||
class PmdAnalysisResultsTests {
|
||||
@Nested
|
||||
@DisplayName("Errors Tests")
|
||||
class ErrorsTests {
|
||||
@Test
|
||||
void hasConfigurationErrors() {
|
||||
var results = new PmdAnalysisResults(
|
||||
0, 0, 0, 0, 1, 0);
|
||||
assertThat(results.hasNoErrors()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
void hasErrors() {
|
||||
var results = new PmdAnalysisResults(
|
||||
0, 0, 1, 0, 0, 0);
|
||||
assertThat(results.hasNoErrors()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
void hasNoErrors() {
|
||||
var results = new PmdAnalysisResults(
|
||||
0, 0, 0, 0, 0, 0);
|
||||
assertThat(results.hasNoErrors()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void hasProcessingErrors() {
|
||||
var results = new PmdAnalysisResults(
|
||||
0, 0, 0, 1, 0, 0);
|
||||
assertThat(results.hasNoErrors()).isFalse();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,17 +1,17 @@
|
|||
/*
|
||||
* Copyright 2023-2024 the original author or authors.
|
||||
* Copyright 2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package java;
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
/*
|
||||
* Copyright 2023-2024 the original author or authors.
|
||||
* Copyright 2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package java;
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
/*
|
||||
* Copyright 2023-2024 the original author or authors.
|
||||
* Copyright 2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package java;
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
/*
|
||||
* Copyright 2023-2024 the original author or authors.
|
||||
* Copyright 2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package java;
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
/*
|
||||
* Copyright 2023-2024 the original author or authors.
|
||||
* Copyright 2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package java;
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
/*
|
||||
* Copyright 2023-2024 the original author or authors.
|
||||
* Copyright 2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package java;
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
/*
|
||||
* Copyright 2023-2024 the original author or authors.
|
||||
* Copyright 2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package java;
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
/*
|
||||
* Copyright 2023-2024 the original author or authors.
|
||||
* Copyright 2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package java;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0"?>
|
||||
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
name="test"
|
||||
<ruleset name="test"
|
||||
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
|
||||
<description>Erik's Ruleset</description>
|
||||
<!-- BEST PRACTICES -->
|
|
@ -1 +0,0 @@
|
|||
src/test/resources/java/ErrorProne.java
|
|
@ -1,8 +1,8 @@
|
|||
<?xml version="1.0"?>
|
||||
|
||||
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
name="Basic"
|
||||
<ruleset name="Basic"
|
||||
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
|
||||
<description>
|
||||
The Basic ruleset contains a collection of good practices which should be followed.
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
<?xml version="1.0"?>
|
||||
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
name="old"
|
||||
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
|
||||
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
|
||||
<description>Deprecated (old) rule</description>
|
||||
<rule ref="category/java/performance.xml/UnnecessaryWrapperObjectCreation"/>
|
||||
</ruleset>
|
Loading…
Add table
Add a link
Reference in a new issue