12da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#!/usr/bin/env python
22da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
32da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Copyright 2010 The Closure Linter Authors. All Rights Reserved.
42da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
52da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Licensed under the Apache License, Version 2.0 (the "License");
62da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# you may not use this file except in compliance with the License.
72da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# You may obtain a copy of the License at
82da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
92da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#      http://www.apache.org/licenses/LICENSE-2.0
102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Unless required by applicable law or agreed to in writing, software
122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# distributed under the License is distributed on an "AS-IS" BASIS,
132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# See the License for the specific language governing permissions and
152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# limitations under the License.
162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis"""Unit tests for ClosurizedNamespacesInfo."""
182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
212da489cd246702bee5938545b18a6f710ed214bcJamie Gennisimport unittest as googletest
222da489cd246702bee5938545b18a6f710ed214bcJamie Gennisfrom closure_linter import closurizednamespacesinfo
232da489cd246702bee5938545b18a6f710ed214bcJamie Gennisfrom closure_linter import javascriptstatetracker
242da489cd246702bee5938545b18a6f710ed214bcJamie Gennisfrom closure_linter import javascripttokenizer
252da489cd246702bee5938545b18a6f710ed214bcJamie Gennisfrom closure_linter import javascripttokens
262da489cd246702bee5938545b18a6f710ed214bcJamie Gennisfrom closure_linter import tokenutil
272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# pylint: disable-msg=C6409
292da489cd246702bee5938545b18a6f710ed214bcJamie GennisTokenType = javascripttokens.JavaScriptTokenType
302da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
322da489cd246702bee5938545b18a6f710ed214bcJamie Gennisclass ClosurizedNamespacesInfoTest(googletest.TestCase):
332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  """Tests for ClosurizedNamespacesInfo."""
342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  _test_cases = {
362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'goog.global.anything': None,
372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.CONSTANT': 'package',
382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.methodName': 'package',
392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.subpackage.methodName': 'package.subpackage',
402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.subpackage.methodName.apply': 'package.subpackage',
412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.ClassName.something': 'package.ClassName',
422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.ClassName.Enum.VALUE.methodName': 'package.ClassName',
432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.ClassName.CONSTANT': 'package.ClassName',
442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.namespace.CONSTANT.methodName': 'package.namespace',
452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.ClassName.inherits': 'package.ClassName',
462da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.ClassName.apply': 'package.ClassName',
472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.ClassName.methodName.apply': 'package.ClassName',
482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.ClassName.methodName.call': 'package.ClassName',
492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.ClassName.prototype.methodName': 'package.ClassName',
502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.ClassName.privateMethod_': 'package.ClassName',
512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.className.privateProperty_': 'package.className',
522da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.className.privateProperty_.methodName': 'package.className',
532da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.ClassName.PrivateEnum_': 'package.ClassName',
542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.ClassName.prototype.methodName.apply': 'package.ClassName',
552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.ClassName.property.subProperty': 'package.ClassName',
562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      'package.className.prototype.something.somethingElse': 'package.className'
572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  }
582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  _tokenizer = javascripttokenizer.JavaScriptTokenizer()
602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
612da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testGetClosurizedNamespace(self):
622da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that the correct namespace is returned for various identifiers."""
632da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = closurizednamespacesinfo.ClosurizedNamespacesInfo(
642da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        closurized_namespaces=['package'], ignored_extra_namespaces=[])
652da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    for identifier, expected_namespace in self._test_cases.items():
662da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      actual_namespace = namespaces_info.GetClosurizedNamespace(identifier)
672da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      self.assertEqual(
682da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          expected_namespace,
692da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          actual_namespace,
702da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          'expected namespace "' + str(expected_namespace) +
712da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          '" for identifier "' + str(identifier) + '" but was "' +
722da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          str(actual_namespace) + '"')
732da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
742da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIgnoredExtraNamespaces(self):
752da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that ignored_extra_namespaces are ignored."""
762da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._GetRequireTokens('package.Something')
772da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = closurizednamespacesinfo.ClosurizedNamespacesInfo(
782da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        closurized_namespaces=['package'],
792da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        ignored_extra_namespaces=['package.Something'])
802da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
812da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertFalse(namespaces_info.IsExtraRequire(token),
822da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                     'Should be valid since it is in ignored namespaces.')
832da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
842da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = closurizednamespacesinfo.ClosurizedNamespacesInfo(
852da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        ['package'], [])
862da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
872da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertTrue(namespaces_info.IsExtraRequire(token),
882da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                    'Should be invalid since it is not in ignored namespaces.')
892da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
902da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsExtraProvide_created(self):
912da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that provides for created namespaces are not extra."""
922da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
932da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.provide(\'package.Foo\');',
942da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.Foo = function() {};'
952da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
962da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
972da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
982da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
992da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertFalse(namespaces_info.IsExtraProvide(token),
1002da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                     'Should not be extra since it is created.')
1012da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1022da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsExtraProvide_createdIdentifier(self):
1032da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that provides for created identifiers are not extra."""
1042da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
1052da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.provide(\'package.Foo.methodName\');',
1062da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.Foo.methodName = function() {};'
1072da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
1082da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
1092da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
1102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertFalse(namespaces_info.IsExtraProvide(token),
1122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                     'Should not be extra since it is created.')
1132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsExtraProvide_notCreated(self):
1152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that provides for non-created namespaces are extra."""
1162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = ['goog.provide(\'package.Foo\');']
1172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
1182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
1192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertTrue(namespaces_info.IsExtraProvide(token),
1212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                    'Should be extra since it is not created.')
1222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1232da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsExtraProvide_duplicate(self):
1242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that providing a namespace twice makes the second one extra."""
1252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
1262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.provide(\'package.Foo\');',
1272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.provide(\'package.Foo\');',
1282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.Foo = function() {};'
1292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
1302da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
1312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
1322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    # Advance to the second goog.provide token.
1342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = tokenutil.Search(token.next, TokenType.IDENTIFIER)
1352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertTrue(namespaces_info.IsExtraProvide(token),
1372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                    'Should be extra since it is already provided.')
1382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsExtraProvide_notClosurized(self):
1402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that provides of non-closurized namespaces are not extra."""
1412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = ['goog.provide(\'notclosurized.Foo\');']
1422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
1432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
1442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertFalse(namespaces_info.IsExtraProvide(token),
1462da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                     'Should not be extra since it is not closurized.')
1472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsExtraRequire_used(self):
1492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that requires for used namespaces are not extra."""
1502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
1512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.require(\'package.Foo\');',
1522da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'var x = package.Foo.methodName();'
1532da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
1542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
1552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
1562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertFalse(namespaces_info.IsExtraRequire(token),
1582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                     'Should not be extra since it is used.')
1592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsExtraRequire_usedIdentifier(self):
1612da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that requires for used methods on classes are extra."""
1622da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
1632da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.require(\'package.Foo.methodName\');',
1642da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'var x = package.Foo.methodName();'
1652da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
1662da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
1672da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
1682da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1692da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertTrue(namespaces_info.IsExtraRequire(token),
1702da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                    'Should require the package, not the method specifically.')
1712da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1722da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsExtraRequire_notUsed(self):
1732da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that requires for unused namespaces are extra."""
1742da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = ['goog.require(\'package.Foo\');']
1752da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
1762da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
1772da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1782da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertTrue(namespaces_info.IsExtraRequire(token),
1792da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                    'Should be extra since it is not used.')
1802da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1812da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsExtraRequire_notClosurized(self):
1822da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that requires of non-closurized namespaces are not extra."""
1832da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = ['goog.require(\'notclosurized.Foo\');']
1842da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
1852da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
1862da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1872da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertFalse(namespaces_info.IsExtraRequire(token),
1882da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                     'Should not be extra since it is not closurized.')
1892da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1902da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsExtraRequire_objectOnClass(self):
1912da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that requiring an object on a class is extra."""
1922da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
1932da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.require(\'package.Foo.Enum\');',
1942da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'var x = package.Foo.Enum.VALUE1;',
1952da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
1962da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
1972da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
1982da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1992da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertTrue(namespaces_info.IsExtraRequire(token),
2002da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                    'The whole class, not the object, should be required.');
2012da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2022da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsExtraRequire_constantOnClass(self):
2032da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that requiring a constant on a class is extra."""
2042da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
2052da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.require(\'package.Foo.CONSTANT\');',
2062da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'var x = package.Foo.CONSTANT',
2072da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
2082da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
2092da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
2102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertTrue(namespaces_info.IsExtraRequire(token),
2122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                    'The class, not the constant, should be required.');
2132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsExtraRequire_constantNotOnClass(self):
2152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that requiring a constant not on a class is OK."""
2162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
2172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.require(\'package.subpackage.CONSTANT\');',
2182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'var x = package.subpackage.CONSTANT',
2192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
2202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
2212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
2222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2232da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertFalse(namespaces_info.IsExtraRequire(token),
2242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                    'Constants can be required except on classes.');
2252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsExtraRequire_methodNotOnClass(self):
2272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that requiring a method not on a class is OK."""
2282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
2292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.require(\'package.subpackage.method\');',
2302da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'var x = package.subpackage.method()',
2312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
2322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
2332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
2342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertFalse(namespaces_info.IsExtraRequire(token),
2362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                    'Methods can be required except on classes.');
2372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsExtraRequire_defaults(self):
2392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that there are no warnings about extra requires for test utils"""
2402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = ['goog.require(\'goog.testing.jsunit\');']
2412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
2422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['goog'], [])
2432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertFalse(namespaces_info.IsExtraRequire(token),
2452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                     'Should not be extra since it is for testing.')
2462da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testGetMissingProvides_provided(self):
2482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that provided functions don't cause a missing provide."""
2492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
2502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.provide(\'package.Foo\');',
2512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.Foo = function() {};'
2522da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
2532da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
2542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
2552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertEquals(0, len(namespaces_info.GetMissingProvides()))
2572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testGetMissingProvides_providedIdentifier(self):
2592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that provided identifiers don't cause a missing provide."""
2602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
2612da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.provide(\'package.Foo.methodName\');',
2622da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.Foo.methodName = function() {};'
2632da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
2642da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
2652da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
2662da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2672da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertEquals(0, len(namespaces_info.GetMissingProvides()))
2682da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2692da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testGetMissingProvides_providedParentIdentifier(self):
2702da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that provided identifiers on a class don't cause a missing provide
2712da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    on objects attached to that class."""
2722da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
2732da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.provide(\'package.foo.ClassName\');',
2742da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.foo.ClassName.methodName = function() {};',
2752da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.foo.ClassName.ObjectName = 1;',
2762da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
2772da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
2782da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
2792da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2802da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertEquals(0, len(namespaces_info.GetMissingProvides()))
2812da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2822da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testGetMissingProvides_unprovided(self):
2832da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that unprovided functions cause a missing provide."""
2842da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = ['package.Foo = function() {};']
2852da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
2862da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
2872da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2882da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertEquals(1, len(namespaces_info.GetMissingProvides()))
2892da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertTrue('package.Foo' in namespaces_info.GetMissingProvides())
2902da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2912da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testGetMissingProvides_privatefunction(self):
2922da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that unprovided private functions don't cause a missing provide."""
2932da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = ['package.Foo_ = function() {};']
2942da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
2952da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
2962da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2972da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertEquals(0, len(namespaces_info.GetMissingProvides()))
2982da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2992da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testGetMissingProvides_required(self):
3002da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that required namespaces don't cause a missing provide."""
3012da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
3022da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.require(\'package.Foo\');',
3032da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.Foo.methodName = function() {};'
3042da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
3052da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
3062da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
3072da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3082da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertEquals(0, len(namespaces_info.GetMissingProvides()))
3092da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testGetMissingRequires_required(self):
3112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that required namespaces don't cause a missing require."""
3122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
3132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.require(\'package.Foo\');',
3142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.Foo();'
3152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
3162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
3172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
3182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertEquals(0, len(namespaces_info.GetMissingProvides()))
3202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testGetMissingRequires_requiredIdentifier(self):
3222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that required namespaces satisfy identifiers on that namespace."""
3232da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
3242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.require(\'package.Foo\');',
3252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.Foo.methodName();'
3262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
3272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
3282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
3292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3302da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertEquals(0, len(namespaces_info.GetMissingProvides()))
3312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testGetMissingRequires_requiredParentClass(self):
3332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that requiring a parent class of an object is sufficient to prevent
3342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    a missing require on that object."""
3352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
3362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.require(\'package.Foo\');',
3372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.Foo.methodName();',
3382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.Foo.methodName(package.Foo.ObjectName);'
3392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
3402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
3412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
3422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertEquals(0, len(namespaces_info.GetMissingRequires()))
3442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testGetMissingRequires_unrequired(self):
3462da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that unrequired namespaces cause a missing require."""
3472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = ['package.Foo();']
3482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
3492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
3502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertEquals(1, len(namespaces_info.GetMissingRequires()))
3522da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertTrue('package.Foo' in namespaces_info.GetMissingRequires())
3532da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testGetMissingRequires_provided(self):
3552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that provided namespaces satisfy identifiers on that namespace."""
3562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
3572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.provide(\'package.Foo\');',
3582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.Foo.methodName();'
3592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
3602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
3612da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
3622da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3632da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertEquals(0, len(namespaces_info.GetMissingRequires()))
3642da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3652da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testGetMissingRequires_created(self):
3662da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that created namespaces do not satisfy usage of an identifier."""
3672da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
3682da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.Foo = function();',
3692da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.Foo.methodName();'
3702da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
3712da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
3722da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
3732da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3742da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertEquals(1, len(namespaces_info.GetMissingRequires()))
3752da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertTrue('package.Foo' in namespaces_info.GetMissingRequires())
3762da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3772da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testGetMissingRequires_createdIdentifier(self):
3782da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that created identifiers satisfy usage of the identifier."""
3792da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
3802da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.Foo.methodName = function();',
3812da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.Foo.methodName();'
3822da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
3832da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
3842da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
3852da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3862da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertEquals(0, len(namespaces_info.GetMissingRequires()))
3872da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3882da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testGetMissingRequires_objectOnClass(self):
3892da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that we should require a class, not the object on the class."""
3902da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
3912da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.require(\'package.Foo.Enum\');',
3922da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'var x = package.Foo.Enum.VALUE1;',
3932da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
3942da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
3952da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
3962da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3972da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertEquals(1, len(namespaces_info.GetMissingRequires()),
3982da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                    'The whole class, not the object, should be required.');
3992da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4002da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsFirstProvide(self):
4012da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests operation of the isFirstProvide method."""
4022da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
4032da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'goog.provide(\'package.Foo\');',
4042da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.Foo.methodName();'
4052da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
4062da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
4072da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = self._GetInitializedNamespacesInfo(token, ['package'], [])
4082da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4092da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertTrue(namespaces_info.IsFirstProvide(token))
4102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testGetWholeIdentifierString(self):
4122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Tests that created identifiers satisfy usage of the identifier."""
4132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    input_lines = [
4142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'package.Foo.',
4152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '    veryLong.',
4162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '    identifier;'
4172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ]
4182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    token = self._tokenizer.TokenizeFile(input_lines)
4192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = closurizednamespacesinfo.ClosurizedNamespacesInfo([], [])
4202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertEquals('package.Foo.veryLong.identifier',
4222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                      namespaces_info._GetWholeIdentifierString(token))
4232da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertEquals(None,
4242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                      namespaces_info._GetWholeIdentifierString(token.next))
4252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def _GetInitializedNamespacesInfo(self, token, closurized_namespaces,
4272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                                    ignored_extra_namespaces):
4282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Returns a namespaces info initialized with the given token stream."""
4292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    namespaces_info = closurizednamespacesinfo.ClosurizedNamespacesInfo(
4302da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        closurized_namespaces=closurized_namespaces,
4312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        ignored_extra_namespaces=ignored_extra_namespaces)
4322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    state_tracker = javascriptstatetracker.JavaScriptStateTracker()
4332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    while token:
4352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      namespaces_info.ProcessToken(token, state_tracker)
4362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      token = token.next
4372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return namespaces_info
4392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def _GetProvideTokens(self, namespace):
4412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Returns a list of tokens for a goog.require of the given namespace."""
4422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    line_text = 'goog.require(\'' + namespace + '\');\n'
4432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return javascripttokenizer.JavaScriptTokenizer().TokenizeFile([line_text])
4442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def _GetRequireTokens(self, namespace):
4462da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Returns a list of tokens for a goog.require of the given namespace."""
4472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    line_text = 'goog.require(\'' + namespace + '\');\n'
4482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return javascripttokenizer.JavaScriptTokenizer().TokenizeFile([line_text])
4492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4502da489cd246702bee5938545b18a6f710ed214bcJamie Gennisif __name__ == '__main__':
4512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  googletest.main()
452