This repository has been archived on 2023-06-18. You can view files and clone it, but cannot push or open issues or pull requests.
ima02/resources/defects4j-checkout-closure-1f/test/com/google/javascript/jscomp/ExpandJqueryAliasesTest.java
github-classroom[bot] e42e547e48
Initial commit
2023-04-25 11:33:41 +00:00

170 lines
6.9 KiB
Java

/*
* Copyright 2011 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 ExpandJqueryAliases}
*/
public class ExpandJqueryAliasesTest extends CompilerTestCase {
private JqueryCodingConvention conv = new JqueryCodingConvention();
final DiagnosticType NAME_ERROR =
ExpandJqueryAliases.JQUERY_UNABLE_TO_EXPAND_INVALID_NAME_ERROR;
final DiagnosticType INVALID_LIT_ERROR =
ExpandJqueryAliases.JQUERY_UNABLE_TO_EXPAND_INVALID_LIT_ERROR;
final DiagnosticType USELESS_EACH_ERROR =
ExpandJqueryAliases.JQUERY_USELESS_EACH_EXPANSION;
public ExpandJqueryAliasesTest() {}
@Override
protected CompilerPass getProcessor(Compiler compiler) {
compiler.options.setCodingConvention(conv);
return new ExpandJqueryAliases(compiler);
}
public void testJqueryFnAliasExpansion() {
String setupCode = "var jQuery={};jQuery.fn=jQuery.prototype;";
testSame(setupCode);
test(setupCode + "jQuery.fn.foo='bar';",
setupCode + "jQuery.prototype.foo='bar';");
test(setupCode + "jQuerySub.fn.foo='bar';",
setupCode + "jQuerySub.prototype.foo='bar';");
}
public void testJqueryExtendExpansion() {
String setupCode = "var jQuery={},obj2={};";
// test for extend call that should not be expanded - no arguments
testSame(setupCode + "jQuery.extend()");
// test for extend call that should not be expanded - empty argument
// this statement has no effect in actual code
testSame(setupCode + "jQuery.extend({})");
// test single argument call - should assign to the jQuery namespace
test(setupCode + "jQuery.extend({a:'test'})",
setupCode + "{jQuery.a = 'test';}");
// test expansion when extending the jQuery prototype
test(setupCode + "jQuery.fn=jQuery.prototype;" +
"jQuery.fn.extend({a:'test', b:'test2'});",
setupCode + "jQuery.fn=jQuery.prototype;" +
"{jQuery.prototype.a = 'test'; jQuery.prototype.b = 'test2';}");
// Expand the extension of obj2
test(setupCode + "jQuery.extend(obj2, {a:'test', b:'test2'});",
setupCode + "{obj2=obj2||{}; obj2.a='test'; obj2.b='test2';}");
// Expand the jQuery namespace - 2 argument call
// Must ensure that the first argument is defined
test(setupCode + "jQuery.extend(jQuery,{a:'test', b:'test2'});",
setupCode + "{jQuery = jQuery || {}; jQuery.a = 'test';" +
"jQuery.b = 'test2';}");
// Test extend call where first argument includes a method call
testSame(setupCode+"obj2.meth=function() { return { a:{} }; };" +
"jQuery.extend(obj2.meth().a, {a: 'test'});");
}
public void testJqueryExpandedEachExpansion() {
String setupCode = "var jQuery={};" +
"jQuery.expandedEach=function(vals, callback){};";
testSame(setupCode);
// Test expansion with object literal
test(setupCode + "jQuery.expandedEach({'a': 1, 'b': 2, 'c': 8}," +
"function(key, val) { var a = key; jQuery[key] = val; });",
setupCode + "(function(){ var a = 'a'; jQuery.a = 1 })();" +
"(function(){ var a = 'b'; jQuery.b = 2 })();" +
"(function(){ var a = 'c'; jQuery.c = 8 })();");
// Test expansion with array literal
// For array literals, the key parameter will be the element index number
// and the value parameter will be the string literal. In this case, the
// string literal value should become a property name.
test(setupCode + "jQuery.expandedEach(['a', 'b', 'c']," +
"function(key, val){ jQuery[val] = key; });",
setupCode + "(function(){ jQuery.a = 0; })();" +
"(function(){ jQuery.b = 1; })();" +
"(function(){ jQuery.c = 2 })();");
// Test expansion with object literal using 'this' keyword
test(setupCode + "jQuery.expandedEach({'a': 1, 'b': 2, 'c': 8}," +
"function(key, val) { var a = key; jQuery[key] = this; });",
setupCode + "(function(){ var a = 'a'; jQuery.a = 1 })();" +
"(function(){ var a = 'b'; jQuery.b = 2 })();" +
"(function(){ var a = 'c'; jQuery.c = 8 })();");
// Test expansion with array literal using 'this' keyword
test(setupCode + "jQuery.expandedEach(['a', 'b', 'c']," +
"function(key, val){ jQuery[this] = key; });",
setupCode + "(function(){ jQuery.a = 0; })();" +
"(function(){ jQuery.b = 1; })();" +
"(function(){ jQuery.c = 2 })();");
// test nested function using argument name to shadow callback name
test(setupCode + "jQuery.expandedEach(['a'], function(key,val) {" +
"jQuery[val] = key; (function(key) { jQuery[key] = 1;})('test'); })",
setupCode + "(function(){ jQuery.a = 0;" +
"(function(key){ jQuery[key] = 1})('test') })()");
// test nested function using var name to shadow callback name
test(setupCode + "jQuery.expandedEach(['a'], function(key,val) {" +
"jQuery[val] = key; (function(key) { var val = 2;" +
"jQuery[key] = val;})('test');})",
setupCode + "(function(){" +
"jQuery.a=0;" +
"(function(key){var val = 2; jQuery[key] = val;})('test')})()");
// test nested function using function name to shadow callback name
test(setupCode + "jQuery.expandedEach(['a'], function(key,val) {" +
"jQuery[val] = key; (function(key1) {" +
"function key() {}; key();" +
"})('test');})",
setupCode + "(function(){" +
"jQuery.a=0;(function(key1) {" +
"function key() {}; key(); })('test')})()");
// test using return val
test(setupCode + "alert(jQuery.expandedEach(['a']," +
"function(key,val) { jQuery[val] = key;})[0])",
setupCode + "alert((function(){" +
"(function(){ jQuery.a = 0;})(); return ['a']})()[0]);");
// Loop object is a variable. Test that warning is raised.
testSame(setupCode + "var a = ['a'];" +
"jQuery.expandedEach(a, function(key,val){ jQuery[key]=val; })",
INVALID_LIT_ERROR);
// Invalid property name. Test that warning is raised.
testSame(setupCode + "var obj2={};" +
"jQuery.expandedEach(['foo','bar'], function(i, name) {" +
"obj2[ '[object ' + name + ']' ] = 'a';});", NAME_ERROR, true);
// Useless expansion (key not used). Test that warning is raised.
testSame(setupCode + "var obj2={};" +
"jQuery.expandedEach(['foo','bar'], function(i, name) {" +
"obj2[i] = 1;});", USELESS_EACH_ERROR, false);
}
}