diff options
| author | Amaury Levé | 2018-06-21 14:55:09 +0200 |
|---|---|---|
| committer | GitHub | 2018-06-21 14:55:09 +0200 |
| commit | 9bcc46b342cfb888f16c180cb0b3103335def5f1 (patch) | |
| tree | 6b85805bbedef51c974b6984cb42b53052f9b375 | |
| parent | 913028fc4c913fec3bbc1800c00e526413040e01 (diff) | |
| download | sonar-css-9bcc46b342cfb888f16c180cb0b3103335def5f1.tar.bz2 | |
Rule S4653: Units should be valid (#50)
22 files changed, 116 insertions, 28 deletions
diff --git a/its/plugin/pom.xml b/its/plugin/pom.xml index 24aa42c..ec3b408 100644 --- a/its/plugin/pom.xml +++ b/its/plugin/pom.xml @@ -27,6 +27,12 @@ <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> </dependency> + <dependency> + <groupId>org.sonarsource.css</groupId> + <artifactId>sonar-css-plugin</artifactId> + <version>${version}</version> + <scope>test</scope> + </dependency> </dependencies> <build> diff --git a/its/plugin/projects/issues-project/src/file1.css b/its/plugin/projects/issues-project/src/file1.css new file mode 100644 index 0000000..b0dcf70 --- /dev/null +++ b/its/plugin/projects/issues-project/src/file1.css @@ -0,0 +1,4 @@ +.class1 { + background-color: #ffw; /* S4647 | color-no-invalid-hex */ + width: 100pixels; /* S4653 | unit-no-unknown */ +}
\ No newline at end of file diff --git a/its/plugin/projects/issues-project/src/file2.less b/its/plugin/projects/issues-project/src/file2.less new file mode 100644 index 0000000..b0dcf70 --- /dev/null +++ b/its/plugin/projects/issues-project/src/file2.less @@ -0,0 +1,4 @@ +.class1 { + background-color: #ffw; /* S4647 | color-no-invalid-hex */ + width: 100pixels; /* S4653 | unit-no-unknown */ +}
\ No newline at end of file diff --git a/its/plugin/projects/issues-project/src/file3.scss b/its/plugin/projects/issues-project/src/file3.scss new file mode 100644 index 0000000..b0dcf70 --- /dev/null +++ b/its/plugin/projects/issues-project/src/file3.scss @@ -0,0 +1,4 @@ +.class1 { + background-color: #ffw; /* S4647 | color-no-invalid-hex */ + width: 100pixels; /* S4653 | unit-no-unknown */ +}
\ No newline at end of file diff --git a/its/plugin/projects/css-plugin-test-project/src/file1.css b/its/plugin/projects/metrics-project/src/file1.css index 621aea1..fc4bf73 100644 --- a/its/plugin/projects/css-plugin-test-project/src/file1.css +++ b/its/plugin/projects/metrics-project/src/file1.css @@ -2,7 +2,6 @@ background-color: #2d5e8b; } .class1 .class2 { - background-color: #ffw; /* issue here */ color: #2d5e8b; foo: "some text"; } diff --git a/its/plugin/projects/css-plugin-test-project/src/file2.less b/its/plugin/projects/metrics-project/src/file2.less index 691fd11..691fd11 100644 --- a/its/plugin/projects/css-plugin-test-project/src/file2.less +++ b/its/plugin/projects/metrics-project/src/file2.less diff --git a/its/plugin/projects/css-plugin-test-project/src/file3.scss b/its/plugin/projects/metrics-project/src/file3.scss index fd62422..fd62422 100644 --- a/its/plugin/projects/css-plugin-test-project/src/file3.scss +++ b/its/plugin/projects/metrics-project/src/file3.scss diff --git a/its/plugin/projects/css-plugin-test-project/src/file4.html b/its/plugin/projects/metrics-project/src/file4.html index 499a20b..499a20b 100644 --- a/its/plugin/projects/css-plugin-test-project/src/file4.html +++ b/its/plugin/projects/metrics-project/src/file4.html diff --git a/its/plugin/src/test/java/org/sonar/css/its/IssuesTest.java b/its/plugin/src/test/java/org/sonar/css/its/IssuesTest.java index 0f9de2e..d70597d 100644 --- a/its/plugin/src/test/java/org/sonar/css/its/IssuesTest.java +++ b/its/plugin/src/test/java/org/sonar/css/its/IssuesTest.java @@ -25,6 +25,7 @@ import java.util.List; import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.Test; +import org.sonar.css.plugin.CssRules; import org.sonarqube.ws.Issues.Issue; import org.sonarqube.ws.client.issues.SearchRequest; @@ -33,7 +34,7 @@ import static org.sonar.css.its.Tests.newWsClient; public class IssuesTest { - private static String PROJECT_KEY = "css-plugin-test-project"; + private static String PROJECT_KEY = "issues-project"; @ClassRule public static Orchestrator orchestrator = Tests.ORCHESTRATOR; @@ -49,9 +50,7 @@ public class IssuesTest { request.setComponentKeys(Collections.singletonList(PROJECT_KEY)); List<Issue> issuesList = newWsClient().issues().search(request).getIssuesList(); - assertThat(issuesList).extracting("line").containsOnly(5); - assertThat(issuesList).extracting("component").containsOnly(PROJECT_KEY + ":src/file1.css"); - assertThat(issuesList).extracting("rule").containsOnly("css:S4647"); + assertThat(issuesList).extracting("rule").hasSize(CssRules.getRuleClasses().size() * 3); } } diff --git a/its/plugin/src/test/java/org/sonar/css/its/MetricsTest.java b/its/plugin/src/test/java/org/sonar/css/its/MetricsTest.java index 9af016d..4e6280c 100644 --- a/its/plugin/src/test/java/org/sonar/css/its/MetricsTest.java +++ b/its/plugin/src/test/java/org/sonar/css/its/MetricsTest.java @@ -30,7 +30,7 @@ import static org.sonar.css.its.Tests.getProjectMeasureAsDouble; public class MetricsTest { - private static String PROJECT_KEY = "css-plugin-test-project"; + private static String PROJECT_KEY = "metrics-project"; @ClassRule public static Orchestrator orchestrator = Tests.ORCHESTRATOR; @@ -42,14 +42,14 @@ public class MetricsTest { @Test public void test() { - assertThat(getProjectMeasureAsDouble("lines", PROJECT_KEY)).isEqualTo(33); - assertThat(getProjectMeasureAsDouble("ncloc", PROJECT_KEY)).isEqualTo(23); - assertThat(getProjectMeasureAsDouble("comment_lines", PROJECT_KEY)).isEqualTo(5); + assertThat(getProjectMeasureAsDouble("lines", PROJECT_KEY)).isEqualTo(32); + assertThat(getProjectMeasureAsDouble("ncloc", PROJECT_KEY)).isEqualTo(22); + assertThat(getProjectMeasureAsDouble("comment_lines", PROJECT_KEY)).isEqualTo(4); assertThat(getMeasure("ncloc_data", PROJECT_KEY + ":src/file1.css").getValue()) - .contains("1=1;", "2=1;", "3=1;", "4=1;", "5=1;", "6=1;", "7=1;", "8=1"); + .contains("1=1;", "2=1;", "3=1;", "4=1;", "5=1;", "6=1;", "7=1"); assertThat(getMeasure("comment_lines_data", PROJECT_KEY + ":src/file1.css").getValue()) - .contains("5=1;", "10=1"); + .contains("9=1"); assertThat(getMeasure("ncloc_data", PROJECT_KEY + ":src/file2.less").getValue()) .contains("1=1;", "2=1;", "3=1;", "4=1;", "5=1;", "6=1;", "7=1;", "8=1;", "9=1"); diff --git a/its/plugin/src/test/java/org/sonar/css/its/Tests.java b/its/plugin/src/test/java/org/sonar/css/its/Tests.java index eb6a01e..31b2f78 100644 --- a/its/plugin/src/test/java/org/sonar/css/its/Tests.java +++ b/its/plugin/src/test/java/org/sonar/css/its/Tests.java @@ -52,7 +52,7 @@ public class Tests { static { OrchestratorBuilder orchestratorBuilder = Orchestrator.builderEnv() .addPlugin(PLUGIN_LOCATION) - .setSonarVersion(System.getProperty("sonar.runtimeVersion", "7.2-RC1")); + .setSonarVersion(System.getProperty("sonar.runtimeVersion", "7.2")); ORCHESTRATOR = orchestratorBuilder.build(); } diff --git a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRules.java b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRules.java index 4fdf3f5..1dac08c 100644 --- a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRules.java +++ b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRules.java @@ -19,17 +19,19 @@ */ package org.sonar.css.plugin; +import org.sonar.api.batch.rule.CheckFactory; +import org.sonar.api.batch.rule.Checks; +import org.sonar.api.rule.RuleKey; +import org.sonar.css.plugin.rules.ColorNoInvalidHex; +import org.sonar.css.plugin.rules.CssRule; +import org.sonar.css.plugin.rules.UnitNoUnknown; + import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.sonar.api.batch.rule.CheckFactory; -import org.sonar.api.batch.rule.Checks; -import org.sonar.api.rule.RuleKey; -import org.sonar.css.plugin.rules.ColorNoInvalidHex; -import org.sonar.css.plugin.rules.CssRule; public class CssRules { @@ -37,7 +39,8 @@ public class CssRules { private final StylelintConfig config = new StylelintConfig(); public CssRules(CheckFactory checkFactory) { - Checks<CssRule> checks = checkFactory.<CssRule>create(CssRulesDefinition.REPOSITORY_KEY).addAnnotatedChecks((Iterable) getRuleClasses()); + Checks<CssRule> checks = checkFactory.<CssRule>create(CssRulesDefinition.REPOSITORY_KEY) + .addAnnotatedChecks((Iterable) getRuleClasses()); Collection<CssRule> enabledRules = checks.all(); stylelintKeyToRuleKey = new HashMap<>(); for (CssRule rule : enabledRules) { @@ -48,7 +51,8 @@ public class CssRules { public static List<Class> getRuleClasses() { return Collections.unmodifiableList(Arrays.asList( - ColorNoInvalidHex.class + ColorNoInvalidHex.class, + UnitNoUnknown.class )); } diff --git a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRulesDefinition.java b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRulesDefinition.java index 196252f..a338d7f 100644 --- a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRulesDefinition.java +++ b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRulesDefinition.java @@ -19,9 +19,7 @@ */ package org.sonar.css.plugin; -import java.util.Collections; import org.sonar.api.server.rule.RulesDefinition; -import org.sonar.css.plugin.rules.ColorNoInvalidHex; import org.sonarsource.analyzer.commons.RuleMetadataLoader; import static org.sonar.css.plugin.SonarWayProfile.PROFILE_PATH; @@ -40,7 +38,7 @@ public class CssRulesDefinition implements RulesDefinition { .setName(RULE_REPOSITORY_NAME); RuleMetadataLoader ruleMetadataLoader = new RuleMetadataLoader(RESOURCE_FOLDER, PROFILE_PATH); - ruleMetadataLoader.addRulesByAnnotatedClass(repository, Collections.singletonList(ColorNoInvalidHex.class)); + ruleMetadataLoader.addRulesByAnnotatedClass(repository, CssRules.getRuleClasses()); repository.done(); } } diff --git a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/UnitNoUnknown.java b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/UnitNoUnknown.java new file mode 100644 index 0000000..eee43db --- /dev/null +++ b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/UnitNoUnknown.java @@ -0,0 +1,31 @@ +/* + * SonarCSS + * Copyright (C) 2018-2018 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program 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 3 of the License, or (at your option) any later version. + * + * This program 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 program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.css.plugin.rules; + +import org.sonar.check.Rule; + +@Rule(key = "S4653") +public class UnitNoUnknown implements CssRule { + + @Override + public String stylelintKey() { + return "unit-no-unknown"; + } +} diff --git a/sonar-css-plugin/src/main/resources/org/sonar/l10n/css/rules/css/S4653.html b/sonar-css-plugin/src/main/resources/org/sonar/l10n/css/rules/css/S4653.html new file mode 100644 index 0000000..283bf5d --- /dev/null +++ b/sonar-css-plugin/src/main/resources/org/sonar/l10n/css/rules/css/S4653.html @@ -0,0 +1,20 @@ +<p>The W3C specifications define the <code>units</code> that can be used with lengths. A unit that is not part of the list of supported ones is likely +to be a typo and will be seen as a UI bug by the user.</p> +<p>This rule raises an issue each time a unit is not officially supported.</p> +<h2>Noncompliant Code Example</h2> +<pre> +a { + width: 10pixels; +} +</pre> +<h2>Compliant Solution</h2> +<pre> +a { + width: 10px; +} +</pre> +<h2>See</h2> +<ul> + <li> https://www.w3.org/TR/css3-values/#lengths </li> +</ul> + diff --git a/sonar-css-plugin/src/main/resources/org/sonar/l10n/css/rules/css/S4653.json b/sonar-css-plugin/src/main/resources/org/sonar/l10n/css/rules/css/S4653.json new file mode 100644 index 0000000..b6ee0e2 --- /dev/null +++ b/sonar-css-plugin/src/main/resources/org/sonar/l10n/css/rules/css/S4653.json @@ -0,0 +1,16 @@ +{ + "title": "Units should be valid", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + + ], + "defaultSeverity": "Blocker", + "ruleSpecification": "RSPEC-4653", + "sqKey": "S4653", + "scope": "Main" +} diff --git a/sonar-css-plugin/src/main/resources/org/sonar/l10n/css/rules/css/Sonar_way_profile.json b/sonar-css-plugin/src/main/resources/org/sonar/l10n/css/rules/css/Sonar_way_profile.json index ba5ce46..a0e81bb 100644 --- a/sonar-css-plugin/src/main/resources/org/sonar/l10n/css/rules/css/Sonar_way_profile.json +++ b/sonar-css-plugin/src/main/resources/org/sonar/l10n/css/rules/css/Sonar_way_profile.json @@ -1,6 +1,7 @@ { "name": "Sonar way", "ruleKeys": [ - "S4647" + "S4647", + "S4653" ] } diff --git a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssLanguageTest.java b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssLanguageTest.java index cf5c65a..8ebbbc0 100644 --- a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssLanguageTest.java +++ b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssLanguageTest.java @@ -27,7 +27,7 @@ import static org.assertj.core.api.Assertions.assertThat; public class CssLanguageTest { @Test - public void test() throws Exception { + public void test() { MapSettings settings = new MapSettings(); settings.setProperty(CssPlugin.FILE_SUFFIXES_KEY, CssPlugin.FILE_SUFFIXES_DEFVALUE); CssLanguage language = new CssLanguage(settings.asConfig()); diff --git a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssRuleSensorTest.java b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssRuleSensorTest.java index 5c9e5ae..d176688 100644 --- a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssRuleSensorTest.java +++ b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssRuleSensorTest.java @@ -49,7 +49,7 @@ public class CssRuleSensorTest { public TemporaryFolder tmpDir = new TemporaryFolder(); @Test - public void test_descriptor() throws Exception { + public void test_descriptor() { CssRuleSensor sensor = new CssRuleSensor(new CssBundleHandler(), checkFactory, new StylelintCommandProvider()); DefaultSensorDescriptor sensorDescriptor = new DefaultSensorDescriptor(); sensor.describe(sensorDescriptor); @@ -59,7 +59,7 @@ public class CssRuleSensorTest { } @Test - public void test_execute() throws Exception { + public void test_execute() throws IOException { SensorContextTester context = SensorContextTester.create(BASE_DIR); context.fileSystem().setWorkDir(tmpDir.getRoot().toPath()); DefaultInputFile inputFile = createInputFile(context, "some css content\n on 2 lines", "dir/file.css"); diff --git a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/SonarWayProfileTest.java b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/SonarWayProfileTest.java index eba68f5..a726858 100644 --- a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/SonarWayProfileTest.java +++ b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/SonarWayProfileTest.java @@ -38,7 +38,7 @@ public class SonarWayProfileTest { assertThat(profile.language()).isEqualTo(CssLanguage.KEY); assertThat(profile.name()).isEqualTo(SonarWayProfile.PROFILE_NAME); assertThat(profile.rules()).extracting("repoKey").containsOnly(CssRulesDefinition.REPOSITORY_KEY); - assertThat(profile.rules()).extracting("ruleKey").contains("S4647"); + assertThat(profile.rules()).extracting("ruleKey").hasSize(CssRules.getRuleClasses().size()); } } diff --git a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/TokenizerTest.java b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/TokenizerTest.java index 76c4617..a0cf508 100644 --- a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/TokenizerTest.java +++ b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/TokenizerTest.java @@ -22,6 +22,8 @@ package org.sonar.css.plugin; import java.util.List; import org.junit.Test; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; public class TokenizerTest { diff --git a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/bundle/CssBundleHandlerTest.java b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/bundle/CssBundleHandlerTest.java index b55d050..fe56c89 100644 --- a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/bundle/CssBundleHandlerTest.java +++ b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/bundle/CssBundleHandlerTest.java @@ -44,7 +44,7 @@ public class CssBundleHandlerTest { } @Test - public void test() throws Exception { + public void test() { CssBundleHandler bundleHandler = new CssBundleHandler(); bundleHandler.bundleLocation = "/bundle/test-bundle.zip"; bundleHandler.deployBundle(DEPLOY_DESTINATION); |
