File: test_unbound_local_error.py

package info (click to toggle)
python-friendly-traceback 0.7.62%2Bgit20240811.d7dbff6-1.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 9,264 kB
  • sloc: python: 21,500; makefile: 4
file content (139 lines) | stat: -rw-r--r-- 4,201 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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# More complex example than needed - used for documentation
import friendly_traceback

spam_missing_global = 1
spam_missing_both = 1

def outer_missing_global():
    def inner():
        spam_missing_global += 1
    inner()

def outer_missing_nonlocal():
    spam_missing_nonlocal = 1
    def inner():
        spam_missing_nonlocal += 1
    inner()

def outer_missing_both():
    spam_missing_both = 2
    def inner():
        spam_missing_both += 1
    inner()


def test_Missing_global():
    try:
        outer_missing_global()
    except UnboundLocalError as e:
        message = str(e)
        friendly_traceback.explain_traceback(redirect="capture")
    result = friendly_traceback.get_output()

    assert ("local variable 'spam_missing_global' referenced" in result or
            "cannot access local variable 'spam_missing_global'" in result)  # 3.11
    if friendly_traceback.get_lang() == "en":
        assert (
            "Did you forget to add `global spam_missing_global`?\n"
            in result
        )
    if friendly_traceback._writing_docs:
        return result, message


def test_Missing_nonlocal():
    try:
        outer_missing_nonlocal()
    except UnboundLocalError as e:
        message = str(e)
        friendly_traceback.explain_traceback(redirect="capture")
    result = friendly_traceback.get_output()
    
    assert ("local variable 'spam_missing_nonlocal' referenced" in result
            or "cannot access local variable 'spam_missing_nonlocal'" in result) # 3.11
    if friendly_traceback.get_lang() == "en":
        assert (
            "Did you forget to add `nonlocal spam_missing_nonlocal`?\n"
            in result
        )
    if friendly_traceback._writing_docs:
        return result, message


def test_Missing_both():
    try:
        outer_missing_both()
    except UnboundLocalError as e:
        message = str(e)
        friendly_traceback.explain_traceback(redirect="capture")
    result = friendly_traceback.get_output()

    assert ("local variable 'spam_missing_both' referenced" in result
            or "cannot access local variable 'spam_missing_both'" in result) # 3.11
    if friendly_traceback.get_lang() == "en":
        assert  "either `global spam_missing_both`" in result
        assert  "`nonlocal spam_missing_both`" in result

    if friendly_traceback._writing_docs:
        return result, message


def test_Typo_in_local():
    
    def test1():
        alpha1 = 1
        alpha2 += 1
        
    try:
        test1()
    except UnboundLocalError:
        friendly_traceback.explain_traceback(redirect="capture")
    result = friendly_traceback.get_output()
    
    assert ("local variable 'alpha2' referenced before assignment" in result
            or "cannot access local variable 'alpha2'" in result) # 3.11
    if friendly_traceback.get_lang() == "en":
        assert "similar name `alpha1` was found" in result

    def test2():
        alpha1 = 1
        alpha2 = 1
        alpha3 += 1

    try:
        test2()
    except UnboundLocalError as e:
        message = str(e)
        friendly_traceback.explain_traceback(redirect="capture")
    result = friendly_traceback.get_output()

    assert ("local variable 'alpha3' referenced before assignment" in result
            or "cannot access local variable 'alpha3'" in result)  # 3.11
    if friendly_traceback.get_lang() == "en":
        assert "perhaps you meant one of the following" in result

    if friendly_traceback._writing_docs:
        return result, message


def test_Using_name_of_builtin():
    def dist(points):
        max = max(points)
        min = min(points)
        return max - min
    try:
        dist([])
    except UnboundLocalError as e:
        message = str(e)
        friendly_traceback.explain_traceback(redirect="capture")
    result = friendly_traceback.get_output()

    assert ("local variable 'max' referenced" in result
            or "cannot access local variable 'max'" in result)
    if friendly_traceback.get_lang() == "en":
        assert "`max` is a Python builtin function." in result
    if friendly_traceback._writing_docs:
        return result, message

if __name__ == "__main__":
    print(test_Missing_global()[0])