- add sources.
[platform/framework/web/crosswalk.git] / src / tools / idl_parser / idl_lexer_test.py
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()