Skip to content

Commit c824706

Browse files
committed
添加新增的测试文件和更新覆盖率忽略规则
1 parent e168d51 commit c824706

File tree

6 files changed

+1561
-1
lines changed

6 files changed

+1561
-1
lines changed

.gitignore

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,19 @@ target/
1414
*.swo
1515

1616
# Log files
17-
*.log
17+
*.log
18+
19+
# Coverage reports (if generated)
20+
coverage/
21+
_coverage/
22+
*.coverage
23+
coverage.xml
24+
25+
# Backup files
26+
*.bak
27+
*.backup
28+
*~
29+
30+
# OS generated files
31+
Thumbs.db
32+
ehthumbs.db

tests/coverage_boost_test.mbt

Lines changed: 311 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,311 @@
1+
// 专门针对未覆盖代码路径的测试
2+
3+
///| 创建测试辅助函数来模拟时间流逝和速率计算
4+
fn create_pb_with_real_stats(total : Int, current : Int) -> @src.ProgressBar {
5+
// 创建进度条并多次更新来产生真实的统计数据
6+
let mut pb = @src.new(total)
7+
.set_show_rate(true)
8+
.set_show_eta(true)
9+
.set_show_elapsed(true)
10+
11+
// 逐步更新以产生速率数据
12+
for i = 1; i <= current; i = i + 1 {
13+
pb = pb.update(i)
14+
}
15+
16+
pb
17+
}
18+
19+
///| 测试format_time的小时格式 - 通过模拟长时间运行
20+
test "format_time小时格式测试" {
21+
// 创建一个显示已用时间的进度条,通过多次更新来触发format_time的小时分支
22+
let pb = @src.new(10000)
23+
.set_show_elapsed(true)
24+
.set_show_eta(true)
25+
26+
// 模拟大量更新来可能触发时间格式化
27+
let mut updated_pb = pb
28+
for i = 1; i <= 100; i = i + 1 {
29+
updated_pb = updated_pb.update(i)
30+
}
31+
32+
let rendered = updated_pb.render()
33+
assert_eq(rendered.length() > 0, true)
34+
}
35+
36+
///| 测试format_time的分钟格式
37+
test "format_time分钟格式测试" {
38+
let pb = @src.new(1000)
39+
.set_show_elapsed(true)
40+
.set_show_eta(true)
41+
.update(500)
42+
43+
let rendered = pb.render()
44+
assert_eq(rendered.length() > 0, true)
45+
}
46+
47+
///| 测试format_rate的大数值单位缩放 (M单位)
48+
test "format_rate百万级单位测试" {
49+
// 尝试通过大数值更新来触发format_rate的M单位分支
50+
let pb = @src.new(10000000)
51+
.set_show_rate(true)
52+
.set_unit_scale(true)
53+
.set_unit("bytes")
54+
55+
// 进行足够大的更新
56+
let pb1 = pb.update(1000000)
57+
let pb2 = pb1.update(2000000)
58+
let pb3 = pb2.update(3000000)
59+
60+
let rendered = pb3.render()
61+
assert_eq(rendered.length() > 0, true)
62+
}
63+
64+
///| 测试format_rate的千级单位缩放 (k单位)
65+
test "format_rate千级单位测试" {
66+
let pb = @src.new(100000)
67+
.set_show_rate(true)
68+
.set_unit_scale(true)
69+
.set_unit("items")
70+
71+
// 进行千级别的更新
72+
let pb1 = pb.update(10000)
73+
let pb2 = pb1.update(20000)
74+
75+
let rendered = pb2.render()
76+
assert_eq(rendered.length() > 0, true)
77+
}
78+
79+
///| 测试get_terminal_width的Some分支
80+
test "get_terminal_width的Some分支测试" {
81+
// 设置终端宽度以触发Some分支
82+
@src.set_terminal_width(100)
83+
84+
let pb = @src.new(100)
85+
.set_dynamic_width(true)
86+
.set_ncols(Some(120)) // 这应该触发Some分支
87+
.update(50)
88+
89+
let rendered = pb.render()
90+
assert_eq(rendered.length() > 0, true)
91+
}
92+
93+
///| 测试所有时间格式化分支的直接调用
94+
test "时间和速率显示综合测试" {
95+
// 创建有实际速率和时间数据的进度条
96+
let pb = create_pb_with_real_stats(100, 50)
97+
.set_show_rate(true)
98+
.set_show_eta(true)
99+
.set_show_elapsed(true)
100+
101+
let rendered = pb.render()
102+
assert_eq(rendered.length() > 0, true)
103+
}
104+
105+
///| 测试ETA计算的各种情况
106+
test "ETA计算边界测试" {
107+
// 测试ETA = 0的情况(已完成)
108+
let pb_complete = @src.new(100)
109+
.set_show_eta(true)
110+
.update(100)
111+
112+
let rendered_complete = pb_complete.render()
113+
assert_eq(rendered_complete.length() > 0, true)
114+
115+
// 测试有ETA的情况
116+
let pb_partial = @src.new(100)
117+
.set_show_eta(true)
118+
.update(25)
119+
120+
let rendered_partial = pb_partial.render()
121+
assert_eq(rendered_partial.length() > 0, true)
122+
}
123+
124+
///| 测试速率显示的边界条件
125+
test "速率显示边界条件测试" {
126+
// 测试速率为0的情况
127+
let pb_zero = @src.new(100)
128+
.set_show_rate(true)
129+
.update(0)
130+
131+
let rendered_zero = pb_zero.render()
132+
assert_eq(rendered_zero.length() > 0, true)
133+
134+
// 测试有速率的情况
135+
let pb_with_rate = create_pb_with_real_stats(100, 30)
136+
let rendered_with_rate = pb_with_rate.render()
137+
assert_eq(rendered_with_rate.length() > 0, true)
138+
}
139+
140+
///| 测试miniters的实际触发条件
141+
test "miniters实际触发测试" {
142+
let pb = @src.new(1000)
143+
.set_miniters(50) // 设置较大的miniters
144+
145+
// 小幅更新,应该被miniters限制
146+
let pb1 = pb.update(10)
147+
let pb2 = pb1.update(20) // delta_n = 10,小于miniters=50
148+
149+
// 验证更新仍然发生(因为current会更新,但内部状态可能不变)
150+
assert_eq(pb2.current, 20)
151+
}
152+
153+
///| 测试mininterval的触发
154+
test "mininterval触发测试" {
155+
let pb = @src.new(100)
156+
.set_mininterval(0.5)
157+
.set_miniters(1)
158+
159+
// 快速连续更新
160+
let pb1 = pb.update(10)
161+
let pb2 = pb1.update(11) // 时间间隔很小
162+
let pb3 = pb2.update(12)
163+
164+
assert_eq(pb3.current, 12)
165+
}
166+
167+
///| 测试平滑速率计算的分支
168+
test "平滑速率计算测试" {
169+
let pb = @src.new(1000)
170+
.set_smooth(true)
171+
172+
// 多次更新来触发平滑速率计算的不同分支
173+
let pb1 = pb.update(100)
174+
let pb2 = pb1.update(200)
175+
let pb3 = pb2.update(300)
176+
let pb4 = pb3.update(400)
177+
178+
assert_eq(pb4.current, 400)
179+
assert_eq(pb4.percentage(), 40.0)
180+
}
181+
182+
///| 测试样本点数组的边界情况
183+
test "样本点数组管理测试" {
184+
let mut pb = @src.new(100).set_smooth(true)
185+
186+
// 进行超过10次的更新来触发样本点数组的清理逻辑
187+
for i = 1; i <= 15; i = i + 1 {
188+
pb = pb.update(i * 5)
189+
}
190+
191+
assert_eq(pb.current, 75)
192+
}
193+
194+
///| 测试动态宽度计算的各种配置
195+
test "动态宽度计算详细测试" {
196+
// 测试所有配置项都开启的情况
197+
let pb_full = @src.new(100)
198+
.set_dynamic_width(true)
199+
.set_desc("测试任务")
200+
.set_prefix("前缀")
201+
.set_suffix("后缀")
202+
.set_show_percent(true)
203+
.set_show_count(true)
204+
.set_show_rate(true)
205+
.set_show_eta(true)
206+
.set_show_elapsed(true)
207+
.set_ncols(Some(120))
208+
.update(50)
209+
210+
let rendered_full = pb_full.render()
211+
assert_eq(rendered_full.contains("测试任务"), true)
212+
assert_eq(rendered_full.contains("前缀"), true)
213+
assert_eq(rendered_full.contains("后缀"), true)
214+
215+
// 测试最小动态宽度的情况
216+
let pb_minimal = @src.new(100)
217+
.set_dynamic_width(true)
218+
.set_ncols(Some(20)) // 很小的终端宽度
219+
.update(50)
220+
221+
let rendered_minimal = pb_minimal.render()
222+
assert_eq(rendered_minimal.length() > 0, true)
223+
}
224+
225+
///| 测试render函数的平滑进度分支
226+
test "render平滑进度测试" {
227+
// 测试平滑关闭的情况
228+
let pb_no_smooth = @src.new(100)
229+
.set_smooth(false)
230+
.update(30)
231+
232+
let rendered_no_smooth = pb_no_smooth.render()
233+
assert_eq(rendered_no_smooth.length() > 0, true)
234+
235+
// 测试平滑开启的情况
236+
let pb_smooth = @src.new(100)
237+
.set_smooth(true)
238+
.update(30)
239+
240+
let rendered_smooth = pb_smooth.render()
241+
assert_eq(rendered_smooth.length() > 0, true)
242+
}
243+
244+
///| 测试所有显示选项的组合
245+
test "显示选项组合测试" {
246+
// 测试只显示ETA的情况
247+
let pb_eta_only = @src.new(100)
248+
.set_show_percent(false)
249+
.set_show_count(false)
250+
.set_show_rate(false)
251+
.set_show_eta(true)
252+
.set_show_elapsed(false)
253+
.update(40)
254+
255+
let rendered_eta = pb_eta_only.render()
256+
assert_eq(rendered_eta.length() > 0, true)
257+
258+
// 测试只显示已用时间的情况
259+
let pb_elapsed_only = @src.new(100)
260+
.set_show_percent(false)
261+
.set_show_count(false)
262+
.set_show_rate(false)
263+
.set_show_eta(false)
264+
.set_show_elapsed(true)
265+
.update(40)
266+
267+
let rendered_elapsed = pb_elapsed_only.render()
268+
assert_eq(rendered_elapsed.length() > 0, true)
269+
270+
// 测试什么都不显示的情况
271+
let pb_minimal = @src.new(100)
272+
.set_show_percent(false)
273+
.set_show_count(false)
274+
.set_show_rate(false)
275+
.set_show_eta(false)
276+
.set_show_elapsed(false)
277+
.update(40)
278+
279+
let rendered_minimal = pb_minimal.render()
280+
assert_eq(rendered_minimal.length() > 0, true)
281+
}
282+
283+
///| 测试百分比显示的边界情况
284+
test "百分比显示边界测试" {
285+
// 测试恰好100%的情况
286+
let pb_100 = @src.new(100)
287+
.set_show_percent(true)
288+
.update(100)
289+
290+
let rendered_100 = pb_100.render()
291+
assert_eq(rendered_100.contains("100%"), true)
292+
293+
// 测试小于100%的情况
294+
let pb_99 = @src.new(100)
295+
.set_show_percent(true)
296+
.update(99)
297+
298+
let rendered_99 = pb_99.render()
299+
assert_eq(rendered_99.contains("%"), true)
300+
}
301+
302+
///| 测试闭合后打印的情况
303+
test "关闭后打印测试" {
304+
let pb = @src.new(100)
305+
.update(50)
306+
.close()
307+
308+
// 关闭后调用print_progress应该直接返回
309+
pb.print_progress()
310+
assert_eq(pb.closed, true)
311+
}

0 commit comments

Comments
 (0)