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/InlinePropertiesTest.java
github-classroom[bot] e42e547e48
Initial commit
2023-04-25 11:33:41 +00:00

200 lines
5 KiB
Java

/*
* Copyright 2012 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;
/**
* @author johnlenz@google.com (John Lenz)
*/
public class InlinePropertiesTest extends CompilerTestCase {
private static final String EXTERNS =
"Function.prototype.call=function(){};" +
"Function.prototype.inherits=function(){};" +
"prop.toString;" +
"var google = { gears: { factory: {}, workerPool: {} } };";
public InlinePropertiesTest() {
super(EXTERNS);
enableNormalize();
enableTypeCheck(CheckLevel.WARNING);
enableClosurePass();
}
@Override
protected CompilerPass getProcessor(Compiler compiler) {
return new InlineProperties(compiler);
}
public void testConstInstanceProp1() {
// Replace a reference to known constant property.
test(
"/** @constructor */\n" +
"function C() {\n" +
" this.foo = 1;\n" +
"}\n" +
"new C().foo;",
"function C() {\n" +
" this.foo = 1;\n" +
"}\n" +
"new C(), 1;");
}
public void testConstInstanceProp2() {
// Replace a constant reference
test(
"/** @constructor */\n" +
"function C() {\n" +
" this.foo = 1;\n" +
"}\n" +
"var x = new C();\n" +
"x.foo;",
"function C() {\n" +
" this.foo = 1\n" +
"}\n" +
"var x = new C();\n" +
"1;\n");
}
public void testConstInstanceProp3() {
// Replace a constant reference
test(
"/** @constructor */\n" +
"function C() {\n" +
" this.foo = 1;\n" +
"}\n" +
"/** @type {C} */\n" +
"var x = new C();\n" +
"x.foo;",
"function C() {\n" +
" this.foo = 1\n" +
"}\n" +
"var x = new C();\n" +
"1;\n");
}
public void testConstInstanceProp4() {
// This pass replies on DisambiguateProperties to distinguish like named
// properties so it doesn't handle this case.
testSame(
"/** @constructor */\n" +
"function C() {\n" +
" this.foo = 1;\n" +
"}\n" +
"/** @constructor */\n" +
"function B() {\n" +
" this.foo = 1;\n" +
"}\n" +
"new C().foo;\n");
}
public void testConstClassProps1() {
// For now, don't inline constant class properties,
// CollapseProperties should handle this in most cases.
testSame(
"/** @constructor */\n" +
"function C() {\n" +
"}\n" +
"C.foo = 1;\n" +
"C.foo;");
}
public void testConstClassProps2() {
// Don't confuse, class properties with instance properties
testSame(
"/** @constructor */\n" +
"function C() {\n" +
" this.foo = 1;\n" +
"}\n" +
"C.foo;");
}
public void testConstClassProps3() {
// Don't confuse, class properties with prototype properties
testSame(
"/** @constructor */\n" +
"function C() {}\n" +
"C.prototype.foo = 1;\n" +
"c.foo;\n");
}
public void testNonConstClassProp1() {
testSame(
"/** @constructor */\n" +
"function C() {\n" +
" this.foo = 1;\n" +
"}\n" +
"var x = new C();\n" +
"alert(x.foo);\n" +
"delete x.foo;");
}
public void testNonConstClassProp2() {
testSame(
"/** @constructor */\n" +
"function C() {\n" +
" this.foo = 1;\n" +
"}\n" +
"var x = new C();\n" +
"alert(x.foo);\n" +
"x.foo = 2;");
}
public void testNonConstructorClassProp1() {
testSame(
"function C() {\n" +
" this.foo = 1;\n" +
" return this;\n" +
"}\n" +
"C().foo;");
}
public void testConditionalClassProp1() {
testSame(
"/** @constructor */\n" +
"function C() {\n" +
" if (false) this.foo = 1;\n" +
"}\n" +
"new C().foo;");
}
public void testConstPrototypeProp1() {
test(
"/** @constructor */\n" +
"function C() {}\n" +
"C.prototype.foo = 1;\n" +
"new C().foo;\n",
"function C() {}\n" +
"C.prototype.foo = 1;\n" +
"new C(), 1;\n");
}
public void testConstPrototypeProp2() {
test(
"/** @constructor */\n" +
"function C() {}\n" +
"C.prototype.foo = 1;\n" +
"var x = new C();\n" +
"x.foo;\n",
"function C() {}\n" +
"C.prototype.foo = 1;\n" +
"var x = new C();\n" +
"1;\n");
}
}