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