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); | 
