12da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#!/usr/bin/env python
22da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Copyright 2011 The Closure Linter Authors. All Rights Reserved.
32da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
42da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Licensed under the Apache License, Version 2.0 (the "License");
52da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# you may not use this file except in compliance with the License.
62da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# You may obtain a copy of the License at
72da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
82da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#      http://www.apache.org/licenses/LICENSE-2.0
92da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Unless required by applicable law or agreed to in writing, software
112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# distributed under the License is distributed on an "AS-IS" BASIS,
122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# See the License for the specific language governing permissions and
142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# limitations under the License.
152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
192da489cd246702bee5938545b18a6f710ed214bcJamie Gennisimport unittest as googletest
202da489cd246702bee5938545b18a6f710ed214bcJamie Gennisfrom closure_linter.common import tokens
212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
232da489cd246702bee5938545b18a6f710ed214bcJamie Gennisdef _CreateDummyToken():
242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  return tokens.Token('foo', None, 1, 1)
252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
272da489cd246702bee5938545b18a6f710ed214bcJamie Gennisdef _CreateDummyTokens(count):
282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  dummy_tokens = []
292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  for _ in xrange(count):
302da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    dummy_tokens.append(_CreateDummyToken())
312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  return dummy_tokens
322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
342da489cd246702bee5938545b18a6f710ed214bcJamie Gennisdef _SetTokensAsNeighbors(neighbor_tokens):
352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  for i in xrange(len(neighbor_tokens)):
362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    prev_index = i - 1
372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    next_index = i + 1
382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    if prev_index >= 0:
402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      neighbor_tokens[i].previous = neighbor_tokens[prev_index]
412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    if next_index < len(neighbor_tokens):
432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      neighbor_tokens[i].next = neighbor_tokens[next_index]
442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
462da489cd246702bee5938545b18a6f710ed214bcJamie Gennisclass TokensTest(googletest.TestCase):
472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsFirstInLine(self):
492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    # First token in file (has no previous).
512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertTrue(_CreateDummyToken().IsFirstInLine())
522da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
532da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    a, b = _CreateDummyTokens(2)
542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    _SetTokensAsNeighbors([a, b])
552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    # Tokens on same line
572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    a.line_number = 30
582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    b.line_number = 30
592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertFalse(b.IsFirstInLine())
612da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
622da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    # Tokens on different lines
632da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    b.line_number = 31
642da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertTrue(b.IsFirstInLine())
652da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
662da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsLastInLine(self):
672da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    # Last token in file (has no next).
682da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertTrue(_CreateDummyToken().IsLastInLine())
692da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
702da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    a, b = _CreateDummyTokens(2)
712da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    _SetTokensAsNeighbors([a, b])
722da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
732da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    # Tokens on same line
742da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    a.line_number = 30
752da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    b.line_number = 30
762da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertFalse(a.IsLastInLine())
772da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
782da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    b.line_number = 31
792da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertTrue(a.IsLastInLine())
802da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
812da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsType(self):
822da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    a = tokens.Token('foo', 'fakeType1', 1, 1)
832da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertTrue(a.IsType('fakeType1'))
842da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertFalse(a.IsType('fakeType2'))
852da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
862da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIsAnyType(self):
872da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    a = tokens.Token('foo', 'fakeType1', 1, 1)
882da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertTrue(a.IsAnyType(['fakeType1', 'fakeType2']))
892da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertFalse(a.IsAnyType(['fakeType3', 'fakeType4']))
902da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
912da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testRepr(self):
922da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    a = tokens.Token('foo', 'fakeType1', 1, 1)
932da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertEquals('<Token: fakeType1, "foo", None, 1, None>', str(a))
942da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
952da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testIter(self):
962da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    dummy_tokens = _CreateDummyTokens(5)
972da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    _SetTokensAsNeighbors(dummy_tokens)
982da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    a, b, c, d, e = dummy_tokens
992da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1002da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    i = iter(a)
1012da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertListEqual([a, b, c, d, e], list(i))
1022da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1032da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def testReverseIter(self):
1042da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    dummy_tokens = _CreateDummyTokens(5)
1052da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    _SetTokensAsNeighbors(dummy_tokens)
1062da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    a, b, c, d, e = dummy_tokens
1072da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1082da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ri = reversed(e)
1092da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.assertListEqual([e, d, c, b, a], list(ri))
1102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1122da489cd246702bee5938545b18a6f710ed214bcJamie Gennisif __name__ == '__main__':
1132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  googletest.main()
114