blob: 1c5578870d5902a9ca117adce3ac18901b90fdb7 [file] [log] [blame]
#!/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()