15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright 2010 The Closure Linter Authors. All Rights Reserved.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Licensed under the Apache License, Version 2.0 (the "License");
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# you may not use this file except in compliance with the License.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# You may obtain a copy of the License at
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#      http://www.apache.org/licenses/LICENSE-2.0
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Unless required by applicable law or agreed to in writing, software
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# distributed under the License is distributed on an "AS-IS" BASIS,
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# See the License for the specific language governing permissions and
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# limitations under the License.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Unit tests for ClosurizedNamespacesInfo."""
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import unittest as googletest
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from closure_linter import aliaspass
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from closure_linter import closurizednamespacesinfo
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from closure_linter import ecmametadatapass
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from closure_linter import javascriptstatetracker
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from closure_linter import javascripttokens
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from closure_linter import testutil
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from closure_linter import tokenutil
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# pylint: disable=g-bad-name
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TokenType = javascripttokens.JavaScriptTokenType
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClosurizedNamespacesInfoTest(googletest.TestCase):
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Tests for ClosurizedNamespacesInfo."""
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _test_cases = {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'goog.global.anything': None,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.CONSTANT': 'package',
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.methodName': 'package',
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.subpackage.methodName': 'package.subpackage',
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.subpackage.methodName.apply': 'package.subpackage',
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.ClassName.something': 'package.ClassName',
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.ClassName.Enum.VALUE.methodName': 'package.ClassName',
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.ClassName.CONSTANT': 'package.ClassName',
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.namespace.CONSTANT.methodName': 'package.namespace',
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.ClassName.inherits': 'package.ClassName',
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.ClassName.apply': 'package.ClassName',
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.ClassName.methodName.apply': 'package.ClassName',
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.ClassName.methodName.call': 'package.ClassName',
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.ClassName.prototype.methodName': 'package.ClassName',
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.ClassName.privateMethod_': 'package.ClassName',
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.className.privateProperty_': 'package.className',
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.className.privateProperty_.methodName': 'package.className',
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.ClassName.PrivateEnum_': 'package.ClassName',
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.ClassName.prototype.methodName.apply': 'package.ClassName',
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.ClassName.property.subProperty': 'package.ClassName',
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'package.className.prototype.something.somethingElse': 'package.className'
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetClosurizedNamespace(self):
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that the correct namespace is returned for various identifiers."""
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    namespaces_info = closurizednamespacesinfo.ClosurizedNamespacesInfo(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        closurized_namespaces=['package'], ignored_extra_namespaces=[])
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for identifier, expected_namespace in self._test_cases.items():
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      actual_namespace = namespaces_info.GetClosurizedNamespace(identifier)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEqual(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          expected_namespace,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          actual_namespace,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'expected namespace "' + str(expected_namespace) +
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          '" for identifier "' + str(identifier) + '" but was "' +
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          str(actual_namespace) + '"')
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIgnoredExtraNamespaces(self):
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that ignored_extra_namespaces are ignored."""
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    token = self._GetRequireTokens('package.Something')
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    namespaces_info = closurizednamespacesinfo.ClosurizedNamespacesInfo(
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        closurized_namespaces=['package'],
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ignored_extra_namespaces=['package.Something'])
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(namespaces_info.IsExtraRequire(token),
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     'Should be valid since it is in ignored namespaces.')
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    namespaces_info = closurizednamespacesinfo.ClosurizedNamespacesInfo(
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ['package'], [])
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(namespaces_info.IsExtraRequire(token),
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'Should be invalid since it is not in ignored namespaces.')
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIsExtraProvide_created(self):
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that provides for created namespaces are not extra."""
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.provide(\'package.Foo\');',
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.Foo = function() {};'
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token, namespaces_info = self._GetStartTokenAndNamespacesInfoForScript(
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        input_lines, ['package'])
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(namespaces_info.IsExtraProvide(token),
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     'Should not be extra since it is created.')
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIsExtraProvide_createdIdentifier(self):
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that provides for created identifiers are not extra."""
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.provide(\'package.Foo.methodName\');',
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.Foo.methodName = function() {};'
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token, namespaces_info = self._GetStartTokenAndNamespacesInfoForScript(
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        input_lines, ['package'])
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(namespaces_info.IsExtraProvide(token),
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     'Should not be extra since it is created.')
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIsExtraProvide_notCreated(self):
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that provides for non-created namespaces are extra."""
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = ['goog.provide(\'package.Foo\');']
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token, namespaces_info = self._GetStartTokenAndNamespacesInfoForScript(
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        input_lines, ['package'])
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(namespaces_info.IsExtraProvide(token),
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'Should be extra since it is not created.')
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIsExtraProvide_duplicate(self):
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that providing a namespace twice makes the second one extra."""
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.provide(\'package.Foo\');',
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.provide(\'package.Foo\');',
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.Foo = function() {};'
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token, namespaces_info = self._GetStartTokenAndNamespacesInfoForScript(
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        input_lines, ['package'])
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Advance to the second goog.provide token.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    token = tokenutil.Search(token.next, TokenType.IDENTIFIER)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(namespaces_info.IsExtraProvide(token),
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'Should be extra since it is already provided.')
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIsExtraProvide_notClosurized(self):
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that provides of non-closurized namespaces are not extra."""
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = ['goog.provide(\'notclosurized.Foo\');']
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token, namespaces_info = self._GetStartTokenAndNamespacesInfoForScript(
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        input_lines, ['package'])
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(namespaces_info.IsExtraProvide(token),
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     'Should not be extra since it is not closurized.')
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIsExtraRequire_used(self):
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that requires for used namespaces are not extra."""
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.Foo\');',
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var x = package.Foo.methodName();'
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token, namespaces_info = self._GetStartTokenAndNamespacesInfoForScript(
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        input_lines, ['package'])
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(namespaces_info.IsExtraRequire(token),
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     'Should not be extra since it is used.')
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIsExtraRequire_usedIdentifier(self):
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that requires for used methods on classes are extra."""
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.Foo.methodName\');',
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var x = package.Foo.methodName();'
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token, namespaces_info = self._GetStartTokenAndNamespacesInfoForScript(
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        input_lines, ['package'])
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(namespaces_info.IsExtraRequire(token),
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'Should require the package, not the method specifically.')
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIsExtraRequire_notUsed(self):
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that requires for unused namespaces are extra."""
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = ['goog.require(\'package.Foo\');']
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token, namespaces_info = self._GetStartTokenAndNamespacesInfoForScript(
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        input_lines, ['package'])
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(namespaces_info.IsExtraRequire(token),
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'Should be extra since it is not used.')
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIsExtraRequire_notClosurized(self):
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that requires of non-closurized namespaces are not extra."""
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = ['goog.require(\'notclosurized.Foo\');']
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token, namespaces_info = self._GetStartTokenAndNamespacesInfoForScript(
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        input_lines, ['package'])
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(namespaces_info.IsExtraRequire(token),
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     'Should not be extra since it is not closurized.')
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIsExtraRequire_objectOnClass(self):
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that requiring an object on a class is extra."""
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.Foo.Enum\');',
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var x = package.Foo.Enum.VALUE1;',
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token, namespaces_info = self._GetStartTokenAndNamespacesInfoForScript(
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        input_lines, ['package'])
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(namespaces_info.IsExtraRequire(token),
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'The whole class, not the object, should be required.');
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIsExtraRequire_constantOnClass(self):
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that requiring a constant on a class is extra."""
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.Foo.CONSTANT\');',
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var x = package.Foo.CONSTANT',
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token, namespaces_info = self._GetStartTokenAndNamespacesInfoForScript(
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        input_lines, ['package'])
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(namespaces_info.IsExtraRequire(token),
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'The class, not the constant, should be required.');
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIsExtraRequire_constantNotOnClass(self):
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that requiring a constant not on a class is OK."""
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.subpackage.CONSTANT\');',
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var x = package.subpackage.CONSTANT',
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token, namespaces_info = self._GetStartTokenAndNamespacesInfoForScript(
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        input_lines, ['package'])
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(namespaces_info.IsExtraRequire(token),
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'Constants can be required except on classes.');
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIsExtraRequire_methodNotOnClass(self):
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that requiring a method not on a class is OK."""
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.subpackage.method\');',
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var x = package.subpackage.method()',
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token, namespaces_info = self._GetStartTokenAndNamespacesInfoForScript(
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        input_lines, ['package'])
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(namespaces_info.IsExtraRequire(token),
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'Methods can be required except on classes.');
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIsExtraRequire_defaults(self):
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that there are no warnings about extra requires for test utils"""
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = ['goog.require(\'goog.testing.jsunit\');']
2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token, namespaces_info = self._GetStartTokenAndNamespacesInfoForScript(
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        input_lines, ['goog'])
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(namespaces_info.IsExtraRequire(token),
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     'Should not be extra since it is for testing.')
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetMissingProvides_provided(self):
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that provided functions don't cause a missing provide."""
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.provide(\'package.Foo\');',
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.Foo = function() {};'
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(
2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        input_lines, ['package'])
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(0, len(namespaces_info.GetMissingProvides()))
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetMissingProvides_providedIdentifier(self):
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that provided identifiers don't cause a missing provide."""
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.provide(\'package.Foo.methodName\');',
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.Foo.methodName = function() {};'
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['package'])
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(0, len(namespaces_info.GetMissingProvides()))
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetMissingProvides_providedParentIdentifier(self):
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that provided identifiers on a class don't cause a missing provide
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    on objects attached to that class."""
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.provide(\'package.foo.ClassName\');',
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.foo.ClassName.methodName = function() {};',
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.foo.ClassName.ObjectName = 1;',
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['package'])
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(0, len(namespaces_info.GetMissingProvides()))
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetMissingProvides_unprovided(self):
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that unprovided functions cause a missing provide."""
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = ['package.Foo = function() {};']
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['package'])
3005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    missing_provides = namespaces_info.GetMissingProvides()
3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(1, len(missing_provides))
3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    missing_provide = missing_provides.popitem()
3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals('package.Foo', missing_provide[0])
3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(1, missing_provide[1])
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetMissingProvides_privatefunction(self):
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that unprovided private functions don't cause a missing provide."""
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = ['package.Foo_ = function() {};']
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['package'])
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(0, len(namespaces_info.GetMissingProvides()))
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetMissingProvides_required(self):
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that required namespaces don't cause a missing provide."""
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.Foo\');',
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.Foo.methodName = function() {};'
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['package'])
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(0, len(namespaces_info.GetMissingProvides()))
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetMissingRequires_required(self):
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that required namespaces don't cause a missing require."""
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.Foo\');',
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.Foo();'
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['package'])
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(0, len(namespaces_info.GetMissingProvides()))
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetMissingRequires_requiredIdentifier(self):
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that required namespaces satisfy identifiers on that namespace."""
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.Foo\');',
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.Foo.methodName();'
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['package'])
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(0, len(namespaces_info.GetMissingProvides()))
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetMissingRequires_requiredParentClass(self):
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that requiring a parent class of an object is sufficient to prevent
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    a missing require on that object."""
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.Foo\');',
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.Foo.methodName();',
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.Foo.methodName(package.Foo.ObjectName);'
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['package'])
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(0, len(namespaces_info.GetMissingRequires()))
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetMissingRequires_unrequired(self):
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that unrequired namespaces cause a missing require."""
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = ['package.Foo();']
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['package'])
3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    missing_requires = namespaces_info.GetMissingRequires()
3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(1, len(missing_requires))
3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    missing_req = missing_requires.popitem()
3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals('package.Foo', missing_req[0])
3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(1, missing_req[1])
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetMissingRequires_provided(self):
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that provided namespaces satisfy identifiers on that namespace."""
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.provide(\'package.Foo\');',
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.Foo.methodName();'
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['package'])
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(0, len(namespaces_info.GetMissingRequires()))
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetMissingRequires_created(self):
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that created namespaces do not satisfy usage of an identifier."""
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.Foo = function();',
3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'package.Foo.methodName();',
3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'package.Foo.anotherMethodName1();',
3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'package.Foo.anotherMethodName2();'
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['package'])
3885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    missing_requires = namespaces_info.GetMissingRequires()
3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(1, len(missing_requires))
3915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    missing_require = missing_requires.popitem()
3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals('package.Foo', missing_require[0])
3935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # Make sure line number of first occurrence is reported
3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(2, missing_require[1])
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetMissingRequires_createdIdentifier(self):
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that created identifiers satisfy usage of the identifier."""
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.Foo.methodName = function();',
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.Foo.methodName();'
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['package'])
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(0, len(namespaces_info.GetMissingRequires()))
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetMissingRequires_objectOnClass(self):
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that we should require a class, not the object on the class."""
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.Foo.Enum\');',
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var x = package.Foo.Enum.VALUE1;',
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['package'])
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(1, len(namespaces_info.GetMissingRequires()),
4155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      'The whole class, not the object, should be required.')
4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testGetMissingRequires_variableWithSameName(self):
4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """Tests that we should not goog.require variables and parameters.
4195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    b/5362203 Variables in scope are not missing namespaces.
4215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
4225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    input_lines = [
4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.provide(\'Foo\');',
4245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'Foo.A = function();',
4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'Foo.A.prototype.method = function(ab) {',
4265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '  if (ab) {',
4275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '    var docs;',
4285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '    var lvalue = new Obj();',
4295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '    // Variable in scope hence not goog.require here.',
4305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '    docs.foo.abc = 1;',
4315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '    lvalue.next();',
4325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '  }',
4335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '  // Since js is function scope this should also not goog.require.',
4345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '  docs.foo.func();',
4355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '  // Its not a variable in scope hence goog.require.',
4365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '  dummy.xyz.reset();',
4375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ' return this.method2();',
4385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '};',
4395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'Foo.A.prototype.method1 = function(docs, abcd, xyz) {',
4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '  // Parameter hence not goog.require.',
4415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '  docs.nodes.length = 2;',
4425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '  lvalue.abc.reset();',
4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '};'
4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ]
4455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['Foo',
4475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                                     'docs',
4485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                                     'lvalue',
4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                                     'dummy'])
4505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    missing_requires = namespaces_info.GetMissingRequires()
4515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(2, len(missing_requires))
4525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertItemsEqual(
4535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        {'dummy.xyz': 14,
4545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         'lvalue.abc': 20}, missing_requires)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testIsFirstProvide(self):
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests operation of the isFirstProvide method."""
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.provide(\'package.Foo\');',
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.Foo.methodName();'
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token, namespaces_info = self._GetStartTokenAndNamespacesInfoForScript(
4645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        input_lines, ['package'])
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(namespaces_info.IsFirstProvide(token))
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetWholeIdentifierString(self):
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that created identifiers satisfy usage of the identifier."""
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'package.Foo.',
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '    veryLong.',
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '    identifier;'
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
4745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token = testutil.TokenizeSource(input_lines)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals('package.Foo.veryLong.identifier',
4785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      tokenutil.GetIdentifierForToken(token))
4795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(None,
4815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      tokenutil.GetIdentifierForToken(token.next))
4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testScopified(self):
4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """Tests that a goog.scope call is noticed."""
4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    input_lines = [
4865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.scope(function() {',
4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '});'
4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ]
4895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['goog'])
4915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertTrue(namespaces_info._scopified_file)
4925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testScope_unusedAlias(self):
4945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """Tests that an used alias symbol doesn't result in a require."""
4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    input_lines = [
4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.scope(function() {',
4975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'var Event = goog.events.Event;',
4985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '});'
4995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ]
5005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['goog'])
5025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    missing_requires = namespaces_info.GetMissingRequires()
5035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals({}, missing_requires)
5045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testScope_usedAlias(self):
5065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """Tests that aliased symbols result in correct requires."""
5075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    input_lines = [
5085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.scope(function() {',
5095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'var Event = goog.events.Event;',
5105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'var dom = goog.dom;',
5115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'Event(dom.classes.get);',
5125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '});'
5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ]
5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['goog'])
5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    missing_requires = namespaces_info.GetMissingRequires()
5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals({'goog.dom.classes': 4, 'goog.events.Event': 4},
5185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      missing_requires)
5195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testScope_provides(self):
5215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """Tests that aliased symbols result in correct provides."""
5225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    input_lines = [
5235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.scope(function() {',
5245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.bar = {};',
5255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'var bar = goog.bar;',
5265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'bar.Foo = {};',
5275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '});'
5285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ]
5295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript(input_lines, ['goog'])
5315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    missing_provides = namespaces_info.GetMissingProvides()
5325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals({'goog.bar.Foo': 4}, missing_provides)
5335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testSetTestOnlyNamespaces(self):
5355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """Tests that a namespace in setTestOnly makes it a valid provide."""
5365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript([
5375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.setTestOnly(\'goog.foo.barTest\');'
5385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ], ['goog'])
5395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token = self._GetProvideTokens('goog.foo.barTest')
5415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertFalse(namespaces_info.IsExtraProvide(token))
5425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token = self._GetProvideTokens('goog.foo.bazTest')
5445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertTrue(namespaces_info.IsExtraProvide(token))
5455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testSetTestOnlyComment(self):
5475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """Ensure a comment in setTestOnly does not cause a created namespace."""
5485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    namespaces_info = self._GetNamespacesInfoForScript([
5495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.setTestOnly(\'this is a comment\');'
5505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ], ['goog'])
5515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(
5535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        [], namespaces_info._created_namespaces,
5545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'A comment in setTestOnly should not modify created namespaces.')
5555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def _GetNamespacesInfoForScript(self, script, closurized_namespaces=None):
5575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    _, namespaces_info = self._GetStartTokenAndNamespacesInfoForScript(
5585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        script, closurized_namespaces)
5595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return namespaces_info
5615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def _GetStartTokenAndNamespacesInfoForScript(
5635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      self, script, closurized_namespaces):
5645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token = testutil.TokenizeSource(script)
5665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return token, self._GetInitializedNamespacesInfo(
5675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        token, closurized_namespaces, [])
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _GetInitializedNamespacesInfo(self, token, closurized_namespaces,
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    ignored_extra_namespaces):
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Returns a namespaces info initialized with the given token stream."""
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    namespaces_info = closurizednamespacesinfo.ClosurizedNamespacesInfo(
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        closurized_namespaces=closurized_namespaces,
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ignored_extra_namespaces=ignored_extra_namespaces)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_tracker = javascriptstatetracker.JavaScriptStateTracker()
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ecma_pass = ecmametadatapass.EcmaMetaDataPass()
5785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ecma_pass.Process(token)
5795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    alias_pass = aliaspass.AliasPass(closurized_namespaces)
5815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    alias_pass.Process(token)
5825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while token:
5845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      state_tracker.HandleToken(token, state_tracker.GetLastNonSpaceToken())
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      namespaces_info.ProcessToken(token, state_tracker)
5865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      state_tracker.HandleAfterToken(token)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      token = token.next
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return namespaces_info
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _GetProvideTokens(self, namespace):
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Returns a list of tokens for a goog.require of the given namespace."""
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    line_text = 'goog.require(\'' + namespace + '\');\n'
5945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return testutil.TokenizeSource([line_text])
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _GetRequireTokens(self, namespace):
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Returns a list of tokens for a goog.require of the given namespace."""
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    line_text = 'goog.require(\'' + namespace + '\');\n'
5995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return testutil.TokenizeSource([line_text])
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  googletest.main()
603