/*
* Copyright 2009 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 OptimizeReturns
* @author johnlenz@google.com (John Lenz)
*/
public final class OptimizeReturnsTest extends CompilerTestCase {
@Override
protected CompilerPass getProcessor(Compiler compiler) {
return new OptimizeReturns(compiler);
}
private static final String EXTERNAL_SYMBOLS =
"var extern;extern.externalMethod";
public OptimizeReturnsTest() {
super(EXTERNAL_SYMBOLS);
}
@Override
protected int getNumRepetitions() {
// run pass once.
return 1;
}
@Override
protected void setUp() throws Exception {
super.setUp();
disableTypeCheck();
}
/**
* Combine source strings using '\n' as the separator.
*/
private static String newlineJoin(String ... parts) {
return LINE_JOINER.join(parts);
}
public void testNoRewriteUsedResult1() throws Exception {
String source = newlineJoin(
"function a(){return 1}",
"var x = a()");
testSame(source);
}
public void testNoRewriteUsedResult2() throws Exception {
String source = newlineJoin(
"var a = function(){return 1}",
"a(); var b = a()");
testSame(source);
}
public void testRewriteUnusedResult1() throws Exception {
String source = newlineJoin(
"function a(){return 1}",
"a()");
String expected = newlineJoin(
"function a(){return}",
"a()");
test(source, expected);
}
public void testRewriteUnusedResult2() throws Exception {
String source = newlineJoin(
"var a; a = function(){return 1}",
"a()");
String expected = newlineJoin(
"var a; a = function(){return}",
"a()");
test(source, expected);
}
public void testRewriteUnusedResult3() throws Exception {
String source = newlineJoin(
"var a = function(){return 1}",
"a()");
String expected = newlineJoin(
"var a = function(){return}",
"a()");
test(source, expected);
}
public void testRewriteUnusedResult4a() throws Exception {
String source = newlineJoin(
"var a = function(){return a()}",
"a()");
testSame(source);
}
public void testRewriteUnusedResult4b() throws Exception {
String source = newlineJoin(
"var a = function b(){return b()}",
"a()");
testSame(source);
}
public void testRewriteUnusedResult4c() throws Exception {
String source = newlineJoin(
"function a(){return a()}",
"a()");
testSame(source);
}
public void testRewriteUnusedResult5() throws Exception {
String source = newlineJoin(
"function a(){}",
"a.prototype.foo = function(args) {return args};",
"var o = new a;",
"o.foo()");
String expected = newlineJoin(
"function a(){}",
"a.prototype.foo = function(args) {return};",
"var o = new a;",
"o.foo()");
test(source, expected);
}
public void testRewriteUnusedResult6() throws Exception {
String source = newlineJoin(
"function a(){return (g = 1)}",
"a()");
String expected = newlineJoin(
"function a(){g = 1;return}",
"a()");
test(source, expected);
}
public void testRewriteUnusedResult7a() throws Exception {
String source = newlineJoin(
"function a() { return 1 }",
"function b() { return a() }",
"function c() { return b() }",
"c();");
String expected = newlineJoin(
"function a() { return 1 }",
"function b() { return a() }",
"function c() { b(); return }",
"c();");
test(source, expected);
}
public void testRewriteUnusedResult7b() throws Exception {
String source = newlineJoin(
"c();",
"function c() { return b() }",
"function b() { return a() }",
"function a() { return 1 }");
// Iteration 1.
String expected = newlineJoin(
"c();",
"function c() { b(); return }",
"function b() { return a() }",
"function a() { return 1 }");
test(source, expected);
// Iteration 2.
source = expected;
expected = newlineJoin(
"c();",
"function c() { b(); return }",
"function b() { a(); return }",
"function a() { return 1 }");
test(source, expected);
// Iteration 3.
source = expected;
expected = newlineJoin(
"c();",
"function c() { b(); return }",
"function b() { a(); return }",
"function a() { return }");
test(source, expected);
}
public void testRewriteUnusedResult8() throws Exception {
String source = newlineJoin(
"function a() { return c() }",
"function b() { return a() }",
"function c() { return b() }",
"c();");
testSame(source);
}
public void testNoRewriteObjLit1() throws Exception {
String source = newlineJoin(
"var a = {b:function(){return 1;}}",
"for(c in a) (a[c])();",
"a.b()");
testSame(source);
}
public void testNoRewriteObjLit2() throws Exception {
String source = newlineJoin(
"var a = {b:function fn(){return 1;}}",
"for(c in a) (a[c])();",
"a.b()");
testSame(source);
}
public void testNoRewriteArrLit() throws Exception {
String source = newlineJoin(
"var a = [function(){return 1;}]",
"(a[0])();");
testSame(source);
}
public void testPrototypeMethod1() throws Exception {
String source = newlineJoin(
"function c(){}",
"c.prototype.a = function(){return 1}",
"var x = new c;",
"x.a()");
String result = newlineJoin(
"function c(){}",
"c.prototype.a = function(){return}",
"var x = new c;",
"x.a()");
test(source, result);
}
public void testPrototypeMethod2() throws Exception {
String source = newlineJoin(
"function c(){}",
"c.prototype.a = function(){return 1}",
"goog.reflect.object({a: 'v'})",
"var x = new c;",
"x.a()");
testSame(source);
}
public void testPrototypeMethod3() throws Exception {
String source = newlineJoin(
"function c(){}",
"c.prototype.a = function(){return 1}",
"var x = new c;",
"for(var key in goog.reflect.object({a: 'v'})){ x[key](); }",
"x.a()");
testSame(source);
}
public void testPrototypeMethod4() throws Exception {
String source = newlineJoin(
"function c(){}",
"c.prototype.a = function(){return 1}",
"var x = new c;",
"for(var key in goog.reflect.object({a: 'v'})){ x[key](); }");
testSame(source);
}
public void testCallOrApply() throws Exception {
// TODO(johnlenz): Add support for .call and .apply
testSame("function a() {return 1}; a.call(new foo);");
testSame("function a() {return 1}; a.apply(new foo);");
}
public void testRewriteUseSiteRemoval() throws Exception {
String source = newlineJoin(
"function a() { return {\"_id\" : 1} }",
"a();");
String expected = newlineJoin(
"function a() { return }",
"a();");
test(source, expected);
}
}