From cbe98ea71acd23d31378f835ef26aad6401be070 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Fri, 25 Nov 2022 12:51:40 +0100 Subject: [PATCH] Do that with CPD tests too --- .../java/net/sourceforge/pmd/ant/CPDTask.java | 2 +- .../net/sourceforge/pmd/cli/CpdCliTest.java | 144 +++++++++++--- .../pmd/cli}/cpd/badandgood/BadFile.java | 0 .../pmd/cli}/cpd/badandgood/GoodFile.java | 0 .../pmd/cli}/cpd/badandgood/GoodFile2.java | 0 .../pmd/cli/cpd/encodingTest}/File1.java | 0 .../pmd/cli/cpd/encodingTest}/File2.java | 0 .../pmd/{ => cli}/cpd/files/dup1.java | 0 .../pmd/{ => cli}/cpd/files/dup2.java | 0 .../files/file_with_ISO-8859-1_encoding.java | 2 +- .../cpd/files/file_with_utf8_bom.java | 0 .../pmd/{ => cli}/cpd/files/real-file.txt | 0 .../sourceforge/pmd/cli/cpd/tsFiles}/File1.ts | 0 .../sourceforge/pmd/cli/cpd/tsFiles}/File2.ts | 0 .../java/net/sourceforge/pmd/cpd/CPD.java | 5 +- .../pmd/cpd/CPDCommandLineInterface.java | 4 +- .../sourceforge/pmd/cpd/CPDConfiguration.java | 8 +- .../java/net/sourceforge/pmd/cpd/GUI.java | 2 +- .../pmd/cpd/CPDCommandLineInterfaceTest.java | 54 ------ .../pmd/cli/cpd/encodingTest/File1.java | 7 + .../pmd/cli/cpd/encodingTest/File2.java | 7 + .../pmd/{ => cli}/cpd/files/dup1.java | 0 .../pmd/{ => cli}/cpd/files/dup2.java | 0 .../files/file_with_ISO-8859-1_encoding.java | 0 .../cpd/files/file_with_utf8_bom.java | 0 .../pmd/{ => cli}/cpd/files/real-file.txt | 0 .../pmd/cpd/CPDCommandLineInterfaceTest.java | 112 ----------- .../pmd/cpd/CPDCommandLineInterfaceTest.java | 32 ---- .../net/sourceforge/pmd/cli/BaseCLITest.java | 180 ------------------ .../sourceforge/pmd/cli/BaseCPDCLITest.java | 77 -------- 30 files changed, 140 insertions(+), 496 deletions(-) rename {pmd-java/src/test/resources/net/sourceforge/pmd => pmd-cli/src/test/resources/net/sourceforge/pmd/cli}/cpd/badandgood/BadFile.java (100%) rename {pmd-java/src/test/resources/net/sourceforge/pmd => pmd-cli/src/test/resources/net/sourceforge/pmd/cli}/cpd/badandgood/GoodFile.java (100%) rename {pmd-java/src/test/resources/net/sourceforge/pmd => pmd-cli/src/test/resources/net/sourceforge/pmd/cli}/cpd/badandgood/GoodFile2.java (100%) rename {pmd-java/src/test/resources/net/sourceforge/pmd/cpd/clitest => pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/encodingTest}/File1.java (100%) rename {pmd-java/src/test/resources/net/sourceforge/pmd/cpd/clitest => pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/encodingTest}/File2.java (100%) rename pmd-cli/src/test/resources/net/sourceforge/pmd/{ => cli}/cpd/files/dup1.java (100%) rename pmd-cli/src/test/resources/net/sourceforge/pmd/{ => cli}/cpd/files/dup2.java (100%) rename {pmd-core/src/test/resources/net/sourceforge/pmd => pmd-cli/src/test/resources/net/sourceforge/pmd/cli}/cpd/files/file_with_ISO-8859-1_encoding.java (95%) rename pmd-cli/src/test/resources/net/sourceforge/pmd/{ => cli}/cpd/files/file_with_utf8_bom.java (100%) rename pmd-cli/src/test/resources/net/sourceforge/pmd/{ => cli}/cpd/files/real-file.txt (100%) rename {pmd-javascript/src/test/resources/net/sourceforge/pmd/cpd/ts => pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/tsFiles}/File1.ts (100%) rename {pmd-javascript/src/test/resources/net/sourceforge/pmd/cpd/ts => pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/tsFiles}/File2.ts (100%) create mode 100644 pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/encodingTest/File1.java create mode 100644 pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/encodingTest/File2.java rename pmd-core/src/test/resources/net/sourceforge/pmd/{ => cli}/cpd/files/dup1.java (100%) rename pmd-core/src/test/resources/net/sourceforge/pmd/{ => cli}/cpd/files/dup2.java (100%) rename {pmd-cli/src/test/resources/net/sourceforge/pmd => pmd-core/src/test/resources/net/sourceforge/pmd/cli}/cpd/files/file_with_ISO-8859-1_encoding.java (100%) rename pmd-core/src/test/resources/net/sourceforge/pmd/{ => cli}/cpd/files/file_with_utf8_bom.java (100%) rename pmd-core/src/test/resources/net/sourceforge/pmd/{ => cli}/cpd/files/real-file.txt (100%) delete mode 100644 pmd-java/src/test/java/net/sourceforge/pmd/cpd/CPDCommandLineInterfaceTest.java delete mode 100644 pmd-javascript/src/test/java/net/sourceforge/pmd/cpd/CPDCommandLineInterfaceTest.java delete mode 100644 pmd-test/src/main/java/net/sourceforge/pmd/cli/BaseCLITest.java delete mode 100644 pmd-test/src/main/java/net/sourceforge/pmd/cli/BaseCPDCLITest.java diff --git a/pmd-ant/src/main/java/net/sourceforge/pmd/ant/CPDTask.java b/pmd-ant/src/main/java/net/sourceforge/pmd/ant/CPDTask.java index e6a27bbd8a..e1a7e491ff 100644 --- a/pmd-ant/src/main/java/net/sourceforge/pmd/ant/CPDTask.java +++ b/pmd-ant/src/main/java/net/sourceforge/pmd/ant/CPDTask.java @@ -94,7 +94,7 @@ public class CPDTask extends Task { CPDConfiguration config = new CPDConfiguration(); config.setMinimumTileSize(minimumTokenCount); config.setLanguage(createLanguage()); - config.setEncoding(encoding); + config.setSourceEncoding(encoding); config.setSkipDuplicates(skipDuplicateFiles); config.setSkipLexicalErrors(skipLexicalErrors); diff --git a/pmd-cli/src/test/java/net/sourceforge/pmd/cli/CpdCliTest.java b/pmd-cli/src/test/java/net/sourceforge/pmd/cli/CpdCliTest.java index 0470aed2fc..c68220ad92 100644 --- a/pmd-cli/src/test/java/net/sourceforge/pmd/cli/CpdCliTest.java +++ b/pmd-cli/src/test/java/net/sourceforge/pmd/cli/CpdCliTest.java @@ -4,8 +4,13 @@ package net.sourceforge.pmd.cli; +import static net.sourceforge.pmd.cli.internal.CliExitCode.OK; +import static net.sourceforge.pmd.cli.internal.CliExitCode.VIOLATIONS_FOUND; import static net.sourceforge.pmd.util.CollectionUtil.listOf; +import static org.hamcrest.CoreMatchers.startsWith; import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.emptyString; +import static org.hamcrest.Matchers.equalTo; import static org.junit.jupiter.api.Assertions.assertEquals; import java.nio.file.Path; @@ -22,11 +27,18 @@ import net.sourceforge.pmd.internal.Slf4jSimpleConfiguration; import com.github.stefanbirkner.systemlambda.SystemLambda; class CpdCliTest extends BaseCliTest { - private static final String SRC_DIR = "src/test/resources/net/sourceforge/pmd/cpd/files/"; + + private static final String BASE_RES_PATH = "src/test/resources/net/sourceforge/pmd/cli/cpd/"; + private static final String SRC_DIR = BASE_RES_PATH + "files/"; @TempDir private Path tempDir; + @Override + protected List cliStandardArgs() { + return listOf("cpd"); + } + @AfterAll static void resetLogging() { // reset logging in case "--debug" changed the logging properties @@ -36,11 +48,8 @@ class CpdCliTest extends BaseCliTest { @Test void debugLogging() throws Exception { - // restoring system properties: --debug might change logging properties - SystemLambda.restoreSystemProperties(() -> { - CliExecutionResult result = runCliSuccessfully("--debug", "--minimum-tokens", "340", "--dir", SRC_DIR); - result.checkStdOut(containsString("[main] INFO net.sourceforge.pmd.cli.commands.internal.AbstractPmdSubcommand - Log level is at TRACE")); - }); + CliExecutionResult result = runCliSuccessfully("--debug", "--minimum-tokens", "340", "--dir", SRC_DIR); + result.checkStdOut(containsString("[main] INFO net.sourceforge.pmd.cli.commands.internal.AbstractPmdSubcommand - Log level is at TRACE")); } @Test @@ -48,26 +57,50 @@ class CpdCliTest extends BaseCliTest { CliExecutionResult result = runCliSuccessfully("--minimum-tokens", "340", "--dir", SRC_DIR); result.checkStdOut(containsString("[main] INFO net.sourceforge.pmd.cli.commands.internal.AbstractPmdSubcommand - Log level is at INFO")); } - + @Test - void testMissingminimumTokens() throws Exception { + void testMissingMinimumTokens() throws Exception { final CliExecutionResult result = runCli(CliExitCode.USAGE_ERROR); result.checkStdErr(containsString("Missing required option: '--minimum-tokens='")); } - + @Test void testMissingSource() throws Exception { final CliExecutionResult result = runCli(CliExitCode.USAGE_ERROR, "--minimum-tokens", "340"); result.checkStdErr(containsString("Please provide a parameter for source root directory")); } - + @Test void testWrongCliOptionsDoPrintUsage() throws Exception { final CliExecutionResult result = runCli(CliExitCode.USAGE_ERROR, "--invalid", "--minimum-tokens", "340", "-d", SRC_DIR); result.checkStdErr(containsString("Unknown option: '--invalid'")); result.checkStdErr(containsString("Usage: pmd cpd")); } - + + @Test + void testFindJavaDuplication() throws Exception { + runCli(VIOLATIONS_FOUND, "--minimum-tokens", "7", "--dir", SRC_DIR) + .verify(result -> result.checkStdOut(containsString( + "Found a 14 line (86 tokens) duplication in the following files:" + ))); + } + + @Test + void testNoFailOnViolation() throws Exception { + runCli(CliExitCode.OK, "--minimum-tokens", "7", "--dir", SRC_DIR, "--no-fail-on-violation") + .verify(result -> result.checkStdOut(containsString( + "Found a 14 line (86 tokens) duplication in the following files:" + ))); + } + + @Test + void testExcludeFiles() throws Exception { + runCliSuccessfully("--minimum-tokens", "7", "--dir", SRC_DIR, + "--exclude", SRC_DIR + "/dup2.java", + SRC_DIR + "/dup1.java") + .verify(result -> result.checkStdOut(emptyString())); + } + @Test void testNoDuplicatesResultRendering() throws Exception { final String stdout = SystemLambda.tapSystemOut(() -> { @@ -76,29 +109,86 @@ class CpdCliTest extends BaseCliTest { PmdCli.main(new String[] { "cpd", "--minimum-tokens", "340", "--language", "java", "--dir", SRC_DIR, "--format", "xml", - }); + }); }); assertEquals(CliExitCode.OK.getExitCode(), statusCode); }); }); final Path absoluteSrcDir = Paths.get(SRC_DIR).toAbsolutePath(); assertEquals("\n" - + "\n" - + " \n" - + " \n" - + " \n" - + " \n" - + "", stdout.trim()); + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "", stdout.trim()); } - @Override - protected List cliStandardArgs() { - return listOf( - "cpd" - ); + /** + * #1144 CPD encoding argument has no effect + */ + @Test + void testEncodingOption() throws Exception { + + SystemLambda.restoreSystemProperties(() -> { + // set the default encoding under Windows + System.setProperty("file.encoding", "Cp1252"); + + runCli(VIOLATIONS_FOUND, "--minimum-tokens", "34", + "-d", BASE_RES_PATH + "encodingTest/", + "--ignore-identifiers", "--format", "xml", + // request UTF-8 for CPD + "--encoding", "UTF-8") + .verify(r -> { + r.checkStdOut(startsWith("")); + r.checkStdOut(containsPattern("System\\.out\\.println\\([ij] \\+ \"ä\"\\);")); + }); + }); + } + + /** + * See: https://sourceforge.net/p/pmd/bugs/1178/ + */ + @Test + public void testSkipLexicalErrors() throws Exception { + runCli(VIOLATIONS_FOUND, + "--minimum-tokens", "10", + "-d", BASE_RES_PATH + "badandgood/", + "--format", "text", + "--skip-lexical-errors") + .verify(r -> { + r.checkStdErr(containsPattern("Skipping .*?BadFile\\.java\\. Reason: Lexical error in file")); + r.checkStdOut(containsString("Found a 5 line (13 tokens) duplication")); + }); + } + + + @Test + public void jsShouldFindDuplicatesWithDifferentFileExtensions() throws Exception { + runCli(VIOLATIONS_FOUND, "--minimum-tokens", "5", "--language", "js", + "-d", BASE_RES_PATH + "tsFiles/File1.ts", BASE_RES_PATH + "tsFiles/File2.ts") + .checkStdOut(containsString("Found a 9 line (32 tokens) duplication in the following files")); + } + + @Test + public void jsShouldFindNoDuplicatesWithDifferentFileExtensions() throws Exception { + runCli(OK, "--minimum-tokens", "5", "--language", "js", + "-d", BASE_RES_PATH + "tsFiles/") + .checkStdOut(emptyString()); + } + + @Test + public void renderEmptyReportXml() throws Exception { + runCli(OK, "--minimum-tokens", "5", "--language", "js", + "-f", "xml", + "-d", BASE_RES_PATH + "tsFiles/") + .checkStdOut(equalTo( + "\n\n" + )); } } diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/cpd/badandgood/BadFile.java b/pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/badandgood/BadFile.java similarity index 100% rename from pmd-java/src/test/resources/net/sourceforge/pmd/cpd/badandgood/BadFile.java rename to pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/badandgood/BadFile.java diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/cpd/badandgood/GoodFile.java b/pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/badandgood/GoodFile.java similarity index 100% rename from pmd-java/src/test/resources/net/sourceforge/pmd/cpd/badandgood/GoodFile.java rename to pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/badandgood/GoodFile.java diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/cpd/badandgood/GoodFile2.java b/pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/badandgood/GoodFile2.java similarity index 100% rename from pmd-java/src/test/resources/net/sourceforge/pmd/cpd/badandgood/GoodFile2.java rename to pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/badandgood/GoodFile2.java diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/cpd/clitest/File1.java b/pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/encodingTest/File1.java similarity index 100% rename from pmd-java/src/test/resources/net/sourceforge/pmd/cpd/clitest/File1.java rename to pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/encodingTest/File1.java diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/cpd/clitest/File2.java b/pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/encodingTest/File2.java similarity index 100% rename from pmd-java/src/test/resources/net/sourceforge/pmd/cpd/clitest/File2.java rename to pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/encodingTest/File2.java diff --git a/pmd-cli/src/test/resources/net/sourceforge/pmd/cpd/files/dup1.java b/pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/files/dup1.java similarity index 100% rename from pmd-cli/src/test/resources/net/sourceforge/pmd/cpd/files/dup1.java rename to pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/files/dup1.java diff --git a/pmd-cli/src/test/resources/net/sourceforge/pmd/cpd/files/dup2.java b/pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/files/dup2.java similarity index 100% rename from pmd-cli/src/test/resources/net/sourceforge/pmd/cpd/files/dup2.java rename to pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/files/dup2.java diff --git a/pmd-core/src/test/resources/net/sourceforge/pmd/cpd/files/file_with_ISO-8859-1_encoding.java b/pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/files/file_with_ISO-8859-1_encoding.java similarity index 95% rename from pmd-core/src/test/resources/net/sourceforge/pmd/cpd/files/file_with_ISO-8859-1_encoding.java rename to pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/files/file_with_ISO-8859-1_encoding.java index d7f62ea9ed..8f445970a3 100644 --- a/pmd-core/src/test/resources/net/sourceforge/pmd/cpd/files/file_with_ISO-8859-1_encoding.java +++ b/pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/files/file_with_ISO-8859-1_encoding.java @@ -1,7 +1,7 @@ /** * This file is using ISO-8859-1 (Latin-1) encoding. * - * ä + * ? */ public class FileWith_ISO8859-1_Encoding { diff --git a/pmd-cli/src/test/resources/net/sourceforge/pmd/cpd/files/file_with_utf8_bom.java b/pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/files/file_with_utf8_bom.java similarity index 100% rename from pmd-cli/src/test/resources/net/sourceforge/pmd/cpd/files/file_with_utf8_bom.java rename to pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/files/file_with_utf8_bom.java diff --git a/pmd-cli/src/test/resources/net/sourceforge/pmd/cpd/files/real-file.txt b/pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/files/real-file.txt similarity index 100% rename from pmd-cli/src/test/resources/net/sourceforge/pmd/cpd/files/real-file.txt rename to pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/files/real-file.txt diff --git a/pmd-javascript/src/test/resources/net/sourceforge/pmd/cpd/ts/File1.ts b/pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/tsFiles/File1.ts similarity index 100% rename from pmd-javascript/src/test/resources/net/sourceforge/pmd/cpd/ts/File1.ts rename to pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/tsFiles/File1.ts diff --git a/pmd-javascript/src/test/resources/net/sourceforge/pmd/cpd/ts/File2.ts b/pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/tsFiles/File2.ts similarity index 100% rename from pmd-javascript/src/test/resources/net/sourceforge/pmd/cpd/ts/File2.ts rename to pmd-cli/src/test/resources/net/sourceforge/pmd/cli/cpd/tsFiles/File2.ts diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPD.java b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPD.java index 032dbbfba0..7824325b2c 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPD.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPD.java @@ -84,7 +84,7 @@ public class CPD { try { for (File file : files) { if (!file.exists()) { - throw new FileNotFoundException("Couldn't find directory/file '" + file + "'"); + throw new FileNotFoundException("Could not find directory/file '" + file + "'"); } else if (file.isDirectory()) { if (configuration.isNonRecursive()) { addAllInDirectory(file); @@ -268,7 +268,10 @@ public class CPD { * invoke {@link System#exit(int)}. * * @param args command line arguments + * + * @deprecated Use module pmd-cli -- to be removed before 7.0.0 is out. */ + @Deprecated public static void main(String[] args) { StatusCode statusCode = runCpd(args); CPDCommandLineInterface.setStatusCodeOrExit(statusCode.toInt()); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPDCommandLineInterface.java b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPDCommandLineInterface.java index 0aa54df3f6..ce3740baab 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPDCommandLineInterface.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPDCommandLineInterface.java @@ -24,11 +24,9 @@ import com.beust.jcommander.JCommander; import com.beust.jcommander.ParameterException; /** - * @deprecated Internal API. Use {@link CPD#runCpd(String...)} or {@link CPD#main(String[])} - * in order to execute CPD. + * @deprecated Use the cli module to execute CPD. */ @Deprecated -@InternalApi public final class CPDCommandLineInterface { private static final Logger LOG = LoggerFactory.getLogger(CPDCommandLineInterface.class); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPDConfiguration.java b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPDConfiguration.java index bb0cf4f702..559622fab9 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPDConfiguration.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPDConfiguration.java @@ -80,7 +80,6 @@ public class CPDConfiguration extends AbstractConfiguration { private CPDReportRenderer cpdReportRenderer; - private String encoding; @Parameter(names = "--ignore-literals", description = "Ignore number values and string contents when comparing text", required = false) @@ -158,7 +157,6 @@ public class CPDConfiguration extends AbstractConfiguration { @Parameter(names = { "--encoding", "-e" }, description = "Character encoding to use when processing files", required = false) public void setEncoding(String encoding) { - this.encoding = encoding; setSourceEncoding(encoding); } @@ -178,7 +176,7 @@ public class CPDConfiguration extends AbstractConfiguration { setRendererName(DEFAULT_RENDERER); } if (getRenderer() == null && getCPDRenderer() == null) { - Object renderer = createRendererByName(getRendererName(), getEncoding()); + Object renderer = createRendererByName(getRendererName(), getSourceEncoding().name()); String className = getRendererName(); if (renderer instanceof CPDReportRenderer) { @@ -516,10 +514,6 @@ public class CPDConfiguration extends AbstractConfiguration { this.help = help; } - public String getEncoding() { - return encoding; - } - public boolean isNoSkipBlocks() { return noSkipBlocks; } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/GUI.java b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/GUI.java index 2a5f3a3347..09c2dbb36b 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/GUI.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/GUI.java @@ -676,7 +676,7 @@ public class GUI implements CPDListener { Properties p = new Properties(); CPDConfiguration config = new CPDConfiguration(); config.setMinimumTileSize(Integer.parseInt(minimumLengthField.getText())); - config.setEncoding(encodingField.getText()); + config.setSourceEncoding(encodingField.getText()); config.setIgnoreIdentifiers(ignoreIdentifiersCheckbox.isSelected()); config.setIgnoreLiterals(ignoreLiteralsCheckbox.isSelected()); config.setIgnoreAnnotations(ignoreAnnotationsCheckbox.isSelected()); diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/cpd/CPDCommandLineInterfaceTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/cpd/CPDCommandLineInterfaceTest.java index 8ed63b71ed..5ac549cb56 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/cpd/CPDCommandLineInterfaceTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/cpd/CPDCommandLineInterfaceTest.java @@ -4,20 +4,11 @@ package net.sourceforge.pmd.cpd; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.not; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.File; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.nio.file.Path; -import java.util.Arrays; import java.util.Collection; -import java.util.List; import java.util.Map; import org.junit.jupiter.api.AfterEach; @@ -82,50 +73,5 @@ class CPDCommandLineInterfaceTest { return expectedFilesXmlBuilder.toString(); } - @Test - void testDeprecatedOptionsWarning() throws Exception { - final List filepaths = Arrays.asList( - new File(SRC_DIR, "dup1.java").getAbsolutePath(), - new File(SRC_DIR, "dup2.java").getAbsolutePath()); - Path filelist = tempDir.resolve("cpd-test-file-list.txt"); - Files.write(filelist, filepaths, StandardCharsets.UTF_8); - final String expectedFilesXml = getExpectedFileEntriesXml(filepaths); - String stderr = SystemLambda.tapSystemErr(() -> { - String stdout = SystemLambda.tapSystemOut(() -> { - CPD.StatusCode statusCode = CPD.runCpd("--minimum-tokens", "340", "--language", "java", "--filelist", - filelist.toAbsolutePath().toString(), "--format", "xml", "-failOnViolation", "true"); - assertEquals(CPD.StatusCode.OK, statusCode); - }); - assertEquals("" + "\n" + "\n" + expectedFilesXml + "", stdout.trim()); - }); - assertTrue(stderr.contains("Some deprecated options were used on the command-line, including -failOnViolation")); - assertTrue(stderr.contains("Consider replacing it with --fail-on-violation")); - // only one parameter is logged - assertFalse(stderr.contains("Some deprecated options were used on the command-line, including --filelist")); - assertFalse(stderr.contains("Consider replacing it with --file-list")); - } - - @Test - void testDebugLogging() throws Exception { - // restoring system properties: --debug might change logging properties - SystemLambda.restoreSystemProperties(() -> { - String stderr = SystemLambda.tapSystemErr(() -> { - CPD.StatusCode statusCode = CPD.runCpd("--minimum-tokens", "340", "--language", "java", "--files", - SRC_DIR, "--debug"); - assertEquals(CPD.StatusCode.OK, statusCode); - }); - assertThat(stderr, containsString("Tokenizing ")); // this is a debug logging - }); - } - - @Test - void testNormalLogging() throws Exception { - String stderr = SystemLambda.tapSystemErr(() -> { - CPD.StatusCode statusCode = CPD.runCpd("--minimum-tokens", "340", "--language", "java", "--files", - SRC_DIR); - assertEquals(CPD.StatusCode.OK, statusCode); - }); - assertThat(stderr, not(containsString("Tokenizing "))); // this is a debug logging - } } diff --git a/pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/encodingTest/File1.java b/pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/encodingTest/File1.java new file mode 100644 index 0000000000..0f0ddeee13 --- /dev/null +++ b/pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/encodingTest/File1.java @@ -0,0 +1,7 @@ +public class File1 { + public void dup() { + for (int i = 0; i < 10; i++) { + System.out.println(i + "ä"); + } + } +} \ No newline at end of file diff --git a/pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/encodingTest/File2.java b/pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/encodingTest/File2.java new file mode 100644 index 0000000000..12fab4b42f --- /dev/null +++ b/pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/encodingTest/File2.java @@ -0,0 +1,7 @@ +public class File2 { + public void dup() { + for (int j = 0; j < 10; j++) { + System.out.println(j + "ä"); + } + } +} \ No newline at end of file diff --git a/pmd-core/src/test/resources/net/sourceforge/pmd/cpd/files/dup1.java b/pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/files/dup1.java similarity index 100% rename from pmd-core/src/test/resources/net/sourceforge/pmd/cpd/files/dup1.java rename to pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/files/dup1.java diff --git a/pmd-core/src/test/resources/net/sourceforge/pmd/cpd/files/dup2.java b/pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/files/dup2.java similarity index 100% rename from pmd-core/src/test/resources/net/sourceforge/pmd/cpd/files/dup2.java rename to pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/files/dup2.java diff --git a/pmd-cli/src/test/resources/net/sourceforge/pmd/cpd/files/file_with_ISO-8859-1_encoding.java b/pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/files/file_with_ISO-8859-1_encoding.java similarity index 100% rename from pmd-cli/src/test/resources/net/sourceforge/pmd/cpd/files/file_with_ISO-8859-1_encoding.java rename to pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/files/file_with_ISO-8859-1_encoding.java diff --git a/pmd-core/src/test/resources/net/sourceforge/pmd/cpd/files/file_with_utf8_bom.java b/pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/files/file_with_utf8_bom.java similarity index 100% rename from pmd-core/src/test/resources/net/sourceforge/pmd/cpd/files/file_with_utf8_bom.java rename to pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/files/file_with_utf8_bom.java diff --git a/pmd-core/src/test/resources/net/sourceforge/pmd/cpd/files/real-file.txt b/pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/files/real-file.txt similarity index 100% rename from pmd-core/src/test/resources/net/sourceforge/pmd/cpd/files/real-file.txt rename to pmd-core/src/test/resources/net/sourceforge/pmd/cli/cpd/files/real-file.txt diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/cpd/CPDCommandLineInterfaceTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/cpd/CPDCommandLineInterfaceTest.java deleted file mode 100644 index 0da64dd11f..0000000000 --- a/pmd-java/src/test/java/net/sourceforge/pmd/cpd/CPDCommandLineInterfaceTest.java +++ /dev/null @@ -1,112 +0,0 @@ -/** - * BSD-style license; for more info see http://pmd.sourceforge.net/license.html - */ - -package net.sourceforge.pmd.cpd; - -import static net.sourceforge.pmd.cli.BaseCLITest.containsPattern; -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.CoreMatchers.startsWith; -import static org.hamcrest.MatcherAssert.assertThat; - -import org.junit.Test; - -import net.sourceforge.pmd.cli.BaseCPDCLITest; - -/** - * Unit test for {@link CPDCommandLineInterface}. - * - */ -public class CPDCommandLineInterfaceTest extends BaseCPDCLITest { - /** - * Test ignore identifiers argument. - */ - @Test - public void testIgnoreIdentifiers() { - String out = runTest(CPD.StatusCode.DUPLICATE_CODE_FOUND, "--minimum-tokens", "34", "--language", "java", "--files", - "src/test/resources/net/sourceforge/pmd/cpd/clitest/", "--ignore-identifiers"); - assertThat(out, containsString("Found a 7 line (36 tokens) duplication")); - } - - /** - * Test ignore identifiers argument with failOnViolation=false - */ - @Test - public void testIgnoreIdentifiersFailOnViolationFalse() { - String out = runTest(CPD.StatusCode.OK, "--minimum-tokens", "34", "--language", "java", "--files", - "src/test/resources/net/sourceforge/pmd/cpd/clitest/", "--ignore-identifiers", "--failOnViolation", - "false"); - assertThat(out, containsString("Found a 7 line (36 tokens) duplication")); - } - - /** - * Test ignore identifiers argument with failOnViolation=false with changed long options - */ - @Test - public void testIgnoreIdentifiersFailOnViolationFalseLongOption() { - String out = runTest(CPD.StatusCode.OK, "--minimum-tokens", "34", "--language", "java", "--files", - "src/test/resources/net/sourceforge/pmd/cpd/clitest/", "--ignore-identifiers", "--fail-on-violation", - "false"); - assertThat(out, containsString("Found a 7 line (36 tokens) duplication")); - } - - /** - * Test excludes option. - */ - @Test - public void testExcludes() { - String out = runTest(CPD.StatusCode.OK, "--minimum-tokens", "34", "--language", "java", "--ignore-identifiers", "--files", - "src/test/resources/net/sourceforge/pmd/cpd/clitest/", "--exclude", - "src/test/resources/net/sourceforge/pmd/cpd/clitest/File2.java"); - assertThat(out, not(containsString("Found a 7 line (34 tokens) duplication"))); - } - - /** - * #1144 CPD encoding argument has no effect - */ - @Test - public void testEncodingOption() { - String origEncoding = System.getProperty("file.encoding"); - - // set the default encoding under Windows - System.setProperty("file.encoding", "Cp1252"); - - String out = runTest(CPD.StatusCode.DUPLICATE_CODE_FOUND, "--minimum-tokens", "34", "--language", "java", "--files", - "src/test/resources/net/sourceforge/pmd/cpd/clitest/", "--ignore-identifiers", "--format", "xml", - // request UTF-8 for CPD - "--encoding", "UTF-8"); - // reset default encoding - System.setProperty("file.encoding", origEncoding); - - assertThat(out, startsWith("")); - assertThat(out, containsPattern("System\\.out\\.println\\([ij] \\+ \"ä\"\\);")); - } - - /** - * See: https://sourceforge.net/p/pmd/bugs/1178/ - * - */ - @Test - public void testBrokenAndValidFile() { - String out = runTest(CPD.StatusCode.DUPLICATE_CODE_FOUND, "--minimum-tokens", "10", "--language", "java", "--files", - "src/test/resources/net/sourceforge/pmd/cpd/badandgood/", "--format", "text", "--skip-lexical-errors"); - String stderr = getStderr(); - assertThat(stderr, containsPattern("Skipping .*?BadFile\\.java\\. Reason: Lexical error in file")); - assertThat(out, containsString("Found a 5 line (13 tokens) duplication")); - } - - @Test - public void testFormatXmlWithoutEncoding() { - String out = runTest(CPD.StatusCode.DUPLICATE_CODE_FOUND, "--minimum-tokens", "10", "--language", "java", "--files", - "src/test/resources/net/sourceforge/pmd/cpd/clitest/", "--format", "xml"); - assertThat(out, containsString("")); - } - - @Test - public void testCSVFormat() { - String out = runTest(CPD.StatusCode.OK, "--minimum-tokens", "100", "--files", "src/test/resources/net/sourceforge/pmd/cpd/badandgood/", - "--language", "c", "--format", "csv"); - assertThat(out, not(containsString("Couldn't instantiate renderer"))); - } -} diff --git a/pmd-javascript/src/test/java/net/sourceforge/pmd/cpd/CPDCommandLineInterfaceTest.java b/pmd-javascript/src/test/java/net/sourceforge/pmd/cpd/CPDCommandLineInterfaceTest.java deleted file mode 100644 index c6b4df8f27..0000000000 --- a/pmd-javascript/src/test/java/net/sourceforge/pmd/cpd/CPDCommandLineInterfaceTest.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * BSD-style license; for more info see http://pmd.sourceforge.net/license.html - */ - -package net.sourceforge.pmd.cpd; - -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.emptyString; - -import org.junit.Test; - -import net.sourceforge.pmd.cli.BaseCPDCLITest; - -public class CPDCommandLineInterfaceTest extends BaseCPDCLITest { - @Test - public void shouldFindDuplicatesWithDifferentFileExtensions() { - String out = runTest(CPD.StatusCode.DUPLICATE_CODE_FOUND, "--minimum-tokens", "5", "--language", "js", "--files", - "src/test/resources/net/sourceforge/pmd/cpd/ts/File1.ts", - "src/test/resources/net/sourceforge/pmd/cpd/ts/File2.ts"); - - assertThat(out, containsString("Found a 9 line (32 tokens) duplication in the following files")); - } - - @Test - public void shouldFindNoDuplicatesWithDifferentFileExtensions() { - String out = runTest(CPD.StatusCode.OK, "--minimum-tokens", "5", "--language", "js", "--files", - "src/test/resources/net/sourceforge/pmd/cpd/ts/"); - - assertThat(out.trim(), emptyString()); - } -} diff --git a/pmd-test/src/main/java/net/sourceforge/pmd/cli/BaseCLITest.java b/pmd-test/src/main/java/net/sourceforge/pmd/cli/BaseCLITest.java deleted file mode 100644 index b199a22742..0000000000 --- a/pmd-test/src/main/java/net/sourceforge/pmd/cli/BaseCLITest.java +++ /dev/null @@ -1,180 +0,0 @@ -/** - * BSD-style license; for more info see http://pmd.sourceforge.net/license.html - */ - -package net.sourceforge.pmd.cli; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.PrintStream; -import java.nio.file.Files; -import java.util.regex.Pattern; - -import org.apache.tools.ant.util.TeeOutputStream; -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; -import org.hamcrest.Matcher; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.junit.contrib.java.lang.system.SystemErrRule; -import org.junit.contrib.java.lang.system.SystemOutRule; - -import net.sourceforge.pmd.PMD; -import net.sourceforge.pmd.PMD.StatusCode; -import net.sourceforge.pmd.internal.util.AssertionUtil; - -/** - * @author Romain Pelisse <belaran@gmail.com> - * - * @deprecated Only pmd-cli module should use / test the CLI. - */ -@Deprecated -public abstract class BaseCLITest { - - protected static final String TEST_OUPUT_DIRECTORY = "target/cli-tests/"; - - // Points toward a folder with not many source files, to avoid actually PMD - // and slowing down tests - protected static final String SOURCE_FOLDER = "src/test/resources/net/sourceforge/pmd/cli"; - - @Rule - public SystemErrRule systemErrRule = new SystemErrRule().muteForSuccessfulTests(); - @Rule - public SystemOutRule systemOutRule = new SystemOutRule().muteForSuccessfulTests(); - - /** - * @throws java.lang.Exception - */ - @BeforeClass - public static void setUp() throws Exception { - System.setProperty(PMDCommandLineInterface.NO_EXIT_AFTER_RUN, "true"); - File testOuputDir = new File(TEST_OUPUT_DIRECTORY); - if (!testOuputDir.exists()) { - assertTrue("failed to create output directory for test:" + testOuputDir.getAbsolutePath(), - testOuputDir.mkdirs()); - } - } - - protected void createTestOutputFile(String filename) { - try { - @SuppressWarnings("PMD.CloseResource") - PrintStream out = new PrintStream(Files.newOutputStream(new File(filename).toPath())); - System.setOut(out); - System.setErr(out); - } catch (IOException e) { - fail("Can't create file " + filename + " for test."); - } - } - - /** - * @deprecated Use {@link #runTest(String...)}, note that - * it returns the log while this returns the name of a file containing the log. - */ - @Deprecated - protected String runTest(String[] args, String testname) { - return runTest(args, testname, 0); - } - - /** - * @deprecated Use {@link #runTest(StatusCode, String...)}, note that - * it returns the log while this returns the name of a file containing the log. - */ - @Deprecated - protected String runTest(String[] args, String testname, int expectedExitCode) { - String filename = TEST_OUPUT_DIRECTORY + testname + ".txt"; - long start = System.currentTimeMillis(); - createTestOutputFile(filename); - System.out.println("Start running test " + testname); - StatusCode statusCode = PMD.runPmd(args); - assertEquals(expectedExitCode, statusCode.toInt()); - System.out.println("Test finished successfully after " + (System.currentTimeMillis() - start) + "ms."); - return filename; - } - - /** - * Returns the log output. - */ - protected String runTest(String... args) { - return runTest(StatusCode.OK, args); - } - - /** - * Returns the log output. - * - * @deprecated Use {@link #runTest(StatusCode, String...)} - */ - @Deprecated - protected String runTest(int expectedExitCode, String... args) { - switch (expectedExitCode) { - case 0: - return runTest(StatusCode.OK, args); - case 1: - return runTest(StatusCode.ERROR, args); - case 4: - return runTest(StatusCode.VIOLATIONS_FOUND, args); - default: - throw AssertionUtil.shouldNotReachHere("unknown status code " + expectedExitCode); - } - } - - protected String runTest(StatusCode expectedExitCode, String... args) { - ByteArrayOutputStream console = new ByteArrayOutputStream(); - - PrintStream out = new PrintStream(new TeeOutputStream(console, System.out)); - PrintStream err = new PrintStream(new TeeOutputStream(console, System.err)); - System.setOut(out); - System.setErr(err); - StatusCode statusCode = PMD.runPmd(args); - assertEquals(expectedExitCode, statusCode); - return console.toString(); - } - - /** - * @deprecated Use {@link #runTest(StatusCode, String...)} - */ - @Deprecated - protected void runPMDWith(String[] args) { - PMD.main(args); - } - - /** - * @deprecated Use {@link #runTest(StatusCode, String...)} instead of checking the return code manually - */ - @Deprecated - protected void checkStatusCode(int expectedExitCode) { - int statusCode = getStatusCode(); - if (statusCode != expectedExitCode) { - fail("PMD failed with status code: " + statusCode); - } - } - - /** - * @deprecated Use {@link #runTest(StatusCode, String...)} instead - * of checking the return code manually - */ - @Deprecated - protected int getStatusCode() { - return Integer.parseInt(System.getProperty(PMDCommandLineInterface.STATUS_CODE_PROPERTY)); - } - - public static Matcher containsPattern(final String regex) { - return new BaseMatcher() { - final Pattern pattern = Pattern.compile(regex); - - @Override - public void describeTo(Description description) { - description.appendText("a string containing the pattern '" + this.pattern + "'"); - } - - @Override - public boolean matches(Object o) { - return o instanceof String && pattern.matcher((String) o).find(); - } - }; - } -} diff --git a/pmd-test/src/main/java/net/sourceforge/pmd/cli/BaseCPDCLITest.java b/pmd-test/src/main/java/net/sourceforge/pmd/cli/BaseCPDCLITest.java deleted file mode 100644 index a5ef1450a7..0000000000 --- a/pmd-test/src/main/java/net/sourceforge/pmd/cli/BaseCPDCLITest.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * BSD-style license; for more info see http://pmd.sourceforge.net/license.html - */ - -package net.sourceforge.pmd.cli; - -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; -import java.io.UnsupportedEncodingException; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; - -import net.sourceforge.pmd.cpd.CPD; -import net.sourceforge.pmd.cpd.CPDCommandLineInterface; - -public abstract class BaseCPDCLITest { - private ByteArrayOutputStream bufferStdout; - - private ByteArrayOutputStream bufferStderr; - - private PrintStream originalStdout; - private PrintStream originalStderr; - - @Before - public void setup() throws UnsupportedEncodingException { - originalStdout = System.out; - originalStderr = System.err; - bufferStdout = new ByteArrayOutputStream(); - System.setOut(new PrintStream(bufferStdout, false, "UTF-8")); - - bufferStderr = new ByteArrayOutputStream(); - System.setErr(new PrintStream(bufferStderr, false, "UTF-8")); - } - - @After - public void teardown() { - System.setOut(originalStdout); - System.setErr(originalStderr); - } - - /** - * @deprecated Use {@link #runTest(CPD.StatusCode, String...)} which returns the output. - */ - @Deprecated - public final String getOutput() { - try { - return bufferStdout.toString("UTF-8"); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } - } - - /** - * @deprecated Use {@link #runTest(CPD.StatusCode, String...)} - */ - @Deprecated - protected void runCPD(String... args) { - System.setProperty(CPDCommandLineInterface.NO_EXIT_AFTER_RUN, "true"); - CPD.main(args); - } - - protected String getStderr() { - try { - return bufferStderr.toString("UTF-8"); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } - } - - protected String runTest(CPD.StatusCode expectedStatusCode, String... args) { - CPD.StatusCode statusCode = CPD.runCpd(args); - Assert.assertEquals("Unexpected status code", expectedStatusCode, statusCode); - return getOutput(); - } -}