15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright 2012 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 RequireProvideSorter."""
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import unittest as googletest
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from closure_linter import javascripttokens
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from closure_linter import requireprovidesorter
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from closure_linter import testutil
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# pylint: disable=g-bad-name
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TokenType = javascripttokens.JavaScriptTokenType
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RequireProvideSorterTest(googletest.TestCase):
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Tests for RequireProvideSorter."""
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testGetFixedProvideString(self):
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """Tests that fixed string constains proper comments also."""
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    input_lines = [
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.provide(\'package.xyz\');',
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '/** @suppress {extraprovide} **/',
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.provide(\'package.abcd\');'
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ]
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    expected_lines = [
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '/** @suppress {extraprovide} **/',
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.provide(\'package.abcd\');',
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.provide(\'package.xyz\');'
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ]
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token = testutil.TokenizeSourceAndRunEcmaPass(input_lines)
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    sorter = requireprovidesorter.RequireProvideSorter()
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    fixed_provide_string = sorter.GetFixedProvideString(token)
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(expected_lines, fixed_provide_string.splitlines())
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testGetFixedRequireString(self):
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """Tests that fixed string constains proper comments also."""
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    input_lines = [
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.require(\'package.xyz\');',
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '/** This is needed for scope. **/',
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.require(\'package.abcd\');'
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ]
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    expected_lines = [
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '/** This is needed for scope. **/',
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.require(\'package.abcd\');',
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.require(\'package.xyz\');'
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ]
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token = testutil.TokenizeSourceAndRunEcmaPass(input_lines)
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    sorter = requireprovidesorter.RequireProvideSorter()
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    fixed_require_string = sorter.GetFixedRequireString(token)
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(expected_lines, fixed_require_string.splitlines())
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testFixRequires_removeBlankLines(self):
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that blank lines are omitted in sorted goog.require statements."""
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.provide(\'package.subpackage.Whatever\');',
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '',
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.subpackage.ClassB\');',
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '',
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.subpackage.ClassA\');'
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_lines = [
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.provide(\'package.subpackage.Whatever\');',
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '',
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.subpackage.ClassA\');',
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.subpackage.ClassB\');'
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token = testutil.TokenizeSourceAndRunEcmaPass(input_lines)
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    sorter = requireprovidesorter.RequireProvideSorter()
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    sorter.FixRequires(token)
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(expected_lines, self._GetLines(token))
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def fixRequiresTest_withTestOnly(self, position):
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """Regression-tests sorting even with a goog.setTestOnly statement.
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Args:
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      position: The position in the list where to insert the goog.setTestOnly
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                statement. Will be used to test all possible combinations for
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                this test.
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    input_lines = [
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.provide(\'package.subpackage.Whatever\');',
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '',
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.require(\'package.subpackage.ClassB\');',
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.require(\'package.subpackage.ClassA\');'
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ]
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    expected_lines = [
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.provide(\'package.subpackage.Whatever\');',
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '',
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.require(\'package.subpackage.ClassA\');',
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'goog.require(\'package.subpackage.ClassB\');'
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ]
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    input_lines.insert(position, 'goog.setTestOnly();')
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    expected_lines.insert(position, 'goog.setTestOnly();')
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token = testutil.TokenizeSourceAndRunEcmaPass(input_lines)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sorter = requireprovidesorter.RequireProvideSorter()
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sorter.FixRequires(token)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(expected_lines, self._GetLines(token))
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testFixRequires_withTestOnly(self):
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """Regression-tests sorting even after a goog.setTestOnly statement."""
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # goog.setTestOnly at first line.
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.fixRequiresTest_withTestOnly(position=0)
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # goog.setTestOnly after goog.provide.
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.fixRequiresTest_withTestOnly(position=1)
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # goog.setTestOnly before goog.require.
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.fixRequiresTest_withTestOnly(position=2)
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # goog.setTestOnly after goog.require.
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.fixRequiresTest_withTestOnly(position=4)
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _GetLines(self, token):
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Returns an array of lines based on the specified token stream."""
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lines = []
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    line = ''
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while token:
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      line += token.string
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if token.IsLastInLine():
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        lines.append(line)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        line = ''
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      token = token.next
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return lines
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  googletest.main()
156