/* * Copyright 2008 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.ImmutableMap; /** * Test cases for {@link NameAnonymousFunctionsMapped}. * */ public class NameAnonymousFunctionsMappedTest extends CompilerTestCase { private static final String EXTERNS = "var document;"; private NameAnonymousFunctionsMapped pass; private VariableMap previous; public NameAnonymousFunctionsMappedTest() { super(EXTERNS); } @Override protected int getNumRepetitions() { return 1; } @Override protected void setUp() throws Exception { super.setUp(); previous = null; } @Override public CompilerPass getProcessor(Compiler compiler) { return pass = new NameAnonymousFunctionsMapped(compiler, previous); } private void assertMapping(String... pairs) { VariableMap functionMap = pass.getFunctionMap(); assertTrue(pairs.length % 2 == 0); for (int i = 0; i < pairs.length; i += 2) { String s = functionMap.lookupSourceName(pairs[i]); assertEquals(pairs[i + 1], s); } assertEquals(pairs.length / 2, functionMap.getNewNameToOriginalNameMap().size()); } public void testSimpleVarAssignment1() { test("var a = function() { return 1; }", "var a = function $() { return 1; }"); assertMapping("$", "a"); } public void testSimpleVarAssignment2() { previous = VariableMap.fromMap(ImmutableMap.of( "a", "previous")); test("var a = function() { return 1; }", "var a = function previous() { return 1; }"); assertMapping("previous", "a"); } public void testSimpleVarAssignment3() { previous = VariableMap.fromMap(ImmutableMap.of( "unused", "$")); test("var fn = function() { return 1; }", "var fn = function $a() { return 1; }"); assertMapping("$a", "fn"); } public void testAssignmentToProperty() { test("var a = {}; a.b = function() { return 1; }", "var a = {}; a.b = function $() { return 1; }"); assertMapping("$", "a.b"); } public void testAssignmentToPrototype() { test("function a() {} a.prototype.b = function() { return 1; };", "function a() {} " + "a.prototype.b = function $() { return 1; };"); assertMapping("$", "a.prototype.b"); } public void testAssignmentToPrototype2() { test("var a = {}; " + "a.b = function() {}; " + "a.b.prototype.c = function() { return 1; };", "var a = {}; " + "a.b = function $() {}; " + "a.b.prototype.c = function $a() { return 1; };"); assertMapping("$", "a.b", "$a", "a.b.prototype.c"); } public void testAssignmentToPrototype3() { test("function a() {} a.prototype['XXX'] = function() { return 1; };", "function a() {} " + "a.prototype['XXX'] = function $() { return 1; };"); assertMapping("$", "a.prototype[\"XXX\"]"); test("function a() {} a.prototype['\\n'] = function() { return 1; };", "function a() {} " + "a.prototype['\\n'] = function $() { return 1; };"); assertMapping("$", "a.prototype[\"\\n\"]"); } public void testAssignmentToPrototype4() { test("var Y = 1; function a() {} " + "a.prototype[Y] = function() { return 1; };", "var Y = 1; function a() {} " + "a.prototype[Y] = function $() { return 1; };"); assertMapping("$", "a.prototype[Y]"); } public void testAssignmentToPrototype5() { test("function a() {} a['prototype'].b = function() { return 1; };", "function a() {} " + "a['prototype'].b = function $() { return 1; };"); assertMapping("$", "a[\"prototype\"].b"); } public void testPrototypeInitializer() { test("function a(){} a.prototype = {b: function() { return 1; }};", "function a(){} " + "a.prototype = {b: function $() { return 1; }};"); assertMapping("$", "a.prototype.b"); } public void testAssignmentToPropertyOfCallReturnValue() { test("document.getElementById('x').onClick = function() {};", "document.getElementById('x').onClick = " + "function $() {};"); assertMapping("$", "document.getElementById(\"x\").onClick"); } public void testAssignmentToPropertyOfArrayElement() { test("var a = {}; a.b = [{}]; a.b[0].c = function() {};", "var a = {}; a.b = [{}]; a.b[0].c = function $() {};"); assertMapping("$", "a.b[0].c"); test("var a = {b: {'c': {}}}; a.b['c'].d = function() {};", "var a = {b: {'c': {}}}; a.b['c'].d = function $() {};"); assertMapping("$", "a.b[\"c\"].d"); test("var a = {b: {'c': {}}}; a.b[x()].d = function() {};", "var a = {b: {'c': {}}}; a.b[x()].d = function $() {};"); assertMapping("$", "a.b[x()].d"); } public void testAssignmentToGetElem() { test("function f() { win['x' + this.id] = function(a){}; }", "function f() { win['x' + this.id] = function $(a){}; }"); // TODO - could probably do a better job encoding these assertMapping("$", "win[\"x\"+this.id]"); } public void testGetElemWithDashes() { test("var foo = {}; foo['-'] = function() {};", "var foo = {}; foo['-'] = function $() {};"); assertMapping("$", "foo[\"-\"]"); } public void testDuplicateNames() { test("var a = function() { return 1; };a = function() { return 2; }", "var a = function $() { return 1; };a = function $() { return 2; }"); assertMapping("$", "a"); } }