Compare commits

..

No commits in common. "main" and "0.9.5" have entirely different histories.
main ... 0.9.5

32 changed files with 315 additions and 876 deletions

View file

@ -1,16 +1,14 @@
name: bld-ci
on: [ push, pull_request, workflow_dispatch ]
on: [push, pull_request, workflow_dispatch]
jobs:
build-bld-project:
runs-on: ubuntu-latest
strategy:
matrix:
java-version: [ 17, 21, 24 ]
kotlin-version: [ 1.9.25, 2.0.21, 2.2.0 ]
os: [ ubuntu-latest, windows-latest, macos-latest ]
runs-on: ${{ matrix.os }}
java-version: [17, 21, 22]
steps:
- name: Checkout source repository
@ -24,16 +22,12 @@ jobs:
distribution: "zulu"
java-version: ${{ matrix.java-version }}
- name: Download dependencies
run: ./bld download
- name: Download dependencies [examples]
working-directory: examples
run: ./bld download
- name: Run Detekt [examples]
working-directory: examples
run: ./bld compile test-ci
- name: Download dependencies
run: ./bld download
- name: Run tests
run: ./bld compile test
run: ./bld compile test

View file

@ -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/"
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
uses: actions/deploy-pages@v1

13
.idea/icon.svg generated
View file

@ -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

View file

@ -2,12 +2,12 @@
<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-2.0.1.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-2.0.1-sources.jar!/" />
</SOURCES>
<excluded>
<root url="jar://$PROJECT_DIR$/lib/bld/bld-wrapper.jar!/" />

View file

@ -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>

View file

@ -8,7 +8,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>

View file

@ -8,7 +8,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>

2
.idea/misc.xml generated
View file

@ -3,7 +3,7 @@
<component name="EntryPointsManager">
<pattern value="rife.bld.extension.DetektOperationBuild" method="pmd" />
</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>

View file

@ -1,6 +1,6 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="DetektOperationTests" type="Application" factoryName="Application" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="rife.bld.extension.DetektOperationTests" />
<configuration default="false" name="Run Tests" type="Application" factoryName="Application" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="rife.bld.extension.DetektOperationTest" />
<module name="app" />
<method v="2">
<option name="Make" enabled="true" />

View file

@ -9,7 +9,7 @@
],
"java.configuration.updateBuildConfiguration": "automatic",
"java.project.referencedLibraries": [
"${HOME}/.bld/dist/bld-2.2.1.jar",
"${HOME}/.bld/dist/bld-2.0.1.jar",
"lib/**/*.jar"
]
}

View file

@ -3,20 +3,12 @@
[![License](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
[![Java](https://img.shields.io/badge/java-17%2B-blue)](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
[![bld](https://img.shields.io/badge/2.2.1-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld)
[![bld](https://img.shields.io/badge/2.0.1-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld)
[![Release](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/releases/com/uwyn/rife2/bld-detekt/maven-metadata.xml?color=blue)](https://repo.rife2.com/#/releases/com/uwyn/rife2/bld-detekt)
[![Snapshot](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/snapshots/com/uwyn/rife2/bld-detekt/maven-metadata.xml?label=snapshot)](https://repo.rife2.com/#/snapshots/com/uwyn/rife2/bld-detekt)
[![GitHub CI](https://github.com/rife2/bld-detekt/actions/workflows/bld.yml/badge.svg)](https://github.com/rife2/bld-detekt/actions/workflows/bld.yml)
To install the latest version, add the following to the `lib/bld/bld-wrapper.properties` file:
```properties
bld.extension-detekt=com.uwyn.rife2:bld-detekt
```
For more information, please refer to the [extensions](https://github.com/rife2/bld/wiki/Extensions) documentation.
## Check Source Code with Detekt
To install, please refer to the [extensions documentation](https://github.com/rife2/bld/wiki/Extensions).
To check all Kotlin source code located in the project, add the following to your build file:
```java

View file

@ -7,9 +7,9 @@
<!-- BEST PRACTICES -->
<rule ref="category/java/bestpractices.xml">
<exclude name="AvoidPrintStackTrace"/>
<exclude name="JUnit4TestShouldUseTestAnnotation"/>
<exclude name="JUnitTestContainsTooManyAsserts"/>
<exclude name="GuardLogStatement"/>
<exclude name="UnitTestContainsTooManyAsserts"/>
<exclude name="UnitTestShouldUseTestAnnotation"/>
</rule>
<rule ref="category/java/bestpractices.xml/MissingOverride">

View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="BldConfiguration">
<events />
</component>
</project>

View file

@ -1,13 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Kotlin2JsCompilerArguments">
<option name="moduleKind" value="plain" />
</component>
<component name="Kotlin2JvmCompilerArguments">
<option name="jvmTarget" value="17" />
</component>
<component name="KotlinCommonCompilerArguments">
<option name="apiVersion" value="2.1" />
<option name="languageVersion" value="2.1" />
<option name="jvmTarget" value="1.8" />
</component>
</project>

View file

@ -2,12 +2,12 @@
<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-2.0.1.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-2.0.1-sources.jar!/" />
</SOURCES>
<excluded>
<root url="jar://$PROJECT_DIR$/lib/bld/bld-wrapper.jar!/" />

View file

@ -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>

View file

@ -8,7 +8,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>

View file

@ -8,7 +8,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>

View file

@ -10,7 +10,6 @@
<pattern value="com.example.ExampleBuild" method="detektBaseline" />
<pattern value="com.example.ExampleBuild" method="detektMain" />
<pattern value="com.example.ExampleBuild" method="detektTest" />
<pattern value="com.example.ExampleBuild" method="testCi" />
</component>
<component name="PDMPlugin">
<option name="customRuleSets">

View file

@ -9,7 +9,7 @@
],
"java.configuration.updateBuildConfiguration": "automatic",
"java.project.referencedLibraries": [
"${HOME}/.bld/dist/bld-2.2.1.jar",
"${HOME}/.bld/dist/bld-2.0.1.jar",
"lib/**/*.jar"
]
}

Binary file not shown.

View file

@ -1,8 +1,8 @@
bld.downloadExtensionJavadoc=false
bld.downloadExtensionSources=true
bld.downloadLocation=
bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.10-SNAPSHOT
bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.1.0
bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.5
bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.0
bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES
bld.sourceDirectories=
bld.version=2.2.1
bld.version=2.0.1

View file

@ -26,19 +26,18 @@ public class ExampleBuild extends Project {
javaRelease = 17;
autoDownloadPurge = true;
downloadSources = true;
autoDownloadPurge = true;
repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES);
final var kotlin = version(2, 2, 0);
final var kotlin = version(2, 0, 0);
scope(compile)
.include(dependency("org.jetbrains.kotlin", "kotlin-stdlib", kotlin));
scope(test)
.include(dependency("org.jetbrains.kotlin", "kotlin-test-junit5", kotlin))
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 13, 1)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 13, 1)))
.include(dependency("org.junit.platform", "junit-platform-launcher", version(1, 13, 1)));
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 3)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 3)));
// Include the Kotlin source directory when creating or publishing sources Java Archives
jarSourcesOperation().sourceDirectories(new File(srcMainDirectory(), "kotlin"));
@ -46,14 +45,14 @@ public class ExampleBuild extends Project {
public static void main(String[] args) {
// Enable detailed logging
var level = Level.ALL;
var logger = Logger.getLogger("rife.bld.extension");
var consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(level);
logger.addHandler(consoleHandler);
logger.setLevel(level);
logger.setUseParentHandlers(false);
// var level = Level.ALL;
// var logger = Logger.getLogger("rife.bld.extension");
// var consoleHandler = new ConsoleHandler();
//
// consoleHandler.setLevel(level);
// logger.addHandler(consoleHandler);
// logger.setLevel(level);
// logger.setUseParentHandlers(false);
new ExampleBuild().start(args);
}
@ -101,13 +100,4 @@ public class ExampleBuild extends Project {
.input("src/test/kotlin")
.execute();
}
@BuildCommand(value = "test-ci", summary = "Run detekt with a test baseline")
public void testCi() throws ExitStatusException, IOException, InterruptedException {
// Run detekt with the test baseline (for CI testing)
new DetektOperation()
.fromProject(this)
.baseline("src/test/resources/detekt-baseline.xml")
.execute();
}
}

View file

@ -1,12 +0,0 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues/>
<CurrentIssues>
<ID>EmptyIfBlock:Example.kt$Example.Companion${ }</ID>
<ID>MagicNumber:Example.kt$Example$5</ID>
<ID>NewLineAtEndOfFile:ExampleTest.kt$com.example.ExampleTest.kt</ID>
<ID>ThrowingExceptionsWithoutMessageOrCause:Example.kt$Example.Companion$IllegalStateException()</ID>
<ID>UseCheckOrError:Example.kt$Example.Companion$throw IllegalStateException()</ID>
<ID>VariableNaming:Example.kt$Example$// https://detekt.dev/docs/rules/naming#variablenaming val Message: String get() = "Hello World!"</ID>
</CurrentIssues>
</SmellBaseline>

Binary file not shown.

View file

@ -1,8 +1,8 @@
bld.downloadExtensionJavadoc=false
bld.downloadExtensionSources=true
bld.downloadLocation=
bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.5
bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.3.0
bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.2
bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.4
bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES
bld.sourceDirectories=
bld.version=2.2.1
bld.version=2.0.1

View file

@ -1,5 +1,5 @@
/*
* Copyright 2023-2025 the original author or authors.
* Copyright 2023-2024 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.
@ -22,11 +22,7 @@ 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.util.List;
import java.util.Locale;
import static rife.bld.dependencies.Repository.*;
import static rife.bld.dependencies.Scope.compile;
@ -37,22 +33,20 @@ public class DetektOperationBuild extends Project {
public DetektOperationBuild() {
pkg = "rife.bld.extension";
name = "DetektOperation";
version = version(0, 9, 10, "SNAPSHOT");
version = version(0, 9, 5);
javaRelease = 17;
downloadSources = true;
autoDownloadPurge = true;
repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS);
scope(compile)
.include(dependency("com.uwyn.rife2", "bld", version(2, 2, 1)))
.include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 8)));
.include(dependency("com.uwyn.rife2", "bld", version(2, 0, 1)))
.include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 6)));
scope(test)
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 13, 1)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 13, 1)))
.include(dependency("org.assertj", "assertj-core", version(3, 27, 3)));
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 3)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 3)))
.include(dependency("org.assertj", "assertj-core", version(3, 26, 3)));
javadocOperation()
.javadocOptions()
.author()
@ -62,26 +56,28 @@ public class DetektOperationBuild extends Project {
publishOperation()
.repository(version.isSnapshot() ? repository("rife2-snapshot") : repository("rife2"))
.repository(repository("github"))
.info()
.groupId("com.uwyn.rife2")
.artifactId("bld-detekt")
.description("bld Detekt Extension")
.url("https://github.com/rife2/bld-detekt")
.developer(new PublishDeveloper()
.id("ethauvin")
.name("Erik C. Thauvin")
.email("erik@thauvin.net")
.url("https://erik.thauvin.net/")
.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")
.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-detekt.git")
.developerConnection("scm:git:git@github.com:rife2/bld-detekt.git")
.url("https://github.com/rife2/bld-detekt")
.scm(
new PublishScm()
.connection("scm:git:https://github.com/rife2/bld-detekt.git")
.developerConnection("scm:git:git@github.com:rife2/bld-detekt.git")
.url("https://github.com/rife2/bld-detekt")
)
.signKey(property("sign.key"))
.signPassphrase(property("sign.passphrase"));
@ -101,40 +97,11 @@ public class DetektOperationBuild extends Project {
@Override
public void test() throws Exception {
var os = System.getProperty("os.name");
if (os != null && os.toLowerCase(Locale.US).contains("linux")) {
new ExecOperation()
.fromProject(this)
.command("scripts/cliargs.sh")
.execute();
}
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;
}
new ExecOperation()
.fromProject(this)
.command("scripts/cliargs.sh")
.execute();
super.test();
}

View file

@ -1,5 +1,5 @@
/*
* Copyright 2023-2025 the original author or authors.
* Copyright 2023-2024 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.
@ -24,8 +24,8 @@ import rife.bld.operations.exceptions.ExitStatusException;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
@ -48,14 +48,14 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
"kotlin-reflect-",
"kotlin-script-runtime-",
"kotlin-stdlib-",
"kotlinx-coroutines-",
"kotlin-stdlib-jdk7-",
"kotlin-stdlib-jdk8-",
"kotlinx-html-jvm-",
"kotlinx-serialization-",
"poko-annotations-jvm-",
"sarif4k-jvm-",
"snakeyaml-engine-",
"trove4j-");
private static final Logger LOGGER = Logger.getLogger(DetektOperation.class.getName());
private static final Logger LOGGER = Logger.getLogger(Report.class.getName());
private final Collection<File> classpath_ = new ArrayList<>();
private final Collection<File> config_ = new ArrayList<>();
private final Collection<String> excludes_ = new ArrayList<>();
@ -128,28 +128,8 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
* @return this operation instance
*/
public DetektOperation basePath(File path) {
return basePath(path.getAbsolutePath());
}
/**
* Retrieves the base path.
*
* @return the directory path
*/
public String basePath() {
return basePath_;
}
/**
* Specifies a directory as the base path. Currently, it impacts all file
* paths in the formatted reports. File paths in console output and txt
* report are not affected and remain as absolute paths.
*
* @param path the directory path
* @return this operation instance
*/
public DetektOperation basePath(Path path) {
return basePath(path.toFile().getAbsolutePath());
basePath_ = path.getAbsolutePath();
return this;
}
/**
@ -172,27 +152,8 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
* @return this operation instance
*/
public DetektOperation baseline(File baseline) {
return baseline(baseline.getAbsolutePath());
}
/**
* If a baseline xml file is passed in, only new code smells not in the
* baseline are printed in the console.
*
* @param baseline the baseline xml file
* @return this operation instance
*/
public DetektOperation baseline(Path baseline) {
return baseline(baseline.toFile().getAbsolutePath());
}
/**
* Retrieves the baseline xml file.
*
* @return the baseline xml file
*/
public String baseline() {
return baseline_;
baseline_ = baseline.getAbsolutePath();
return this;
}
/**
@ -214,10 +175,10 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param paths one or more files
* @return this operation instance
* @see #classPath(Collection)
*/
public DetektOperation classPath(File... paths) {
return classPath(List.of(paths));
classpath_.addAll(List.of(paths));
return this;
}
/**
@ -226,22 +187,10 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param paths one or more files
* @return this operation instance
* @see #classPathPaths(Collection)
*/
public DetektOperation classPath(Path... paths) {
return classPathPaths(List.of(paths));
}
/**
* EXPERIMENTAL: Paths where to find user class files and jar dependencies.
* Used for type resolution.
*
* @param paths one or more files
* @return this operation instance
* @see #classPathStrings(Collection)
*/
public DetektOperation classPath(String... paths) {
return classPathStrings(List.of(paths));
classpath_.addAll(Arrays.stream(paths).map(File::new).toList());
return this;
}
@ -251,7 +200,6 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param paths the paths
* @return this operation instance
* @see #classPath(File...)
*/
public DetektOperation classPath(Collection<File> paths) {
classpath_.addAll(paths);
@ -267,39 +215,15 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
return classpath_;
}
/**
* EXPERIMENTAL: Paths where to find user class files and jar dependencies.
* Used for type resolution.
*
* @param paths the paths
* @return this operation instance
* @see #classPath(Path...)
*/
public DetektOperation classPathPaths(Collection<Path> paths) {
return classPath(paths.stream().map(Path::toFile).toList());
}
/**
* EXPERIMENTAL: Paths where to find user class files and jar dependencies.
* Used for type resolution.
*
* @param paths the paths
* @return this operation instance
* @see #classPath(String...)
*/
public DetektOperation classPathStrings(Collection<String> paths) {
return classPath(paths.stream().map(File::new).toList());
}
/**
* Paths to the config files ({@code path/to/config.yml}).
*
* @param configs one or more config files
* @return this operation instance
* @see #config(Collection)
*/
public DetektOperation config(File... configs) {
return config(List.of(configs));
config_.addAll(List.of(configs));
return this;
}
/**
@ -307,21 +231,10 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param configs one or more config files
* @return this operation instance
* @see #configPaths(Collection)
*/
public DetektOperation config(Path... configs) {
return configPaths(List.of(configs));
}
/**
* Paths to the config files ({@code path/to/config.yml}).
*
* @param configs one or more config files
* @return this operation instance
* @see #configStrings(Collection)
*/
public DetektOperation config(String... configs) {
return configStrings(List.of(configs));
config_.addAll(Arrays.stream(configs).map(File::new).toList());
return this;
}
/**
@ -329,7 +242,6 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param configs the config files
* @return this operation instance
* @see #config(File...)
*/
public DetektOperation config(Collection<File> configs) {
config_.addAll(configs);
@ -345,17 +257,6 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
return config_;
}
/**
* Paths to the config files ({@code path/to/config.yml}).
*
* @param configs the config files
* @return this operation instance
* @see #config(Path...)
*/
public DetektOperation configPaths(Collection<Path> configs) {
return config(configs.stream().map(Path::toFile).toList());
}
/**
* Path to the config resource on detekt's classpath ({@code path/to/config.yml}).
*
@ -374,37 +275,7 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
* @return this operation instance
*/
public DetektOperation configResource(File resource) {
return configResource(resource.getAbsolutePath());
}
/**
* Path to the config resource on detekt's classpath ({@code path/to/config.yml}).
*
* @param resource the config resource path
* @return this operation instance
*/
public DetektOperation configResource(Path resource) {
return configResource(resource.toFile().getAbsolutePath());
}
/**
* Retrieves the path of the config resource.
*
* @return the config resource path
*/
public String configResource() {
return configResource_;
}
/**
* Paths to the config files ({@code path/to/config.yml}).
*
* @param configs the config files
* @return this operation instance
* @see #config(String...)
*/
public DetektOperation configStrings(Collection<String> configs) {
config_.addAll(configs.stream().map(File::new).toList());
configResource_ = resource.getAbsolutePath();
return this;
}
@ -449,7 +320,8 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
* @return this operation instance
*/
public DetektOperation excludes(String... patterns) {
return excludes(List.of(patterns));
excludes_.addAll(List.of(patterns));
return this;
}
/**
@ -488,7 +360,7 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
throw new ExitStatusException(ExitStatusException.EXIT_FAILURE);
} else {
super.execute();
if (successful_ && LOGGER.isLoggable(Level.INFO) && !silent()) {
if (successful_ && LOGGER.isLoggable(Level.INFO) && !silent()){
if (createBaseline_) {
LOGGER.info("Detekt baseline generated successfully: "
+ "file://" + new File(baseline_).toURI().getPath());
@ -701,7 +573,7 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
}
}
}
return String.join(File.pathSeparator, jars);
return String.join(":", jars);
}
/**
@ -712,7 +584,8 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
* @return this operation instance
*/
public DetektOperation includes(String... patterns) {
return includes(List.of(patterns));
includes_.addAll(List.of(patterns));
return this;
}
/**
@ -741,7 +614,6 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param paths the paths
* @return this operation instance
* @see #input(Collection)
*/
public DetektOperation input(Collection<File> paths) {
input_.addAll(paths);
@ -753,10 +625,10 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param paths one or more paths
* @return this operation instance
* @see #inputStrings(Collection)
*/
public DetektOperation input(String... paths) {
return inputStrings(List.of(paths));
input_.addAll(Arrays.stream(paths).map(File::new).toList());
return this;
}
/**
@ -764,22 +636,12 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param paths one or more paths
* @return this operation instance
* @see #input(Collection)
*/
public DetektOperation input(File... paths) {
return input(List.of(paths));
input_.addAll(List.of(paths));
return this;
}
/**
* Input paths to analyze. If not specified the current working directory is used.
*
* @param paths one or more paths
* @return this operation instance
* @see #inputPaths(Collection)
*/
public DetektOperation input(Path... paths) {
return inputPaths(List.of(paths));
}
/**
* Returns the input paths to analyze.
@ -790,28 +652,6 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
return input_;
}
/**
* Input paths to analyze. If not specified the current working directory is used.
*
* @param paths the paths
* @return this operation instance
* @see #input(Path...)
*/
public DetektOperation inputPaths(Collection<Path> paths) {
return input(paths.stream().map(Path::toFile).toList());
}
/**
* Input paths to analyze. If not specified the current working directory is used.
*
* @param paths the paths
* @return this operation instance
* @see #input(String...)
*/
public DetektOperation inputStrings(Collection<String> paths) {
return input(paths.stream().map(File::new).toList());
}
/*
* Determines if a string is not blank.
*/
@ -889,10 +729,10 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param jars one or more jars
* @return this operation instance
* @see #pluginsStrings(Collection)
*/
public DetektOperation plugins(String... jars) {
return pluginsStrings(List.of(jars));
plugins_.addAll(Arrays.stream(jars).map(File::new).toList());
return this;
}
/**
@ -900,21 +740,10 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param jars one or more jars
* @return this operation instance
* @see #plugins(Collection)
*/
public DetektOperation plugins(File... jars) {
return plugins(List.of(jars));
}
/**
* Extra paths to plugin jars.
*
* @param jars one or more jars
* @return this operation instance
* @see #pluginsPaths(Collection)
*/
public DetektOperation plugins(Path... jars) {
return pluginsPaths(List.of(jars));
plugins_.addAll(List.of(jars));
return this;
}
/**
@ -922,7 +751,6 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param jars the jars paths
* @return this operation instance
* @see #input(File...)
*/
public DetektOperation plugins(Collection<File> jars) {
plugins_.addAll(jars);
@ -938,28 +766,6 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
return plugins_;
}
/**
* Extra paths to plugin jars.
*
* @param jars the jars paths
* @return this operation instance
* @see #plugins(Path...)
*/
public DetektOperation pluginsPaths(Collection<Path> jars) {
return plugins(jars.stream().map(Path::toFile).toList());
}
/**
* Extra paths to plugin jars.
*
* @param jars the jars paths
* @return this operation instance
* @see #plugins(String...)
*/
public DetektOperation pluginsStrings(Collection<String> jars) {
return plugins(jars.stream().map(File::new).toList());
}
/**
* Generates a report for given {@link ReportId report-id} and stores it on given 'path'.
*

View file

@ -1,5 +1,5 @@
/*
* Copyright 2023-2025 the original author or authors.
* Copyright 2023-2024 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.

View file

@ -1,5 +1,5 @@
/*
* Copyright 2023-2025 the original author or authors.
* Copyright 2023-2024 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.

View file

@ -0,0 +1,200 @@
/*
* Copyright 2023-2024 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 org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import rife.bld.BaseProject;
import rife.bld.blueprints.BaseProjectBlueprint;
import rife.bld.extension.detekt.Report;
import rife.bld.extension.detekt.ReportId;
import rife.bld.operations.exceptions.ExitStatusException;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Objects;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import static org.assertj.core.api.Assertions.*;
@SuppressWarnings("PMD.AvoidDuplicateLiterals")
class DetektOperationTest {
@BeforeAll
static void beforeAll() {
var level = Level.ALL;
var logger = Logger.getLogger("rife.bld.extension");
var consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(level);
logger.addHandler(consoleHandler);
logger.setLevel(level);
logger.setUseParentHandlers(false);
}
static void deleteOnExit(File folder) {
folder.deleteOnExit();
for (var f : Objects.requireNonNull(folder.listFiles())) {
if (f.isDirectory()) {
deleteOnExit(f);
} else {
f.deleteOnExit();
}
}
}
@Test
@SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops")
void testCheckAllParameters() throws IOException {
var args = Files.readAllLines(Paths.get("src", "test", "resources", "detekt-args.txt"));
assertThat(args).isNotEmpty();
var op = new DetektOperation()
.fromProject(new BaseProject())
.allRules(true)
.autoCorrect(true)
.basePath("basePath")
.basePath(new File("basePath"))
.baseline("baseline")
.buildUponDefaultConfig(true)
.classPath(new File("path1"))
.classPath("path2", "path3")
.classPath(List.of(new File("path4"), new File("path5")))
.config(new File("config1"))
.config("config2", "config3")
.config(List.of(new File("config4"), new File("config5")))
.configResource("configResource")
.configResource(new File("configResource"))
.createBaseline(true)
.debug(true)
.disableDefaultRuleSets(true)
.excludes(List.of("excludes1", "excludes2"))
.excludes("excludes3", "excludes4")
.generateConfig(true)
.includes(List.of("includes1", "includes2"))
.includes("includes3", "includes4", "includes5")
.input(new File("input1"))
.input("input2", "input3")
.input(List.of(new File("input4"), new File("input5")))
.jdkHome("jdkHome")
.jvmTarget("jvmTarget")
.languageVersion("languageVersion")
.maxIssues(10)
.parallel(true)
.plugins(new File("jar1"))
.plugins("jar2", "jar3")
.plugins(List.of(new File("jar4"), new File("jar5")))
.report(new Report(ReportId.HTML, "reports"));
assertThat(op.excludes()).as("excludes[]").containsExactly(".*/build/.*", ".*/resources/.*",
"excludes1", "excludes2", "excludes3", "excludes4");
for (var i = 1; i < 6; i++) {
assertThat(op.classPath()).as("classPath[" + i + ']').hasSize(5).contains(new File("path" + i));
assertThat(op.config()).as("config[" + i + ']').hasSize(5).contains(new File("config" + i));
assertThat(op.includes()).as("includes[" + i + ']').hasSize(5).contains("includes" + i);
assertThat(op.input()).as("input[" + i + ']').hasSize(5).contains(new File("input" + i));
assertThat(op.plugins()).as("plugins[" + i + ']').hasSize(5).contains(new File("jar" + i));
}
var params = op.executeConstructProcessCommandList();
for (var p : args) {
var found = false;
for (var a : params) {
if (a.startsWith(p)) {
found = true;
break;
}
}
assertThat(found).as(p + " not found.").isTrue();
}
}
@Test
void testExampleBaseline() throws IOException, ExitStatusException, InterruptedException {
var tmpDir = Files.createTempDirectory("bld-detekt-").toFile();
var baseline = new File(tmpDir, "detekt-baseline.xml");
var op = new DetektOperation()
.fromProject(new BaseProjectBlueprint(new File("examples"), "com.example",
"Example"))
.baseline(baseline)
.createBaseline(true);
op.execute();
deleteOnExit(tmpDir);
assertThat(baseline).exists();
}
@Test
void testExampleMaxIssues() {
var op = new DetektOperation()
.fromProject(new BaseProjectBlueprint(new File("examples"), "com.example",
"Example"))
.maxIssues(8);
assertThatNoException().isThrownBy(op::execute);
}
@Test
void testExampleReports() throws IOException {
var tmpDir = Files.createTempDirectory("bld-detekt-").toFile();
var html = new File(tmpDir, "report.html");
var xml = new File(tmpDir, "report.xml");
var txt = new File(tmpDir, "report.txt");
var md = new File(tmpDir, "report.md");
var sarif = new File(tmpDir, "report.sarif");
var op = new DetektOperation()
.fromProject(new BaseProjectBlueprint(new File("examples"), "com.example",
"Example"))
.report(new Report(ReportId.HTML, html.getAbsolutePath()))
.report(new Report(ReportId.XML, xml.getAbsolutePath()))
.report(new Report(ReportId.TXT, txt.getAbsolutePath()))
.report(new Report(ReportId.MD, md.getAbsolutePath()))
.report(new Report(ReportId.SARIF, sarif.getAbsolutePath()));
assertThatThrownBy(op::execute).isInstanceOf(ExitStatusException.class);
deleteOnExit(tmpDir);
List.of(html, xml, txt, md, sarif).forEach(it -> assertThat(it).exists());
}
@Test
void testExamplesExecute() {
var op = new DetektOperation()
.fromProject(new BaseProjectBlueprint(new File("examples"), "com.example",
"Example"))
.debug(true);
assertThatThrownBy(op::execute).isInstanceOf(ExitStatusException.class);
}
@Test
void testExecuteNoProject() {
var op = new DetektOperation();
assertThatCode(op::execute).isInstanceOf(ExitStatusException.class);
}
}

View file

@ -1,471 +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 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 org.junit.jupiter.api.condition.EnabledOnOs;
import org.junit.jupiter.api.condition.OS;
import rife.bld.BaseProject;
import rife.bld.blueprints.BaseProjectBlueprint;
import rife.bld.extension.detekt.Report;
import rife.bld.extension.detekt.ReportId;
import rife.bld.operations.exceptions.ExitStatusException;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Objects;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import static org.assertj.core.api.Assertions.*;
@SuppressWarnings("PMD.AvoidDuplicateLiterals")
class DetektOperationTests {
@BeforeAll
static void beforeAll() {
var level = Level.ALL;
var logger = Logger.getLogger("rife.bld.extension");
var consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(level);
logger.addHandler(consoleHandler);
logger.setLevel(level);
logger.setUseParentHandlers(false);
}
static void deleteOnExit(File folder) {
folder.deleteOnExit();
for (var f : Objects.requireNonNull(folder.listFiles())) {
if (f.isDirectory()) {
deleteOnExit(f);
} else {
f.deleteOnExit();
}
}
}
@Test
void executeNoProject() {
var op = new DetektOperation();
assertThatCode(op::execute).isInstanceOf(ExitStatusException.class);
}
@Nested
@DisplayName("Config Tests")
class ConfigTests {
private final File bar = new File("bar");
private final File foo = new File("foo");
private final DetektOperation op = new DetektOperation();
@Test
void configAsFileArray() {
op.config().clear();
op.config(foo, bar);
assertThat(op.config()).contains(foo, bar);
}
@Test
void configAsFileList() {
op.config().clear();
op.config(List.of(foo, bar));
assertThat(op.config()).contains(foo, bar);
}
@Test
void configAsPathArray() {
var op = new DetektOperation();
op.config().clear();
op = op.config(foo.toPath(), bar.toPath());
assertThat(op.config()).contains(foo, bar);
}
@Test
void configAsPathList() {
op.config().clear();
op.configPaths(List.of(foo.toPath(), bar.toPath()));
assertThat(op.config()).as("Path...").contains(foo, bar);
}
@Test
void configAsStringArray() {
op.config().clear();
op.config("foo", "bar");
assertThat(op.config()).contains(foo, bar);
}
@Test
void configAsStringList() {
op.config().clear();
op.configStrings(List.of("foo", "bar"));
assertThat(op.config()).contains(foo, bar);
}
@Test
void configResourceAsFile() {
op.configResource(foo);
assertThat(op.configResource()).isEqualTo(foo.getAbsolutePath());
}
@Test
void configResourceAsPath() {
var op = new DetektOperation();
op = op.configResource(bar.toPath());
assertThat(op.configResource()).isEqualTo(bar.getAbsolutePath());
}
@Test
void configResourceAsString() {
op.configResource("foo");
assertThat(op.configResource()).isEqualTo("foo");
}
}
@Nested
@DisplayName("Example Tests")
class ExampleTests {
@Test
void exampleBaseline() throws IOException, ExitStatusException, InterruptedException {
var tmpDir = Files.createTempDirectory("bld-detekt-").toFile();
var baseline = new File(tmpDir, "examples/src/test/resources/detekt-baseline.xml");
var op = new DetektOperation()
.fromProject(new BaseProjectBlueprint(new File("examples"), "com.example",
"example", "Example"))
.baseline(baseline)
.createBaseline(true);
op.execute();
deleteOnExit(tmpDir);
assertThat(baseline).exists();
}
@Test
void exampleMaxIssues() {
var op = new DetektOperation()
.fromProject(new BaseProjectBlueprint(new File("examples"), "com.example",
"example", "Example"))
.maxIssues(8);
assertThatNoException().isThrownBy(op::execute);
}
@Test
void exampleReports() throws IOException {
var tmpDir = Files.createTempDirectory("bld-detekt-").toFile();
var html = new File(tmpDir, "report.html");
var xml = new File(tmpDir, "report.xml");
var txt = new File(tmpDir, "report.txt");
var md = new File(tmpDir, "report.md");
var sarif = new File(tmpDir, "report.sarif");
var op = new DetektOperation()
.fromProject(new BaseProjectBlueprint(new File("examples"), "com.example",
"example", "Example"))
.report(new Report(ReportId.HTML, html.getAbsolutePath()))
.report(new Report(ReportId.XML, xml.getAbsolutePath()))
.report(new Report(ReportId.TXT, txt.getAbsolutePath()))
.report(new Report(ReportId.MD, md.getAbsolutePath()))
.report(new Report(ReportId.SARIF, sarif.getAbsolutePath()));
assertThatThrownBy(op::execute).isInstanceOf(ExitStatusException.class);
deleteOnExit(tmpDir);
List.of(html, xml, txt, md, sarif).forEach(it -> assertThat(it).exists());
}
@Test
void examplesExecute() {
var op = new DetektOperation()
.fromProject(new BaseProjectBlueprint(new File("examples"), "com.example",
"example", "Example"))
.debug(true);
assertThatThrownBy(op::execute).isInstanceOf(ExitStatusException.class);
}
}
@Nested
@DisplayName("Options Tests")
class OptionsTests {
private final File bar = new File("bar");
private final File foo = new File("foo");
private final DetektOperation op = new DetektOperation();
@Test
@EnabledOnOs(OS.LINUX)
@SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops")
void checkAllParameters() throws IOException {
var args = Files.readAllLines(Paths.get("src", "test", "resources", "detekt-args.txt"));
assertThat(args).isNotEmpty();
var op = new DetektOperation()
.fromProject(new BaseProject())
.allRules(true)
.autoCorrect(true)
.basePath("basePath")
.basePath(new File("basePath"))
.baseline("baseline")
.buildUponDefaultConfig(true)
.classPath(new File("path1"))
.classPath("path2", "path3")
.classPath(List.of(new File("path4"), new File("path5")))
.config(new File("config1"))
.config("config2", "config3")
.config(List.of(new File("config4"), new File("config5")))
.configResource("configResource")
.configResource(new File("configResource"))
.createBaseline(true)
.debug(true)
.disableDefaultRuleSets(true)
.excludes(List.of("excludes1", "excludes2"))
.excludes("excludes3", "excludes4")
.generateConfig(true)
.includes(List.of("includes1", "includes2"))
.includes("includes3", "includes4", "includes5")
.input(new File("input1"))
.input("input2", "input3")
.input(List.of(new File("input4"), new File("input5")))
.jdkHome("jdkHome")
.jvmTarget("jvmTarget")
.languageVersion("languageVersion")
.maxIssues(10)
.parallel(true)
.plugins(new File("jar1"))
.plugins("jar2", "jar3")
.plugins(List.of(new File("jar4"), new File("jar5")))
.report(new Report(ReportId.HTML, "reports"));
assertThat(op.excludes()).as("excludes[]").containsExactly(".*/build/.*", ".*/resources/.*",
"excludes1", "excludes2", "excludes3", "excludes4");
for (var i = 1; i < 6; i++) {
assertThat(op.classPath()).as("classPath[%s]", i).hasSize(5).contains(new File("path" + i));
assertThat(op.config()).as("config[%s]", i).hasSize(5).contains(new File("config" + i));
assertThat(op.includes()).as("includes[%s]", i).hasSize(5).contains("includes" + i);
assertThat(op.input()).as("input[%s]", i).hasSize(5).contains(new File("input" + i));
assertThat(op.plugins()).as("plugins[%s]", i).hasSize(5).contains(new File("jar" + i));
}
var params = op.executeConstructProcessCommandList();
try (var softly = new AutoCloseableSoftAssertions()) {
for (var p : args) {
var found = false;
for (var a : params) {
if (a.startsWith(p)) {
found = true;
break;
}
}
softly.assertThat(found).as("%s not found.", p).isTrue();
}
}
}
@Nested
@DisplayName("Base Path Tests")
class BasePathTests {
@Test
void basePathAsFile() {
op.basePath(foo);
assertThat(op.basePath()).isEqualTo(foo.getAbsolutePath());
}
@Test
void basePathAsPath() {
var op = new DetektOperation();
op = op.basePath(bar.toPath());
assertThat(op.basePath()).isEqualTo(bar.getAbsolutePath());
}
@Test
void basePathAsString() {
op.basePath("foo");
assertThat(op.basePath()).isEqualTo("foo");
}
}
@Nested
@DisplayName("Baseline Tests")
class BaselineTests {
@Test
void baselineAsFile() {
op.baseline(foo);
assertThat(op.baseline()).isEqualTo(foo.getAbsolutePath());
}
@Test
void baselineAsPath() {
var op = new DetektOperation();
op = op.baseline(bar.toPath());
assertThat(op.baseline()).isEqualTo(bar.getAbsolutePath());
}
@Test
void baselineAsString() {
op.baseline("foo");
assertThat(op.baseline()).isEqualTo("foo");
}
}
@Nested
@DisplayName("ClassPath Tests")
class ClassPathTests {
@Test
void classPathAsFileArray() {
op.classPath().clear();
op.classPath(foo, bar);
assertThat(op.classPath()).contains(foo, bar);
}
@Test
void classPathAsFileList() {
op.classPath().clear();
op.classPath(List.of(foo, bar));
assertThat(op.classPath()).contains(foo, bar);
}
@Test
void classPathAsPathArray() {
var op = new DetektOperation();
op = op.classPath(foo.toPath(), bar.toPath());
assertThat(op.classPath()).contains(foo, bar);
}
@Test
void classPathAsPathList() {
op.classPath().clear();
op.classPathPaths(List.of(foo.toPath(), bar.toPath()));
assertThat(op.classPath()).contains(foo, bar);
}
@Test
void classPathAsStingArray() {
op.classPath().clear();
op.classPath("foo", "bar");
assertThat(op.classPath()).contains(foo, bar);
}
@Test
void classPathAsStringList() {
op.classPath().clear();
op.classPathStrings(List.of("foo", "bar"));
assertThat(op.classPath()).contains(foo, bar);
}
}
@Nested
@DisplayName("Input Tests")
class InputTests {
@Test
void inputAsFileArray() {
op.input().clear();
op.input(foo, bar);
assertThat(op.input()).contains(foo, bar);
}
@Test
void inputAsFileList() {
op.input().clear();
op.input(List.of(foo, bar));
assertThat(op.input()).contains(foo, bar);
}
@Test
void inputAsPathArray() {
var op = new DetektOperation();
op = op.input(foo.toPath(), bar.toPath());
assertThat(op.input()).contains(foo, bar);
}
@Test
void inputAsPathList() {
op.input().clear();
op.inputPaths(List.of(foo.toPath(), bar.toPath()));
assertThat(op.input()).contains(foo, bar);
op.input().clear();
}
@Test
void inputAsStringArray() {
op.input().clear();
op.input("foo", "bar");
assertThat(op.input()).contains(foo, bar);
}
@Test
void inputAsStringList() {
op.input().clear();
op.inputStrings(List.of("foo", "bar"));
assertThat(op.input()).contains(foo, bar);
}
}
@Nested
@DisplayName("Plugins Tests")
class PluginsTests {
@Test
void pluginsAsFileArray() {
op.plugins().clear();
op.plugins(foo, bar);
assertThat(op.plugins()).contains(foo, bar);
}
@Test
void pluginsAsFileList() {
op.plugins().clear();
op.plugins(List.of(foo, bar));
assertThat(op.plugins()).contains(foo, bar);
}
@Test
void pluginsAsPathArray() {
var op = new DetektOperation();
op = op.plugins(foo.toPath(), bar.toPath());
assertThat(op.plugins()).contains(foo, bar);
}
@Test
void pluginsAsPathList() {
op.plugins().clear();
op.pluginsPaths(List.of(foo.toPath(), bar.toPath()));
assertThat(op.plugins()).contains(foo, bar);
op.plugins().clear();
}
@Test
void pluginsAsStringArray() {
op.plugins().clear();
op.plugins("foo", "bar");
assertThat(op.plugins()).contains(foo, bar);
}
@Test
void pluginsAsStringList() {
op.plugins().clear();
op.pluginsStrings(List.of("foo", "bar"));
assertThat(op.plugins()).contains(foo, bar);
}
}
}
}