| Index: third_party/closure_linter/closure_linter/tokenutil_test.py
|
| diff --git a/third_party/closure_linter/closure_linter/tokenutil_test.py b/third_party/closure_linter/closure_linter/tokenutil_test.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d5af9fac4a1e51e0a1eb93e92eae4275658b444e
|
| --- /dev/null
|
| +++ b/third_party/closure_linter/closure_linter/tokenutil_test.py
|
| @@ -0,0 +1,289 @@
|
| +#!/usr/bin/env python
|
| +#
|
| +# Copyright 2012 The Closure Linter Authors. All Rights Reserved.
|
| +# 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.
|
| +
|
| +"""Unit tests for the scopeutil module."""
|
| +
|
| +# Allow non-Google copyright
|
| +# pylint: disable=g-bad-file-header
|
| +
|
| +__author__ = ('nnaze@google.com (Nathan Naze)')
|
| +
|
| +import unittest as googletest
|
| +
|
| +from closure_linter import ecmametadatapass
|
| +from closure_linter import javascripttokens
|
| +from closure_linter import testutil
|
| +from closure_linter import tokenutil
|
| +
|
| +
|
| +class FakeToken(object):
|
| + pass
|
| +
|
| +
|
| +class TokenUtilTest(googletest.TestCase):
|
| +
|
| + def testGetTokenRange(self):
|
| +
|
| + a = FakeToken()
|
| + b = FakeToken()
|
| + c = FakeToken()
|
| + d = FakeToken()
|
| + e = FakeToken()
|
| +
|
| + a.next = b
|
| + b.next = c
|
| + c.next = d
|
| +
|
| + self.assertEquals([a, b, c, d], tokenutil.GetTokenRange(a, d))
|
| +
|
| + # This is an error as e does not come after a in the token chain.
|
| + self.assertRaises(Exception, lambda: tokenutil.GetTokenRange(a, e))
|
| +
|
| + def testTokensToString(self):
|
| +
|
| + a = FakeToken()
|
| + b = FakeToken()
|
| + c = FakeToken()
|
| + d = FakeToken()
|
| + e = FakeToken()
|
| +
|
| + a.string = 'aaa'
|
| + b.string = 'bbb'
|
| + c.string = 'ccc'
|
| + d.string = 'ddd'
|
| + e.string = 'eee'
|
| +
|
| + a.line_number = 5
|
| + b.line_number = 6
|
| + c.line_number = 6
|
| + d.line_number = 10
|
| + e.line_number = 11
|
| +
|
| + self.assertEquals(
|
| + 'aaa\nbbbccc\n\n\n\nddd\neee',
|
| + tokenutil.TokensToString([a, b, c, d, e]))
|
| +
|
| + self.assertEquals(
|
| + 'ddd\neee\naaa\nbbbccc',
|
| + tokenutil.TokensToString([d, e, a, b, c]),
|
| + 'Neighboring tokens not in line_number order should have a newline '
|
| + 'between them.')
|
| +
|
| + def testGetPreviousCodeToken(self):
|
| +
|
| + tokens = testutil.TokenizeSource("""
|
| +start1. // comment
|
| + /* another comment */
|
| + end1
|
| +""")
|
| +
|
| + def _GetTokenStartingWith(token_starts_with):
|
| + for t in tokens:
|
| + if t.string.startswith(token_starts_with):
|
| + return t
|
| +
|
| + self.assertEquals(
|
| + None,
|
| + tokenutil.GetPreviousCodeToken(_GetTokenStartingWith('start1')))
|
| +
|
| + self.assertEquals(
|
| + 'start1.',
|
| + tokenutil.GetPreviousCodeToken(_GetTokenStartingWith('end1')).string)
|
| +
|
| + def testGetNextCodeToken(self):
|
| +
|
| + tokens = testutil.TokenizeSource("""
|
| +start1. // comment
|
| + /* another comment */
|
| + end1
|
| +""")
|
| +
|
| + def _GetTokenStartingWith(token_starts_with):
|
| + for t in tokens:
|
| + if t.string.startswith(token_starts_with):
|
| + return t
|
| +
|
| + self.assertEquals(
|
| + 'end1',
|
| + tokenutil.GetNextCodeToken(_GetTokenStartingWith('start1')).string)
|
| +
|
| + self.assertEquals(
|
| + None,
|
| + tokenutil.GetNextCodeToken(_GetTokenStartingWith('end1')))
|
| +
|
| + def testGetIdentifierStart(self):
|
| +
|
| + tokens = testutil.TokenizeSource("""
|
| +start1 . // comment
|
| + prototype. /* another comment */
|
| + end1
|
| +
|
| +['edge'][case].prototype.
|
| + end2 = function() {}
|
| +""")
|
| +
|
| + def _GetTokenStartingWith(token_starts_with):
|
| + for t in tokens:
|
| + if t.string.startswith(token_starts_with):
|
| + return t
|
| +
|
| + self.assertEquals(
|
| + 'start1',
|
| + tokenutil.GetIdentifierStart(_GetTokenStartingWith('end1')).string)
|
| +
|
| + self.assertEquals(
|
| + 'start1',
|
| + tokenutil.GetIdentifierStart(_GetTokenStartingWith('start1')).string)
|
| +
|
| + self.assertEquals(
|
| + None,
|
| + tokenutil.GetIdentifierStart(_GetTokenStartingWith('end2')))
|
| +
|
| + def testInsertTokenBefore(self):
|
| +
|
| + self.AssertInsertTokenAfterBefore(False)
|
| +
|
| + def testInsertTokenAfter(self):
|
| +
|
| + self.AssertInsertTokenAfterBefore(True)
|
| +
|
| + def AssertInsertTokenAfterBefore(self, after):
|
| +
|
| + new_token = javascripttokens.JavaScriptToken(
|
| + 'a', javascripttokens.JavaScriptTokenType.IDENTIFIER, 1, 1)
|
| +
|
| + existing_token1 = javascripttokens.JavaScriptToken(
|
| + 'var', javascripttokens.JavaScriptTokenType.KEYWORD, 1, 1)
|
| + existing_token1.start_index = 0
|
| + existing_token1.metadata = ecmametadatapass.EcmaMetaData()
|
| +
|
| + existing_token2 = javascripttokens.JavaScriptToken(
|
| + ' ', javascripttokens.JavaScriptTokenType.WHITESPACE, 1, 1)
|
| + existing_token2.start_index = 3
|
| + existing_token2.metadata = ecmametadatapass.EcmaMetaData()
|
| + existing_token2.metadata.last_code = existing_token1
|
| +
|
| + existing_token1.next = existing_token2
|
| + existing_token2.previous = existing_token1
|
| +
|
| + if after:
|
| + tokenutil.InsertTokenAfter(new_token, existing_token1)
|
| + else:
|
| + tokenutil.InsertTokenBefore(new_token, existing_token2)
|
| +
|
| + self.assertEquals(existing_token1, new_token.previous)
|
| + self.assertEquals(existing_token2, new_token.next)
|
| +
|
| + self.assertEquals(new_token, existing_token1.next)
|
| + self.assertEquals(new_token, existing_token2.previous)
|
| +
|
| + self.assertEquals(existing_token1, new_token.metadata.last_code)
|
| + self.assertEquals(new_token, existing_token2.metadata.last_code)
|
| +
|
| + self.assertEquals(0, existing_token1.start_index)
|
| + self.assertEquals(3, new_token.start_index)
|
| + self.assertEquals(4, existing_token2.start_index)
|
| +
|
| + def testGetIdentifierForToken(self):
|
| +
|
| + tokens = testutil.TokenizeSource("""
|
| +start1.abc.def.prototype.
|
| + onContinuedLine
|
| +
|
| +(start2.abc.def
|
| + .hij.klm
|
| + .nop)
|
| +
|
| +start3.abc.def
|
| + .hij = function() {};
|
| +
|
| +// An absurd multi-liner.
|
| +start4.abc.def.
|
| + hij.
|
| + klm = function() {};
|
| +
|
| +start5 . aaa . bbb . ccc
|
| + shouldntBePartOfThePreviousSymbol
|
| +
|
| +start6.abc.def ghi.shouldntBePartOfThePreviousSymbol
|
| +
|
| +var start7 = 42;
|
| +
|
| +function start8() {
|
| +
|
| +}
|
| +
|
| +start9.abc. // why is there a comment here?
|
| + def /* another comment */
|
| + shouldntBePart
|
| +
|
| +start10.abc // why is there a comment here?
|
| + .def /* another comment */
|
| + shouldntBePart
|
| +
|
| +start11.abc. middle1.shouldNotBeIdentifier
|
| +""")
|
| +
|
| + def _GetTokenStartingWith(token_starts_with):
|
| + for t in tokens:
|
| + if t.string.startswith(token_starts_with):
|
| + return t
|
| +
|
| + self.assertEquals(
|
| + 'start1.abc.def.prototype.onContinuedLine',
|
| + tokenutil.GetIdentifierForToken(_GetTokenStartingWith('start1')))
|
| +
|
| + self.assertEquals(
|
| + 'start2.abc.def.hij.klm.nop',
|
| + tokenutil.GetIdentifierForToken(_GetTokenStartingWith('start2')))
|
| +
|
| + self.assertEquals(
|
| + 'start3.abc.def.hij',
|
| + tokenutil.GetIdentifierForToken(_GetTokenStartingWith('start3')))
|
| +
|
| + self.assertEquals(
|
| + 'start4.abc.def.hij.klm',
|
| + tokenutil.GetIdentifierForToken(_GetTokenStartingWith('start4')))
|
| +
|
| + self.assertEquals(
|
| + 'start5.aaa.bbb.ccc',
|
| + tokenutil.GetIdentifierForToken(_GetTokenStartingWith('start5')))
|
| +
|
| + self.assertEquals(
|
| + 'start6.abc.def',
|
| + tokenutil.GetIdentifierForToken(_GetTokenStartingWith('start6')))
|
| +
|
| + self.assertEquals(
|
| + 'start7',
|
| + tokenutil.GetIdentifierForToken(_GetTokenStartingWith('start7')))
|
| +
|
| + self.assertEquals(
|
| + 'start8',
|
| + tokenutil.GetIdentifierForToken(_GetTokenStartingWith('start8')))
|
| +
|
| + self.assertEquals(
|
| + 'start9.abc.def',
|
| + tokenutil.GetIdentifierForToken(_GetTokenStartingWith('start9')))
|
| +
|
| + self.assertEquals(
|
| + 'start10.abc.def',
|
| + tokenutil.GetIdentifierForToken(_GetTokenStartingWith('start10')))
|
| +
|
| + self.assertIsNone(
|
| + tokenutil.GetIdentifierForToken(_GetTokenStartingWith('middle1')))
|
| +
|
| +
|
| +if __name__ == '__main__':
|
| + googletest.main()
|
|
|