Doing an operation on a string without using the result of the operation is useless and is certainly due to a misunderstanding.
++var str = "..." +str.toUpperCase(); // Noncompliant ++
+var str = "..." +str = str.toUpperCase(); ++ diff --git a/javascript-checks/src/test/java/org/sonar/javascript/checks/UselessStringOperationCheckTest.java b/javascript-checks/src/test/java/org/sonar/javascript/checks/UselessStringOperationCheckTest.java new file mode 100644 index 00000000000..7af84bd4d06 --- /dev/null +++ b/javascript-checks/src/test/java/org/sonar/javascript/checks/UselessStringOperationCheckTest.java @@ -0,0 +1,38 @@ +/* + * SonarQube JavaScript Plugin + * Copyright (C) 2011 SonarSource and Eriks Nukis + * sonarqube@googlegroups.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 02 + */ +package org.sonar.javascript.checks; + +import org.junit.Test; +import org.sonar.plugins.javascript.api.tests.TreeCheckTest; +import org.sonar.squidbridge.checks.CheckMessagesVerifier; + +public class UselessStringOperationCheckTest extends TreeCheckTest { + + @Test + public void test() { + UselessStringOperationCheck check = new UselessStringOperationCheck(); + CheckMessagesVerifier.verify(getIssues("src/test/resources/checks/UselessStringOperation.js", check)) + .next().atLine(4).withMessage("str is an immutable object; you must either store or return the result of the operation.") + .next().atLine(5).withMessage("\"abc\" is an immutable object; you must either store or return the result of the operation.") + .next().atLine(6) + .noMore(); + } + +} diff --git a/javascript-checks/src/test/resources/checks/UselessStringOperation.js b/javascript-checks/src/test/resources/checks/UselessStringOperation.js new file mode 100644 index 00000000000..8caac0b7183 --- /dev/null +++ b/javascript-checks/src/test/resources/checks/UselessStringOperation.js @@ -0,0 +1,10 @@ +var var1 = "abc".toUpperCase(); // OK +unknown.toUpperCase(); // OK +var str = "abcd"; +str.toUpperCase(); // NOK +"abc".toUpperCase(); // NOK +str.substring(1,2); // NOK + +var x = "abc"; +x = something(); +x.toUpperCase(); // OK diff --git a/sonar-javascript-plugin/src/test/java/org/sonar/plugins/javascript/JavaScriptProfileTest.java b/sonar-javascript-plugin/src/test/java/org/sonar/plugins/javascript/JavaScriptProfileTest.java index ddb16817cc0..fb949b74108 100644 --- a/sonar-javascript-plugin/src/test/java/org/sonar/plugins/javascript/JavaScriptProfileTest.java +++ b/sonar-javascript-plugin/src/test/java/org/sonar/plugins/javascript/JavaScriptProfileTest.java @@ -46,7 +46,7 @@ public void should_create_sonar_way_profile() { assertThat(profile.getLanguage()).isEqualTo(JavaScriptLanguage.KEY); assertThat(profile.getName()).isEqualTo(CheckList.SONAR_WAY_PROFILE); assertThat(profile.getActiveRulesByRepository(CheckList.REPOSITORY_KEY)) - .hasSize(77); + .hasSize(78); assertThat(validation.hasErrors()).isFalse(); }