Home | History | Annotate | Download | only in idl_parser
      1 #!/usr/bin/env python
      2 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 import unittest
      7 
      8 from idl_lexer import IDLLexer
      9 from idl_ppapi_lexer import IDLPPAPILexer
     10 
     11 #
     12 # FileToTokens
     13 #
     14 # From a source file generate a list of tokens.
     15 #
     16 def FileToTokens(lexer, filename):
     17   with open(filename, 'rb') as srcfile:
     18     lexer.Tokenize(srcfile.read(), filename)
     19     return lexer.GetTokens()
     20 
     21 
     22 #
     23 # TextToTokens
     24 #
     25 # From a source file generate a list of tokens.
     26 #
     27 def TextToTokens(lexer, text):
     28   lexer.Tokenize(text)
     29   return lexer.GetTokens()
     30 
     31 
     32 class WebIDLLexer(unittest.TestCase):
     33   def setUp(self):
     34     self.lexer = IDLLexer()
     35     self.filenames = [
     36         'test_lexer/values.in',
     37         'test_lexer/keywords.in'
     38     ]
     39 
     40   #
     41   # testRebuildText
     42   #
     43   # From a set of tokens, generate a new source text by joining with a
     44   # single space.  The new source is then tokenized and compared against the
     45   # old set.
     46   #
     47   def testRebuildText(self):
     48     for filename in self.filenames:
     49       tokens1 = FileToTokens(self.lexer, filename)
     50       to_text = '\n'.join(['%s' % t.value for t in tokens1])
     51       tokens2 = TextToTokens(self.lexer, to_text)
     52 
     53       count1 = len(tokens1)
     54       count2 = len(tokens2)
     55       self.assertEqual(count1, count2)
     56 
     57       for i in range(count1):
     58         msg = 'Value %s does not match original %s on line %d of %s.' % (
     59               tokens2[i].value, tokens1[i].value, tokens1[i].lineno, filename)
     60         self.assertEqual(tokens1[i].value, tokens2[i].value, msg)
     61 
     62   #
     63   # testExpectedType
     64   #
     65   # From a set of tokens pairs, verify the type field of the second matches
     66   # the value of the first, so that:
     67   # integer 123 float 1.1 ...
     68   # will generate a passing test, when the first token has both the type and
     69   # value of the keyword integer and the second has the type of integer and
     70   # value of 123 and so on.
     71   #
     72   def testExpectedType(self):
     73     for filename in self.filenames:
     74       tokens = FileToTokens(self.lexer, filename)
     75       count = len(tokens)
     76       self.assertTrue(count > 0)
     77       self.assertFalse(count & 1)
     78 
     79       index = 0
     80       while index < count:
     81         expect_type = tokens[index].value
     82         actual_type = tokens[index + 1].type
     83         msg = 'Type %s does not match expected %s on line %d of %s.' % (
     84               actual_type, expect_type, tokens[index].lineno, filename)
     85         index += 2
     86         self.assertEqual(expect_type, actual_type, msg)
     87 
     88 
     89 class PepperIDLLexer(WebIDLLexer):
     90   def setUp(self):
     91     self.lexer = IDLPPAPILexer()
     92     self.filenames = [
     93         'test_lexer/values_ppapi.in',
     94         'test_lexer/keywords_ppapi.in'
     95     ]
     96 
     97 
     98 if __name__ == '__main__':
     99   unittest.main()
    100