diff options
Diffstat (limited to 'tests/test_python.py')
-rw-r--r-- | tests/test_python.py | 889 |
1 files changed, 0 insertions, 889 deletions
diff --git a/tests/test_python.py b/tests/test_python.py deleted file mode 100644 index 12529d4a..00000000 --- a/tests/test_python.py +++ /dev/null @@ -1,889 +0,0 @@ -""" - Python Tests - ~~~~~~~~~~~~ - - :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import pytest - -from pygments.lexers import PythonLexer, Python3Lexer -from pygments.token import Token - -import re - - -@pytest.fixture(scope='module') -def lexer2(): - yield PythonLexer() - - -@pytest.fixture(scope='module') -def lexer3(): - yield Python3Lexer() - - -def test_cls_builtin(lexer2): - """ - Tests that a cls token gets interpreted as a Token.Name.Builtin.Pseudo - """ - fragment = 'class TestClass():\n @classmethod\n def hello(cls):\n pass\n' - tokens = [ - (Token.Keyword, 'class'), - (Token.Text, ' '), - (Token.Name.Class, 'TestClass'), - (Token.Punctuation, '('), - (Token.Punctuation, ')'), - (Token.Punctuation, ':'), - (Token.Text, '\n'), - (Token.Text, ' '), - (Token.Name.Decorator, '@classmethod'), - (Token.Text, '\n'), - (Token.Text, ' '), - (Token.Keyword, 'def'), - (Token.Text, ' '), - (Token.Name.Function, 'hello'), - (Token.Punctuation, '('), - (Token.Name.Builtin.Pseudo, 'cls'), - (Token.Punctuation, ')'), - (Token.Punctuation, ':'), - (Token.Text, '\n'), - (Token.Text, ' '), - (Token.Keyword, 'pass'), - (Token.Text, '\n'), - ] - assert list(lexer2.get_tokens(fragment)) == tokens - - -def test_needs_name(lexer3): - """ - Tests that '@' is recognized as an Operator - """ - fragment = 'S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)\n' - tokens = [ - (Token.Name, 'S'), - (Token.Text, ' '), - (Token.Operator, '='), - (Token.Text, ' '), - (Token.Punctuation, '('), - (Token.Name, 'H'), - (Token.Text, ' '), - (Token.Operator, '@'), - (Token.Text, ' '), - (Token.Name, 'beta'), - (Token.Text, ' '), - (Token.Operator, '-'), - (Token.Text, ' '), - (Token.Name, 'r'), - (Token.Punctuation, ')'), - (Token.Operator, '.'), - (Token.Name, 'T'), - (Token.Text, ' '), - (Token.Operator, '@'), - (Token.Text, ' '), - (Token.Name, 'inv'), - (Token.Punctuation, '('), - (Token.Name, 'H'), - (Token.Text, ' '), - (Token.Operator, '@'), - (Token.Text, ' '), - (Token.Name, 'V'), - (Token.Text, ' '), - (Token.Operator, '@'), - (Token.Text, ' '), - (Token.Name, 'H'), - (Token.Operator, '.'), - (Token.Name, 'T'), - (Token.Punctuation, ')'), - (Token.Text, ' '), - (Token.Operator, '@'), - (Token.Text, ' '), - (Token.Punctuation, '('), - (Token.Name, 'H'), - (Token.Text, ' '), - (Token.Operator, '@'), - (Token.Text, ' '), - (Token.Name, 'beta'), - (Token.Text, ' '), - (Token.Operator, '-'), - (Token.Text, ' '), - (Token.Name, 'r'), - (Token.Punctuation, ')'), - (Token.Text, '\n'), - ] - assert list(lexer3.get_tokens(fragment)) == tokens - - -def test_pep_515(lexer3): - """ - Tests that the lexer can parse numeric literals with underscores - """ - fragments = ( - (Token.Literal.Number.Integer, '1_000_000'), - (Token.Literal.Number.Float, '1_000.000_001'), - (Token.Literal.Number.Float, '1_000e1_000j'), - (Token.Literal.Number.Hex, '0xCAFE_F00D'), - (Token.Literal.Number.Bin, '0b_0011_1111_0100_1110'), - (Token.Literal.Number.Oct, '0o_777_123'), - ) - - for token, fragment in fragments: - tokens = [ - (token, fragment), - (Token.Text, '\n'), - ] - assert list(lexer3.get_tokens(fragment)) == tokens - - -def test_walrus_operator(lexer3): - """ - Tests that ':=' is recognized as an Operator - """ - fragment = 'if (a := 2) > 4:' - tokens = [ - (Token.Keyword, 'if'), - (Token.Text, ' '), - (Token.Punctuation, '('), - (Token.Name, 'a'), - (Token.Text, ' '), - (Token.Operator, ':='), - (Token.Text, ' '), - (Token.Literal.Number.Integer, '2'), - (Token.Punctuation, ')'), - (Token.Text, ' '), - (Token.Operator, '>'), - (Token.Text, ' '), - (Token.Literal.Number.Integer, '4'), - (Token.Punctuation, ':'), - (Token.Text, '\n'), - ] - assert list(lexer3.get_tokens(fragment)) == tokens - - -def test_fstring(lexer3): - """ - Tests that the lexer can parse f-strings - """ - fragments_and_tokens = ( - # examples from PEP-0498 - ( - "f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, 'My name is '), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'name'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, ', my age next year is '), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'age'), - (Token.Operator, '+'), - (Token.Literal.Number.Integer, '1'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, ', my anniversary is '), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'anniversary'), - (Token.Literal.String.Interpol, ':'), - (Token.Literal.String.Single, '%A, %B %d, %Y'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, '.'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - "f'He said his name is {name!r}.'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, 'He said his name is '), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'name'), - (Token.Literal.String.Interpol, '!r}'), - (Token.Literal.String.Single, '.'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - - ), ( - "f'input={value:#06x}'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, 'input='), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'value'), - (Token.Literal.String.Interpol, ':'), - (Token.Literal.String.Single, '#06x'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - """f'{"quoted string"}'\n""", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Interpol, '{'), - (Token.Literal.String.Double, '"'), - (Token.Literal.String.Double, 'quoted string'), - (Token.Literal.String.Double, '"'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - """f'{f"{inner}"}'\n""", # not in the PEP - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Interpol, '{'), - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Double, '"'), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'inner'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Double, '"'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - # SyntaxError: f-string expression part cannot include a backslash - "f'{\\'quoted string\\'}'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Interpol, '{'), - (Token.Error, '\\'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, 'quoted string'), - (Token.Literal.String.Escape, "\\'"), - (Token.Literal.String.Single, '}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - "f'{{ {4*10} }}'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Escape, '{{'), - (Token.Literal.String.Single, ' '), - (Token.Literal.String.Interpol, '{'), - (Token.Literal.Number.Integer, '4'), - (Token.Operator, '*'), - (Token.Literal.Number.Integer, '10'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, ' '), - (Token.Literal.String.Escape, '}}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - "f'{{{4*10}}}'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Escape, '{{'), - (Token.Literal.String.Interpol, '{'), - (Token.Literal.Number.Integer, '4'), - (Token.Operator, '*'), - (Token.Literal.Number.Integer, '10'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Escape, '}}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - "fr'x={4*10}'\n", - [ - (Token.Literal.String.Affix, 'fr'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, "x="), - (Token.Literal.String.Interpol, '{'), - (Token.Literal.Number.Integer, '4'), - (Token.Operator, '*'), - (Token.Literal.Number.Integer, '10'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - """f'abc {a["x"]} def'\n""", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, 'abc '), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'a'), - (Token.Punctuation, '['), - (Token.Literal.String.Double, '"'), - (Token.Literal.String.Double, 'x'), - (Token.Literal.String.Double, '"'), - (Token.Punctuation, ']'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, ' def'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - "f'''abc {a['x']} def'''\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'''"), - (Token.Literal.String.Single, 'abc '), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'a'), - (Token.Punctuation, '['), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, 'x'), - (Token.Literal.String.Single, "'"), - (Token.Punctuation, ']'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, ' def'), - (Token.Literal.String.Single, "'''"), - (Token.Text, '\n') - ] - ), ( - """f'''{x -+1}'''\n""", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'''"), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'x'), - (Token.Text, '\n'), - (Token.Operator, '+'), - (Token.Literal.Number.Integer, '1'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, "'''"), - (Token.Text, '\n') - ] - ), ( - """f'''{d[0 -]}'''\n""", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'''"), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'd'), - (Token.Punctuation, '['), - (Token.Literal.Number.Integer, '0'), - (Token.Text, '\n'), - (Token.Punctuation, ']'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, "'''"), - (Token.Text, '\n') - ] - ), ( - "f'result: {value:{width}.{precision}}'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, 'result: '), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'value'), - (Token.Literal.String.Interpol, ':'), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'width'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, '.'), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'precision'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - "'a' 'b' f'{x}' '{c}' f'str<{y:^4}>' 'd' 'e'\n", - [ - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, 'a'), - (Token.Literal.String.Single, "'"), - (Token.Text, ' '), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, 'b'), - (Token.Literal.String.Single, "'"), - (Token.Text, ' '), - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'x'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, "'"), - (Token.Text, ' '), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Interpol, '{c}'), - (Token.Literal.String.Single, "'"), - (Token.Text, ' '), - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, 'str<'), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'y'), - (Token.Literal.String.Interpol, ':'), - (Token.Literal.String.Single, '^4'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, '>'), - (Token.Literal.String.Single, "'"), - (Token.Text, ' '), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, 'd'), - (Token.Literal.String.Single, "'"), - (Token.Text, ' '), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, 'e'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - "f'{i}:{d[i]}'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'i'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, ':'), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'd'), - (Token.Punctuation, '['), - (Token.Name, 'i'), - (Token.Punctuation, ']'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - "f'x = {x:+3}'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, "x = "), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'x'), - (Token.Literal.String.Interpol, ':'), - (Token.Literal.String.Single, '+3'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - "f'{fn(lst,2)} {fn(lst,3)}'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'fn'), - (Token.Punctuation, '('), - (Token.Name, 'lst'), - (Token.Punctuation, ','), - (Token.Literal.Number.Integer, '2'), - (Token.Punctuation, ')'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, ' '), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'fn'), - (Token.Punctuation, '('), - (Token.Name, 'lst'), - (Token.Punctuation, ','), - (Token.Literal.Number.Integer, '3'), - (Token.Punctuation, ')'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - "f'mapping is { {a:b for (a, b) in ((1, 2), (3, 4))} }'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, 'mapping is '), - (Token.Literal.String.Interpol, '{'), - (Token.Text, ' '), - (Token.Punctuation, '{'), - (Token.Name, 'a'), - (Token.Punctuation, ':'), - (Token.Name, 'b'), - (Token.Text, ' '), - (Token.Keyword, 'for'), - (Token.Text, ' '), - (Token.Punctuation, '('), - (Token.Name, 'a'), - (Token.Punctuation, ','), - (Token.Text, ' '), - (Token.Name, 'b'), - (Token.Punctuation, ')'), - (Token.Text, ' '), - (Token.Operator.Word, 'in'), - (Token.Text, ' '), - (Token.Punctuation, '('), - (Token.Punctuation, '('), - (Token.Literal.Number.Integer, '1'), - (Token.Punctuation, ','), - (Token.Text, ' '), - (Token.Literal.Number.Integer, '2'), - (Token.Punctuation, ')'), - (Token.Punctuation, ','), - (Token.Text, ' '), - (Token.Punctuation, '('), - (Token.Literal.Number.Integer, '3'), - (Token.Punctuation, ','), - (Token.Text, ' '), - (Token.Literal.Number.Integer, '4'), - (Token.Punctuation, ')'), - (Token.Punctuation, ')'), - (Token.Punctuation, '}'), - (Token.Text, ' '), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - """f'a={d["a"]}'\n""", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, 'a='), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'd'), - (Token.Punctuation, '['), - (Token.Literal.String.Double, '"'), - (Token.Literal.String.Double, 'a'), - (Token.Literal.String.Double, '"'), - (Token.Punctuation, ']'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - "f'a={d[a]}'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, 'a='), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'd'), - (Token.Punctuation, '['), - (Token.Name, 'a'), - (Token.Punctuation, ']'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - "fr'{header}:\\s+'\n", - [ - (Token.Literal.String.Affix, 'fr'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'header'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, ':'), - (Token.Literal.String.Single, '\\'), - (Token.Literal.String.Single, 's+'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - "f'{a!r}'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'a'), - (Token.Literal.String.Interpol, '!r}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - "f'{(lambda x: x*2)(3)}'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Interpol, '{'), - (Token.Punctuation, '('), - (Token.Keyword, 'lambda'), - (Token.Text, ' '), - (Token.Name, 'x'), - (Token.Punctuation, ':'), - (Token.Text, ' '), - (Token.Name, 'x'), - (Token.Operator, '*'), - (Token.Literal.Number.Integer, '2'), - (Token.Punctuation, ')'), - (Token.Punctuation, '('), - (Token.Literal.Number.Integer, '3'), - (Token.Punctuation, ')'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - "extra = f'{extra},waiters:{len(self._waiters)}'\n", - [ - (Token.Name, 'extra'), - (Token.Text, ' '), - (Token.Operator, '='), - (Token.Text, ' '), - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'extra'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, ',waiters:'), - (Token.Literal.String.Interpol, '{'), - (Token.Name.Builtin, 'len'), - (Token.Punctuation, '('), - (Token.Name.Builtin.Pseudo, 'self'), - (Token.Operator, '.'), - (Token.Name, '_waiters'), - (Token.Punctuation, ')'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - 'message.append(f" [line {lineno:2d}]")\n', - [ - (Token.Name, 'message'), - (Token.Operator, '.'), - (Token.Name, 'append'), - (Token.Punctuation, '('), - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Double, '"'), - (Token.Literal.String.Double, ' [line '), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'lineno'), - (Token.Literal.String.Interpol, ':'), - (Token.Literal.String.Double, '2d'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Double, ']'), - (Token.Literal.String.Double, '"'), - (Token.Punctuation, ')'), - (Token.Text, '\n') - ] - ), - # Examples from https://bugs.python.org/issue36817 - ( - 'f"{foo=}"\n', - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Double, '"'), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'foo'), - (Token.Literal.String.Interpol, '=}'), - (Token.Literal.String.Double, '"'), - (Token.Text, '\n') - ] - ), ( - "f'{foo=!s}'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'foo'), - (Token.Literal.String.Interpol, '=!s}'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - 'f"{math.pi=!f:.2f}"\n', - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Double, '"'), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'math'), - (Token.Operator, '.'), - (Token.Name, 'pi'), - (Token.Literal.String.Interpol, '=!f:'), - (Token.Literal.String.Double, '.2f'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Double, '"'), - (Token.Text, '\n') - ] - ), ( - 'f"{ chr(65) =}"\n', - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Double, '"'), - (Token.Literal.String.Interpol, '{'), - (Token.Text, ' '), - (Token.Name.Builtin, 'chr'), - (Token.Punctuation, '('), - (Token.Literal.Number.Integer, '65'), - (Token.Punctuation, ')'), - (Token.Text, ' '), - (Token.Literal.String.Interpol, '=}'), - (Token.Literal.String.Double, '"'), - (Token.Text, '\n') - ] - ), ( - 'f"{chr(65) = }"\n', - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Double, '"'), - (Token.Literal.String.Interpol, '{'), - (Token.Name.Builtin, 'chr'), - (Token.Punctuation, '('), - (Token.Literal.Number.Integer, '65'), - (Token.Punctuation, ')'), - (Token.Text, ' '), - (Token.Literal.String.Interpol, '= }'), - (Token.Literal.String.Double, '"'), - (Token.Text, '\n') - ] - ), ( - "f'*{n=:30}*'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, '*'), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'n'), - (Token.Literal.String.Interpol, '=:'), - (Token.Literal.String.Single, '30'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, '*'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - "f'*{n=!r:30}*'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, '*'), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'n'), - (Token.Literal.String.Interpol, '=!r:'), - (Token.Literal.String.Single, '30'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, '*'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - """f"*{f'{n=}':30}*"\n""", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Double, '"'), - (Token.Literal.String.Double, '*'), - (Token.Literal.String.Interpol, '{'), - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'n'), - (Token.Literal.String.Interpol, '=}'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Interpol, ':'), - (Token.Literal.String.Double, '30'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Double, '*'), - (Token.Literal.String.Double, '"'), - (Token.Text, '\n') - ] - ), ( - "f'*{n=:+<30}*'\n", - [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'"), - (Token.Literal.String.Single, '*'), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'n'), - (Token.Literal.String.Interpol, '=:'), - (Token.Literal.String.Single, '+<30'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, '*'), - (Token.Literal.String.Single, "'"), - (Token.Text, '\n') - ] - ), ( - """ - f'''{foo - = !s:20}'''\n""", - [ - (Token.Text, ' '), - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Single, "'''"), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'foo'), - (Token.Text, '\n '), - (Token.Literal.String.Interpol, '= !s:'), - (Token.Literal.String.Single, '20'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Single, "'''"), - (Token.Text, '\n') - ] - ) - - ) - - for fragment,tokens in fragments_and_tokens: - assert list(lexer3.get_tokens(fragment)) == tokens - - # Now switch between single and double quotes, to cover both cases equally - rep = {"'":'"', '"':"'"} - pattern = re.compile("|".join(rep.keys())) - for fragment,tokens in fragments_and_tokens: - fragment = pattern.sub(lambda m: rep[m.group(0)], fragment) - tokens = list(tokens) - for i,(token,match) in enumerate(tokens): - if token == Token.Literal.String.Single: - token = Token.Literal.String.Double - elif token == Token.Literal.String.Double: - token = Token.Literal.String.Single - match = pattern.sub(lambda m: rep[m.group(0)], match) - tokens[i] = (token, match) - assert list(lexer3.get_tokens(fragment)) == tokens - -def test_raw_fstring(lexer3): - """ - Tests that the lexer can parse raw f-strings - """ - # Just raw - fragment = r'rf"m_\nu = x"' - tokens = [ - (Token.Literal.String.Affix, 'rf'), - (Token.Literal.String.Double, '"'), - (Token.Literal.String.Double, 'm_'), - (Token.Literal.String.Double, '\\'), - (Token.Literal.String.Double, 'nu = x'), - (Token.Literal.String.Double, '"'), - (Token.Text, '\n') - ] - # Just f-string - fragment = r'f"m_\nu = {x}"' - tokens = [ - (Token.Literal.String.Affix, 'f'), - (Token.Literal.String.Double, '"'), - (Token.Literal.String.Double, 'm_'), - (Token.Literal.String.Escape, '\\n'), - (Token.Literal.String.Double, 'u = '), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'x'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Double, '"'), - (Token.Text, '\n'), - ] - # Raw behavior inside {{...}} - fragment = r'rf"m_{{\nu}} = {x}"' - tokens = [ - (Token.Literal.String.Affix, 'rf'), - (Token.Literal.String.Double, '"'), - (Token.Literal.String.Double, 'm_'), - (Token.Literal.String.Escape, '{{'), - (Token.Literal.String.Double, '\\'), - (Token.Literal.String.Double, 'nu'), - (Token.Literal.String.Escape, '}}'), - (Token.Literal.String.Double, ' = '), - (Token.Literal.String.Interpol, '{'), - (Token.Name, 'x'), - (Token.Literal.String.Interpol, '}'), - (Token.Literal.String.Double, '"'), - (Token.Text, '\n'), - ] - assert list(lexer3.get_tokens(fragment)) == tokens |