Index: third_party/closure_compiler/compiler_customization_test.py |
diff --git a/third_party/closure_compiler/compiler_customization_test.py b/third_party/closure_compiler/compiler_customization_test.py |
index 99593c565fbacdba48216c5447a25c969c30e7e1..2e63c6b5ecfeca5a761b190be04ce2b06a67db1c 100755 |
--- a/third_party/closure_compiler/compiler_customization_test.py |
+++ b/third_party/closure_compiler/compiler_customization_test.py |
@@ -6,7 +6,8 @@ |
import os |
import unittest |
-from checker import Checker, FileCache, Flattener |
+from checker import Checker |
+from processor import FileCache, Processor |
CR_FILE = os.path.join("..", "..", "ui", "webui", "resources", "js", "cr.js") |
@@ -18,22 +19,32 @@ def rel_to_abs(rel_path): |
class CompilerCustomizationTest(unittest.TestCase): |
- _CR_DEFINE_DEFINITION = Flattener(rel_to_abs(CR_FILE)).contents |
+ _CR_DEFINE_DEFINITION = Processor(rel_to_abs(CR_FILE)).contents |
def setUp(self): |
self._checker = Checker() |
- def _runCheckerTest(self, source_code, expected_error): |
+ def _runChecker(self, source_code): |
file_path = "/script.js" |
FileCache._cache[file_path] = source_code |
- _, output = self._checker.check(file_path) |
+ return self._checker.check(file_path) |
+ |
+ def _runCheckerTestExpectError(self, source_code, expected_error): |
+ _, output = self._runChecker(source_code) |
self.assertTrue(expected_error in output, |
msg="Expected chunk: \n%s\n\nOutput:\n%s\n" % ( |
expected_error, output)) |
+ def _runCheckerTestExpectSuccess(self, source_code): |
+ return_code, output = self._runChecker(source_code) |
+ |
+ self.assertTrue(return_code == 0, |
+ msg="Expected success, got return code %d\n\nOutput:\n%s\n" % ( |
+ return_code, output)) |
+ |
def testGetInstance(self): |
- self._runCheckerTest(source_code=""" |
+ self._runCheckerTestExpectError(""" |
var cr = { |
/** @param {!Function} ctor */ |
addSingletonGetter: function(ctor) { |
@@ -51,12 +62,11 @@ function Class() { |
cr.addSingletonGetter(Class); |
Class.getInstance().needsNumber("wrong type"); |
-""", |
- expected_error="ERROR - actual parameter 1 of Class.needsNumber does " |
- "not match formal parameter") |
+""", "ERROR - actual parameter 1 of Class.needsNumber does not match formal " |
+ "parameter") |
def testCrDefineFunctionDefinition(self): |
- self._runCheckerTest(source_code=self._CR_DEFINE_DEFINITION + """ |
+ self._runCheckerTestExpectError(self._CR_DEFINE_DEFINITION + """ |
cr.define('a.b.c', function() { |
/** @param {number} num */ |
function internalName(num) {} |
@@ -67,11 +77,11 @@ cr.define('a.b.c', function() { |
}); |
a.b.c.needsNumber("wrong type"); |
-""", expected_error="ERROR - actual parameter 1 of a.b.c.needsNumber does " |
- "not match formal parameter") |
+""", "ERROR - actual parameter 1 of a.b.c.needsNumber does not match formal " |
+ "parameter") |
def testCrDefineFunctionAssignment(self): |
- self._runCheckerTest(source_code=self._CR_DEFINE_DEFINITION + """ |
+ self._runCheckerTestExpectError(self._CR_DEFINE_DEFINITION + """ |
cr.define('a.b.c', function() { |
/** @param {number} num */ |
var internalName = function(num) {}; |
@@ -82,11 +92,11 @@ cr.define('a.b.c', function() { |
}); |
a.b.c.needsNumber("wrong type"); |
-""", expected_error="ERROR - actual parameter 1 of a.b.c.needsNumber does " |
- "not match formal parameter") |
+""", "ERROR - actual parameter 1 of a.b.c.needsNumber does not match formal " |
+ "parameter") |
def testCrDefineConstructorDefinitionPrototypeMethod(self): |
- self._runCheckerTest(source_code=self._CR_DEFINE_DEFINITION + """ |
+ self._runCheckerTestExpectError(self._CR_DEFINE_DEFINITION + """ |
cr.define('a.b.c', function() { |
/** @constructor */ |
function ClassInternalName() {} |
@@ -102,11 +112,11 @@ cr.define('a.b.c', function() { |
}); |
new a.b.c.ClassExternalName().method("wrong type"); |
-""", expected_error="ERROR - actual parameter 1 of a.b.c.ClassExternalName." |
- "prototype.method does not match formal parameter") |
+""", "ERROR - actual parameter 1 of a.b.c.ClassExternalName.prototype.method " |
+ "does not match formal parameter") |
def testCrDefineConstructorAssignmentPrototypeMethod(self): |
- self._runCheckerTest(source_code=self._CR_DEFINE_DEFINITION + """ |
+ self._runCheckerTestExpectError(self._CR_DEFINE_DEFINITION + """ |
cr.define('a.b.c', function() { |
/** @constructor */ |
var ClassInternalName = function() {}; |
@@ -122,11 +132,11 @@ cr.define('a.b.c', function() { |
}); |
new a.b.c.ClassExternalName().method("wrong type"); |
-""", expected_error="ERROR - actual parameter 1 of a.b.c.ClassExternalName." |
- "prototype.method does not match formal parameter") |
+""", "ERROR - actual parameter 1 of a.b.c.ClassExternalName.prototype.method " |
+ "does not match formal parameter") |
def testCrDefineEnum(self): |
- self._runCheckerTest(source_code=self._CR_DEFINE_DEFINITION + """ |
+ self._runCheckerTestExpectError(self._CR_DEFINE_DEFINITION + """ |
cr.define('a.b.c', function() { |
/** @enum {string} */ |
var internalNameForEnum = {key: 'wrong_type'}; |
@@ -140,8 +150,42 @@ cr.define('a.b.c', function() { |
function needsNumber(num) {} |
needsNumber(a.b.c.exportedEnum.key); |
-""", expected_error="ERROR - actual parameter 1 of needsNumber does not " |
- "match formal parameter") |
+""", "ERROR - actual parameter 1 of needsNumber does not match formal " |
+ "parameter") |
+ |
+ def testObjectDefineProperty(self): |
+ self._runCheckerTestExpectSuccess(""" |
+/** @constructor */ |
+function Class() {} |
+ |
+Object.defineProperty(Class.prototype, 'myProperty', {}); |
+ |
+alert(new Class().myProperty); |
+""") |
+ |
+ def testCrDefineProperty(self): |
+ self._runCheckerTestExpectSuccess(self._CR_DEFINE_DEFINITION + """ |
+/** @constructor */ |
+function Class() {} |
+ |
+cr.defineProperty(Class.prototype, 'myProperty', cr.PropertyKind.JS); |
+ |
+alert(new Class().myProperty); |
+""") |
+ |
+ def testCrDefinePropertyTypeChecking(self): |
+ self._runCheckerTestExpectError(self._CR_DEFINE_DEFINITION + """ |
+/** @constructor */ |
+function Class() {} |
+ |
+cr.defineProperty(Class.prototype, 'booleanProp', cr.PropertyKind.BOOL_ATTR); |
+ |
+/** @param {number} num */ |
+function needsNumber(num) {} |
+ |
+needsNumber(new Class().booleanProp); |
+""", "ERROR - actual parameter 1 of needsNumber does not match formal " |
+ "parameter") |
if __name__ == "__main__": |