Skip to content

Commit a2493a4

Browse files
committed
Separate _bytecode_nameof in a different test file; add test for sourcecode unavailablity when filename is not <stdint> and <string>.
1 parent a54d3b7 commit a2493a4

File tree

3 files changed

+157
-158
lines changed

3 files changed

+157
-158
lines changed

tests/test_bytecode_nameof.py

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
import pytest
2+
import unittest
3+
from varname import _bytecode_nameof
4+
from varname import nameof, varname, VarnameRetrievingError
5+
6+
def nameof_both(*args):
7+
"""Test both implementations at the same time"""
8+
result = nameof(*args, caller=2)
9+
if len(args) == 1:
10+
assert result == _bytecode_nameof(caller=2)
11+
return result
12+
13+
class Weird:
14+
def __add__(self, other):
15+
_bytecode_nameof(caller=2)
16+
17+
class TestNameof(unittest.TestCase):
18+
def test_original_nameof(self):
19+
x = 1
20+
self.assertEqual(nameof(x), 'x')
21+
self.assertEqual(nameof_both(x), 'x')
22+
self.assertEqual(_bytecode_nameof(x), 'x')
23+
24+
def test_bytecode_nameof_wrong_node(self):
25+
with pytest.raises(
26+
VarnameRetrievingError,
27+
match='Did you call nameof in a weird way',
28+
):
29+
Weird() + Weird()
30+
31+
def test_bytecode_pytest_nameof_fail(self):
32+
with pytest.raises(
33+
VarnameRetrievingError,
34+
match=("Found the variable name '@py_assert2' "
35+
"which is obviously wrong."),
36+
):
37+
lam = lambda: 0
38+
lam.a = 1
39+
assert _bytecode_nameof(lam.a) == 'a'
40+
41+
def test_nameof(self):
42+
a = 1
43+
b = nameof_both(a)
44+
assert b == 'a'
45+
nameof2 = nameof_both
46+
c = nameof2(a, b)
47+
assert b == 'a'
48+
assert c == ('a', 'b')
49+
50+
def func():
51+
return varname() + 'abc'
52+
53+
f = func()
54+
assert f == 'fabc'
55+
56+
self.assertEqual(nameof_both(f), 'f')
57+
self.assertEqual('f', nameof_both(f))
58+
self.assertEqual(len(nameof_both(f)), 1)
59+
60+
fname1 = fname = nameof_both(f)
61+
self.assertEqual(fname, 'f')
62+
self.assertEqual(fname1, 'f')
63+
64+
with pytest.raises(VarnameRetrievingError):
65+
nameof_both(a==1)
66+
67+
with pytest.raises(VarnameRetrievingError):
68+
_bytecode_nameof(a == 1)
69+
70+
# this is avoided by requiring the first argument `var`
71+
# with pytest.raises(VarnameRetrievingError):
72+
# nameof_both()
73+
74+
def test_nameof_statements(self):
75+
a = {'test': 1}
76+
test = {}
77+
del a[nameof_both(test)]
78+
assert a == {}
79+
80+
def func():
81+
return nameof_both(test)
82+
83+
assert func() == 'test'
84+
85+
def func2():
86+
yield nameof_both(test)
87+
88+
assert list(func2()) == ['test']
89+
90+
def func3():
91+
raise ValueError(nameof_both(test))
92+
93+
with pytest.raises(ValueError) as verr:
94+
func3()
95+
assert str(verr.value) == 'test'
96+
97+
for i in [0]:
98+
self.assertEqual(nameof_both(test), 'test')
99+
self.assertEqual(len(nameof_both(test)), 4)
100+
101+
def test_nameof_expr(self):
102+
lam = lambda: 0
103+
lam.a = 1
104+
lam.lam = lam
105+
lams = [lam]
106+
107+
lam.nameof = nameof_both
108+
109+
test = {}
110+
self.assertEqual(len(lam.nameof(test)), 4)
111+
112+
self.assertEqual(
113+
lam.nameof(test, lam.a),
114+
("test", "a"),
115+
)
116+
117+
self.assertEqual(nameof_both(lam.a), "a")
118+
self.assertEqual(nameof_both(lam.lam.lam.lam.a), "a")
119+
self.assertEqual(nameof_both(lam.lam.lam.lam), "lam")
120+
self.assertEqual(nameof_both(lams[0].lam), "lam")
121+
self.assertEqual(nameof_both(lams[0].lam.a), "a")
122+
self.assertEqual(nameof_both((lam() or lams[0]).lam.a), "a")

0 commit comments

Comments
 (0)