|
1 | | -import pytest |
2 | | -from lexers.python.pythonlexer import PythonLexer |
3 | | -from lexers.token import TokenType |
4 | | - |
5 | | -# Helper function to compare token lists, ignoring EOF |
6 | | -def assert_tokens_equal(actual_tokens, expected_tokens_data): |
7 | | - # Remove EOF token if present |
8 | | - if actual_tokens and actual_tokens[-1].type == TokenType.EOF: |
9 | | - actual_tokens = actual_tokens[:-1] |
| 1 | +# import pytest |
| 2 | +# from lexers.python.pythonlexer import PythonLexer |
| 3 | +# from lexers.token import TokenType |
| 4 | + |
| 5 | +# # Helper function to compare token lists, ignoring EOF |
| 6 | +# def assert_tokens_equal(actual_tokens, expected_tokens_data): |
| 7 | +# # Remove EOF token if present |
| 8 | +# if actual_tokens and actual_tokens[-1].type == TokenType.EOF: |
| 9 | +# actual_tokens = actual_tokens[:-1] |
10 | 10 |
|
11 | | - assert len(actual_tokens) == len(expected_tokens_data), \ |
12 | | - f"Expected {len(expected_tokens_data)} tokens, but got {len(actual_tokens)}\nActual: {actual_tokens}\nExpected data: {expected_tokens_data}" |
| 11 | +# assert len(actual_tokens) == len(expected_tokens_data), \ |
| 12 | +# f"Expected {len(expected_tokens_data)} tokens, but got {len(actual_tokens)}\nActual: {actual_tokens}\nExpected data: {expected_tokens_data}" |
13 | 13 |
|
14 | | - for i, (token_type, value) in enumerate(expected_tokens_data): |
15 | | - assert actual_tokens[i].type == token_type, f"Token {i} type mismatch: Expected {token_type}, got {actual_tokens[i].type} ({actual_tokens[i].value})" |
16 | | - assert actual_tokens[i].value == value, f"Token {i} value mismatch: Expected {value} , got {actual_tokens[i].value} " |
17 | | - |
18 | | -# --- Test Cases --- |
19 | | - |
20 | | -def test_empty_input(): |
21 | | - lexer = PythonLexer("") |
22 | | - tokens = lexer.tokenize() |
23 | | - assert len(tokens) == 1 |
24 | | - assert tokens[0].type == TokenType.EOF |
25 | | - |
26 | | -def test_keywords(): |
27 | | - code = "def class return if else elif while for in break continue pass import from as try except finally raise with lambda and or not is None True False yield global nonlocal assert del async await" |
28 | | - lexer = PythonLexer(code) |
29 | | - tokens = lexer.tokenize() |
30 | | - expected = [ |
31 | | - (TokenType.KEYWORD, "def"), (TokenType.KEYWORD, "class"), (TokenType.KEYWORD, "return"), |
32 | | - (TokenType.KEYWORD, "if"), (TokenType.KEYWORD, "else"), (TokenType.KEYWORD, "elif"), |
33 | | - (TokenType.KEYWORD, "while"), (TokenType.KEYWORD, "for"), (TokenType.KEYWORD, "in"), |
34 | | - (TokenType.KEYWORD, "break"), (TokenType.KEYWORD, "continue"), (TokenType.KEYWORD, "pass"), |
35 | | - (TokenType.KEYWORD, "import"), (TokenType.KEYWORD, "from"), (TokenType.KEYWORD, "as"), |
36 | | - (TokenType.KEYWORD, "try"), (TokenType.KEYWORD, "except"), (TokenType.KEYWORD, "finally"), |
37 | | - (TokenType.KEYWORD, "raise"), (TokenType.KEYWORD, "with"), (TokenType.KEYWORD, "lambda"), |
38 | | - (TokenType.KEYWORD, "and"), (TokenType.KEYWORD, "or"), (TokenType.KEYWORD, "not"), |
39 | | - (TokenType.KEYWORD, "is"), (TokenType.BOOLEAN, "None"), (TokenType.BOOLEAN, "True"), |
40 | | - (TokenType.BOOLEAN, "False"), (TokenType.KEYWORD, "yield"), (TokenType.KEYWORD, "global"), |
41 | | - (TokenType.KEYWORD, "nonlocal"), (TokenType.KEYWORD, "assert"), (TokenType.KEYWORD, "del"), |
42 | | - (TokenType.KEYWORD, "async"), (TokenType.KEYWORD, "await") |
43 | | - ] |
44 | | - assert_tokens_equal(tokens, expected) |
45 | | - |
46 | | -def test_identifiers(): |
47 | | - code = "my_var _another_var var123 _1" |
48 | | - lexer = PythonLexer(code) |
49 | | - tokens = lexer.tokenize() |
50 | | - expected = [ |
51 | | - (TokenType.IDENTIFIER, "my_var"), |
52 | | - (TokenType.IDENTIFIER, "_another_var"), |
53 | | - (TokenType.IDENTIFIER, "var123"), |
54 | | - (TokenType.IDENTIFIER, "_1"), |
55 | | - ] |
56 | | - assert_tokens_equal(tokens, expected) |
57 | | - |
58 | | -def test_numbers(): |
59 | | - code = "123 45.67 0.5 1e3 2.5e-2 99" |
60 | | - lexer = PythonLexer(code) |
61 | | - tokens = lexer.tokenize() |
62 | | - expected = [ |
63 | | - (TokenType.NUMBER, "123"), |
64 | | - (TokenType.NUMBER, "45.67"), |
65 | | - (TokenType.NUMBER, "0.5"), |
66 | | - (TokenType.NUMBER, "1e3"), |
67 | | - (TokenType.NUMBER, "2.5e-2"), |
68 | | - (TokenType.NUMBER, "99"), |
69 | | - ] |
70 | | - assert_tokens_equal(tokens, expected) |
71 | | - |
72 | | -def test_strings(): |
73 | | - code = "'hello' \"world\" '''triple single''' \"\"\"triple double\"\"\" 'esc\"aped' \"esc'aped\"" |
74 | | - lexer = PythonLexer(code) |
75 | | - tokens = lexer.tokenize() |
76 | | - expected = [ |
77 | | - (TokenType.STRING, "'hello'"), |
78 | | - (TokenType.STRING, '"world"'), |
79 | | - (TokenType.STRING, "'''triple single'''"), |
80 | | - (TokenType.STRING, '"""triple double"""'), |
81 | | - (TokenType.STRING, "'esc\"aped'"), |
82 | | - (TokenType.STRING, '"esc\'aped"'), |
83 | | - ] |
84 | | - assert_tokens_equal(tokens, expected) |
85 | | - |
86 | | -def test_operators(): |
87 | | - code = "+ - * / // % ** = == != < > <= >= and or not is in & | ^ ~ << >> := += -= *= /= %= **= //= &= |= ^= <<= >>=" |
88 | | - lexer = PythonLexer(code) |
89 | | - tokens = lexer.tokenize() |
90 | | - # Note: 'and', 'or', 'not', 'is', 'in' are keywords when standalone, but operators here due to context/lexer logic |
91 | | - expected = [ |
92 | | - (TokenType.OPERATOR, "+"), (TokenType.OPERATOR, "-"), (TokenType.OPERATOR, "*"), (TokenType.OPERATOR, "/"), |
93 | | - (TokenType.OPERATOR, "//"), (TokenType.OPERATOR, "%"), (TokenType.OPERATOR, "**"), (TokenType.OPERATOR, "="), |
94 | | - (TokenType.OPERATOR, "=="), (TokenType.OPERATOR, "!="), (TokenType.OPERATOR, "<"), (TokenType.OPERATOR, ">"), |
95 | | - (TokenType.OPERATOR, "<="), (TokenType.OPERATOR, ">="), (TokenType.KEYWORD, "and"), (TokenType.KEYWORD, "or"), |
96 | | - (TokenType.KEYWORD, "not"), (TokenType.KEYWORD, "is"), (TokenType.KEYWORD, "in"), (TokenType.OPERATOR, "&"), |
97 | | - (TokenType.OPERATOR, "|"), (TokenType.OPERATOR, "^"), (TokenType.OPERATOR, "~"), (TokenType.OPERATOR, "<<"), |
98 | | - (TokenType.OPERATOR, ">>"), (TokenType.OPERATOR, ":="), (TokenType.OPERATOR, "+="), (TokenType.OPERATOR, "-="), |
99 | | - (TokenType.OPERATOR, "*="), (TokenType.OPERATOR, "/="), (TokenType.OPERATOR, "%="), (TokenType.OPERATOR, "**="), |
100 | | - (TokenType.OPERATOR, "//="), (TokenType.OPERATOR, "&="), (TokenType.OPERATOR, "|="), (TokenType.OPERATOR, "^="), |
101 | | - (TokenType.OPERATOR, "<<="), (TokenType.OPERATOR, ">>=") |
102 | | - ] |
103 | | - assert_tokens_equal(tokens, expected) |
104 | | - |
105 | | -def test_delimiters(): |
106 | | - code = "() [] {} , : . ; @" |
107 | | - lexer = PythonLexer(code) |
108 | | - tokens = lexer.tokenize() |
109 | | - expected = [ |
110 | | - (TokenType.DELIMITER, "("), (TokenType.DELIMITER, ")"), |
111 | | - (TokenType.DELIMITER, "["), (TokenType.DELIMITER, "]"), |
112 | | - (TokenType.DELIMITER, "{"), (TokenType.DELIMITER, "}"), |
113 | | - (TokenType.DELIMITER, ","), (TokenType.DELIMITER, ":"), |
114 | | - (TokenType.DELIMITER, "."), (TokenType.DELIMITER, ";"), |
115 | | - (TokenType.DELIMITER, "@"), |
116 | | - ] |
117 | | - assert_tokens_equal(tokens, expected) |
118 | | - |
119 | | -def test_comments(): |
120 | | - code = "# This is a comment\nx = 1 # Another comment" |
121 | | - lexer = PythonLexer(code) |
122 | | - tokens = lexer.tokenize() |
123 | | - expected = [ |
124 | | - (TokenType.COMMENT, "# This is a comment"), |
125 | | - (TokenType.NEWLINE, "\\n"), |
126 | | - (TokenType.IDENTIFIER, "x"), |
127 | | - (TokenType.OPERATOR, "="), |
128 | | - (TokenType.NUMBER, "1"), |
129 | | - (TokenType.COMMENT, "# Another comment"), |
130 | | - ] |
131 | | - assert_tokens_equal(tokens, expected) |
132 | | - |
133 | | -def test_newlines_and_whitespace(): |
134 | | - code = "x = 1\n y = 2\n\nz = 3" |
135 | | - lexer = PythonLexer(code) |
136 | | - tokens = lexer.tokenize() |
137 | | - expected = [ |
138 | | - (TokenType.IDENTIFIER, "x"), (TokenType.OPERATOR, "="), (TokenType.NUMBER, "1"), (TokenType.NEWLINE, "\\n"), |
139 | | - (TokenType.IDENTIFIER, "y"), (TokenType.OPERATOR, "="), (TokenType.NUMBER, "2"), (TokenType.NEWLINE, "\\n"), |
140 | | - (TokenType.NEWLINE, "\\n"), |
141 | | - (TokenType.IDENTIFIER, "z"), (TokenType.OPERATOR, "="), (TokenType.NUMBER, "3"), |
142 | | - ] |
143 | | - assert_tokens_equal(tokens, expected) |
144 | | - |
145 | | -def test_mixed_code(): |
146 | | - code = """ |
147 | | -def greet(name): |
148 | | - # Print a greeting |
149 | | - print(f"Hello, {name}!") # Inline comment |
150 | | - return name is not None and name != '' |
151 | | -
|
152 | | -greet("Spice") |
153 | | -""" |
154 | | - lexer = PythonLexer(code) |
155 | | - tokens = lexer.tokenize() |
156 | | - expected = [ |
157 | | - (TokenType.KEYWORD, "def"), (TokenType.IDENTIFIER, "greet"), (TokenType.DELIMITER, "("), (TokenType.IDENTIFIER, "name"), (TokenType.DELIMITER, ")"), (TokenType.DELIMITER, ":"), (TokenType.NEWLINE, "\\n"), |
158 | | - (TokenType.COMMENT, "# Print a greeting"), (TokenType.NEWLINE, "\\n"), |
159 | | - (TokenType.IDENTIFIER, "print"), (TokenType.DELIMITER, "("), (TokenType.STRING, 'f"Hello, {name}!"'), (TokenType.DELIMITER, ")"), (TokenType.COMMENT, "# Inline comment"), (TokenType.NEWLINE, "\\n"), |
160 | | - (TokenType.KEYWORD, "return"), (TokenType.IDENTIFIER, "name"), (TokenType.KEYWORD, "is"), (TokenType.KEYWORD, "not"), (TokenType.BOOLEAN, "None"), (TokenType.KEYWORD, "and"), (TokenType.IDENTIFIER, "name"), (TokenType.OPERATOR, "!="), (TokenType.STRING, "''"), (TokenType.NEWLINE, "\\n"), |
161 | | - (TokenType.NEWLINE, "\\n"), |
162 | | - (TokenType.IDENTIFIER, "greet"), (TokenType.DELIMITER, "("), (TokenType.STRING, '"Spice"'), (TokenType.DELIMITER, ")"), (TokenType.NEWLINE, "\\n"), |
163 | | - ] |
164 | | - assert_tokens_equal(tokens, expected) |
165 | | - |
166 | | -def test_error_character(): |
167 | | - code = "x = $" |
168 | | - lexer = PythonLexer(code) |
169 | | - tokens = lexer.tokenize() |
170 | | - expected = [ |
171 | | - (TokenType.IDENTIFIER, "x"), |
172 | | - (TokenType.OPERATOR, "="), |
173 | | - (TokenType.ERROR, "$"), |
174 | | - ] |
175 | | - assert_tokens_equal(tokens, expected) |
176 | | - |
177 | | -def test_unterminated_string(): |
178 | | - code = "'unterminated" |
179 | | - lexer = PythonLexer(code) |
180 | | - tokens = lexer.tokenize() |
181 | | - # The lexer currently returns an ERROR token for unterminated strings |
182 | | - assert len(tokens) == 2 # ERROR token + EOF |
183 | | - assert tokens[0].type == TokenType.ERROR |
184 | | - assert "string não fechada" in tokens[0].value |
| 14 | +# for i, (token_type, value) in enumerate(expected_tokens_data): |
| 15 | +# assert actual_tokens[i].type == token_type, f"Token {i} type mismatch: Expected {token_type}, got {actual_tokens[i].type} ({actual_tokens[i].value})" |
| 16 | +# assert actual_tokens[i].value == value, f"Token {i} value mismatch: Expected {value} , got {actual_tokens[i].value} " |
| 17 | + |
| 18 | +# # --- Test Cases --- |
| 19 | + |
| 20 | +# def test_empty_input(): |
| 21 | +# lexer = PythonLexer("") |
| 22 | +# tokens = lexer.tokenize() |
| 23 | +# assert len(tokens) == 1 |
| 24 | +# assert tokens[0].type == TokenType.EOF |
| 25 | + |
| 26 | +# def test_keywords(): |
| 27 | +# code = "def class return if else elif while for in break continue pass import from as try except finally raise with lambda and or not is None True False yield global nonlocal assert del async await" |
| 28 | +# lexer = PythonLexer(code) |
| 29 | +# tokens = lexer.tokenize() |
| 30 | +# expected = [ |
| 31 | +# (TokenType.KEYWORD, "def"), (TokenType.KEYWORD, "class"), (TokenType.KEYWORD, "return"), |
| 32 | +# (TokenType.KEYWORD, "if"), (TokenType.KEYWORD, "else"), (TokenType.KEYWORD, "elif"), |
| 33 | +# (TokenType.KEYWORD, "while"), (TokenType.KEYWORD, "for"), (TokenType.KEYWORD, "in"), |
| 34 | +# (TokenType.KEYWORD, "break"), (TokenType.KEYWORD, "continue"), (TokenType.KEYWORD, "pass"), |
| 35 | +# (TokenType.KEYWORD, "import"), (TokenType.KEYWORD, "from"), (TokenType.KEYWORD, "as"), |
| 36 | +# (TokenType.KEYWORD, "try"), (TokenType.KEYWORD, "except"), (TokenType.KEYWORD, "finally"), |
| 37 | +# (TokenType.KEYWORD, "raise"), (TokenType.KEYWORD, "with"), (TokenType.KEYWORD, "lambda"), |
| 38 | +# (TokenType.KEYWORD, "and"), (TokenType.KEYWORD, "or"), (TokenType.KEYWORD, "not"), |
| 39 | +# (TokenType.KEYWORD, "is"), (TokenType.BOOLEAN, "None"), (TokenType.BOOLEAN, "True"), |
| 40 | +# (TokenType.BOOLEAN, "False"), (TokenType.KEYWORD, "yield"), (TokenType.KEYWORD, "global"), |
| 41 | +# (TokenType.KEYWORD, "nonlocal"), (TokenType.KEYWORD, "assert"), (TokenType.KEYWORD, "del"), |
| 42 | +# (TokenType.KEYWORD, "async"), (TokenType.KEYWORD, "await") |
| 43 | +# ] |
| 44 | +# assert_tokens_equal(tokens, expected) |
| 45 | + |
| 46 | +# def test_identifiers(): |
| 47 | +# code = "my_var _another_var var123 _1" |
| 48 | +# lexer = PythonLexer(code) |
| 49 | +# tokens = lexer.tokenize() |
| 50 | +# expected = [ |
| 51 | +# (TokenType.IDENTIFIER, "my_var"), |
| 52 | +# (TokenType.IDENTIFIER, "_another_var"), |
| 53 | +# (TokenType.IDENTIFIER, "var123"), |
| 54 | +# (TokenType.IDENTIFIER, "_1"), |
| 55 | +# ] |
| 56 | +# assert_tokens_equal(tokens, expected) |
| 57 | + |
| 58 | +# def test_numbers(): |
| 59 | +# code = "123 45.67 0.5 1e3 2.5e-2 99" |
| 60 | +# lexer = PythonLexer(code) |
| 61 | +# tokens = lexer.tokenize() |
| 62 | +# expected = [ |
| 63 | +# (TokenType.NUMBER, "123"), |
| 64 | +# (TokenType.NUMBER, "45.67"), |
| 65 | +# (TokenType.NUMBER, "0.5"), |
| 66 | +# (TokenType.NUMBER, "1e3"), |
| 67 | +# (TokenType.NUMBER, "2.5e-2"), |
| 68 | +# (TokenType.NUMBER, "99"), |
| 69 | +# ] |
| 70 | +# assert_tokens_equal(tokens, expected) |
| 71 | + |
| 72 | +# def test_strings(): |
| 73 | +# code = "'hello' \"world\" '''triple single''' \"\"\"triple double\"\"\" 'esc\"aped' \"esc'aped\"" |
| 74 | +# lexer = PythonLexer(code) |
| 75 | +# tokens = lexer.tokenize() |
| 76 | +# expected = [ |
| 77 | +# (TokenType.STRING, "'hello'"), |
| 78 | +# (TokenType.STRING, '"world"'), |
| 79 | +# (TokenType.STRING, "'''triple single'''"), |
| 80 | +# (TokenType.STRING, '"""triple double"""'), |
| 81 | +# (TokenType.STRING, "'esc\"aped'"), |
| 82 | +# (TokenType.STRING, '"esc\'aped"'), |
| 83 | +# ] |
| 84 | +# assert_tokens_equal(tokens, expected) |
| 85 | + |
| 86 | +# def test_operators(): |
| 87 | +# code = "+ - * / // % ** = == != < > <= >= and or not is in & | ^ ~ << >> := += -= *= /= %= **= //= &= |= ^= <<= >>=" |
| 88 | +# lexer = PythonLexer(code) |
| 89 | +# tokens = lexer.tokenize() |
| 90 | +# # Note: 'and', 'or', 'not', 'is', 'in' are keywords when standalone, but operators here due to context/lexer logic |
| 91 | +# expected = [ |
| 92 | +# (TokenType.OPERATOR, "+"), (TokenType.OPERATOR, "-"), (TokenType.OPERATOR, "*"), (TokenType.OPERATOR, "/"), |
| 93 | +# (TokenType.OPERATOR, "//"), (TokenType.OPERATOR, "%"), (TokenType.OPERATOR, "**"), (TokenType.OPERATOR, "="), |
| 94 | +# (TokenType.OPERATOR, "=="), (TokenType.OPERATOR, "!="), (TokenType.OPERATOR, "<"), (TokenType.OPERATOR, ">"), |
| 95 | +# (TokenType.OPERATOR, "<="), (TokenType.OPERATOR, ">="), (TokenType.KEYWORD, "and"), (TokenType.KEYWORD, "or"), |
| 96 | +# (TokenType.KEYWORD, "not"), (TokenType.KEYWORD, "is"), (TokenType.KEYWORD, "in"), (TokenType.OPERATOR, "&"), |
| 97 | +# (TokenType.OPERATOR, "|"), (TokenType.OPERATOR, "^"), (TokenType.OPERATOR, "~"), (TokenType.OPERATOR, "<<"), |
| 98 | +# (TokenType.OPERATOR, ">>"), (TokenType.OPERATOR, ":="), (TokenType.OPERATOR, "+="), (TokenType.OPERATOR, "-="), |
| 99 | +# (TokenType.OPERATOR, "*="), (TokenType.OPERATOR, "/="), (TokenType.OPERATOR, "%="), (TokenType.OPERATOR, "**="), |
| 100 | +# (TokenType.OPERATOR, "//="), (TokenType.OPERATOR, "&="), (TokenType.OPERATOR, "|="), (TokenType.OPERATOR, "^="), |
| 101 | +# (TokenType.OPERATOR, "<<="), (TokenType.OPERATOR, ">>=") |
| 102 | +# ] |
| 103 | +# assert_tokens_equal(tokens, expected) |
| 104 | + |
| 105 | +# def test_delimiters(): |
| 106 | +# code = "() [] {} , : . ; @" |
| 107 | +# lexer = PythonLexer(code) |
| 108 | +# tokens = lexer.tokenize() |
| 109 | +# expected = [ |
| 110 | +# (TokenType.DELIMITER, "("), (TokenType.DELIMITER, ")"), |
| 111 | +# (TokenType.DELIMITER, "["), (TokenType.DELIMITER, "]"), |
| 112 | +# (TokenType.DELIMITER, "{"), (TokenType.DELIMITER, "}"), |
| 113 | +# (TokenType.DELIMITER, ","), (TokenType.DELIMITER, ":"), |
| 114 | +# (TokenType.DELIMITER, "."), (TokenType.DELIMITER, ";"), |
| 115 | +# (TokenType.DELIMITER, "@"), |
| 116 | +# ] |
| 117 | +# assert_tokens_equal(tokens, expected) |
| 118 | + |
| 119 | +# def test_comments(): |
| 120 | +# code = "# This is a comment\nx = 1 # Another comment" |
| 121 | +# lexer = PythonLexer(code) |
| 122 | +# tokens = lexer.tokenize() |
| 123 | +# expected = [ |
| 124 | +# (TokenType.COMMENT, "# This is a comment"), |
| 125 | +# (TokenType.NEWLINE, "\\n"), |
| 126 | +# (TokenType.IDENTIFIER, "x"), |
| 127 | +# (TokenType.OPERATOR, "="), |
| 128 | +# (TokenType.NUMBER, "1"), |
| 129 | +# (TokenType.COMMENT, "# Another comment"), |
| 130 | +# ] |
| 131 | +# assert_tokens_equal(tokens, expected) |
| 132 | + |
| 133 | +# def test_newlines_and_whitespace(): |
| 134 | +# code = "x = 1\n y = 2\n\nz = 3" |
| 135 | +# lexer = PythonLexer(code) |
| 136 | +# tokens = lexer.tokenize() |
| 137 | +# expected = [ |
| 138 | +# (TokenType.IDENTIFIER, "x"), (TokenType.OPERATOR, "="), (TokenType.NUMBER, "1"), (TokenType.NEWLINE, "\\n"), |
| 139 | +# (TokenType.IDENTIFIER, "y"), (TokenType.OPERATOR, "="), (TokenType.NUMBER, "2"), (TokenType.NEWLINE, "\\n"), |
| 140 | +# (TokenType.NEWLINE, "\\n"), |
| 141 | +# (TokenType.IDENTIFIER, "z"), (TokenType.OPERATOR, "="), (TokenType.NUMBER, "3"), |
| 142 | +# ] |
| 143 | +# assert_tokens_equal(tokens, expected) |
| 144 | + |
| 145 | +# def test_mixed_code(): |
| 146 | +# code = """ |
| 147 | +# def greet(name): |
| 148 | +# # Print a greeting |
| 149 | +# print(f"Hello, {name}!") # Inline comment |
| 150 | +# return name is not None and name != '' |
| 151 | + |
| 152 | +# greet("Spice") |
| 153 | +# """ |
| 154 | +# lexer = PythonLexer(code) |
| 155 | +# tokens = lexer.tokenize() |
| 156 | +# expected = [ |
| 157 | +# (TokenType.KEYWORD, "def"), (TokenType.IDENTIFIER, "greet"), (TokenType.DELIMITER, "("), (TokenType.IDENTIFIER, "name"), (TokenType.DELIMITER, ")"), (TokenType.DELIMITER, ":"), (TokenType.NEWLINE, "\\n"), |
| 158 | +# (TokenType.COMMENT, "# Print a greeting"), (TokenType.NEWLINE, "\\n"), |
| 159 | +# (TokenType.IDENTIFIER, "print"), (TokenType.DELIMITER, "("), (TokenType.STRING, 'f"Hello, {name}!"'), (TokenType.DELIMITER, ")"), (TokenType.COMMENT, "# Inline comment"), (TokenType.NEWLINE, "\\n"), |
| 160 | +# (TokenType.KEYWORD, "return"), (TokenType.IDENTIFIER, "name"), (TokenType.KEYWORD, "is"), (TokenType.KEYWORD, "not"), (TokenType.BOOLEAN, "None"), (TokenType.KEYWORD, "and"), (TokenType.IDENTIFIER, "name"), (TokenType.OPERATOR, "!="), (TokenType.STRING, "''"), (TokenType.NEWLINE, "\\n"), |
| 161 | +# (TokenType.NEWLINE, "\\n"), |
| 162 | +# (TokenType.IDENTIFIER, "greet"), (TokenType.DELIMITER, "("), (TokenType.STRING, '"Spice"'), (TokenType.DELIMITER, ")"), (TokenType.NEWLINE, "\\n"), |
| 163 | +# ] |
| 164 | +# assert_tokens_equal(tokens, expected) |
| 165 | + |
| 166 | +# def test_error_character(): |
| 167 | +# code = "x = $" |
| 168 | +# lexer = PythonLexer(code) |
| 169 | +# tokens = lexer.tokenize() |
| 170 | +# expected = [ |
| 171 | +# (TokenType.IDENTIFIER, "x"), |
| 172 | +# (TokenType.OPERATOR, "="), |
| 173 | +# (TokenType.ERROR, "$"), |
| 174 | +# ] |
| 175 | +# assert_tokens_equal(tokens, expected) |
| 176 | + |
| 177 | +# def test_unterminated_string(): |
| 178 | +# code = "'unterminated" |
| 179 | +# lexer = PythonLexer(code) |
| 180 | +# tokens = lexer.tokenize() |
| 181 | +# # The lexer currently returns an ERROR token for unterminated strings |
| 182 | +# assert len(tokens) == 2 # ERROR token + EOF |
| 183 | +# assert tokens[0].type == TokenType.ERROR |
| 184 | +# assert "string não fechada" in tokens[0].value |
185 | 185 |
|
186 | 186 |
|
0 commit comments