File: test_linetable.py

package info (click to toggle)
python-linetable 0.0.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 88 kB
  • sloc: python: 246; makefile: 2
file content (108 lines) | stat: -rw-r--r-- 2,890 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import sys
import pytest
from linetable import generate_linetable, parse_linetable


def test_parse_linetable():
    linetable = b"\x80\x00\xd8\x06\x07\x80!\xd8\x06\x07\x88!\x81e\x80!\xd8\t\n\x80("
    parsed = list(parse_linetable(linetable))
    assert parsed == [
        (1, 1, 1, 0, 0),
        (1, 2, 2, 6, 7),
        (1, 2, 2, 2, 3),
        (1, 3, 3, 6, 7),
        (1, 3, 3, 10, 11),
        (2, 3, 3, 6, 11),
        (1, 3, 3, 2, 3),
        (1, 4, 4, 9, 10),
        (1, 4, 4, 2, 10),
    ]


def test_parse_linetable_nocolumns():
    linetable = (
        b"\xe8\x00\xe8\x02\xe8\x00\xe8\x02\xe8\x00\xe9\x00\xe8\x00\xe8\x02\xe8\x00"
    )
    parsed = list(parse_linetable(linetable))
    assert parsed == [
        (1, 1, 1, None, None),
        (1, 2, 2, None, None),
        (1, 2, 2, None, None),
        (1, 3, 3, None, None),
        (1, 3, 3, None, None),
        (2, 3, 3, None, None),
        (1, 3, 3, None, None),
        (1, 4, 4, None, None),
        (1, 4, 4, None, None),
    ]


def test_linetable():
    pairs = [
        # length, start_line, end_line, start_col, end_col
        (1, 1, 1, 0, 0),
        (1, 2, 2, 6, 7),
        (1, 2, 2, 2, 3),
        (1, 3, 3, 6, 7),
        (1, 3, 3, 10, 11),
        (2, 3, 3, 6, 11),
        (1, 3, 3, 2, 3),
        (1, 4, 4, 9, 10),
        (1, 4, 4, 2, 10),
    ]
    expected = b"\x80\x00\xd8\x06\x07\x80!\xd8\x06\x07\x88!\x81e\x80!\xd8\t\n\x80("
    assert generate_linetable(pairs, use_bytecode_offset=False) == expected


def test_linetable_offsets():
    pairs = [
        # bytecode_offset, start_line, end_line, start_col, end_col
        (0, 1, 1, 0, 0),
        (2, 2, 2, 6, 7),
        (4, 2, 2, 2, 3),
        (6, 3, 3, 6, 7),
        (8, 3, 3, 10, 11),
        (10, 3, 3, 6, 11),
        (14, 3, 3, 2, 3),
        (16, 4, 4, 9, 10),
        (18, 4, 4, 2, 10),
    ]
    expected = b"\x80\x00\xd8\x06\x07\x80!\xd8\x06\x07\x88!\x81e\x80!\xd8\t\n\x80("
    assert generate_linetable(pairs, use_bytecode_offset=True) == expected


def test_linetable_offsets_short():
    pairs = [
        # bytecode_offset, linenum
        (0, 1),
        (2, 2),
        (4, 2),
        (6, 3),
        (8, 3),
        (10, 3),
        (14, 3),
        (16, 4),
        (18, 4),
    ]
    expected = (
        b"\xe8\x00\xe8\x02\xe8\x00\xe8\x02\xe8\x00\xe9\x00\xe8\x00\xe8\x02\xe8\x00"
    )
    assert generate_linetable(pairs, use_bytecode_offset=True) == expected


@pytest.mark.skipif(sys.version_info < (3,11),
                    reason="requires python3.11+")
def test_roundtrip():
    def _test_function():
        x = 13
        y = x * 2 + 7 + 8 + 9 - 3 - 1 - 5
        z = y**2
        return z

    co_linetable = _test_function.__code__.co_linetable
    assert (
        generate_linetable(
            parse_linetable(generate_linetable(parse_linetable(co_linetable)))
        )
        == co_linetable
    )