Skip to content

Commit faadb99

Browse files
authored
Merge pull request #37 from devcon5io/development
Release 1.5
2 parents e787955 + e03720f commit faadb99

12 files changed

Lines changed: 95 additions & 43 deletions

File tree

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ addons:
88
secure: $SONAR_TOKEN
99

1010
jdk:
11-
- oraclejdk8
11+
- openjdk8
1212

1313
jobs:
1414
include:

pom.xml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<artifactId>mutation-analysis-plugin</artifactId>
2525
<groupId>ch.devcon5.sonar</groupId>
2626
<packaging>sonar-plugin</packaging>
27-
<version>1.4</version>
27+
<version>1.5</version>
2828

2929
<name>${project.artifactId}</name>
3030
<description>Sonar Plugin for integrating and visualizing mutation analysis results</description>
@@ -71,6 +71,8 @@
7171
<slf4j.version>1.7.6</slf4j.version>
7272
<log4j.version>2.0-rc1</log4j.version>
7373
<mockito.version>2.21.0</mockito.version>
74+
<jacoco.version>0.8.4</jacoco.version>
75+
<pitest.version>1.4.9</pitest.version>
7476
<!-- license settings -->
7577
<license.owner>DevCon5 GmbH</license.owner>
7678
<license.title>Mutation Analysis Plugin</license.title>
@@ -158,7 +160,7 @@
158160
<plugin>
159161
<groupId>org.jacoco</groupId>
160162
<artifactId>jacoco-maven-plugin</artifactId>
161-
<version>0.8.1</version>
163+
<version>${jacoco.version}</version>
162164
<executions>
163165
<execution>
164166
<id>prepare-agent</id>
@@ -257,7 +259,7 @@
257259
<plugin>
258260
<groupId>org.pitest</groupId>
259261
<artifactId>pitest-maven</artifactId>
260-
<version>1.4.2</version>
262+
<version>${pitest.version}</version>
261263
<configuration>
262264
<targetClasses>
263265
<param>ch.devcon5.sonar.plugins.mutationanalysis.*</param>

src/main/java/ch/devcon5/sonar/plugins/mutationanalysis/MutationAnalysisPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
description = "This property is needed when the reports are not located in the default directory (i.e. target/pit-reports)",
6969
project = true),
7070
@Property(key = MutationAnalysisPlugin.PROJECT_ROOT_FOLDER,
71-
name = "Output directory for the PIT reports",
71+
name = "Root folder of multi-module projects",
7272
description = "This optional property may be used to explicitly define the root project of a multi-module project in case the "
7373
+ "project root can not be determined by the plugin.",
7474
project = true),

src/main/java/ch/devcon5/sonar/plugins/mutationanalysis/model/MutationOperators.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ public static MutationOperator find(final String mutagenKey) {
133133
*
134134
* @return a collection of {@link MutationOperator}s
135135
*/
136-
public static Collection<MutationOperator> allMutagens() {
136+
public static Collection<MutationOperator> allMutationOperators() {
137137

138138
return Collections.unmodifiableCollection(INSTANCES.values());
139139
}

src/main/java/ch/devcon5/sonar/plugins/mutationanalysis/rules/MutationAnalysisProfileDefinition.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public abstract class MutationAnalysisProfileDefinition implements BuiltInQualit
3232
public void define(final Context context) {
3333
final NewBuiltInQualityProfile mutationAnalysis = context.createBuiltInQualityProfile("Mutation Analysis", getLanguageKey());
3434

35-
MutationOperators.allMutagens().forEach(m -> mutationAnalysis.activateRule(REPOSITORY_KEY + "." + getLanguageKey(), MUTANT_RULES_PREFIX + m.getId()));
35+
MutationOperators.allMutationOperators().forEach(m -> mutationAnalysis.activateRule(REPOSITORY_KEY + "." + getLanguageKey(), MUTANT_RULES_PREFIX + m.getId()));
3636

3737
mutationAnalysis.done();
3838
}

src/main/java/ch/devcon5/sonar/plugins/mutationanalysis/rules/MutationAnalysisRulesDefinition.java

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -132,18 +132,45 @@ public void define(final Context context) {
132132
*/
133133
private void addMutatorRules(final NewRepository repository) {
134134

135-
for (final MutationOperator mutationOperator : MutationOperators.allMutagens()) {
136-
final NewRule rule = repository.createRule(MUTANT_RULES_PREFIX + mutationOperator.getId())
137-
.setName(mutationOperator.getName())
138-
.setType(RuleType.BUG)
139-
.setTags("pitest", "test", "test-quality", "mutator", "mutation-operator");
140-
mutationOperator.getMutagenDescriptionLocation().ifPresent(rule::setHtmlDescription);
141-
142-
if (mutationOperator.getId().startsWith("EXPERIMENTAL")) {
143-
rule.setStatus(RuleStatus.BETA);
144-
} else {
145-
rule.setActivatedByDefault(true);
146-
}
135+
for (final MutationOperator mutationOperator : MutationOperators.allMutationOperators()) {
136+
//create for each mutation operator two rules, one is a "bug" rule, the other is
137+
//a "code smell" rule. As there are project which prefer to treat them as bugs (or potential bugs)
138+
//and other projects might prefer to treat them as code smell. This way
139+
//the projects can decide themselves how to set up their quality profile
140+
createBugRule(repository, mutationOperator);
141+
createCodeSmellRule(repository, mutationOperator);
147142
}
148143
}
144+
145+
private void createBugRule(final NewRepository repository, final MutationOperator mutationOperator) {
146+
final String id = MUTANT_RULES_PREFIX + mutationOperator.getId();
147+
final String name = mutationOperator.getName();
148+
createRule(repository, mutationOperator, RuleType.BUG, id, name);
149+
}
150+
151+
private void createCodeSmellRule(final NewRepository repository, final MutationOperator mutationOperator) {
152+
final String id = MUTANT_RULES_PREFIX + mutationOperator.getId() + "_" + RuleType.CODE_SMELL;
153+
final String name = mutationOperator.getName() + " (Code Smell)";
154+
createRule(repository, mutationOperator, RuleType.CODE_SMELL, id, name);
155+
}
156+
157+
private void createRule(final NewRepository repository,
158+
final MutationOperator mutationOperator,
159+
final RuleType type,
160+
final String id,
161+
final String name) {
162+
final NewRule rule = repository.createRule(id)
163+
.setType(type)
164+
.setName(name)
165+
.setTags("pitest", "test", "test-quality", "mutator", "mutation-operator");
166+
mutationOperator.getMutagenDescriptionLocation().ifPresent(rule::setHtmlDescription);
167+
168+
if (mutationOperator.getId().startsWith("EXPERIMENTAL")) {
169+
rule.setStatus(RuleStatus.BETA);
170+
} else {
171+
rule.setActivatedByDefault(true);
172+
}
173+
174+
}
175+
149176
}

src/main/java/ch/devcon5/sonar/plugins/mutationanalysis/sensors/RulesProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ private boolean violatesMutatorRule(final ActiveRule rule, final Mutant mutant)
272272

273273
return rule.ruleKey()
274274
.rule()
275-
.equals(MutationAnalysisRulesDefinition.MUTANT_RULES_PREFIX + mutant.getMutationOperator().getId())
275+
.startsWith(MutationAnalysisRulesDefinition.MUTANT_RULES_PREFIX + mutant.getMutationOperator().getId())
276276
&& mutant.getState().isAlive();
277277
}
278278

src/test/java/ch/devcon5/sonar/plugins/mutationanalysis/model/MutationOperatorsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public void testFind_knownMutator_byClassNameWithSuffix() throws Exception {
7272
public void testAllMutators() throws Exception {
7373

7474
// act
75-
final Collection<MutationOperator> mutationOperators = MutationOperators.allMutagens();
75+
final Collection<MutationOperator> mutationOperators = MutationOperators.allMutationOperators();
7676

7777
// assert
7878
assertNotNull(mutationOperators);

src/test/java/ch/devcon5/sonar/plugins/mutationanalysis/rules/JavaRulesDefinitionTest.java

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static ch.devcon5.sonar.plugins.mutationanalysis.rules.MutationAnalysisRulesDefinition.MUTANT_RULES_PREFIX;
2323
import static org.junit.Assert.assertEquals;
2424
import static org.junit.Assert.assertNotNull;
25+
import static org.junit.Assert.assertTrue;
2526

2627
import java.util.List;
2728

@@ -57,7 +58,7 @@ public void testDefine() throws Exception {
5758
subject.define(context);
5859

5960
// assert
60-
RulesDefinition.Repository repository = context.repository(MutationAnalysisRulesDefinition.REPOSITORY_KEY + ".java");
61+
RulesDefinition.Repository repository = context.repository(MutationAnalysisRulesDefinition.REPOSITORY_KEY + ".java");
6162
assertNotNull(repository);
6263

6364
assertEquals("java", repository.language());
@@ -67,31 +68,50 @@ public void testDefine() throws Exception {
6768

6869
private void assertRules(final List<RulesDefinition.Rule> rules) {
6970

70-
assertEquals(27, rules.size());
71+
assertEquals(50, rules.size());
7172

7273
for (RulesDefinition.Rule rule : rules) {
7374
assertNotNull(rule.debtRemediationFunction());
7475
assertNotNull(rule.gapDescription());
7576
assertNotNull(rule.htmlDescription());
7677
}
7778

79+
//@ denotes a toString'ed object reference
80+
//"null " would be exactly 5 characters
81+
assertTrue(rules.stream()
82+
.filter(r -> r.key().startsWith(MUTANT_RULES_PREFIX) && r.key().endsWith("CODE_SMELL"))
83+
.allMatch(r -> r.name().matches("[^@]{6,}\\(Code Smell\\)")));
84+
85+
assertTrue(rules.stream()
86+
.filter(r -> r.key().startsWith(MUTANT_RULES_PREFIX) && !r.key().endsWith("CODE_SMELL"))
87+
.noneMatch(r -> r.name().matches("[^@]{6,}\\(Code Smell\\)")));
88+
7889
//all mutator rules
79-
assertEquals(26, rules.stream()
80-
.filter(rule -> rule.key().startsWith(MUTANT_RULES_PREFIX))
81-
.filter(rule -> RuleType.BUG.equals(rule.type()))
82-
.count());
83-
assertEquals(17, rules.stream()
84-
.filter(rule -> rule.status() == RuleStatus.READY)
85-
.filter(RulesDefinition.Rule::activatedByDefault)
86-
.count());
87-
assertEquals(6, rules.stream()
88-
.filter(rule -> rule.status() == RuleStatus.BETA)
89-
.filter(rule -> !rule.activatedByDefault())
90-
.count());
91-
assertEquals(3, rules.stream()
92-
.filter(rule -> rule.status() == RuleStatus.DEPRECATED)
93-
.filter(rule -> !rule.activatedByDefault())
94-
.count());
90+
assertEquals(26,
91+
rules.stream()
92+
.filter(rule -> rule.key().startsWith(MUTANT_RULES_PREFIX))
93+
.filter(rule -> RuleType.BUG.equals(rule.type()))
94+
.count());
95+
assertEquals(24,
96+
rules.stream()
97+
.filter(rule -> rule.key().startsWith(MUTANT_RULES_PREFIX))
98+
.filter(rule -> RuleType.CODE_SMELL.equals(rule.type()))
99+
.count());
100+
assertEquals(34,
101+
rules.stream()
102+
.filter(rule -> rule.status() == RuleStatus.READY)
103+
.filter(RulesDefinition.Rule::activatedByDefault)
104+
.count());
105+
assertEquals(12,
106+
rules.stream()
107+
.filter(rule -> rule.status() == RuleStatus.BETA)
108+
.filter(rule -> !rule.activatedByDefault())
109+
.count());
110+
assertEquals(3,
111+
rules.stream()
112+
.filter(rule -> rule.status() == RuleStatus.DEPRECATED)
113+
.filter(rule -> !rule.activatedByDefault())
114+
.count());
95115
}
96116

97117
}

src/test/java/ch/devcon5/sonar/plugins/mutationanalysis/rules/KotlinRulesDefinitionTest.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class KotlinRulesDefinitionTest {
6767

6868
private fun assertRules(rules: List<RulesDefinition.Rule>) {
6969

70-
assertEquals(27, rules.size.toLong())
70+
assertEquals(50, rules.size.toLong())
7171

7272
for (rule in rules) {
7373
assertNotNull(rule.debtRemediationFunction())
@@ -78,7 +78,10 @@ class KotlinRulesDefinitionTest {
7878
assertEquals(26, rules.stream()
7979
.filter { rule -> rule.key().startsWith(MUTANT_RULES_PREFIX) }
8080
.filter { rule -> RuleType.BUG == rule.type() }.count())
81-
assertEquals(6, rules.stream().filter { rule -> rule.status() == RuleStatus.BETA }.count())
81+
assertEquals(24, rules.stream()
82+
.filter { rule -> rule.key().startsWith(MUTANT_RULES_PREFIX) }
83+
.filter { rule -> RuleType.CODE_SMELL == rule.type() }.count())
84+
assertEquals(12, rules.stream().filter { rule -> rule.status() == RuleStatus.BETA }.count())
8285
assertEquals(3, rules.stream().filter { rule -> rule.status() == RuleStatus.DEPRECATED }.count())
8386
}
8487

0 commit comments

Comments
 (0)