/*
* Copyright 2010 The Closure Compiler Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.javascript.jscomp;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import java.util.Arrays;
import java.util.List;
import junit.framework.TestCase;
/**
* Tests for error message filtering.
* @author nicksantos@google.com (Nick Santos)
*/
public final class RhinoErrorReporterTest extends TestCase {
private boolean reportEs3Props;
private boolean reportLintWarnings;
@Override
protected void setUp() throws Exception {
reportEs3Props = true;
reportLintWarnings = true;
super.setUp();
}
public void testTrailingComma() throws Exception {
String message =
"Parse error. IE8 (and below) will parse trailing commas in " +
"array and object literals incorrectly. " +
"If you are targeting newer versions of JS, " +
"set the appropriate language_in option.";
assertError(
"var x = [1,];",
RhinoErrorReporter.TRAILING_COMMA,
message);
JSError error = assertError(
"var x = {\n" +
" 1: 2,\n" +
"};",
RhinoErrorReporter.TRAILING_COMMA,
message);
assertEquals(2, error.getLineNumber());
assertEquals(8, error.getCharno());
}
public void testInvalidEs3Prop() throws Exception {
reportEs3Props = false;
assertNoWarningOrError("var x = y.function;");
reportEs3Props = true;
String message =
"Keywords and reserved words are not allowed as unquoted property " +
"names in older versions of JavaScript. " +
"If you are targeting newer versions of JavaScript, " +
"set the appropriate language_in option.";
JSError error = assertWarning(
"var x = y.function;",
RhinoErrorReporter.INVALID_ES3_PROP_NAME,
message);
assertEquals(1, error.getLineNumber());
assertEquals(10, error.getCharno());
}
public void testMissingTypeWarnings() throws Exception {
reportLintWarnings = false;
assertNoWarningOrError("/** @return */ function f() {}");
reportLintWarnings = true;
String message =
"Missing type declaration.";
JSError error = assertWarning(
"/** @return */ function f() {}",
RhinoErrorReporter.JSDOC_MISSING_TYPE_WARNING,
message);
assertEquals(1, error.getLineNumber());
assertEquals(4, error.getCharno());
}
public void testMissingCurlyBraceWarning() {
reportLintWarnings = false;
assertNoWarningOrError("/** @type string */ var x;");
reportLintWarnings = true;
assertWarning(
"/** @type string */ var x;",
RhinoErrorReporter.JSDOC_MISSING_BRACES_WARNING,
"Bad type annotation. Type annotations should have curly braces. See"
+ " https://github.com/google/closure-compiler/wiki/Bad-Type-Annotation"
+ " for more information.");
}
/**
* Verifies that the compiler emits an error for the given code.
*/
private void assertNoWarningOrError(String code) {
Compiler compiler = parseCode(code);
assertEquals("Expected error", 0, compiler.getErrorCount());
assertEquals("Expected warning", 0, compiler.getErrorCount());
}
/**
* Verifies that the compiler emits an error for the given code.
*/
private JSError assertError(
String code, DiagnosticType type, String description) {
Compiler compiler = parseCode(code);
assertEquals("Expected error", 1, compiler.getErrorCount());
JSError error =
Iterables.getOnlyElement(Arrays.asList(compiler.getErrors()));
assertEquals(type, error.getType());
assertEquals(description, error.description);
return error;
}
/**
* Verifies that the compiler emits an error for the given code.
*/
private JSError assertWarning(
String code, DiagnosticType type, String description) {
Compiler compiler = parseCode(code);
assertEquals("Expected warning", 1, compiler.getWarningCount());
JSError error =
Iterables.getOnlyElement(Arrays.asList(compiler.getWarnings()));
assertEquals(type, error.getType());
assertEquals(description, error.description);
return error;
}
private Compiler parseCode(String code) {
Compiler compiler = new Compiler();
CompilerOptions options = new CompilerOptions();
if (!reportEs3Props) {
options.setWarningLevel(
DiagnosticGroups.ES3,
CheckLevel.OFF);
}
if (!reportLintWarnings) {
options.setWarningLevel(
DiagnosticGroups.LINT_CHECKS,
CheckLevel.OFF);
} else {
options.setWarningLevel(
DiagnosticGroups.LINT_CHECKS,
CheckLevel.WARNING);
}
List<SourceFile> externs = ImmutableList.of();
List<SourceFile> inputs = ImmutableList.of(
SourceFile.fromCode("input", code));
compiler.init(externs, inputs, options);
compiler.parseInputs();
return compiler;
}
}