aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--its/plugin/pom.xml6
-rw-r--r--its/plugin/projects/issues-project/src/file1.css4
-rw-r--r--its/plugin/projects/issues-project/src/file2.less4
-rw-r--r--its/plugin/projects/issues-project/src/file3.scss4
-rw-r--r--its/plugin/projects/metrics-project/src/file1.css (renamed from its/plugin/projects/css-plugin-test-project/src/file1.css)1
-rw-r--r--its/plugin/projects/metrics-project/src/file2.less (renamed from its/plugin/projects/css-plugin-test-project/src/file2.less)0
-rw-r--r--its/plugin/projects/metrics-project/src/file3.scss (renamed from its/plugin/projects/css-plugin-test-project/src/file3.scss)0
-rw-r--r--its/plugin/projects/metrics-project/src/file4.html (renamed from its/plugin/projects/css-plugin-test-project/src/file4.html)0
-rw-r--r--its/plugin/src/test/java/org/sonar/css/its/IssuesTest.java7
-rw-r--r--its/plugin/src/test/java/org/sonar/css/its/MetricsTest.java12
-rw-r--r--its/plugin/src/test/java/org/sonar/css/its/Tests.java2
-rw-r--r--sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRules.java18
-rw-r--r--sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRulesDefinition.java4
-rw-r--r--sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/UnitNoUnknown.java31
-rw-r--r--sonar-css-plugin/src/main/resources/org/sonar/l10n/css/rules/css/S4653.html20
-rw-r--r--sonar-css-plugin/src/main/resources/org/sonar/l10n/css/rules/css/S4653.json16
-rw-r--r--sonar-css-plugin/src/main/resources/org/sonar/l10n/css/rules/css/Sonar_way_profile.json3
-rw-r--r--sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssLanguageTest.java2
-rw-r--r--sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssRuleSensorTest.java4
-rw-r--r--sonar-css-plugin/src/test/java/org/sonar/css/plugin/SonarWayProfileTest.java2
-rw-r--r--sonar-css-plugin/src/test/java/org/sonar/css/plugin/TokenizerTest.java2
-rw-r--r--sonar-css-plugin/src/test/java/org/sonar/css/plugin/bundle/CssBundleHandlerTest.java2
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);