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 ecmametadatapass
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from closure_linter import javascripttokenizer
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from closure_linter import javascripttokens
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from closure_linter import requireprovidesorter
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# pylint: disable-msg=C6409
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TokenType = javascripttokens.JavaScriptTokenType
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RequireProvideSorterTest(googletest.TestCase):
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Tests for RequireProvideSorter."""
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _tokenizer = javascripttokenizer.JavaScriptTokenizer()
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _metadata_pass = ecmametadatapass.EcmaMetaDataPass()
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testFixRequires_removeBlankLines(self):
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that blank lines are omitted in sorted goog.require statements."""
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_lines = [
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.provide(\'package.subpackage.Whatever\');',
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '',
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.subpackage.ClassB\');',
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '',
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.subpackage.ClassA\');'
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_lines = [
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.provide(\'package.subpackage.Whatever\');',
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '',
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.subpackage.ClassA\');',
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goog.require(\'package.subpackage.ClassB\');'
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    token = self._tokenizer.TokenizeFile(input_lines)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._metadata_pass.Reset()
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._metadata_pass.Process(token)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sorter = requireprovidesorter.RequireProvideSorter()
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sorter.FixRequires(token)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(expected_lines, self._GetLines(token))
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _GetLines(self, token):
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Returns an array of lines based on the specified token stream."""
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lines = []
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    line = ''
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while token:
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      line += token.string
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if token.IsLastInLine():
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        lines.append(line)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        line = ''
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      token = token.next
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return lines
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  googletest.main()
75