Coverage for tests / test_bytecode.py: 100.000%
18 statements
« prev ^ index » next coverage.py v7.12.1a0.dev1, created at 2025-11-30 17:57 +0000
« prev ^ index » next coverage.py v7.12.1a0.dev1, created at 2025-11-30 17:57 +0000
1# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
2# For details: https://github.com/coveragepy/coveragepy/blob/main/NOTICE.txt
4"""Tests for coverage.py's bytecode analysis."""
6from __future__ import annotations 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno
8import dis 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno
10from textwrap import dedent 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno
12from tests.coveragetest import CoverageTest 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno
14from coverage import env 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno
15from coverage.bytecode import code_objects, op_set 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno
18class BytecodeTest(CoverageTest): 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno
19 """Tests for bytecode.py"""
21 def test_code_objects(self) -> None: 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno
22 code = compile( 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno
23 dedent("""\
24 def f(x):
25 def g(y):
26 return {z for z in range(10)}
27 def j():
28 return [z for z in range(10)]
29 return g(x)
30 def h(x):
31 return x+1
32 """),
33 "<string>",
34 "exec",
35 )
37 objs = list(code_objects(code)) 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno
38 assert code in objs 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno
40 expected = {"<module>", "f", "g", "j", "h"} 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno
41 if env.PYVERSION < (3, 12): 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno
42 # Comprehensions were compiled as implicit functions in earlier
43 # versions of Python.
44 expected.update({"<setcomp>", "<listcomp>"}) 1abcdefghijklmno
45 assert {c.co_name for c in objs} == expected 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno
47 def test_op_set(self) -> None: 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno
48 opcodes = op_set("LOAD_CONST", "NON_EXISTENT_OPCODE", "RETURN_VALUE") 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno
49 assert opcodes == {dis.opmap["LOAD_CONST"], dis.opmap["RETURN_VALUE"]} 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno