Skip to content

Commit 2f8bbdb

Browse files
committed
Create javascript-checks-testkit module
1 parent 6733d9c commit 2f8bbdb

File tree

147 files changed

+567
-505
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

147 files changed

+567
-505
lines changed

javascript-checks-testkit/pom.xml

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>javascript</artifactId>
7+
<groupId>org.sonarsource.javascript</groupId>
8+
<version>2.11-SNAPSHOT</version>
9+
</parent>
10+
11+
<modelVersion>4.0.0</modelVersion>
12+
13+
<artifactId>javascript-checks-testkit</artifactId>
14+
15+
<name>SonarQube JavaScript :: Check Test Toolkit</name>
16+
17+
<dependencies>
18+
<dependency>
19+
<groupId>${project.groupId}</groupId>
20+
<artifactId>javascript-frontend</artifactId>
21+
</dependency>
22+
23+
<dependency>
24+
<groupId>org.easytesting</groupId>
25+
<artifactId>fest-assert</artifactId>
26+
</dependency>
27+
28+
<dependency>
29+
<groupId>junit</groupId>
30+
<artifactId>junit</artifactId>
31+
</dependency>
32+
33+
<dependency>
34+
<groupId>org.mockito</groupId>
35+
<artifactId>mockito-all</artifactId>
36+
<scope>test</scope>
37+
</dependency>
38+
39+
</dependencies>
40+
</project>

javascript-checks/src/test/java/org/sonar/javascript/checks/utils/JavaScriptCheckVerifier.java renamed to javascript-checks-testkit/src/main/java/org/sonar/javascript/checks/verifier/JavaScriptCheckVerifier.java

Lines changed: 61 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* along with this program; if not, write to the Free Software Foundation,
1818
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1919
*/
20-
package org.sonar.javascript.checks.utils;
20+
package org.sonar.javascript.checks.verifier;
2121

2222
import com.google.common.base.Function;
2323
import com.google.common.base.Splitter;
@@ -28,10 +28,7 @@
2828
import java.util.Iterator;
2929
import java.util.List;
3030
import javax.annotation.Nullable;
31-
import org.fest.assertions.Assertions;
3231
import org.sonar.javascript.visitors.JavaScriptVisitorContext;
33-
import org.sonar.javascript.checks.tests.TestIssue;
34-
import org.sonar.javascript.checks.tests.TestUtils;
3532
import org.sonar.plugins.javascript.api.JavaScriptCheck;
3633
import org.sonar.plugins.javascript.api.tree.Tree;
3734
import org.sonar.plugins.javascript.api.tree.Tree.Kind;
@@ -42,12 +39,53 @@
4239
import org.sonar.plugins.javascript.api.visitors.LineIssue;
4340
import org.sonar.plugins.javascript.api.visitors.PreciseIssue;
4441
import org.sonar.plugins.javascript.api.visitors.SubscriptionVisitorCheck;
42+
import org.sonar.squidbridge.checks.CheckMessagesVerifier;
43+
44+
import static org.fest.assertions.Assertions.assertThat;
4545

4646
public class JavaScriptCheckVerifier extends SubscriptionVisitorCheck {
4747

4848
private final List<TestIssue> expectedIssues = new ArrayList<>();
4949

50+
/**
51+
* Example:
52+
* <pre>
53+
* JavaScriptCheckVerifier.issues(new MyCheck(), myFile))
54+
* .next().atLine(2).withMessage("This is message for line 2.")
55+
* .next().atLine(3).withMessage("This is message for line 3.").withCost(2.)
56+
* .next().atLine(8)
57+
* .noMore();
58+
* </pre>
59+
*/
60+
public static CheckMessagesVerifier issues(JavaScriptCheck check, File file) {
61+
return CheckMessagesVerifier.verify(TreeCheckTest.getIssues(file.getAbsolutePath(), check));
62+
}
5063

64+
/**
65+
* To use this message you should provide a comment on each line of the source file where you expect an issue.
66+
* For example:
67+
* <pre>
68+
* var x = 1; // Noncompliant {{A message for this line.}}
69+
*
70+
* function foo() { // Noncompliant [[effortToFix=2]] [[secondary=+0,+1]] [[sc=5;ec=6;el=+0]]
71+
* }
72+
* </pre>
73+
* How to write these comments:
74+
* <ul>
75+
* <li>Put a comment starting with "Noncompliant" if you expect an issue on this line.</li>
76+
* <li>In double curly braces <code>{{MESSAGE}}</code> provide expected message.</li>
77+
* <li>In double brackets provide expected effort to fix (cost) with <code>effortToFix</code> keyword.</li>
78+
* <li>In double brackets provide precise location description with <code>sc, ec, el</code> keywords respectively for start column, end column and end line.</li>
79+
* <li>In double brackets provide secondary locations with <code>secondary</code> keyword.</li>
80+
* <li>To specify the line you can use relative location by putting <code>+</code> or <code>-</code>.</li>
81+
* <li>All listed elements are optional (except "Noncompliant").</li>
82+
* </ul>
83+
*
84+
* Example of call:
85+
* <pre>
86+
* JavaScriptCheckVerifier.verify(new MyCheck(), myFile));
87+
* </pre>
88+
*/
5189
public static void verify(JavaScriptCheck check, File file) {
5290
JavaScriptCheckVerifier javaScriptCheckVerifier = new JavaScriptCheckVerifier();
5391
JavaScriptVisitorContext context = TestUtils.createContext(file);
@@ -84,22 +122,22 @@ private static void verifyIssue(TestIssue expected, Issue actual) {
84122
throw new AssertionError("Unexpected issue at line " + line(actual) + ": \"" + message(actual) + "\"");
85123
}
86124
if (expected.message() != null) {
87-
Assertions.assertThat(message(actual)).as("Bad message at line " + expected.line()).isEqualTo(expected.message());
125+
assertThat(message(actual)).as("Bad message at line " + expected.line()).isEqualTo(expected.message());
88126
}
89127
if (expected.effortToFix() != null) {
90-
Assertions.assertThat(actual.cost()).as("Bad effortToFix at line " + expected.line()).isEqualTo(expected.effortToFix());
128+
assertThat(actual.cost()).as("Bad effortToFix at line " + expected.line()).isEqualTo(expected.effortToFix());
91129
}
92130
if (expected.startColumn() != null) {
93-
Assertions.assertThat(((PreciseIssue) actual).primaryLocation().startLineOffset() + 1).as("Bad start column at line " + expected.line()).isEqualTo(expected.startColumn());
131+
assertThat(((PreciseIssue) actual).primaryLocation().startLineOffset() + 1).as("Bad start column at line " + expected.line()).isEqualTo(expected.startColumn());
94132
}
95133
if (expected.endColumn() != null) {
96-
Assertions.assertThat(((PreciseIssue) actual).primaryLocation().endLineOffset() + 1).as("Bad end column at line " + expected.line()).isEqualTo(expected.endColumn());
134+
assertThat(((PreciseIssue) actual).primaryLocation().endLineOffset() + 1).as("Bad end column at line " + expected.line()).isEqualTo(expected.endColumn());
97135
}
98136
if (expected.endLine() != null) {
99-
Assertions.assertThat(((PreciseIssue) actual).primaryLocation().endLine()).as("Bad end line at line " + expected.line()).isEqualTo(expected.endLine());
137+
assertThat(((PreciseIssue) actual).primaryLocation().endLine()).as("Bad end line at line " + expected.line()).isEqualTo(expected.endLine());
100138
}
101139
if (expected.secondaryLines() != null) {
102-
Assertions.assertThat(secondary(actual)).as("Bad secondary locations at line " + expected.line()).isEqualTo(expected.secondaryLines());
140+
assertThat(secondary(actual)).as("Bad secondary locations at line " + expected.line()).isEqualTo(expected.secondaryLines());
103141
}
104142
}
105143

@@ -137,7 +175,7 @@ public void visitNode(Tree tree) {
137175
}
138176
}
139177

140-
private void addParams(TestIssue issue, String params) {
178+
private static void addParams(TestIssue issue, String params) {
141179
for (String param : Splitter.on(';').split(params)) {
142180
int equalIndex = param.indexOf("=");
143181
if (equalIndex == -1) {
@@ -159,21 +197,25 @@ private void addParams(TestIssue issue, String params) {
159197
issue.endLine(lineValue(issue.line(), value));
160198

161199
} else if ("secondary".equalsIgnoreCase(name)) {
162-
List<Integer> secondaryLines = new ArrayList<>();
163-
if (!value.equals("")) {
164-
for (String secondary : Splitter.on(',').split(value)) {
165-
secondaryLines.add(lineValue(issue.line(), secondary));
166-
}
167-
}
168-
issue.secondary(secondaryLines);
200+
addSecondaryLines(issue, value);
169201

170202
} else {
171203
throw new IllegalStateException("Invalid param at line 1: " + name);
172204
}
173205
}
174206
}
175207

176-
private int lineValue(int baseLine, String shift) {
208+
private static void addSecondaryLines(TestIssue issue, String value) {
209+
List<Integer> secondaryLines = new ArrayList<>();
210+
if (!"".equals(value)) {
211+
for (String secondary : Splitter.on(',').split(value)) {
212+
secondaryLines.add(lineValue(issue.line(), secondary));
213+
}
214+
}
215+
issue.secondary(secondaryLines);
216+
}
217+
218+
private static int lineValue(int baseLine, String shift) {
177219
if (shift.startsWith("+")) {
178220
return baseLine + Integer.valueOf(shift.substring(1));
179221
}

javascript-checks/src/main/java/org/sonar/javascript/checks/tests/TestIssue.java renamed to javascript-checks-testkit/src/main/java/org/sonar/javascript/checks/verifier/TestIssue.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
* along with this program; if not, write to the Free Software Foundation,
1818
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1919
*/
20-
package org.sonar.javascript.checks.tests;
20+
package org.sonar.javascript.checks.verifier;
2121

2222
import com.google.common.primitives.Ints;
2323
import java.util.List;
2424
import javax.annotation.Nullable;
2525

26-
public class TestIssue {
26+
class TestIssue {
2727

2828
private String message;
2929
private final int line;

javascript-checks/src/main/java/org/sonar/javascript/checks/tests/TestUtils.java renamed to javascript-checks-testkit/src/main/java/org/sonar/javascript/checks/verifier/TestUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* along with this program; if not, write to the Free Software Foundation,
1818
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1919
*/
20-
package org.sonar.javascript.checks.tests;
20+
package org.sonar.javascript.checks.verifier;
2121

2222
import com.google.common.base.Charsets;
2323
import com.sonar.sslr.api.typed.ActionParser;
@@ -31,7 +31,7 @@
3131
import org.sonar.plugins.javascript.api.tree.ScriptTree;
3232
import org.sonar.plugins.javascript.api.tree.Tree;
3333

34-
public class TestUtils {
34+
class TestUtils {
3535

3636
private TestUtils() {
3737
}

javascript-checks/src/main/java/org/sonar/javascript/checks/tests/TreeCheckTest.java renamed to javascript-checks-testkit/src/main/java/org/sonar/javascript/checks/verifier/TreeCheckTest.java

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,37 +17,30 @@
1717
* along with this program; if not, write to the Free Software Foundation,
1818
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1919
*/
20-
package org.sonar.javascript.checks.tests;
20+
package org.sonar.javascript.checks.verifier;
2121

22-
import com.sonar.sslr.api.RecognitionException;
2322
import java.io.File;
2423
import java.util.ArrayList;
2524
import java.util.Collection;
2625
import java.util.List;
2726
import org.sonar.javascript.visitors.JavaScriptVisitorContext;
28-
import org.sonar.javascript.checks.ParsingErrorCheck;
2927
import org.sonar.plugins.javascript.api.JavaScriptCheck;
3028
import org.sonar.plugins.javascript.api.visitors.FileIssue;
3129
import org.sonar.plugins.javascript.api.visitors.Issue;
3230
import org.sonar.plugins.javascript.api.visitors.LineIssue;
3331
import org.sonar.plugins.javascript.api.visitors.PreciseIssue;
3432
import org.sonar.squidbridge.api.CheckMessage;
3533

36-
public class TreeCheckTest {
34+
class TreeCheckTest {
3735

38-
public Collection<CheckMessage> getIssues(String relativePath, JavaScriptCheck check) {
39-
File file = new File(relativePath);
40-
List<Issue> issues = new ArrayList<>();
36+
private TreeCheckTest() {
37+
}
4138

42-
try {
43-
JavaScriptVisitorContext context = TestUtils.createContext(file);
44-
issues = check.scanFile(context);
39+
public static Collection<CheckMessage> getIssues(String relativePath, JavaScriptCheck check) {
40+
File file = new File(relativePath);
4541

46-
} catch (RecognitionException e) {
47-
if (check instanceof ParsingErrorCheck) {
48-
issues.add(new LineIssue(check, e.getLine(), e.getMessage()));
49-
}
50-
}
42+
JavaScriptVisitorContext context = TestUtils.createContext(file);
43+
List<Issue> issues = check.scanFile(context);
5144

5245
return getCheckMessages(issues);
5346
}

javascript-checks/src/test/java/org/sonar/javascript/checks/ParsingErrorCheckTest.java renamed to javascript-checks-testkit/src/main/java/org/sonar/javascript/checks/verifier/package-info.java

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,8 @@
1717
* along with this program; if not, write to the Free Software Foundation,
1818
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1919
*/
20-
package org.sonar.javascript.checks;
21-
22-
import org.junit.Test;
23-
import org.sonar.javascript.checks.tests.TreeCheckTest;
24-
import org.sonar.squidbridge.checks.CheckMessagesVerifier;
25-
26-
import static org.hamcrest.Matchers.containsString;
27-
28-
public class ParsingErrorCheckTest extends TreeCheckTest {
29-
30-
@Test
31-
public void test() {
32-
CheckMessagesVerifier.verify(getIssues("src/test/resources/checks/parsingError.js", new ParsingErrorCheck()))
33-
.next().atLine(3).withMessageThat(containsString("Parse error"))
34-
.noMore();
35-
}
36-
37-
}
20+
/**
21+
* Provides helper classes for coding rules implementation
22+
*/
23+
@javax.annotation.ParametersAreNonnullByDefault
24+
package org.sonar.javascript.checks.verifier;

javascript-checks/src/test/java/org/sonar/javascript/checks/utils/JavaScriptCheckVerifierTest.java renamed to javascript-checks-testkit/src/test/java/org/sonar/javascript/checks/verifier/JavaScriptCheckVerifierTest.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* along with this program; if not, write to the Free Software Foundation,
1818
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1919
*/
20-
package org.sonar.javascript.checks.utils;
20+
package org.sonar.javascript.checks.verifier;
2121

2222
import com.google.common.collect.ImmutableList;
2323
import com.google.common.io.Files;
@@ -33,7 +33,6 @@
3333
import org.junit.Test;
3434
import org.junit.rules.ExpectedException;
3535
import org.junit.rules.TemporaryFolder;
36-
import org.sonar.javascript.checks.tests.TestIssue;
3736
import org.sonar.javascript.tree.impl.JavaScriptTree;
3837
import org.sonar.javascript.tree.impl.lexical.InternalSyntaxToken;
3938
import org.sonar.plugins.javascript.api.JavaScriptCheck;
@@ -314,8 +313,6 @@ private static InternalSyntaxToken createToken(int line, @Nullable Integer colum
314313
int tokenColumn = column == null ? 0 : column - 1;
315314
return new InternalSyntaxToken(line, tokenColumn, tokenValue, ImmutableList.<SyntaxTrivia>of(), 0, false);
316315
}
317-
318-
319316
}
320317

321318
}

javascript-checks/pom.xml

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,36 +17,30 @@
1717
<groupId>${project.groupId}</groupId>
1818
<artifactId>javascript-frontend</artifactId>
1919
</dependency>
20+
2021
<dependency>
21-
<groupId>org.codehaus.sonar</groupId>
22-
<artifactId>sonar-deprecated</artifactId>
22+
<groupId>${project.groupId}</groupId>
23+
<artifactId>javascript-checks-testkit</artifactId>
24+
<scope>test</scope>
2325
</dependency>
2426

2527
<dependency>
26-
<groupId>org.hamcrest</groupId>
27-
<artifactId>hamcrest-all</artifactId>
28-
<scope>test</scope>
28+
<groupId>org.codehaus.sonar</groupId>
29+
<artifactId>sonar-deprecated</artifactId>
2930
</dependency>
31+
3032
<dependency>
3133
<groupId>junit</groupId>
3234
<artifactId>junit</artifactId>
3335
<scope>test</scope>
3436
</dependency>
37+
3538
<dependency>
3639
<groupId>org.easytesting</groupId>
3740
<artifactId>fest-assert</artifactId>
3841
<scope>test</scope>
3942
</dependency>
40-
<dependency>
41-
<groupId>org.mockito</groupId>
42-
<artifactId>mockito-all</artifactId>
43-
<scope>test</scope>
44-
</dependency>
45-
<dependency>
46-
<groupId>ch.qos.logback</groupId>
47-
<artifactId>logback-classic</artifactId>
48-
<scope>test</scope>
49-
</dependency>
43+
5044
</dependencies>
5145

5246
</project>

javascript-checks/src/test/java/org/sonar/javascript/checks/AlertUseCheckTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
import java.io.File;
2323
import org.junit.Test;
24-
import org.sonar.javascript.checks.utils.JavaScriptCheckVerifier;
24+
import org.sonar.javascript.checks.verifier.JavaScriptCheckVerifier;
2525

2626
public class AlertUseCheckTest {
2727

javascript-checks/src/test/java/org/sonar/javascript/checks/AlwaysUseCurlyBracesCheckTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
import java.io.File;
2323
import org.junit.Test;
24-
import org.sonar.javascript.checks.utils.JavaScriptCheckVerifier;
24+
import org.sonar.javascript.checks.verifier.JavaScriptCheckVerifier;
2525

2626
public class AlwaysUseCurlyBracesCheckTest {
2727

0 commit comments

Comments
 (0)