15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#!/usr/bin/env python
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Copyright 2012 The Closure Linter Authors. All Rights Reserved.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Licensed under the Apache License, Version 2.0 (the "License");
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# you may not use this file except in compliance with the License.
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# You may obtain a copy of the License at
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#      http://www.apache.org/licenses/LICENSE-2.0
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Unless required by applicable law or agreed to in writing, software
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# distributed under the License is distributed on an "AS-IS" BASIS,
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# See the License for the specific language governing permissions and
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# limitations under the License.
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)"""Unit tests for the statetracker module."""
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Allow non-Google copyright
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# pylint: disable=g-bad-file-header
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)__author__ = ('nnaze@google.com (Nathan Naze)')
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import unittest as googletest
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from closure_linter import javascripttokens
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from closure_linter import statetracker
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from closure_linter import testutil
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class _FakeDocFlag(object):
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def __repr__(self):
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return '@%s %s' % (self.flag_type, self.name)
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class IdentifierTest(googletest.TestCase):
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testJustIdentifier(self):
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    a = javascripttokens.JavaScriptToken(
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'abc', javascripttokens.JavaScriptTokenType.IDENTIFIER, 'abc', 1)
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    st = statetracker.StateTracker()
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    st.HandleToken(a, None)
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class DocCommentTest(googletest.TestCase):
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  @staticmethod
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def _MakeDocFlagFake(flag_type, name=None):
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    flag = _FakeDocFlag()
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    flag.flag_type = flag_type
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    flag.name = name
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return flag
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testDocFlags(self):
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    comment = statetracker.DocComment(None)
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    a = self._MakeDocFlagFake('param', 'foo')
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    comment.AddFlag(a)
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    b = self._MakeDocFlagFake('param', '')
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    comment.AddFlag(b)
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    c = self._MakeDocFlagFake('param', 'bar')
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    comment.AddFlag(c)
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ['foo', 'bar'],
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        comment.ordered_params)
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        [a, b, c],
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        comment.GetDocFlags())
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testInvalidate(self):
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    comment = statetracker.DocComment(None)
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertFalse(comment.invalidated)
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertFalse(comment.IsInvalidated())
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    comment.Invalidate()
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertTrue(comment.invalidated)
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertTrue(comment.IsInvalidated())
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testSuppressionOnly(self):
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    comment = statetracker.DocComment(None)
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertFalse(comment.SuppressionOnly())
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    comment.AddFlag(self._MakeDocFlagFake('suppress'))
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertTrue(comment.SuppressionOnly())
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    comment.AddFlag(self._MakeDocFlagFake('foo'))
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertFalse(comment.SuppressionOnly())
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testRepr(self):
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    comment = statetracker.DocComment(None)
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    comment.AddFlag(self._MakeDocFlagFake('param', 'foo'))
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    comment.AddFlag(self._MakeDocFlagFake('param', 'bar'))
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '<DocComment: [\'foo\', \'bar\'], [@param foo, @param bar]>',
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        repr(comment))
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testDocFlagParam(self):
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    comment = self._ParseComment("""
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    /**
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * @param {string} [name] Name of customer.
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     */""")
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    flag = comment.GetFlag('param')
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals('string', flag.type)
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals('[name]', flag.name)
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def _ParseComment(self, script):
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """Parse a script that contains one comment and return it."""
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    _, comments = testutil.ParseFunctionsAndComments(script)
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(1, len(comments))
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return comments[0]
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)if __name__ == '__main__':
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  googletest.main()
123