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