Skip to content

Commit

Permalink
Issue #10745: Added new TestInputConfiguration to hold child modules …
Browse files Browse the repository at this point in the history
…and violations
  • Loading branch information
shashwatj07 authored and romani committed Aug 29, 2021
1 parent 1891eec commit 87a8533
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 53 deletions.
3 changes: 2 additions & 1 deletion config/pmd.xml
Expand Up @@ -22,7 +22,8 @@
<properties>
<!-- The PMD gives false positive for Builder patterns. Fixed in PMD 7. -->
<property name="violationSuppressXPath"
value="//ClassOrInterfaceDeclaration[@SimpleName='ModuleInputConfiguration']"/>
value="//ClassOrInterfaceDeclaration
[@SimpleName='TestInputConfiguration' or @SimpleName='ModuleInputConfiguration']"/>
</properties>
</rule>
<rule ref="category/java/bestpractices.xml/AvoidPrintStackTrace">
Expand Down
Expand Up @@ -45,6 +45,7 @@
import com.puppycrawl.tools.checkstyle.api.Violation;
import com.puppycrawl.tools.checkstyle.bdd.InlineConfigParser;
import com.puppycrawl.tools.checkstyle.bdd.ModuleInputConfiguration;
import com.puppycrawl.tools.checkstyle.bdd.TestInputConfiguration;
import com.puppycrawl.tools.checkstyle.bdd.TestInputViolation;
import com.puppycrawl.tools.checkstyle.internal.utils.BriefUtLogger;
import com.puppycrawl.tools.checkstyle.internal.utils.TestUtil;
Expand Down Expand Up @@ -221,20 +222,22 @@ protected final void verifyFilterWithInlineConfigParser(Configuration aConfig,
String filePath, String[] expectedUnfiltered,
String... expectedFiltered)
throws Exception {
final ModuleInputConfiguration checkModuleInputConfiguration =
final TestInputConfiguration checkTestInputConfiguration =
InlineConfigParser.parseWithFilteredViolations(filePath);
final Configuration parsedCheckConfig = checkModuleInputConfiguration.createConfiguration();
verifyConfig(aConfig, parsedCheckConfig, checkModuleInputConfiguration);
verifyViolations(parsedCheckConfig, filePath, checkModuleInputConfiguration);
final Configuration parsedCheckConfig = checkTestInputConfiguration.createConfiguration();
verifyConfig(aConfig, parsedCheckConfig,
checkTestInputConfiguration.getChildrenModules().get(0));
verifyViolations(parsedCheckConfig, filePath, checkTestInputConfiguration);
verify(parsedCheckConfig, filePath, expectedUnfiltered);
final ModuleInputConfiguration filterModuleInputConfiguration =
final TestInputConfiguration filterTestInputConfiguration =
InlineConfigParser.parseFilter(filePath);
final Configuration parsedFilterConfig =
filterModuleInputConfiguration.createConfiguration();
verifyConfig(filterConfig, parsedFilterConfig, filterModuleInputConfiguration);
filterTestInputConfiguration.createConfiguration();
verifyConfig(filterConfig, parsedFilterConfig,
filterTestInputConfiguration.getChildrenModules().get(0));
final DefaultConfiguration rootConfig = createRootConfig(parsedCheckConfig);
rootConfig.addChild(parsedFilterConfig);
verifyViolations(rootConfig, filePath, filterModuleInputConfiguration);
verifyViolations(rootConfig, filePath, filterTestInputConfiguration);
verify(rootConfig, filePath, expectedFiltered);
}

Expand All @@ -251,11 +254,11 @@ protected final void verifyFilterWithInlineConfigParser(Configuration aConfig,
protected final void verifyWithInlineConfigParser(Configuration aConfig,
String filePath, String... expected)
throws Exception {
final ModuleInputConfiguration moduleInputConfiguration =
final TestInputConfiguration testInputConfiguration =
InlineConfigParser.parse(filePath);
final Configuration parsedConfig = moduleInputConfiguration.createConfiguration();
verifyConfig(aConfig, parsedConfig, moduleInputConfiguration);
verifyViolations(parsedConfig, filePath, moduleInputConfiguration);
final Configuration parsedConfig = testInputConfiguration.createConfiguration();
verifyConfig(aConfig, parsedConfig, testInputConfiguration.getChildrenModules().get(0));
verifyViolations(parsedConfig, filePath, testInputConfiguration);
verify(parsedConfig, filePath, expected);
}

Expand Down Expand Up @@ -427,16 +430,16 @@ private static void verifyConfig(Configuration testConfig,
*
* @param config parsed config.
* @param file file path.
* @param moduleInputConfiguration ModuleInputConfiguration object.
* @param testInputConfiguration TestInputConfiguration object.
* @throws Exception if exception occurs during verification process.
*/
private void verifyViolations(Configuration config,
String file,
ModuleInputConfiguration moduleInputConfiguration)
TestInputConfiguration testInputConfiguration)
throws Exception {
final List<String> actualViolations = getActualViolationsForFile(config, file);
final List<TestInputViolation> testInputViolations =
moduleInputConfiguration.getViolations();
testInputConfiguration.getViolations();
assertWithMessage("Number of actual and expected violations differ.")
.that(actualViolations)
.hasSize(testInputViolations.size());
Expand Down
Expand Up @@ -84,7 +84,7 @@ public final class InlineConfigParser {
private InlineConfigParser() {
}

public static ModuleInputConfiguration parse(String inputFilePath) throws Exception {
public static TestInputConfiguration parse(String inputFilePath) throws Exception {
return parse(inputFilePath, false);
}

Expand All @@ -95,19 +95,22 @@ public static ModuleInputConfiguration parse(String inputFilePath) throws Except
* @param setFilteredViolations flag to set filtered violations.
* @throws Exception if unable to read file or file not formatted properly.
*/
private static ModuleInputConfiguration parse(String inputFilePath,
boolean setFilteredViolations) throws Exception {
private static TestInputConfiguration parse(String inputFilePath,
boolean setFilteredViolations) throws Exception {
final Path filePath = Paths.get(inputFilePath);
final List<String> lines = readFile(filePath);
final ModuleInputConfiguration.Builder inputConfigBuilder =
final TestInputConfiguration.Builder testInputConfigBuilder =
new TestInputConfiguration.Builder();
final ModuleInputConfiguration.Builder moduleInputConfigBuilder =
new ModuleInputConfiguration.Builder();
setModuleName(inputConfigBuilder, inputFilePath, lines);
setProperties(inputConfigBuilder, inputFilePath, lines, 2);
setViolations(inputConfigBuilder, lines, setFilteredViolations);
return inputConfigBuilder.build();
setModuleName(moduleInputConfigBuilder, inputFilePath, lines);
setProperties(moduleInputConfigBuilder, inputFilePath, lines, 2);
setViolations(testInputConfigBuilder, lines, setFilteredViolations);
testInputConfigBuilder.addChildModule(moduleInputConfigBuilder.build());
return testInputConfigBuilder.build();
}

public static ModuleInputConfiguration parseWithFilteredViolations(String inputFilePath)
public static TestInputConfiguration parseWithFilteredViolations(String inputFilePath)
throws Exception {
return parse(inputFilePath, true);
}
Expand All @@ -118,17 +121,20 @@ public static ModuleInputConfiguration parseWithFilteredViolations(String inputF
* @param inputFilePath the input file path.
* @throws Exception if unable to read file or file not formatted properly.
*/
public static ModuleInputConfiguration parseFilter(String inputFilePath)
public static TestInputConfiguration parseFilter(String inputFilePath)
throws Exception {
final Path filePath = Paths.get(inputFilePath);
final List<String> lines = readFile(filePath);
final ModuleInputConfiguration.Builder inputConfigBuilder =
final TestInputConfiguration.Builder testInputConfigBuilder =
new TestInputConfiguration.Builder();
final ModuleInputConfiguration.Builder moduleInputConfigBuilder =
new ModuleInputConfiguration.Builder();
final int lineNo = getFilterConfigLineNo(lines);
setFilterName(inputConfigBuilder, inputFilePath, lines, lineNo);
setProperties(inputConfigBuilder, inputFilePath, lines, lineNo + 1);
setViolations(inputConfigBuilder, lines, false);
return inputConfigBuilder.build();
setFilterName(moduleInputConfigBuilder, inputFilePath, lines, lineNo);
setProperties(moduleInputConfigBuilder, inputFilePath, lines, lineNo + 1);
setViolations(testInputConfigBuilder, lines, false);
testInputConfigBuilder.addChildModule(moduleInputConfigBuilder.build());
return testInputConfigBuilder.build();
}

private static String getFullyQualifiedClassName(String filePath, String moduleName) {
Expand Down Expand Up @@ -269,7 +275,7 @@ else if (value.startsWith("(default)")) {
}
}

private static void setViolations(ModuleInputConfiguration.Builder inputConfigBuilder,
private static void setViolations(TestInputConfiguration.Builder inputConfigBuilder,
List<String> lines, boolean useFilteredViolations) {
for (int lineNo = 0; lineNo < lines.size(); lineNo++) {
final Matcher violationMatcher =
Expand Down Expand Up @@ -321,7 +327,7 @@ else if (useFilteredViolations) {
}
}

private static void setFilteredViolation(ModuleInputConfiguration.Builder inputConfigBuilder,
private static void setFilteredViolation(TestInputConfiguration.Builder inputConfigBuilder,
int lineNo, String line) {
final Matcher violationMatcher =
FILTERED_VIOLATION_PATTERN.matcher(line);
Expand Down
Expand Up @@ -19,10 +19,8 @@

package com.puppycrawl.tools.checkstyle.bdd;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
Expand All @@ -41,19 +39,14 @@ public final class ModuleInputConfiguration {
/** Map of module messages. */
private final Map<String, String> moduleMessages;

/** List of parsed violations. */
private final List<TestInputViolation> violations;

private ModuleInputConfiguration(String moduleName,
Map<String, String> defaultProperties,
Map<String, String> nonDefaultProperties,
Map<String, String> moduleMessages,
List<TestInputViolation> violations) {
Map<String, String> moduleMessages) {
this.moduleName = moduleName;
this.defaultProperties = defaultProperties;
this.nonDefaultProperties = nonDefaultProperties;
this.moduleMessages = moduleMessages;
this.violations = violations;
}

public String getModuleName() {
Expand All @@ -79,10 +72,6 @@ public Map<String, String> getModuleMessages() {
return Collections.unmodifiableMap(moduleMessages);
}

public List<TestInputViolation> getViolations() {
return Collections.unmodifiableList(violations);
}

public DefaultConfiguration createConfiguration() {
final DefaultConfiguration parsedConfig = new DefaultConfiguration(moduleName);
nonDefaultProperties.forEach(parsedConfig::addProperty);
Expand All @@ -102,8 +91,6 @@ public static final class Builder {

private final Map<String, String> moduleMessages = new HashMap<>();

private final List<TestInputViolation> violations = new ArrayList<>();

private String moduleName;

public void setModuleName(String moduleName) {
Expand All @@ -122,17 +109,12 @@ public void addModuleMessage(String messageKey, String messageString) {
moduleMessages.put(messageKey, messageString);
}

public void addViolation(int violationLine, String violationMessage) {
violations.add(new TestInputViolation(violationLine, violationMessage));
}

public ModuleInputConfiguration build() {
return new ModuleInputConfiguration(
moduleName,
defaultProperties,
nonDefaultProperties,
moduleMessages,
violations
moduleMessages
);
}
}
Expand Down
@@ -0,0 +1,73 @@
////////////////////////////////////////////////////////////////////////////////
// checkstyle: Checks Java source code for adherence to a set of rules.
// Copyright (C) 2001-2021 the original author or authors.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
////////////////////////////////////////////////////////////////////////////////

package com.puppycrawl.tools.checkstyle.bdd;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.puppycrawl.tools.checkstyle.DefaultConfiguration;

public final class TestInputConfiguration {

private final List<ModuleInputConfiguration> childrenModules;

private final List<TestInputViolation> violations;

private TestInputConfiguration(List<ModuleInputConfiguration> childrenModules,
List<TestInputViolation> violations) {
this.childrenModules = childrenModules;
this.violations = violations;
}

public List<TestInputViolation> getViolations() {
return Collections.unmodifiableList(violations);
}

public List<ModuleInputConfiguration> getChildrenModules() {
return Collections.unmodifiableList(childrenModules);
}

public DefaultConfiguration createConfiguration() {
return childrenModules.get(0).createConfiguration();
}

public static final class Builder {

private final List<ModuleInputConfiguration> childrenModules = new ArrayList<>();

private final List<TestInputViolation> violations = new ArrayList<>();

public void addViolation(int violationLine, String violationMessage) {
violations.add(new TestInputViolation(violationLine, violationMessage));
}

public void addChildModule(ModuleInputConfiguration childModule) {
childrenModules.add(childModule);
}

public TestInputConfiguration build() {
return new TestInputConfiguration(
childrenModules,
violations
);
}
}
}

0 comments on commit 87a8533

Please sign in to comment.