Coverage for tests / test_annotate.py: 100.000%

42 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 annotation from coverage.py.""" 

5 

6from __future__ import annotations 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

7 

8import coverage 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

9 

10from tests.coveragetest import CoverageTest 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

11from tests.goldtest import compare, gold_path 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

12 

13 

14class AnnotationGoldTest(CoverageTest): 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

15 """Test the annotate feature with gold files.""" 

16 

17 def make_multi(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

18 """Make a few source files we need for the tests.""" 

19 self.make_file( 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

20 "multi.py", 

21 """\ 

22 import a.a 

23 import b.b 

24 

25 a.a.a(1) 

26 b.b.b(2) 

27 """, 

28 ) 

29 self.make_file("a/__init__.py") 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

30 self.make_file( 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

31 "a/a.py", 

32 """\ 

33 def a(x): 

34 if x == 1: 

35 print("x is 1") 

36 else: 

37 print("x is not 1") 

38 """, 

39 ) 

40 self.make_file("b/__init__.py") 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

41 self.make_file( 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

42 "b/b.py", 

43 """\ 

44 def b(x): 

45 msg = f"x is {x}" 

46 print(msg) 

47 """, 

48 ) 

49 

50 def test_multi(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

51 self.make_multi() 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

52 cov = coverage.Coverage() 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

53 self.start_import_stop(cov, "multi") 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

54 cov.annotate() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234

55 compare(gold_path("annotate/multi"), ".", "*,cover") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234

56 

57 def test_annotate_dir(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

58 self.make_multi() 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

59 cov = coverage.Coverage(source=["."]) 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

60 self.start_import_stop(cov, "multi") 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

61 cov.annotate(directory="out_anno_dir") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234

62 compare(gold_path("annotate/anno_dir"), "out_anno_dir", "*,cover") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234

63 

64 def test_encoding(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

65 self.make_file( 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

66 "utf8.py", 

67 """\ 

68 # -*- coding: utf-8 -*- 

69 # This comment has an accent: é 

70 

71 print("spam eggs") 

72 """, 

73 ) 

74 cov = coverage.Coverage() 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

75 self.start_import_stop(cov, "utf8") 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

76 cov.annotate() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234

77 compare(gold_path("annotate/encodings"), ".", "*,cover") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234

78 

79 def test_white(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

80 self.make_file( 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

81 "white.py", 

82 """\ 

83 # A test case sent to me by Steve White 

84 

85 def f(self): 

86 if self==1: 

87 pass 

88 elif self.m('fred'): 

89 pass 

90 elif (g==1) and (b==2): 

91 pass 

92 elif self.m('fred')==True: 

93 pass 

94 elif ((g==1) and (b==2))==True: 

95 pass 

96 else: 

97 pass 

98 

99 def g(x): 

100 if x == 1: 

101 a = 1 

102 else: 

103 a = 2 

104 

105 g(1) 

106 

107 def h(x): 

108 if 0: #pragma: no cover 

109 pass 

110 if x == 1: 

111 a = 1 

112 else: 

113 a = 2 

114 

115 h(2) 

116 """, 

117 ) 

118 

119 cov = coverage.Coverage() 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

120 self.start_import_stop(cov, "white") 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

121 cov.annotate() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234

122 compare(gold_path("annotate/white"), ".", "*,cover") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234

123 

124 def test_missing_after_else(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

125 self.make_file( 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

126 "mae.py", 

127 """\ 

128 def f(x): 

129 if x == 1: 

130 print("1") 

131 else: 

132 print("2") 

133 

134 if f(1): 

135 print("nope") 

136 if f(2): 

137 print("nope") 

138 """, 

139 ) 

140 

141 cov = coverage.Coverage() 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

142 self.start_import_stop(cov, "mae") 1abcdefghijklmnopqrstuvwxyzABCDEF5GH6IJ7KL8MN9OP!QR#ST$UV%WX'YZ(01)234

143 cov.annotate() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234

144 assert self.stdout() == "1\n2\n" 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234

145 compare(gold_path("annotate/mae"), ".", "*,cover") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234