Add tests

This commit is contained in:
Clément Fournier
2020-04-16 17:56:11 +02:00
parent 04b5372f23
commit c7172fe78f
3 changed files with 102 additions and 8 deletions

View File

@ -72,7 +72,6 @@ import net.sourceforge.pmd.lang.ast.SourceCodePositioner;
public final class EcmascriptTreeBuilder implements NodeVisitor {
private static final Map<Class<? extends AstNode>, Constructor<? extends EcmascriptNode<?>>> NODE_TYPE_TO_NODE_ADAPTER_TYPE = new HashMap<>();
private static String trailingCommaLocalizedMessage = null;
static {
register(ArrayComprehension.class, ASTArrayComprehension.class);
@ -222,14 +221,12 @@ public final class EcmascriptTreeBuilder implements NodeVisitor {
TrailingCommaNode trailingCommaNode = (TrailingCommaNode) node;
int nodeStart = node.getNode().getAbsolutePosition();
int nodeEnd = nodeStart + node.getNode().getLength() - 1;
for (ParseProblem parseProblem : parseProblems) {
if (trailingCommaLocalizedMessage == null) {
// This will fetch the localized message, at most once, and only if there are
// some problems (so we avoid parsing the message bundle for nothing)
// See https://github.com/pmd/pmd/issues/384
trailingCommaLocalizedMessage = ScriptRuntime.getMessage0("msg.extra.trailing.comma");
}
// This will fetch the localized message
// See https://github.com/pmd/pmd/issues/384
String trailingCommaLocalizedMessage = ScriptRuntime.getMessage0("msg.extra.trailing.comma");
for (ParseProblem parseProblem : parseProblems) {
// The node overlaps the comma (i.e. end of the problem)?
int problemStart = parseProblem.getFileOffset();

View File

@ -0,0 +1,56 @@
/*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.ecmascript.ast;
import java.util.Locale;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
/**
* A JUnit rule to change the system locale during a test.
*/
public class DefaultLocale implements TestRule {
private boolean statementIsExecuting = false;
private Locale loc = Locale.getDefault();
/** Set the locale value (overwrites previously set value). */
public void set(Locale locale) {
if (statementIsExecuting) {
Locale.setDefault(locale);
} else {
this.loc = locale;
}
}
@Override
public Statement apply(Statement base, Description description) {
return new EnvironmentVariablesStatement(base);
}
private class EnvironmentVariablesStatement extends Statement {
final Statement baseStatement;
EnvironmentVariablesStatement(Statement baseStatement) {
this.baseStatement = baseStatement;
}
@Override
public void evaluate() throws Throwable {
Locale prev = Locale.getDefault();
statementIsExecuting = true;
try {
Locale.setDefault(loc);
baseStatement.evaluate();
} finally {
statementIsExecuting = false;
Locale.setDefault(prev);
}
}
}
}

View File

@ -0,0 +1,41 @@
/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.ecmascript.ast;
import java.util.Locale;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
public class TrailingCommaTest extends EcmascriptParserTestBase {
@Rule
public DefaultLocale defaultLocale = new DefaultLocale();
@Test
public void testTrailingComma_DefaultLocale() {
testTrailingComma();
}
@Test
public void testTrailingComma_FrFr() {
defaultLocale.set(Locale.FRANCE);
testTrailingComma();
}
@Test
public void testTrailingComma_RootLocale() {
defaultLocale.set(Locale.ROOT);
testTrailingComma();
}
public void testTrailingComma() {
ASTAstRoot node = js.parse("x = {a : 1, };\n");
ASTObjectLiteral fn = node.getFirstDescendantOfType(ASTObjectLiteral.class);
Assert.assertTrue(fn.isTrailingComma());
}
}