Index: third_party/closure_linter/closure_linter/typeannotation_test.py |
diff --git a/third_party/closure_linter/closure_linter/typeannotation_test.py b/third_party/closure_linter/closure_linter/typeannotation_test.py |
deleted file mode 100644 |
index 4c60059c64dd347bf560c5411524d36081fd1e47..0000000000000000000000000000000000000000 |
--- a/third_party/closure_linter/closure_linter/typeannotation_test.py |
+++ /dev/null |
@@ -1,233 +0,0 @@ |
-#!/usr/bin/env python |
-"""Unit tests for the typeannotation module.""" |
- |
- |
- |
- |
-import unittest as googletest |
- |
-from closure_linter import testutil |
-from closure_linter.common import erroraccumulator |
- |
-CRAZY_TYPE = ('Array.<!function(new:X,{a:null},...(c|d)):' |
- 'function(...(Object.<string>))>') |
- |
- |
-class TypeErrorException(Exception): |
- """Exception for TypeErrors.""" |
- |
- def __init__(self, errors): |
- super(TypeErrorException, self).__init__() |
- self.errors = errors |
- |
- |
-class TypeParserTest(googletest.TestCase): |
- """Tests for typeannotation parsing.""" |
- |
- def _ParseComment(self, script): |
- """Parse a script that contains one comment and return it.""" |
- accumulator = erroraccumulator.ErrorAccumulator() |
- _, comments = testutil.ParseFunctionsAndComments(script, accumulator) |
- if accumulator.GetErrors(): |
- raise TypeErrorException(accumulator.GetErrors()) |
- self.assertEquals(1, len(comments)) |
- return comments[0] |
- |
- def _ParseType(self, type_str): |
- """Creates a comment to parse and returns the parsed type.""" |
- comment = self._ParseComment('/** @type {%s} **/' % type_str) |
- return comment.GetDocFlags()[0].jstype |
- |
- def assertProperReconstruction(self, type_str, matching_str=None): |
- """Parses the type and asserts the its repr matches the type. |
- |
- If matching_str is specified, it will assert that the repr matches this |
- string instead. |
- |
- Args: |
- type_str: The type string to parse. |
- matching_str: A string the __repr__ of the parsed type should match. |
- Returns: |
- The parsed js_type. |
- """ |
- parsed_type = self._ParseType(type_str) |
- # Use listEqual assertion to more easily identify the difference |
- self.assertListEqual(list(matching_str or type_str), |
- list(repr(parsed_type))) |
- self.assertEquals(matching_str or type_str, repr(parsed_type)) |
- |
- # Newlines will be inserted by the file writer. |
- self.assertEquals(type_str.replace('\n', ''), parsed_type.ToString()) |
- return parsed_type |
- |
- def assertNullable(self, type_str, nullable=True): |
- parsed_type = self.assertProperReconstruction(type_str) |
- self.assertEquals(nullable, parsed_type.GetNullability(), |
- '"%s" should %sbe nullable' % |
- (type_str, 'not ' if nullable else '')) |
- |
- def assertNotNullable(self, type_str): |
- return self.assertNullable(type_str, nullable=False) |
- |
- def testReconstruction(self): |
- self.assertProperReconstruction('*') |
- self.assertProperReconstruction('number') |
- self.assertProperReconstruction('(((number)))') |
- self.assertProperReconstruction('!number') |
- self.assertProperReconstruction('?!number') |
- self.assertProperReconstruction('number=') |
- self.assertProperReconstruction('number=!?', '?!number=') |
- self.assertProperReconstruction('number|?string') |
- self.assertProperReconstruction('(number|string)') |
- self.assertProperReconstruction('?(number|string)') |
- self.assertProperReconstruction('Object.<number,string>') |
- self.assertProperReconstruction('function(new:Object)') |
- self.assertProperReconstruction('function(new:Object):number') |
- self.assertProperReconstruction('function(new:Object,Element):number') |
- self.assertProperReconstruction('function(this:T,...)') |
- self.assertProperReconstruction('{a:?number}') |
- self.assertProperReconstruction('{a:?number,b:(number|string)}') |
- self.assertProperReconstruction('{c:{nested_element:*}|undefined}') |
- self.assertProperReconstruction('{handleEvent:function(?):?}') |
- self.assertProperReconstruction('function():?|null') |
- self.assertProperReconstruction('null|function():?|bar') |
- |
- def testOptargs(self): |
- self.assertProperReconstruction('number=') |
- self.assertProperReconstruction('number|string=') |
- self.assertProperReconstruction('(number|string)=') |
- self.assertProperReconstruction('(number|string=)') |
- self.assertProperReconstruction('(number=|string)') |
- self.assertProperReconstruction('function(...):number=') |
- |
- def testIndepth(self): |
- # Do an deeper check of the crazy identifier |
- crazy = self.assertProperReconstruction(CRAZY_TYPE) |
- self.assertEquals('Array.', crazy.identifier) |
- self.assertEquals(1, len(crazy.sub_types)) |
- func1 = crazy.sub_types[0] |
- func2 = func1.return_type |
- self.assertEquals('function', func1.identifier) |
- self.assertEquals('function', func2.identifier) |
- self.assertEquals(3, len(func1.sub_types)) |
- self.assertEquals(1, len(func2.sub_types)) |
- self.assertEquals('Object.', func2.sub_types[0].sub_types[0].identifier) |
- |
- def testIterIdentifiers(self): |
- nested_identifiers = self._ParseType('(a|{b:(c|function(new:d):e)})') |
- for identifier in ('a', 'b', 'c', 'd', 'e'): |
- self.assertIn(identifier, nested_identifiers.IterIdentifiers()) |
- |
- def testIsEmpty(self): |
- self.assertTrue(self._ParseType('').IsEmpty()) |
- self.assertFalse(self._ParseType('?').IsEmpty()) |
- self.assertFalse(self._ParseType('!').IsEmpty()) |
- self.assertFalse(self._ParseType('<?>').IsEmpty()) |
- |
- def testIsConstructor(self): |
- self.assertFalse(self._ParseType('').IsConstructor()) |
- self.assertFalse(self._ParseType('Array.<number>').IsConstructor()) |
- self.assertTrue(self._ParseType('function(new:T)').IsConstructor()) |
- |
- def testIsVarArgsType(self): |
- self.assertTrue(self._ParseType('...number').IsVarArgsType()) |
- self.assertTrue(self._ParseType('...Object|Array').IsVarArgsType()) |
- self.assertTrue(self._ParseType('...(Object|Array)').IsVarArgsType()) |
- self.assertFalse(self._ParseType('Object|...Array').IsVarArgsType()) |
- self.assertFalse(self._ParseType('(...Object|Array)').IsVarArgsType()) |
- |
- def testIsUnknownType(self): |
- self.assertTrue(self._ParseType('?').IsUnknownType()) |
- self.assertTrue(self._ParseType('Foo.<?>').sub_types[0].IsUnknownType()) |
- self.assertFalse(self._ParseType('?|!').IsUnknownType()) |
- self.assertTrue(self._ParseType('?|!').sub_types[0].IsUnknownType()) |
- self.assertFalse(self._ParseType('!').IsUnknownType()) |
- |
- long_type = 'function():?|{handleEvent:function(?=):?,sample:?}|?=' |
- record = self._ParseType(long_type) |
- # First check that there's not just one type with 3 return types, but three |
- # top-level types. |
- self.assertEquals(3, len(record.sub_types)) |
- |
- # Now extract all unknown type instances and verify that they really are. |
- handle_event, sample = record.sub_types[1].sub_types |
- for i, sub_type in enumerate([ |
- record.sub_types[0].return_type, |
- handle_event.return_type, |
- handle_event.sub_types[0], |
- sample, |
- record.sub_types[2]]): |
- self.assertTrue(sub_type.IsUnknownType(), |
- 'Type %d should be the unknown type: %s\n%s' % ( |
- i, sub_type.tokens, record.Dump())) |
- |
- def testTypedefNames(self): |
- easy = self._ParseType('{a}') |
- self.assertTrue(easy.record_type) |
- |
- easy = self.assertProperReconstruction('{a}', '{a:}').sub_types[0] |
- self.assertEquals('a', easy.key_type.identifier) |
- self.assertEquals('', easy.identifier) |
- |
- easy = self.assertProperReconstruction('{a:b}').sub_types[0] |
- self.assertEquals('a', easy.key_type.identifier) |
- self.assertEquals('b', easy.identifier) |
- |
- def assertTypeError(self, type_str): |
- """Asserts that parsing the given type raises a linter error.""" |
- self.assertRaises(TypeErrorException, self._ParseType, type_str) |
- |
- def testParseBadTypes(self): |
- """Tests that several errors in types don't break the parser.""" |
- self.assertTypeError('<') |
- self.assertTypeError('>') |
- self.assertTypeError('Foo.<Bar') |
- self.assertTypeError('Foo.Bar>=') |
- self.assertTypeError('Foo.<Bar>>=') |
- self.assertTypeError('(') |
- self.assertTypeError(')') |
- self.assertTypeError('Foo.<Bar)>') |
- self._ParseType(':') |
- self._ParseType(':foo') |
- self.assertTypeError(':)foo') |
- self.assertTypeError('(a|{b:(c|function(new:d):e') |
- |
- def testNullable(self): |
- self.assertNullable('null') |
- self.assertNullable('Object') |
- self.assertNullable('?string') |
- self.assertNullable('?number') |
- |
- self.assertNotNullable('string') |
- self.assertNotNullable('number') |
- self.assertNotNullable('boolean') |
- self.assertNotNullable('function(Object)') |
- self.assertNotNullable('function(Object):Object') |
- self.assertNotNullable('function(?Object):?Object') |
- self.assertNotNullable('!Object') |
- |
- self.assertNotNullable('boolean|string') |
- self.assertNotNullable('(boolean|string)') |
- |
- self.assertNullable('(boolean|string|null)') |
- self.assertNullable('(?boolean)') |
- self.assertNullable('?(boolean)') |
- |
- self.assertNullable('(boolean|Object)') |
- self.assertNotNullable('(boolean|(string|{a:}))') |
- |
- def testSpaces(self): |
- """Tests that spaces don't change the outcome.""" |
- type_str = (' A < b | ( c | ? ! d e f ) > | ' |
- 'function ( x : . . . ) : { y : z = } ') |
- two_spaces = type_str.replace(' ', ' ') |
- no_spaces = type_str.replace(' ', '') |
- newlines = type_str.replace(' ', '\n * ') |
- self.assertProperReconstruction(no_spaces) |
- self.assertProperReconstruction(type_str, no_spaces) |
- self.assertProperReconstruction(two_spaces, no_spaces) |
- self.assertProperReconstruction(newlines, no_spaces) |
- |
-if __name__ == '__main__': |
- googletest.main() |
- |