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