/*
* 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 for ExportTestFunctions.
*
*/
public final class ExportTestFunctionsTest extends Es6CompilerTestCase {
private static final String EXTERNS =
"function google_exportSymbol(a, b) {}; function google_exportProperty(a, b, c) {};";
private static final String TEST_FUNCTIONS_WITH_NAMES =
"function Foo(arg) {}; "
+ "function setUp(arg3) {}; "
+ "function tearDown(arg, arg2) {}; "
+ "function testBar(arg) {}; "
+ "function test$(arg) {}; "
+ "function test$foo(arg) {}";
public ExportTestFunctionsTest() {
super(EXTERNS);
}
@Override
public void setUp() {
super.enableLineNumberCheck(false);
}
@Override
protected CompilerPass getProcessor(Compiler compiler) {
return new ExportTestFunctions(compiler, "google_exportSymbol", "google_exportProperty");
}
@Override
protected int getNumRepetitions() {
// This pass only runs once.
return 1;
}
public void testFunctionsAreExported() {
test(
TEST_FUNCTIONS_WITH_NAMES,
"function Foo(arg){}; "
+ "function setUp(arg3){} google_exportSymbol(\"setUp\",setUp);; "
+ "function tearDown(arg,arg2) {} "
+ "google_exportSymbol(\"tearDown\",tearDown);; "
+ "function testBar(arg){} google_exportSymbol(\"testBar\",testBar);; "
+ "function test$(arg){} google_exportSymbol(\"test$\",test$);; "
+ "function test$foo(arg){} google_exportSymbol(\"test$foo\",test$foo)");
}
// Helper functions
public void testBasicTestFunctionsAreExported() {
testSame("function Foo() {function testA(){}}");
test("function setUp() {}", "function setUp(){} google_exportSymbol('setUp',setUp)");
test(
"function setUpPage() {}",
"function setUpPage(){} google_exportSymbol('setUpPage',setUpPage)");
test(
"function shouldRunTests() {}",
"function shouldRunTests(){}" + "google_exportSymbol('shouldRunTests',shouldRunTests)");
test(
"function tearDown() {}", "function tearDown(){} google_exportSymbol('tearDown',tearDown)");
test(
"function tearDownPage() {}",
"function tearDownPage(){} google_exportSymbol('tearDownPage'," + "tearDownPage)");
test(
"function testBar() { function testB() {}}",
"function testBar(){function testB(){}}" + "google_exportSymbol('testBar',testBar)");
testSame("var testCase = {}; testCase.setUpPage = function() {}");
}
/**
* Make sure this works for global functions declared as function expressions:
*
* <pre>
* var testFunctionName = function() {
* // Implementation
* };
* </pre>
*
* This format should be supported in addition to function statements.
*/
public void testFunctionExpressionsAreExported() {
testSame("var Foo = function() {var testA = function() {}}");
test(
"var setUp = function() {}",
"var setUp = function() {}; " + "google_exportSymbol('setUp',setUp)");
test(
"var setUpPage = function() {}",
"var setUpPage = function() {}; " + "google_exportSymbol('setUpPage',setUpPage)");
test(
"var shouldRunTests = function() {}",
"var shouldRunTests = function() {}; "
+ "google_exportSymbol('shouldRunTests',shouldRunTests)");
test(
"var tearDown = function() {}",
"var tearDown = function() {}; " + "google_exportSymbol('tearDown',tearDown)");
test(
"var tearDownPage = function() {}",
"var tearDownPage = function() {}; " + "google_exportSymbol('tearDownPage', tearDownPage)");
test(
"var testBar = function() { var testB = function() {}}",
"var testBar = function(){ var testB = function() {}}; "
+ "google_exportSymbol('testBar',testBar)");
}
public void testFunctionExpressionsByLetAreExported() {
testSameEs6("let Foo = function() {var testA = function() {}}");
testEs6(
"let setUp = function() {}",
"let setUp = function() {}; google_exportSymbol('setUp', setUp)");
testEs6(
"let testBar = function() {}",
"let testBar = function() {}; google_exportSymbol('testBar', testBar)");
testEs6(
"let tearDown = function() {}",
LINE_JOINER.join(
"let tearDown = function() {}; ", "google_exportSymbol('tearDown', tearDown)"));
}
public void testFunctionExpressionsByConstAreExported() {
testSameEs6("const Foo = function() {var testA = function() {}}");
testEs6(
"const setUp = function() {}",
LINE_JOINER.join("const setUp = function() {}; ", "google_exportSymbol('setUp', setUp)"));
testEs6(
"const testBar = function() {}",
LINE_JOINER.join(
"const testBar = function() {}; ", "google_exportSymbol('testBar', testBar)"));
testEs6(
"const tearDown = function() {}",
LINE_JOINER.join(
"const tearDown = function() {}; ", "google_exportSymbol('tearDown', tearDown)"));
}
public void testArrowFunctionExpressionsAreExported() {
testSameEs6("var Foo = ()=>{var testA = function() {}}");
testEs6(
"var setUp = ()=>{}",
LINE_JOINER.join("var setUp = ()=>{}; ", "google_exportSymbol('setUp', setUp)"));
testEs6(
"var testBar = ()=>{}",
LINE_JOINER.join("var testBar = ()=>{}; ", "google_exportSymbol('testBar', testBar)"));
testEs6(
"var tearDown = ()=>{}",
LINE_JOINER.join("var tearDown = ()=>{}; ", "google_exportSymbol('tearDown', tearDown)"));
}
public void testFunctionAssignmentsAreExported() {
testSame("Foo = {}; Foo.prototype.bar = function() {};");
test(
"Foo = {}; Foo.prototype.setUpPage = function() {};",
"Foo = {}; Foo.prototype.setUpPage = function() {};"
+ "google_exportProperty(Foo.prototype, 'setUpPage', "
+ "Foo.prototype.setUpPage);");
test(
"Foo = {}; Foo.prototype.shouldRunTests = function() {};",
"Foo = {}; Foo.prototype.shouldRunTests = function() {};"
+ "google_exportProperty(Foo.prototype, 'shouldRunTests', "
+ "Foo.prototype.shouldRunTests);");
test(
"Foo = {}; Foo.prototype.testBar = function() {};",
"Foo = {}; Foo.prototype.testBar = function() {};"
+ "google_exportProperty(Foo.prototype, 'testBar', "
+ "Foo.prototype.testBar);");
test(
"window.testBar = function() {};",
"window.testBar = function() {};"
+ "google_exportProperty(window, 'testBar', "
+ "window.testBar);");
test(
"Foo = {}; Foo.prototype.testBar = function() " + "{ var testBaz = function() {}};",
"Foo = {}; Foo.prototype.testBar = function() "
+ "{ var testBaz = function() {}};"
+ "google_exportProperty(Foo.prototype, 'testBar', "
+ "Foo.prototype.testBar);");
test(
"Foo = {}; Foo.baz.prototype.testBar = function() " + "{ var testBaz = function() {}};",
"Foo = {}; Foo.baz.prototype.testBar = function() "
+ "{ var testBaz = function() {}};"
+ "google_exportProperty(Foo.baz.prototype, 'testBar', "
+ "Foo.baz.prototype.testBar);");
}
public void testExportTestSuite() {
testSame("goog.testing.testSuite({'a': function() {}, 'b': function() {}});");
test(
"goog.testing.testSuite({a: function() {}, b: function() {}});",
"goog.testing.testSuite({'a': function() {}, 'b': function() {}});");
}
public void testMemberDefInObjLit() {
testEs6(
"goog.testing.testSuite({a() {}, b() {}});",
"goog.testing.testSuite({'a': function() {}, 'b': function() {}});");
}
public void testEs6Class_testMethod() {
testEs6(
"class MyTest {testFoo() {}} goog.testing.testSuite(new MyTest());",
"class MyTest {testFoo() {}} "
+ "google_exportProperty(MyTest.prototype, 'testFoo', MyTest.prototype.testFoo); "
+ "goog.testing.testSuite(new MyTest());");
}
public void testEs6Class_lifeCycleMethods() {
testEs6(
"class MyTest {"
+ "testFoo(){} setUp(){} tearDown(){} setUpPage(){} tearDownPage(){} notExported(){}"
+ "}"
+ "goog.testing.testSuite(new MyTest());",
"class MyTest {"
+ "testFoo(){} setUp(){} tearDown(){} setUpPage(){} tearDownPage(){} notExported(){}"
+ "}"
+ "google_exportProperty(MyTest.prototype, 'tearDownPage', "
+ "MyTest.prototype.tearDownPage);"
+ "google_exportProperty(MyTest.prototype, 'setUpPage', MyTest.prototype.setUpPage);"
+ "google_exportProperty(MyTest.prototype, 'tearDown', MyTest.prototype.tearDown);"
+ "google_exportProperty(MyTest.prototype, 'setUp', MyTest.prototype.setUp);"
+ "google_exportProperty(MyTest.prototype, 'testFoo', MyTest.prototype.testFoo);"
+ "goog.testing.testSuite(new MyTest());");
}
}