/*
* Copyright 2013 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;
/**
* Tests for {@link ConstParamCheck}.
*/
public final class ConstParamCheckTest extends CompilerTestCase {
static final String CLOSURE_DEFS = ""
+ "var goog = {};"
+ "goog.string = {};"
+ "goog.string.Const = {};"
+ "goog.string.Const.from = function(x) {};";
public ConstParamCheckTest() {
enableInferConsts(true);
enableNormalize();
}
@Override
protected CompilerPass getProcessor(Compiler compiler) {
return new ConstParamCheck(compiler);
}
@Override
protected int getNumRepetitions() {
return 1;
}
// Tests for string literal arguments.
public void testStringLiteralArgument() {
testSame(CLOSURE_DEFS
+ "goog.string.Const.from('foo');");
}
public void testConcatenatedStringLiteralArgument() {
testSame(CLOSURE_DEFS
+ "goog.string.Const.from('foo' + 'bar' + 'baz');");
}
public void testNotStringLiteralArgument1() {
testError(CLOSURE_DEFS
+ "goog.string.Const.from(null);",
ConstParamCheck.CONST_NOT_STRING_LITERAL_ERROR);
}
public void testNotStringLiteralArgument2() {
testError(CLOSURE_DEFS
+ "var myFunction = function() {};"
+ "goog.string.Const.from(myFunction());",
ConstParamCheck.CONST_NOT_STRING_LITERAL_ERROR);
}
public void testNotStringLiteralArgument3() {
testError(CLOSURE_DEFS
+ "var myFunction = function() {};"
+ "goog.string.Const.from('foo' + myFunction() + 'bar');",
ConstParamCheck.CONST_NOT_STRING_LITERAL_ERROR);
}
public void testNotStringLiteralArgumentAliased() {
testError(CLOSURE_DEFS
+ "var myFunction = function() {};"
+ "var mkConst = goog.string.Const.from;"
+ "mkConst(myFunction());",
ConstParamCheck.CONST_NOT_STRING_LITERAL_ERROR);
}
public void testNotStringLiteralArgumentAliasedAfterCollapse() {
testError(
CLOSURE_DEFS
+ "var myFunction = function() {};"
+ "var mkConst = goog$string$Const$from;"
+ "mkConst(myFunction());",
ConstParamCheck.CONST_NOT_STRING_LITERAL_ERROR);
}
public void testNotStringLiteralArgumentOnCollapsedProperties() {
testError("goog$string$Const$from(null);", ConstParamCheck.CONST_NOT_STRING_LITERAL_ERROR);
}
// Tests for string literal constant arguments.
public void testStringLiteralConstantArgument() {
testSame(CLOSURE_DEFS
+ "var FOO = 'foo';"
+ "goog.string.Const.from(FOO);");
}
public void testStringLiteralAnnotatedConstantArgument() {
testSame(CLOSURE_DEFS
+ "/** @const */ var foo = 'foo';"
+ "goog.string.Const.from(foo);");
}
public void testStringLiteralConstantArgumentOrder() {
testSame(CLOSURE_DEFS
+ "var myFun = function() { goog.string.Const.from(FOO); };"
+ "var FOO = 'asdf';"
+ "myFun();");
}
public void testConcatenatedStringLiteralConstantArgument() {
testSame(CLOSURE_DEFS
+ "var FOO = 'foo' + 'bar' + 'baz';"
+ "goog.string.Const.from(FOO);");
}
public void testNotConstantArgument() {
testError(
CLOSURE_DEFS + "var foo = window.location.href;" + "goog.string.Const.from(foo);",
ConstParamCheck.CONST_NOT_ASSIGNED_STRING_LITERAL_ERROR);
}
public void testNotStringLiteralConstantArgument1() {
testError(CLOSURE_DEFS
+ "var FOO = null;"
+ "goog.string.Const.from(FOO);",
ConstParamCheck.CONST_NOT_ASSIGNED_STRING_LITERAL_ERROR);
}
public void testNotStringLiteralConstantArgument2() {
testError(CLOSURE_DEFS
+ "var myFunction = function() {};"
+ "var FOO = myFunction();"
+ "goog.string.Const.from(FOO);",
ConstParamCheck.CONST_NOT_ASSIGNED_STRING_LITERAL_ERROR);
}
public void testNotStringLiteralConstantArgument3() {
testError(
CLOSURE_DEFS + "goog.myFunc = function(param) { goog.string.Const.from(param) };",
ConstParamCheck.CONST_NOT_ASSIGNED_STRING_LITERAL_ERROR);
}
}