aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssue.java8
-rw-r--r--sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssueTest.java47
2 files changed, 49 insertions, 6 deletions
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssue.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssue.java
index 585ebcf647a..280502d23b7 100644
--- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssue.java
+++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssue.java
@@ -19,14 +19,13 @@
*/
package org.sonar.api.batch.sensor.issue.internal;
-import org.sonar.api.batch.sensor.internal.SensorStorage;
-
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import org.sonar.api.batch.fs.InputDir;
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.fs.InputPath;
import org.sonar.api.batch.sensor.internal.DefaultStorable;
+import org.sonar.api.batch.sensor.internal.SensorStorage;
import org.sonar.api.batch.sensor.issue.Issue;
import org.sonar.api.batch.sensor.issue.NewIssue;
import org.sonar.api.rule.RuleKey;
@@ -94,7 +93,10 @@ public class DefaultIssue extends DefaultStorable implements Issue, NewIssue {
@Override
public DefaultIssue atLine(int line) {
- Preconditions.checkState(this.path != null && this.path instanceof InputFile, "atLine should be called after onFile");
+ Preconditions.checkState(this.path != null && this.path instanceof InputFile, "atLine should be called after onFile.");
+ Preconditions.checkArgument(line > 0, "line starts at 1, invalid value " + line + ".");
+ int lines = ((InputFile) path).lines();
+ Preconditions.checkArgument(line <= lines, "File " + path + " has " + lines + " lines. Unable to create issue at line " + line + ".");
this.line = line;
return this;
}
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssueTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssueTest.java
index 86be3bd947f..098266cff6f 100644
--- a/sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssueTest.java
+++ b/sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssueTest.java
@@ -19,13 +19,15 @@
*/
package org.sonar.api.batch.sensor.issue.internal;
-import org.sonar.api.batch.sensor.internal.SensorStorage;
-
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
+import org.sonar.api.batch.fs.internal.DefaultInputDir;
import org.sonar.api.batch.fs.internal.DefaultInputFile;
+import org.sonar.api.batch.sensor.internal.SensorStorage;
+import org.sonar.api.batch.sensor.issue.Issue.Severity;
import org.sonar.api.rule.RuleKey;
+
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@@ -39,7 +41,7 @@ public class DefaultIssueTest {
public void build_file_issue() {
SensorStorage storage = mock(SensorStorage.class);
DefaultIssue issue = new DefaultIssue(storage)
- .onFile(new DefaultInputFile("foo", "src/Foo.php"))
+ .onFile(new DefaultInputFile("foo", "src/Foo.php").setLines(3))
.forRule(RuleKey.of("repo", "rule"))
.atLine(1)
.effortToFix(10.0)
@@ -57,6 +59,25 @@ public class DefaultIssueTest {
}
@Test
+ public void build_directory_issue() {
+ SensorStorage storage = mock(SensorStorage.class);
+ DefaultIssue issue = new DefaultIssue(storage)
+ .onDir(new DefaultInputDir("foo", "src"))
+ .forRule(RuleKey.of("repo", "rule"))
+ .overrideSeverity(Severity.BLOCKER)
+ .message("Wrong way!");
+
+ assertThat(issue.inputPath()).isEqualTo(new DefaultInputDir("foo", "src"));
+ assertThat(issue.ruleKey()).isEqualTo(RuleKey.of("repo", "rule"));
+ assertThat(issue.message()).isEqualTo("Wrong way!");
+ assertThat(issue.overridenSeverity()).isEqualTo(Severity.BLOCKER);
+
+ issue.save();
+
+ verify(storage).store(issue);
+ }
+
+ @Test
public void build_project_issue() {
SensorStorage storage = mock(SensorStorage.class);
DefaultIssue issue = new DefaultIssue(storage)
@@ -89,4 +110,24 @@ public class DefaultIssueTest {
.message("Wrong way!");
}
+ @Test
+ public void line_is_positive() {
+ thrown.expect(IllegalArgumentException.class);
+ thrown.expectMessage("line starts at 1, invalid value 0.");
+ new DefaultIssue()
+ .onFile(new DefaultInputFile("foo", "src/Foo.php").setLines(3))
+ .forRule(RuleKey.of("repo", "rule"))
+ .atLine(0);
+ }
+
+ @Test
+ public void not_allowed_to_create_issues_on_unexisting_line() {
+ thrown.expect(IllegalArgumentException.class);
+ thrown.expectMessage("File [moduleKey=foo, relative=src/Foo.php, basedir=null] has 3 lines. Unable to create issue at line 5.");
+ new DefaultIssue()
+ .onFile(new DefaultInputFile("foo", "src/Foo.php").setLines(3))
+ .forRule(RuleKey.of("repo", "rule"))
+ .atLine(5);
+ }
+
}
414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493