From dc8db265b00c68a19808d33ade43d6fdc7637c19 Mon Sep 17 00:00:00 2001 From: tbreisacher Date: Thu, 15 Mar 2018 13:09:26 -0700 Subject: [PATCH] Add more tests of ES2015+ features in externs ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=189233382 --- .../javascript/jscomp/CompilerTestCase.java | 4 +- .../javascript/jscomp/IntegrationTest.java | 53 +++++++++++++++++-- .../jscomp/IntegrationTestCase.java | 37 ++++++++++++- 3 files changed, 88 insertions(+), 6 deletions(-) diff --git a/test/com/google/javascript/jscomp/CompilerTestCase.java b/test/com/google/javascript/jscomp/CompilerTestCase.java index eb37db50eba..3d40b2a39a2 100644 --- a/test/com/google/javascript/jscomp/CompilerTestCase.java +++ b/test/com/google/javascript/jscomp/CompilerTestCase.java @@ -262,11 +262,11 @@ public abstract class CompilerTestCase extends TestCase { "function IArrayLike() {};", "/**", " * @template T", - " * @constructor ", + " * @constructor", " * @implements {IArrayLike} ", " * @implements {Iterable}", " * @param {...*} var_args", - " * @return {!Array.}", + " * @return {!Array}", " */", "function Array(var_args) {}"); diff --git a/test/com/google/javascript/jscomp/IntegrationTest.java b/test/com/google/javascript/jscomp/IntegrationTest.java index dde640e9cd0..350f734785b 100644 --- a/test/com/google/javascript/jscomp/IntegrationTest.java +++ b/test/com/google/javascript/jscomp/IntegrationTest.java @@ -3178,15 +3178,62 @@ public void testDuplicateVariablesInExterns() { testSame(options, ""); } - public void testEs6InExterns() { + public void testEs6ClassInExterns() { CompilerOptions options = createCompilerOptions(); options.setWarningLevel(DiagnosticGroups.CHECK_TYPES, CheckLevel.WARNING); - externs = ImmutableList.of(SourceFile.fromCode( - "externs", "class ExternalClass { externalMethod() {} }")); + options.setLanguageIn(LanguageMode.ECMASCRIPT_2017); + options.setLanguageOut(LanguageMode.ECMASCRIPT3); + + ImmutableList.Builder externsList = ImmutableList.builder(); + externsList.addAll(externs); + externsList.add( + SourceFile.fromCode("extraExterns", "class ExternalClass { externalMethod() {} }")); + externs = externsList.build(); + testSame(options, "(new ExternalClass).externalMethod();"); test(options, "(new ExternalClass).nonexistentMethod();", TypeCheck.INEXISTENT_PROPERTY); } + public void testGeneratorFunctionInExterns() { + CompilerOptions options = createCompilerOptions(); + options.setWarningLevel(DiagnosticGroups.CHECK_TYPES, CheckLevel.WARNING); + options.setLanguageIn(LanguageMode.ECMASCRIPT_2017); + options.setLanguageOut(LanguageMode.ECMASCRIPT3); + + ImmutableList.Builder externsList = ImmutableList.builder(); + externsList.addAll(externs); + externsList.add( + SourceFile.fromCode( + "extraExterns", "/** @return {!Iterable} */ function* gen() {}")); + externs = externsList.build(); + + test( + options, + "for (let x of gen()) { x.call(); }", + // Property call never defined on Number. + TypeCheck.INEXISTENT_PROPERTY); + } + + public void testAsyncFunctionInExterns() { + CompilerOptions options = createCompilerOptions(); + options.setWarningLevel(DiagnosticGroups.CHECK_TYPES, CheckLevel.WARNING); + options.setLanguageIn(LanguageMode.ECMASCRIPT_2017); + options.setLanguageOut(LanguageMode.ECMASCRIPT3); + + ImmutableList.Builder externsList = ImmutableList.builder(); + externsList.addAll(externs); + externsList.add( + SourceFile.fromCode( + "extraExterns", "/** @return {!Promise} */ async function init() {}")); + externs = externsList.build(); + + test( + options, + "init().then((n) => { n.call(); });", + // Property call never defined on Number. + TypeCheck.INEXISTENT_PROPERTY); + } + public void testLanguageMode() { CompilerOptions options = createCompilerOptions(); diff --git a/test/com/google/javascript/jscomp/IntegrationTestCase.java b/test/com/google/javascript/jscomp/IntegrationTestCase.java index 447946c1d5d..3df2cca6cd0 100644 --- a/test/com/google/javascript/jscomp/IntegrationTestCase.java +++ b/test/com/google/javascript/jscomp/IntegrationTestCase.java @@ -98,6 +98,8 @@ abstract class IntegrationTestCase extends TestCase { "/** @constructor */", "function ObjectPropertyDescriptor() {};", "", + "ObjectPropertyDescriptor.prototype.value;", + "", "/** @constructor */ function Window() {}", "/** @type {string} */ Window.prototype.name;", "/** @type {string} */ Window.prototype.offsetWidth;", @@ -131,6 +133,11 @@ abstract class IntegrationTestCase extends TestCase { "/** @return {IteratorIterable} */", "Array.prototype.values;", "", + "Array.prototype.splice;", + "Array.prototype.push;", + "Array.prototype.reverse;", + "Array.prototype.pop;", + "", "/**", " * @constructor", " * @return {number}", @@ -146,6 +153,8 @@ abstract class IntegrationTestCase extends TestCase { " */", "function String(opt_str) {}", "", + "String.prototype.split = function(delimiter) {};", + "", "/**", " * @constructor", " * @return {boolean}", @@ -178,6 +187,7 @@ abstract class IntegrationTestCase extends TestCase { "function Object(opt_value) {}", "Object.seal;", "Object.defineProperties;", + "Object.defineProperty;", "", "Object.prototype;", "", @@ -236,7 +246,32 @@ abstract class IntegrationTestCase extends TestCase { " * @param {?} exception", " * @return {!IIterableResult}", " */", - "Generator.prototype.throw = function(exception) {};"))); + "Generator.prototype.throw = function(exception) {};", + "", + "/**", + " * @constructor", + " * @template T", + " */", + "function Promise(resolver) {}", + "", + "Promise.resolve = function(value) {};", + "", + "/**", + " * @param {function(T)=} opt_successCallback", + " * @param {function(!Error)=} opt_errorCallback", + " */", + "Promise.prototype.then = function(opt_successCallback, opt_errorCallback) {};", + "", + "/**", + " * @typedef {{then: ?}}", + " */", + "var Thenable;", + "", + "/** @interface */", + "function IThenable() {}", + "", + "IThenable.prototype.then = function(callback) {};", + ""))); protected List externs = DEFAULT_EXTERNS;