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

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 

3 

4"""Tests for coverage.py's bytecode analysis.""" 

5 

6from __future__ import annotations 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno

7 

8import dis 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno

9 

10from textwrap import dedent 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno

11 

12from tests.coveragetest import CoverageTest 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno

13 

14from coverage import env 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno

15from coverage.bytecode import code_objects, op_set 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno

16 

17 

18class BytecodeTest(CoverageTest): 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno

19 """Tests for bytecode.py""" 

20 

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 ) 

36 

37 objs = list(code_objects(code)) 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno

38 assert code in objs 1abcdefghijklpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()mno

39 

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

46 

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