|
| 1 | +import unittest |
| 2 | +import logging |
| 3 | + |
| 4 | +from ply.lex import LexToken |
| 5 | + |
| 6 | +from typelanguage.lexer import TypeLexer |
| 7 | +from typelanguage.types import * |
| 8 | + |
| 9 | +class TestLexer(unittest.TestCase): |
| 10 | + |
| 11 | + def token(self, value, ty=None): |
| 12 | + t = LexToken() |
| 13 | + t.type = ty if ty != None else value |
| 14 | + t.value = value |
| 15 | + t.lineno = -1 |
| 16 | + t.lexpos = -1 |
| 17 | + return t |
| 18 | + |
| 19 | + def assert_lex_equiv(self, s, stream2): |
| 20 | + # NOTE: lexer fails to reset after call? |
| 21 | + l = TypeLexer(debug=True) |
| 22 | + stream1 = list(l.tokenize(s)) # Save the stream for debug output when a test fails |
| 23 | + stream2 = list(stream2) |
| 24 | + assert len(stream1) == len(stream2) |
| 25 | + for token1, token2 in zip(stream1, stream2): |
| 26 | + print token1, token2 |
| 27 | + assert token1.type == token2.type |
| 28 | + assert token1.value == token2.value |
| 29 | + |
| 30 | + @classmethod |
| 31 | + def setup_class(cls): |
| 32 | + logging.basicConfig() |
| 33 | + |
| 34 | + def test_simple_inputs(self): |
| 35 | + self.assert_lex_equiv('int', [self.token('int', 'ID')]) |
| 36 | + self.assert_lex_equiv('[int]', [self.token('['), self.token('int', 'ID'), self.token(']')]) |
| 37 | + self.assert_lex_equiv('int -> int', [self.token('int', 'ID'), self.token('->', 'ARROW'), self.token('int', 'ID')]) |
| 38 | + self.assert_lex_equiv('*a', [self.token('*'), self.token('a', 'ID')]) |
| 39 | + self.assert_lex_equiv('**a', [self.token('**', 'KWARGS'), self.token('a', 'ID')]) |
| 40 | + self.assert_lex_equiv('*x, **a', [self.token('*'), self.token('x', 'ID'), self.token(','), self.token('**', 'KWARGS'), self.token('a', 'ID')]) |
0 commit comments