| Index: third_party/closure_linter/closure_linter/aliaspass_test.py
|
| diff --git a/third_party/closure_linter/closure_linter/aliaspass_test.py b/third_party/closure_linter/closure_linter/aliaspass_test.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1c5578870d5902a9ca117adce3ac18901b90fdb7
|
| --- /dev/null
|
| +++ b/third_party/closure_linter/closure_linter/aliaspass_test.py
|
| @@ -0,0 +1,162 @@
|
| +#!/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 aliaspass 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 aliaspass
|
| +from closure_linter import errors
|
| +from closure_linter import testutil
|
| +from closure_linter.common import erroraccumulator
|
| +
|
| +
|
| +def _GetTokenByLineAndString(start_token, string, line_number):
|
| + for token in start_token:
|
| + if token.line_number == line_number and token.string == string:
|
| + return token
|
| +
|
| +
|
| +class AliasPassTest(googletest.TestCase):
|
| +
|
| + def testInvalidGoogScopeCall(self):
|
| + start_token = testutil.TokenizeSourceAndRunEcmaPass(_TEST_SCOPE_SCRIPT)
|
| +
|
| + error_accumulator = erroraccumulator.ErrorAccumulator()
|
| + alias_pass = aliaspass.AliasPass(
|
| + error_handler=error_accumulator)
|
| + alias_pass.Process(start_token)
|
| +
|
| + alias_errors = error_accumulator.GetErrors()
|
| + self.assertEquals(1, len(alias_errors))
|
| +
|
| + alias_error = alias_errors[0]
|
| +
|
| + self.assertEquals(errors.INVALID_USE_OF_GOOG_SCOPE, alias_error.code)
|
| + self.assertEquals('goog.scope', alias_error.token.string)
|
| +
|
| + def testAliasedIdentifiers(self):
|
| + start_token = testutil.TokenizeSourceAndRunEcmaPass(_TEST_ALIAS_SCRIPT)
|
| + alias_pass = aliaspass.AliasPass(set(['goog', 'myproject']))
|
| + alias_pass.Process(start_token)
|
| +
|
| + alias_token = _GetTokenByLineAndString(start_token, 'Event', 4)
|
| + self.assertTrue(alias_token.metadata.is_alias_definition)
|
| +
|
| + my_class_token = _GetTokenByLineAndString(start_token, 'myClass', 9)
|
| + self.assertIsNone(my_class_token.metadata.aliased_symbol)
|
| +
|
| + component_token = _GetTokenByLineAndString(start_token, 'Component', 17)
|
| + self.assertEquals('goog.ui.Component',
|
| + component_token.metadata.aliased_symbol)
|
| +
|
| + event_token = _GetTokenByLineAndString(start_token, 'Event.Something', 17)
|
| + self.assertEquals('goog.events.Event.Something',
|
| + event_token.metadata.aliased_symbol)
|
| +
|
| + non_closurized_token = _GetTokenByLineAndString(
|
| + start_token, 'NonClosurizedClass', 18)
|
| + self.assertIsNone(non_closurized_token.metadata.aliased_symbol)
|
| +
|
| + long_start_token = _GetTokenByLineAndString(start_token, 'Event.', 21)
|
| + self.assertEquals('goog.events.Event.MultilineIdentifier.someMethod',
|
| + long_start_token.metadata.aliased_symbol)
|
| +
|
| + def testMultipleGoogScopeCalls(self):
|
| + start_token = testutil.TokenizeSourceAndRunEcmaPass(
|
| + _TEST_MULTIPLE_SCOPE_SCRIPT)
|
| +
|
| + error_accumulator = erroraccumulator.ErrorAccumulator()
|
| +
|
| + alias_pass = aliaspass.AliasPass(
|
| + set(['goog', 'myproject']),
|
| + error_handler=error_accumulator)
|
| + alias_pass.Process(start_token)
|
| +
|
| + alias_errors = error_accumulator.GetErrors()
|
| +
|
| + self.assertEquals(3, len(alias_errors))
|
| +
|
| + error = alias_errors[0]
|
| + self.assertEquals(errors.INVALID_USE_OF_GOOG_SCOPE, error.code)
|
| + self.assertEquals(7, error.token.line_number)
|
| +
|
| + error = alias_errors[1]
|
| + self.assertEquals(errors.EXTRA_GOOG_SCOPE_USAGE, error.code)
|
| + self.assertEquals(7, error.token.line_number)
|
| +
|
| + error = alias_errors[2]
|
| + self.assertEquals(errors.EXTRA_GOOG_SCOPE_USAGE, error.code)
|
| + self.assertEquals(11, error.token.line_number)
|
| +
|
| +
|
| +_TEST_ALIAS_SCRIPT = """
|
| +goog.scope(function() {
|
| +var events = goog.events; // scope alias
|
| +var Event = events.
|
| + Event; // nested multiline scope alias
|
| +
|
| +// This should not be registered as an aliased identifier because
|
| +// it appears before the alias.
|
| +var myClass = new MyClass();
|
| +
|
| +var Component = goog.ui.Component; // scope alias
|
| +var MyClass = myproject.foo.MyClass; // scope alias
|
| +
|
| +// Scope alias of non-Closurized namespace.
|
| +var NonClosurizedClass = aaa.bbb.NonClosurizedClass;
|
| +
|
| +var component = new Component(Event.Something);
|
| +var nonClosurized = NonClosurizedClass();
|
| +
|
| +// A created namespace with a really long identifier.
|
| +Event.
|
| + MultilineIdentifier.
|
| + someMethod = function() {};
|
| +});
|
| +"""
|
| +
|
| +_TEST_SCOPE_SCRIPT = """
|
| +function foo () {
|
| + // This goog.scope call is invalid.
|
| + goog.scope(function() {
|
| +
|
| + });
|
| +}
|
| +"""
|
| +
|
| +_TEST_MULTIPLE_SCOPE_SCRIPT = """
|
| +goog.scope(function() {
|
| + // do nothing
|
| +});
|
| +
|
| +function foo() {
|
| + var test = goog.scope; // We should not see goog.scope mentioned.
|
| +}
|
| +
|
| +// This goog.scope invalid. There can be only one.
|
| +goog.scope(function() {
|
| +
|
| +});
|
| +"""
|
| +
|
| +
|
| +if __name__ == '__main__':
|
| + googletest.main()
|
|
|